From 3bbe562bcaeb3e16fec86f27c185d30b5b44cf6e Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Tue, 22 Feb 2022 13:42:27 +0800 Subject: [PATCH 001/817] [build] Increase vs platform kvm disk size (#10001) #### Why I did it Info: Attempting file://dev/vdb/onie-installer ... Info: Attempting file://dev/vdb/onie-installer.bin ... cp: write error: No space left on device Failure: local_fs_run():/dev/vdb Unable to copy /tmp/tmp.CPY0ad/onie-installer.bin to tmpfs vs image is failing. Increase kvm device space. --- scripts/build_kvm_image.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_kvm_image.sh b/scripts/build_kvm_image.sh index cfaba6521ed6..6e5fd7dec742 100755 --- a/scripts/build_kvm_image.sh +++ b/scripts/build_kvm_image.sh @@ -4,7 +4,7 @@ # # SPDX-License-Identifier: GPL-2.0 -MEM=4096 +MEM=8192 DISK=$1 ONIE_RECOVERY_ISO=$2 INSTALLER=$3 From 55e7a14f043a444a6080423109ffef28bb0d3934 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Wed, 23 Feb 2022 01:32:57 +0200 Subject: [PATCH 002/817] [submodule]: Advance sonic-utilities. (#10058) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` Commits on Jan 31, 2022 [sonic-package-manager] implement blocking feature state change (#2035) Commits on Feb 12, 2022 [ci] pipeline fixes for VS test (#2059) Commits on Feb 14, 2022 [ci] allow download partially succeeded suilds for sonic-swss-pytests… [build] allowPartiallySucceededBuilds true in the step of download so… Commits on Feb 16, 2022 [config] Fix snmpagentaddress doesn't support the uppercase letters f… Commits on Feb 17, 2022 [ci] Fix pipeline on build_and_install_module (#2074) Enable diff coverage and set the threshold to 50% (#2061) Commits on Feb 18, 2022 check for adding default vlan attempt added (#2075) [GCU] Adding unit-test where path and ref paths are under the same YA… [GCU] Turning port admin down before some critical port changes (#1998) Commits on Feb 20, 2022 show_platfom_info not run for simx (#2042) [aclshow] fix aclshow when clear is called before counters are popula… ``` --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index b6ca76b48214..a9bbaf227316 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit b6ca76b4821453171d9607383b808385968eeeeb +Subproject commit a9bbaf2273169ed9f4c764cc39e97708995e0fa3 From 4a2a0df6078595eb8c88cee69b2411277a3ba036 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 23 Feb 2022 09:18:05 +0800 Subject: [PATCH 003/817] [submodule]: Update sonic-swss (#9978) * Update sonic-swss Signed-off-by: Ze Gan * update swss Signed-off-by: Ze Gan * Update submodule update-swss Signed-off-by: Ze Gan --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 53c630b82d42..7d2942f7ef4a 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 53c630b82d429db892bf288dd9f323c5a8370cd5 +Subproject commit 7d2942f7ef4ac01209582c02d142bd131208b2a4 From 2489727c46261e57212231af95c3bfc7f2a9efcc Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Wed, 23 Feb 2022 10:33:16 +0800 Subject: [PATCH 004/817] Generate sai.profile from j2 tempalte when saiserver start (#10022) Generate the sai.profile base on the brcm j2 file if the sai.profile is not existing in the dut mounted folder. Change the supervisor service configuration accordingly. Testing done: Add the script and config in dut saiservice server can start automatically with [systemctl start saiserver] Signed-off-by: richardyu-ms --- .../broadcom/docker-saiserver-brcm/start.sh | 27 +++++++++++++++++++ .../docker-saiserver-brcm/supervisord.conf | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/platform/broadcom/docker-saiserver-brcm/start.sh b/platform/broadcom/docker-saiserver-brcm/start.sh index 494c0e9126c2..81813b57ff9d 100755 --- a/platform/broadcom/docker-saiserver-brcm/start.sh +++ b/platform/broadcom/docker-saiserver-brcm/start.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +HWSKU_DIR=/usr/share/sonic/hwsku start_bcm() { @@ -7,11 +8,37 @@ start_bcm() [ -e /dev/linux-kernel-bde ] || mknod /dev/linux-kernel-bde c 127 0 } +generate_profile() +{ + # There are two ways to specify the contents of the SAI_INIT_CONFIG_FILE and they are mutually exclusive + # via current method (sai.profile.j2) or new method (config.bcm.j2) + # If delta is large, use sai.profile.j2 which basically require the user to select which config file to use + # If delta is small, use config.bcm.j2 where additional SAI INIT config properties are added + # based on specific device metadata requirement + # in this case sai.profile should have been modified to use the path /etc/sai.d/config.bcm + # There is also a possibility that both sai.profile.j2 and config.bcm.j2 are absent. in that cacse just copy + # sai.profile to the new /etc/said directory. + + # Create/Copy the sai.profile to /etc/sai.d/sai.profile + mkdir -p /etc/sai.d/ + + if [ -f $HWSKU_DIR/sai.profile.j2 ]; then + sonic-cfggen -d -t $HWSKU_DIR/sai.profile.j2 > /etc/sai.d/sai.profile + else + if [ -f $HWSKU_DIR/config.bcm.j2 ]; then + sonic-cfggen -d -t $HWSKU_DIR/config.bcm.j2 > /etc/sai.d/config.bcm + fi + if [ -f $HWSKU_DIR/sai.profile ]; then + cp $HWSKU_DIR/sai.profile /etc/sai.d/sai.profile + fi + fi +} rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd +generate_profile start_bcm supervisorctl start saiserver diff --git a/platform/broadcom/docker-saiserver-brcm/supervisord.conf b/platform/broadcom/docker-saiserver-brcm/supervisord.conf index ccb107b3d1f8..3574cd782b78 100644 --- a/platform/broadcom/docker-saiserver-brcm/supervisord.conf +++ b/platform/broadcom/docker-saiserver-brcm/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:saiserver] -command=/usr/sbin/saiserver -p /usr/share/sonic/hwsku/sai.profile -f /usr/share/sonic/hwsku/port_config.ini +command=/usr/sbin/saiserver -p /etc/sai.d/sai.profile -f /usr/share/sonic/hwsku/port_config.ini priority=3 autostart=false autorestart=false From 9fe128c8e8bb44fa9959c482116541ce64b87486 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Wed, 23 Feb 2022 10:33:34 +0800 Subject: [PATCH 005/817] Fix issue of parsing syseeprom value with whitespace in middle (#10021) Fixes #10020 Why I did it The platform api for parsing syseeprom information read from STATE DB has issue with parsing the value part that has whitespace in the middle. The current code assumes that the value part does not have whitespace. So everything after the whitespace will be ignored. The syseeprom values returned from platform API do not match the output of "show platform syseeprom". How I did it This change improved the regular expression for parsing syseeprom values to accommodate whitespaces in the value. How to verify it Locally updated the code on a dx010 device. Call the platform API: ``` >>> import sonic_platform >>> platform = sonic_platform.platform.Platform() >>> chassis = platform.get_chassis() >>> chassis.get_system_eeprom_info() {'0x21': 'DX010', '0x22': 'R0872-F0020-02', '0x23': 'DX010B2F030A27BY200002', '0x24': '00:E0:EC:E7:71:0F', '0x25': '11/03/2020 21:22:56', '0x26': '3', '0x27': 'Seastone', '0x28': 'RANGELEY', '0x29': '2014.08', '0x2A': '131', '0x2B': 'CELESTICA', '0x2C': 'THA', '0x2D': 'Celestica', '0x2E': '1.0.5', '0x2F': 'LB', '0xFD': '', '0xFE': '0xAAB39BDB'} ``` Signed-off-by: Xin Wang --- .../services/platform_api/sonic_platform/eeprom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-cel/services/platform_api/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/sonic_platform/eeprom.py index 7756c0f2f839..1e06e7b80e62 100644 --- a/platform/broadcom/sonic-platform-modules-cel/services/platform_api/sonic_platform/eeprom.py +++ b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/sonic_platform/eeprom.py @@ -45,7 +45,7 @@ def _parse_output(self, decode_output): for line in lines: try: match = re.search( - '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)(.*$)', line) if match is not None: idx = match.group(1) value = match.group(3).rstrip('\0') From 937ffbdb0566f93730465110248d51c9a4d696ae Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 23 Feb 2022 19:31:41 +0800 Subject: [PATCH 006/817] [submodule]: Update sonic-sairedis (#10061) Signed-off-by: Ze Gan b9337dc (HEAD, origin/master, origin/HEAD) [vslib]: Fix MACsec bug in SCI and XPN (#1003) edbceb9 [syncd][vslib] Keep new warm boot discovered SERDES objects (#985) af5c156 Fix build issues on gcc-10 (#999) 1445cd5 update SAI submoule (#1001) 48fe704 [ci] pipeline fixes for VS test (#1002) f484cf9 Enable SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL attribute (#975) 5d0b22d Enable SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL attribute (#975) 1b8ce97 (origin/202111) [pipeline] Download swss common artifact in a separated directory (#995) 7a2e096 Change sonic-buildimage.vs artifact source from CI build to official build. (#992) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index d5866a3dccfb..b9337dc5787a 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit d5866a3dccfb3bc50853d740d54203b5cae61eed +Subproject commit b9337dc5787aadf71eee9d676d6b7f1181ac0787 From bc1dfea6197551e1b475bd48f18144bdf375d81f Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Wed, 23 Feb 2022 17:22:41 -0800 Subject: [PATCH 007/817] Updated traffic scheduler settings for HWSKUs : DellEMC-Z9332f-O32 and DellEMC-Z9332f-M-O16C64 (#9828) --- files/build_templates/qos_config.j2 | 27 + .../tests/sample-dell-9332-t1-minigraph.xml | 2023 +++++++++++++++++ .../tests/sample_output/py2/qos-dell9332.json | 1101 +++++++++ .../tests/sample_output/py3/qos-dell9332.json | 1101 +++++++++ src/sonic-config-engine/tests/test_j2files.py | 20 + 5 files changed, 4272 insertions(+) create mode 100644 src/sonic-config-engine/tests/sample-dell-9332-t1-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index cdfb721a45e3..6748cd99be9d 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -30,6 +30,7 @@ {%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%} {%- set backend_device_types = ['BackEndToRRouter', 'BackEndLeafRouter'] -%} +{%- set apollo_resource_types = ['DL-NPU-Apollo'] -%} { @@ -156,6 +157,22 @@ } }, {% endif %} +{% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %} + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.2": { + "type" : "DWRR", + "weight": "100" + } + }, +{% else %} "SCHEDULER": { "scheduler.0": { "type" : "DWRR", @@ -166,6 +183,7 @@ "weight": "15" } }, +{% endif %} {% if asic_type in pfc_to_pg_map_supported_asics %} "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { "AZURE": { @@ -221,12 +239,21 @@ "wred_profile": "AZURE_LOSSLESS" }, {% endfor %} +{% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %} +{% for port in PORT_ACTIVE %} + "{{ port }}|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, +{% endfor %} +{% else %} {% for port in PORT_ACTIVE %} "{{ port }}|4": { "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" }, {% endfor %} +{% endif %} {% for port in PORT_ACTIVE %} "{{ port }}|0": { "scheduler": "scheduler.0" diff --git a/src/sonic-config-engine/tests/sample-dell-9332-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-dell-9332-t1-minigraph.xml new file mode 100644 index 000000000000..460238486b4a --- /dev/null +++ b/src/sonic-config-engine/tests/sample-dell-9332-t1-minigraph.xml @@ -0,0 +1,2023 @@ + + + + + + false + str2-z9332f-01 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::9 + ARISTA03T2 + FC00::A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::11 + ARISTA05T2 + FC00::12 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::19 + ARISTA07T2 + FC00::1A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::21 + ARISTA09T2 + FC00::22 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::29 + ARISTA11T2 + FC00::2A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::31 + ARISTA13T2 + FC00::32 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::39 + ARISTA15T2 + FC00::3A + 1 + 10 + 3 + + + false + str2-z9332f-01 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + str2-z9332f-01 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + str2-z9332f-01 + + +
10.0.0.33
+ + + +
+ +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.17
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.21
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.25
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.29
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.3.146.248/23 + + 10.3.146.248/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-z9332f-01 + + + PortChannel102 + etp1;etp2 + + + + PortChannel105 + etp3;etp4 + + + + PortChannel108 + etp5;etp6 + + + + PortChannel1011 + etp7;etp8 + + + + PortChannel1014 + etp9;etp10 + + + + PortChannel1017 + etp11;etp12 + + + + PortChannel1020 + etp13;etp14 + + + + PortChannel1023 + etp15;etp16 + + + + + + + + + etp17 + 10.0.0.32/31 + + + + etp17 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + etp18 + 10.0.0.34/31 + + + + etp18 + FC00::45/126 + + + + etp19 + 10.0.0.36/31 + + + + etp19 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::9/126 + + + + etp20 + 10.0.0.38/31 + + + + etp20 + FC00::4D/126 + + + + etp21 + 10.0.0.40/31 + + + + etp21 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::11/126 + + + + etp22 + 10.0.0.42/31 + + + + etp22 + FC00::55/126 + + + + etp23 + 10.0.0.44/31 + + + + etp23 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::19/126 + + + + etp24 + 10.0.0.46/31 + + + + etp24 + FC00::5D/126 + + + + etp25 + 10.0.0.48/31 + + + + etp25 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.16/31 + + + + PortChannel1014 + FC00::21/126 + + + + etp26 + 10.0.0.50/31 + + + + etp26 + FC00::65/126 + + + + etp27 + 10.0.0.52/31 + + + + etp27 + FC00::69/126 + + + + PortChannel1017 + 10.0.0.20/31 + + + + PortChannel1017 + FC00::29/126 + + + + etp28 + 10.0.0.54/31 + + + + etp28 + FC00::6D/126 + + + + etp29 + 10.0.0.56/31 + + + + etp29 + FC00::71/126 + + + + PortChannel1020 + 10.0.0.24/31 + + + + PortChannel1020 + FC00::31/126 + + + + etp30 + 10.0.0.58/31 + + + + etp30 + FC00::75/126 + + + + etp31 + 10.0.0.60/31 + + + + etp31 + FC00::79/126 + + + + PortChannel1023 + 10.0.0.28/31 + + + + PortChannel1023 + FC00::39/126 + + + + etp32 + 10.0.0.62/31 + + + + etp32 + FC00::7D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + str2-z9332f-01 + etp17 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + str2-z9332f-01 + etp1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + str2-z9332f-01 + etp2 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + str2-z9332f-01 + etp18 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + str2-z9332f-01 + etp19 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + str2-z9332f-01 + etp3 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + str2-z9332f-01 + etp4 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + str2-z9332f-01 + etp20 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + str2-z9332f-01 + etp21 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + str2-z9332f-01 + etp5 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + str2-z9332f-01 + etp6 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + str2-z9332f-01 + etp22 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + str2-z9332f-01 + etp23 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + str2-z9332f-01 + etp7 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + str2-z9332f-01 + etp8 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + str2-z9332f-01 + etp24 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + str2-z9332f-01 + etp25 + + + DeviceInterfaceLink + ARISTA09T2 + Ethernet1 + str2-z9332f-01 + etp9 + + + DeviceInterfaceLink + ARISTA09T2 + Ethernet2 + str2-z9332f-01 + etp10 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + str2-z9332f-01 + etp26 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + str2-z9332f-01 + etp27 + + + DeviceInterfaceLink + ARISTA11T2 + Ethernet1 + str2-z9332f-01 + etp11 + + + DeviceInterfaceLink + ARISTA11T2 + Ethernet2 + str2-z9332f-01 + etp12 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + str2-z9332f-01 + etp28 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + str2-z9332f-01 + etp29 + + + DeviceInterfaceLink + ARISTA13T2 + Ethernet1 + str2-z9332f-01 + etp13 + + + DeviceInterfaceLink + ARISTA13T2 + Ethernet2 + str2-z9332f-01 + etp14 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + str2-z9332f-01 + etp30 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + str2-z9332f-01 + etp31 + + + DeviceInterfaceLink + ARISTA15T2 + Ethernet1 + str2-z9332f-01 + etp15 + + + DeviceInterfaceLink + ARISTA15T2 + Ethernet2 + str2-z9332f-01 + etp16 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + str2-z9332f-01 + etp32 + + + + + str2-z9332f-01 + DellEMC-Z9332f-O32 + + 10.3.146.248 + + + + ARISTA16T0 + + 172.16.142.111 + + Arista-VM + + + ARISTA11T0 + + 172.16.142.106 + + Arista-VM + + + ARISTA10T0 + + 172.16.142.105 + + Arista-VM + + + ARISTA11T2 + + 172.16.142.93 + + Arista-VM + + + ARISTA09T2 + + 172.16.142.92 + + Arista-VM + + + ARISTA09T0 + + 172.16.142.104 + + Arista-VM + + + ARISTA06T0 + + 172.16.142.101 + + Arista-VM + + + ARISTA08T0 + + 172.16.142.103 + + Arista-VM + + + ARISTA07T0 + + 172.16.142.102 + + Arista-VM + + + ARISTA07T2 + + 172.16.142.91 + + Arista-VM + + + ARISTA01T2 + + 172.16.142.88 + + Arista-VM + + + ARISTA01T0 + + 172.16.142.96 + + Arista-VM + + + ARISTA05T2 + + 172.16.142.90 + + Arista-VM + + + ARISTA05T0 + + 172.16.142.100 + + Arista-VM + + + ARISTA02T0 + + 172.16.142.97 + + Arista-VM + + + ARISTA03T0 + + 172.16.142.98 + + Arista-VM + + + ARISTA03T2 + + 172.16.142.89 + + Arista-VM + + + ARISTA04T0 + + 172.16.142.99 + + Arista-VM + + + ARISTA15T0 + + 172.16.142.110 + + Arista-VM + + + ARISTA15T2 + + 172.16.142.95 + + Arista-VM + + + ARISTA14T0 + + 172.16.142.109 + + Arista-VM + + + ARISTA12T0 + + 172.16.142.107 + + Arista-VM + + + ARISTA13T2 + + 172.16.142.94 + + Arista-VM + + + ARISTA13T0 + + 172.16.142.108 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + etp1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp2 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp3 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp4 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp5 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp6 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp7 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp8 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp9 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp10 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp11 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp12 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp13 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp14 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp15 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp16 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp17 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp18 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp19 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp20 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp21 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp22 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp23 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp24 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp25 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp26 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp27 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp28 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp29 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp30 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp31 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp32 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + etp33 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + etp34 + + false + 0 + 0 + 10000 + + + true + 0 + DellEMC-Z9332f-O32 + + + + + + + str2-z9332f-01 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5 + + + ResourceType + + DL-NPU-Apollo + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + str2-z9332f-01 + DellEMC-Z9332f-O32 +
diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json new file mode 100644 index 000000000000..39f4b26e8372 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json @@ -0,0 +1,1101 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.2": { + "type" : "DWRR", + "weight": "100" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet160": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet192": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet224": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json new file mode 100644 index 000000000000..39f4b26e8372 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json @@ -0,0 +1,1101 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.2": { + "type" : "DWRR", + "weight": "100" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet160": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet192": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet224": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.2", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 851f45098fda..5e782ce2fa1d 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -25,6 +25,7 @@ def setUp(self): self.arista7050_t0_minigraph = os.path.join(self.test_dir, 'sample-arista-7050-t0-minigraph.xml') self.multi_asic_minigraph = os.path.join(self.test_dir, 'multi_npu_data', 'sample-minigraph.xml') self.multi_asic_port_config = os.path.join(self.test_dir, 'multi_npu_data', 'sample_port_config-0.ini') + self.dell9332_t1_minigraph = os.path.join(self.test_dir, 'sample-dell-9332-t1-minigraph.xml') self.radv_test_minigraph = os.path.join(self.test_dir, 'radv-test-sample-graph.xml') self.output_file = os.path.join(self.test_dir, 'output') os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -211,6 +212,25 @@ def test_qos_arista7050_render_template(self): sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') assert filecmp.cmp(sample_output_file, self.output_file) + def test_qos_dell9332_render_template(self): + dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') + qos_file = os.path.join(dell_dir_path, 'qos.json.j2') + port_config_ini_file = os.path.join(dell_dir_path, 'port_config.ini') + + # copy qos_config.j2 to the Dell Z9332 directory to have all templates in one directory + qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') + shutil.copy2(qos_config_file, dell_dir_path) + + argument = '-m ' + self.dell9332_t1_minigraph + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + self.output_file + self.run_script(argument) + + # cleanup + qos_config_file_new = os.path.join(dell_dir_path, 'qos_config.j2') + os.remove(qos_config_file_new) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell9332.json') + assert filecmp.cmp(sample_output_file, self.output_file) + def test_qos_dell6100_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100') qos_file = os.path.join(dell_dir_path, 'qos.json.j2') From 72477bcac869a11671b69fb40683b4bc59672187 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 24 Feb 2022 09:55:37 +0800 Subject: [PATCH 008/817] [submodule] Update submodule for sonic-swss-common (#10012) *9eac0ae Add support for route flow counter (#576) *2262c01 [VS] Increase test timout to 360min (#582) *a2b8161 [ci] pipeline fixes for VS test (#581) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 14f068e81630..9eac0ae78093 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 14f068e81630de186e631ff4f3e39d4f40d9abbb +Subproject commit 9eac0ae7809350f38650ebb29456fe41a93bbf35 From 2d0b063191e20d2f1e394cf60a9a53025edc4b5b Mon Sep 17 00:00:00 2001 From: wenyiz2021 <91497961+wenyiz2021@users.noreply.github.com> Date: Wed, 23 Feb 2022 18:06:30 -0800 Subject: [PATCH 009/817] Update container_checker for multi-asic devices when state is 'always_enabled' (#10067) * Update container_checker for multi-asic devices Update container_checker for multi-asic devices to add database containers in always_running_containers. Previous change was made for single-asic, and that database containers were not considered as feature when writing to state_db. * Update container_checker Update an indent --- files/image_config/monit/container_checker | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/files/image_config/monit/container_checker b/files/image_config/monit/container_checker index 2a000d1e6bb7..63bd7b3e182d 100755 --- a/files/image_config/monit/container_checker +++ b/files/image_config/monit/container_checker @@ -41,7 +41,7 @@ def get_expected_running_containers(): expected_running_containers = set() always_running_containers = set() - + for container_name in feature_table.keys(): if feature_table[container_name]["state"] not in ["disabled", "always_disabled"]: if multi_asic.is_multi_asic(): @@ -51,14 +51,20 @@ def get_expected_running_containers(): num_asics = multi_asic.get_num_asics() for asic_id in range(num_asics): expected_running_containers.add(container_name + str(asic_id)) - elif feature_table[container_name]["state"] == 'always_enabled': - always_running_containers.add(container_name) else: expected_running_containers.add(container_name) - + if feature_table[container_name]["state"] == 'always_enabled': + if multi_asic.is_multi_asic(): + if feature_table[container_name]["has_global_scope"] == "True": + always_running_containers.add(container_name) + if feature_table[container_name]["has_per_asic_scope"] == "True": + num_asics = multi_asic.get_num_asics() + for asic_id in range(num_asics): + always_running_containers.add(container_name + str(asic_id)) + else: + always_running_containers.add(container_name) return expected_running_containers, always_running_containers - def get_current_running_from_DB(always_running_containers): """ @summary: This function will get the current running container list From 44028723ef76385958af1555ad7f7150f53f44ee Mon Sep 17 00:00:00 2001 From: Zhaohui Sun <94606222+ZhaohuiS@users.noreply.github.com> Date: Wed, 23 Feb 2022 18:20:24 -0800 Subject: [PATCH 010/817] Split kvmtest t0 job into two jobs and run in parallel (#10044) Why I did it Introduce 2 sub jobs for kvmtest t0 job in sonic-mgmt repo in PR Azure/sonic-mgmt#4861 But in sonic-buildimage repo, because section parameter is null, it always run the part 2 test scripts in kvmtest t0 job. It missed the part 1 test scripts in kvmtest.sh. How I did it Split kvmtest t0 job into two sub jobs such as sonic-mgmt repo and run them in parallel to save time. How to verify it Submit PR will trigger the pipeline to run. Signed-off-by: Zhaohui Sun --- .azure-pipelines/run-test-template.yml | 11 ++++--- azure-pipelines.yml | 41 ++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index d490873d15e1..2ab707287c7c 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -7,6 +7,9 @@ parameters: type: string - name: ptf_name type: string +- name: section + type: string + default: '' - name: image type: string default: sonic-vs.img.gz @@ -43,7 +46,7 @@ steps: - script: | rm -rf $(Build.ArtifactStagingDirectory)/* - docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }}" + docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }} ${{ parameters.section }}" displayName: "Run tests" - script: | @@ -75,17 +78,17 @@ steps: condition: succeededOrFailed() - publish: $(Build.ArtifactStagingDirectory)/kvmdump - artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype}}.memdump@$(System.JobAttempt) + artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype}}${{ parameters.section }}.memdump@$(System.JobAttempt) displayName: "Archive sonic kvm memdump" condition: failed() - publish: $(Build.ArtifactStagingDirectory)/logs - artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype }}.log@$(System.JobAttempt) + artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype }}${{ parameters.section }}.log@$(System.JobAttempt) displayName: "Archive sonic kvm logs" condition: succeededOrFailed() - task: PublishTestResults@2 inputs: testResultsFiles: '$(Build.ArtifactStagingDirectory)/logs/**/*.xml' - testRunTitle: kvmtest.${{ parameters.tbtype }} + testRunTitle: kvmtest.${{ parameters.tbtype }}${{ parameters.section }} condition: succeededOrFailed() diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6bf2370b1d80..b96deeefb37b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -104,9 +104,9 @@ stages: testResultsFiles: '**/tr.xml' testRunTitle: vstest - - job: + - job: t0_part1 pool: sonictest - displayName: "kvmtest-t0" + displayName: "kvmtest-t0-part1" timeoutInMinutes: 360 steps: @@ -116,6 +116,43 @@ stages: tbname: vms-kvm-t0 ptf_name: ptf_vms6-1 tbtype: t0 + section: part-1 + + - job: t0_part2 + pool: sonictest + displayName: "kvmtest-t0-part2" + timeoutInMinutes: 360 + + steps: + - template: .azure-pipelines/run-test-template.yml + parameters: + dut: vlab-01 + tbname: vms-kvm-t0 + ptf_name: ptf_vms6-1 + tbtype: t0 + section: part-2 + + - job: + pool: sonictest + displayName: "kvmtest-t0" + timeoutInMinutes: 360 + dependsOn: + - t0_part1 + - t0_part2 + condition: always() + variables: + resultOfPart1: $[ dependencies.t0_part1.result ] + resultOfPart2: $[ dependencies.t0_part2.result ] + + steps: + - script: | + if [ $(resultOfPart1) == "Succeeded" ] && [ $(resultOfPart2) == "Succeeded" ]; then + echo "Both job kvmtest-t0-part1 and kvmtest-t0-part2 are passed." + exit 0 + else + echo "Either job kvmtest-t0-part1 or job kvmtest-t0-part2 failed! Please check the detailed information." + exit 1 + fi - job: pool: sonictest-t1-lag From d82eafd8ae303570584e6484ffc34dfc6968e377 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 24 Feb 2022 17:29:59 +0800 Subject: [PATCH 011/817] [system-health] Fix file handle leak (#10059) - Why I did it swsscommon.ConfigDBConnector does not automatically close connection when the instance is recycled by python. So, it should not create this instance each time calling check_services. It will cause error like Failed to read from file /var/run/hw-management/led/led_status_capability - OSError(24, 'Too many open files') - How I did it Only connect DB once in init - How to verify it Manual test --- src/system-health/health_checker/service_checker.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/system-health/health_checker/service_checker.py b/src/system-health/health_checker/service_checker.py index fa47e1e50c63..6918da0b9f0e 100644 --- a/src/system-health/health_checker/service_checker.py +++ b/src/system-health/health_checker/service_checker.py @@ -51,6 +51,8 @@ def __init__(self): self.need_save_cache = False + self.config_db = None + self.load_critical_process_cache() def get_expected_running_containers(self, feature_table): @@ -248,9 +250,10 @@ def check_services(self, config): Args: config (config.Config): Health checker configuration. """ - config_db = swsscommon.ConfigDBConnector() - config_db.connect() - feature_table = config_db.get_table("FEATURE") + if not self.config_db: + self.config_db = swsscommon.ConfigDBConnector() + self.config_db.connect() + feature_table = self.config_db.get_table("FEATURE") expected_running_containers, self.container_feature_dict = self.get_expected_running_containers(feature_table) current_running_containers = self.get_current_running_containers() From fe59e0f2c0a6e6882bbafb6decdb6c9ddee05dfa Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 24 Feb 2022 18:05:56 +0800 Subject: [PATCH 012/817] [Mellanox] Fix issue: thermal zone threshold value 0 causes fan speed stuck at 100% (#10057) - Why I did it In SONiC thermal control algorithm, it compares thermal zone temperature with thermal zone threshold. Previously, a thermal zone with no thermal sensor can still get its threshold. However, a recently driver patch changes this behavior: a thermal zone with no thermal sensor will return 0 for threshold. We need to ignore such thermal zone. - How I did it Ignore thermal zones whose temperature is 0. - How to verify it Added unit test case and Manual test --- .../sonic_platform/thermal.py | 7 ++++- .../mlnx-platform-api/tests/test_thermal.py | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py index e4d22575450c..22cf5a513529 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py @@ -400,9 +400,14 @@ def get_min_allowed_cooling_level_by_thermal_zone(cls): thermal_zone_present = False try: for thermal_zone_folder in glob.iglob(THERMAL_ZONE_FOLDER_WILDCARD): + current = utils.read_int_from_file(os.path.join(thermal_zone_folder, THERMAL_ZONE_TEMP_FILE)) + if current == 0: + # Temperature value 0 means that this thermal zone has no + # sensor and it should be ignored in this loop + continue + thermal_zone_present = True normal_thresh = utils.read_int_from_file(os.path.join(thermal_zone_folder, THERMAL_ZONE_NORMAL_THRESHOLD)) - current = utils.read_int_from_file(os.path.join(thermal_zone_folder, THERMAL_ZONE_TEMP_FILE)) if current < normal_thresh - THERMAL_ZONE_HYSTERESIS: continue diff --git a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py index 216b5cd316c7..89c940d89260 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py @@ -238,6 +238,32 @@ def mock_read_int_from_file(file_path, default=0, raise_exception=False): mock_file_content[os.path.join('thermal_zone1', THERMAL_ZONE_TEMP_FILE)] = 81000 assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() is None + @mock.patch('glob.iglob', mock.MagicMock(return_value=['thermal_zone1', 'thermal_zone2'])) + @mock.patch('sonic_platform.utils.read_int_from_file') + def test_no_sensor_thermal_zone(self, mock_read_file): + from sonic_platform.thermal import Thermal, THERMAL_ZONE_TEMP_FILE, THERMAL_ZONE_HIGH_THRESHOLD, THERMAL_ZONE_NORMAL_THRESHOLD, MIN_COOLING_LEVEL_FOR_HIGH, MIN_COOLING_LEVEL_FOR_NORMAL + + mock_file_content = {} + def mock_read_int_from_file(file_path, **kwargs): + return mock_file_content[file_path] + + mock_read_file.side_effect = mock_read_int_from_file + mock_file_content[os.path.join('thermal_zone1', THERMAL_ZONE_NORMAL_THRESHOLD)] = 0 + mock_file_content[os.path.join('thermal_zone1', THERMAL_ZONE_HIGH_THRESHOLD)] = 0 + mock_file_content[os.path.join('thermal_zone1', THERMAL_ZONE_TEMP_FILE)] = 0 + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_NORMAL_THRESHOLD)] = 75000 + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_HIGH_THRESHOLD)] = 85000 + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_TEMP_FILE)] = 24000 + assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() == MIN_COOLING_LEVEL_FOR_NORMAL + + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_TEMP_FILE)] = 71000 + assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() == MIN_COOLING_LEVEL_FOR_HIGH + + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_TEMP_FILE)] = 79000 + assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() == MIN_COOLING_LEVEL_FOR_HIGH + + mock_file_content[os.path.join('thermal_zone2', THERMAL_ZONE_TEMP_FILE)] = 81000 + assert Thermal.get_min_allowed_cooling_level_by_thermal_zone() is None def test_check_module_temperature_trustable(self): from sonic_platform.thermal import Thermal From 2bfad16ae1f9879e4355b213a3746feebd748044 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Thu, 24 Feb 2022 10:06:43 -0800 Subject: [PATCH 013/817] Fix Headroom value for 7260C64 SKU (#10075) Updated the Headroom value for (100G,5m) in 7260C64 SKU. --- .../Arista-7260CX3-C64/pg_profile_lookup.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini index cbc06c818062..0e71479fc2c2 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini @@ -1,6 +1,6 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 100000 5m 1248 1248 96928 -3 2496 + 100000 5m 1248 1248 54080 -3 2496 100000 40m 1248 1248 59696 -3 2496 100000 300m 1248 1248 101088 -3 2496 40000 5m 1248 1248 29536 -3 2496 From fd22635de0ea6376b0142a2451b081efdbaa2303 Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Thu, 24 Feb 2022 11:21:26 -0800 Subject: [PATCH 014/817] [chassis][bgp] create v4 and v6 peer group for VoQ internal neighbors (#9693) Why I did it In the recent minigraph changes we add separate BGP session configuration for V4 and V6 internal VoQ neighbors. This PR is adding different Peer groups for V4 and V6 neighbors How I did it Add VOQ_CHASSIS_V4_PEER and VOQ_CHASSIS_V6_PEER groups Add extra Unit tests How to verify it Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- .../templates/voq_chassis/instance.conf.j2 | 6 ++++- .../templates/voq_chassis/peer-group.conf.j2 | 23 ++++++++++------- .../templates/voq_chassis/policies.conf.j2 | 11 ++++++++ .../{param_all.json => param_all_v4.json} | 0 .../instance.conf/param_all_v6.json | 22 ++++++++++++++++ .../{param_base.json => param_base_v4.json} | 0 .../instance.conf/param_base_v6.json | 17 +++++++++++++ ...utdown_1.json => param_shutdown_v4_1.json} | 0 ...utdown_2.json => param_shutdown_v4_2.json} | 0 .../instance.conf/param_shutdown_v6_1.json | 19 ++++++++++++++ .../instance.conf/param_shutdown_v6_2.json | 19 ++++++++++++++ ...m_timers_1.json => param_timers_v4_1.json} | 0 ...m_timers_2.json => param_timers_v4_2.json} | 0 .../instance.conf/param_timers_v6_1.json | 18 +++++++++++++ .../instance.conf/param_timers_v6_2.json | 18 +++++++++++++ .../{result_all.conf => result_all_v4.conf} | 3 ++- .../instance.conf/result_all_v6.conf | 25 +++++++++++++++++++ ...sult_timers_1.conf => result_base_v4.conf} | 2 +- .../instance.conf/result_base_v6.conf | 23 +++++++++++++++++ ...tdown_1.conf => result_shutdown_v4_1.conf} | 3 ++- ...lt_base.conf => result_shutdown_v4_2.conf} | 2 +- .../instance.conf/result_shutdown_v6_1.conf | 25 +++++++++++++++++++ .../instance.conf/result_shutdown_v6_2.conf | 23 +++++++++++++++++ ..._timers_2.conf => result_timers_v4_1.conf} | 2 +- ...hutdown_2.conf => result_timers_v4_2.conf} | 2 +- .../instance.conf/result_timers_v6_1.conf | 23 +++++++++++++++++ .../instance.conf/result_timers_v6_2.conf | 23 +++++++++++++++++ .../peer-group.conf/result_all.conf | 23 ++++++++++------- .../peer-group.conf/result_base.conf | 19 ++++++++------ .../policies.conf/result_base.conf | 11 ++++++++ 30 files changed, 330 insertions(+), 32 deletions(-) rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_all.json => param_all_v4.json} (100%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v6.json rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_base.json => param_base_v4.json} (100%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v6.json rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_shutdown_1.json => param_shutdown_v4_1.json} (100%) rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_shutdown_2.json => param_shutdown_v4_2.json} (100%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_1.json create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_2.json rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_timers_1.json => param_timers_v4_1.json} (100%) rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{param_timers_2.json => param_timers_v4_2.json} (100%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_1.json create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_2.json rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_all.conf => result_all_v4.conf} (90%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_timers_1.conf => result_base_v4.conf} (90%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_shutdown_1.conf => result_shutdown_v4_1.conf} (90%) rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_base.conf => result_shutdown_v4_2.conf} (90%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_timers_2.conf => result_timers_v4_1.conf} (90%) rename src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/{result_shutdown_2.conf => result_timers_v4_2.conf} (90%) create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf create mode 100644 src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 index 1783b875ad2a..4f7bde5ddf1a 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 @@ -4,7 +4,11 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor {{ neighbor_addr }} peer-group VOQ_CHASSIS_PEER +{% if neighbor_addr | ipv4 %} + neighbor {{ neighbor_addr }} peer-group VOQ_CHASSIS_V4_PEER +{% elif neighbor_addr | ipv6 %} + neighbor {{ neighbor_addr }} peer-group VOQ_CHASSIS_V6_PEER +{% endif %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} neighbor {{ neighbor_addr }} timers 3 10 diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 index 8266c0c82d7f..ec563b380cc6 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 @@ -1,22 +1,27 @@ ! ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! - neighbor VOQ_CHASSIS_PEER peer-group + neighbor VOQ_CHASSIS_V4_PEER peer-group + neighbor VOQ_CHASSIS_V6_PEER peer-group address-family ipv4 {% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} - neighbor VOQ_CHASSIS_PEER allowas-in 1 + neighbor VOQ_CHASSIS_V4_PEER allowas-in 1 {% endif %} - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER activate + neighbor VOQ_CHASSIS_V4_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V4_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V4_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V4_PEER out exit-address-family address-family ipv6 {% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} - neighbor VOQ_CHASSIS_PEER allowas-in 1 + neighbor VOQ_CHASSIS_V6_PEER allowas-in 1 {% endif %} - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V6_PEER activate + neighbor VOQ_CHASSIS_V6_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V6_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V6_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V6_PEER out exit-address-family ! ! end of template: bgpd/templates/voq_chassis/peer-group.conf.j2 diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/policies.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/policies.conf.j2 index 4c853d4f3220..c26db7bde241 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/policies.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/policies.conf.j2 @@ -1,7 +1,18 @@ ! ! template: bgpd/templates/voq_chassis/policies.conf.j2 ! +route-map FROM_VOQ_CHASSIS_V4_PEER permit 100 ! +route-map TO_VOQ_CHASSIS_V4_PEER permit 100 +! +! +route-map FROM_VOQ_CHASSIS_V6_PEER permit 1 + set ipv6 next-hop prefer-global + on-match next +! +route-map FROM_VOQ_CHASSIS_V6_PEER permit 100 +! +route-map TO_VOQ_CHASSIS_V6_PEER permit 100 ! ! end of template: bgpd/templates/voq_chassis/policies.conf.j2 ! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v4.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v4.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v6.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v6.json new file mode 100644 index 000000000000..d78af6c7588f --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_all_v6.json @@ -0,0 +1,22 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": {} + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1", + "keepalive": "5", + "holdtime": "30", + "admin_status": "down" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true", + "ipv4": "32", + "ipv6": "24" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v4.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v4.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v6.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v6.json new file mode 100644 index 000000000000..4b9b884fcf2e --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_base_v6.json @@ -0,0 +1,17 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": {} + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_1.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v4_1.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_1.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v4_1.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_2.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v4_2.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_2.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v4_2.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_1.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_1.json new file mode 100644 index 000000000000..3ceeb3f00332 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_1.json @@ -0,0 +1,19 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": { + "default_bgp_status": "down" + } + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_2.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_2.json new file mode 100644 index 000000000000..8f2881b75f38 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_shutdown_v6_2.json @@ -0,0 +1,19 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": { + "default_bgp_status": "up" + } + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_1.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v4_1.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_1.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v4_1.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_2.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v4_2.json similarity index 100% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_2.json rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v4_2.json diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_1.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_1.json new file mode 100644 index 000000000000..e236b791ef07 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_1.json @@ -0,0 +1,18 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": {} + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1", + "keepalive": "5" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_2.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_2.json new file mode 100644 index 000000000000..ce077e5bc6de --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/param_timers_v6_2.json @@ -0,0 +1,18 @@ +{ + "CONFIG_DB__DEVICE_METADATA": { + "localhost": {} + }, + "neighbor_addr": "fc00::01", + "bgp_session": { + "asn": "555", + "name": "internal1", + "holdtime": "240" + }, + "constants": { + "bgp": { + "maximum_paths": { + "enabled": "true" + } + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf index 7d2cc5413621..604af65d5e66 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf @@ -4,12 +4,13 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 neighbor 10.10.10.10 timers connect 10 neighbor 10.10.10.10 shutdown +! address-family ipv4 maximum-paths ibgp 32 ! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf new file mode 100644 index 000000000000..793473c2e202 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf @@ -0,0 +1,25 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + neighbor fc00::01 shutdown +! + address-family ipv4 + maximum-paths ibgp 32 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 24 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_1.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf index c5f2385192d3..23bf5841f9cc 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf @@ -4,7 +4,7 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf new file mode 100644 index 000000000000..a0bd9379c8b2 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf @@ -0,0 +1,23 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + address-family ipv4 + maximum-paths ibgp 64 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 64 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_1.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf index 91f405cea9da..f26f0d6d3d0c 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf @@ -4,12 +4,13 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 neighbor 10.10.10.10 timers connect 10 neighbor 10.10.10.10 shutdown +! address-family ipv4 maximum-paths ibgp 64 ! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf index c5f2385192d3..23bf5841f9cc 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf @@ -4,7 +4,7 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf new file mode 100644 index 000000000000..4057147d5d58 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf @@ -0,0 +1,25 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + neighbor fc00::01 shutdown +! + address-family ipv4 + maximum-paths ibgp 64 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 64 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf new file mode 100644 index 000000000000..a0bd9379c8b2 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf @@ -0,0 +1,23 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + address-family ipv4 + maximum-paths ibgp 64 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 64 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_2.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf index c5f2385192d3..23bf5841f9cc 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf @@ -4,7 +4,7 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf similarity index 90% rename from src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_2.conf rename to src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf index c5f2385192d3..23bf5841f9cc 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf @@ -4,7 +4,7 @@ bgp bestpath as-path multipath-relax bgp bestpath peer-type multipath-relax ! - neighbor 10.10.10.10 peer-group VOQ_CHASSIS_PEER + neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 3 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf new file mode 100644 index 000000000000..a0bd9379c8b2 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf @@ -0,0 +1,23 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + address-family ipv4 + maximum-paths ibgp 64 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 64 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf new file mode 100644 index 000000000000..a0bd9379c8b2 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf @@ -0,0 +1,23 @@ +! +! template: bgpd/templates/voq_chassis/instance.conf.j2 +! + bgp bestpath as-path multipath-relax + bgp bestpath peer-type multipath-relax +! + neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER + neighbor fc00::01 remote-as 555 + neighbor fc00::01 description internal1 + neighbor fc00::01 timers 3 10 + neighbor fc00::01 timers connect 10 + address-family ipv4 + maximum-paths ibgp 64 +! + exit-address-family +! + address-family ipv6 + maximum-paths ibgp 64 +! + exit-address-family +! +! end of template: bgpd/templates/voq_chassis/instance.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf index 031884499aaa..1ec1cffed952 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf @@ -1,18 +1,23 @@ ! ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! - neighbor VOQ_CHASSIS_PEER peer-group + neighbor VOQ_CHASSIS_V4_PEER peer-group + neighbor VOQ_CHASSIS_V6_PEER peer-group address-family ipv4 - neighbor VOQ_CHASSIS_PEER allowas-in 1 - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER allowas-in 1 + neighbor VOQ_CHASSIS_V4_PEER activate + neighbor VOQ_CHASSIS_V4_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V4_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V4_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V4_PEER out exit-address-family address-family ipv6 - neighbor VOQ_CHASSIS_PEER allowas-in 1 - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V6_PEER allowas-in 1 + neighbor VOQ_CHASSIS_V6_PEER activate + neighbor VOQ_CHASSIS_V6_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V6_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V6_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V6_PEER out exit-address-family ! ! end of template: bgpd/templates/voq_chassis/peer-group.conf.j2 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf index d4a6f381a224..a8f7a0eea528 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf @@ -1,16 +1,21 @@ ! ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! - neighbor VOQ_CHASSIS_PEER peer-group + neighbor VOQ_CHASSIS_V4_PEER peer-group + neighbor VOQ_CHASSIS_V6_PEER peer-group address-family ipv4 - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER activate + neighbor VOQ_CHASSIS_V4_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V4_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V4_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V4_PEER out exit-address-family address-family ipv6 - neighbor VOQ_CHASSIS_PEER activate - neighbor VOQ_CHASSIS_PEER addpath-tx-all-paths - neighbor VOQ_CHASSIS_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V6_PEER activate + neighbor VOQ_CHASSIS_V6_PEER addpath-tx-all-paths + neighbor VOQ_CHASSIS_V6_PEER soft-reconfiguration inbound + neighbor VOQ_CHASSIS_V4_PEER route-map FROM_VOQ_CHASSIS_V6_PEER in + neighbor VOQ_CHASSIS_V4_PEER route-map TO_VOQ_CHASSIS_V6_PEER out exit-address-family ! ! end of template: bgpd/templates/voq_chassis/peer-group.conf.j2 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/policies.conf/result_base.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/policies.conf/result_base.conf index 4c853d4f3220..c26db7bde241 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/policies.conf/result_base.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/policies.conf/result_base.conf @@ -1,7 +1,18 @@ ! ! template: bgpd/templates/voq_chassis/policies.conf.j2 ! +route-map FROM_VOQ_CHASSIS_V4_PEER permit 100 ! +route-map TO_VOQ_CHASSIS_V4_PEER permit 100 +! +! +route-map FROM_VOQ_CHASSIS_V6_PEER permit 1 + set ipv6 next-hop prefer-global + on-match next +! +route-map FROM_VOQ_CHASSIS_V6_PEER permit 100 +! +route-map TO_VOQ_CHASSIS_V6_PEER permit 100 ! ! end of template: bgpd/templates/voq_chassis/policies.conf.j2 ! From a50d1f1fc862e23e268ebd99d1f59fb9fd7b9e8f Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 24 Feb 2022 14:55:45 -0800 Subject: [PATCH 015/817] [write_standby]: Increase timeout to 60s (#10065) - Avoid scenarios where script times out before orchagent can establish IPinIP tunnel Signed-off-by: Lawrence Lee --- files/scripts/write_standby.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/write_standby.py b/files/scripts/write_standby.py index 4c5455803fac..53cf5265ecde 100755 --- a/files/scripts/write_standby.py +++ b/files/scripts/write_standby.py @@ -91,7 +91,7 @@ def tunnel_exists(self): tunnel_key_pattern = 'ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL:*' return len(self.asic_db.keys('ASIC_DB', tunnel_key_pattern)) > 0 - def wait_for_tunnel(self, interval=1, timeout=30): + def wait_for_tunnel(self, interval=1, timeout=60): """ Waits until the IP-in-IP tunnel has been created From b101b023d3eccbc998ead608bf62929045892800 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 25 Feb 2022 08:59:57 +0800 Subject: [PATCH 016/817] [Security]: Upgrade urllib3 to fix CVE-2021-33503 See https://security.archlinux.org/CVE-2021-33503 --- dockers/docker-sonic-mgmt-framework/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 index a9a9beaa7585..d727ac449d46 100644 --- a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 @@ -15,7 +15,7 @@ RUN pip3 install connexion==2.7.0 \ certifi==2017.4.17 \ python-dateutil==2.6.0 \ six==1.11.0 \ - urllib3==1.21.1 + urllib3==1.26.5 COPY \ {% for deb in docker_sonic_mgmt_framework_debs.split(' ') -%} From c9cf4d9ff0432679a25108456d9509104ace9815 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 24 Feb 2022 17:00:13 -0800 Subject: [PATCH 017/817] sonic-slave-buster pins the versions of Jinja2 and MarkupSafe in py3 (#10043) #### Why I did it Upstream breaking change, ref discussion https://github.com/pallets/markupsafe/issues/282 --- .azure-pipelines/azure-pipelines-image-template.yml | 1 - sonic-slave-buster/Dockerfile.j2 | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 70c40d64b6a3..0a83c334074f 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -43,7 +43,6 @@ jobs: [ -n "$SYSTEM_PULLREQUEST_PULLREQUESTID" ] && BRANCH_NAME="$SYSTEM_PULLREQUEST_TARGETBRANCH-$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER" git checkout -b $BRANCH_NAME sudo modprobe overlay - pip3 install MarkupSafe==2.0.1 --force-reinstall sudo apt-get install -y acl sudo bash -c "echo 1 > /proc/sys/vm/compact_memory" ENABLE_DOCKER_BASE_PULL=y make PLATFORM=$(PLATFORM_AZP) PLATFORM_ARCH=$(PLATFORM_ARCH) $(BUILD_OPTIONS) configure diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 8189338071ea..0f5c6414a196 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -465,6 +465,11 @@ RUN pip3 uninstall -y enum34 # For templating RUN pip2 install j2cli==0.3.10 +# Note: Jinja2 depends on MarkupSafe, however markupsafe 2.1.0 breaks Jinja2 2.10 +# Debian buster dist-packages include python3-markupsafe (1.1.0-1) and python3-jinja2 (2.10-2) +# If not pinning the versions, any requirement like `MarkupSafe>=2.0` will pull latest into site-packages and mess up. +RUN pip3 install MarkupSafe==2.0.1 +RUN pip3 install Jinja2==3.0.3 # For sonic-mgmt-framework RUN pip2 install "PyYAML==5.4.1" From 91204879dfe8399e61ebff4c184b8df4c1da3109 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 24 Feb 2022 17:54:45 -0800 Subject: [PATCH 018/817] [swss]: Wait for vlan intf to start ndppd (#10036) - Use the `wait_for_link.sh` script to delay ndppd start until after the VLAN interface is ready - Avoids issue where ndppd tries to change interface attributes before the interface is ready Signed-off-by: Lawrence Lee --- dockers/docker-orchagent/Dockerfile.j2 | 1 - dockers/docker-orchagent/docker-init.j2 | 1 + dockers/docker-orchagent/ndppd.conf | 9 ------ dockers/docker-orchagent/supervisord.conf.j2 | 25 ++++++++++++++++ dockers/docker-orchagent/wait_for_link.sh.j2 | 30 ++++++++++++++++++++ 5 files changed, 56 insertions(+), 10 deletions(-) delete mode 100644 dockers/docker-orchagent/ndppd.conf create mode 100644 dockers/docker-orchagent/wait_for_link.sh.j2 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 5e403213c1d4..3c04ff7c135b 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -68,7 +68,6 @@ RUN apt-get purge -y \ COPY ["files/arp_update", "/usr/bin"] COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] -COPY ["ndppd.conf", "/usr/share/sonic/templates/"] COPY ["enable_counters.py", "tunnel_packet_handler.py", "/usr/bin/"] COPY ["orchagent.sh", "swssconfig.sh", "buffermgrd.sh", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index ff543c234904..52a1c4717ccc 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -18,6 +18,7 @@ CFGGEN_PARAMS=" \ -t /usr/share/sonic/templates/ndppd.conf.j2,/etc/ndppd.conf \ -t /usr/share/sonic/templates/critical_processes.j2,/etc/supervisor/critical_processes \ -t /usr/share/sonic/templates/supervisord.conf.j2,/etc/supervisor/conf.d/supervisord.conf + -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ " VLAN=$(sonic-cfggen $CFGGEN_PARAMS) diff --git a/dockers/docker-orchagent/ndppd.conf b/dockers/docker-orchagent/ndppd.conf deleted file mode 100644 index b9dbc293ed2a..000000000000 --- a/dockers/docker-orchagent/ndppd.conf +++ /dev/null @@ -1,9 +0,0 @@ -[program:ndppd] -command=/usr/sbin/ndppd -priority=7 -autostart=false -autorestart=unexpected -stdout_logfile=syslog -stderr_logfile=syslog -dependent_startup=true -dependent_startup_wait_for=vlanmgrd:running diff --git a/dockers/docker-orchagent/supervisord.conf.j2 b/dockers/docker-orchagent/supervisord.conf.j2 index 7cd31a113223..7954fa7fa6b4 100644 --- a/dockers/docker-orchagent/supervisord.conf.j2 +++ b/dockers/docker-orchagent/supervisord.conf.j2 @@ -299,3 +299,28 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {%- endif %} + +{% if is_fabric_asic == 0 %} +[program:ndppd] +command=/usr/sbin/ndppd +priority=7 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=wait_for_link:exited +{%- endif %} + +{% if is_fabric_asic == 0 %} +[program:wait_for_link] +command=/usr/bin/wait_for_link.sh +priority=7 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited +{%- endif %} diff --git a/dockers/docker-orchagent/wait_for_link.sh.j2 b/dockers/docker-orchagent/wait_for_link.sh.j2 new file mode 100644 index 000000000000..980b472b3e0a --- /dev/null +++ b/dockers/docker-orchagent/wait_for_link.sh.j2 @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +VLAN_TABLE_PREFIX="VLAN_TABLE" + +function wait_until_iface_ready +{ + TABLE_PREFIX=$1 + IFACE=$2 + + echo "Waiting until interface $IFACE is ready..." + + # Wait for the interface to come up + # (i.e., interface is present in STATE_DB and state is "ok") + while true; do + RESULT=$(sonic-db-cli STATE_DB HGET "${TABLE_PREFIX}|${IFACE}" "state" 2> /dev/null) + if [ x"$RESULT" == x"ok" ]; then + break + fi + + sleep 1 + done + + echo "Interface ${IFACE} is ready!" +} + + +# Wait for all interfaces to be up and ready +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +wait_until_iface_ready ${VLAN_TABLE_PREFIX} {{ name }} +{% endfor %} From 8dc00ef4e1f5428f51834577e0cbb64913bc5998 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Fri, 25 Feb 2022 08:03:35 -0500 Subject: [PATCH 019/817] [mellanox] Fix DPB supported breakout modes (#10072) --- .../Mellanox-SN2700-D40C8S8/hwsku.json | 178 --------- .../x86_64-mlnx_msn2700-r0/platform.json | 6 +- .../Mellanox-SN3800-D100C12S2/hwsku.json | 346 ----------------- .../Mellanox-SN3800-D112C8/hwsku.json | 364 ------------------ .../Mellanox-SN3800-D24C52/hwsku.json | 232 ----------- .../Mellanox-SN3800-D28C49S1/hwsku.json | 238 ------------ .../Mellanox-SN3800-D28C50/hwsku.json | 238 ------------ .../x86_64-mlnx_msn3800-r0/platform.json | 192 +++------ .../x86_64-mlnx_msn4600-r0/platform.json | 192 +++------ 9 files changed, 130 insertions(+), 1856 deletions(-) delete mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/hwsku.json delete mode 100644 device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/hwsku.json delete mode 100644 device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/hwsku.json delete mode 100644 device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/hwsku.json delete mode 100644 device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/hwsku.json delete mode 100644 device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/hwsku.json diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/hwsku.json b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/hwsku.json deleted file mode 100644 index 63a3005ad591..000000000000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/hwsku.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet1": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet2": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet3": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet4": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet9": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet10": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet11": { - "default_brkout_mode": "4x10G[25G]" - }, - "Ethernet12": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet18": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet22": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet50": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet54": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet58": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet62": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet66": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet70": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet74": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet78": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet82": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet86": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet114": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet118": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet122": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet126": { - "default_brkout_mode": "2x50G[25G,10G]" - } - } -} \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json b/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json index fab5ea6bf11c..063a211e785c 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json @@ -381,8 +381,7 @@ "lanes": "0,1,2,3", "breakout_modes": { "1x100G[50G,40G,25G,10G]": ["etp1"], - "2x50G[25G,10G]": ["etp1a", "etp1b"], - "4x10G[25G]": ["etp1a", "etp1b", "etp1c", "etp1d"] + "2x50G[25G,10G]": ["etp1a", "etp1b"] } }, "Ethernet4": { @@ -398,8 +397,7 @@ "lanes": "8,9,10,11", "breakout_modes": { "1x100G[50G,40G,25G,10G]": ["etp3"], - "2x50G[25G,10G]": ["etp3a", "etp3b"], - "4x10G[25G]": ["etp3a", "etp3b", "etp3c", "etp3d"] + "2x50G[25G,10G]": ["etp3a", "etp3b"] } }, "Ethernet12": { diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/hwsku.json b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/hwsku.json deleted file mode 100644 index 2b1d5d322282..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/hwsku.json +++ /dev/null @@ -1,346 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet2": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet4": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet6": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet10": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet12": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet14": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet18": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet22": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet26": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet30": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet34": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet38": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet50": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet54": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet58": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet62": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet66": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet70": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet74": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet78": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet82": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet86": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet90": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet94": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet98": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet102": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet114": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet118": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet122": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet126": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet128": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet130": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet132": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet134": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet136": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet138": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet140": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet142": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet144": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet146": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet148": { - "default_brkout_mode": "1x10G[100G,50G,40G,25G]" - }, - "Ethernet152": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet154": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet156": { - "default_brkout_mode": "1x10G[100G,50G,40G,25G]" - }, - "Ethernet160": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet162": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet164": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet166": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet168": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet170": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet172": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet174": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet176": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet178": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet180": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet182": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet184": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet186": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet188": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet190": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet192": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet194": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet196": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet198": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet200": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet202": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet204": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet206": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet208": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet212": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet216": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet220": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet224": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet228": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet232": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet236": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet240": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet244": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet248": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet252": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - } - } -} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/hwsku.json b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/hwsku.json deleted file mode 100644 index 5bc784192c84..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/hwsku.json +++ /dev/null @@ -1,364 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet2": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet4": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet6": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet10": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet12": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet14": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet18": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet22": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet26": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet30": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet34": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet38": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet50": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet54": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet58": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet62": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet66": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet70": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet74": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet78": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet82": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet86": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet90": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet94": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet122": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet126": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet128": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet132": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet136": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet138": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet140": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet142": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet144": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet148": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet152": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet154": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet156": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet158": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet160": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet162": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet164": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet166": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet168": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet170": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet172": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet174": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet176": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet178": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet180": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet182": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet184": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet186": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet188": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet190": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet192": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet194": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet196": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet198": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet200": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet202": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet204": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet206": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet208": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet210": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet212": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet214": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet216": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet218": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet220": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet222": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet224": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet226": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet228": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet230": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet232": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet234": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet236": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet238": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet240": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet242": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet244": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet246": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet248": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet250": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet252": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet254": { - "default_brkout_mode": "2x50G[25G,10G]" - } - } -} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/hwsku.json b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/hwsku.json deleted file mode 100644 index 04826b7f557c..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/hwsku.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet4": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet12": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet34": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet38": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet128": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet132": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet136": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet140": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet144": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet148": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet152": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet156": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet160": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet164": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet168": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet172": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet176": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet178": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet180": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet182": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet184": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet186": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet188": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet190": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet192": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet196": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet200": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet204": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet208": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet212": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet216": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet220": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet224": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet228": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet232": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet236": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet240": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet242": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet244": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet246": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet248": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet252": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - } - } -} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/hwsku.json b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/hwsku.json deleted file mode 100644 index 83c69052a64c..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/hwsku.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet4": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet12": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet34": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet38": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet128": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet132": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet136": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet140": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet144": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet148": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet152": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet156": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet160": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet164": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet166": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet168": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet172": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet176": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet178": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet180": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet182": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet184": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet186": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet188": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet190": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet192": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet196": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet200": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet204": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet208": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet212": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet216": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet220": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet224": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet228": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet232": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet236": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet240": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet242": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet244": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet246": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet248": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet250": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet252": { - "default_brkout_mode": "1x10G[100G,50G,40G,25G]" - } - } -} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/hwsku.json b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/hwsku.json deleted file mode 100644 index f7334a858bf1..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/hwsku.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "interfaces": { - "Ethernet0": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet4": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet8": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet12": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet16": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet20": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet24": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet28": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet32": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet34": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet36": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet38": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet40": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet42": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet44": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet46": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet48": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet52": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet56": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet60": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet64": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet68": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet72": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet76": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet80": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet84": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet88": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet92": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet96": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet100": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet104": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet106": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet108": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet110": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet112": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet116": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet120": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet124": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet128": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet132": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet136": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet140": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet144": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet148": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet152": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet156": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet160": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet164": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet168": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet172": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet176": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet178": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet180": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet182": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet184": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet186": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet188": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet190": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet192": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet196": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet200": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet204": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet208": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet212": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet216": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet220": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet224": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet228": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet232": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet236": { - "default_brkout_mode": "1x100G[50G,40G,25G,10G]" - }, - "Ethernet240": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet242": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet244": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet246": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet248": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet250": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet252": { - "default_brkout_mode": "2x50G[25G,10G]" - }, - "Ethernet254": { - "default_brkout_mode": "2x50G[25G,10G]" - } - } -} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/platform.json b/device/mellanox/x86_64-mlnx_msn3800-r0/platform.json index db273059482c..fa50c8850844 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/platform.json @@ -724,512 +724,448 @@ "index": "1,1,1,1", "lanes": "0,1,2,3", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp1"], - "2x50G[25G,10G]": ["etp1a", "etp1b"] + "1x100G[50G,40G,25G,10G]": ["etp1"] } }, "Ethernet4": { "index": "2,2,2,2", "lanes": "4,5,6,7", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp2"], - "2x50G[25G,10G]": ["etp2a", "etp2b"] + "1x100G[50G,40G,25G,10G]": ["etp2"] } }, "Ethernet8": { "index": "3,3,3,3", "lanes": "8,9,10,11", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp3"], - "2x50G[25G,10G]": ["etp3a", "etp3b"] + "1x100G[50G,40G,25G,10G]": ["etp3"] } }, "Ethernet12": { "index": "4,4,4,4", "lanes": "12,13,14,15", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp4"], - "2x50G[25G,10G]": ["etp4a", "etp4b"] + "1x100G[50G,40G,25G,10G]": ["etp4"] } }, "Ethernet16": { "index": "5,5,5,5", "lanes": "16,17,18,19", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp5"], - "2x50G[25G,10G]": ["etp5a", "etp5b"] + "1x100G[50G,40G,25G,10G]": ["etp5"] } }, "Ethernet20": { "index": "6,6,6,6", "lanes": "20,21,22,23", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp6"], - "2x50G[25G,10G]": ["etp6a", "etp6b"] + "1x100G[50G,40G,25G,10G]": ["etp6"] } }, "Ethernet24": { "index": "7,7,7,7", "lanes": "24,25,26,27", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp7"], - "2x50G[25G,10G]": ["etp7a", "etp7b"] + "1x100G[50G,40G,25G,10G]": ["etp7"] } }, "Ethernet28": { "index": "8,8,8,8", "lanes": "28,29,30,31", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp8"], - "2x50G[25G,10G]": ["etp8a", "etp8b"] + "1x100G[50G,40G,25G,10G]": ["etp8"] } }, "Ethernet32": { "index": "9,9,9,9", "lanes": "32,33,34,35", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp9"], - "2x50G[25G,10G]": ["etp9a", "etp9b"] + "1x100G[50G,40G,25G,10G]": ["etp9"] } }, "Ethernet36": { "index": "10,10,10,10", "lanes": "36,37,38,39", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp10"], - "2x50G[25G,10G]": ["etp10a", "etp10b"] + "1x100G[50G,40G,25G,10G]": ["etp10"] } }, "Ethernet40": { "index": "11,11,11,11", "lanes": "40,41,42,43", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp11"], - "2x50G[25G,10G]": ["etp11a", "etp11b"] + "1x100G[50G,40G,25G,10G]": ["etp11"] } }, "Ethernet44": { "index": "12,12,12,12", "lanes": "44,45,46,47", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp12"], - "2x50G[25G,10G]": ["etp12a", "etp12b"] + "1x100G[50G,40G,25G,10G]": ["etp12"] } }, "Ethernet48": { "index": "13,13,13,13", "lanes": "48,49,50,51", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp13"], - "2x50G[25G,10G]": ["etp13a", "etp13b"] + "1x100G[50G,40G,25G,10G]": ["etp13"] } }, "Ethernet52": { "index": "14,14,14,14", "lanes": "52,53,54,55", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp14"], - "2x50G[25G,10G]": ["etp14a", "etp14b"] + "1x100G[50G,40G,25G,10G]": ["etp14"] } }, "Ethernet56": { "index": "15,15,15,15", "lanes": "56,57,58,59", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp15"], - "2x50G[25G,10G]": ["etp15a", "etp15b"] + "1x100G[50G,40G,25G,10G]": ["etp15"] } }, "Ethernet60": { "index": "16,16,16,16", "lanes": "60,61,62,63", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp16"], - "2x50G[25G,10G]": ["etp16a", "etp16b"] + "1x100G[50G,40G,25G,10G]": ["etp16"] } }, "Ethernet64": { "index": "17,17,17,17", "lanes": "64,65,66,67", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp17"], - "2x50G[25G,10G]": ["etp17a", "etp17b"] + "1x100G[50G,40G,25G,10G]": ["etp17"] } }, "Ethernet68": { "index": "18,18,18,18", "lanes": "68,69,70,71", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp18"], - "2x50G[25G,10G]": ["etp18a", "etp18b"] + "1x100G[50G,40G,25G,10G]": ["etp18"] } }, "Ethernet72": { "index": "19,19,19,19", "lanes": "72,73,74,75", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp19"], - "2x50G[25G,10G]": ["etp19a", "etp19b"] + "1x100G[50G,40G,25G,10G]": ["etp19"] } }, "Ethernet76": { "index": "20,20,20,20", "lanes": "76,77,78,79", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp20"], - "2x50G[25G,10G]": ["etp20a", "etp20b"] + "1x100G[50G,40G,25G,10G]": ["etp20"] } }, "Ethernet80": { "index": "21,21,21,21", "lanes": "80,81,82,83", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp21"], - "2x50G[25G,10G]": ["etp21a", "etp21b"] + "1x100G[50G,40G,25G,10G]": ["etp21"] } }, "Ethernet84": { "index": "22,22,22,22", "lanes": "84,85,86,87", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp22"], - "2x50G[25G,10G]": ["etp22a", "etp22b"] + "1x100G[50G,40G,25G,10G]": ["etp22"] } }, "Ethernet88": { "index": "23,23,23,23", "lanes": "88,89,90,91", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp23"], - "2x50G[25G,10G]": ["etp23a", "etp23b"] + "1x100G[50G,40G,25G,10G]": ["etp23"] } }, "Ethernet92": { "index": "24,24,24,24", "lanes": "92,93,94,95", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp24"], - "2x50G[25G,10G]": ["etp24a", "etp24b"] + "1x100G[50G,40G,25G,10G]": ["etp24"] } }, "Ethernet96": { "index": "25,25,25,25", "lanes": "96,97,98,99", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp25"], - "2x50G[25G,10G]": ["etp25a", "etp25b"] + "1x100G[50G,40G,25G,10G]": ["etp25"] } }, "Ethernet100": { "index": "26,26,26,26", "lanes": "100,101,102,103", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp26"], - "2x50G[25G,10G]": ["etp26a", "etp26b"] + "1x100G[50G,40G,25G,10G]": ["etp26"] } }, "Ethernet104": { "index": "27,27,27,27", "lanes": "104,105,106,107", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp27"], - "2x50G[25G,10G]": ["etp27a", "etp27b"] + "1x100G[50G,40G,25G,10G]": ["etp27"] } }, "Ethernet108": { "index": "28,28,28,28", "lanes": "108,109,110,111", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp28"], - "2x50G[25G,10G]": ["etp28a", "etp28b"] + "1x100G[50G,40G,25G,10G]": ["etp28"] } }, "Ethernet112": { "index": "29,29,29,29", "lanes": "112,113,114,115", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp29"], - "2x50G[25G,10G]": ["etp29a", "etp29b"] + "1x100G[50G,40G,25G,10G]": ["etp29"] } }, "Ethernet116": { "index": "30,30,30,30", "lanes": "116,117,118,119", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp30"], - "2x50G[25G,10G]": ["etp30a", "etp30b"] + "1x100G[50G,40G,25G,10G]": ["etp30"] } }, "Ethernet120": { "index": "31,31,31,31", "lanes": "120,121,122,123", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp31"], - "2x50G[25G,10G]": ["etp31a", "etp31b"] + "1x100G[50G,40G,25G,10G]": ["etp31"] } }, "Ethernet124": { "index": "32,32,32,32", "lanes": "124,125,126,127", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp32"], - "2x50G[25G,10G]": ["etp32a", "etp32b"] + "1x100G[50G,40G,25G,10G]": ["etp32"] } }, "Ethernet128": { "index": "33,33,33,33", "lanes": "128,129,130,131", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp33"], - "2x50G[25G,10G]": ["etp33a", "etp33b"] + "1x100G[50G,40G,25G,10G]": ["etp33"] } }, "Ethernet132": { "index": "34,34,34,34", "lanes": "132,133,134,135", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp34"], - "2x50G[25G,10G]": ["etp34a", "etp34b"] + "1x100G[50G,40G,25G,10G]": ["etp34"] } }, "Ethernet136": { "index": "35,35,35,35", "lanes": "136,137,138,139", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp35"], - "2x50G[25G,10G]": ["etp35a", "etp35b"] + "1x100G[50G,40G,25G,10G]": ["etp35"] } }, "Ethernet140": { "index": "36,36,36,36", "lanes": "140,141,142,143", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp36"], - "2x50G[25G,10G]": ["etp36a", "etp36b"] + "1x100G[50G,40G,25G,10G]": ["etp36"] } }, "Ethernet144": { "index": "37,37,37,37", "lanes": "144,145,146,147", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp37"], - "2x50G[25G,10G]": ["etp37a", "etp37b"] + "1x100G[50G,40G,25G,10G]": ["etp37"] } }, "Ethernet148": { "index": "38,38,38,38", "lanes": "148,149,150,151", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp38"], - "2x50G[25G,10G]": ["etp38a", "etp38b"] + "1x100G[50G,40G,25G,10G]": ["etp38"] } }, "Ethernet152": { "index": "39,39,39,39", "lanes": "152,153,154,155", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp39"], - "2x50G[25G,10G]": ["etp39a", "etp39b"] + "1x100G[50G,40G,25G,10G]": ["etp39"] } }, "Ethernet156": { "index": "40,40,40,40", "lanes": "156,157,158,159", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp40"], - "2x50G[25G,10G]": ["etp40a", "etp40b"] + "1x100G[50G,40G,25G,10G]": ["etp40"] } }, "Ethernet160": { "index": "41,41,41,41", "lanes": "160,161,162,163", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp41"], - "2x50G[25G,10G]": ["etp41a", "etp41b"] + "1x100G[50G,40G,25G,10G]": ["etp41"] } }, "Ethernet164": { "index": "42,42,42,42", "lanes": "164,165,166,167", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp42"], - "2x50G[25G,10G]": ["etp42a", "etp42b"] + "1x100G[50G,40G,25G,10G]": ["etp42"] } }, "Ethernet168": { "index": "43,43,43,43", "lanes": "168,169,170,171", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp43"], - "2x50G[25G,10G]": ["etp43a", "etp43b"] + "1x100G[50G,40G,25G,10G]": ["etp43"] } }, "Ethernet172": { "index": "44,44,44,44", "lanes": "172,173,174,175", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp44"], - "2x50G[25G,10G]": ["etp44a", "etp44b"] + "1x100G[50G,40G,25G,10G]": ["etp44"] } }, "Ethernet176": { "index": "45,45,45,45", "lanes": "176,177,178,179", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp45"], - "2x50G[25G,10G]": ["etp45a", "etp45b"] + "1x100G[50G,40G,25G,10G]": ["etp45"] } }, "Ethernet180": { "index": "46,46,46,46", "lanes": "180,181,182,183", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp46"], - "2x50G[25G,10G]": ["etp46a", "etp46b"] + "1x100G[50G,40G,25G,10G]": ["etp46"] } }, "Ethernet184": { "index": "47,47,47,47", "lanes": "184,185,186,187", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp47"], - "2x50G[25G,10G]": ["etp47a", "etp47b"] + "1x100G[50G,40G,25G,10G]": ["etp47"] } }, "Ethernet188": { "index": "48,48,48,48", "lanes": "188,189,190,191", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp48"], - "2x50G[25G,10G]": ["etp48a", "etp48b"] + "1x100G[50G,40G,25G,10G]": ["etp48"] } }, "Ethernet192": { "index": "49,49,49,49", "lanes": "192,193,194,195", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp49"], - "2x50G[25G,10G]": ["etp49a", "etp49b"] + "1x100G[50G,40G,25G,10G]": ["etp49"] } }, "Ethernet196": { "index": "50,50,50,50", "lanes": "196,197,198,199", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp50"], - "2x50G[25G,10G]": ["etp50a", "etp50b"] + "1x100G[50G,40G,25G,10G]": ["etp50"] } }, "Ethernet200": { "index": "51,51,51,51", "lanes": "200,201,202,203", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp51"], - "2x50G[25G,10G]": ["etp51a", "etp51b"] + "1x100G[50G,40G,25G,10G]": ["etp51"] } }, "Ethernet204": { "index": "52,52,52,52", "lanes": "204,205,206,207", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp52"], - "2x50G[25G,10G]": ["etp52a", "etp52b"] + "1x100G[50G,40G,25G,10G]": ["etp52"] } }, "Ethernet208": { "index": "53,53,53,53", "lanes": "208,209,210,211", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp53"], - "2x50G[25G,10G]": ["etp53a", "etp53b"] + "1x100G[50G,40G,25G,10G]": ["etp53"] } }, "Ethernet212": { "index": "54,54,54,54", "lanes": "212,213,214,215", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp54"], - "2x50G[25G,10G]": ["etp54a", "etp54b"] + "1x100G[50G,40G,25G,10G]": ["etp54"] } }, "Ethernet216": { "index": "55,55,55,55", "lanes": "216,217,218,219", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp55"], - "2x50G[25G,10G]": ["etp55a", "etp55b"] + "1x100G[50G,40G,25G,10G]": ["etp55"] } }, "Ethernet220": { "index": "56,56,56,56", "lanes": "220,221,222,223", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp56"], - "2x50G[25G,10G]": ["etp56a", "etp56b"] + "1x100G[50G,40G,25G,10G]": ["etp56"] } }, "Ethernet224": { "index": "57,57,57,57", "lanes": "224,225,226,227", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp57"], - "2x50G[25G,10G]": ["etp57a", "etp57b"] + "1x100G[50G,40G,25G,10G]": ["etp57"] } }, "Ethernet228": { "index": "58,58,58,58", "lanes": "228,229,230,231", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp58"], - "2x50G[25G,10G]": ["etp58a", "etp58b"] + "1x100G[50G,40G,25G,10G]": ["etp58"] } }, "Ethernet232": { "index": "59,59,59,59", "lanes": "232,233,234,235", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp59"], - "2x50G[25G,10G]": ["etp59a", "etp59b"] + "1x100G[50G,40G,25G,10G]": ["etp59"] } }, "Ethernet236": { "index": "60,60,60,60", "lanes": "236,237,238,239", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp60"], - "2x50G[25G,10G]": ["etp60a", "etp60b"] + "1x100G[50G,40G,25G,10G]": ["etp60"] } }, "Ethernet240": { "index": "61,61,61,61", "lanes": "240,241,242,243", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp61"], - "2x50G[25G,10G]": ["etp61a", "etp61b"] + "1x100G[50G,40G,25G,10G]": ["etp61"] } }, "Ethernet244": { "index": "62,62,62,62", "lanes": "244,245,246,247", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp62"], - "2x50G[25G,10G]": ["etp62a", "etp62b"] + "1x100G[50G,40G,25G,10G]": ["etp62"] } }, "Ethernet248": { "index": "63,63,63,63", "lanes": "248,249,250,251", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp63"], - "2x50G[25G,10G]": ["etp63a", "etp63b"] + "1x100G[50G,40G,25G,10G]": ["etp63"] } }, "Ethernet252": { "index": "64,64,64,64", "lanes": "252,253,254,255", "breakout_modes": { - "1x100G[50G,40G,25G,10G]": ["etp64"], - "2x50G[25G,10G]": ["etp64a", "etp64b"] + "1x100G[50G,40G,25G,10G]": ["etp64"] } } } diff --git a/device/mellanox/x86_64-mlnx_msn4600-r0/platform.json b/device/mellanox/x86_64-mlnx_msn4600-r0/platform.json index a16b210d90ed..e4f4845dfe3f 100644 --- a/device/mellanox/x86_64-mlnx_msn4600-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn4600-r0/platform.json @@ -626,8 +626,7 @@ "lanes": "0,1,2,3", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp1"], - "2x100G[50G,25G,10G,1G]": ["etp1a", "etp1b"], - "4x50G[25G,10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"] + "2x100G[50G,25G,10G,1G]": ["etp1a", "etp1b"] } }, "Ethernet4": { @@ -635,8 +634,7 @@ "lanes": "8,9,10,11", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp2"], - "2x100G[50G,25G,10G,1G]": ["etp2a", "etp2b"], - "4x50G[25G,10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"] + "2x100G[50G,25G,10G,1G]": ["etp2a", "etp2b"] } }, "Ethernet8": { @@ -644,8 +642,7 @@ "lanes": "16,17,18,19", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp3"], - "2x100G[50G,25G,10G,1G]": ["etp3a", "etp3b"], - "4x50G[25G,10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"] + "2x100G[50G,25G,10G,1G]": ["etp3a", "etp3b"] } }, "Ethernet12": { @@ -653,8 +650,7 @@ "lanes": "24,25,26,27", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp4"], - "2x100G[50G,25G,10G,1G]": ["etp4a", "etp4b"], - "4x50G[25G,10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"] + "2x100G[50G,25G,10G,1G]": ["etp4a", "etp4b"] } }, "Ethernet16": { @@ -662,8 +658,7 @@ "lanes": "32,33,34,35", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp5"], - "2x100G[50G,25G,10G,1G]": ["etp5a", "etp5b"], - "4x50G[25G,10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"] + "2x100G[50G,25G,10G,1G]": ["etp5a", "etp5b"] } }, "Ethernet20": { @@ -671,8 +666,7 @@ "lanes": "40,41,42,43", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp6"], - "2x100G[50G,25G,10G,1G]": ["etp6a", "etp6b"], - "4x50G[25G,10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"] + "2x100G[50G,25G,10G,1G]": ["etp6a", "etp6b"] } }, "Ethernet24": { @@ -680,8 +674,7 @@ "lanes": "48,49,50,51", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp7"], - "2x100G[50G,25G,10G,1G]": ["etp7a", "etp7b"], - "4x50G[25G,10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"] + "2x100G[50G,25G,10G,1G]": ["etp7a", "etp7b"] } }, "Ethernet28": { @@ -689,8 +682,7 @@ "lanes": "56,57,58,59", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp8"], - "2x100G[50G,25G,10G,1G]": ["etp8a", "etp8b"], - "4x50G[25G,10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"] + "2x100G[50G,25G,10G,1G]": ["etp8a", "etp8b"] } }, "Ethernet32": { @@ -698,8 +690,7 @@ "lanes": "64,65,66,67", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp9"], - "2x100G[50G,25G,10G,1G]": ["etp9a", "etp9b"], - "4x50G[25G,10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"] + "2x100G[50G,25G,10G,1G]": ["etp9a", "etp9b"] } }, "Ethernet36": { @@ -707,8 +698,7 @@ "lanes": "72,73,74,75", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp10"], - "2x100G[50G,25G,10G,1G]": ["etp10a", "etp10b"], - "4x50G[25G,10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"] + "2x100G[50G,25G,10G,1G]": ["etp10a", "etp10b"] } }, "Ethernet40": { @@ -716,8 +706,7 @@ "lanes": "80,81,82,83", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp11"], - "2x100G[50G,25G,10G,1G]": ["etp11a", "etp11b"], - "4x50G[25G,10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"] + "2x100G[50G,25G,10G,1G]": ["etp11a", "etp11b"] } }, "Ethernet44": { @@ -725,8 +714,7 @@ "lanes": "88,89,90,91", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp12"], - "2x100G[50G,25G,10G,1G]": ["etp12a", "etp12b"], - "4x50G[25G,10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"] + "2x100G[50G,25G,10G,1G]": ["etp12a", "etp12b"] } }, "Ethernet48": { @@ -734,8 +722,7 @@ "lanes": "96,97,98,99", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp13"], - "2x100G[50G,25G,10G,1G]": ["etp13a", "etp13b"], - "4x50G[25G,10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"] + "2x100G[50G,25G,10G,1G]": ["etp13a", "etp13b"] } }, "Ethernet52": { @@ -743,8 +730,7 @@ "lanes": "104,105,106,107", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp14"], - "2x100G[50G,25G,10G,1G]": ["etp14a", "etp14b"], - "4x50G[25G,10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"] + "2x100G[50G,25G,10G,1G]": ["etp14a", "etp14b"] } }, "Ethernet56": { @@ -752,8 +738,7 @@ "lanes": "112,113,114,115", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp15"], - "2x100G[50G,25G,10G,1G]": ["etp15a", "etp15b"], - "4x50G[25G,10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"] + "2x100G[50G,25G,10G,1G]": ["etp15a", "etp15b"] } }, "Ethernet60": { @@ -761,8 +746,7 @@ "lanes": "120,121,122,123", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp16"], - "2x100G[50G,25G,10G,1G]": ["etp16a", "etp16b"], - "4x50G[25G,10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"] + "2x100G[50G,25G,10G,1G]": ["etp16a", "etp16b"] } }, "Ethernet64": { @@ -770,8 +754,7 @@ "lanes": "128,129,130,131", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp17"], - "2x100G[50G,25G,10G,1G]": ["etp17a", "etp17b"], - "4x50G[25G,10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"] + "2x100G[50G,25G,10G,1G]": ["etp17a", "etp17b"] } }, "Ethernet68": { @@ -779,8 +762,7 @@ "lanes": "136,137,138,139", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp18"], - "2x100G[50G,25G,10G,1G]": ["etp18a", "etp18b"], - "4x50G[25G,10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"] + "2x100G[50G,25G,10G,1G]": ["etp18a", "etp18b"] } }, "Ethernet72": { @@ -788,8 +770,7 @@ "lanes": "144,145,146,147", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp19"], - "2x100G[50G,25G,10G,1G]": ["etp19a", "etp19b"], - "4x50G[25G,10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"] + "2x100G[50G,25G,10G,1G]": ["etp19a", "etp19b"] } }, "Ethernet76": { @@ -797,8 +778,7 @@ "lanes": "152,153,154,155", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp20"], - "2x100G[50G,25G,10G,1G]": ["etp20a", "etp20b"], - "4x50G[25G,10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"] + "2x100G[50G,25G,10G,1G]": ["etp20a", "etp20b"] } }, "Ethernet80": { @@ -806,8 +786,7 @@ "lanes": "160,161,162,163", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp21"], - "2x100G[50G,25G,10G,1G]": ["etp21a", "etp21b"], - "4x50G[25G,10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"] + "2x100G[50G,25G,10G,1G]": ["etp21a", "etp21b"] } }, "Ethernet84": { @@ -815,8 +794,7 @@ "lanes": "168,169,170,171", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp22"], - "2x100G[50G,25G,10G,1G]": ["etp22a", "etp22b"], - "4x50G[25G,10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"] + "2x100G[50G,25G,10G,1G]": ["etp22a", "etp22b"] } }, "Ethernet88": { @@ -824,8 +802,7 @@ "lanes": "176,177,178,179", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp23"], - "2x100G[50G,25G,10G,1G]": ["etp23a", "etp23b"], - "4x50G[25G,10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"] + "2x100G[50G,25G,10G,1G]": ["etp23a", "etp23b"] } }, "Ethernet92": { @@ -833,8 +810,7 @@ "lanes": "184,185,186,187", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp24"], - "2x100G[50G,25G,10G,1G]": ["etp24a", "etp24b"], - "4x50G[25G,10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"] + "2x100G[50G,25G,10G,1G]": ["etp24a", "etp24b"] } }, "Ethernet96": { @@ -842,8 +818,7 @@ "lanes": "192,193,194,195", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp25"], - "2x100G[50G,25G,10G,1G]": ["etp25a", "etp25b"], - "4x50G[25G,10G,1G]": ["etp25a", "etp25b", "etp25c", "etp25d"] + "2x100G[50G,25G,10G,1G]": ["etp25a", "etp25b"] } }, "Ethernet100": { @@ -851,8 +826,7 @@ "lanes": "200,201,202,203", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp26"], - "2x100G[50G,25G,10G,1G]": ["etp26a", "etp26b"], - "4x50G[25G,10G,1G]": ["etp26a", "etp26b", "etp26c", "etp26d"] + "2x100G[50G,25G,10G,1G]": ["etp26a", "etp26b"] } }, "Ethernet104": { @@ -860,8 +834,7 @@ "lanes": "208,209,210,211", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp27"], - "2x100G[50G,25G,10G,1G]": ["etp27a", "etp27b"], - "4x50G[25G,10G,1G]": ["etp27a", "etp27b", "etp27c", "etp27d"] + "2x100G[50G,25G,10G,1G]": ["etp27a", "etp27b"] } }, "Ethernet108": { @@ -869,8 +842,7 @@ "lanes": "216,217,218,219", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp28"], - "2x100G[50G,25G,10G,1G]": ["etp28a", "etp28b"], - "4x50G[25G,10G,1G]": ["etp28a", "etp28b", "etp28c", "etp28d"] + "2x100G[50G,25G,10G,1G]": ["etp28a", "etp28b"] } }, "Ethernet112": { @@ -878,16 +850,14 @@ "lanes": "224,225,226,227", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp29"], - "2x100G[50G,25G,10G,1G]": ["etp29a", "etp29b"], - "4x50G[25G,10G,1G]": ["etp29a", "etp29b", "etp29c", "etp29d"] + "2x100G[50G,25G,10G,1G]": ["etp29a", "etp29b"] } }, "Ethernet116": { "index": "30,30,30,30", "lanes": "232,233,234,235", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp30"], - "2x100G[50G,25G,10G,1G]": ["etp30a", "etp30b"], - "4x50G[25G,10G,1G]": ["etp30a", "etp30b", "etp30c", "etp30d"] + "2x100G[50G,25G,10G,1G]": ["etp30a", "etp30b"] } }, "Ethernet120": { @@ -895,8 +865,7 @@ "lanes": "240,241,242,243", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp31"], - "2x100G[50G,25G,10G,1G]": ["etp31a", "etp31b"], - "4x50G[25G,10G,1G]": ["etp31a", "etp31b", "etp31c", "etp31d"] + "2x100G[50G,25G,10G,1G]": ["etp31a", "etp31b"] } }, "Ethernet124": { @@ -904,8 +873,7 @@ "lanes": "248,249,250,251", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp32"], - "2x100G[50G,25G,10G,1G]": ["etp32a", "etp32b"], - "4x50G[25G,10G,1G]": ["etp32a", "etp32b", "etp32c", "etp32d"] + "2x100G[50G,25G,10G,1G]": ["etp32a", "etp32b"] } }, "Ethernet128": { @@ -913,8 +881,7 @@ "lanes": "256,257,258,259", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp33"], - "2x100G[50G,25G,10G,1G]": ["etp33a", "etp33b"], - "4x50G[25G,10G,1G]": ["etp33a", "etp33b", "etp33c", "etp33d"] + "2x100G[50G,25G,10G,1G]": ["etp33a", "etp33b"] } }, "Ethernet132": { @@ -922,8 +889,7 @@ "lanes": "264,265,266,267", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp34"], - "2x100G[50G,25G,10G,1G]": ["etp34a", "etp34b"], - "4x50G[25G,10G,1G]": ["etp34a", "etp34b", "etp34c", "etp34d"] + "2x100G[50G,25G,10G,1G]": ["etp34a", "etp34b"] } }, "Ethernet136": { @@ -931,8 +897,7 @@ "lanes": "272,273,274,275", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp35"], - "2x100G[50G,25G,10G,1G]": ["etp35a", "etp35b"], - "4x50G[25G,10G,1G]": ["etp35a", "etp35b", "etp35c", "etp35d"] + "2x100G[50G,25G,10G,1G]": ["etp35a", "etp35b"] } }, "Ethernet140": { @@ -940,8 +905,7 @@ "lanes": "280,281,282,283", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp36"], - "2x100G[50G,25G,10G,1G]": ["etp36a", "etp36b"], - "4x50G[25G,10G,1G]": ["etp36a", "etp36b", "etp36c", "etp36d"] + "2x100G[50G,25G,10G,1G]": ["etp36a", "etp36b"] } }, "Ethernet144": { @@ -949,8 +913,7 @@ "lanes": "288,289,290,291", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp37"], - "2x100G[50G,25G,10G,1G]": ["etp37a", "etp37b"], - "4x50G[25G,10G,1G]": ["etp37a", "etp37b", "etp37c", "etp37d"] + "2x100G[50G,25G,10G,1G]": ["etp37a", "etp37b"] } }, "Ethernet148": { @@ -958,8 +921,7 @@ "lanes": "296,297,298,299", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp38"], - "2x100G[50G,25G,10G,1G]": ["etp38a", "etp38b"], - "4x50G[25G,10G,1G]": ["etp38a", "etp38b", "etp38c", "etp38d"] + "2x100G[50G,25G,10G,1G]": ["etp38a", "etp38b"] } }, "Ethernet152": { @@ -967,8 +929,7 @@ "lanes": "304,305,306,307", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp39"], - "2x100G[50G,25G,10G,1G]": ["etp39a", "etp39b"], - "4x50G[25G,10G,1G]": ["etp39a", "etp39b", "etp39c", "etp39d"] + "2x100G[50G,25G,10G,1G]": ["etp39a", "etp39b"] } }, "Ethernet156": { @@ -976,8 +937,7 @@ "lanes": "312,313,314,315", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp40"], - "2x100G[50G,25G,10G,1G]": ["etp40a", "etp40b"], - "4x50G[25G,10G,1G]": ["etp40a", "etp40b", "etp40c", "etp40d"] + "2x100G[50G,25G,10G,1G]": ["etp40a", "etp40b"] } }, "Ethernet160": { @@ -985,8 +945,7 @@ "lanes": "320,321,322,323", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp41"], - "2x100G[50G,25G,10G,1G]": ["etp41a", "etp41b"], - "4x50G[25G,10G,1G]": ["etp41a", "etp41b", "etp41c", "etp41d"] + "2x100G[50G,25G,10G,1G]": ["etp41a", "etp41b"] } }, "Ethernet164": { @@ -994,8 +953,7 @@ "lanes": "328,329,330,331", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp42"], - "2x100G[50G,25G,10G,1G]": ["etp42a", "etp42b"], - "4x50G[25G,10G,1G]": ["etp42a", "etp42b", "etp42c", "etp42d"] + "2x100G[50G,25G,10G,1G]": ["etp42a", "etp42b"] } }, "Ethernet168": { @@ -1003,8 +961,7 @@ "lanes": "336,337,338,339", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp43"], - "2x100G[50G,25G,10G,1G]": ["etp43a", "etp43b"], - "4x50G[25G,10G,1G]": ["etp43a", "etp43b", "etp43c", "etp43d"] + "2x100G[50G,25G,10G,1G]": ["etp43a", "etp43b"] } }, "Ethernet172": { @@ -1012,8 +969,7 @@ "lanes": "344,345,346,347", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp44"], - "2x100G[50G,25G,10G,1G]": ["etp44a", "etp44b"], - "4x50G[25G,10G,1G]": ["etp44a", "etp44b", "etp44c", "etp44d"] + "2x100G[50G,25G,10G,1G]": ["etp44a", "etp44b"] } }, "Ethernet176": { @@ -1021,8 +977,7 @@ "lanes": "352,353,354,355", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp45"], - "2x100G[50G,25G,10G,1G]": ["etp45a", "etp45b"], - "4x50G[25G,10G,1G]": ["etp45a", "etp45b", "etp45c", "etp45d"] + "2x100G[50G,25G,10G,1G]": ["etp45a", "etp45b"] } }, "Ethernet180": { @@ -1030,8 +985,7 @@ "lanes": "360,361,362,363", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp46"], - "2x100G[50G,25G,10G,1G]": ["etp46a", "etp46b"], - "4x50G[25G,10G,1G]": ["etp46a", "etp46b", "etp46c", "etp46d"] + "2x100G[50G,25G,10G,1G]": ["etp46a", "etp46b"] } }, "Ethernet184": { @@ -1039,8 +993,7 @@ "lanes": "368,369,370,371", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp47"], - "2x100G[50G,25G,10G,1G]": ["etp47a", "etp47b"], - "4x50G[25G,10G,1G]": ["etp47a", "etp47b", "etp47c", "etp47d"] + "2x100G[50G,25G,10G,1G]": ["etp47a", "etp47b"] } }, "Ethernet188": { @@ -1048,8 +1001,7 @@ "lanes": "376,377,378,379", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp48"], - "2x100G[50G,25G,10G,1G]": ["etp48a", "etp48b"], - "4x50G[25G,10G,1G]": ["etp48a", "etp48b", "etp48c", "etp48d"] + "2x100G[50G,25G,10G,1G]": ["etp48a", "etp48b"] } }, "Ethernet192": { @@ -1057,8 +1009,7 @@ "lanes": "384,385,386,387", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp49"], - "2x100G[50G,25G,10G,1G]": ["etp49a", "etp49b"], - "4x50G[25G,10G,1G]": ["etp49a", "etp49b", "etp49c", "etp49d"] + "2x100G[50G,25G,10G,1G]": ["etp49a", "etp49b"] } }, "Ethernet196": { @@ -1066,8 +1017,7 @@ "lanes": "392,393,394,395", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp50"], - "2x100G[50G,25G,10G,1G]": ["etp50a", "etp50b"], - "4x50G[25G,10G,1G]": ["etp50a", "etp50b", "etp50c", "etp50d"] + "2x100G[50G,25G,10G,1G]": ["etp50a", "etp50b"] } }, "Ethernet200": { @@ -1075,8 +1025,7 @@ "lanes": "400,401,402,403", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp51"], - "2x100G[50G,25G,10G,1G]": ["etp51a", "etp51b"], - "4x50G[25G,10G,1G]": ["etp51a", "etp51b", "etp51c", "etp51d"] + "2x100G[50G,25G,10G,1G]": ["etp51a", "etp51b"] } }, "Ethernet204": { @@ -1084,8 +1033,7 @@ "lanes": "408,409,410,411", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp52"], - "2x100G[50G,25G,10G,1G]": ["etp52a", "etp52b"], - "4x50G[25G,10G,1G]": ["etp52a", "etp52b", "etp52c", "etp52d"] + "2x100G[50G,25G,10G,1G]": ["etp52a", "etp52b"] } }, "Ethernet208": { @@ -1093,8 +1041,7 @@ "lanes": "416,417,418,419", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp53"], - "2x100G[50G,25G,10G,1G]": ["etp53a", "etp53b"], - "4x50G[25G,10G,1G]": ["etp53a", "etp53b", "etp53c", "etp53d"] + "2x100G[50G,25G,10G,1G]": ["etp53a", "etp53b"] } }, "Ethernet212": { @@ -1102,8 +1049,7 @@ "lanes": "424,425,426,427", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp54"], - "2x100G[50G,25G,10G,1G]": ["etp54a", "etp54b"], - "4x50G[25G,10G,1G]": ["etp54a", "etp54b", "etp54c", "etp54d"] + "2x100G[50G,25G,10G,1G]": ["etp54a", "etp54b"] } }, "Ethernet216": { @@ -1111,8 +1057,7 @@ "lanes": "432,433,434,435", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp55"], - "2x100G[50G,25G,10G,1G]": ["etp55a", "etp55b"], - "4x50G[25G,10G,1G]": ["etp55a", "etp55b", "etp55c", "etp55d"] + "2x100G[50G,25G,10G,1G]": ["etp55a", "etp55b"] } }, "Ethernet220": { @@ -1120,8 +1065,7 @@ "lanes": "440,441,442,443", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp56"], - "2x100G[50G,25G,10G,1G]": ["etp56a", "etp56b"], - "4x50G[25G,10G,1G]": ["etp56a", "etp56b", "etp56c", "etp56d"] + "2x100G[50G,25G,10G,1G]": ["etp56a", "etp56b"] } }, "Ethernet224": { @@ -1129,8 +1073,7 @@ "lanes": "448,449,450,451", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp57"], - "2x100G[50G,25G,10G,1G]": ["etp57a", "etp57b"], - "4x50G[25G,10G,1G]": ["etp57a", "etp57b", "etp57c", "etp57d"] + "2x100G[50G,25G,10G,1G]": ["etp57a", "etp57b"] } }, "Ethernet228": { @@ -1138,8 +1081,7 @@ "lanes": "456,457,458,459", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp58"], - "2x100G[50G,25G,10G,1G]": ["etp58a", "etp58b"], - "4x50G[25G,10G,1G]": ["etp58a", "etp58b", "etp58c", "etp58d"] + "2x100G[50G,25G,10G,1G]": ["etp58a", "etp58b"] } }, "Ethernet232": { @@ -1147,8 +1089,7 @@ "lanes": "464,465,466,467", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp59"], - "2x100G[50G,25G,10G,1G]": ["etp59a", "etp59b"], - "4x50G[25G,10G,1G]": ["etp59a", "etp59b", "etp59c", "etp59d"] + "2x100G[50G,25G,10G,1G]": ["etp59a", "etp59b"] } }, "Ethernet236": { @@ -1156,8 +1097,7 @@ "lanes": "472,473,474,475", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp60"], - "2x100G[50G,25G,10G,1G]": ["etp60a", "etp60b"], - "4x50G[25G,10G,1G]": ["etp60a", "etp60b", "etp60c", "etp60d"] + "2x100G[50G,25G,10G,1G]": ["etp60a", "etp60b"] } }, "Ethernet240": { @@ -1165,8 +1105,7 @@ "lanes": "480,481,482,483", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp61"], - "2x100G[50G,25G,10G,1G]": ["etp61a", "etp61b"], - "4x50G[25G,10G,1G]": ["etp61a", "etp61b", "etp61c", "etp61d"] + "2x100G[50G,25G,10G,1G]": ["etp61a", "etp61b"] } }, "Ethernet244": { @@ -1174,8 +1113,7 @@ "lanes": "488,489,490,491", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp62"], - "2x100G[50G,25G,10G,1G]": ["etp62a", "etp62b"], - "4x50G[25G,10G,1G]": ["etp62a", "etp62b", "etp62c", "etp62d"] + "2x100G[50G,25G,10G,1G]": ["etp62a", "etp62b"] } }, "Ethernet248": { @@ -1183,8 +1121,7 @@ "lanes": "496,497,498,499", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp63"], - "2x100G[50G,25G,10G,1G]": ["etp63a", "etp63b"], - "4x50G[25G,10G,1G]": ["etp63a", "etp63b", "etp63c", "etp63d"] + "2x100G[50G,25G,10G,1G]": ["etp63a", "etp63b"] } }, "Ethernet252": { @@ -1192,8 +1129,7 @@ "lanes": "504,505,506,507", "breakout_modes": { "1x200G[100G,50G,40G,25G,10G,1G]": ["etp64"], - "2x100G[50G,25G,10G,1G]": ["etp64a", "etp64b"], - "4x50G[25G,10G,1G]": ["etp64a", "etp64b", "etp64c", "etp64d"] + "2x100G[50G,25G,10G,1G]": ["etp64a", "etp64b"] } } } From 5e1acf0225e94368a8d61f178cae8f72a4e17049 Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Fri, 25 Feb 2022 22:57:38 -0500 Subject: [PATCH 020/817] [Nokia][platform]Modify BCM config & platform_reboot for Nokia-IXR7250E-36x400G (#9990) Signed-off-by: Sakthivadivu Saravanaraj --- .../Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm | 3 +-- .../Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm | 3 +-- device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index 5611903647e8..ecaae10276a4 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -2048,5 +2048,4 @@ dpp_db_path=/usr/share/bcm/db sai_recycle_port_lane_base=96 appl_param_nof_ports_per_modid=64 udh_exists=1 - - +modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index f5fcdb200b64..142a718e080f 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -2050,5 +2050,4 @@ dpp_db_path=/usr/share/bcm/db sai_recycle_port_lane_base=96 appl_param_nof_ports_per_modid=64 udh_exists=1 - - +modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot index d128455d40fc..c5ff45d1848e 100755 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot @@ -7,4 +7,6 @@ kick_date=`date -u` echo "last watchdog kick $kick_date" > /var/log/nokia-watchdog-last.log rm -f /sys/firmware/efi/efivars/dump-* sync +echo "Rebooting all Linecards" +python3 -c 'import sonic_platform.platform; platform_chassis = sonic_platform.platform.Platform().get_chassis(); platform_chassis.reboot_imms()' /sbin/reboot From 47870cecfc4c8a561cd0b3842f902eff94155ac6 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Sun, 27 Feb 2022 17:47:15 +0800 Subject: [PATCH 021/817] Stop PMON before swss during warm reboot (#10046) - Why I did it Stopping swss and syncd causes some driver module unloading. Those driver modules are depended by PMON. This could trigger ERROR logs in syslog. - How I did it Adjust warmboot shutdown order in make file - How to verify it Manual test --- rules/docker-platform-monitor.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 0a0efa435f80..21babbcb49f4 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -38,6 +38,10 @@ $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BUSTER) $(DOCKER_PLATFORM_MONITOR)_VERSION = 1.0.0 $(DOCKER_PLATFORM_MONITOR)_PACKAGE_NAME = pmon +ifeq ($(CONFIGURED_PLATFORM),mellanox) +$(DOCKER_PLATFORM_MONITOR)_WARM_SHUTDOWN_BEFORE = swss +endif + SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) From b8fa5e0d8dd4f3005aa4d9447e8330b8057612b6 Mon Sep 17 00:00:00 2001 From: Yang Wang Date: Mon, 28 Feb 2022 11:21:04 +0800 Subject: [PATCH 022/817] install xmlrunner python3 version (#10086) --- dockers/docker-ptf-sai/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-ptf-sai/Dockerfile.j2 b/dockers/docker-ptf-sai/Dockerfile.j2 index f42d04c1cd07..1e284bd368ea 100644 --- a/dockers/docker-ptf-sai/Dockerfile.j2 +++ b/dockers/docker-ptf-sai/Dockerfile.j2 @@ -18,7 +18,8 @@ RUN pip3 install crc16 \ psutil \ scapy==2.4.4 \ scapy_helper \ - pysubnettree + pysubnettree \ + xmlrunner COPY \ {% for deb in docker_ptf_sai_debs.split(' ') -%} From 5daf482a95219443da731818df8d743edb483924 Mon Sep 17 00:00:00 2001 From: Rajkumar-Marvell <54936542+rajkumar38@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:10:58 +0530 Subject: [PATCH 023/817] [Marevell] Fix armhf build failure (#9875) Signed-off-by: Rajkumar Pennadam Ramamoorthy --- platform/marvell-armhf/sonic-platform-et6448m/entropy.py | 7 +++++-- platform/marvell-armhf/sonic-platform-nokia/entropy.py | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/platform/marvell-armhf/sonic-platform-et6448m/entropy.py b/platform/marvell-armhf/sonic-platform-et6448m/entropy.py index 338e2ad9bcea..a2131cdc17fb 100644 --- a/platform/marvell-armhf/sonic-platform-et6448m/entropy.py +++ b/platform/marvell-armhf/sonic-platform-et6448m/entropy.py @@ -6,8 +6,11 @@ RNDADDENTROPY=0x40085203 def avail(): - with open("/proc/sys/kernel/random/entropy_avail", mode='r') as avail: - return int(avail.read()) + if path.exists("/proc/sys/kernel/random/entropy_avail"): + with open("/proc/sys/kernel/random/entropy_avail", mode='r') as avail: + return int(avail.read()) + else: + return int(2048) if path.exists("/proc/sys/kernel/random/entropy_avail"): while 1: diff --git a/platform/marvell-armhf/sonic-platform-nokia/entropy.py b/platform/marvell-armhf/sonic-platform-nokia/entropy.py index 338e2ad9bcea..a2131cdc17fb 100644 --- a/platform/marvell-armhf/sonic-platform-nokia/entropy.py +++ b/platform/marvell-armhf/sonic-platform-nokia/entropy.py @@ -6,8 +6,11 @@ RNDADDENTROPY=0x40085203 def avail(): - with open("/proc/sys/kernel/random/entropy_avail", mode='r') as avail: - return int(avail.read()) + if path.exists("/proc/sys/kernel/random/entropy_avail"): + with open("/proc/sys/kernel/random/entropy_avail", mode='r') as avail: + return int(avail.read()) + else: + return int(2048) if path.exists("/proc/sys/kernel/random/entropy_avail"): while 1: From 7c4fbf0455709dca3de61c3a51c33c7e1d4fff3e Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Mon, 28 Feb 2022 01:08:19 -0500 Subject: [PATCH 024/817] [Mellanox] Add patch to hw-mgmt to prevent loading of non-existent kernel modules (#10073) - Why I did it The latest upgrade of Mellanox hw-mgmt V7.0020.1300 introduced a couple new kernel modules for new Mellanox platforms that have yet to be upstreamed to the linux kernel. As these new platforms do not have SONiC support we elected not to upstream these new drivers to sonic-linux-kernel but hw-mgmt expects them to exist which is causing a non-functional error on switch boot. Feb 15 00:09:55.374130 r-leopard-simx-74 ERR systemd-modules-load[269]: Failed to find module 'emc2305' Feb 15 00:09:55.374141 r-leopard-simx-74 ERR systemd-modules-load[269]: Failed to find module 'ads1015' To resolve this we can patch hw-mgmt to no longer attempt to load these modules by default. - How I did it Added a SONiC patch to Mellanox hw-mgmt in order to remove the unused kernel modules which were not upstreamed to sonic-linux-kernel - How to verify it Boot switch and verify there are no error logs regarding kernel modules failing to load. --- ...on-upstream-kernel-modules-from-load.patch | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch diff --git a/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch new file mode 100644 index 000000000000..fb114224494b --- /dev/null +++ b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch @@ -0,0 +1,25 @@ +From 14b06a12802fc0e15116a64f419d002d0d21d695 Mon Sep 17 00:00:00 2001 +From: Alexander Allen +Date: Thu, 17 Feb 2022 04:19:50 +0000 +Subject: [PATCH] Remove unused non-upstream kernel modules from load + +--- + usr/etc/modules-load.d/05-hw-management-modules.conf | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/usr/etc/modules-load.d/05-hw-management-modules.conf b/usr/etc/modules-load.d/05-hw-management-modules.conf +index 39f621e..c0980bc 100644 +--- a/usr/etc/modules-load.d/05-hw-management-modules.conf ++++ b/usr/etc/modules-load.d/05-hw-management-modules.conf +@@ -15,8 +15,6 @@ xdpe12284 + mp2975 + mp2888 + i2c-mux-pca954x +-emc2305 +-ads1015 + powr1220 + gpio-pca953x + pmbus +-- +2.17.1 + From afa18e2856815b25631df9658013e0b3bf6ff196 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 28 Feb 2022 11:46:50 -0800 Subject: [PATCH 025/817] [build_debian.sh]: Fix /var/log having 0750 permissions instead of 0755 (#10031) PR #9481 changed auditd's log directory to be /var/log instead of /var/log/audit, because SONiC mounts a disk image at /var/log during runtime, and so the /var/log/audit directory might not exist (since it would've been created during package installation, mounting another partition at /var/log will hide it). However, for security reasons, auditd changes the log directory to have 0750 permissions, so that not everyone knows about the audit logs or read them. To fix this, revert the change to auditd's log directory, and tell systemd to create the audit log directory at runtime if it doesn't exist. Because the disk image gets mounted during initramfs (before systemd starts), systemd will make sure that the /var/log/audit directory will exist. Fixes #9548 and #10015 Signed-off-by: Saikrishna Arcot --- build_debian.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 61f6912829e9..73984cb6cc51 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -328,8 +328,13 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in jq \ auditd -# Change auditd log file path to fix auditd can't startup issue. -sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "sudo sed -i 's/^\s*log_file\s*=.*/log_file = \/var\/log\/audit.log/g' /etc/audit/auditd.conf" +# Have systemd create the auditd log directory +sudo mkdir -p ${FILESYSTEM_ROOT}/etc/systemd/system/auditd.service.d +sudo tee ${FILESYSTEM_ROOT}/etc/systemd/system/auditd.service.d/log-directory.conf >/dev/null < Date: Tue, 1 Mar 2022 02:43:52 +0530 Subject: [PATCH 026/817] Dell: S6100 fix xcvrd crash (#10062) --- .../s6100/sonic_platform/chassis.py | 10 ++++++++++ .../s6100/sonic_platform/sfp.py | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py index c93420886639..47e63f52a17d 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py @@ -20,6 +20,7 @@ from sonic_platform.psu import Psu from sonic_platform.thermal import Thermal from sonic_platform.watchdog import Watchdog, WatchdogTCO + from sonic_platform.sfp import Sfp except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -76,6 +77,15 @@ def __init__(self): self._module_list.append(module) self._sfp_list.extend(module._sfp_list) + #SFP ports + sfp_port = 11 + for index in range(64,66): + eeprom_path = "/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom".format(sfp_port) + sfp_control = "" + sfp_node = Sfp(index, 'SFP', eeprom_path, sfp_control, index) + self._sfp_list.append(sfp_node) + sfp_port = sfp_port + 1 + for i in range(MAX_S6100_FANTRAY): fandrawer = FanDrawer(i) self._fan_drawer_list.append(fandrawer) diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py index 1a0c9cc8417e..fa8e4d9a05c0 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py @@ -10,6 +10,7 @@ try: import os + import syslog import time from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -42,6 +43,9 @@ def get_presence(self): """ Retrieves the presence of the sfp """ + if self.index > 64: + return False + presence_ctrl = self.sfp_control + 'qsfp_modprs' try: reg_file = open(presence_ctrl) @@ -69,6 +73,9 @@ def get_reset_status(self): """ Retrieves the reset status of SFP """ + if self.index > 64: + return False + reset_status = None reset_ctrl = self.sfp_control + 'qsfp_reset' try: @@ -100,6 +107,9 @@ def get_lpmode(self): """ Retrieves the lpmode (low power mode) status of this SFP """ + if self.index > 64: + return False + lpmode_ctrl = self.sfp_control + 'qsfp_lpmode' try: reg_file = open(lpmode_ctrl, "r+") @@ -133,6 +143,9 @@ def reset(self): """ Reset SFP and return all user module settings to their default srate. """ + if self.index > 64: + return False + reset_ctrl = self.sfp_control + 'qsfp_reset' try: # Open reset_ctrl in both read & write mode @@ -178,6 +191,9 @@ def set_lpmode(self, lpmode): """ Sets the lpmode (low power mode) of SFP """ + if self.index > 64: + return False + lpmode_ctrl = self.sfp_control + 'qsfp_lpmode' try: reg_file = open(lpmode_ctrl, "r+") From 47d9b26063b43186614df5588c125363e4a01cf1 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 28 Feb 2022 15:42:02 -0800 Subject: [PATCH 027/817] Revert "[swss]: Wait for vlan intf to start ndppd (#10036)" (#10085) This reverts commit 91204879dfe8399e61ebff4c184b8df4c1da3109. #10036 breaks ndppd functionality --- dockers/docker-orchagent/Dockerfile.j2 | 1 + dockers/docker-orchagent/docker-init.j2 | 1 - dockers/docker-orchagent/ndppd.conf | 9 ++++++ dockers/docker-orchagent/supervisord.conf.j2 | 25 ---------------- dockers/docker-orchagent/wait_for_link.sh.j2 | 30 -------------------- 5 files changed, 10 insertions(+), 56 deletions(-) create mode 100644 dockers/docker-orchagent/ndppd.conf delete mode 100644 dockers/docker-orchagent/wait_for_link.sh.j2 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 3c04ff7c135b..5e403213c1d4 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -68,6 +68,7 @@ RUN apt-get purge -y \ COPY ["files/arp_update", "/usr/bin"] COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] +COPY ["ndppd.conf", "/usr/share/sonic/templates/"] COPY ["enable_counters.py", "tunnel_packet_handler.py", "/usr/bin/"] COPY ["orchagent.sh", "swssconfig.sh", "buffermgrd.sh", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index 52a1c4717ccc..ff543c234904 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -18,7 +18,6 @@ CFGGEN_PARAMS=" \ -t /usr/share/sonic/templates/ndppd.conf.j2,/etc/ndppd.conf \ -t /usr/share/sonic/templates/critical_processes.j2,/etc/supervisor/critical_processes \ -t /usr/share/sonic/templates/supervisord.conf.j2,/etc/supervisor/conf.d/supervisord.conf - -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ " VLAN=$(sonic-cfggen $CFGGEN_PARAMS) diff --git a/dockers/docker-orchagent/ndppd.conf b/dockers/docker-orchagent/ndppd.conf new file mode 100644 index 000000000000..b9dbc293ed2a --- /dev/null +++ b/dockers/docker-orchagent/ndppd.conf @@ -0,0 +1,9 @@ +[program:ndppd] +command=/usr/sbin/ndppd +priority=7 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=vlanmgrd:running diff --git a/dockers/docker-orchagent/supervisord.conf.j2 b/dockers/docker-orchagent/supervisord.conf.j2 index 7954fa7fa6b4..7cd31a113223 100644 --- a/dockers/docker-orchagent/supervisord.conf.j2 +++ b/dockers/docker-orchagent/supervisord.conf.j2 @@ -299,28 +299,3 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {%- endif %} - -{% if is_fabric_asic == 0 %} -[program:ndppd] -command=/usr/sbin/ndppd -priority=7 -autostart=false -autorestart=unexpected -stdout_logfile=syslog -stderr_logfile=syslog -dependent_startup=true -dependent_startup_wait_for=wait_for_link:exited -{%- endif %} - -{% if is_fabric_asic == 0 %} -[program:wait_for_link] -command=/usr/bin/wait_for_link.sh -priority=7 -autostart=false -autorestart=false -startsecs=0 -stdout_logfile=syslog -stderr_logfile=syslog -dependent_startup=true -dependent_startup_wait_for=swssconfig:exited -{%- endif %} diff --git a/dockers/docker-orchagent/wait_for_link.sh.j2 b/dockers/docker-orchagent/wait_for_link.sh.j2 deleted file mode 100644 index 980b472b3e0a..000000000000 --- a/dockers/docker-orchagent/wait_for_link.sh.j2 +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -VLAN_TABLE_PREFIX="VLAN_TABLE" - -function wait_until_iface_ready -{ - TABLE_PREFIX=$1 - IFACE=$2 - - echo "Waiting until interface $IFACE is ready..." - - # Wait for the interface to come up - # (i.e., interface is present in STATE_DB and state is "ok") - while true; do - RESULT=$(sonic-db-cli STATE_DB HGET "${TABLE_PREFIX}|${IFACE}" "state" 2> /dev/null) - if [ x"$RESULT" == x"ok" ]; then - break - fi - - sleep 1 - done - - echo "Interface ${IFACE} is ready!" -} - - -# Wait for all interfaces to be up and ready -{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} -wait_until_iface_ready ${VLAN_TABLE_PREFIX} {{ name }} -{% endfor %} From b617ffd88c245b811fd809bb564ff1c06b96ab78 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Wed, 2 Mar 2022 05:08:03 +0800 Subject: [PATCH 028/817] [AS9716-32d] Modify check eeprom via pre_pddf sh (#7827) Modify to use pre_pddf_init.sh to check eeprom is 0x57 or 0x56. Signed-off-by: Jostar Yang --- .../as9716-32d/modules/Makefile | 5 +- .../as9716-32d/modules/pddf_custom_psu.c | 14 +----- .../utils/pddf_post_driver_install.sh | 46 +++++++++++++++++++ .../as9716-32d/utils/pre_pddf_init.sh | 22 +++++++++ .../sonic-platform-accton-as9716-32d.postinst | 19 +------- 5 files changed, 74 insertions(+), 32 deletions(-) create mode 100755 platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pre_pddf_init.sh diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile index 7bb532a1f531..6ac9d418a3d2 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile @@ -1,8 +1,11 @@ ifneq ($(KERNELRELEASE),) obj-m:= accton_as9716_32d_cpld.o accton_as9716_32d_fan.o \ accton_as9716_32d_leds.o accton_as9716_32d_psu.o accton_i2c_psu.o \ - pddf_custom_psu.o + pddf_custom_psu.o +CFLAGS_pddf_custom_psu.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF + else ifeq (,$(KERNEL_SRC)) #$(error KERNEL_SRC is not defined) diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/pddf_custom_psu.c b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/pddf_custom_psu.c index 9c4dd7f66131..05f27f6fed97 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/pddf_custom_psu.c +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/pddf_custom_psu.c @@ -9,7 +9,7 @@ #include #include #include -#include "../../../../pddf/i2c/modules/include/pddf_psu_defs.h" +#include "pddf_psu_defs.h" ssize_t pddf_show_custom_psu_v_out(struct device *dev, struct device_attribute *da, char *buf); extern PSU_SYSFS_ATTR_DATA access_psu_v_out; @@ -22,13 +22,9 @@ extern PSU_SYSFS_ATTR_DATA access_psu_serial_num; #define MAX_SERIAL_NUMBER 19 enum psu_type { - PSU_TYPE_AC_110V, - PSU_TYPE_DC_48V, - PSU_TYPE_DC_12V, PSU_TYPE_AC_ACBEL_FSF019, PSU_TYPE_AC_ACBEL_FSH082, PSU_TYPE_YESM1300 - }; struct model_name_info { @@ -48,23 +44,15 @@ struct serial_number_info { }; struct model_name_info models[] = { -{PSU_TYPE_AC_110V, 0x20, 8, 8, "YM-2651Y"}, -{PSU_TYPE_DC_48V, 0x20, 8, 8, "YM-2651V"}, -{PSU_TYPE_DC_12V, 0x00, 11, 11, "PSU-12V-750"}, {PSU_TYPE_AC_ACBEL_FSF019, 0x15, 10, 7, "FSF019-"}, {PSU_TYPE_AC_ACBEL_FSH082, 0x20, 10, 7, "FSH082-"}, {PSU_TYPE_YESM1300, 0x20, 11, 8, "YESM1300"}, - }; struct serial_number_info serials[] = { -{PSU_TYPE_AC_110V, 0x2e, 18, 18, "YM-2651Y"}, -{PSU_TYPE_DC_48V, 0x2e, 18, 18, "YM-2651V"}, -{PSU_TYPE_DC_12V, 0x2e, 18, 18, "PSU-12V-750"}, {PSU_TYPE_AC_ACBEL_FSF019, 0x2e, 16, 16, "FSF019-"}, {PSU_TYPE_AC_ACBEL_FSH082, 0x35, 18, 18, "FSH082-"}, {PSU_TYPE_YESM1300, 0x35, 20, 19, "YESM1300"}, - }; struct pddf_psu_data { diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh index 7fbd7f97d03a..484a5f039c0f 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh @@ -18,6 +18,52 @@ ir3570_check() fi } +# Some initializations +#============================================================ +# cpld_reset_stop +#i2cset -y 0 0x65 0x3 0x0 + +# Select the mux channels +i2cset -y 0 0x77 0x1 +i2cset -y 0 0x76 0x4 + +# Diag LED: Boot successfully (SOLID GREEN) --- DO THIS STEP IN POST DEVICE CREATION +# i2cset -y 0 0x60 0x64 4 + +# 10G Merlin Ports +# SetModeXFI() +echo "Set Mux(retimer) to 2x10G XFI." +i2cset -y 0 0x76 0x20 +i2cset -y 0 0x18 0x7 0x3 +i2cset -y 0 0x19 0x7 0x3 +i2cset -y 0 0x1a 0x7 0x3 +i2cset -y 0 0x1b 0x7 0x3 + + +# SetVOD() +#set channel B +i2cset -y 0 0x18 0xff 0x05 +i2cset -y 0 0x19 0xff 0x05 +#write output voltage to 800mV +i2cset -y 0 0x18 0x2d 0x82 +i2cset -y 0 0x19 0x2d 0x82 +#write de-emphasis to -3.5dB +i2cset -y 0 0x18 0x15 0x12 +i2cset -y 0 0x19 0x15 0x12 +#read output voltage +#i2cget -y 0 0x18 0x2d +#i2cget -y 0 0x19 0x2d +#read de-emphasis +#i2cget -y 0 0x18 0x15 +#i2cget -y 0 0x19 0x15 +#clr channel B +i2cset -y 0 0x18 0xff 0x00 +i2cset -y 0 0x19 0xff 0x00 + +# De-select the mux channels which were selected for above configs +i2cset -y 0 0x76 0x0 +i2cset -y 0 0x77 0x0 + ir3570_check echo "AS9716 post PDDF driver install completed" diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pre_pddf_init.sh b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..7fe01e294f08 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pre_pddf_init.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Steps to check syseeprom i2c address +modprobe i2c-i801 +modprobe i2c-dev +use_57_eeprom=false +(i2cget -y -f 0 0x57 0x0) > /dev/null 2>&1 +if [ $? -eq 0 ]; then + use_57_eeprom=true +fi + +if $use_57_eeprom ; then + echo "The board has system EEPROM at I2C address 0x57" + if [ -f /usr/share/sonic/device/x86_64-accton_as9716_32d-r0/pddf_support ] && \ + [ -f /usr/share/sonic/device/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json ]; then + # syseeprom is at the i2c address 0x57. Change the PDDF JSON file + sed -i 's@"topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c02"},@\ + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"},@g' \ + /usr/share/sonic/device/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json + sync + fi +fi diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as9716-32d.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as9716-32d.postinst index 7c3d8822693e..e0905718a849 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as9716-32d.postinst +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as9716-32d.postinst @@ -2,25 +2,8 @@ # Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) # Enable pddf-platform-monitor -# Steps to check syseeprom i2c address -modprobe i2c-i801 -modprobe i2c-dev -use_57_eeprom=false -(i2cget -y -f 0 0x57 0x0) > /dev/null 2>&1 -if [ $? -eq 0 ]; then - use_57_eeprom=true -fi - -if $use_57_eeprom ; then - echo "The board has system EEPROM at I2C address 0x57" - # syseeprom is at the i2c address 0x57. Change the PDDF JSON file - sed -i 's@"topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c02"},@\ - "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"},@g' \ - /usr/share/sonic/device/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json - sync -fi - depmod -a +#systemctl daemon-reload systemctl enable pddf-platform-init.service systemctl start pddf-platform-init.service systemctl enable as9716-32d-pddf-platform-monitor.service From 74e790c89f5e8ba238267ba23ff8eac1a9083b23 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Wed, 2 Mar 2022 05:09:17 +0800 Subject: [PATCH 029/817] [as7816-64x]Modify to check specific DUT (#7826) AS7816 support AT or non-AT DUT. They use different pmbus i2c bus. So use "pre_pddf_init.sh" to check this case. Signed-off-by: Jostar Yang --- .../as7816-64x/modules/Makefile | 6 +- .../as7816-64x/modules/pddf_custom_fan.c | 4 +- .../as7816-64x/utils/pre_pddf_init.sh | 151 ++++++++++++++++++ .../sonic-platform-accton-as7816-64x.postinst | 147 ----------------- 4 files changed, 158 insertions(+), 150 deletions(-) create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pre_pddf_init.sh diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/Makefile index 906b595883f6..3e3a9ac38a3e 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/Makefile @@ -1,2 +1,6 @@ -obj-m:=x86-64-accton-as7816-64x-fan.o x86-64-accton-as7816-64x-sfp.o x86-64-accton-as7816-64x-leds.o \ +obj-m:=x86-64-accton-as7816-64x-fan.o x86-64-accton-as7816-64x-leds.o \ x86-64-accton-as7816-64x-psu.o accton_i2c_cpld.o ym2651y.o pddf_custom_fan.o + +CFLAGS_pddf_custom_fan.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/pddf_custom_fan.c b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/pddf_custom_fan.c index 2e738d685d75..accd79e1c8a2 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/pddf_custom_fan.c +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/modules/pddf_custom_fan.c @@ -9,8 +9,8 @@ #include #include #include -#include "../../../../pddf/i2c/modules/include/pddf_fan_defs.h" -#include "../../../../pddf/i2c/modules/include/pddf_fan_driver.h" +#include "pddf_fan_defs.h" +#include "pddf_fan_driver.h" extern FAN_SYSFS_ATTR_DATA data_fan1_input; extern FAN_SYSFS_ATTR_DATA data_fan2_input; diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pre_pddf_init.sh b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..b13c90f84781 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pre_pddf_init.sh @@ -0,0 +1,151 @@ +#!/bin/bash + +# Steps to check syseeprom i2c address +modprobe i2c-i801 +modprobe i2c-dev +at_id=false + +(i2cset -y -f 0 0x77 0x1) > /dev/null 2>&1 +(i2cset -y -f 0 0x76 0x4) > /dev/null 2>&1 + + +(i2cget -y -f 0 0x60 0xfd) > /dev/null 2>&1 +if [ $? -eq 0 ]; then + echo "get at_id" + + at_1=$(i2cget -y -f 0 0x60 0xfd) + + if [[ ${at_1} -eq 0x41 ]]; then + echo "get at_1 is 0x41" + at_2=$(i2cget -y -f 0 0x60 0xfe) + + if [[ ${at_2} -eq 0x54 ]]; then + echo "get at_2 is 0x54" + at_id=true + fi + else + cpld_id=$(i2cget -y -f 0 0x60 0x1) #This CPD version that not support to record at_id + if [[ ${cpld_id} -eq 0x5 ]]; then + at_id=true + fi + + fi +fi + +if $at_id ; then + echo "This CPLD is for AT used PSU" + echo "PSU-1 pmbus use parent_bus:0x9, dev_addr:0x58" + echo "PSU-1 eeprom use parent_bus:0x9, dev_addr:0x50" + echo "PSU-2 pmbus use parent_bus:0xa, dev_addr:0x5b" + echo "PSU-2 eeprom use parent_bus:0xa, dev_addr:0x53" + + if [ -f /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf_support ] && \ + [ -f /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json ]; then + #Change the PDDF JSON file + sed -i 's@{ "chn":"0", "dev":"PSU2"},@\ + { "chn":"0", "dev":"PSU1" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "chn":"1", "dev":"PSU1"}@\ + { "chn":"1", "dev":"PSU2" }@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + sed -i 's@"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x5b", "dev_type":"psu_pmbus"},@\ + "topo_info": {"parent_bus":"0x9", "dev_addr":"0x58" , "dev_type": "psu_pmbus" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ + { "attr_name":"psu_model_name", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},@\ + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_v_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_i_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_p_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}@\ + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" }@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + sed -i 's@"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x53", "dev_type":"psu_eeprom"},@\ + "topo_info": {"parent_bus":"0x9", "dev_addr":"0x50" , "dev_type": "psu_eeprom" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + + sed -i 's@"topo_info": { "parent_bus":"0x9", "dev_addr":"0x58", "dev_type":"psu_pmbus"},@\ + "topo_info": {"parent_bus":"0xa", "dev_addr":"0x5b", "dev_type": "psu_pmbus" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + sed -i 's@{ "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ + { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + sed -i 's@{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},@\ + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + sed -i 's@{ "attr_name":"psu_temp1_input", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}@\ + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" }@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + + sed -i 's@"topo_info":{ "parent_bus":"0x9", "dev_addr":"0x50", "dev_type":"psu_eeprom"},@\ + "topo_info": {"parent_bus":"0xa", "dev_addr":"0x53", "dev_type": "psu_eeprom" },@g' \ + /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json + sync + fi +fi + +(i2cset -y -f 0 0x76 0x0) > /dev/null 2>&1 +(i2cset -y -f 0 0x77 0x0) > /dev/null 2>&1 +echo "Pre PDDF init steps completed successully" + +#For others, psu i2c bus use below, +#PSU-1 pmbus use "parent_bus":"0xa", "dev_addr":"0x5b" +#PSU-1 eeprom use "parent_bus":"0xa", "dev_addr":"0x53" +#PSU-2 pmbus use "parent_bus":"0x9", "dev_addr":"0x58" +#PSU-2 eeprom use "parent_bus":"0x9", "dev_addr":"0x50" diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.postinst index 4757a3cce27c..872ef60f26f5 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.postinst +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.postinst @@ -2,153 +2,6 @@ # Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) # Enable pddf-platform-monitor -# Steps to check syseeprom i2c address -modprobe i2c-i801 -modprobe i2c-dev -at_id=false - -(i2cset -y -f 0 0x77 0x1) > /dev/null 2>&1 -(i2cset -y -f 0 0x76 0x4) > /dev/null 2>&1 - - -(i2cget -y -f 0 0x60 0xfd) > /dev/null 2>&1 -if [ $? -eq 0 ]; then - echo "get at_id" - - at_1=$(i2cget -y -f 0 0x60 0xfd) - - if [ ${at_1} = '0x41' ]; then - echo "get at_1 is 0x41" - at_2=$(i2cget -y -f 0 0x60 0xfe) - - if [ ${at_2} = '0x54' ]; then - echo "get at_2 is 0x54" - at_id=true - fi - fi - -else - cpld_id=$(i2cget -y -f 1 0x60 0x1) #This CPD version that not support to record at_id - if [ ${cpld_id} = '0x5' ]; then - at_id=true - fi -fi - -if $at_id ; then - echo "This CPLD is for AT used PSU" - echo "PSU-1 pmbus use parent_bus:0x9, dev_addr:0x58" - echo "PSU-1 eeprom use parent_bus:0x9, dev_addr:0x50" - echo "PSU-2 pmbus use parent_bus:0xa, dev_addr:0x5b" - echo "PSU-2 eeprom use parent_bus:0xa, dev_addr:0x53" - - #Change the PDDF JSON file - sed -i 's@{ "chn":"0", "dev":"PSU2"},@\ - { "chn":"0", "dev":"PSU1" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "chn":"1", "dev":"PSU1"}@\ - { "chn":"1", "dev":"PSU2" }@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - sed -i 's@"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x5b", "dev_type":"psu_pmbus"},@\ - "topo_info": {"parent_bus":"0x9", "dev_addr":"0x58" , "dev_type": "psu_pmbus" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ - { "attr_name":"psu_model_name", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},@\ - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_v_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_i_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_p_out", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}@\ - { "attr_name":"psu_temp1_input", "attr_devaddr":"0x58" , "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" }@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - sed -i 's@"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x53", "dev_type":"psu_eeprom"},@\ - "topo_info": {"parent_bus":"0x9", "dev_addr":"0x50" , "dev_type": "psu_pmbus" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - - sed -i 's@"topo_info": { "parent_bus":"0x9", "dev_addr":"0x58", "dev_type":"psu_pmbus"},@\ - "topo_info": {"parent_bus":"0xa", "dev_addr":"0x5b", "dev_type": "psu_pmbus" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - sed -i 's@{ "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ - { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - sed -i 's@{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10"},@\ - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},@\ - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"},@\ - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - sed -i 's@{ "attr_name":"psu_temp1_input", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}@\ - { "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2" }@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync - - sed -i 's@"topo_info":{ "parent_bus":"0x9", "dev_addr":"0x50", "dev_type":"psu_eeprom"},@\ - "topo_info": {"parent_bus":"0xa", "dev_addr":"0x53", "dev_type": "psu_pmbus" },@g' \ - /usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json - sync -fi - -(i2cset -y -f 0 0x76 0x0) > /dev/null 2>&1 -(i2cset -y -f 0 0x77 0x0) > /dev/null 2>&1 - - -#For other CPLD that use below -#PSU-1 pmbus use "parent_bus":"0x21", "dev_addr":"0x5b" -#PSU-1 eeprom use "parent_bus":"0x21", "dev_addr":"0x53" -#PSU-2 pmbus use "parent_bus":"0x20", "dev_addr":"0x58" -#PSU-2 eeprom use "parent_bus":"0x20", "dev_addr":"0x50" - depmod -a systemctl enable pddf-platform-init.service systemctl start pddf-platform-init.service From 76363cfa16f995a318184c59038dcaef91e948fa Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Wed, 2 Mar 2022 05:33:42 +0800 Subject: [PATCH 030/817] [AS7326-5X] Fix code bug for led drv (#8555) Signed-off-by: Jostar Yang --- .../as7326-56x/modules/accton_as7326_56x_leds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c index 7214ae55d3f9..ed98daf2011a 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c @@ -146,7 +146,7 @@ static int accton_getLedReg(enum led_type type, u8 *reg) int i; for (i = 0; i < ARRAY_SIZE(led_reg_map); i++) { - if(led_reg_map[i].types ==type)) { + if(led_reg_map[i].types ==type) { *reg = led_reg_map[i].reg_addr; return 0; } From 3bb87c03a18162fcffdeff92169a7e57d7c54c03 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Wed, 2 Mar 2022 10:09:41 +0800 Subject: [PATCH 031/817] [yang]: Add yang models for BGP_PEER_RANGE table (#10082) Why I did it end2end test is blocked by Yang model for BGP_PEER_RANGE. How I did it Add new yang models. How to verify it Run UT for sonc-yang-models. Signed-off-by: Gang Lv ganglv@microsoft.com --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 18 ++++++ .../tests/yang_model_tests/tests/bgp.json | 3 + .../yang_model_tests/tests_config/bgp.json | 18 ++++++ .../yang-models/sonic-bgp-peerrange.yang | 64 +++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-peerrange.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 1f9b51b0c566..e0bacac194e0 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -84,6 +84,7 @@ def run(self): './yang-models/sonic-bgp-monitor.yang', './yang-models/sonic-bgp-neighbor.yang', './yang-models/sonic-bgp-peergroup.yang', + './yang-models/sonic-bgp-peerrange.yang', './yang-models/sonic-breakout_cfg.yang', './yang-models/sonic-buffer-pg.yang', './yang-models/sonic-buffer-pool.yang', @@ -150,6 +151,7 @@ def run(self): './cvlyang-models/sonic-bgp-monitor.yang', './cvlyang-models/sonic-bgp-neighbor.yang', './cvlyang-models/sonic-bgp-peergroup.yang', + './cvlyang-models/sonic-bgp-peerrange.yang', './cvlyang-models/sonic-breakout_cfg.yang', './cvlyang-models/sonic-copp.yang', './cvlyang-models/sonic-crm.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e64b241349b7..e46d0acc1ffa 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1147,6 +1147,24 @@ "default|ipv4_unicast|21.0.0.0/8": { } }, + "BGP_PEER_RANGE": { + "BGPSLBPassive": { + "ip_range": [ + "10.255.0.0/25" + ], + "name": "BGPSLBPassive", + "src_address": "10.1.0.32" + }, + "BGPVac": { + "ip_range": [ + "192.168.0.0/21", + "192.169.0.0/21", + "192.170.0.0/21" + ], + "name": "BGPVac", + "src_address": "10.1.0.32" + } + }, "BGP_MONITORS": { "5.6.7.8": { "admin_status": "up", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json index a8b003c3b9ae..8f92f2d9052e 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json @@ -154,6 +154,9 @@ "BGP_MONITORS_NEG_INVALID_ASN": { "desc": "Invalid local AS number.", "eStrKey" : "InvalidValue" + }, + "BGP_PEERRANGE_ALL_VALID": { + "desc": "Configure BGP peer range table." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json index 3fec22eb46fc..62bfdc4269e6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json @@ -1402,6 +1402,24 @@ ] } } + }, + + "BGP_PEERRANGE_ALL_VALID": { + "sonic-bgp-peerrange:sonic-bgp-peerrange": { + "sonic-bgp-peerrange:BGP_PEER_RANGE": { + "BGP_PEER_RANGE_LIST": [ + { + "peer_range_name": "BGPSLBPassive", + "name": "BGPSLBPassive", + "src_address": "10.1.0.32", + "peer_asn": "65200", + "ip_range": [ + "10.255.0.0/25" + ] + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-peerrange.yang b/src/sonic-yang-models/yang-models/sonic-bgp-peerrange.yang new file mode 100644 index 000000000000..88d39d82d68c --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-peerrange.yang @@ -0,0 +1,64 @@ +module sonic-bgp-peerrange { + namespace "http://github.com/Azure/sonic-bgp-peerrange"; + prefix pr; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP Peer Range YANG"; + + revision 2022-02-24 { + description + "Initial revision."; + } + + container sonic-bgp-peerrange { + container BGP_PEER_RANGE { + list BGP_PEER_RANGE_LIST { + key "peer_range_name"; + + leaf peer_range_name { + type string; + description "Peer range name"; + } + + leaf name { + type string; + must "(current() = current()/../peer_range_name)" { + error-message "Invalid name"; + } + } + + leaf src_address { + type inet:ip-address; + description "Source address to use for connection"; + } + + leaf peer_asn { + type uint32 { + range "1..4294967295"; + } + description "Peer AS number"; + } + + leaf-list ip_range { + type stypes:sonic-ip-prefix; + description "A range of addresses"; + } + } + } + } +} From 7891760fd0828ee469bb911a85896aa3197374fe Mon Sep 17 00:00:00 2001 From: Maxime Lorrillere Date: Wed, 2 Mar 2022 00:10:04 -0800 Subject: [PATCH 032/817] [yang-models] Add chassis fields to device_metadata (#10006) This change is adding asic_name, switch_id, switch_type and max_cores to sonic-device_metadata.yang This should fix issue #9575 Co-authored-by: Maxime Lorrillere --- .../tests/files/sample_config_db.json | 6 ++++- .../tests/device_metadata.json | 9 ++++++- .../tests_config/device_metadata.json | 24 ++++++++++++++++++ .../yang-models/sonic-device_metadata.yang | 25 +++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e46d0acc1ffa..3a8889866659 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -293,7 +293,11 @@ "hwsku": "Stone", "buffer_model": "dynamic", "cloudtype": "Public", - "region": "usfoo" + "region": "usfoo", + "asic_name": "Asic0", + "switch_id": "2", + "switch_type": "voq", + "max_cores": "8" } }, "VLAN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json index 8f4be4caffbd..ca26e24cd329 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json @@ -93,6 +93,13 @@ "DEVICE_METADATA_INVALID_STORAGE_DEVICE": { "desc": "Verifying invalid storage device value", "eStrKey": "InvalidValue" - } + }, + "DEVICE_METADATA_INCORRECT_VOQ_CONFIG": { + "desc": "Verifying incorrect switch_type configuration.", + "eStrKey": "Pattern" + }, + "DEVICE_METADATA_CORRECT_VOQ_CONFIG": { + "desc": "Verifying VOQ configuration." + } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json index 7e0e87f57414..bfc9c080b758 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json @@ -250,5 +250,29 @@ } } } + }, + "DEVICE_METADATA_INCORRECT_VOQ_CONFIG": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "asic_name": "Asic0", + "switch_id": "2", + "switch_type": "incorrect_pattern", + "max_cores": "8" + } + } + } + }, + "DEVICE_METADATA_CORRECT_VOQ_CONFIG": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "asic_name": "Asic0", + "switch_id": "2", + "switch_type": "voq", + "max_cores": "8" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index eb87161c6bc1..0dc88f436d8f 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -153,6 +153,31 @@ module sonic-device_metadata { leaf storage_device { type boolean; } + + leaf asic_name { + type string; + description "On a VoQ switch, the ASIC Name is used as a qualifier in global + database keys to create a system wide unique key."; + } + + leaf switch_id { + type uint16; + description "Vendor specific switch ID. Identifies switch chip."; + } + + leaf switch_type { + type string { + pattern "chassis-packet|fabric|npu|voq"; + } + description "Type of switch. Default is NPU, on a VOQ switch voq is used for a regular + switching device while fabric is used for a fabric device. + chassis-packet is used for chassis in packet mode."; + } + + leaf max_cores { + type uint8; + description "Maximum number of cores in a VoQ Switch (chassis)."; + } } /* end of container localhost */ } From 1740beb1f284d01c19387ad2d891f3042d3e8929 Mon Sep 17 00:00:00 2001 From: Aravind Mani <53524901+aravindmani-1@users.noreply.github.com> Date: Thu, 3 Mar 2022 02:36:20 +0530 Subject: [PATCH 033/817] [sonic-cfggen]: Fix sonic-cfggen build failures for armhf (#10132) Why I did it amrhf build fails while building sonic-config-engine whl package https://dev.azure.com/mssonic/be1b070f-be15-4154-aade-b1d3bfb17054/_apis/build/builds/77089/logs/9 The reason for the failure is due to the fact that there is a new line generated at the top of the file in buffer config test cases while building for broadcom based platform and this issue is not seen in Marvell based platforms. How I did it Removed the new line for all the buffer test cases as there is no need to add it and accordingly changed the buffer_config.j2 where the new line is generated. --- files/build_templates/buffers_config.j2 | 1 - .../tests/sample_output/py2/buffers-dell6100.json | 1 - .../tests/sample_output/py2/buffers-mellanox2410-dynamic.json | 1 - .../tests/sample_output/py2/buffers-mellanox2410.json | 1 - .../tests/sample_output/py2/buffers-mellanox2700.json | 1 - .../tests/sample_output/py3/buffers-dell6100.json | 1 - .../tests/sample_output/py3/buffers-mellanox2410-dynamic.json | 1 - .../tests/sample_output/py3/buffers-mellanox2410.json | 1 - .../tests/sample_output/py3/buffers-mellanox2700.json | 1 - 9 files changed, 9 deletions(-) diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index d0ff3ade1072..cb64cd3d4335 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -131,7 +131,6 @@ def {%- if port_names_list_inactive.append(port) %}{%- endif %} {%- endfor %} {%- set port_names_inactive = port_names_list_inactive | join(',') %} - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffers-dell6100.json b/src/sonic-config-engine/tests/sample_output/py2/buffers-dell6100.json index 90ad5f795caa..be6292366e7b 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffers-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffers-dell6100.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410-dynamic.json b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410-dynamic.json index a09e15eecc1c..1cb60747fc3e 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410-dynamic.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410-dynamic.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410.json b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410.json index 7ebd39c36c83..39cebfcdf8a7 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2410.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2700.json b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2700.json index 221a9b89b83a..ea9fe0c9ea89 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2700.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffers-mellanox2700.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-dell6100.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-dell6100.json index 7c06ed93f382..08f238bcc40d 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-dell6100.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410-dynamic.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410-dynamic.json index 215fa85cf2dd..109389c95047 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410-dynamic.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410-dynamic.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410.json index c212061af4bd..eaf119ab0acd 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2410.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2700.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2700.json index 2aaef20598da..49da9b064afa 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2700.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox2700.json @@ -1,4 +1,3 @@ - { "CABLE_LENGTH": { "AZURE": { From 4d2a55d373265ea4b5053fe6d9dd8b4acea62346 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 2 Mar 2022 16:23:56 -0800 Subject: [PATCH 034/817] [swss]: Wait for vlan intf to start ndppd (#10119) - Use the `wait_for_link.sh` script to delay ndppd start until after the VLAN interface is ready - Avoids issue where ndppd tries to change interface attributes before the interface is ready --- dockers/docker-orchagent/docker-init.j2 | 3 ++ dockers/docker-orchagent/ndppd.conf | 13 ++++++++- dockers/docker-orchagent/wait_for_link.sh.j2 | 30 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 dockers/docker-orchagent/wait_for_link.sh.j2 diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index ff543c234904..5b3850613dac 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -18,9 +18,12 @@ CFGGEN_PARAMS=" \ -t /usr/share/sonic/templates/ndppd.conf.j2,/etc/ndppd.conf \ -t /usr/share/sonic/templates/critical_processes.j2,/etc/supervisor/critical_processes \ -t /usr/share/sonic/templates/supervisord.conf.j2,/etc/supervisor/conf.d/supervisord.conf + -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ " VLAN=$(sonic-cfggen $CFGGEN_PARAMS) +chmod +x /usr/bin/wait_for_link.sh + # Executed platform specific initialization tasks. if [ -x /usr/share/sonic/platform/platform-init ]; then /usr/share/sonic/platform/platform-init diff --git a/dockers/docker-orchagent/ndppd.conf b/dockers/docker-orchagent/ndppd.conf index b9dbc293ed2a..86297de94a45 100644 --- a/dockers/docker-orchagent/ndppd.conf +++ b/dockers/docker-orchagent/ndppd.conf @@ -6,4 +6,15 @@ autorestart=unexpected stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true -dependent_startup_wait_for=vlanmgrd:running +dependent_startup_wait_for=wait_for_link:exited + +[program:wait_for_link] +command=/usr/bin/wait_for_link.sh +priority=7 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited \ No newline at end of file diff --git a/dockers/docker-orchagent/wait_for_link.sh.j2 b/dockers/docker-orchagent/wait_for_link.sh.j2 new file mode 100644 index 000000000000..980b472b3e0a --- /dev/null +++ b/dockers/docker-orchagent/wait_for_link.sh.j2 @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +VLAN_TABLE_PREFIX="VLAN_TABLE" + +function wait_until_iface_ready +{ + TABLE_PREFIX=$1 + IFACE=$2 + + echo "Waiting until interface $IFACE is ready..." + + # Wait for the interface to come up + # (i.e., interface is present in STATE_DB and state is "ok") + while true; do + RESULT=$(sonic-db-cli STATE_DB HGET "${TABLE_PREFIX}|${IFACE}" "state" 2> /dev/null) + if [ x"$RESULT" == x"ok" ]; then + break + fi + + sleep 1 + done + + echo "Interface ${IFACE} is ready!" +} + + +# Wait for all interfaces to be up and ready +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +wait_until_iface_ready ${VLAN_TABLE_PREFIX} {{ name }} +{% endfor %} From 14de0a15489daca71ddb75a81d7c8d6b2d9efa93 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Wed, 2 Mar 2022 19:08:06 -0800 Subject: [PATCH 035/817] [containerd]Fixing container commands when mode is local and state is disabled (#9986) Why I did it During warm-reboot and fast-reboot the below error logs appear Feb 3 22:05:15.187408 r-lionfish-13 ERR container: docker cmd: kill for nat failed with 404 Client Error for http+docker://localhost/v1.41/containers/nat/json: Not Found ("No such container: nat") The container command when called for local mode doesn't check if it is enabled before calling docker kill which throws the above errors. https://github.com/Azure/sonic-utilities/blob/b6ca76b4821453171d9607383b808385968eeeeb/scripts/fast-reboot#L699 How I did it Checking feature state if local mode and returning error exit code along with valid debug message. How to verify it Manually tested with warm-reboot and fast-reboot Added UT to verify it. --- src/sonic-ctrmgrd/ctrmgr/container | 54 +++++++++++++++-------- src/sonic-ctrmgrd/tests/container_test.py | 45 ++++++++++++++++++- 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/sonic-ctrmgrd/ctrmgr/container b/src/sonic-ctrmgrd/ctrmgr/container index 666c967540a7..db6ded635ee9 100755 --- a/src/sonic-ctrmgrd/ctrmgr/container +++ b/src/sonic-ctrmgrd/ctrmgr/container @@ -26,6 +26,7 @@ CONTAINER_ID = "container_id" REMOTE_STATE = "remote_state" VERSION = "container_version" SYSTEM_STATE = "system_state" +STATE = "state" KUBE_LABEL_TABLE = "KUBE_LABELS" KUBE_LABEL_SET_KEY = "SET" @@ -38,6 +39,9 @@ SONIC_CTR_CONFIG_PEND_SECS = "revert_to_local_on_wait_seconds" DEFAULT_PEND_SECS = ( 5 * 60 ) WAIT_POLL_SECS = 2 +SUCCESS = 0 +FAILURE = -1 + remote_ctr_enabled = False def debug_msg(m): @@ -87,10 +91,10 @@ def read_data(is_config, feature, fields): def read_config(feature): """ Read requried feature config """ - set_owner, no_fallback = read_data(True, feature, - [(SET_OWNER, "local"), (NO_FALLBACK, False)]) + set_owner, no_fallback, state = read_data(True, feature, + [(SET_OWNER, "local"), (NO_FALLBACK, False), (STATE, "disabled")]) - return (set_owner, not no_fallback) + return (set_owner, not no_fallback, state) def read_state(feature): @@ -107,12 +111,12 @@ def docker_action(action, feature, **kwargs): container = client.containers.get(feature) getattr(container, action)(**kwargs) syslog.syslog(syslog.LOG_INFO, "docker cmd: {} for {}".format(action, feature)) - return 0 + return SUCCESS except (docker.errors.NotFound, docker.errors.APIError) as err: syslog.syslog(syslog.LOG_ERR, "docker cmd: {} for {} failed with {}". format(action, feature, str(err))) - return -1 + return FAILURE def set_label(feature, create): @@ -186,7 +190,7 @@ def container_start(feature, **kwargs): init() - set_owner, fallback = read_config(feature) + set_owner, fallback, _ = read_config(feature) _, remote_state, _ = read_state(feature) debug_msg("{}: set_owner:{} fallback:{} remote_state:{}".format( @@ -244,8 +248,8 @@ def container_stop(feature, **kwargs): debug_msg("BEGIN") init() - - set_owner, _ = read_config(feature) + ret = SUCCESS + set_owner, _ , _ = read_config(feature) current_owner, remote_state, _ = read_state(feature) docker_id = container_id(feature) remove_label = (remote_state != "pending") or (set_owner == "local") @@ -257,7 +261,7 @@ def container_stop(feature, **kwargs): set_label(feature, False) if docker_id: - docker_action("stop", docker_id, **kwargs) + ret = docker_action("stop", docker_id, **kwargs) else: syslog.syslog( syslog.LOG_ERR if current_owner != "none" else syslog.LOG_INFO, @@ -286,6 +290,7 @@ def container_stop(feature, **kwargs): update_data(feature, data) debug_msg("END") + return ret def container_kill(feature, **kwargs): @@ -301,19 +306,25 @@ def container_kill(feature, **kwargs): init() - set_owner, _ = read_config(feature) + ret = SUCCESS + set_owner, _ , state = read_config(feature) current_owner, remote_state, _ = read_state(feature) docker_id = container_id(feature) remove_label = (set_owner != "local") or (current_owner != "local") - debug_msg("{}: set_owner:{} current_owner:{} remote_state:{} docker_id:{}".format( - feature, set_owner, current_owner, remote_state, docker_id)) + debug_msg("{}: set_owner:{} current_owner:{} remote_state:{} docker_id:{} state:{}".format( + feature, set_owner, current_owner, remote_state, docker_id, state)) if remove_label: set_label(feature, False) + if set_owner == "local": + if state not in ["enabled", "always_enabled"]: + debug_msg("{} is not enabled".format(feature)) + return FAILURE + if docker_id: - docker_action("kill", docker_id, **kwargs) + ret = docker_action("kill", docker_id, **kwargs) else: syslog.syslog( @@ -322,6 +333,7 @@ def container_kill(feature, **kwargs): debug_msg("END") + return ret def container_wait(feature, **kwargs): @@ -341,10 +353,11 @@ def container_wait(feature, **kwargs): init() - set_owner, fallback = read_config(feature) + set_owner, fallback, _ = read_config(feature) current_owner, remote_state, _ = read_state(feature) docker_id = container_id(feature) pend_wait_secs = 0 + ret = SUCCESS if not docker_id and fallback: pend_wait_secs = get_config_data( @@ -377,8 +390,9 @@ def container_wait(feature, **kwargs): format(feature)) else: debug_msg("END -- transitioning to docker wait") - docker_action("wait", docker_id, **kwargs) + ret = docker_action("wait", docker_id, **kwargs) + return ret def main(): parser=argparse.ArgumentParser(description="container commands for start/stop/wait/kill/id") @@ -389,24 +403,26 @@ def main(): args = parser.parse_args() kwargs = {} + ret = 0 if args.action == "start": - container_start(args.name, **kwargs) + ret = container_start(args.name, **kwargs) elif args.action == "stop": if args.timeout is not None: kwargs['timeout'] = args.timeout - container_stop(args.name, **kwargs) + ret = container_stop(args.name, **kwargs) elif args.action == "kill": - container_kill(args.name, **kwargs) + ret = container_kill(args.name, **kwargs) elif args.action == "wait": - container_wait(args.name, **kwargs) + ret = container_wait(args.name, **kwargs) elif args.action == "id": id = container_id(args.name, **kwargs) print(id) + return ret if __name__ == "__main__": main() diff --git a/src/sonic-ctrmgrd/tests/container_test.py b/src/sonic-ctrmgrd/tests/container_test.py index cc5f89e8d97f..4738597c72c4 100755 --- a/src/sonic-ctrmgrd/tests/container_test.py +++ b/src/sonic-ctrmgrd/tests/container_test.py @@ -269,7 +269,8 @@ common_test.CONFIG_DB_NO: { common_test.FEATURE_TABLE: { "snmp": { - "set_owner": "local" + "set_owner": "local", + "state": "enabled" } } }, @@ -348,6 +349,30 @@ } } +# container_kill test cases +# test case 0 -- container kill local disabled container +# -- no change in state-db +# -- no label update +# +invalid_kill_test_data = { + 0: { + common_test.DESCR: "container kill for local disabled container", + common_test.PRE: { + common_test.CONFIG_DB_NO: { + common_test.FEATURE_TABLE: { + "sflow": { + "set_owner": "local" + } + } + } + }, + common_test.POST: { + }, + common_test.ACTIONS: { + } + } +} + # container_wait test cases # test case 0 -- container wait local @@ -498,6 +523,24 @@ def test_kill(self, mock_docker, mock_table, mock_conn): ret = common_test.check_mock_containers() assert ret == 0 + @patch("container.swsscommon.DBConnector") + @patch("container.swsscommon.Table") + @patch("container.docker.from_env") + def test_invalid_kill(self, mock_docker, mock_table, mock_conn): + self.init() + common_test.set_mock(mock_table, mock_conn, mock_docker) + + for (i, ct_data) in invalid_kill_test_data.items(): + common_test.do_start_test("container_test:container_kill", i, ct_data) + + ret = container.container_kill("sflow") + assert ret != 0 + + ret = common_test.check_tables_returned() + assert ret == 0 + + ret = common_test.check_mock_containers() + assert ret == 0 @patch("container.swsscommon.DBConnector") @patch("container.swsscommon.Table") From e104247950a1c38fa11d555c514a5c74e748b82c Mon Sep 17 00:00:00 2001 From: Vadym Hlushko <62022266+vadymhlushko-mlnx@users.noreply.github.com> Date: Thu, 3 Mar 2022 15:58:17 +0200 Subject: [PATCH 036/817] [nvgre] Added YANG model and tests (#10095) - Why I did it NVGRE Tunnel feature extends the Config DB with new tables. These tables require a new YANG model. - How I did it Added a new YANG model sonic-nvgre-tunnel.yang - How to verify it Added YANG test cases. Signed-off-by: Vadym Hlushko --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 21 ++- .../tests/yang_model_tests/tests/nvgre.json | 25 ++++ .../yang_model_tests/tests_config/nvgre.json | 125 ++++++++++++++++++ .../yang-models/sonic-nvgre-tunnel.yang | 109 +++++++++++++++ 5 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/nvgre.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/nvgre.json create mode 100644 src/sonic-yang-models/yang-models/sonic-nvgre-tunnel.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index e0bacac194e0..d8b9a0d0c4a2 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -109,6 +109,7 @@ def run(self): './yang-models/sonic-mirror-session.yang', './yang-models/sonic-ntp.yang', './yang-models/sonic-nat.yang', + './yang-models/sonic-nvgre-tunnel.yang', './yang-models/sonic-pbh.yang', './yang-models/sonic-port.yang', './yang-models/sonic-policer.yang', @@ -167,6 +168,7 @@ def run(self): './cvlyang-models/sonic-mgmt_vrf.yang', './cvlyang-models/sonic-ntp.yang', './cvlyang-models/sonic-nat.yang', + './cvlyang-models/sonic-nvgre-tunnel.yang', './cvlyang-models/sonic-pbh.yang', './cvlyang-models/sonic-policer.yang', './cvlyang-models/sonic-port.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 3a8889866659..89a915e72b5e 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1562,7 +1562,7 @@ } }, - + "MCLAG_DOMAIN": { "123": { "source_ip": "12.1.1.1", @@ -1606,6 +1606,8 @@ } }, + + "POLICER": { "everflow_static_policer": { "meter_type": "bytes", @@ -1614,8 +1616,23 @@ "cbs": "12500000", "color": "aware", "red_packet_action": "drop" - } + } + }, + + + "NVGRE_TUNNEL": { + "tunnel_1": { + "src_ip": "10.0.0.1" + } + }, + "NVGRE_TUNNEL_MAP": { + "tunnel_1|Vlan111": { + "vlan_id": "111", + "vsid": "5000" + } } + + }, "SAMPLE_CONFIG_DB_UNKNOWN": { "UNKNOWN_TABLE": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/nvgre.json b/src/sonic-yang-models/tests/yang_model_tests/tests/nvgre.json new file mode 100644 index 000000000000..e776b0d9064f --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/nvgre.json @@ -0,0 +1,25 @@ +{ + "NVGRE_TUNNEL_AND_TUNNEL_MAP": { + "desc": "NVGRE_TUNNEL with NVGRE_TUNNEL_MAP" + }, + + "NVGRE_TUNNEL_INVALID_SRC_IP": { + "desc": "INVALID src_ip value for NVGRE_TUNNEL", + "eStrKey": "InvalidValue" + }, + + "NVGRE_TUNNEL_MAP_UNEXISTING_NVGRE_TUNNEL_NAME": { + "desc": "Unexisting NVGRE_TUNNEL", + "eStrKey": "LeafRef" + }, + + "NVGRE_TUNNEL_MAP_INVALID_VLAN_ID": { + "desc": "Invalid VLAN ID", + "eStrKey": "Pattern" + }, + + "NVGRE_TUNNEL_MAP_INVALID_VSID": { + "desc": "INVALID VSID value for NVGRE_TUNNEL_MAP", + "eStrKey": "Pattern" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/nvgre.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/nvgre.json new file mode 100644 index 000000000000..8c2588fa7d35 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/nvgre.json @@ -0,0 +1,125 @@ +{ + "NVGRE_TUNNEL_AND_TUNNEL_MAP": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan200" + } + ] + } + }, + "sonic-nvgre-tunnel:sonic-nvgre-tunnel": { + "sonic-nvgre-tunnel:NVGRE_TUNNEL": { + "NVGRE_TUNNEL_LIST": [ + { + "tunnel_name": "tunnel_1", + "src_ip": "10.0.0.1" + } + ] + }, + "sonic-nvgre-tunnel:NVGRE_TUNNEL_MAP": { + "NVGRE_TUNNEL_MAP_LIST": [ + { + "tunnel_name": "tunnel_1", + "tunnel_map_name": "Vlan200", + "vlan_id": 200, + "vsid": 5000 + } + ] + } + } + }, + + "NVGRE_TUNNEL_INVALID_SRC_IP": { + "sonic-nvgre-tunnel:sonic-nvgre-tunnel": { + "sonic-nvgre-tunnel:NVGRE_TUNNEL": { + "NVGRE_TUNNEL_LIST": [ + { + "tunnel_name": "tunnel_1", + "src_ip": "INVALID" + } + ] + } + } + }, + + "NVGRE_TUNNEL_MAP_UNEXISTING_NVGRE_TUNNEL_NAME": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan200" + } + ] + } + }, + "sonic-nvgre-tunnel:sonic-nvgre-tunnel": { + "sonic-nvgre-tunnel:NVGRE_TUNNEL_MAP": { + "NVGRE_TUNNEL_MAP_LIST": [ + { + "tunnel_name": "INVALID", + "tunnel_map_name": "Vlan200", + "vlan_id": 200, + "vsid": 5000 + } + ] + } + } + }, + + "NVGRE_TUNNEL_MAP_INVALID_VLAN_ID": { + "sonic-nvgre-tunnel:sonic-nvgre-tunnel": { + "sonic-nvgre-tunnel:NVGRE_TUNNEL": { + "NVGRE_TUNNEL_LIST": [ + { + "tunnel_name": "tunnel_1", + "src_ip": "10.0.0.1" + } + ] + }, + "sonic-nvgre-tunnel:NVGRE_TUNNEL_MAP": { + "NVGRE_TUNNEL_MAP_LIST": [ + { + "tunnel_name": "tunnel_1", + "tunnel_map_name": "Vlan200", + "vlan_id": 5000, + "vsid": 5000 + } + ] + } + } + }, + + "NVGRE_TUNNEL_MAP_INVALID_VSID": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan200" + } + ] + } + }, + "sonic-nvgre-tunnel:sonic-nvgre-tunnel": { + "sonic-nvgre-tunnel:NVGRE_TUNNEL": { + "NVGRE_TUNNEL_LIST": [ + { + "tunnel_name": "tunnel_1", + "src_ip": "10.0.0.1" + } + ] + }, + "sonic-nvgre-tunnel:NVGRE_TUNNEL_MAP": { + "NVGRE_TUNNEL_MAP_LIST": [ + { + "tunnel_name": "tunnel_1", + "tunnel_map_name": "Vlan200", + "vlan_id": 200, + "vsid": 999999999 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-nvgre-tunnel.yang b/src/sonic-yang-models/yang-models/sonic-nvgre-tunnel.yang new file mode 100644 index 000000000000..b10c35d94043 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-nvgre-tunnel.yang @@ -0,0 +1,109 @@ +module sonic-nvgre-tunnel { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-nvgre-tunnel"; + prefix nvgre; + + import ietf-inet-types { + prefix inet; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "NVGRE Tunnel YANG Module for SONiC OS"; + + revision 2021-10-31 { + description + "First Revision"; + } + + container sonic-nvgre-tunnel { + + container NVGRE_TUNNEL { + + description "NVGRE_TUNNEL part of config_db.json"; + + list NVGRE_TUNNEL_LIST { + + key "tunnel_name"; + + leaf tunnel_name { + description "NVGRE Tunnel name"; + + type string { + length 1..255; + } + } + + leaf src_ip { + description "Source IP address"; + + mandatory true; + type inet:ip-address; + } + + } + /* end of NVGRE_TUNNEL_LIST */ + + } + /* end of container NVGRE_TUNNEL */ + + container NVGRE_TUNNEL_MAP { + + description "NVGRE_TUNNEL_MAP part of config_db.json"; + + list NVGRE_TUNNEL_MAP_LIST { + + key "tunnel_name tunnel_map_name"; + + leaf tunnel_name { + description "NVGRE Tunnel name"; + + type leafref { + path /nvgre:sonic-nvgre-tunnel/nvgre:NVGRE_TUNNEL/nvgre:NVGRE_TUNNEL_LIST/nvgre:tunnel_name; + } + } + + leaf tunnel_map_name { + description "NVGRE Tunnel map name"; + + type string { + length 1..255; + } + } + + leaf vlan_id { + description "VLAN identifier"; + + mandatory true; + type uint16 { + range 1..4094; + } + } + + leaf vsid { + description "Virtual Subnet Identifier"; + + mandatory true; + type uint32 { + range 0..16777214; + } + } + + } + /* end of NVGRE_TUNNEL_MAP_LIST */ + + } + /* end of container NVGRE_TUNNEL_MAP */ + + } + /* end of container sonic-nvgre-tunnel */ + +} +/* end of module sonic-nvgre-tunnel */ From 582ea7cfc613844fd36f739452e932b49b3bf6c6 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 4 Mar 2022 01:22:15 +0800 Subject: [PATCH 037/817] [Unit Test]: Fix sonic config engine test not stable issue(#10147) Co-authored-by: azureuser --- src/sonic-config-engine/tests/common_utils.py | 13 +++++++ src/sonic-config-engine/tests/test_j2files.py | 38 +++++++++---------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/sonic-config-engine/tests/common_utils.py b/src/sonic-config-engine/tests/common_utils.py index 3d8a3029dad9..47fe9f37f2a4 100644 --- a/src/sonic-config-engine/tests/common_utils.py +++ b/src/sonic-config-engine/tests/common_utils.py @@ -1,4 +1,6 @@ import json +import filecmp +import os import re import sys @@ -31,3 +33,14 @@ def liststr_to_dict(liststr): return list_obj +def cmp(file1, file2): + """ compare files """ + try: + with open(file1, 'r') as f: + obj1 = json.load(f) + with open(file2, 'r') as f: + obj2 = json.load(f) + return obj1 == obj2 + except: + return filecmp.cmp(file1, file2) + diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 5e782ce2fa1d..b0bfbe9f3727 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -46,37 +46,37 @@ def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') argument = '-m ' + self.t0_minigraph + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces'), self.output_file)) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces'), self.output_file)) argument = '-m ' + self.t0_mvrf_minigraph + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) def test_ports_json(self): ports_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ports.json.j2') argument = '-m ' + self.simple_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ports_template + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'ports.json'), self.output_file)) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'ports.json'), self.output_file)) def test_dhcp_relay(self): # Test generation of wait_for_intf.sh template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'wait_for_intf.sh.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'wait_for_intf.sh'), self.output_file)) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'wait_for_intf.sh'), self.output_file)) # Test generation of docker-dhcp-relay.supervisord.conf template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'docker-dhcp-relay.supervisord.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'docker-dhcp-relay.supervisord.conf'), self.output_file), self.output_file) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'docker-dhcp-relay.supervisord.conf'), self.output_file), self.output_file) def test_radv(self): # Test generation of radvd.conf with multiple ipv6 prefixes template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-router-advertiser', 'radvd.conf.j2') argument = '-m ' + self.radv_test_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'radvd.conf'), self.output_file)) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'radvd.conf'), self.output_file)) def test_lldp(self): lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp', 'lldpd.conf.j2') @@ -89,19 +89,19 @@ def test_lldp(self): mgmt_iface_ipv4_and_ipv6_json = os.path.join(self.test_dir, "data", "lldp", "mgmt_iface_ipv4_and_ipv6.json") argument = '-j {} -t {} > {}'.format(mgmt_iface_ipv4_and_ipv6_json, lldpd_conf_template, self.output_file) self.run_script(argument) - self.assertTrue(filecmp.cmp(expected_mgmt_ipv4_and_ipv6, self.output_file)) + self.assertTrue(utils.cmp(expected_mgmt_ipv4_and_ipv6, self.output_file)) # Test generation of lldpd.conf if management interface IPv4 only exist mgmt_iface_ipv4_json = os.path.join(self.test_dir, "data", "lldp", "mgmt_iface_ipv4.json") argument = '-j {} -t {} > {}'.format(mgmt_iface_ipv4_json, lldpd_conf_template, self.output_file) self.run_script(argument) - self.assertTrue(filecmp.cmp(expected_mgmt_ipv4, self.output_file)) + self.assertTrue(utils.cmp(expected_mgmt_ipv4, self.output_file)) # Test generation of lldpd.conf if Management interface IPv6 only exist mgmt_iface_ipv6_json = os.path.join(self.test_dir, "data", "lldp", "mgmt_iface_ipv6.json") argument = '-j {} -t {} > {}'.format(mgmt_iface_ipv6_json, lldpd_conf_template, self.output_file) self.run_script(argument) - self.assertTrue(filecmp.cmp(expected_mgmt_ipv6, self.output_file)) + self.assertTrue(utils.cmp(expected_mgmt_ipv6, self.output_file)) def test_ipinip(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') @@ -109,7 +109,7 @@ def test_ipinip(self): self.run_script(argument) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'ipinip.json') - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_l2switch_template(self): argument = '-k Mellanox-SN2700 --preset l2 -p ' + self.t0_port_config @@ -210,7 +210,7 @@ def test_qos_arista7050_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_qos_dell9332_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') @@ -229,7 +229,7 @@ def test_qos_dell9332_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell9332.json') - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_qos_dell6100_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100') @@ -248,7 +248,7 @@ def test_qos_dell6100_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell6100.json') - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer_template, expected): dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) @@ -268,7 +268,7 @@ def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer os.remove(buffers_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, expected) - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_buffers_dell6100_render_template(self): self._test_buffers_render_template('dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100', 'sample-dell-6100-t0-minigraph.xml', 'buffers.json.j2', 'buffers-dell6100.json') @@ -288,7 +288,7 @@ def test_ipinip_multi_asic(self): print(argument) self.run_script(argument) sample_output_file = os.path.join(self.test_dir, 'multi_npu_data', utils.PYvX_DIR, 'ipinip.json') - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_swss_switch_render_template(self): switch_template = os.path.join( @@ -317,7 +317,7 @@ def test_swss_switch_render_template(self): self.test_dir, 'sample_output', v["output"] ) self.run_script(argument) - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) def test_swss_switch_render_template_multi_asic(self): # verify the ECMP hash seed changes per namespace @@ -349,7 +349,7 @@ def test_swss_switch_render_template_multi_asic(self): self.test_dir, 'sample_output', v["output"] ) self.run_script(argument) - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file) os.environ["NAMESPACE_ID"] = "" def test_ndppd_conf(self): @@ -359,7 +359,7 @@ def test_ndppd_conf(self): argument = '-j {} -t {} > {}'.format(vlan_interfaces_json, conf_template, self.output_file) self.run_script(argument) - assert filecmp.cmp(expected, self.output_file), self.run_diff(expected, self.output_file) + assert utils.cmp(expected, self.output_file), self.run_diff(expected, self.output_file) def test_ntp_conf(self): conf_template = os.path.join(self.test_dir, "ntp.conf.j2") @@ -368,7 +368,7 @@ def test_ntp_conf(self): argument = '-j {} -t {} > {}'.format(ntp_interfaces_json, conf_template, self.output_file) self.run_script(argument) - assert filecmp.cmp(expected, self.output_file), self.run_diff(expected, self.output_file) + assert utils.cmp(expected, self.output_file), self.run_diff(expected, self.output_file) def tearDown(self): os.environ["CFGGEN_UNIT_TESTING"] = "" From 34a4817ad0827a15d9f44d5ab2c5003ea10eb4c7 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Fri, 4 Mar 2022 07:50:41 +0800 Subject: [PATCH 038/817] [AS7712/PDDF] Add idle_state=-2 for pca954x deselect (#10079) Signed-off-by: Jostar Yang jostar_yang@accton.com.tw Why I did it Linux kernel 5.10, 'force_deselct_on_exit' parameter used for driver i2c_mux_pca954x is no longer valid. Instead an attribute 'idle_state' is added per MUX device. So set idle_state=-2 will let do deselect to pca954 when device channel exit . To avoid cause another device channel access i2c fail. How I did it Remove force_deselect_on_exit because not use this parameter. Add "idle_state":"-2" to each "virt_bus" How to verify it Test all sysfs are fine. --- .../pddf/pddf-device.json | 8 ++++---- .../x86_64-accton_as7712_32x-r0/installer.conf | 1 + .../pddf/pddf-device.json | 14 +++++++------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json index b48506f9054d..34013b2a84ad 100644 --- a/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json @@ -33,7 +33,7 @@ "std_kos": [ "i2c_dev", - "i2c_mux_pca954x force_deselect_on_exit=1", + "i2c_mux_pca954x", "optoe" ], "description":"kernel modules are loaded while moving to pdf mode, but they should not be unloaded while moving to nonpddf mode.", @@ -105,7 +105,7 @@ "i2c": { "topo_info": { "parent_bus":"0x1", "dev_addr":"0x77", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x2"}, + "dev_attr": { "virt_bus":"0x2", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"MUX2" }, @@ -122,7 +122,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0xa"}, + "dev_attr": { "virt_bus":"0xa", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PSU1" }, @@ -161,7 +161,7 @@ "i2c": { "topo_info": { "parent_bus":"0x3", "dev_addr":"0x70", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x12"}, + "dev_attr": { "virt_bus":"0x12", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT49" }, diff --git a/device/accton/x86_64-accton_as7712_32x-r0/installer.conf b/device/accton/x86_64-accton_as7712_32x-r0/installer.conf index 14404194ef53..d0ed16575e73 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/installer.conf +++ b/device/accton/x86_64-accton_as7712_32x-r0/installer.conf @@ -1,3 +1,4 @@ CONSOLE_PORT=0x2f8 CONSOLE_DEV=1 CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="modprobe.blacklist=i2c-ismt,i2c_ismt,i2c-i801,i2c_i801" diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json index d84e6fde2b10..439a52ca9a59 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json @@ -34,7 +34,7 @@ "i2c-ismt", "i2c-i801", "i2c_dev", - "i2c_mux_pca954x force_deselect_on_exit=1", + "i2c_mux_pca954x", "optoe" ], "pddf_kos": @@ -116,7 +116,7 @@ "i2c": { "topo_info": { "parent_bus":"0x1", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x2"}, + "dev_attr": { "virt_bus":"0x2", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"FAN-CTRL" }, @@ -137,7 +137,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0xa"}, + "dev_attr": { "virt_bus":"0xa", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PSU2" }, @@ -402,7 +402,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x12"}, + "dev_attr": { "virt_bus":"0x12", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT9" }, @@ -423,7 +423,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x1a"}, + "dev_attr": { "virt_bus":"0x1a", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT6" }, @@ -444,7 +444,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x74", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x22"}, + "dev_attr": { "virt_bus":"0x22", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT17" }, @@ -465,7 +465,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x75", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x2a"}, + "dev_attr": { "virt_bus":"0x2a", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT29" }, From 482ff1ca5085bdad4adacacca241254792468923 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Fri, 4 Mar 2022 05:28:34 +0530 Subject: [PATCH 039/817] [pddf]: Support for idle_state device parameter is required for muxes using i2c_mux_pca954x driver (#10060) As per linux kernel 5.10, 'force_deselct_on_exit' parameter used for driver i2c_mux_pca954x is no longer valid. Instead an attribute 'idle_state' is added per MUX device. This needs to be set to -1 : For leaving the mux state as is -2 : For deselecting the channel upon exit : To always set a channel upon exit This needs to be accommodated inside the PDDF JSON parser as well. --- platform/pddf/i2c/utils/pddfparse.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/pddf/i2c/utils/pddfparse.py b/platform/pddf/i2c/utils/pddfparse.py index 9d4b82d7594f..b8c7f39138a5 100755 --- a/platform/pddf/i2c/utils/pddfparse.py +++ b/platform/pddf/i2c/utils/pddfparse.py @@ -359,9 +359,18 @@ def create_mux_device(self, dev, ops): ret = self.runcmd(cmd) if ret != 0: return create_ret.append(ret) - self.create_device(dev['i2c']['dev_attr'], "pddf/devices/mux", ops) + cmd = "echo %s > /sys/kernel/pddf/devices/mux/virt_bus" % (dev['i2c']['dev_attr']['virt_bus']) + ret = self.runcmd(cmd) + if ret != 0: + return create_ret.append(ret) cmd = "echo 'add' > /sys/kernel/pddf/devices/mux/dev_ops" ret = self.runcmd(cmd) + # Check if the dev_attr array contain idle_state + if 'idle_state' in dev['i2c']['dev_attr']: + cmd = "echo {} > /sys/bus/i2c/devices/{}-00{:02x}/idle_state".format(dev['i2c']['dev_attr']['idle_state'], + int(dev['i2c']['topo_info']['parent_bus'],0), int(dev['i2c']['topo_info']['dev_addr'],0)) + ret = self.runcmd(cmd) + return create_ret.append(ret) def create_xcvr_i2c_device(self, dev, ops): From a3c10515f4977d659eb12f421be6fc0a7a56cd4f Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Fri, 4 Mar 2022 07:59:12 +0800 Subject: [PATCH 040/817] [as7326-56x] Modify to check eeprom by pre_pddf_init.sh (#7841) Modify to check eeprom by pre_pddf_init.sh Signed-off-by: Jostar Yang --- .../as7326-56x/utils/pre_pddf_init.sh | 23 +++++++++++++++++++ .../sonic-platform-accton-as7326-56x.postinst | 18 --------------- 2 files changed, 23 insertions(+), 18 deletions(-) create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pre_pddf_init.sh diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pre_pddf_init.sh b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pre_pddf_init.sh new file mode 100755 index 000000000000..8b8c45ef54e7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pre_pddf_init.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Steps to check syseeprom i2c address +modprobe i2c-i801 +modprobe i2c-dev +use_57_eeprom=true +i2cget -y -f 0 0x56 0x0 +if [ $? -eq 0 ]; then + use_57_eeprom=false + echo "The board has system EEPROM at I2C address 0x56." +fi + +if $use_57_eeprom ; then + echo "The board has system EEPROM at I2C address 0x57." + # syseeprom is at the i2c address 0x57. Change the PDDF JSON file + if [ -f /usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf_support ] && \ + [ -f /usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json ]; then + sed -i 's@"topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c04"},@\ + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"},@g' \ + /usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json + sync + fi +fi diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.postinst index 94fd9cf67df8..035f07e57165 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.postinst +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.postinst @@ -2,24 +2,6 @@ # Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) # Enable pddf-platform-monitor -# Steps to check syseeprom i2c address -modprobe i2c-i801 -modprobe i2c-dev -use_57_eeprom=true -(i2cget -y -f 0 0x56 0x0) > /dev/null 2>&1 -if [ $? -eq 0 ]; then - use_57_eeprom=false -fi - -if $use_57_eeprom ; then - echo "The board has system EEPROM at I2C address 0x57" - # syseeprom is at the i2c address 0x57. Change the PDDF JSON file - sed -i 's@"topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c04"},@\ - "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"},@g' \ - /usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json - sync -fi - depmod -a systemctl enable as7326-platform-handle_mac.service systemctl start as7326-platform-handle_mac.service From b400a648235e6043b8bcfe909a65eafd7eac57bf Mon Sep 17 00:00:00 2001 From: Rajkumar-Marvell <54936542+rajkumar38@users.noreply.github.com> Date: Fri, 4 Mar 2022 05:51:18 +0530 Subject: [PATCH 041/817] [Marvell] Update armhf driver/sai deb version (#10126) Fixed Marvell SAI deb version naming issue reported in Marvell-switching/sonic-marvell-binaries#62 Signed-off-by: Rajkumar Pennadam Ramamoorthy --- platform/marvell-armhf/prestera.mk | 2 +- platform/marvell-armhf/sai.mk | 1 - platform/marvell-armhf/sai/Makefile | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/platform/marvell-armhf/prestera.mk b/platform/marvell-armhf/prestera.mk index 2365319b9d00..113b8f41a394 100644 --- a/platform/marvell-armhf/prestera.mk +++ b/platform/marvell-armhf/prestera.mk @@ -4,7 +4,7 @@ export MRVL_PRESTERA_VER = 1.0 export MRVL_PRESTERA = mrvlprestera_$(MRVL_PRESTERA_VER)_$(PLATFORM_ARCH) export MRVL_PRESTERA_DEB = $(MRVL_PRESTERA).deb export MRVL_PRESTERA_SRC_URL = https://github.com/Marvell-switching/mrvl-prestera.git -export MRVL_PRESTERA_SRC_TAG = MRVL_PRESTERA_DRIVER_1.0 +export MRVL_PRESTERA_SRC_TAG = MRVL_PRESTERA_DRIVER_1.2 $(MRVL_PRESTERA_DEB)_SRC_PATH = $(PLATFORM_PATH)/prestera $(MRVL_PRESTERA_DEB)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) diff --git a/platform/marvell-armhf/sai.mk b/platform/marvell-armhf/sai.mk index 3672cc70dba3..4df1b2c5b6f6 100644 --- a/platform/marvell-armhf/sai.mk +++ b/platform/marvell-armhf/sai.mk @@ -2,7 +2,6 @@ export MRVL_SAI_VERSION = 1.9.1-1 export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION)_$(PLATFORM_ARCH).deb -export MRVL_SAI_PACKAGE = mrvllibsai_$(PLATFORM_ARCH)_$(MRVL_SAI_VERSION).deb $(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai $(eval $(call add_conflict_package,$(MRVL_SAI),$(LIBSAIVS_DEV))) diff --git a/platform/marvell-armhf/sai/Makefile b/platform/marvell-armhf/sai/Makefile index a6199f595448..cf78504388c6 100644 --- a/platform/marvell-armhf/sai/Makefile +++ b/platform/marvell-armhf/sai/Makefile @@ -2,7 +2,7 @@ SHELL = /bin/bash .SHELLFLAGS += -e -MRVL_SAI_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/master/armhf/sai-plugin/$(MRVL_SAI_PACKAGE) +MRVL_SAI_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/master/armhf/sai-plugin/$(MRVL_SAI) $(addprefix $(DEST)/, $(MRVL_SAI)): $(DEST)/% : # get deb package From 622962a213bb509f61fa286b88780fc7dd923cb7 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 3 Mar 2022 16:22:31 -0800 Subject: [PATCH 042/817] [linkmgrd]: update linkmgrd submodule (#10117) ce72b0d Longxiang Lyu Thu Feb 24 06:05:12 2022 Put handler member functions as virtual in base (#30) ef59e4f Jing Zhang Fri Feb 25 11:38:28 2022 Incrementing tolerance on mux state inconsistency (#27) 2d12892 Longxiang Lyu Wed Feb 16 03:32:06 2022 Rename LinkManagerStateMachine to ActiveStandbyStateMachine (#26) f38634c Jing Zhang Thu Feb 17 17:23:56 2022 Update log level for mux probing and mux state chance (#23) a8434dd Jing Zhang Thu Feb 17 17:21:01 2022 Handle xcvrd crashing scenarios (#22) 2ebdb2b Longxiang Lyu Mon Feb 14 13:26:07 2022 [make] Enable make extra includes (#24) --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index ef1f5ebc9a64..ce72b0d2b8bb 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit ef1f5ebc9a64207e622da1fb11eb78e6d95e7f45 +Subproject commit ce72b0d2b8bb10c8734d841cf27614c2e3b197c8 From d0ff8b5f481fbd12bba308b136d28411fa2e36f5 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Thu, 3 Mar 2022 20:10:15 -0500 Subject: [PATCH 043/817] [pmon] Clean up supervisord chassis_db_init entry and fix startsecs (#10071) Why I did it Code review was still in progress when #9858 was merged and upon further testing I have arrived at a better solution. How I did it Modified supervisord configuration j2 template for pmon to require no minimum uptime for chassisd_db_init and to remove the redundant exit_codes directive How to verify it Boot switch and verify in syslog that there are no errors related to chassis_db_init --- .../docker-platform-monitor/docker-pmon.supervisord.conf.j2 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 index 795714f6881f..b93f0cef3cee 100644 --- a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 +++ b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 @@ -47,10 +47,9 @@ command=/usr/local/bin/chassis_db_init priority=3 autostart=false autorestart=false -exitcodes=0 stdout_logfile=syslog stderr_logfile=syslog -startsecs=10 +startsecs=0 dependent_startup=true dependent_startup_wait_for=rsyslogd:running {% endif %} From c40f04f0e24bfaf8c9c649882b4606c129dab26b Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 3 Mar 2022 20:56:08 -0500 Subject: [PATCH 044/817] [chassis][supervisor]monit container-checker failed due to unexpected "database-chassis" docker running #9042 (#9043) Why I did it Fixed the monit container_checker fails due to unexpected "database-chassis" docker running on Supervisor card in the VOQ chassis. fixes #9042 How I did it Added database-chassis to the always running docker list if platform is supervisor card. How to verify it Execute the CLI command "sudo monit status container_checker" Signed-off-by: mlok --- files/image_config/monit/container_checker | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/image_config/monit/container_checker b/files/image_config/monit/container_checker index 63bd7b3e182d..197e4f04a499 100755 --- a/files/image_config/monit/container_checker +++ b/files/image_config/monit/container_checker @@ -20,7 +20,7 @@ import docker import sys import swsssdk -from sonic_py_common import multi_asic +from sonic_py_common import multi_asic, device_info from swsscommon import swsscommon @@ -63,6 +63,8 @@ def get_expected_running_containers(): always_running_containers.add(container_name + str(asic_id)) else: always_running_containers.add(container_name) + if device_info.is_supervisor(): + always_running_containers.add("database-chassis") return expected_running_containers, always_running_containers def get_current_running_from_DB(always_running_containers): From 55a0722a33c19f9693ff441d3b4265876dc92cf3 Mon Sep 17 00:00:00 2001 From: StormLiangMS <89824293+StormLiangMS@users.noreply.github.com> Date: Sat, 5 Mar 2022 09:20:38 +0800 Subject: [PATCH 045/817] support BGP_ALLOWED_PREFIXES (#10142) --- src/sonic-yang-models/setup.py | 5 +- .../tests/files/sample_config_db.json | 8 + .../tests/yang_model_tests/tests/bgp.json | 41 ++++- .../yang_model_tests/tests_config/bgp.json | 171 ++++++++++++++++++ .../yang-models/sonic-bgp-allowed-prefix.yang | 102 +++++++++++ 5 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-allowed-prefix.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index d8b9a0d0c4a2..429549255824 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -85,6 +85,7 @@ def run(self): './yang-models/sonic-bgp-neighbor.yang', './yang-models/sonic-bgp-peergroup.yang', './yang-models/sonic-bgp-peerrange.yang', + './yang-models/sonic-bgp-allowed-prefix.yang', './yang-models/sonic-breakout_cfg.yang', './yang-models/sonic-buffer-pg.yang', './yang-models/sonic-buffer-pool.yang', @@ -126,11 +127,8 @@ def run(self): './yang-models/sonic-versions.yang', './yang-models/sonic-vlan.yang', './yang-models/sonic-vrf.yang', - './yang-models/sonic-mclag.yang', - './yang-models/sonic-vlan-sub-interface.yang', - './yang-models/sonic-warm-restart.yang', './yang-models/sonic-lldp.yang', './yang-models/sonic-scheduler.yang', @@ -153,6 +151,7 @@ def run(self): './cvlyang-models/sonic-bgp-neighbor.yang', './cvlyang-models/sonic-bgp-peergroup.yang', './cvlyang-models/sonic-bgp-peerrange.yang', + './cvlyang-models/sonic-bgp-allowed-prefix.yang', './cvlyang-models/sonic-breakout_cfg.yang', './cvlyang-models/sonic-copp.yang', './cvlyang-models/sonic-crm.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 89a915e72b5e..e7b03092efac 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1216,6 +1216,14 @@ "peer_group": "PG1" } }, + "BGP_ALLOWED_PREFIXES" :{ + "DEPLOYMENT_ID|4|123:123": { + "default_action": "permit" + }, + "DEPLOYMENT_ID|5": { + "default_action": "permit" + } + }, "ROUTE_MAP_SET": { "map1": { } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json index 8f92f2d9052e..966171888b37 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp.json @@ -157,7 +157,46 @@ }, "BGP_PEERRANGE_ALL_VALID": { "desc": "Configure BGP peer range table." + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_ALL_VALID": { + "desc": "Configue BGP allowed prefix list." + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_DEPLOYMENT": { + "desc": "Invalid default action.", + "eStrKey" : "Pattern" + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_DEFAULT_ACTION": { + "desc": "Invalid default action.", + "eStrKey" : "InvalidValue", + "eStr" : ["default_action"] + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_PREFIXES_IPV4": { + "desc": "Invalid IPv4 prefix.", + "eStrKey" : "Pattern" + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_PREFIXES_IPV6": { + "desc": "Invalid IPv6 prefix.", + "eStrKey" : "Pattern" + }, + "BGP_ALLOWED_PREFIXES_LIST_ALL_VALID": { + "desc": "Configue BGP allowed prefix list." + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_DEPLOYMENT": { + "desc": "Invalid default action.", + "eStrKey" : "Pattern" + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_DEFAULT_ACTION": { + "desc": "Invalid default action.", + "eStrKey" : "InvalidValue", + "eStr" : ["default_action"] + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_PREFIXES_IPV4": { + "desc": "Invalid IPv4 prefix.", + "eStrKey" : "Pattern" + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_PREFIXES_IPV6": { + "desc": "Invalid IPv6 prefix.", + "eStrKey" : "Pattern" } - } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json index 62bfdc4269e6..a6a30bd40559 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp.json @@ -1420,6 +1420,177 @@ ] } } + }, + + "BGP_ALLOWED_PREFIXES_COM_LIST_ALL_VALID": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_COM_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "community": "123:123", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + }, + { + "deployment": "DEPLOYMENT_ID", + "id": "5", + "community": "456:456", + "default_action": "permit", + "prefixes_v4": ["10.10.0.0/24", "10.11.0.0/24"], + "prefixes_v6": ["fc00:f1::/64", "fc00:a1::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_DEPLOYMENT": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_COM_LIST": [ + { + "deployment": "DEPLOYMENTID", + "id": "4", + "community": "123:123", + "default_action": "permitall", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_DEFAULT_ACTION": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_COM_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "community": "123:123", + "default_action": "permitall", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_PREFIXES_IPV4": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_COM_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "community": "123:123", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/48", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_COM_LIST_INVALID_PREFIXES_IPV6": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_COM_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "community": "123:123", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0./24"], + "prefixes_v6": ["fc00:f0::/129", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_LIST_ALL_VALID": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + }, + { + "deployment": "DEPLOYMENT_ID", + "id": "5", + "default_action": "permit", + "prefixes_v4": ["10.10.0.0/24", "10.11.0.0/24"], + "prefixes_v6": ["fc00:f1::/64", "fc00:a1::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_DEPLOYMENT": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_LIST": [ + { + "deployment": "DEPLOYMENTID", + "id": "4", + "default_action": "permitall", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_DEFAULT_ACTION": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "default_action": "permitall", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_PREFIXES_IPV4": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/48", "10.1.0.0/24"], + "prefixes_v6": ["fc00:f0::/64", "fc00:a0::/64"] + } + ] + } + } + }, + "BGP_ALLOWED_PREFIXES_LIST_INVALID_PREFIXES_IPV6": { + "sonic-bgp-allowed-prefix:sonic-bgp-allowed-prefix": { + "sonic-bgp-allowed-prefix:BGP_ALLOWED_PREFIXES": { + "BGP_ALLOWED_PREFIXES_LIST": [ + { + "deployment": "DEPLOYMENT_ID", + "id": "4", + "default_action": "permit", + "prefixes_v4": ["10.0.0.0/24", "10.1.0.0./24"], + "prefixes_v6": ["fc00:f0::/129", "fc00:a0::/64"] + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-allowed-prefix.yang b/src/sonic-yang-models/yang-models/sonic-bgp-allowed-prefix.yang new file mode 100644 index 000000000000..942387983775 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-allowed-prefix.yang @@ -0,0 +1,102 @@ +module sonic-bgp-allowed-prefix { + namespace "http://github.com/Azure/sonic-bgp-allowed-prefix"; + prefix bgppre; + yang-version 1.1; + + import sonic-bgp-common { + prefix bgpcmn; + } + + import ietf-inet-types { + prefix inet; + } + + import sonic-routing-policy-sets { + prefix rpolsets; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP Allowed Prefix"; + + revision 2022-02-26 { + description + "Initial revision."; + } + + container sonic-bgp-allowed-prefix { + container BGP_ALLOWED_PREFIXES { + list BGP_ALLOWED_PREFIXES_COM_LIST { + key "deployment id community"; + + leaf deployment { + type string { + pattern "DEPLOYMENT_ID"; + } + description "BGP allowed prefix list key type"; + } + + leaf id { + type uint32; + description "BGP allowed prefix list deployment id"; + } + + leaf community { + type string; + description "BGP allowed prefix list deployment community"; + } + + leaf default_action { + type rpolsets:routing-policy-action-type; + description "Permit/Deny action for BGP allow prefix list"; + } + + leaf-list prefixes_v4 { + type inet:ipv4-prefix; + description "BGP V4 allowed prefix list"; + } + + leaf-list prefixes_v6 { + type inet:ipv6-prefix; + description "BGP V6 allowed prefix list"; + } + } + + list BGP_ALLOWED_PREFIXES_LIST { + key "deployment id"; + + leaf deployment { + type string { + pattern "DEPLOYMENT_ID"; + } + description "BGP allowed prefix list key type"; + } + + leaf id { + type uint32; + description "BGP allowed prefix list deployment id"; + } + + leaf default_action { + type rpolsets:routing-policy-action-type; + description "Permit/Deny action for BGP allow prefix list"; + } + + leaf-list prefixes_v4 { + type inet:ipv4-prefix; + description "BGP V4 allowed prefix list"; + } + + leaf-list prefixes_v6 { + type inet:ipv6-prefix; + description "BGP V6 allowed prefix list"; + } + } + } + } +} From 85976cbca3a59c94a14802e0e6c416d75b4bb924 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Sat, 5 Mar 2022 09:33:50 +0800 Subject: [PATCH 046/817] [AS5835-54X] Fix I2C bus order (#9146) Why I did it To fix I2C bus order to meet with HW SPEC. Let i801 use bus-0 and ismt use bus-1 How I did it Modprobe i801 and then do ismt. So i801 will use bus-0 and ismt will use bus-1. How to verify it Test show cmd and sensors work well Co-authored-by: Jostar Yang --- .../accton/x86_64-accton_as5835_54x-r0/installer.conf | 2 ++ .../as5835-54x/utils/accton_as5835_54x_util.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/device/accton/x86_64-accton_as5835_54x-r0/installer.conf b/device/accton/x86_64-accton_as5835_54x-r0/installer.conf index 925a32fc0c3a..a0944fd0e30f 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/installer.conf +++ b/device/accton/x86_64-accton_as5835_54x-r0/installer.conf @@ -1,3 +1,5 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=0 CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off modprobe.blacklist=i2c-ismt,i2c_ismt,i2c-i801,i2c_i801" + diff --git a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py index dc26ae1c8192..79b1e730ee9e 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py @@ -128,6 +128,8 @@ def driver_check(): kos = [ 'modprobe i2c_dev', +'modprobe i2c_i801', +'modprobe i2c_ismt', 'modprobe i2c_mux_pca954x force_deselect_on_exit=1', 'modprobe accton_as5835_54x_cpld' , 'modprobe ym2651y' , @@ -282,6 +284,14 @@ def device_install(): print(output) if FORCE == 0: return status + + # set all pca954x idle_disconnect + cmd = 'echo -2 | tee /sys/bus/i2c/drivers/pca954x/*-00*/idle_state' + status, output = log_os_system(cmd, 1) + if status: + print(output) + if FORCE == 0: + return status for i in range(49, 55): #Set qsfp port to normal state log_os_system("echo 0 > /sys/bus/i2c/devices/3-0062/module_reset_" + str(i), 1) From d959c4adcd07728daa7d6cc00e8382ae829fbe09 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Sat, 5 Mar 2022 09:40:27 +0800 Subject: [PATCH 047/817] [AS4630-54PE] Fix led drv and i2c bus order (#9170) Signed-off-by: Jostar Yang jostar_yang@accton.com.tw Why I did it Fix led drv because CPLD SPEC is updated. Fix i2c bus order How I did it Fix led drv. Set blacklist to i801 and ismt. Let accton util to modprobe i801 and ismt. How to verify it Test led and sensors cmd. Results are fine. --- .../installer.conf | 1 + .../modules/x86-64-accton-as4630-54pe-leds.c | 0 .../utils/accton_as4630_54pe_util.py | 24 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/installer.conf b/device/accton/x86_64-accton_as4630_54pe-r0/installer.conf index 925a32fc0c3a..735fa7992dbc 100755 --- a/device/accton/x86_64-accton_as4630_54pe-r0/installer.conf +++ b/device/accton/x86_64-accton_as4630_54pe-r0/installer.conf @@ -1,3 +1,4 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=0 CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off modprobe.blacklist=i2c-ismt,i2c_ismt,i2c-i801,i2c_i801" diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c old mode 100755 new mode 100644 diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py index f0081b33b2c3..66599ad88ad6 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py @@ -118,7 +118,6 @@ def main(): elif opt in ('-f', '--force'): FORCE = 1 else: - print("TEST") logging.info('no option') for arg in args: if arg == 'install': @@ -167,7 +166,9 @@ def driver_inserted(): kos = [ 'depmod -ae', 'modprobe i2c_dev', -'modprobe i2c_mux_pca954x force_deselect_on_exit=1', +'modprobe i2c_i801', +'modprobe i2c_ismt', +'modprobe i2c_mux_pca954x', 'modprobe ym2651y', 'modprobe x86_64_accton_as4630_54pe_cpld', 'modprobe x86_64_accton_as4630_54pe_leds', @@ -176,17 +177,7 @@ def driver_inserted(): def driver_install(): global FORCE - - ret=log_os_system("lsmod|grep i2c_ismt",1) - my_log("rmmond i2cismt") - log_os_system("rmmod i2c_ismt", 1) - log_os_system("rmmod i2c_i801", 1) - log_os_system("modprobe i2c-i801", 1) - time.sleep(1) - log_os_system("modprobe i2c-ismt", 1) - - - + for i in range(0,len(kos)): status, output = log_os_system(kos[i], 1) if status: @@ -226,6 +217,13 @@ def device_install(): if FORCE == 0: return status + # set all pca954x idle_disconnect + cmd = 'echo -2 | tee /sys/bus/i2c/drivers/pca954x/*-00*/idle_state' + status, output = log_os_system(cmd, 1) + if status: + print(output) + if FORCE == 0: + return status for i in range(0,len(sfp_map)): if(i < 4): opt='optoe2' From b2409be2f2298bf6657257b3454763fd6568e124 Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Sat, 5 Mar 2022 07:23:35 +0530 Subject: [PATCH 048/817] DellEMC: N3248TE Platform API 2.0 changes (#9735) Why I did it N3248TE - Platform API 2.0 changes How I did it Implemented the functional API's needed for Platform API 2.0 How to verify it Used the API 2.0 test suite to validate the test cases. --- .../n3248te/sonic_platform/chassis.py | 72 +++++++++- .../n3248te/sonic_platform/component.py | 49 +++++++ .../n3248te/sonic_platform/eeprom.py | 17 +-- .../n3248te/sonic_platform/fan.py | 85 ++++++++++-- .../n3248te/sonic_platform/fan_drawer.py | 123 +++++++++++++++++- .../n3248te/sonic_platform/psu.py | 56 ++++++-- .../n3248te/sonic_platform/sfp.py | 5 +- .../n3248te/sonic_platform/thermal.py | 19 ++- 8 files changed, 388 insertions(+), 38 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py index 9686892f6f2a..d2922eac1fa5 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py @@ -19,7 +19,6 @@ from sonic_platform.psu import Psu from sonic_platform.thermal import Thermal from sonic_platform.watchdog import Watchdog - from sonic_platform.fan import Fan from sonic_platform.fan_drawer import FanDrawer except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -62,6 +61,12 @@ class Chassis(ChassisBase): 53: 24, 54: 25, } + SYSTEM_LED_COLORS = { + "green", + "blink_green", + "yellow", + "blink_yellow" + } def __init__(self): ChassisBase.__init__(self) @@ -89,8 +94,6 @@ def __init__(self): self._watchdog = Watchdog() self._num_sfps = 54 self._num_fans = MAX_N3248TE_FANTRAY * MAX_N3248TE_FAN - self._fan_list = [Fan(i, j) for i in range(MAX_N3248TE_FANTRAY) \ - for j in range(MAX_N3248TE_FAN)] for k in range(MAX_N3248TE_FANTRAY): fandrawer = FanDrawer(k) self._fan_drawer_list.append(fandrawer) @@ -105,6 +108,7 @@ def __init__(self): self._global_port_pres_dict[port_num] = '1' if presence else '0' self._watchdog = Watchdog() + self.status_led_reg = "system_led" self.locator_led_reg = "locator_led" self.LOCATOR_LED_ON = "blink_blue" self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF @@ -125,7 +129,6 @@ def _set_cpld_register(self, reg_name, value): cpld_reg_file = self.CPLD_DIR + '/' + reg_name if (not os.path.isfile(cpld_reg_file)): - #print "open error" return rv try: @@ -136,6 +139,40 @@ def _set_cpld_register(self, reg_name, value): return rv + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + color = self._get_cpld_register(self.status_led_reg) + + if color not in list(self.SYSTEM_LED_COLORS): + return self.sys_ledcolor + + return color + + def initizalize_system_led(self): + self.sys_ledcolor = "green" + + def set_status_led(self,color): + """ + Set system LED status based on the color type passed in the argument. + Argument: Color to be set + Returns: + bool: True is specified color is set, Otherwise return False + """ + + if color not in list(self.SYSTEM_LED_COLORS): + return False + if(not self._set_cpld_register(self.status_led_reg, color)): + return False + + self.sys_ledcolor = color + return True + # check for this event change for sfp / do we need to handle timeout/sleep def get_change_event(self, timeout=0): @@ -193,7 +230,7 @@ def get_name(self): Returns: string: The name of the chassis """ - return self._eeprom.modelstr().decode() + return self._eeprom.modelstr() def get_presence(self): """ @@ -348,3 +385,28 @@ def get_locator_led(self): return self.LOCATOR_LED_OFF else: return self.LOCATOR_LED_OFF + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + def get_revision(self): + """ + Retrives the hardware revision of the device + + Returns: + string: Revision value of device + """ + return self._eeprom.revision_str() diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py index ec0dba2ab5b9..ccf90f881b0b 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py @@ -80,3 +80,52 @@ def install_firmware(self, image_path): A boolean, True if install was successful, False if not """ return False + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/eeprom.py index 75584cbc80b0..1c1c5c6df07a 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/eeprom.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/eeprom.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# DellEmc Z9332F +# DellEmc N3248TE # # Platform and model specific eeprom subclass, inherits from the base class, # and provides the followings: @@ -11,7 +11,6 @@ try: import os.path from sonic_eeprom import eeprom_tlvinfo - import binascii except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -75,9 +74,9 @@ def base_mac_addr(self, e): (is_valid, t) = self.get_tlv_field( self.eeprom_data, self._TLV_CODE_MAC_BASE) if not is_valid or t[1] != 6: - return super(eeprom_tlvinfo.TlvInfoDecoder, self).switchaddrstr(t) + return super(TlvInfoDecoder, self).switchaddrstr(e) - return ":".join([binascii.b2a_hex(T) for T in t[2]]) + return ":".join(["{:02x}".format(T) for T in t[2]]).upper() def modelstr(self): """ @@ -88,7 +87,7 @@ def modelstr(self): if not is_valid: return "N/A" - return results[2] + return results[2].decode('ascii') def part_number_str(self): """ @@ -99,7 +98,7 @@ def part_number_str(self): if not is_valid: return "N/A" - return results[2] + return results[2].decode('ascii') def serial_str(self): """ @@ -110,7 +109,7 @@ def serial_str(self): if not is_valid: return "N/A" - return results[2] + return results[2].decode('ascii') def revision_str(self): """ @@ -121,7 +120,7 @@ def revision_str(self): if not is_valid: return "N/A" - return results[2] + return results[2].decode('ascii') def system_eeprom_info(self): """ @@ -130,5 +129,3 @@ def system_eeprom_info(self): found in the system EEPROM. """ return self.eeprom_tlv_dict - - diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py index 873ae4163a84..ff8ea160b95d 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ######################################################################## -# DellEMC Z9332F +# DellEMC N3248TE # # Module contains an implementation of SONiC Platform Base API and # provides the Fans' information which are available in the platform. @@ -26,15 +26,19 @@ def __init__(self, fantray_index=0, fan_index=0, psu_fan=False, dependency=None) self.presence_reg = "fan{}_prs".format(fantray_index) self.dir_reg = "fan{}_dir".format(fantray_index) self.rpm_file = "/sys/bus/i2c/devices/7-002c/fan{}_input".format(fantray_index+1) + self.status_file = "/sys/bus/i2c/devices/7-002c/fan{}_fault".format(fantray_index+1) self.eeprom = "/sys/bus/i2c/devices/{}-0050/eeprom".format(15 + fantray_index) self.fantray_index = fantray_index + self.fan_index = fan_index else: - self.presence_reg = "psu{}_prs".format(fantray_index) - self.psu_index = fantray_index + self.psu_index = fan_index - 1 self.dependancy = dependency + self.presence_reg = "psu{}_prs".format(self.psu_index) + self.status_reg = "psu{}_status".format(self.psu_index) self.dir_reg = "" - self.dps_hwmon = "/sys/bus/i2c/devices/{}-005e/hwmon/".format(fantray_index+10) - self.eeprom = "/sys/bus/i2c/devices/{}-0056/eeprom".format(10 + fantray_index) + self.dps_hwmon = "/sys/bus/i2c/devices/{}-005e/hwmon/".format(self.psu_index + 10) + self.eeprom = "/sys/bus/i2c/devices/{}-0056/eeprom".format(self.psu_index + 10) + self.fan_index = fan_index self.max_speed = 0 def _get_cpld_register(self, reg_name): @@ -55,9 +59,9 @@ def get_name(self): String: The name of the device """ if self.is_psu_fan: - return "PSU{} Fan".format(self.psu_index) + return "PSU{} Fan".format(self.psu_index+1) else: - return "Fan{}".format(self.fantray_index+1) + return "FanTray{}-Fan{}".format(self.fantray_index+1, self.fan_index+1) def get_model(self): """ @@ -95,6 +99,8 @@ def get_presence(self): return False if int(presence,0) == 1: return True + else: + return False def get_status(self): """ @@ -102,7 +108,20 @@ def get_status(self): Returns: bool: True if FAN is operating properly, False if not """ - return True + if not self.is_psu_fan: + status = open(self.status_file, "rb").read() + if int(status, 0) == 1: + return False + else: + return True + else: + status = self._get_cpld_register(self.status_reg) + if status == 'ERR': + return False + if int(status, 0) == 1: + return True + else: + return False def get_direction(self): """ @@ -118,7 +137,7 @@ def get_direction(self): """ if not self.is_psu_fan: val = self._get_cpld_register(self.dir_reg) - direction = 'Exhaust' if val == 'F2B' else 'Intake' + direction = 'exhaust' if val == 'F2B' else 'intake' if direction == 'ERR': return None else: @@ -126,7 +145,7 @@ def get_direction(self): val = open(self.eeprom, "rb").read()[0xe1:0xe8] except Exception: return None - direction = 'Exhaust' if val == 'FORWARD' else 'Intake' + direction = 'exhaust' if val == 'FORWARD' else 'intake' return direction def get_speed(self): @@ -167,3 +186,49 @@ def get_speed_rpm(self): except Exception: return None return fan_speed + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fan_index + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by HW + # Return True to avoid thermalctld alarm + return True + diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan_drawer.py index 5142827554db..1812f427cc33 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan_drawer.py @@ -14,20 +14,51 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") -N3248TE_FANS_PER_FANTRAY = 2 +N3248TE_FANS_PER_FANTRAY = 1 class FanDrawer(FanDrawerBase): """DellEMC Platform-specific Fan class""" + FANTRAY_LED_COLORS = { + "off", + "green", + "yellow" + } + def __init__(self, fantray_index): FanDrawerBase.__init__(self) # FanTray is 1-based in DellEMC platforms + self.fantray_led_reg = "fan{}_led".format(fantray_index) self.fantrayindex = fantray_index + 1 for i in range(N3248TE_FANS_PER_FANTRAY): self._fan_list.append(Fan(fantray_index, i)) + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + try: + rv = open(cpld_reg_file, 'r').read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') + + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv + def get_name(self): """ Retrieves the fan drawer name @@ -35,3 +66,93 @@ def get_name(self): string: The name of the device """ return "FanTray{}".format(self.fantrayindex) + + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + color = self._get_cpld_register(self.fantray_led_reg) + + #if color not in list(self.FANTRAY_LED_COLORS): + # return self.sys_ledcolor + + return color + + def set_status_led(self,color): + """ + Set system LED status based on the color type passed in the argument. + Argument: Color to be set + Returns: + bool: True is specified color is set, Otherwise return False + """ + + if color not in list(self.FANTRAY_LED_COLORS): + return False + + if(not self._set_cpld_register(self.fantray_led_reg, color)): + return False + + return True + + def get_presence(self): + """ + Retrives the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return "NA" + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 0.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py index 30d4f2bd6c2a..617b2ce7f966 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ######################################################################## -# DellEMC Z9332F +# DellEMC N3248TE # # Module contains an implementation of SONiC Platform Base API and # provides the PSUs' information which are available in the platform @@ -91,7 +91,9 @@ def get_presence(self): self.dps_hwmon_exist = os.path.exists(self.dps_hwmon) if not self.dps_hwmon_exist: self._reload_dps_module() - return int(presence, 0) + if int(presence, 0) == 1: + return True + return False def get_model(self): """ @@ -103,7 +105,7 @@ def get_model(self): try: val = open(self.eeprom, "rb").read()[0x50:0x62] except Exception: val = None - return val.decode() + return val.decode('ascii') def get_serial(self): """ @@ -115,7 +117,22 @@ def get_serial(self): try: val = open(self.eeprom, "rb").read()[0xc4:0xd9] except Exception: val = None - return val.decode() + return val.decode('ascii') + + def get_revision(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + try: val = open(self.eeprom, "rb").read()[0xc4:0xd9] + except Exception: + val = None + if val != "NA" and len(val) == 23: + return val[-3:] + else: + return "NA" def get_status(self): """ @@ -126,7 +143,9 @@ def get_status(self): """ status = self._get_cpld_register(self.psu_status).strip() if status == 'ERR' : return False - return int(status, 0) + if int(status, 0) == 1: + return True + return False def get_voltage(self): """ @@ -141,7 +160,7 @@ def get_voltage(self): voltage = int(volt_reading)/1000 except Exception: return None - return "{:.1f}".format(voltage) + return float(voltage) def get_current(self): """ @@ -156,7 +175,7 @@ def get_current(self): current = int(curr_reading)/1000 except Exception: return None - return "{:.1f}".format(current) + return float(current) def get_power(self): """ @@ -168,10 +187,10 @@ def get_power(self): """ power_reading = self._get_dps_register(self.psu_power_reg) try: - power = int(power_reading)/1000 + power = int(power_reading)/(1000*1000) except Exception: return None - return "{:.1f}".format(power) + return float(power) def get_powergood_status(self): """ @@ -204,4 +223,21 @@ def get_type(self): try: val = open(self.eeprom, "rb").read()[0xe8:0xea] except Exception: return None - return val + return val.decode() + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py index a69c2b4419d5..0a30ae272d76 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# DELLEMC S5248F +# DELLEMC N3248TE # # Module contains an implementation of SONiC Platform Base API and # provides the platform information @@ -17,6 +17,9 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +SFP_PORT_START = 49 +SFP_PORT_END = 54 + class Sfp(SfpOptoeBase): """ DELLEMC Platform-specific Sfp class diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/thermal.py index 96edda7c14d4..b07eb5d075e1 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ######################################################################## -# DellEMC Z9332F +# DellEMC N3248TE # # Module contains an implementation of SONiC Platform Base API and # provides the Thermals' information which are available in the platform @@ -144,3 +144,20 @@ def set_low_threshold(self, temperature): """ # Thermal threshold values are pre-defined based on HW. return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False From 2ef9d6552593ab5ffefda60e73b88372d02b6b70 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Mon, 7 Mar 2022 13:05:46 +0800 Subject: [PATCH 049/817] [yang]: AAA login pattern (#9805) Signed-off-by: Gang Lv ganglv@microsoft.com #### Why I did it end2end test is blocked by Yang model for AAA login pattern. #### How I did it Add pattern to AAA yang models. #### How to verify it Run UT for sonc-yang-models. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 #### Description for the changelog Fix #9713 #### A picture of a cute animal (not mandatory but encouraged) --- .../tests/yang_model_tests/tests/aaa.json | 4 ++++ .../tests/yang_model_tests/tests_config/aaa.json | 10 ++++++++++ .../yang-models/sonic-system-aaa.yang | 8 ++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/aaa.json b/src/sonic-yang-models/tests/yang_model_tests/tests/aaa.json index dc3a60a24df5..972b404b88d9 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/aaa.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/aaa.json @@ -6,6 +6,10 @@ "desc": "Configure a wrong type in AAA table.", "eStrKey": "InvalidValue" }, + "AAA_TEST_WRONG_LOGIN": { + "desc": "Configure a wrong type in AAA table.", + "eStr": ["Invalid login choice"] + }, "AAA_TEST_WRONG_FAILTHROUGH": { "desc": "Configure a wrong failthrough in AAA table.", "eStrKey": "Pattern", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/aaa.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/aaa.json index 5b05fc333033..fbf63f994cce 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/aaa.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/aaa.json @@ -24,6 +24,16 @@ } }, + "AAA_TEST_WRONG_LOGIN": { + "sonic-system-aaa:sonic-system-aaa": { + "sonic-system-aaa:AAA": { + "AAA_LIST": [{ + "login": "locallll" + }] + } + } + }, + "AAA_TEST_WRONG_FAILTHROUGH": { "sonic-system-aaa:sonic-system-aaa": { "sonic-system-aaa:AAA": { diff --git a/src/sonic-yang-models/yang-models/sonic-system-aaa.yang b/src/sonic-yang-models/yang-models/sonic-system-aaa.yang index 5df05d475de3..c3a442126959 100644 --- a/src/sonic-yang-models/yang-models/sonic-system-aaa.yang +++ b/src/sonic-yang-models/yang-models/sonic-system-aaa.yang @@ -30,8 +30,12 @@ module sonic-system-aaa { } leaf login { - type string; - description "AAA authentication/authorization/accounting methods - local/tacacs+/disable"; + type string { + pattern '((tacacs\+|local|radius|default),)*(tacacs\+|local|radius|default)' { + error-message "Invalid login choice"; + } + } + description "AAA authentication/authorization/accounting methods - radius/tacacs+/local/default"; default "local"; } From eec49a2e09538b7b0dc93ef6aab72c1e6c5e0a67 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Sun, 6 Mar 2022 22:04:18 -0800 Subject: [PATCH 050/817] [yang] support acl MIRROR_ACTION (#10100) Why I did it ACL doesn't have mirror related action How I did it Add 'MIRROR_INGRESS_ACTION' and 'MIRROR_EGRESS_ACTION' to sonic-acl.yang.j2 How to verify it Run the YANG model unit tests --- .../tests/files/sample_config_db.json | 15 ++++ .../tests/yang_model_tests/tests/acl.json | 7 ++ .../yang_model_tests/tests_config/acl.json | 70 +++++++++++++++++++ .../yang-templates/sonic-acl.yang.j2 | 16 +++++ 4 files changed, 108 insertions(+) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e7b03092efac..89b27eb5f5c2 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -282,6 +282,11 @@ "SRC_IPV6": "::/0", "PRIORITY": "990000", "DST_IPV6": "::/0" + }, + "EVERFLOW_DSCP|RULE_1": { + "MIRROR_INGRESS_ACTION": "erspan", + "DSCP": "10", + "PRIORITY": "9999" } }, "DEVICE_METADATA": { @@ -750,7 +755,17 @@ "Ethernet25", "Ethernet24" ] + }, + "EVERFLOW_DSCP": { + "type": "MIRROR_DSCP", + "policy_desc": "EVERFLOW_DSCP", + "ports": [ + "Ethernet14", + "Ethernet24" + ], + "stage": "ingress" } + }, "PBH_HASH_FIELD": { "inner_ip_proto": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json index 8c307c30f294..980622cbd3e8 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json @@ -105,5 +105,12 @@ }, "ACL_PACKET_ACTION_VALIDATE_VALUE_ACCEPT": { "desc": "Configure CTRLPLANE with proper action ACCEPT." + }, + "ACL_RULE_WITH_INVALID_MIRROR_INGRESS_ACTION": { + "desc": "Configure ACL_RULE with invalid mirror action.", + "eStrKey" : "LeafRef" + }, + "ACL_RULE_WITH_VALID_MIRROR_INGRESS_ACTION": { + "desc": "Configure ACL_RULE with valid mirror action." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json index 98acc17a63a4..b2aa6b3fb15d 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json @@ -820,5 +820,75 @@ ] } } + }, + "ACL_RULE_WITH_INVALID_MIRROR_INGRESS_ACTION": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW_DSCP", + "MIRROR_INGRESS_ACTION": "mirror_session_dscp", + "PRIORITY": 9999, + "RULE_NAME": "Rule_20", + "DSCP": "10" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW_DSCP", + "policy_desc": "EVERFLOW_DSCP", + "ports": [ + "" + ], + "stage": "ingress", + "type": "MIRROR_DSCP" + } + ] + } + } + }, + "ACL_RULE_WITH_VALID_MIRROR_INGRESS_ACTION": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW_DSCP", + "MIRROR_INGRESS_ACTION": "mirror_session_dscp", + "PRIORITY": 9999, + "RULE_NAME": "Rule_20", + "DSCP": "10" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW_DSCP", + "policy_desc": "EVERFLOW_DSCP", + "ports": [ + "" + ], + "stage": "ingress", + "type": "MIRROR_DSCP" + } + ] + } + }, + "sonic-mirror-session:sonic-mirror-session": { + "sonic-mirror-session:MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name":"mirror_session_dscp", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "0x1234", + "dscp": "10" + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 index f38844d09fe8..d007f82e0964 100644 --- a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 @@ -33,6 +33,10 @@ module sonic-acl { prefix lag; } + import sonic-mirror-session { + prefix sms; + } + description "ACL YANG Module for SONiC OS"; revision 2019-07-01 { @@ -65,6 +69,18 @@ module sonic-acl { type stypes:packet_action; } + leaf MIRROR_INGRESS_ACTION { + type leafref { + path "/sms:sonic-mirror-session/sms:MIRROR_SESSION/sms:MIRROR_SESSION_LIST/sms:name"; + } + } + + leaf MIRROR_EGRESS_ACTION { + type leafref { + path "/sms:sonic-mirror-session/sms:MIRROR_SESSION/sms:MIRROR_SESSION_LIST/sms:name"; + } + } + leaf IP_TYPE { type stypes:ip_type; } From 78e867a79403efd80915e66ff51ebe1733d72a2a Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:54:05 +0800 Subject: [PATCH 051/817] [YANG]: Update port Yang models to support multi-asic platform (#10113) Why I did it Multi-asic platform add aisc_port_name and role to PORT table, and port_index range is changed. How I did it Update sonic-port.yang, add asic_port_name and role, and remove range limitation. How to verify it Run UT for sonic-yang-models. Signed-off-by: Gang Lv ganglv@microsoft.com --- .../tests/files/sample_config_db.json | 5 +- .../tests/yang_model_tests/tests/port.json | 8 +++ .../yang_model_tests/tests_config/port.json | 71 +++++++++++++++++++ .../yang-models/sonic-port.yang | 15 +++- 4 files changed, 96 insertions(+), 3 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 89b27eb5f5c2..6dbffce671e9 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -420,7 +420,10 @@ "description": "", "speed": "11100", "tpid": "0x8100", - "admin_status": "up" + "admin_status": "up", + "index": "0", + "asic_port_name": "Eth0-ASIC1", + "role": "Ext" }, "Ethernet1": { "alias": "Eth1/2", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json index f936d7a0b80d..b3aa253c2e72 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json @@ -73,5 +73,13 @@ "PORT_INVALID_MUX_CABLE_TEST": { "desc": "PORT_INVALID_MUX_CABLE_TEST non-boolean values, expect fail", "eStrKey": "InvalidValue" + }, + "PORT_VALID_MULTIASIC_TEST": { + "desc": "PORT_VALID_MULTIASIC_TEST no failure." + }, + "PORT_INVALID_MULTIASIC_TEST": { + "desc": "PORT_INVALID_MULTIASIC_TEST invalid role pattern, expect fail", + "eStrKey": "Pattern" } + } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json index 5d7fff2cd878..e1549261cb92 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json @@ -314,5 +314,76 @@ ] } } + }, + + "PORT_VALID_MULTIASIC_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 50000, + "index": "0", + "asic_port_name": "Eth8-ASIC1", + "role": "Ext" + }, + { + "name": "Ethernet9", + "alias": "eth9", + "lanes": "66", + "speed": 50000, + "index": "1", + "asic_port_name": "Eth9-ASIC1" + }, + { + "name": "Ethernet10", + "alias": "eth10", + "lanes": "67", + "speed": 50000, + "index": "2", + "asic_port_name": "Eth10-ASIC1", + "role": "Int" + }, + { + "name": "Ethernet11", + "alias": "eth11", + "lanes": "68", + "speed": 50000, + "index": "3", + "asic_port_name": "Eth11-ASIC1", + "role": "Inb" + }, + { + "name": "Ethernet12", + "alias": "eth12", + "lanes": "69", + "speed": 50000, + "index": "4", + "asic_port_name": "Eth12-ASIC1", + "role": "Rec" + } + ] + } + } + }, + + "PORT_INVALID_MULTIASIC_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 50000, + "index": "0", + "asic_port_name": "Eth8-ASIC1", + "role": "Invalid" + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index b2031688af75..d296eaa05c39 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -110,9 +110,20 @@ module sonic-port{ } leaf index { - type uint16 { - range 0..256; + type uint16; + } + + leaf asic_port_name { + type string; + description "port name in asic and asic name, e.g Eth0-ASIC1"; + } + + leaf role { + type string { + pattern "Ext|Int|Inb|Rec"; } + description "Internal port or External port for multi-asic platform"; + default "Ext"; } leaf admin_status { From fe0a7693f4dd502c2d9f86d08227be1c92ae09d2 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 8 Mar 2022 01:39:33 +0800 Subject: [PATCH 052/817] [smartmontools] Install smartmontools with apt-get and upgrade it to 7.2-1 (#10087) Why I did it Smartmontools 6.6 has an issue with reading SMART info of nvme SSD Smartmontools can be installed with apt-get, no need to build and install How I did it Use apt-get to install smartmontools 7.2-1 Remove previous make files for smartmontools 6.6 How to verify it verify with "smartctl" can read out correct SMART info on NVME ssd. verify "show platform ssdhealth" can still work Signed-off-by: Kebo Liu --- .../build_templates/sonic_debian_extension.j2 | 2 +- slave.mk | 1 - sonic-slave-bullseye/Dockerfile.j2 | 3 --- sonic-slave-buster/Dockerfile.j2 | 3 --- sonic-slave-stretch/Dockerfile.j2 | 6 ------ src/smartmontools/.gitignore | 3 --- src/smartmontools/Makefile | 19 ------------------- 7 files changed, 1 insertion(+), 36 deletions(-) delete mode 100644 src/smartmontools/.gitignore delete mode 100644 src/smartmontools/Makefile diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 3efb5ae0690b..0a2b5536232b 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -328,7 +328,7 @@ sudo cp $IMAGE_CONFIGS/monit/restart_service $FILESYSTEM_ROOT/usr/bin/ sudo chmod 755 $FILESYSTEM_ROOT/usr/bin/restart_service # Install custom-built smartmontools -sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/smartmontools_*.deb +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install smartmontools=7.2-1 # Install custom-built openssh sshd sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/openssh-server_*.deb diff --git a/slave.mk b/slave.mk index 1b879350b734..66831571aa7d 100644 --- a/slave.mk +++ b/slave.mk @@ -974,7 +974,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(LIBNSS_TACPLUS) \ $(MONIT) \ $(OPENSSH_SERVER) \ - $(SMARTMONTOOLS) \ $(PYTHON_SWSSCOMMON) \ $(PYTHON3_SWSSCOMMON) \ $(SONIC_UTILITIES_DATA) \ diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index c0a23c59624b..dc6ba779e264 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -279,9 +279,6 @@ RUN apt-get update && apt-get install -y \ librrd8 \ librrd-dev \ rrdtool \ -# For smartmontools 6.6-1 - automake1.11 \ - libselinux1-dev \ # For kdump-tools liblzo2-dev \ # For iptables diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 0f5c6414a196..715ad8e19057 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -291,9 +291,6 @@ RUN apt-get update && apt-get install -y \ librrd8 \ librrd-dev \ rrdtool \ -# For smartmontools 6.6-1 - automake1.11 \ - libselinux1-dev \ # For kdump-tools liblzo2-dev \ # For iptables diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2 index 93c6d21d41e4..d9528f67d02a 100644 --- a/sonic-slave-stretch/Dockerfile.j2 +++ b/sonic-slave-stretch/Dockerfile.j2 @@ -272,9 +272,6 @@ RUN apt-get update && apt-get install -y \ librrd8 \ librrd-dev \ rrdtool \ -# For smartmontools 6.6-1 - automake1.11 \ - libselinux1-dev \ # For kdump-tools liblzo2-dev \ # For iptables @@ -315,9 +312,6 @@ RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confdef" ## do not modify the current configuration file, the new version is installed with a .dpkg-dist suffix RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confold" -# For smartmontools 6.6-1 -RUN apt-get -t stretch-backports install -y debhelper - # For linux build RUN apt-get -y build-dep linux diff --git a/src/smartmontools/.gitignore b/src/smartmontools/.gitignore deleted file mode 100644 index a0991ff4402b..000000000000 --- a/src/smartmontools/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!.gitignore -!Makefile diff --git a/src/smartmontools/Makefile b/src/smartmontools/Makefile deleted file mode 100644 index 8f0f0695659f..000000000000 --- a/src/smartmontools/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -SHELL = /bin/bash -.ONESHELL: -.SHELLFLAGS += -e - - -MAIN_TARGET = smartmontools_$(SMARTMONTOOLS_VERSION_FULL)_$(CONFIGURED_ARCH).deb - -$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - rm -rf smartmontools-$(SMARTMONTOOLS_VERSION_MAJOR) - wget -O smartmontools_$(SMARTMONTOOLS_VERSION_MAJOR).orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/debian/smartmontools_$(SMARTMONTOOLS_VERSION_MAJOR).orig.tar.gz?sv=2015-04-05&sr=b&sig=JZx4qiLuO36T0rsGqk4V2RDuWjRw6NztsLK7vlBYAkg%3D&se=2046-08-20T23%3A47%3A13Z&sp=r" - wget -O smartmontools_$(SMARTMONTOOLS_VERSION_FULL).dsc -N "https://sonicstorage.blob.core.windows.net/packages/debian/smartmontools_$(SMARTMONTOOLS_VERSION_FULL).dsc?sv=2015-04-05&sr=b&sig=IS7FKUN%2Bvq0T55f4X2hGAViB70Y%2FgzjGgvzpUJLyUfA%3D&se=2046-08-20T23%3A46%3A57Z&sp=r" - wget -O smartmontools_$(SMARTMONTOOLS_VERSION_FULL).debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/debian/smartmontools_$(SMARTMONTOOLS_VERSION_FULL).debian.tar.xz?sv=2015-04-05&sr=b&sig=H0RFeC41MCvhTQCln85DuPLn5v2goozwz%2FB9sA9p5eQ%3D&se=2046-08-20T23%3A46%3A02Z&sp=r" - dpkg-source -x smartmontools_$(SMARTMONTOOLS_VERSION_FULL).dsc - - pushd smartmontools-$(SMARTMONTOOLS_VERSION_MAJOR) - dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) - popd - - mv $* $(DEST)/ From d9a61b07a7b8e2aa699da5c1ee7b0eb111d219c6 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:01:31 -0800 Subject: [PATCH 053/817] send log to /var/log/syslog; Add user info the message (#10033) Why I did it Desired the log message destination to be syslog and it misses the critical info. How I did it Non logical code changes only. Logging update, just for one message only a) The log message is directed to /var/log/syslog, instead of /var/log/auth.log b) Include user alias in the message How to verify it Pick a user alias that has not logged into the switch yet Add this alias to /etc/tacplus_user Attempt to login as that user Look for the error message in /var/log/syslog e.g. "Feb 18 19:16:41.592191 sonic ERR sshd[5233]: auth fail: Password incorrect. user: user_xyz" --- .../pam/0010-handle-bad-password-set-by-sshd.patch | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tacacs/pam/0010-handle-bad-password-set-by-sshd.patch b/src/tacacs/pam/0010-handle-bad-password-set-by-sshd.patch index 07134fd6fd5d..c4355d9a85da 100644 --- a/src/tacacs/pam/0010-handle-bad-password-set-by-sshd.patch +++ b/src/tacacs/pam/0010-handle-bad-password-set-by-sshd.patch @@ -1,6 +1,6 @@ -From 36f67d58c39a5aceeec3182e381735c8a4a0a657 Mon Sep 17 00:00:00 2001 +From ed8b0366d3dbe137752fbb37a4b9fd1d46402d5b Mon Sep 17 00:00:00 2001 From: Renuka Manavalan -Date: Fri, 5 Nov 2021 17:43:10 +0000 +Date: Fri, 18 Feb 2022 22:27:39 +0000 Subject: [PATCH] handle bad password set by sshd --- @@ -11,7 +11,7 @@ Subject: [PATCH] handle bad password set by sshd 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/pam_tacplus.c b/pam_tacplus.c -index d57657a..eb53c94 100644 +index d57657a..38b6ee3 100644 --- a/pam_tacplus.c +++ b/pam_tacplus.c @@ -248,6 +248,13 @@ int pam_sm_authenticate (pam_handle_t * pamh, int flags, @@ -19,7 +19,7 @@ index d57657a..eb53c94 100644 } + if (validate_not_sshd_bad_pass(pass) != PAM_SUCCESS) { -+ syslog(LOG_ERR, "auth fail: Password incorrect"); ++ syslog(LOG_LOCAL0|LOG_ERR, "auth fail: Password incorrect. user: %s", user); + memset(pass, 0, strlen (pass)); + free(pass); + return PAM_AUTH_ERR; @@ -47,10 +47,10 @@ index d57657a..eb53c94 100644 pass = NULL; } diff --git a/support.c b/support.c -index 1ea2e30..8a7dfbb 100644 +index f056ec4..81f3466 100644 --- a/support.c +++ b/support.c -@@ -114,6 +114,43 @@ int converse(pam_handle_t * pamh, int nargs, const struct pam_message *message, +@@ -117,6 +117,43 @@ int converse(pam_handle_t * pamh, int nargs, const struct pam_message *message, return retval; } @@ -94,7 +94,7 @@ index 1ea2e30..8a7dfbb 100644 /* stolen from pam_stress */ int tacacs_get_password (pam_handle_t * pamh, int flags ,int ctrl, char **password) { -@@ -436,4 +473,4 @@ int _pam_parse (int argc, const char **argv) { +@@ -459,4 +496,4 @@ int _pam_parse (int argc, const char **argv) { } return ctrl; From 14921e39d1ec077d7c2ce9f8eb3853e6f6c68afc Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 8 Mar 2022 10:15:52 +0800 Subject: [PATCH 054/817] [Build][Ci]: Support to use the cisco sai packages built by azp (#10102) Why I did it Support to use the cisco sai packages built by azp --- .../official-build-cisco-8000.yml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.azure-pipelines/official-build-cisco-8000.yml b/.azure-pipelines/official-build-cisco-8000.yml index aeec64a848a1..61b6b03171e3 100644 --- a/.azure-pipelines/official-build-cisco-8000.yml +++ b/.azure-pipelines/official-build-cisco-8000.yml @@ -22,6 +22,11 @@ resources: name: Cisco-8000-sonic/platform-cisco-8000 endpoint: cisco-connection +variables: +- group: SONIC-AKV-STROAGE-1 +- name: StorageSASKey + value: $(sonicstorage-SasToken) + stages: - stage: Build pool: sonic @@ -29,6 +34,7 @@ stages: CACHE_MODE: wcache SKIP_CHECKOUT: true TERM: '' + PACKAGE_URL: "https://sonicstorage.blob.core.windows.net/packages" jobs: - template: azure-pipelines-build.yml @@ -60,5 +66,29 @@ stages: make PLATFORM=cisco-8000 platform/cisco-8000 tar xfz $(System.ArtifactsDirectory)/artifactory-*.tar.gz -C platform/cisco-8000 displayName: 'Setup cisco artifacts' + - script: | + set -ex + filename=$(find platform/cisco-8000/artifactory/sonic -name cisco-* -type f | head -n 1) + if [ -z "$filename" ]; then + echo "Cisco sai package not found" 1>&2 + exit 1 + fi + cd $(dirname $filename) + echo "PWD=$(pwd)" + ls -l *.deb + while read -r package; do + # Cisco version format: -sai--- + # The may contain several values in one build, the part is skipped when publishing to storage + # See https://github.com/Cisco-8000-sonic/sdk/blob/master/azure-pipelines.yml + # The $PACKAGE_URL is only accessible for AZP + version=$(echo $package | awk -F_ '{print $(NF-1)}' | cut -d- -f1,2,4,5) + package_url="$PACKAGE_URL/sai/ciscosai/master/$version/$package" + echo "Override package $package from $package_url" + wget "$package_url$StorageSASKey" -O "$package" + done < <(ls *.deb) + env: + StorageSASKey: $(StorageSASKey) + condition: ne(variables['Build.Reason'], 'PullRequest') + displayName: "Override cisco sai packages" jobGroups: - name: cisco-8000 From 29f6b01be634b731970b6b88f459721e168b4610 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Tue, 8 Mar 2022 15:48:04 +0800 Subject: [PATCH 055/817] [sonic-cfggen]: Fix generated deployment_id (#10154) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it Config db schema generated by minigraph can’t pass yang validation, deployment_id can’t be none for yang validation. How I did it Update minigraph.py, skip deployment_id with None value How to verify it Run UT for sonic-config-enginue. Run command 'sonic-cfggen -m tests/multi_npu_data/sample-minigraph-noportchannel.xml -p tests/multi_npu_data/sample_port_config-3.ini -n asic3 --print-data'. Signed-off-by: Gang Lv ganglv@microsoft.com --- src/sonic-config-engine/minigraph.py | 4 +- .../tests/t0-sample-deployment-id.xml | 347 ++++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 6 + 3 files changed, 356 insertions(+), 1 deletion(-) create mode 100644 src/sonic-config-engine/tests/t0-sample-deployment-id.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2d0e9ac0b66c..b4f1f3acbd7a 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1282,7 +1282,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results = {} results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn, - 'deployment_id': deployment_id, 'region': region, 'cloudtype': cloudtype, 'docker_routing_config_mode': docker_routing_config_mode, @@ -1293,6 +1292,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw } } + if deployment_id is not None: + results['DEVICE_METADATA']['localhost']['deployment_id'] = deployment_id + cluster = [devices[key] for key in devices if key.lower() == hostname.lower()][0].get('cluster', "") if cluster: results['DEVICE_METADATA']['localhost']['cluster'] = cluster diff --git a/src/sonic-config-engine/tests/t0-sample-deployment-id.xml b/src/sonic-config-engine/tests/t0-sample-deployment-id.xml new file mode 100644 index 000000000000..b6b47d979102 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-deployment-id.xml @@ -0,0 +1,347 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.1.0.32
+ BGPSLBPassive + 10.10.10.10/26;100.100.100.100/26 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 192.0.0.1;192.0.0.2 + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAcl + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index bf1221cab9ee..c75c53b7f626 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -23,6 +23,7 @@ def setUp(self): self.sample_graph_metadata = os.path.join(self.test_dir, 'simple-sample-graph-metadata.xml') self.sample_graph_pc_test = os.path.join(self.test_dir, 'pc-test-graph.xml') self.sample_graph_bgp_speaker = os.path.join(self.test_dir, 't0-sample-bgp-speaker.xml') + self.sample_graph_deployment_id = os.path.join(self.test_dir, 't0-sample-deployment-id.xml') self.sample_graph_voq = os.path.join(self.test_dir, 'sample-voq-graph.xml') self.sample_device_desc = os.path.join(self.test_dir, 'device.xml') self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') @@ -498,6 +499,11 @@ def test_minigraph_deployment_id(self): output = self.run_script(argument) self.assertEqual(output.strip(), "1") + def test_minigraph_deployment_id_null(self): + argument = '-m "' + self.sample_graph_deployment_id + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\']"' + output = self.run_script(argument) + self.assertNotIn('deployment_id', output.strip()) + def test_minigraph_ethernet_interfaces(self, **kwargs): graph_file = kwargs.get('graph_file', self.sample_graph_simple) argument = '-m "' + graph_file + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet8\']"' From f1d6d7ccce50ff2ea25307752ddaf44b2da9e082 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 8 Mar 2022 21:15:43 +0800 Subject: [PATCH 056/817] [Build]: Fix the bin image generated from raw image issue (#10083) Why I did it It is to fix the issue #10048 When building .raw image, for instance, target/sonic-broadcom.raw, it will generate a .bin image, target/sonic-broadcom.bin, as the intermediate file. The intermediate file is a build target which may contains different dependencies with the raw one. --- build_image.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build_image.sh b/build_image.sh index 871ba839a901..71351dbfe7e0 100755 --- a/build_image.sh +++ b/build_image.sh @@ -68,6 +68,8 @@ generate_kvm_image() generate_onie_installer_image() { + output_file=$OUTPUT_ONIE_IMAGE + [ -n "$1" ] && output_file=$1 # Copy platform-specific ONIE installer config files where onie-mk-demo.sh expects them rm -rf ./installer/x86_64/platforms/ mkdir -p ./installer/x86_64/platforms/ @@ -83,7 +85,7 @@ generate_onie_installer_image() ## Generate an ONIE installer image ## Note: Don't leave blank between lines. It is single line command. ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ - installer platform/$TARGET_MACHINE/platform.conf $OUTPUT_ONIE_IMAGE OS $IMAGE_VERSION $ONIE_IMAGE_PART_SIZE \ + installer platform/$TARGET_MACHINE/platform.conf $output_file OS $IMAGE_VERSION $ONIE_IMAGE_PART_SIZE \ $ONIE_INSTALLER_PAYLOAD } @@ -119,12 +121,13 @@ if [ "$IMAGE_TYPE" = "onie" ]; then elif [ "$IMAGE_TYPE" = "raw" ]; then echo "Build RAW image" + tmp_output_onie_image=${OUTPUT_ONIE_IMAGE}.tmp mkdir -p `dirname $OUTPUT_RAW_IMAGE` sudo rm -f $OUTPUT_RAW_IMAGE generate_device_list "./installer/$TARGET_PLATFORM/platforms_asic" - generate_onie_installer_image + generate_onie_installer_image "$tmp_output_onie_image" echo "Creating SONiC raw partition : $OUTPUT_RAW_IMAGE of size $RAW_IMAGE_DISK_SIZE MB" fallocate -l "$RAW_IMAGE_DISK_SIZE"M $OUTPUT_RAW_IMAGE @@ -135,8 +138,9 @@ elif [ "$IMAGE_TYPE" = "raw" ]; then ## Generate a partition dump that can be used to 'dd' in-lieu of using the onie-nos-installer ## Run the installer ## The 'build' install mode of the installer is used to generate this dump. - sudo chmod a+x $OUTPUT_ONIE_IMAGE - sudo ./$OUTPUT_ONIE_IMAGE + sudo chmod a+x $tmp_output_onie_image + sudo ./$tmp_output_onie_image + rm $tmp_output_onie_image [ -r $OUTPUT_RAW_IMAGE ] || { echo "Error : $OUTPUT_RAW_IMAGE not generated!" From d112e7cca9087d02892ada9d70bddcc5d5616c24 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Tue, 8 Mar 2022 05:56:42 -0800 Subject: [PATCH 057/817] [submodule] Update sonic-utilities (#10163) 47c243e [show][muxcable] fix the sudo access error for show muxcable metrics (#2083) f872516 [muxcable][show] enhance show mux status to show last switchover time (#2067) d440df7 [warmboot] Migrate 10G ports during warm-reboot on s6100 (#2064) 494c6d7 [counterpoll] Display the correct default poll interval for watermark counters (#2082) 499988e [show][config] add muxcable command line support for retrieve / reset ICMP packet loss data (#2046) 8b01d3e Remove the warning message appear when there are no ports on CONFIG DB (#2050) ed6e66e [GCU] Supporting Groupings during path-xpath translation (#2044) 25b3455 [ci] Use official build debian pkg instead and parameterize source branch (#2079) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index a9bbaf227316..47c243eb7e9c 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a9bbaf2273169ed9f4c764cc39e97708995e0fa3 +Subproject commit 47c243eb7e9cbe6ebd3479290a98183071cf2124 From bf5f9c29184d57070181bec8dd811f35277f63e0 Mon Sep 17 00:00:00 2001 From: Kostiantyn Yarovyi Date: Wed, 9 Mar 2022 06:27:08 +0200 Subject: [PATCH 058/817] [BFN] Update configuration files (#9913) * [Barefoot] update switch-tna-sai.conf file * remove deprecated conf files * [Barefoot] update switch-tna-sai.conf file for Accton wedge100bf_32qs platform * pdated switch-tna-sai.conf --- .../montara/switch-tna-sai.conf | 21 ++++++------ .../Arista-7170-32C-C32/switch-sai.conf | 33 ------------------ .../Arista-7170-32C-C32/switch-tna-sai.conf | 17 +++++----- .../Arista-7170-32CD-C32/switch-sai.conf | 33 ------------------ .../Arista-7170-32CD-C32/switch-tna-sai.conf | 17 +++++----- .../Arista-7170-64C/switch-sai.conf | 33 ------------------ .../Arista-7170-64C/switch-tna-sai.conf | 17 +++++----- .../Arista-7170-Q59S20/switch-sai.conf | 33 ------------------ .../Arista-7170-Q59S20/switch-tna-sai.conf | 17 +++++----- .../newport/switch-tna-sai.conf | 27 +++++++-------- .../montara/switch-sai.conf | 34 ------------------- .../montara/switch-tna-sai.conf | 21 ++++++------ .../mavericks/switch-sai.conf | 34 ------------------- .../mavericks/switch-tna-sai.conf | 21 ++++++------ .../INGRASYS-S9180-32X/switch-tna-sai.conf | 21 ++++++------ .../INGRASYS-S9280-64X/switch-tna-sai.conf | 21 ++++++------ .../OSW1800-48x6q/switch-tna-sai.conf | 21 ++++++------ 17 files changed, 105 insertions(+), 316 deletions(-) delete mode 100644 device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-sai.conf delete mode 100644 device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-sai.conf delete mode 100644 device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-sai.conf delete mode 100644 device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-sai.conf delete mode 100644 device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-sai.conf delete mode 100644 device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-sai.conf diff --git a/device/accton/x86_64-accton_wedge100bf_32qs-r0/montara/switch-tna-sai.conf b/device/accton/x86_64-accton_wedge100bf_32qs-r0/montara/switch-tna-sai.conf index 4a4d41f38066..8c34ef9d6a9a 100644 --- a/device/accton/x86_64-accton_wedge100bf_32qs-r0/montara/switch-tna-sai.conf +++ b/device/accton/x86_64-accton_wedge100bf_32qs-r0/montara/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-sai.conf b/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-sai.conf deleted file mode 100644 index 0a807b1c9ea7..000000000000 --- a/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-sai.conf +++ /dev/null @@ -1,33 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:1c.4/0000:07:00.0", - "pcie_domain": 0, - "pcie_bus": 7, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-tna-sai.conf index ece3fcbe6a90..dc8c82ce2546 100644 --- a/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_32c/Arista-7170-32C-C32/switch-tna-sai.conf @@ -1,16 +1,8 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, "sds_fw_path": "share/tofino_sds_fw/avago/firmware" } ], @@ -27,7 +19,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -35,5 +26,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-sai.conf b/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-sai.conf deleted file mode 100644 index 0a807b1c9ea7..000000000000 --- a/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-sai.conf +++ /dev/null @@ -1,33 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:1c.4/0000:07:00.0", - "pcie_domain": 0, - "pcie_bus": 7, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-tna-sai.conf index ece3fcbe6a90..dc8c82ce2546 100644 --- a/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_32cd/Arista-7170-32CD-C32/switch-tna-sai.conf @@ -1,16 +1,8 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, "sds_fw_path": "share/tofino_sds_fw/avago/firmware" } ], @@ -27,7 +19,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -35,5 +26,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-sai.conf deleted file mode 100644 index 0a807b1c9ea7..000000000000 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-sai.conf +++ /dev/null @@ -1,33 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:1c.4/0000:07:00.0", - "pcie_domain": 0, - "pcie_bus": 7, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf index ece3fcbe6a90..dc8c82ce2546 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf @@ -1,16 +1,8 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, "sds_fw_path": "share/tofino_sds_fw/avago/firmware" } ], @@ -27,7 +19,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -35,5 +26,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-sai.conf deleted file mode 100644 index 0a807b1c9ea7..000000000000 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-sai.conf +++ /dev/null @@ -1,33 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:1c.4/0000:07:00.0", - "pcie_domain": 0, - "pcie_bus": 7, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf index ece3fcbe6a90..dc8c82ce2546 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf @@ -1,16 +1,8 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, "sds_fw_path": "share/tofino_sds_fw/avago/firmware" } ], @@ -27,7 +19,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -35,5 +26,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf index cf6e445dba1a..2789eb0e2c0d 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino2", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -20,21 +12,28 @@ "agent0": "lib/platform/x86_64-accton_as9516bf_32d-r0/libpltfm_mgr.so", "p4_programs": [ { + "program-name": "switch", + "bfrt-config": "share/switch/bf-rt.json", "p4_pipelines": [ { "p4_pipeline_name": "pipe", "config": "share/switch/pipe/tofino2.bin", "context": "share/switch/pipe/context.json" } - ], - "program-name": "switch", - "sai": "lib/libsai.so", - "bfrt-config": "share/switch/bf-rt.json", + ], "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-sai.conf deleted file mode 100644 index fc224c9602e4..000000000000 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-sai.conf +++ /dev/null @@ -1,34 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "agent0": "lib/platform/x86_64-accton_wedge100bf_32x-r0/libpltfm_mgr.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf index 085a1b8dcdfc..dc6f78e0b1e7 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-sai.conf deleted file mode 100644 index 81a7d7bc28c3..000000000000 --- a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-sai.conf +++ /dev/null @@ -1,34 +0,0 @@ -{ - "chip_list": [ - { - "id": "asic-0", - "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" - } - ], - "instance": 0, - "p4_program_list": [ - { - "id": "pgm-0", - "instance": 0, - "path": "switch", - "program-name": "switch", - "pd": "lib/tofinopd/switch/libpd.so", - "pd-thrift": "lib/tofinopd/switch/libpdthrift.so", - "table-config": "share/tofinopd/switch/context.json", - "tofino-bin": "share/tofinopd/switch/tofino.bin", - "switchapi": "lib/libswitchapi.so", - "sai": "lib/libsai.so", - "agent0": "lib/platform/x86_64-accton_wedge100bf_65x-r0/libpltfm_mgr.so", - "switchapi_port_add": false, - "non_default_port_ppgs": 5 - } - ] -} diff --git a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf index ddcb9d4ba287..e07192619af0 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf +++ b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf b/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf index 9fbf9d3cdb69..193dcde96bcf 100644 --- a/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf +++ b/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf b/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf index 4895ac901ff6..2425102e2319 100644 --- a/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf +++ b/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } diff --git a/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf b/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf index 7cb3ddc48fc9..03b0924d4339 100644 --- a/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf +++ b/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf @@ -1,17 +1,9 @@ { - "instance": 0, "chip_list": [ { - "id": "asic-0", "chip_family": "Tofino", - "instance": 0, - "pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0", - "pcie_domain": 0, - "pcie_bus": 5, - "pcie_fn": 0, - "pcie_dev": 0, - "pcie_int_mode": 1, - "sds_fw_path": "share/tofino_sds_fw/avago/firmware" + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 } ], "p4_devices": [ @@ -28,7 +20,6 @@ } ], "program-name": "switch", - "sai": "lib/libsai.so", "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, @@ -36,5 +27,13 @@ } ] } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } ] } From 3fa18d18d4c06fe38164ebfefdc3187820fc7496 Mon Sep 17 00:00:00 2001 From: Oleksandr Kozodoi Date: Wed, 9 Mar 2022 06:28:01 +0200 Subject: [PATCH 059/817] Add necessary changes for python3 virtual environment of sonic-mgmt docker container (#9277) This PR includes necessary changes for the setup of the Python3 virtual environment in the sonic-mgmt docker container. How to activate Python3 virtual environment? Connect to the sonic-mgmt container $ docker exec -ti sonic-mgmt bash Activate the virtual environment $ source /var/user/env-python3/bin/activate Why I did it Migration of sonic-mgmt codebase from Python 2 to Python 3 How I did it Added all necessary dependencies to the env-python3 virtual environment. Signed-off-by: Oleksandr Kozodoi --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 67 ++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 67486f74bbb5..e2054ae81ba1 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -177,7 +177,6 @@ RUN python -m virtualenv --system-site-packages env-201811 RUN env-201811/bin/pip install cryptography==3.3.2 ansible==2.0.0.2 RUN python3 -m venv env-python3 -RUN env-python3/bin/pip3 install cryptography==3.3.2 azure-kusto-data azure-kusto-ingest defusedxml pytest aiohttp # NOTE: There is an ordering dependency for pycryptodome. Leaving this at # the end until we figure that out. @@ -186,3 +185,69 @@ RUN pip install pycryptodome==3.9.8 # Install allure-pytest library RUN pip install --upgrade setuptools \ && pip install allure-pytest==2.8.22 + +# Activating a virtualenv. The virtualenv automatically works for RUN, ENV and CMD. +ENV VIRTUAL_ENV=env-python3 +ARG BACKUP_OF_PATH="$PATH" +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 PYTHONIOENCODING=UTF-8 + +RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 + +RUN python3 -m pip install setuptools-rust \ + aiohttp \ + defusedxml \ + azure-kusto-ingest \ + azure-kusto-data \ + cffi \ + contextlib2==0.6.0.post1 \ + cryptography==3.3.2 \ + "future>=0.16.0" \ + gitpython \ + ipaddr \ + ipython==5.4.1 \ + ixnetwork-restpy==1.0.64 \ + ixnetwork-open-traffic-generator==0.0.79 \ + snappi[ixnetwork,convergence]==0.5.11 \ + jinja2==2.7.2 \ + jsonpatch \ + lxml \ + natsort \ + netaddr \ + netmiko==2.4.2 \ + paramiko==2.7.1 \ + passlib \ + pexpect \ + prettytable \ + psutil \ + pyasn1==0.4.8 \ + pyfiglet \ + pylint==1.8.1 \ + pyro4 \ + pysnmp==4.4.12 \ + pytest-repeat \ + pytest-html \ + pytest-xdist==1.28.0 \ + pytest \ + redis \ + requests \ + rpyc \ + six \ + tabulate \ + textfsm \ + virtualenv \ + wheel==0.33.6 \ + pysubnettree \ + nnpy \ + dpkt \ + pycryptodome==3.9.8 \ + ansible==2.8.12 \ + pytest-ansible \ + allure-pytest==2.8.22 \ + retry \ + thrift==0.11.0 \ + ptf + +# Deactivating a virtualenv. +ENV PATH="$BACKUP_OF_PATH" From 01798447ab878ee3343fb0be8ad44a47758bbc4d Mon Sep 17 00:00:00 2001 From: Song Yuan <64041228+ysmanman@users.noreply.github.com> Date: Wed, 9 Mar 2022 16:04:36 -0800 Subject: [PATCH 060/817] [Chassis][QoS template] Skip configuring buffer and QoS config on recirc ports (#7869) * Added test case to verify the template changes. --- files/build_templates/buffers_config.j2 | 4 +- files/build_templates/qos_config.j2 | 4 +- ...le-arista-7800r3-48cq2-lc-t2-minigraph.xml | 2786 +++++++++++++++++ .../py2/buffer-arista7800r3-48cq2-lc.json | 590 ++++ .../py2/qos-arista7800r3-48cq2-lc.json | 1487 +++++++++ .../py3/buffer-arista7800r3-48cq2-lc.json | 590 ++++ .../py3/qos-arista7800r3-48cq2-lc.json | 1487 +++++++++ src/sonic-config-engine/tests/test_j2files.py | 25 + 8 files changed, 6971 insertions(+), 2 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample-arista-7800r3-48cq2-lc-t2-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json create mode 100644 src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index cb64cd3d4335..a67316af5f3d 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -101,7 +101,9 @@ def {%- endif %} {%- else %} {%- for port in PORT %} - {%- if PORT_ALL.append(port) %}{%- endif %} + {%- if not port.startswith('Ethernet-Rec') and not port.startswith('Ethernet-IB') %} + {%- if PORT_ALL.append(port) %}{%- endif %} + {%- endif %} {%- endfor %} {%- endif %} diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 6748cd99be9d..2a01e470fde8 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -1,6 +1,8 @@ {%- set PORT_ALL = [] %} {%- for port in PORT %} - {%- if PORT_ALL.append(port) %}{% endif %} + {%- if not port.startswith('Ethernet-Rec') and not port.startswith('Ethernet-IB') %} + {%- if PORT_ALL.append(port) %}{% endif %} + {%- endif %} {%- endfor %} {%- if PORT_ALL | sort_by_port_index %}{% endif %} diff --git a/src/sonic-config-engine/tests/sample-arista-7800r3-48cq2-lc-t2-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7800r3-48cq2-lc-t2-minigraph.xml new file mode 100644 index 000000000000..f2332c5cacd5 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7800r3-48cq2-lc-t2-minigraph.xml @@ -0,0 +1,2786 @@ + + + + + + dut-lc4 + 1.1.1.3 + dut-lc3 + 1.1.1.1 + true + + + dut-lc5 + 1.1.1.5 + dut-lc3 + 1.1.1.1 + true + + + + + 65001 + dut-lc4 + + + + + + 65001 + dut-lc5 + + + + + + 65001 + dut-lc3 + + +
1.1.1.1
+ + +
+ +
1.1.1.1
+ + +
+
+ +
+
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.1/32 + + 10.1.0.1/32 + + + HostIP + Loopback0 + + FC00:10::1/128 + + FC00:10::1/128 + + + + + ManagementIP1 + eth0 + 10.240.76.57/25 + + + ManagementIP2 + eth0 + fdfd:5c41:712d:e049::af0:4c39/64 + + + + + Ethernet-IB0 + port + 1.1.1.1/32 + + + Ethernet-IB0 + port + fc00:3000::1/128 + + + + + + dut-lc3 + + + + + + + IPInterface + + Ethernet1/1 + 10.0.0.2/31 + + + IPInterface + + Ethernet10/1 + 10.0.0.4/31 + + + IPInterface + + Ethernet11/1 + 10.0.0.6/31 + + + IPInterface + + Ethernet12/1 + 10.0.0.8/31 + + + IPInterface + + Ethernet13/1 + 10.0.0.10/31 + + + IPInterface + + Ethernet14/1 + 10.0.0.12/31 + + + IPInterface + + Ethernet15/1 + 10.0.0.14/31 + + + IPInterface + + Ethernet16/1 + 10.0.0.16/31 + + + IPInterface + + Ethernet17/1 + 10.0.0.18/31 + + + IPInterface + + Ethernet18/1 + 10.0.0.20/31 + + + IPInterface + + Ethernet19/1 + 10.0.0.22/31 + + + IPInterface + + Ethernet2/1 + 10.0.0.24/31 + + + IPInterface + + Ethernet20/1 + 10.0.0.26/31 + + + IPInterface + + Ethernet21/1 + 10.0.0.28/31 + + + IPInterface + + Ethernet22/1 + 10.0.0.30/31 + + + IPInterface + + Ethernet23/1 + 10.0.0.32/31 + + + IPInterface + + Ethernet24/1 + 10.0.0.34/31 + + + IPInterface + + Ethernet25/1 + 10.0.0.36/31 + + + IPInterface + + Ethernet26/1 + 10.0.0.38/31 + + + IPInterface + + Ethernet27/1 + 10.0.0.40/31 + + + IPInterface + + Ethernet28/1 + 10.0.0.42/31 + + + IPInterface + + Ethernet29/1 + 10.0.0.44/31 + + + IPInterface + + Ethernet3/1 + 10.0.0.46/31 + + + IPInterface + + Ethernet30/1 + 10.0.0.48/31 + + + IPInterface + + Ethernet31/1 + 10.0.0.50/31 + + + IPInterface + + Ethernet32/1 + 10.0.0.52/31 + + + IPInterface + + Ethernet33/1 + 10.0.0.54/31 + + + IPInterface + + Ethernet34/1 + 10.0.0.56/31 + + + IPInterface + + Ethernet35/1 + 10.0.0.58/31 + + + IPInterface + + Ethernet36/1 + 10.0.0.60/31 + + + IPInterface + + Ethernet37/1 + 10.0.0.62/31 + + + IPInterface + + Ethernet38/1 + 10.0.0.64/31 + + + IPInterface + + Ethernet39/1 + 10.0.0.66/31 + + + IPInterface + + Ethernet4/1 + 10.0.0.68/31 + + + IPInterface + + Ethernet40/1 + 10.0.0.70/31 + + + IPInterface + + Ethernet42/1 + 10.0.0.72/31 + + + IPInterface + + Ethernet45/1 + 10.0.0.74/31 + + + IPInterface + + Ethernet46/1 + 10.0.0.76/31 + + + IPInterface + + Ethernet47/1 + 10.0.0.78/31 + + + IPInterface + + Ethernet48/1 + 10.0.0.80/31 + + + IPInterface + + Ethernet5/1 + 10.0.0.82/31 + + + IPInterface + + Ethernet6/1 + 10.0.0.84/31 + + + IPInterface + + Ethernet7/1 + 10.0.0.86/31 + + + IPInterface + + Ethernet8/1 + 10.0.0.88/31 + + + IPInterface + + Ethernet9/1 + 10.0.0.90/31 + + + IPInterface + + Ethernet-Rec0 + 10.0.0.92/31 + + + IPInterface + + Ethernet-IB0 + 1.1.1.1/32 + + + + + + + + + + + + DeviceInterfaceLink + 100000 + nvm473 + Ethernet180 + dut-lc3 + Ethernet0 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet20 + dut-lc3 + Ethernet36 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet24 + dut-lc3 + Ethernet40 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet28 + dut-lc3 + Ethernet44 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet32 + dut-lc3 + Ethernet48 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet40 + dut-lc3 + Ethernet52 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet36 + dut-lc3 + Ethernet56 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet44 + dut-lc3 + Ethernet60 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet132 + dut-lc3 + Ethernet64 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet128 + dut-lc3 + Ethernet68 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet136 + dut-lc3 + Ethernet72 + + + DeviceInterfaceLink + 100000 + nvm473 + Ethernet176 + dut-lc3 + Ethernet4 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet140 + dut-lc3 + Ethernet76 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet144 + dut-lc3 + Ethernet80 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet148 + dut-lc3 + Ethernet84 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet152 + dut-lc3 + Ethernet88 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet156 + dut-lc3 + Ethernet92 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet64 + dut-lc3 + Ethernet96 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet68 + dut-lc3 + Ethernet100 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet72 + dut-lc3 + Ethernet104 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet76 + dut-lc3 + Ethernet108 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet80 + dut-lc3 + Ethernet112 + + + DeviceInterfaceLink + 100000 + nvm473 + Ethernet188 + dut-lc3 + Ethernet8 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet84 + dut-lc3 + Ethernet116 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet88 + dut-lc3 + Ethernet120 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet92 + dut-lc3 + Ethernet124 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet96 + dut-lc3 + Ethernet128 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet100 + dut-lc3 + Ethernet132 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet104 + dut-lc3 + Ethernet136 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet108 + dut-lc3 + Ethernet140 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet240 + dut-lc3 + Ethernet144 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet244 + dut-lc3 + Ethernet148 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet248 + dut-lc3 + Ethernet152 + + + DeviceInterfaceLink + 100000 + nvm473 + Ethernet184 + dut-lc3 + Ethernet12 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet252 + dut-lc3 + Ethernet156 + + + DeviceInterfaceLink + 100000 + nvm473 + Ethernet192 + dut-lc3 + Ethernet164 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet112 + dut-lc3 + Ethernet176 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet116 + dut-lc3 + Ethernet180 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet120 + dut-lc3 + Ethernet184 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet124 + dut-lc3 + Ethernet188 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet0 + dut-lc3 + Ethernet16 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet4 + dut-lc3 + Ethernet20 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet8 + dut-lc3 + Ethernet24 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet12 + dut-lc3 + Ethernet28 + + + DeviceInterfaceLink + 100000 + nv338 + Ethernet16 + dut-lc3 + Ethernet32 + + + + + dut-lc3 + Arista-7800R3-48CQ2-C48 + + + + + + + dut-lc3 + + + ForcedMgmtRoutes + + 172.16.0.0/12;10.80.0.0/12;10.64.0.0/14;10.240.0.0/13 + + ForcedMgmtRoutes + + FD7A:629F:52A4::/48;FDFD:5C41:712D::/48 + + + SwitchId + + 0 + + + NtpResources + time.aristanetworks.com + + + SwitchType + + voq + + + MaxCores + + 16 + + + SubRole + + + + + + + + + + + Arista-7800R3-48CQ2-C48 + + + Ethernet1/1 + eth1/1-connected-to-nvm473@eth46/1 + 100000 + rs + + + Ethernet10/1 + eth10/1-connected-to-nv338@eth6/1 + 100000 + rs + + + Ethernet11/1 + eth11/1-connected-to-nv338@eth7/1 + 100000 + rs + + + Ethernet12/1 + eth12/1-connected-to-nv338@eth8/1 + 100000 + rs + + + Ethernet13/1 + eth13/1-connected-to-nv338@eth9/1 + 100000 + rs + + + Ethernet14/1 + eth14/1-connected-to-nv338@eth11/1 + 100000 + rs + + + Ethernet15/1 + eth15/1-connected-to-nv338@eth10/1 + 100000 + rs + + + Ethernet16/1 + eth16/1-connected-to-nv338@eth12/1 + 100000 + rs + + + Ethernet17/1 + eth17/1-connected-to-nv338@eth34/1 + 100000 + rs + + + Ethernet18/1 + eth18/1-connected-to-nv338@eth33/1 + 100000 + rs + + + Ethernet19/1 + eth19/1-connected-to-nv338@eth35/1 + 100000 + rs + + + Ethernet2/1 + eth2/1-connected-to-nvm473@eth45/1 + 100000 + rs + + + Ethernet20/1 + eth20/1-connected-to-nv338@eth36/1 + 100000 + rs + + + Ethernet21/1 + eth21/1-connected-to-nv338@eth37/1 + 100000 + rs + + + Ethernet22/1 + eth22/1-connected-to-nv338@eth38/1 + 100000 + none + + + Ethernet23/1 + eth23/1-connected-to-nv338@eth39/1 + 100000 + none + + + Ethernet24/1 + eth24/1-connected-to-nv338@eth40/1 + 100000 + none + + + Ethernet25/1 + eth25/1-connected-to-nv338@eth17/1 + 100000 + none + + + Ethernet26/1 + eth26/1-connected-to-nv338@eth18/1 + 100000 + none + + + Ethernet27/1 + eth27/1-connected-to-nv338@eth19/1 + 100000 + none + + + Ethernet28/1 + eth28/1-connected-to-nv338@eth20/1 + 100000 + rs + + + Ethernet29/1 + eth29/1-connected-to-nv338@eth21/1 + 100000 + rs + + + Ethernet3/1 + eth3/1-connected-to-nvm473@eth48/1 + 100000 + rs + + + Ethernet30/1 + eth30/1-connected-to-nv338@eth22/1 + 100000 + rs + + + Ethernet31/1 + eth31/1-connected-to-nv338@eth23/1 + 100000 + rs + + + Ethernet32/1 + eth32/1-connected-to-nv338@eth24/1 + 100000 + rs + + + Ethernet33/1 + eth33/1-connected-to-nv338@eth25/1 + 100000 + rs + + + Ethernet34/1 + eth34/1-connected-to-nv338@eth26/1 + 100000 + rs + + + Ethernet35/1 + eth35/1-connected-to-nv338@eth27/1 + 100000 + rs + + + Ethernet36/1 + eth36/1-connected-to-nv338@eth28/1 + 100000 + rs + + + Ethernet37/1 + eth37/1-connected-to-nv338@eth61/1 + 100000 + rs + + + Ethernet38/1 + eth38/1-connected-to-nv338@eth62/1 + 100000 + rs + + + Ethernet39/1 + eth39/1-connected-to-nv338@eth63/1 + 100000 + rs + + + Ethernet4/1 + eth4/1-connected-to-nvm473@eth47/1 + 100000 + rs + + + Ethernet40/1 + eth40/1-connected-to-nv338@eth64/1 + 100000 + rs + + + Ethernet42/1 + eth42/1-connected-to-nvm473@eth49/1 + 100000 + rs + + + Ethernet45/1 + eth45/1-connected-to-nv338@eth29/1 + 100000 + rs + + + Ethernet46/1 + eth46/1-connected-to-nv338@eth30/1 + 100000 + rs + + + Ethernet47/1 + eth47/1-connected-to-nv338@eth31/1 + 100000 + rs + + + Ethernet48/1 + eth48/1-connected-to-nv338@eth32/1 + 100000 + rs + + + Ethernet5/1 + eth5/1-connected-to-nv338@eth1/1 + 100000 + rs + + + Ethernet6/1 + eth6/1-connected-to-nv338@eth2/1 + 100000 + rs + + + Ethernet7/1 + eth7/1-connected-to-nv338@eth3/1 + 100000 + rs + + + Ethernet8/1 + eth8/1-connected-to-nv338@eth4/1 + 100000 + rs + + + Ethernet9/1 + eth9/1-connected-to-nv338@eth5/1 + 100000 + rs + + + + + eth0 + eth0 + 1000 + + + eth0 + eth0 + 1000 + + + + + Cpu0 + dut-lc3 + Asic0 + 10000 + 1 + 0 + 0 + 0 + 8 + + + Ethernet0 + dut-lc3 + Asic0 + 100000 + 2 + 0 + 0 + 1 + 8 + + + Ethernet4 + dut-lc3 + Asic0 + 100000 + 3 + 0 + 0 + 2 + 8 + + + Ethernet8 + dut-lc3 + Asic0 + 100000 + 4 + 0 + 0 + 3 + 8 + + + Ethernet12 + dut-lc3 + Asic0 + 100000 + 5 + 0 + 0 + 4 + 8 + + + Ethernet16 + dut-lc3 + Asic0 + 100000 + 6 + 0 + 0 + 5 + 8 + + + Ethernet20 + dut-lc3 + Asic0 + 100000 + 7 + 0 + 0 + 6 + 8 + + + Ethernet24 + dut-lc3 + Asic0 + 100000 + 8 + 0 + 0 + 7 + 8 + + + Ethernet28 + dut-lc3 + Asic0 + 100000 + 9 + 0 + 0 + 8 + 8 + + + Ethernet32 + dut-lc3 + Asic0 + 100000 + 10 + 0 + 0 + 9 + 8 + + + Ethernet36 + dut-lc3 + Asic0 + 100000 + 11 + 0 + 0 + 10 + 8 + + + Ethernet40 + dut-lc3 + Asic0 + 100000 + 12 + 0 + 0 + 11 + 8 + + + Ethernet44 + dut-lc3 + Asic0 + 100000 + 13 + 0 + 0 + 12 + 8 + + + Ethernet48 + dut-lc3 + Asic0 + 100000 + 14 + 0 + 0 + 13 + 8 + + + Ethernet52 + dut-lc3 + Asic0 + 100000 + 15 + 0 + 0 + 14 + 8 + + + Ethernet56 + dut-lc3 + Asic0 + 100000 + 16 + 0 + 0 + 15 + 8 + + + Ethernet60 + dut-lc3 + Asic0 + 100000 + 17 + 0 + 0 + 16 + 8 + + + Ethernet64 + dut-lc3 + Asic0 + 100000 + 18 + 0 + 0 + 17 + 8 + + + Ethernet68 + dut-lc3 + Asic0 + 100000 + 19 + 0 + 0 + 18 + 8 + + + Ethernet72 + dut-lc3 + Asic0 + 100000 + 20 + 0 + 0 + 19 + 8 + + + Ethernet76 + dut-lc3 + Asic0 + 100000 + 21 + 0 + 0 + 20 + 8 + + + Ethernet80 + dut-lc3 + Asic0 + 100000 + 22 + 0 + 0 + 21 + 8 + + + Ethernet84 + dut-lc3 + Asic0 + 100000 + 23 + 0 + 0 + 22 + 8 + + + Ethernet88 + dut-lc3 + Asic0 + 100000 + 24 + 0 + 0 + 23 + 8 + + + Ethernet92 + dut-lc3 + Asic0 + 100000 + 25 + 0 + 0 + 24 + 8 + + + Ethernet96 + dut-lc3 + Asic0 + 100000 + 26 + 0 + 1 + 25 + 8 + + + Ethernet100 + dut-lc3 + Asic0 + 100000 + 27 + 0 + 1 + 26 + 8 + + + Ethernet104 + dut-lc3 + Asic0 + 100000 + 28 + 0 + 1 + 27 + 8 + + + Ethernet108 + dut-lc3 + Asic0 + 100000 + 29 + 0 + 1 + 28 + 8 + + + Ethernet112 + dut-lc3 + Asic0 + 100000 + 30 + 0 + 1 + 29 + 8 + + + Ethernet116 + dut-lc3 + Asic0 + 100000 + 31 + 0 + 1 + 30 + 8 + + + Ethernet120 + dut-lc3 + Asic0 + 100000 + 32 + 0 + 1 + 31 + 8 + + + Ethernet124 + dut-lc3 + Asic0 + 100000 + 33 + 0 + 1 + 32 + 8 + + + Ethernet128 + dut-lc3 + Asic0 + 100000 + 34 + 0 + 1 + 33 + 8 + + + Ethernet132 + dut-lc3 + Asic0 + 100000 + 35 + 0 + 1 + 34 + 8 + + + Ethernet136 + dut-lc3 + Asic0 + 100000 + 36 + 0 + 1 + 35 + 8 + + + Ethernet140 + dut-lc3 + Asic0 + 100000 + 37 + 0 + 1 + 36 + 8 + + + Ethernet144 + dut-lc3 + Asic0 + 100000 + 38 + 0 + 1 + 37 + 8 + + + Ethernet148 + dut-lc3 + Asic0 + 100000 + 39 + 0 + 1 + 38 + 8 + + + Ethernet152 + dut-lc3 + Asic0 + 100000 + 40 + 0 + 1 + 39 + 8 + + + Ethernet156 + dut-lc3 + Asic0 + 100000 + 41 + 0 + 1 + 40 + 8 + + + Ethernet160 + dut-lc3 + Asic0 + 100000 + 42 + 0 + 1 + 41 + 8 + + + Ethernet164 + dut-lc3 + Asic0 + 100000 + 43 + 0 + 1 + 42 + 8 + + + Ethernet168 + dut-lc3 + Asic0 + 100000 + 44 + 0 + 1 + 43 + 8 + + + Ethernet172 + dut-lc3 + Asic0 + 100000 + 45 + 0 + 1 + 44 + 8 + + + Ethernet176 + dut-lc3 + Asic0 + 100000 + 46 + 0 + 1 + 45 + 8 + + + Ethernet180 + dut-lc3 + Asic0 + 100000 + 47 + 0 + 1 + 46 + 8 + + + Ethernet184 + dut-lc3 + Asic0 + 100000 + 48 + 0 + 1 + 47 + 8 + + + Ethernet188 + dut-lc3 + Asic0 + 100000 + 49 + 0 + 1 + 48 + 8 + + + Ethernet-Rec0 + dut-lc3 + Asic0 + 400000 + 50 + 0 + 0 + 221 + 8 + + + Ethernet-IB0 + dut-lc3 + Asic0 + 400000 + 51 + 0 + 1 + 222 + 8 + + + Cpu0 + dut-lc4 + Asic0 + 10000 + 52 + 2 + 0 + 0 + 8 + + + Ethernet0 + dut-lc4 + Asic0 + 100000 + 53 + 2 + 0 + 1 + 8 + + + Ethernet4 + dut-lc4 + Asic0 + 100000 + 54 + 2 + 0 + 2 + 8 + + + Ethernet8 + dut-lc4 + Asic0 + 100000 + 55 + 2 + 0 + 3 + 8 + + + Ethernet12 + dut-lc4 + Asic0 + 100000 + 56 + 2 + 0 + 4 + 8 + + + Ethernet16 + dut-lc4 + Asic0 + 100000 + 57 + 2 + 0 + 5 + 8 + + + Ethernet20 + dut-lc4 + Asic0 + 100000 + 58 + 2 + 0 + 6 + 8 + + + Ethernet24 + dut-lc4 + Asic0 + 100000 + 59 + 2 + 0 + 7 + 8 + + + Ethernet28 + dut-lc4 + Asic0 + 100000 + 60 + 2 + 0 + 8 + 8 + + + Ethernet32 + dut-lc4 + Asic0 + 100000 + 61 + 2 + 0 + 9 + 8 + + + Ethernet36 + dut-lc4 + Asic0 + 100000 + 62 + 2 + 0 + 10 + 8 + + + Ethernet40 + dut-lc4 + Asic0 + 100000 + 63 + 2 + 0 + 11 + 8 + + + Ethernet44 + dut-lc4 + Asic0 + 100000 + 64 + 2 + 0 + 12 + 8 + + + Ethernet48 + dut-lc4 + Asic0 + 100000 + 65 + 2 + 0 + 13 + 8 + + + Ethernet52 + dut-lc4 + Asic0 + 100000 + 66 + 2 + 0 + 14 + 8 + + + Ethernet56 + dut-lc4 + Asic0 + 100000 + 67 + 2 + 0 + 15 + 8 + + + Ethernet60 + dut-lc4 + Asic0 + 100000 + 68 + 2 + 0 + 16 + 8 + + + Ethernet64 + dut-lc4 + Asic0 + 100000 + 69 + 2 + 0 + 17 + 8 + + + Ethernet68 + dut-lc4 + Asic0 + 100000 + 70 + 2 + 0 + 18 + 8 + + + Ethernet72 + dut-lc4 + Asic0 + 100000 + 71 + 2 + 0 + 19 + 8 + + + Ethernet76 + dut-lc4 + Asic0 + 100000 + 72 + 2 + 0 + 20 + 8 + + + Ethernet80 + dut-lc4 + Asic0 + 100000 + 73 + 2 + 0 + 21 + 8 + + + Ethernet84 + dut-lc4 + Asic0 + 100000 + 74 + 2 + 0 + 22 + 8 + + + Ethernet88 + dut-lc4 + Asic0 + 100000 + 75 + 2 + 0 + 23 + 8 + + + Ethernet92 + dut-lc4 + Asic0 + 100000 + 76 + 2 + 0 + 24 + 8 + + + Ethernet96 + dut-lc4 + Asic0 + 100000 + 77 + 2 + 1 + 25 + 8 + + + Ethernet100 + dut-lc4 + Asic0 + 100000 + 78 + 2 + 1 + 26 + 8 + + + Ethernet104 + dut-lc4 + Asic0 + 100000 + 79 + 2 + 1 + 27 + 8 + + + Ethernet108 + dut-lc4 + Asic0 + 100000 + 80 + 2 + 1 + 28 + 8 + + + Ethernet112 + dut-lc4 + Asic0 + 100000 + 81 + 2 + 1 + 29 + 8 + + + Ethernet116 + dut-lc4 + Asic0 + 100000 + 82 + 2 + 1 + 30 + 8 + + + Ethernet120 + dut-lc4 + Asic0 + 100000 + 83 + 2 + 1 + 31 + 8 + + + Ethernet124 + dut-lc4 + Asic0 + 100000 + 84 + 2 + 1 + 32 + 8 + + + Ethernet128 + dut-lc4 + Asic0 + 100000 + 85 + 2 + 1 + 33 + 8 + + + Ethernet132 + dut-lc4 + Asic0 + 100000 + 86 + 2 + 1 + 34 + 8 + + + Ethernet136 + dut-lc4 + Asic0 + 100000 + 87 + 2 + 1 + 35 + 8 + + + Ethernet140 + dut-lc4 + Asic0 + 100000 + 88 + 2 + 1 + 36 + 8 + + + Ethernet144 + dut-lc4 + Asic0 + 100000 + 89 + 2 + 1 + 37 + 8 + + + Ethernet148 + dut-lc4 + Asic0 + 100000 + 90 + 2 + 1 + 38 + 8 + + + Ethernet152 + dut-lc4 + Asic0 + 100000 + 91 + 2 + 1 + 39 + 8 + + + Ethernet156 + dut-lc4 + Asic0 + 100000 + 92 + 2 + 1 + 40 + 8 + + + Ethernet160 + dut-lc4 + Asic0 + 100000 + 93 + 2 + 1 + 41 + 8 + + + Ethernet164 + dut-lc4 + Asic0 + 100000 + 94 + 2 + 1 + 42 + 8 + + + Ethernet168 + dut-lc4 + Asic0 + 100000 + 95 + 2 + 1 + 43 + 8 + + + Ethernet172 + dut-lc4 + Asic0 + 100000 + 96 + 2 + 1 + 44 + 8 + + + Ethernet176 + dut-lc4 + Asic0 + 100000 + 97 + 2 + 1 + 45 + 8 + + + Ethernet180 + dut-lc4 + Asic0 + 100000 + 98 + 2 + 1 + 46 + 8 + + + Ethernet184 + dut-lc4 + Asic0 + 100000 + 99 + 2 + 1 + 47 + 8 + + + Ethernet188 + dut-lc4 + Asic0 + 100000 + 100 + 2 + 1 + 48 + 8 + + + Ethernet-Rec0 + dut-lc4 + Asic0 + 400000 + 101 + 2 + 0 + 221 + 8 + + + Ethernet-IB0 + dut-lc4 + Asic0 + 400000 + 102 + 2 + 1 + 222 + 8 + + + Cpu0 + dut-lc5 + Asic0 + 10000 + 103 + 4 + 0 + 0 + 8 + + + Ethernet0 + dut-lc5 + Asic0 + 100000 + 104 + 4 + 0 + 1 + 8 + + + Ethernet4 + dut-lc5 + Asic0 + 100000 + 105 + 4 + 0 + 2 + 8 + + + Ethernet8 + dut-lc5 + Asic0 + 100000 + 106 + 4 + 0 + 3 + 8 + + + Ethernet12 + dut-lc5 + Asic0 + 100000 + 107 + 4 + 0 + 4 + 8 + + + Ethernet16 + dut-lc5 + Asic0 + 100000 + 108 + 4 + 0 + 5 + 8 + + + Ethernet20 + dut-lc5 + Asic0 + 100000 + 109 + 4 + 0 + 6 + 8 + + + Ethernet24 + dut-lc5 + Asic0 + 100000 + 110 + 4 + 0 + 7 + 8 + + + Ethernet28 + dut-lc5 + Asic0 + 100000 + 111 + 4 + 0 + 8 + 8 + + + Ethernet32 + dut-lc5 + Asic0 + 100000 + 112 + 4 + 0 + 9 + 8 + + + Ethernet36 + dut-lc5 + Asic0 + 100000 + 113 + 4 + 0 + 10 + 8 + + + Ethernet40 + dut-lc5 + Asic0 + 100000 + 114 + 4 + 0 + 11 + 8 + + + Ethernet44 + dut-lc5 + Asic0 + 100000 + 115 + 4 + 0 + 12 + 8 + + + Ethernet48 + dut-lc5 + Asic0 + 100000 + 116 + 4 + 0 + 13 + 8 + + + Ethernet52 + dut-lc5 + Asic0 + 100000 + 117 + 4 + 0 + 14 + 8 + + + Ethernet56 + dut-lc5 + Asic0 + 100000 + 118 + 4 + 0 + 15 + 8 + + + Ethernet60 + dut-lc5 + Asic0 + 100000 + 119 + 4 + 0 + 16 + 8 + + + Ethernet64 + dut-lc5 + Asic0 + 100000 + 120 + 4 + 0 + 17 + 8 + + + Ethernet68 + dut-lc5 + Asic0 + 100000 + 121 + 4 + 0 + 18 + 8 + + + Ethernet72 + dut-lc5 + Asic0 + 100000 + 122 + 4 + 0 + 19 + 8 + + + Ethernet76 + dut-lc5 + Asic0 + 100000 + 123 + 4 + 0 + 20 + 8 + + + Ethernet80 + dut-lc5 + Asic0 + 100000 + 124 + 4 + 0 + 21 + 8 + + + Ethernet84 + dut-lc5 + Asic0 + 100000 + 125 + 4 + 0 + 22 + 8 + + + Ethernet88 + dut-lc5 + Asic0 + 100000 + 126 + 4 + 0 + 23 + 8 + + + Ethernet92 + dut-lc5 + Asic0 + 100000 + 127 + 4 + 0 + 24 + 8 + + + Ethernet96 + dut-lc5 + Asic0 + 100000 + 128 + 4 + 1 + 25 + 8 + + + Ethernet100 + dut-lc5 + Asic0 + 100000 + 129 + 4 + 1 + 26 + 8 + + + Ethernet104 + dut-lc5 + Asic0 + 100000 + 130 + 4 + 1 + 27 + 8 + + + Ethernet108 + dut-lc5 + Asic0 + 100000 + 131 + 4 + 1 + 28 + 8 + + + Ethernet112 + dut-lc5 + Asic0 + 100000 + 132 + 4 + 1 + 29 + 8 + + + Ethernet116 + dut-lc5 + Asic0 + 100000 + 133 + 4 + 1 + 30 + 8 + + + Ethernet120 + dut-lc5 + Asic0 + 100000 + 134 + 4 + 1 + 31 + 8 + + + Ethernet124 + dut-lc5 + Asic0 + 100000 + 135 + 4 + 1 + 32 + 8 + + + Ethernet128 + dut-lc5 + Asic0 + 100000 + 136 + 4 + 1 + 33 + 8 + + + Ethernet132 + dut-lc5 + Asic0 + 100000 + 137 + 4 + 1 + 34 + 8 + + + Ethernet136 + dut-lc5 + Asic0 + 100000 + 138 + 4 + 1 + 35 + 8 + + + Ethernet140 + dut-lc5 + Asic0 + 100000 + 139 + 4 + 1 + 36 + 8 + + + Ethernet144 + dut-lc5 + Asic0 + 100000 + 140 + 4 + 1 + 37 + 8 + + + Ethernet148 + dut-lc5 + Asic0 + 100000 + 141 + 4 + 1 + 38 + 8 + + + Ethernet152 + dut-lc5 + Asic0 + 100000 + 142 + 4 + 1 + 39 + 8 + + + Ethernet156 + dut-lc5 + Asic0 + 100000 + 143 + 4 + 1 + 40 + 8 + + + Ethernet160 + dut-lc5 + Asic0 + 100000 + 144 + 4 + 1 + 41 + 8 + + + Ethernet164 + dut-lc5 + Asic0 + 100000 + 145 + 4 + 1 + 42 + 8 + + + Ethernet168 + dut-lc5 + Asic0 + 100000 + 146 + 4 + 1 + 43 + 8 + + + Ethernet172 + dut-lc5 + Asic0 + 100000 + 147 + 4 + 1 + 44 + 8 + + + Ethernet176 + dut-lc5 + Asic0 + 100000 + 148 + 4 + 1 + 45 + 8 + + + Ethernet180 + dut-lc5 + Asic0 + 100000 + 149 + 4 + 1 + 46 + 8 + + + Ethernet184 + dut-lc5 + Asic0 + 100000 + 150 + 4 + 1 + 47 + 8 + + + Ethernet188 + dut-lc5 + Asic0 + 100000 + 151 + 4 + 1 + 48 + 8 + + + Ethernet-Rec0 + dut-lc5 + Asic0 + 400000 + 152 + 4 + 0 + 221 + 8 + + + Ethernet-IB0 + dut-lc5 + Asic0 + 400000 + 153 + 4 + 1 + 222 + 8 + + + + + dut-lc3 + Arista-7800R3-48CQ2-C48 +
diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json new file mode 100644 index 000000000000..c05eca81eaaa --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json @@ -0,0 +1,590 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet180": "5m", + "Ethernet8": "5m", + "Ethernet184": "5m", + "Ethernet188": "5m", + "Ethernet0": "5m", + "Ethernet4": "5m", + "Ethernet108": "5m", + "Ethernet100": "5m", + "Ethernet128": "5m", + "Ethernet104": "5m", + "Ethernet68": "5m", + "Ethernet96": "5m", + "Ethernet124": "5m", + "Ethernet148": "5m", + "Ethernet92": "5m", + "Ethernet120": "5m", + "Ethernet144": "5m", + "Ethernet52": "5m", + "Ethernet160": "5m", + "Ethernet140": "5m", + "Ethernet56": "5m", + "Ethernet164": "5m", + "Ethernet76": "5m", + "Ethernet72": "5m", + "Ethernet64": "5m", + "Ethernet32": "5m", + "Ethernet16": "5m", + "Ethernet36": "5m", + "Ethernet12": "5m", + "Ethernet168": "5m", + "Ethernet116": "5m", + "Ethernet80": "5m", + "Ethernet112": "5m", + "Ethernet84": "5m", + "Ethernet152": "5m", + "Ethernet136": "5m", + "Ethernet156": "5m", + "Ethernet132": "5m", + "Ethernet48": "5m", + "Ethernet172": "5m", + "Ethernet44": "5m", + "Ethernet176": "5m", + "Ethernet40": "5m", + "Ethernet28": "5m", + "Ethernet88": "5m", + "Ethernet60": "5m", + "Ethernet20": "5m", + "Ethernet24": "5m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "3220805000", + "type": "both", + "mode": "dynamic", + "xoff": "2102272" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"1280", + "dynamic_th":"-2", + "xon_offset":"2560", + "xon":"0", + "xoff":"66048" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "xon_offset":"0", + "static_th":"30535680" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet180|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet8|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet184|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet188|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet0|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet4|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet108|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet100|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet128|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet104|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet68|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet96|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet124|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet148|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet92|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet120|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet144|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet52|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet140|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet56|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet164|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet76|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet72|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet64|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet32|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet16|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet36|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet12|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet88|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet116|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet80|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet112|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet84|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet152|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet136|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet156|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet132|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet48|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet44|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet176|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet40|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet28|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet60|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet20|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet24|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet180|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet8|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet184|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet188|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet0|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet4|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet108|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet100|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet128|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet104|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet68|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet96|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet124|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet148|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet92|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet120|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet144|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet52|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet140|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet56|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet164|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet76|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet72|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet64|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet32|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet16|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet36|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet12|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet88|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet116|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet80|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet112|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet84|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet152|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet136|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet156|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet132|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet48|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet44|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet176|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet40|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet28|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet60|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet20|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet24|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet180|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet8|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet184|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet188|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet0|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet4|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet108|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet100|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet128|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet104|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet68|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet96|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet124|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet148|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet92|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet120|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet144|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet52|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet140|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet56|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet164|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet76|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet72|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet64|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet32|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet16|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet36|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet12|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet88|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet116|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet80|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet112|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet84|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet152|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet136|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet156|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet132|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet48|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet44|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet176|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet40|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet28|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet60|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet20|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet24|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json new file mode 100644 index 000000000000..3044749a2776 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json @@ -0,0 +1,1487 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet132": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet140": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet164": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json new file mode 100644 index 000000000000..56538fd0935b --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json @@ -0,0 +1,590 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "5m", + "Ethernet4": "5m", + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "5m", + "Ethernet20": "5m", + "Ethernet24": "5m", + "Ethernet28": "5m", + "Ethernet32": "5m", + "Ethernet36": "5m", + "Ethernet40": "5m", + "Ethernet44": "5m", + "Ethernet48": "5m", + "Ethernet52": "5m", + "Ethernet56": "5m", + "Ethernet60": "5m", + "Ethernet64": "5m", + "Ethernet68": "5m", + "Ethernet72": "5m", + "Ethernet76": "5m", + "Ethernet80": "5m", + "Ethernet84": "5m", + "Ethernet88": "5m", + "Ethernet92": "5m", + "Ethernet96": "5m", + "Ethernet100": "5m", + "Ethernet104": "5m", + "Ethernet108": "5m", + "Ethernet112": "5m", + "Ethernet116": "5m", + "Ethernet120": "5m", + "Ethernet124": "5m", + "Ethernet128": "5m", + "Ethernet132": "5m", + "Ethernet136": "5m", + "Ethernet140": "5m", + "Ethernet144": "5m", + "Ethernet148": "5m", + "Ethernet152": "5m", + "Ethernet156": "5m", + "Ethernet160": "5m", + "Ethernet164": "5m", + "Ethernet168": "5m", + "Ethernet172": "5m", + "Ethernet176": "5m", + "Ethernet180": "5m", + "Ethernet184": "5m", + "Ethernet188": "5m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "3220805000", + "type": "both", + "mode": "dynamic", + "xoff": "2102272" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"1280", + "dynamic_th":"-2", + "xon_offset":"2560", + "xon":"0", + "xoff":"66048" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "xon_offset":"0", + "static_th":"30535680" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet0|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet36|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet40|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet44|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet48|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet52|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet56|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet60|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet64|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet68|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet72|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet4|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet76|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet80|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet84|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet88|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet92|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet96|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet100|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet104|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet108|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet112|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet8|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet116|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet120|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet124|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet128|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet132|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet136|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet140|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet144|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet148|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet152|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet12|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet156|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet164|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet176|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet180|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet184|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet188|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet16|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet20|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet24|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet28|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet32|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "Ethernet0|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet36|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet40|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet44|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet48|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet52|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet56|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet60|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet64|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet68|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet72|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet4|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet76|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet80|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet84|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet88|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet92|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet96|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet100|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet104|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet108|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet112|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet8|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet116|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet120|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet124|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet128|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet132|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet136|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet140|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet144|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet148|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet152|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet12|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet156|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet164|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet176|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet180|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet184|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet188|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet16|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet20|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet24|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet28|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet32|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "Ethernet0|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet36|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet40|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet44|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet48|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet52|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet56|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet60|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet64|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet68|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet72|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet4|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet76|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet80|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet84|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet88|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet92|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet96|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet100|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet104|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet108|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet112|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet8|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet116|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet120|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet124|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet128|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet132|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet136|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet140|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet144|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet148|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet152|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet12|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet156|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet164|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet176|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet180|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet184|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet188|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet16|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet20|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet24|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet28|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, "Ethernet32|5-6": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json new file mode 100644 index 000000000000..3044749a2776 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json @@ -0,0 +1,1487 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet132": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet140": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet164": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index b0bfbe9f3727..eb002720d98d 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -23,6 +23,7 @@ def setUp(self): self.mlnx_port_config = os.path.join(self.test_dir, 'sample-port-config-mlnx.ini') self.dell6100_t0_minigraph = os.path.join(self.test_dir, 'sample-dell-6100-t0-minigraph.xml') self.arista7050_t0_minigraph = os.path.join(self.test_dir, 'sample-arista-7050-t0-minigraph.xml') + self.arista7800r3_48cq2_lc_t2_minigraph = os.path.join(self.test_dir, 'sample-arista-7800r3-48cq2-lc-t2-minigraph.xml') self.multi_asic_minigraph = os.path.join(self.test_dir, 'multi_npu_data', 'sample-minigraph.xml') self.multi_asic_port_config = os.path.join(self.test_dir, 'multi_npu_data', 'sample_port_config-0.ini') self.dell9332_t1_minigraph = os.path.join(self.test_dir, 'sample-dell-9332-t1-minigraph.xml') @@ -212,6 +213,30 @@ def test_qos_arista7050_render_template(self): sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') assert utils.cmp(sample_output_file, self.output_file) + def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): + arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', 'x86_64-arista_7800r3_48cq2_lc', 'Arista-7800R3-48CQ2-C48') + qos_file = os.path.join(arista_dir_path, 'qos.json.j2') + buffer_file = os.path.join(arista_dir_path, 'buffers.json.j2') + port_config_ini_file = os.path.join(arista_dir_path, 'port_config.ini') + + # copy qos_config.j2 and buffer_config.j2 to the Arista 7800r3_48cq2_lc directory to have all templates in one directory + qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') + shutil.copy2(qos_config_file, arista_dir_path) + buffer_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'buffers_config.j2') + shutil.copy2(buffer_config_file, arista_dir_path) + + for template_file, cfg_file, sample_output_file in [(qos_file, 'qos_config.j2', 'qos-arista7800r3-48cq2-lc.json'), + (buffer_file, 'buffers_config.j2', 'buffer-arista7800r3-48cq2-lc.json') ]: + argument = '-m ' + self.arista7800r3_48cq2_lc_t2_minigraph + ' -p ' + port_config_ini_file + ' -t ' + template_file + ' > ' + self.output_file + self.run_script(argument) + + # cleanup + cfg_file_new = os.path.join(arista_dir_path, cfg_file) + os.remove(cfg_file_new) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, sample_output_file) + assert filecmp.cmp(sample_output_file, self.output_file) + def test_qos_dell9332_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') qos_file = os.path.join(dell_dir_path, 'qos.json.j2') From 86017096b2139420a7b2b5f2e4a57987a4747cd5 Mon Sep 17 00:00:00 2001 From: StormLiangMS <89824293+StormLiangMS@users.noreply.github.com> Date: Thu, 10 Mar 2022 08:54:33 +0800 Subject: [PATCH 061/817] [bgpcfgd] to support removal part of configuration of bgp allowed prefix list (#10165) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix allow list issue Signed-off-by: stormliang * add the ipaddress in the install list * add unit test Co-authored-by: Ubuntu Why I did it Failed to remove part of configuration of bgp allowed prefix list. The details in #10141 How I did it There are two issues: In FRR, ipv6 default route is ::/0, but in the configuration, it is 0::/0, string comparison would be false, but why ipv4 failed to remove the allowed prefix list, ipv6 works? Looks into next one for the answer. The current managers_allow_list doesn’t support removal part of the prefix list. But why IPv6 works in 1? It is because the bug for the IPv6 default route comparison, it would do the update no matter what is the operation (the code will compare the prefix list in the FRR and configuration db, if all configurations in db are presented in FRR, it do nothing, otherwise it will update the prefix list based on the configuration from db). How to verify it Follow the step in #10141 --- .../bgpcfgd/managers_allow_list.py | 49 ++++-- src/sonic-bgpcfgd/setup.py | 1 + src/sonic-bgpcfgd/tests/test_allow_list.py | 155 +++++++++++++----- 3 files changed, 153 insertions(+), 52 deletions(-) diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py index 435be91d20d2..e03bb19c163f 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py @@ -2,6 +2,7 @@ Implementation of "allow-list" feature """ import re +import ipaddress from .log import log_debug, log_info, log_err, log_warn from .template import TemplateFabric @@ -19,6 +20,7 @@ class BGPAllowListMgr(Manager): ROUTE_MAP_ENTRY_WITH_COMMUNITY_END = 29990 ROUTE_MAP_ENTRY_WITHOUT_COMMUNITY_START = 30000 ROUTE_MAP_ENTRY_WITHOUT_COMMUNITY_END = 65530 + PREFIX_LIST_POS = 1 # the position of the ip prefix in the permit string. V4 = "v4" # constant for af enum: V4 V6 = "v6" # constant for af enum: V6 @@ -228,6 +230,12 @@ def __update_prefix_list(self, af, pl_name, allow_list): constant_list = self.__get_constant_list(af) allow_list = self.__to_prefix_list(af, allow_list) log_debug("BGPAllowListMgr::__update_prefix_list. af='%s' prefix-list name=%s" % (af, pl_name)) + ''' + Need to check exist and equality of the allowed prefix list. + A. If exist and equal, no operation needed. + B. If exist but not equal, first delete then add prefix based on the data from condig db and constants. + C. If non-exist, directly add prefix based on the data from condig db and constants. + ''' exist, correct = self.__is_prefix_list_valid(af, pl_name, allow_list, constant_list) if correct: log_debug("BGPAllowListMgr::__update_prefix_list. the prefix-list '%s' exists and correct" % pl_name) @@ -237,7 +245,7 @@ def __update_prefix_list(self, af, pl_name, allow_list): seq_no = 10 if exist: cmds.append('no %s prefix-list %s' % (family, pl_name)) - for entry in constant_list + allow_list: + for entry in self.__normalize_ipnetwork(af, constant_list + allow_list): cmds.append('%s prefix-list %s seq %d %s' % (family, pl_name, seq_no, entry)) seq_no += 10 return cmds @@ -258,6 +266,24 @@ def __remove_prefix_list(self, af, pl_name): family = self.__af_to_family(af) return ["no %s prefix-list %s" % (family, pl_name)] + def __normalize_ipnetwork(self, af, allow_prefix_list): + ''' + Normalize IPv6 addresses + for example: + 2001:cdba:0000:0000:0000:0000:3257:9652 + 2001:cdba:0:0:0:0:3257:9652 + 2001:cdba::3257:9652 + after normalize, all would be normalized to + 2001:cdba::3257:9652 + ''' + normalize_list = [] + for allow_item in allow_prefix_list: + tmp_list = allow_item.split(' ') + if af == self.V6: + tmp_list[self.PREFIX_LIST_POS] = str(ipaddress.IPv6Network(tmp_list[self.PREFIX_LIST_POS])) + normalize_list.append(' '.join(tmp_list)) + return normalize_list + def __is_prefix_list_valid(self, af, pl_name, allow_list, constant_list): """ Check that a prefix list exists and it has valid entries @@ -266,7 +292,8 @@ def __is_prefix_list_valid(self, af, pl_name, allow_list, constant_list): :param allow_list: a prefix-list which must be a part of the valid prefix list :param constant_list: a constant list which must be on top of each "allow" prefix list on the device :return: a tuple. The first element of the tuple has True if the prefix-list exists, False otherwise, - The second element of the tuple has True if the prefix-list contains correct entries, False if not + The second element of the tuple has True if allow prefix list in running configuraiton is + equal with ones in config db + constants, False if not """ assert af == self.V4 or af == self.V6 family = self.__af_to_family(af) @@ -274,20 +301,18 @@ def __is_prefix_list_valid(self, af, pl_name, allow_list, constant_list): conf = self.cfg_mgr.get_text() if not any(line.strip().startswith(match_string) for line in conf): return False, False # if the prefix list is not exists, it is not correct - constant_set = set(constant_list) - allow_set = set(allow_list) + expect_set = set(self.__normalize_ipnetwork(af, constant_list)) + expect_set.update(set(self.__normalize_ipnetwork(af, allow_list))) + + config_list = [] for line in conf: if line.startswith(match_string): found = line[len(match_string):].strip().split(' ') rule = " ".join(found[1:]) - if rule in constant_set: - constant_set.discard(rule) - elif rule in allow_set: - if constant_set: - return True, False # Not everything from constant set is presented - else: - allow_set.discard(rule) - return True, len(allow_set) == 0 # allow_set should be presented all + config_list.append(rule) + + # Return double Ture, when running configuraiton is identical with config db + constants. + return True, expect_set == set(self.__normalize_ipnetwork(af, config_list)) def __update_community(self, community_name, community_value): """ diff --git a/src/sonic-bgpcfgd/setup.py b/src/sonic-bgpcfgd/setup.py index ab86ca20ec19..b451accb9792 100755 --- a/src/sonic-bgpcfgd/setup.py +++ b/src/sonic-bgpcfgd/setup.py @@ -18,6 +18,7 @@ 'jinja2>=2.10', 'netaddr==0.8.0', 'pyyaml==5.4.1', + 'ipaddress==1.0.23' ], setup_requires = [ 'pytest-runner', diff --git a/src/sonic-bgpcfgd/tests/test_allow_list.py b/src/sonic-bgpcfgd/tests/test_allow_list.py index cb0896982a39..5207c6283462 100644 --- a/src/sonic-bgpcfgd/tests/test_allow_list.py +++ b/src/sonic-bgpcfgd/tests/test_allow_list.py @@ -79,8 +79,8 @@ def test_set_handler_with_community(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -110,8 +110,8 @@ def test_set_handler_with_community_and_permit_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -142,8 +142,8 @@ def test_set_handler_with_community_and_deny_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -178,8 +178,8 @@ def test_set_handler_no_community(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -206,8 +206,8 @@ def test_set_handler_no_community_with_permit_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -234,8 +234,8 @@ def test_set_handler_no_community_with_deny_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -257,8 +257,8 @@ def test_del_handler_with_community(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 ge 65', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -292,8 +292,8 @@ def test_del_handler_with_exiting_community_deny_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 ge 65', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -331,8 +331,8 @@ def test_del_handler_with_exiting_community_permit_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 ge 65', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -365,8 +365,8 @@ def test_del_handler_with_exiting_community_deny_action_global_deny(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 ge 65', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -401,8 +401,8 @@ def test_del_handler_with_exiting_community_permit_action_global_deny(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 ge 65', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -441,8 +441,8 @@ def test_del_handler_no_community(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 ge 65', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -470,8 +470,8 @@ def test_del_handler_with_no_community_deny_action(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 ge 65', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -503,8 +503,8 @@ def test_del_handler_with_no_community_permit_action_global_deny(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 ge 25', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 ge 17', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 ge 65', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -543,8 +543,8 @@ def test_set_handler_with_community_data_is_already_presented(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -572,8 +572,8 @@ def test_set_handler_no_community_data_is_already_presented(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -636,8 +636,8 @@ def test_set_handler_with_community_update_prefixes_add(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', @@ -660,8 +660,8 @@ def test_set_handler_with_community_update_prefixes_add(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 40 permit 80.90.0.0/16 le 32', 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 50 permit fc02::/64 le 128', @@ -679,8 +679,8 @@ def test_set_handler_no_community_update_prefixes_add(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', @@ -700,14 +700,89 @@ def test_set_handler_no_community_update_prefixes_add(): 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 40 permit 80.90.0.0/16 le 32', 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny 0::/0 le 59', - 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny 0::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 50 permit fc02::/64 le 128', ] ) +def test_set_handler_with_community_update_prefixes_remove(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5|1010:2020", { + "prefixes_v4": "10.20.30.0/24", + "prefixes_v6": "fc00:20::/64", + }), + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', + 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 10', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 10', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 65535', + ' set community 123:123 additive', + "" + ], + [ + 'no ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', + 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', + ] + ) + +def test_set_handler_no_community_update_prefixes_remove(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5", { + "prefixes_v4": "20.20.30.0/24", + "prefixes_v6": "fc01:20::/64", + }), + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 30000', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 65535', + ' set community 123:123 additive', + "" + ], + [ + 'no ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', + 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', + ] + ) + @patch.dict("sys.modules", swsscommon=swsscommon_module_mock) def test___set_handler_validate(): from bgpcfgd.managers_allow_list import BGPAllowListMgr From c8db7a2d529df3bbb622dfe7e5df939423c98c2c Mon Sep 17 00:00:00 2001 From: Yang Wang Date: Thu, 10 Mar 2022 13:15:44 +0800 Subject: [PATCH 062/817] [Mellanox][SAISERVER] Support Mellanox saiserverv1 and saiserverv2 docker (#9686) * support saiserverv1 and saiserverv2 docker * add saiserver into buster and revert some changes * update thrift version --- platform/mellanox/docker-saiserver-mlnx.mk | 9 ++++---- .../docker-saiserver-mlnx/Dockerfile.j2 | 19 +++++++-------- .../docker-saiserver-mlnx/supervisord.conf | 2 +- platform/mellanox/libsaithrift-dev.mk | 23 +++++++++++++------ 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/platform/mellanox/docker-saiserver-mlnx.mk b/platform/mellanox/docker-saiserver-mlnx.mk index da74234bbf71..b765b338eddd 100644 --- a/platform/mellanox/docker-saiserver-mlnx.mk +++ b/platform/mellanox/docker-saiserver-mlnx.mk @@ -16,15 +16,16 @@ # # docker image for mlnx saiserver -DOCKER_SAISERVER_MLNX = docker-saiserver-mlnx.gz +DOCKER_SAISERVER_MLNX = docker-saiserver$(SAITHRIFT_VER)-mlnx.gz $(DOCKER_SAISERVER_MLNX)_PATH = $(PLATFORM_PATH)/docker-saiserver-mlnx $(DOCKER_SAISERVER_MLNX)_DEPENDS += $(SAISERVER) $(PYTHON_SDK_API) $(DOCKER_SAISERVER_MLNX)_PYTHON_DEBS += $(MLNX_SFPD) -$(DOCKER_SAISERVER_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_STRETCH) +$(DOCKER_SAISERVER_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) SONIC_DOCKER_IMAGES += $(DOCKER_SAISERVER_MLNX) -SONIC_STRETCH_DOCKERS += $(DOCKER_SAISERVER_MLNX) +SONIC_BUSTER_DOCKERS += $(DOCKER_SAISERVER_MLNX) + +$(DOCKER_SAISERVER_MLNX)_CONTAINER_NAME = saiserver$(SAITHRIFT_VER) -$(DOCKER_SAISERVER_MLNX)_CONTAINER_NAME = saiserver $(DOCKER_SAISERVER_MLNX)_RUN_OPT += --privileged -t $(DOCKER_SAISERVER_MLNX)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_SAISERVER_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index 1444c7a24d62..d5b5e92ea81c 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -14,7 +14,8 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## -FROM docker-config-engine-stretch +{% from "dockers/dockerfile-macros.j2" import install_debian_packages %} +FROM docker-config-engine-buster ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf @@ -22,7 +23,11 @@ RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%s ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + gdb \ + libboost-atomic1.71.0 COPY \ {% for deb in docker_saiserver_mlnx_debs.split(' ') -%} @@ -38,15 +43,7 @@ debs/ RUN apt-get install -y --no-install-recommends libxml2 iptables libbsd0 protobuf-c-compiler protobuf-compiler python-protobuf libprotobuf-c1 python-future python-ipaddr libnet1 pkg-config asciidoc xmlto -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -{% for deb in docker_saiserver_mlnx_debs.split(' ') -%} -dpkg_apt debs/{{ deb }}{{'; '}} -{%- endfor %} - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -{% for deb in docker_saiserver_mlnx_pydebs.split(' ') -%} -dpkg_apt debs/{{ deb }}{{'; '}} -{%- endfor %} +{{ install_debian_packages(docker_saiserver_mlnx_debs.split(' ')) }} COPY ["start.sh", "/usr/bin/"] diff --git a/platform/mellanox/docker-saiserver-mlnx/supervisord.conf b/platform/mellanox/docker-saiserver-mlnx/supervisord.conf index cb67a0fc9a47..e90e41645042 100644 --- a/platform/mellanox/docker-saiserver-mlnx/supervisord.conf +++ b/platform/mellanox/docker-saiserver-mlnx/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:saiserver] -command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +command=/usr/sbin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini priority=3 autostart=false autorestart=false diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index 03daf65fac84..d50311976cfe 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -18,19 +18,28 @@ SAI_VER = 0.9.4 -LIBSAITHRIFT_DEV = libsaithrift-dev_$(SAI_VER)_amd64.deb +LIBSAITHRIFT_DEV = libsaithrift$(SAITHRIFT_VER)-dev_$(SAI_VER)_amd64.deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI -$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(MLNX_SAI) $(MLNX_SAI_DEV) -$(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) $(MLNX_SAI) +ifeq ($(SAITHRIFT_V2),y) +$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT_0_14_1) $(LIBTHRIFT_0_14_1_DEV) $(PYTHON3_THRIFT_0_14_1) $(THRIFT_0_14_1_COMPILER) +$(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT_0_14_1) +$(LIBSAITHRIFT_DEV)_BUILD_ENV = SAITHRIFTV2=true SAITHRIFT_VER=v2 +else +$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) +$(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) +endif +$(LIBSAITHRIFT_DEV)_DEPENDS += $(MLNX_SAI) $(MLNX_SAI_DEV) +$(LIBSAITHRIFT_DEV)_RDEPENDS += $(MLNX_SAI) + SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) -PYTHON_SAITHRIFT = python-saithrift_$(SAI_VER)_amd64.deb +PYTHON_SAITHRIFT = python-saithrift$(SAITHRIFT_VER)_$(SAI_VER)_amd64.deb $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(PYTHON_SAITHRIFT))) -SAISERVER = saiserver_$(SAI_VER)_amd64.deb -$(SAISERVER)_RDEPENDS += $(LIBTHRIFT) $(MLNX_SAI) +SAISERVER = saiserver$(SAITHRIFT_VER)_$(SAI_VER)_amd64.deb +$(SAISERVER)_RDEPENDS += $(LIBSAITHRIFT_DEV) $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(SAISERVER))) -SAISERVER_DBG = saiserver-dbg_$(SAI_VER)_amd64.deb +SAISERVER_DBG = saiserver$(SAITHRIFT_VER)-dbg_$(SAI_VER)_amd64.deb $(SAISERVER_DBG)_RDEPENDS += $(SAISERVER) $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(SAISERVER_DBG))) From a89f294fd5e1cdd1074922e48d507b65bf180b98 Mon Sep 17 00:00:00 2001 From: Taras Keryk Date: Thu, 10 Mar 2022 12:55:06 +0200 Subject: [PATCH 063/817] [BFN] Implementation API for platform component (#10180) * [BFN] Implementation API for platform component SONiC has a concept of "platform components" this may include - CPLD, FPGA, BIOS, BMC, etc. These changes are needed to read the version of the BIOS and BMC component. What I did Create components.py module Add funcion for reading componet version to thrift interface How I did it The previous implementaion didn't have platform components API, so fwutil return an empty list. After implementation of the platform component API, we have actual list of platform components and firmware versions How to verify it Run manually 'fwutil show status' or run unit tests Previous command output Chassis Module Component Version Description ------------------------ -------- ----------- --------- ------------- New command output Chassis Module Component Version Description ------------------------ -------- ----------- --------- ------------- Chassis1 N/A BIOS 1.2.3 Chassis BIOS BMC 5.1 Chassis BMC Signed-off-by: Taras Keryk * [BFN] Implementation API for platform component SONiC has a concept of "platform components" this may include - CPLD, FPGA, BIOS, BMC, etc. These changes are needed to read the version of the BIOS and BMC component. What I did Create components.py module Add funcion for reading componet version to thrift interface How I did it The previous implementaion didn't have platform components API, so fwutil return an empty list. After implementation of the platform component API, we have actual list of platform components and firmware versions How to verify it Run manually 'fwutil show status' or run unit tests Previous command output Chassis Module Component Version Description ------------------------ -------- ----------- --------- ------------- New command output Chassis Module Component Version Description ------------------------ -------- ----------- --------- ------------- Chassis1 N/A BIOS 1.2.3 Chassis BIOS BMC 5.1 Chassis BMC Signed-off-by: Taras Keryk * [BFN] Implementation API for platform component get chassis name from json * [BFN] Implementation API for platform component Updated platform and platrom_components json * [BFN] Implementation API for platform component Fixed spaces in component.py * [BFN] Implementation API for platform component Fixed exception in component.py * Update chassis.py * [BFN] Implementation API for platform component Fixed spaces in component.py, chassis.py * [BFN] Implementation API for platform component: Fixed spaces in component.py, chassis.py * Fixed exception in get_bios_version --- .../x86_64-accton_as9516_32d-r0/platform.json | 8 + .../platform_components.json | 16 +- .../platform.json | 8 + .../platform_components.json | 16 +- .../sonic_platform/chassis.py | 8 + .../sonic_platform/component.py | 314 ++++++ .../pltfm_mgr_rpc/pltfm_mgr_rpc.py | 910 +++++++++++++++--- .../sonic_platform/pltfm_mgr_rpc/ttypes.py | 83 +- 8 files changed, 1172 insertions(+), 191 deletions(-) create mode 100644 platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json b/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json index b92b929fb997..115dd194b725 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json @@ -1,6 +1,14 @@ { "chassis": { "name": "Newport", + "components": [ + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], "fans": [ { "name": "counter-rotating-fan-1" diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/platform_components.json b/device/barefoot/x86_64-accton_as9516_32d-r0/platform_components.json index 43874566a3ad..118079de4696 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/platform_components.json +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/platform_components.json @@ -1,8 +1,10 @@ -{ - "chassis": { - "Newport": { - "component": { - } - } - } +{ + "chassis": { + "Newport": { + "component": { + "BIOS": { }, + "BMC": { } + } + } + } } \ No newline at end of file diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json index 769386a14ce0..ea18a031344e 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json @@ -1,6 +1,14 @@ { "chassis": { "name": "Wedge100BF-32X-O-AC-F-BF", + "components": [ + { + "name": "BIOS" + }, + { + "name": "BMC" + } + ], "fans": [ { "name": "counter-rotating-fan-1" diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform_components.json b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform_components.json index df77fa3e1bf9..30befc827a9e 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform_components.json +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform_components.json @@ -1,8 +1,10 @@ -{ - "chassis": { - "Wedge100BF-32X-O-AC-F-BF": { - "component": { - } - } - } +{ + "chassis": { + "Wedge100BF-32X-O-AC-F-BF": { + "component": { + "BIOS": { }, + "BMC": { } + } + } + } } \ No newline at end of file diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py index fac75ae518a9..64536abbb532 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py @@ -19,6 +19,7 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +NUM_COMPONENT = 2 class Chassis(ChassisBase): """ Platform-specific Chassis class @@ -44,6 +45,7 @@ def __init__(self): self.ready = False self.phy_port_cur_state = {} self.qsfp_interval = self.QSFP_CHECK_INTERVAL + self.__initialize_components() @property def _eeprom(self): @@ -128,6 +130,12 @@ def qsfp_max_port_get(client): self.PORT_END = self.QSFP_PORT_END self.PORTS_IN_BLOCK = self.QSFP_PORT_END + def __initialize_components(self): + from sonic_platform.component import Components + for index in range(0, NUM_COMPONENT): + component = Components(index) + self._component_list.append(component) + def get_name(self): """ Retrieves the name of the chassis diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py new file mode 100644 index 000000000000..5e72bb63e343 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py @@ -0,0 +1,314 @@ +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from platform_thrift_client import thrift_try + import json + from collections import OrderedDict + from sonic_py_common import device_info + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +def get_bios_version(): + """ + Retrieves the firmware version of the BIOS + Returns: + A string containing the firmware version of the BIOS + """ + try: + return subprocess.check_output(['dmidecode', '-s', 'bios-version']).strip().decode() + except subprocess.CalledProcessError as e: + raise RuntimeError("Failed to getget BIOS version") + +def get_bmc_version(): + """ + Retrieves the firmware version of the BMC + Returns: + A string containing the firmware version of the BMC + """ + ver = "N/A" + def bmc_get(client): + return client.pltfm_mgr.pltfm_mgr_chss_mgmt_bmc_ver_get() + try: + ver = thrift_try(bmc_get) + except Exception: + pass + + return ver + +class BFPlatformComponentsParser(object): + """ + BFPlatformComponentsParser + """ + CHASSIS_KEY = "chassis" + MODULE_KEY = "module" + COMPONENT_KEY = "component" + FIRMWARE_KEY = "firmware" + + def __init__(self, platform_components_path): + self.__chassis_component_map = OrderedDict() + self.__component_list = [] + self.__bf_model = "" + self.__parse_platform_components(platform_components_path) + + def __is_str(self, obj): + return isinstance(obj, str) + + def __is_dict(self, obj): + return isinstance(obj, dict) + + def __parser_fail(self, msg): + raise RuntimeError("Failed to parse \"{}\": {}".format(PLATFORM_COMPONENTS_FILE, msg)) + + def __parser_platform_fail(self, msg): + self.__parser_fail("invalid platform schema: {}".format(msg)) + + def __parser_chassis_fail(self, msg): + self.__parser_fail("invalid chassis schema: {}".format(msg)) + + def __parser_component_fail(self, msg): + self.__parser_fail("invalid component schema: {}".format(msg)) + + def __parse_component_section(self, section, component, is_module_component=False): + if not self.__is_dict(component): + self.__parser_component_fail("dictionary is expected: key={}".format(self.COMPONENT_KEY)) + + if not component: + return + + missing_key = None + + for key1, value1 in component.items(): + if not self.__is_dict(value1): + self.__parser_component_fail("dictionary is expected: key={}".format(key1)) + + self.__chassis_component_map[section][key1] = OrderedDict() + + if value1: + if len(value1) < 1 or len(value1) > 3: + self.__parser_component_fail("unexpected number of records: key={}".format(key1)) + + if self.FIRMWARE_KEY not in value1: + missing_key = self.FIRMWARE_KEY + break + + for key2, value2 in value1.items(): + if not self.__is_str(value2): + self.__parser_component_fail("string is expected: key={}".format(key2)) + + self.__chassis_component_map[section][key1] = value1 + + if missing_key is not None: + self.__parser_component_fail("\"{}\" key hasn't been found".format(missing_key)) + + def __parse_chassis_section(self, chassis): + self.__chassis_component_map = OrderedDict() + + if not self.__is_dict(chassis): + self.__parser_chassis_fail("dictionary is expected: key={}".format(self.CHASSIS_KEY)) + + if not chassis: + self.__parser_chassis_fail("dictionary is empty: key={}".format(self.CHASSIS_KEY)) + + if len(chassis) != 1: + self.__parser_chassis_fail("unexpected number of records: key={}".format(self.CHASSIS_KEY)) + + for key, value in chassis.items(): + if not self.__is_dict(value): + self.__parser_chassis_fail("dictionary is expected: key={}".format(key)) + + if not value: + self.__parser_chassis_fail("dictionary is empty: key={}".format(key)) + + if self.COMPONENT_KEY not in value: + self.__parser_chassis_fail("\"{}\" key hasn't been found".format(self.COMPONENT_KEY)) + + if len(value) != 1: + self.__parser_chassis_fail("unexpected number of records: key={}".format(key)) + + self.__chassis_component_map[key] = OrderedDict() + self.__parse_component_section(key, value[self.COMPONENT_KEY]) + + def get_components_list(self): + self.__component_list = [] + for key, value in self.__chassis_component_map[self.__bf_model].items(): + self.__component_list.append(key) + + return self.__component_list + + def get_chassis_component_map(self): + return self.__chassis_component_map + + def __parse_platform_components(self, platform_components_path): + with open(platform_components_path) as platform_components: + data = json.load(platform_components) + kkey, val = list(data[self.CHASSIS_KEY].items())[0] + self.__bf_model = kkey + + if not self.__is_dict(data): + self.__parser_platform_fail("dictionary is expected: key=root") + + if not data: + self.__parser_platform_fail("dictionary is empty: key=root") + + if self.CHASSIS_KEY not in data: + self.__parser_platform_fail("\"{}\" key hasn't been found".format(self.CHASSIS_KEY)) + + if len(data) != 1: + self.__parser_platform_fail("unexpected number of records: key=root") + + self.__parse_chassis_section(data[self.CHASSIS_KEY]) + + chassis_component_map = property(fget=get_chassis_component_map) + +class Components(ComponentBase): + """BFN Montara Platform-specific Component class""" + bf_platform = device_info.get_path_to_platform_dir() + bf_platform_json = "{}/platform_components.json".format(bf_platform.strip()) + bpcp = BFPlatformComponentsParser(bf_platform_json) + + def __init__(self, component_index=0): + try: + self.index = component_index + self.name = "N/A" + self.version = "N/A" + self.description = "N/A" + self.name = self.bpcp.get_components_list()[self.index] + except IndexError as e: + print("Error: No components found in plaform_components.json") + + if (self.name == "BMC"): + self.version = get_bmc_version() + self.description = "Chassis BMC" + elif (self.name == "BIOS"): + self.version = get_bios_version() + self.description = "Chassis BIOS" + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + if not self.name: + return "N/A" + return self.name + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + Returns: + A string containing the firmware version of the component + """ + return self.version + + def install_firmware(self, image_path): + """ + Installs firmware to the component + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install was successful, False if not + """ + return False + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if component is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the component + Returns: + string: Model/part number of component + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'N/A' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + A boolean value, True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_available_firmware_version(self, image_path): + return 'None' + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return 'None' + + def update_firmware(self, image_path): + """ + Updates firmware of the component + + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + + Args: + image_path: A string, path to firmware image + + Raises: + RuntimeError: update failed + """ + return False + + def auto_update_firmware(self, image_path, boot_action): + """ + Default handling of attempted automatic update for a component + Will skip the installation if the boot_action is 'warm' or 'fast' and will call update_firmware() + if boot_action is fast. + """ + return 1 diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py index 419ac57ebb22..25ab556b3758 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py @@ -1,5 +1,5 @@ # -# Autogenerated by Thrift Compiler (0.13.0) +# Autogenerated by Thrift Compiler (0.14.1) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # @@ -74,6 +74,26 @@ def pltfm_mgr_fan_info_get(self, fan_num): """ pass + def pltfm_mgr_qsfp_cached_num_bytes_get(self, port_num, page, offset, length): + """ + Parameters: + - port_num + - page + - offset + - length + + """ + pass + + def pltfm_mgr_qsfp_cached_page_get(self, port_num, page): + """ + Parameters: + - port_num + - page + + """ + pass + def pltfm_mgr_qsfp_presence_get(self, port_num): """ Parameters: @@ -284,6 +304,9 @@ def pltfm_mgr_sensor_info_get(self, options): """ pass + def pltfm_mgr_chss_mgmt_bmc_get(self): + pass + class Client(Iface): def __init__(self, iprot, oprot=None): @@ -552,6 +575,82 @@ def recv_pltfm_mgr_fan_info_get(self): raise result.ouch raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_fan_info_get failed: unknown result") + def pltfm_mgr_qsfp_cached_num_bytes_get(self, port_num, page, offset, length): + """ + Parameters: + - port_num + - page + - offset + - length + + """ + self.send_pltfm_mgr_qsfp_cached_num_bytes_get(port_num, page, offset, length) + return self.recv_pltfm_mgr_qsfp_cached_num_bytes_get() + + def send_pltfm_mgr_qsfp_cached_num_bytes_get(self, port_num, page, offset, length): + self._oprot.writeMessageBegin('pltfm_mgr_qsfp_cached_num_bytes_get', TMessageType.CALL, self._seqid) + args = pltfm_mgr_qsfp_cached_num_bytes_get_args() + args.port_num = port_num + args.page = page + args.offset = offset + args.length = length + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_pltfm_mgr_qsfp_cached_num_bytes_get(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = pltfm_mgr_qsfp_cached_num_bytes_get_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + if result.ouch is not None: + raise result.ouch + raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_qsfp_cached_num_bytes_get failed: unknown result") + + def pltfm_mgr_qsfp_cached_page_get(self, port_num, page): + """ + Parameters: + - port_num + - page + + """ + self.send_pltfm_mgr_qsfp_cached_page_get(port_num, page) + return self.recv_pltfm_mgr_qsfp_cached_page_get() + + def send_pltfm_mgr_qsfp_cached_page_get(self, port_num, page): + self._oprot.writeMessageBegin('pltfm_mgr_qsfp_cached_page_get', TMessageType.CALL, self._seqid) + args = pltfm_mgr_qsfp_cached_page_get_args() + args.port_num = port_num + args.page = page + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_pltfm_mgr_qsfp_cached_page_get(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = pltfm_mgr_qsfp_cached_page_get_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + if result.ouch is not None: + raise result.ouch + raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_qsfp_cached_page_get failed: unknown result") + def pltfm_mgr_qsfp_presence_get(self, port_num): """ Parameters: @@ -1444,6 +1543,34 @@ def recv_pltfm_mgr_sensor_info_get(self): raise result.ouch raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_sensor_info_get failed: unknown result") + def pltfm_mgr_chss_mgmt_bmc_get(self): + self.send_pltfm_mgr_chss_mgmt_bmc_get() + return self.recv_pltfm_mgr_chss_mgmt_bmc_get() + + def send_pltfm_mgr_chss_mgmt_bmc_get(self): + self._oprot.writeMessageBegin('pltfm_mgr_chss_mgmt_bmc_get', TMessageType.CALL, self._seqid) + args = pltfm_mgr_chss_mgmt_bmc_get_args() + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_pltfm_mgr_chss_mgmt_bmc_get(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = pltfm_mgr_chss_mgmt_bmc_get_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + if result.ouch is not None: + raise result.ouch + raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_chss_mgmt_bmc_get failed: unknown result") + class Processor(Iface, TProcessor): def __init__(self, handler): @@ -1457,6 +1584,8 @@ def __init__(self, handler): self._processMap["pltfm_mgr_pwr_rail_info_get"] = Processor.process_pltfm_mgr_pwr_rail_info_get self._processMap["pltfm_mgr_fan_speed_set"] = Processor.process_pltfm_mgr_fan_speed_set self._processMap["pltfm_mgr_fan_info_get"] = Processor.process_pltfm_mgr_fan_info_get + self._processMap["pltfm_mgr_qsfp_cached_num_bytes_get"] = Processor.process_pltfm_mgr_qsfp_cached_num_bytes_get + self._processMap["pltfm_mgr_qsfp_cached_page_get"] = Processor.process_pltfm_mgr_qsfp_cached_page_get self._processMap["pltfm_mgr_qsfp_presence_get"] = Processor.process_pltfm_mgr_qsfp_presence_get self._processMap["pltfm_mgr_qsfp_detect_transceiver"] = Processor.process_pltfm_mgr_qsfp_detect_transceiver self._processMap["pltfm_mgr_qsfp_info_get"] = Processor.process_pltfm_mgr_qsfp_info_get @@ -1483,6 +1612,7 @@ def __init__(self, handler): self._processMap["pltfm_mgr_qsfp_pwr_override_set"] = Processor.process_pltfm_mgr_qsfp_pwr_override_set self._processMap["pltfm_mgr_qsfp_lpmode_set"] = Processor.process_pltfm_mgr_qsfp_lpmode_set self._processMap["pltfm_mgr_sensor_info_get"] = Processor.process_pltfm_mgr_sensor_info_get + self._processMap["pltfm_mgr_chss_mgmt_bmc_get"] = Processor.process_pltfm_mgr_chss_mgmt_bmc_get self._on_message_begin = None def on_message_begin(self, func): @@ -1710,6 +1840,58 @@ def process_pltfm_mgr_fan_info_get(self, seqid, iprot, oprot): oprot.writeMessageEnd() oprot.trans.flush() + def process_pltfm_mgr_qsfp_cached_num_bytes_get(self, seqid, iprot, oprot): + args = pltfm_mgr_qsfp_cached_num_bytes_get_args() + args.read(iprot) + iprot.readMessageEnd() + result = pltfm_mgr_qsfp_cached_num_bytes_get_result() + try: + result.success = self._handler.pltfm_mgr_qsfp_cached_num_bytes_get(args.port_num, args.page, args.offset, args.length) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except InvalidPltfmMgrOperation as ouch: + msg_type = TMessageType.REPLY + result.ouch = ouch + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("pltfm_mgr_qsfp_cached_num_bytes_get", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_pltfm_mgr_qsfp_cached_page_get(self, seqid, iprot, oprot): + args = pltfm_mgr_qsfp_cached_page_get_args() + args.read(iprot) + iprot.readMessageEnd() + result = pltfm_mgr_qsfp_cached_page_get_result() + try: + result.success = self._handler.pltfm_mgr_qsfp_cached_page_get(args.port_num, args.page) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except InvalidPltfmMgrOperation as ouch: + msg_type = TMessageType.REPLY + result.ouch = ouch + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("pltfm_mgr_qsfp_cached_page_get", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + def process_pltfm_mgr_qsfp_presence_get(self, seqid, iprot, oprot): args = pltfm_mgr_qsfp_presence_get_args() args.read(iprot) @@ -2386,6 +2568,32 @@ def process_pltfm_mgr_sensor_info_get(self, seqid, iprot, oprot): oprot.writeMessageEnd() oprot.trans.flush() + def process_pltfm_mgr_chss_mgmt_bmc_get(self, seqid, iprot, oprot): + args = pltfm_mgr_chss_mgmt_bmc_get_args() + args.read(iprot) + iprot.readMessageEnd() + result = pltfm_mgr_chss_mgmt_bmc_get_result() + try: + result.success = self._handler.pltfm_mgr_chss_mgmt_bmc_get() + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except InvalidPltfmMgrOperation as ouch: + msg_type = TMessageType.REPLY + result.ouch = ouch + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("pltfm_mgr_chss_mgmt_bmc_get", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + # HELPER FUNCTIONS AND STRUCTURES @@ -2585,8 +2793,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -2703,8 +2910,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -2839,8 +3045,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -2942,11 +3147,295 @@ def __ne__(self, other): all_structs.append(pltfm_mgr_pwr_supply_info_get_args) pltfm_mgr_pwr_supply_info_get_args.thrift_spec = ( None, # 0 - (1, TType.I16, 'ps_num', None, None, ), # 1 + (1, TType.I16, 'ps_num', None, None, ), # 1 +) + + +class pltfm_mgr_pwr_supply_info_get_result(object): + """ + Attributes: + - success + - ouch + + """ + + + def __init__(self, success=None, ouch=None,): + self.success = success + self.ouch = ouch + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRUCT: + self.success = pltfm_mgr_pwr_supply_info_t() + self.success.read(iprot) + else: + iprot.skip(ftype) + elif fid == 1: + if ftype == TType.STRUCT: + self.ouch = InvalidPltfmMgrOperation.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_pwr_supply_info_get_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRUCT, 0) + self.success.write(oprot) + oprot.writeFieldEnd() + if self.ouch is not None: + oprot.writeFieldBegin('ouch', TType.STRUCT, 1) + self.ouch.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_pwr_supply_info_get_result) +pltfm_mgr_pwr_supply_info_get_result.thrift_spec = ( + (0, TType.STRUCT, 'success', [pltfm_mgr_pwr_supply_info_t, None], None, ), # 0 + (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 +) + + +class pltfm_mgr_pwr_rail_info_get_args(object): + """ + Attributes: + - ps_num + + """ + + + def __init__(self, ps_num=None,): + self.ps_num = ps_num + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I16: + self.ps_num = iprot.readI16() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_pwr_rail_info_get_args') + if self.ps_num is not None: + oprot.writeFieldBegin('ps_num', TType.I16, 1) + oprot.writeI16(self.ps_num) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_pwr_rail_info_get_args) +pltfm_mgr_pwr_rail_info_get_args.thrift_spec = ( + None, # 0 + (1, TType.I16, 'ps_num', None, None, ), # 1 +) + + +class pltfm_mgr_pwr_rail_info_get_result(object): + """ + Attributes: + - success + - ouch + + """ + + + def __init__(self, success=None, ouch=None,): + self.success = success + self.ouch = ouch + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRUCT: + self.success = pltfm_mgr_pwr_rail_info_t() + self.success.read(iprot) + else: + iprot.skip(ftype) + elif fid == 1: + if ftype == TType.STRUCT: + self.ouch = InvalidPltfmMgrOperation.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_pwr_rail_info_get_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRUCT, 0) + self.success.write(oprot) + oprot.writeFieldEnd() + if self.ouch is not None: + oprot.writeFieldBegin('ouch', TType.STRUCT, 1) + self.ouch.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_pwr_rail_info_get_result) +pltfm_mgr_pwr_rail_info_get_result.thrift_spec = ( + (0, TType.STRUCT, 'success', [pltfm_mgr_pwr_rail_info_t, None], None, ), # 0 + (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 +) + + +class pltfm_mgr_fan_speed_set_args(object): + """ + Attributes: + - fan_num + - percent + + """ + + + def __init__(self, fan_num=None, percent=None,): + self.fan_num = fan_num + self.percent = percent + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.fan_num = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.I32: + self.percent = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_fan_speed_set_args') + if self.fan_num is not None: + oprot.writeFieldBegin('fan_num', TType.I32, 1) + oprot.writeI32(self.fan_num) + oprot.writeFieldEnd() + if self.percent is not None: + oprot.writeFieldBegin('percent', TType.I32, 2) + oprot.writeI32(self.percent) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_fan_speed_set_args) +pltfm_mgr_fan_speed_set_args.thrift_spec = ( + None, # 0 + (1, TType.I32, 'fan_num', None, None, ), # 1 + (2, TType.I32, 'percent', None, None, ), # 2 ) -class pltfm_mgr_pwr_supply_info_get_result(object): +class pltfm_mgr_fan_speed_set_result(object): """ Attributes: - success @@ -2969,15 +3458,13 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 0: - if ftype == TType.STRUCT: - self.success = pltfm_mgr_pwr_supply_info_t() - self.success.read(iprot) + if ftype == TType.I32: + self.success = iprot.readI32() else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -2989,10 +3476,10 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_pwr_supply_info_get_result') + oprot.writeStructBegin('pltfm_mgr_fan_speed_set_result') if self.success is not None: - oprot.writeFieldBegin('success', TType.STRUCT, 0) - self.success.write(oprot) + oprot.writeFieldBegin('success', TType.I32, 0) + oprot.writeI32(self.success) oprot.writeFieldEnd() if self.ouch is not None: oprot.writeFieldBegin('ouch', TType.STRUCT, 1) @@ -3014,23 +3501,23 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_pwr_supply_info_get_result) -pltfm_mgr_pwr_supply_info_get_result.thrift_spec = ( - (0, TType.STRUCT, 'success', [pltfm_mgr_pwr_supply_info_t, None], None, ), # 0 +all_structs.append(pltfm_mgr_fan_speed_set_result) +pltfm_mgr_fan_speed_set_result.thrift_spec = ( + (0, TType.I32, 'success', None, None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) -class pltfm_mgr_pwr_rail_info_get_args(object): +class pltfm_mgr_fan_info_get_args(object): """ Attributes: - - ps_num + - fan_num """ - def __init__(self, ps_num=None,): - self.ps_num = ps_num + def __init__(self, fan_num=None,): + self.fan_num = fan_num def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3042,8 +3529,8 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 1: - if ftype == TType.I16: - self.ps_num = iprot.readI16() + if ftype == TType.I32: + self.fan_num = iprot.readI32() else: iprot.skip(ftype) else: @@ -3055,10 +3542,10 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_pwr_rail_info_get_args') - if self.ps_num is not None: - oprot.writeFieldBegin('ps_num', TType.I16, 1) - oprot.writeI16(self.ps_num) + oprot.writeStructBegin('pltfm_mgr_fan_info_get_args') + if self.fan_num is not None: + oprot.writeFieldBegin('fan_num', TType.I32, 1) + oprot.writeI32(self.fan_num) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -3076,14 +3563,14 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_pwr_rail_info_get_args) -pltfm_mgr_pwr_rail_info_get_args.thrift_spec = ( +all_structs.append(pltfm_mgr_fan_info_get_args) +pltfm_mgr_fan_info_get_args.thrift_spec = ( None, # 0 - (1, TType.I16, 'ps_num', None, None, ), # 1 + (1, TType.I32, 'fan_num', None, None, ), # 1 ) -class pltfm_mgr_pwr_rail_info_get_result(object): +class pltfm_mgr_fan_info_get_result(object): """ Attributes: - success @@ -3107,14 +3594,13 @@ def read(self, iprot): break if fid == 0: if ftype == TType.STRUCT: - self.success = pltfm_mgr_pwr_rail_info_t() + self.success = pltfm_mgr_fan_info_t() self.success.read(iprot) else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3126,7 +3612,7 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_pwr_rail_info_get_result') + oprot.writeStructBegin('pltfm_mgr_fan_info_get_result') if self.success is not None: oprot.writeFieldBegin('success', TType.STRUCT, 0) self.success.write(oprot) @@ -3151,25 +3637,29 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_pwr_rail_info_get_result) -pltfm_mgr_pwr_rail_info_get_result.thrift_spec = ( - (0, TType.STRUCT, 'success', [pltfm_mgr_pwr_rail_info_t, None], None, ), # 0 +all_structs.append(pltfm_mgr_fan_info_get_result) +pltfm_mgr_fan_info_get_result.thrift_spec = ( + (0, TType.STRUCT, 'success', [pltfm_mgr_fan_info_t, None], None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) -class pltfm_mgr_fan_speed_set_args(object): +class pltfm_mgr_qsfp_cached_num_bytes_get_args(object): """ Attributes: - - fan_num - - percent + - port_num + - page + - offset + - length """ - def __init__(self, fan_num=None, percent=None,): - self.fan_num = fan_num - self.percent = percent + def __init__(self, port_num=None, page=None, offset=None, length=None,): + self.port_num = port_num + self.page = page + self.offset = offset + self.length = length def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3182,12 +3672,22 @@ def read(self, iprot): break if fid == 1: if ftype == TType.I32: - self.fan_num = iprot.readI32() + self.port_num = iprot.readI32() else: iprot.skip(ftype) elif fid == 2: if ftype == TType.I32: - self.percent = iprot.readI32() + self.page = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.I32: + self.offset = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.I32: + self.length = iprot.readI32() else: iprot.skip(ftype) else: @@ -3199,14 +3699,22 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_fan_speed_set_args') - if self.fan_num is not None: - oprot.writeFieldBegin('fan_num', TType.I32, 1) - oprot.writeI32(self.fan_num) + oprot.writeStructBegin('pltfm_mgr_qsfp_cached_num_bytes_get_args') + if self.port_num is not None: + oprot.writeFieldBegin('port_num', TType.I32, 1) + oprot.writeI32(self.port_num) oprot.writeFieldEnd() - if self.percent is not None: - oprot.writeFieldBegin('percent', TType.I32, 2) - oprot.writeI32(self.percent) + if self.page is not None: + oprot.writeFieldBegin('page', TType.I32, 2) + oprot.writeI32(self.page) + oprot.writeFieldEnd() + if self.offset is not None: + oprot.writeFieldBegin('offset', TType.I32, 3) + oprot.writeI32(self.offset) + oprot.writeFieldEnd() + if self.length is not None: + oprot.writeFieldBegin('length', TType.I32, 4) + oprot.writeI32(self.length) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -3224,15 +3732,17 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_fan_speed_set_args) -pltfm_mgr_fan_speed_set_args.thrift_spec = ( +all_structs.append(pltfm_mgr_qsfp_cached_num_bytes_get_args) +pltfm_mgr_qsfp_cached_num_bytes_get_args.thrift_spec = ( None, # 0 - (1, TType.I32, 'fan_num', None, None, ), # 1 - (2, TType.I32, 'percent', None, None, ), # 2 + (1, TType.I32, 'port_num', None, None, ), # 1 + (2, TType.I32, 'page', None, None, ), # 2 + (3, TType.I32, 'offset', None, None, ), # 3 + (4, TType.I32, 'length', None, None, ), # 4 ) -class pltfm_mgr_fan_speed_set_result(object): +class pltfm_mgr_qsfp_cached_num_bytes_get_result(object): """ Attributes: - success @@ -3255,14 +3765,13 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 0: - if ftype == TType.I32: - self.success = iprot.readI32() + if ftype == TType.STRING: + self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3274,10 +3783,10 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_fan_speed_set_result') + oprot.writeStructBegin('pltfm_mgr_qsfp_cached_num_bytes_get_result') if self.success is not None: - oprot.writeFieldBegin('success', TType.I32, 0) - oprot.writeI32(self.success) + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) oprot.writeFieldEnd() if self.ouch is not None: oprot.writeFieldBegin('ouch', TType.STRUCT, 1) @@ -3299,23 +3808,25 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_fan_speed_set_result) -pltfm_mgr_fan_speed_set_result.thrift_spec = ( - (0, TType.I32, 'success', None, None, ), # 0 +all_structs.append(pltfm_mgr_qsfp_cached_num_bytes_get_result) +pltfm_mgr_qsfp_cached_num_bytes_get_result.thrift_spec = ( + (0, TType.STRING, 'success', 'UTF8', None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) -class pltfm_mgr_fan_info_get_args(object): +class pltfm_mgr_qsfp_cached_page_get_args(object): """ Attributes: - - fan_num + - port_num + - page """ - def __init__(self, fan_num=None,): - self.fan_num = fan_num + def __init__(self, port_num=None, page=None,): + self.port_num = port_num + self.page = page def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3328,7 +3839,12 @@ def read(self, iprot): break if fid == 1: if ftype == TType.I32: - self.fan_num = iprot.readI32() + self.port_num = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.I32: + self.page = iprot.readI32() else: iprot.skip(ftype) else: @@ -3340,10 +3856,14 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_fan_info_get_args') - if self.fan_num is not None: - oprot.writeFieldBegin('fan_num', TType.I32, 1) - oprot.writeI32(self.fan_num) + oprot.writeStructBegin('pltfm_mgr_qsfp_cached_page_get_args') + if self.port_num is not None: + oprot.writeFieldBegin('port_num', TType.I32, 1) + oprot.writeI32(self.port_num) + oprot.writeFieldEnd() + if self.page is not None: + oprot.writeFieldBegin('page', TType.I32, 2) + oprot.writeI32(self.page) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -3361,14 +3881,15 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_fan_info_get_args) -pltfm_mgr_fan_info_get_args.thrift_spec = ( +all_structs.append(pltfm_mgr_qsfp_cached_page_get_args) +pltfm_mgr_qsfp_cached_page_get_args.thrift_spec = ( None, # 0 - (1, TType.I32, 'fan_num', None, None, ), # 1 + (1, TType.I32, 'port_num', None, None, ), # 1 + (2, TType.I32, 'page', None, None, ), # 2 ) -class pltfm_mgr_fan_info_get_result(object): +class pltfm_mgr_qsfp_cached_page_get_result(object): """ Attributes: - success @@ -3391,15 +3912,13 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 0: - if ftype == TType.STRUCT: - self.success = pltfm_mgr_fan_info_t() - self.success.read(iprot) + if ftype == TType.STRING: + self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3411,10 +3930,10 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_fan_info_get_result') + oprot.writeStructBegin('pltfm_mgr_qsfp_cached_page_get_result') if self.success is not None: - oprot.writeFieldBegin('success', TType.STRUCT, 0) - self.success.write(oprot) + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) oprot.writeFieldEnd() if self.ouch is not None: oprot.writeFieldBegin('ouch', TType.STRUCT, 1) @@ -3436,9 +3955,9 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_fan_info_get_result) -pltfm_mgr_fan_info_get_result.thrift_spec = ( - (0, TType.STRUCT, 'success', [pltfm_mgr_fan_info_t, None], None, ), # 0 +all_structs.append(pltfm_mgr_qsfp_cached_page_get_result) +pltfm_mgr_qsfp_cached_page_get_result.thrift_spec = ( + (0, TType.STRING, 'success', 'UTF8', None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) @@ -3534,8 +4053,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3670,8 +4188,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3801,13 +4318,12 @@ def read(self, iprot): break if fid == 0: if ftype == TType.STRING: - self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -3923,8 +4439,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4071,8 +4586,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4207,8 +4721,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4367,8 +4880,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4503,8 +5015,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4644,8 +5155,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4788,8 +5298,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -4932,8 +5441,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5077,8 +5585,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5222,8 +5729,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5367,8 +5873,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5511,8 +6016,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5655,8 +6159,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5799,8 +6302,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -5938,8 +6440,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6074,8 +6575,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6211,8 +6711,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6359,8 +6858,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6495,8 +6993,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6631,8 +7128,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6791,8 +7287,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -6939,8 +7434,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -7006,7 +7500,7 @@ def read(self, iprot): break if fid == 1: if ftype == TType.STRING: - self.options = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.options = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) else: @@ -7070,13 +7564,12 @@ def read(self, iprot): break if fid == 0: if ftype == TType.STRING: - self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 1: if ftype == TType.STRUCT: - self.ouch = InvalidPltfmMgrOperation() - self.ouch.read(iprot) + self.ouch = InvalidPltfmMgrOperation.read(iprot) else: iprot.skip(ftype) else: @@ -7118,6 +7611,121 @@ def __ne__(self, other): (0, TType.STRING, 'success', 'UTF8', None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) + + +class pltfm_mgr_chss_mgmt_bmc_get_args(object): + + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_get_args') + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_chss_mgmt_bmc_get_args) +pltfm_mgr_chss_mgmt_bmc_get_args.thrift_spec = ( +) + + +class pltfm_mgr_chss_mgmt_bmc_get_result(object): + """ + Attributes: + - success + - ouch + + """ + + + def __init__(self, success=None, ouch=None,): + self.success = success + self.ouch = ouch + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRING: + self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + elif fid == 1: + if ftype == TType.STRUCT: + self.ouch = InvalidPltfmMgrOperation.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_get_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) + oprot.writeFieldEnd() + if self.ouch is not None: + oprot.writeFieldBegin('ouch', TType.STRUCT, 1) + self.ouch.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_chss_mgmt_bmc_get_result) +pltfm_mgr_chss_mgmt_bmc_get_result.thrift_spec = ( + (0, TType.STRING, 'success', 'UTF8', None, ), # 0 + (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 +) fix_spec(all_structs) del all_structs - diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py index da4a62d4eeff..501596941664 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py @@ -1,5 +1,5 @@ # -# Autogenerated by Thrift Compiler (0.13.0) +# Autogenerated by Thrift Compiler (0.14.1) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # @@ -16,6 +16,24 @@ all_structs = [] +class qsfp_eeprom_page_t(object): + PAGE0_LOWER = 0 + PAGE0_UPPER = 1 + PAGE3 = 2 + + _VALUES_TO_NAMES = { + 0: "PAGE0_LOWER", + 1: "PAGE0_UPPER", + 2: "PAGE3", + } + + _NAMES_TO_VALUES = { + "PAGE0_LOWER": 0, + "PAGE0_UPPER": 1, + "PAGE3": 2, + } + + class pltfm_mgr_sys_tmp_t(object): """ Attributes: @@ -241,37 +259,37 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 2: if ftype == TType.STRING: - self.prod_name = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.prod_name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 3: if ftype == TType.STRING: - self.prod_part_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.prod_part_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 4: if ftype == TType.STRING: - self.sys_asm_part_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.sys_asm_part_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 5: if ftype == TType.STRING: - self.bfn_pcba_part_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.bfn_pcba_part_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 6: if ftype == TType.STRING: - self.bfn_pcbb_part_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.bfn_pcbb_part_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 7: if ftype == TType.STRING: - self.odm_pcba_part_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.odm_pcba_part_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 8: if ftype == TType.STRING: - self.odm_pcba_ser_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.odm_pcba_ser_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 9: @@ -291,42 +309,42 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 12: if ftype == TType.STRING: - self.prod_ser_num = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.prod_ser_num = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 13: if ftype == TType.STRING: - self.prod_ast_tag = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.prod_ast_tag = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 14: if ftype == TType.STRING: - self.sys_mfger = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.sys_mfger = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 15: if ftype == TType.STRING: - self.sys_mfg_date = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.sys_mfg_date = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 16: if ftype == TType.STRING: - self.pcb_mfger = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.pcb_mfger = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 17: if ftype == TType.STRING: - self.assembled_at = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.assembled_at = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 18: if ftype == TType.STRING: - self.loc_mac_addr = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.loc_mac_addr = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 19: if ftype == TType.STRING: - self.ext_mac_addr = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.ext_mac_addr = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 20: @@ -336,7 +354,7 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 21: if ftype == TType.STRING: - self.location = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.location = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 22: @@ -535,17 +553,17 @@ def read(self, iprot): iprot.skip(ftype) elif fid == 8: if ftype == TType.STRING: - self.model = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.model = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 9: if ftype == TType.STRING: - self.serial = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.serial = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) elif fid == 10: if ftype == TType.STRING: - self.rev = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + self.rev = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) else: @@ -1278,26 +1296,39 @@ class InvalidPltfmMgrOperation(TException): def __init__(self, code=None,): - self.code = code + super(InvalidPltfmMgrOperation, self).__setattr__('code', code) - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return + def __setattr__(self, *args): + raise TypeError("can't modify immutable instance") + + def __delattr__(self, *args): + raise TypeError("can't modify immutable instance") + + def __hash__(self): + return hash(self.__class__) ^ hash((self.code, )) + + @classmethod + def read(cls, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and cls.thrift_spec is not None: + return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec]) iprot.readStructBegin() + code = None while True: (fname, ftype, fid) = iprot.readFieldBegin() if ftype == TType.STOP: break if fid == 1: if ftype == TType.I32: - self.code = iprot.readI32() + code = iprot.readI32() else: iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() iprot.readStructEnd() + return cls( + code=code, + ) def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: From 861ea26d1887354033f4568059e1f3f79c4b62e3 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Thu, 10 Mar 2022 14:42:43 -0800 Subject: [PATCH 064/817] [yang]: Update DEVICE_METADATA yang models to support 'sub_role' (#10161) #### Why I did it Fix https://github.com/Azure/sonic-buildimage/issues/9591 #### How I did it Add 'sub_role' to device_metadata yang models. #### How to verify it Run UT for sonc-yang-models. --- src/sonic-yang-models/tests/files/sample_config_db.json | 3 ++- .../tests/yang_model_tests/tests/device_metadata.json | 5 ++++- .../yang_model_tests/tests_config/device_metadata.json | 9 +++++++++ .../yang-models/sonic-device_metadata.yang | 5 +++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 6dbffce671e9..920181646c46 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -302,7 +302,8 @@ "asic_name": "Asic0", "switch_id": "2", "switch_type": "voq", - "max_cores": "8" + "max_cores": "8", + "sub_role": "FrondEnd" } }, "VLAN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json index ca26e24cd329..ecfff6f69a6f 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json @@ -100,6 +100,9 @@ }, "DEVICE_METADATA_CORRECT_VOQ_CONFIG": { "desc": "Verifying VOQ configuration." - } + }, + "DEVICE_METADATA_VALID_SUB_ROLE_CONFIG": { + "desc": "Verifying valid sub_role configuration." + } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json index bfc9c080b758..de0d4e15dcee 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json @@ -274,5 +274,14 @@ } } } + }, + "DEVICE_METADATA_VALID_SUB_ROLE_CONFIG": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "sub_role": "FrontEnd" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index 0dc88f436d8f..87170850d895 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -127,6 +127,11 @@ module sonic-device_metadata { type string; } + leaf sub_role { + type string; + description "sub_role indicates if ASIC is FrondEnd or BackEnd."; + } + leaf downstream_subrole { type string; } From 560c0d989ad8426903eb1b4b665e718649629692 Mon Sep 17 00:00:00 2001 From: pavannaregundi <92989231+pavannaregundi@users.noreply.github.com> Date: Fri, 11 Mar 2022 04:53:21 +0530 Subject: [PATCH 065/817] Adding libubootenv-tool into bullseye image (#10146) Why I did it uboot env get and set commands fw_printenv/fw_setenv are not available in bullseye sonic image. Some platforms using them where failing. Ex: sonic-installer commands in marvell-armhf. In case of buster, u-boot-tools was providing these commands. How I did it Added libubootenv-tool which provides these tools along with other uboot tools in build_debian.sh. How to verify it root@localhost:# fw_printenv serverip serverip=10.4.50.39 root@localhost:# fw_setenv serverip 10.4.50.38 root@localhost:~# fw_printenv serverip serverip=10.4.50.38 Change-Id: I558f8737f41d83d3e8527ce340391ae8f978b6d8 Signed-off-by: Pavan Naregundi --- build_debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 73984cb6cc51..fb0d45263d64 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -190,7 +190,7 @@ if [ -f platform/$CONFIGURED_PLATFORM/modules ]; then fi ## Add mtd and uboot firmware tools package -sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install u-boot-tools mtd-utils device-tree-compiler +sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install u-boot-tools libubootenv-tool mtd-utils device-tree-compiler ## Install docker echo '[INFO] Install docker' From f34b5e601d8e5cfa8af70718edf04374f25abf13 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 11 Mar 2022 09:21:35 +0800 Subject: [PATCH 066/817] [Submodule]: Update submodule for sonic-telemetry (#10124) e56e9b4 Fix CVE-2021-3121 warning (#96) bf1be4f [ci]: Support code diff coverage threshold 50% (#94) 64e516c Ported Marvell armhf build on x86 for debian buster to use cross-compilation instead of qemu emulation (#80) e426388 [ci]: Support azp code coverage (#87) --- src/sonic-telemetry | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-telemetry b/src/sonic-telemetry index 0443e6605025..e56e9b44e4a7 160000 --- a/src/sonic-telemetry +++ b/src/sonic-telemetry @@ -1 +1 @@ -Subproject commit 0443e66050256a87f8e92db7cd3c36cc139ebe14 +Subproject commit e56e9b44e4a7e3b211f070c298041951c543885b From 9cdf81230b3819c45a5680ea0970474869da3569 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 11 Mar 2022 09:23:37 +0800 Subject: [PATCH 067/817] [Build]: Fix /proc not mounted issue (#10164) [Build]: Fix /proc not mounted issue --- build_debian.sh | 3 +++ files/build_templates/sonic_debian_extension.j2 | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index fb0d45263d64..41741d6c5f8a 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -67,6 +67,9 @@ mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/x86_64-grub touch $FILESYSTEM_ROOT/$PLATFORM_DIR/firsttime +## ensure proc is mounted +sudo mount proc /proc -t proc || true + ## make / as a mountpoint in chroot env, needed by dockerd pushd $FILESYSTEM_ROOT sudo mount --bind . . diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 0a2b5536232b..991b838a6d23 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -648,10 +648,7 @@ if [ $MULTIARCH_QEMU_ENVIRON == y ]; then fi {% if installer_images.strip() -%} -clean_proc() { - sudo umount /proc || true -} -trap_push clean_proc +## ensure proc is mounted sudo mount proc /proc -t proc || true sudo mkdir $FILESYSTEM_ROOT/target sudo mount --bind target $FILESYSTEM_ROOT/target @@ -732,7 +729,6 @@ if [ $MULTIARCH_QEMU_ENVIRON == y ]; then else sudo chroot $FILESYSTEM_ROOT $DOCKER_CTL_SCRIPT stop fi -sudo umount /proc || true sudo bash -c "echo { > $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_names.json" {% for entry in feature_vs_image_names.split(' ') -%} From 759172dc8b50180800082c125796c2d3aaa9a33a Mon Sep 17 00:00:00 2001 From: Taras Keryk Date: Fri, 11 Mar 2022 11:31:27 +0200 Subject: [PATCH 068/817] [BFN] Regenerated pltfm_mgr_rpc.py to the latest version (#10180) (#10208) Signed-off-by: Taras Keryk Why I did it The previous implementaion of API for platform component didn't have the new thrift files How I did it Add the new thrift-generated: pltfm_mgr_rpc.py, ttypes.py How to verify it Run manually 'fwutil show status' or run unit tests Previous command output had no information about components New command output Chassis Module Component Version Description ------------------------ -------- ----------- --------- ------------- Chassis1 N/A BIOS 1.2.3 Chassis BIOS BMC 5.1 Chassis BMC --- .../pltfm_mgr_rpc/pltfm_mgr_rpc.py | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py index 25ab556b3758..0fa03d58b31a 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py @@ -304,7 +304,7 @@ def pltfm_mgr_sensor_info_get(self, options): """ pass - def pltfm_mgr_chss_mgmt_bmc_get(self): + def pltfm_mgr_chss_mgmt_bmc_ver_get(self): pass @@ -1543,18 +1543,18 @@ def recv_pltfm_mgr_sensor_info_get(self): raise result.ouch raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_sensor_info_get failed: unknown result") - def pltfm_mgr_chss_mgmt_bmc_get(self): - self.send_pltfm_mgr_chss_mgmt_bmc_get() - return self.recv_pltfm_mgr_chss_mgmt_bmc_get() + def pltfm_mgr_chss_mgmt_bmc_ver_get(self): + self.send_pltfm_mgr_chss_mgmt_bmc_ver_get() + return self.recv_pltfm_mgr_chss_mgmt_bmc_ver_get() - def send_pltfm_mgr_chss_mgmt_bmc_get(self): - self._oprot.writeMessageBegin('pltfm_mgr_chss_mgmt_bmc_get', TMessageType.CALL, self._seqid) - args = pltfm_mgr_chss_mgmt_bmc_get_args() + def send_pltfm_mgr_chss_mgmt_bmc_ver_get(self): + self._oprot.writeMessageBegin('pltfm_mgr_chss_mgmt_bmc_ver_get', TMessageType.CALL, self._seqid) + args = pltfm_mgr_chss_mgmt_bmc_ver_get_args() args.write(self._oprot) self._oprot.writeMessageEnd() self._oprot.trans.flush() - def recv_pltfm_mgr_chss_mgmt_bmc_get(self): + def recv_pltfm_mgr_chss_mgmt_bmc_ver_get(self): iprot = self._iprot (fname, mtype, rseqid) = iprot.readMessageBegin() if mtype == TMessageType.EXCEPTION: @@ -1562,14 +1562,14 @@ def recv_pltfm_mgr_chss_mgmt_bmc_get(self): x.read(iprot) iprot.readMessageEnd() raise x - result = pltfm_mgr_chss_mgmt_bmc_get_result() + result = pltfm_mgr_chss_mgmt_bmc_ver_get_result() result.read(iprot) iprot.readMessageEnd() if result.success is not None: return result.success if result.ouch is not None: raise result.ouch - raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_chss_mgmt_bmc_get failed: unknown result") + raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_chss_mgmt_bmc_ver_get failed: unknown result") class Processor(Iface, TProcessor): @@ -1612,7 +1612,7 @@ def __init__(self, handler): self._processMap["pltfm_mgr_qsfp_pwr_override_set"] = Processor.process_pltfm_mgr_qsfp_pwr_override_set self._processMap["pltfm_mgr_qsfp_lpmode_set"] = Processor.process_pltfm_mgr_qsfp_lpmode_set self._processMap["pltfm_mgr_sensor_info_get"] = Processor.process_pltfm_mgr_sensor_info_get - self._processMap["pltfm_mgr_chss_mgmt_bmc_get"] = Processor.process_pltfm_mgr_chss_mgmt_bmc_get + self._processMap["pltfm_mgr_chss_mgmt_bmc_ver_get"] = Processor.process_pltfm_mgr_chss_mgmt_bmc_ver_get self._on_message_begin = None def on_message_begin(self, func): @@ -2568,13 +2568,13 @@ def process_pltfm_mgr_sensor_info_get(self, seqid, iprot, oprot): oprot.writeMessageEnd() oprot.trans.flush() - def process_pltfm_mgr_chss_mgmt_bmc_get(self, seqid, iprot, oprot): - args = pltfm_mgr_chss_mgmt_bmc_get_args() + def process_pltfm_mgr_chss_mgmt_bmc_ver_get(self, seqid, iprot, oprot): + args = pltfm_mgr_chss_mgmt_bmc_ver_get_args() args.read(iprot) iprot.readMessageEnd() - result = pltfm_mgr_chss_mgmt_bmc_get_result() + result = pltfm_mgr_chss_mgmt_bmc_ver_get_result() try: - result.success = self._handler.pltfm_mgr_chss_mgmt_bmc_get() + result.success = self._handler.pltfm_mgr_chss_mgmt_bmc_ver_get() msg_type = TMessageType.REPLY except TTransport.TTransportException: raise @@ -2589,7 +2589,7 @@ def process_pltfm_mgr_chss_mgmt_bmc_get(self, seqid, iprot, oprot): logging.exception('Unexpected exception in handler') msg_type = TMessageType.EXCEPTION result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') - oprot.writeMessageBegin("pltfm_mgr_chss_mgmt_bmc_get", msg_type, seqid) + oprot.writeMessageBegin("pltfm_mgr_chss_mgmt_bmc_ver_get", msg_type, seqid) result.write(oprot) oprot.writeMessageEnd() oprot.trans.flush() @@ -7613,7 +7613,7 @@ def __ne__(self, other): ) -class pltfm_mgr_chss_mgmt_bmc_get_args(object): +class pltfm_mgr_chss_mgmt_bmc_ver_get_args(object): def read(self, iprot): @@ -7634,7 +7634,7 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_get_args') + oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_ver_get_args') oprot.writeFieldStop() oprot.writeStructEnd() @@ -7651,12 +7651,12 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_chss_mgmt_bmc_get_args) -pltfm_mgr_chss_mgmt_bmc_get_args.thrift_spec = ( +all_structs.append(pltfm_mgr_chss_mgmt_bmc_ver_get_args) +pltfm_mgr_chss_mgmt_bmc_ver_get_args.thrift_spec = ( ) -class pltfm_mgr_chss_mgmt_bmc_get_result(object): +class pltfm_mgr_chss_mgmt_bmc_ver_get_result(object): """ Attributes: - success @@ -7697,7 +7697,7 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_get_result') + oprot.writeStructBegin('pltfm_mgr_chss_mgmt_bmc_ver_get_result') if self.success is not None: oprot.writeFieldBegin('success', TType.STRING, 0) oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) @@ -7722,8 +7722,8 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) -all_structs.append(pltfm_mgr_chss_mgmt_bmc_get_result) -pltfm_mgr_chss_mgmt_bmc_get_result.thrift_spec = ( +all_structs.append(pltfm_mgr_chss_mgmt_bmc_ver_get_result) +pltfm_mgr_chss_mgmt_bmc_ver_get_result.thrift_spec = ( (0, TType.STRING, 'success', 'UTF8', None, ), # 0 (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 ) From a29ba9cf22c4145bad119a2578cbb88eb8d31f37 Mon Sep 17 00:00:00 2001 From: Yang Wang Date: Fri, 11 Mar 2022 17:35:17 +0800 Subject: [PATCH 069/817] Correct thrift 0141 typo fix (#10199) Correct libsaithrift dependency package name from LIBTHRIFT_DEV_0_14_1 THRIFT_COMPILER_0_14_1 to LIBTHRIFT_0_14_1_DEV THRIFT_0_14_1_COMPILER How I did it How to verify it Test Done: make BLDENV=buster SAITHRIFT_V2=y -f Makefile.work target/debs/buster/saiserverv2_0.9.4_amd64.deb --- platform/broadcom/libsaithrift-dev.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/libsaithrift-dev.mk b/platform/broadcom/libsaithrift-dev.mk index 1e4d0da13bbe..c1bd9b90de13 100644 --- a/platform/broadcom/libsaithrift-dev.mk +++ b/platform/broadcom/libsaithrift-dev.mk @@ -6,7 +6,7 @@ LIBSAITHRIFT_DEV = libsaithrift$(SAITHRIFT_VER)-dev_$(SAI_VER)_amd64.deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI #Support two different versions of thrift ifeq ($(SAITHRIFT_V2),y) -$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT_0_14_1) $(LIBTHRIFT_DEV_0_14_1) $(PYTHON3_THRIFT_0_14_1) $(THRIFT_COMPILER_0_14_1) +$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT_0_14_1) $(LIBTHRIFT_0_14_1_DEV) $(PYTHON3_THRIFT_0_14_1) $(THRIFT_0_14_1_COMPILER) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT_0_14_1) $(LIBSAITHRIFT_DEV)_BUILD_ENV = SAITHRIFTV2=true SAITHRIFT_VER=v2 else From 8d419ca2c59b0f75c24ba4ed73fbdc7df7812260 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 11 Mar 2022 08:09:07 -0800 Subject: [PATCH 070/817] [Arista] Remove arista.log from rsyslog default logrotate (#9731) Why I did it In parallel of this change Arista added a custom logrotate configuration as part of its driver library. Having 2 logrotate configuration for the same log file triggers an issue. Fixes aristanetworks/sonic#38 How I did it Arista merged a few changes in sonic-buildimage which added a logrotate configuration aristanetworks/sonic@e43c797 It is therefore the right path to remove the arista.log line from the logrotate.d/rsyslog configuration. How to verify it Logrotate works without any error message, arista log rotation happens and arista daemons still append logs once file was truncated. --- files/image_config/logrotate/rsyslog.j2 | 1 - 1 file changed, 1 deletion(-) diff --git a/files/image_config/logrotate/rsyslog.j2 b/files/image_config/logrotate/rsyslog.j2 index 1a5c92c33828..28a7d9dd2ee0 100644 --- a/files/image_config/logrotate/rsyslog.j2 +++ b/files/image_config/logrotate/rsyslog.j2 @@ -24,7 +24,6 @@ } /var/log/auth.log -/var/log/arista.log /var/log/cron.log /var/log/syslog /var/log/teamd.log From 092b0b2ba10a791bd703794a6e7a813380c412d4 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 12 Mar 2022 19:07:10 +0800 Subject: [PATCH 071/817] [Build]: fix some version info missing in version control files issue (#10211) [Build]: fix some version info missing in version control files issue --- build_debian.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 41741d6c5f8a..6ffa2eb62fdc 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -562,6 +562,9 @@ if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then fi fi +# Collect host image version files before cleanup +scripts/collect_host_image_version_files.sh $TARGET_PATH $FILESYSTEM_ROOT + # Remove GCC sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y remove gcc @@ -593,7 +596,6 @@ sudo rm -f $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS ## Note: -x to skip directories on different file systems, such as /proc sudo du -hsx $FILESYSTEM_ROOT sudo mkdir -p $FILESYSTEM_ROOT/var/lib/docker -scripts/collect_host_image_version_files.sh $TARGET_PATH $FILESYSTEM_ROOT sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -comp zstd -b 1M -e boot -e var/lib/docker -e $PLATFORM_DIR # Ensure admin gid is 1000 From ebe2d19623a00656181503f512908b8b2f5ded09 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 12 Mar 2022 19:08:21 +0800 Subject: [PATCH 072/817] [Build]: Clean up pip cache (#10143) [Build]: Clean up pip cache --- build_debian.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 6ffa2eb62fdc..62de5a8218fb 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -577,6 +577,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'rm -rf /usr/share/doc/* /usr/share/ ## Clean up proxy [ -n "$http_proxy" ] && sudo rm -f $FILESYSTEM_ROOT/etc/apt/apt.conf.d/01proxy +## Clean up pip cache +sudo LANG=C chroot $FILESYSTEM_ROOT pip3 cache purge + ## Umount all echo '[INFO] Umount all' ## Display all process details access /proc From b73da484c4d834f17a8563f39556e617fbc6869c Mon Sep 17 00:00:00 2001 From: xwjiang2021 <96218837+xwjiang2021@users.noreply.github.com> Date: Sat, 12 Mar 2022 20:18:12 +0800 Subject: [PATCH 073/817] Install the allure-pytest package globally in sonic-mgmt docker (#10216) Why I did it This fix is to address issue: Azure/sonic-mgmt#5280 In the sonic-mgmt Dockerfile, python package allure-pytest is installed after ENV USER $user. Consequently the package is installed to path /home/$user/.local and is only available to the $user account. If we use root account in sonic-mgmt docker container to run tests, any script importing the allure package will fail with ImportError. We need to install the allure-pytest package to global directory instead of user local directory. How I did it Update the sonic-mgmt Dockerfile to ensure that the allure-pytest package is installed to global directory How to verify it Build a new sonic-mgmt docker image based on the changes. Use sonic-mgmt docker container of the newly built image to run test scripts that depend on the allure-pytest package. No ImportError is raised. --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index e2054ae81ba1..8349df8e439f 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -21,7 +21,6 @@ RUN apt-get update && apt-get install -y build-essential \ python \ python-dev \ python-scapy \ - python-setuptools \ python-pip \ python3-pip \ python3-venv \ @@ -33,6 +32,7 @@ RUN apt-get update && apt-get install -y build-essential \ telnet \ vim +RUN pip install setuptools==44.1.1 RUN pip install cffi==1.10.0 \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ @@ -74,6 +74,7 @@ RUN pip install cffi==1.10.0 \ virtualenv \ retry \ thrift==0.11.0 \ + allure-pytest==2.8.22 \ && git clone https://github.com/p4lang/scapy-vxlan.git \ && cd scapy-vxlan \ && python setup.py install \ @@ -182,10 +183,6 @@ RUN python3 -m venv env-python3 # the end until we figure that out. RUN pip install pycryptodome==3.9.8 -# Install allure-pytest library -RUN pip install --upgrade setuptools \ - && pip install allure-pytest==2.8.22 - # Activating a virtualenv. The virtualenv automatically works for RUN, ENV and CMD. ENV VIRTUAL_ENV=env-python3 ARG BACKUP_OF_PATH="$PATH" From 7178c668dd69c551fd58f5ebaf584f75ae765961 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 14 Mar 2022 11:20:20 +0800 Subject: [PATCH 074/817] [Build]: Fix installing dpkg packages in parallel issue (#10175) Why I did it Fix the debian packages installing in parallel issue. Add apt hook command to support apt to print no version control info. --- src/sonic-build-hooks/hooks/apt | 5 ++ src/sonic-build-hooks/hooks/apt-get | 39 ++++------ .../scripts/buildinfo_base.sh | 74 +++++++++++++++++++ 3 files changed, 92 insertions(+), 26 deletions(-) create mode 100755 src/sonic-build-hooks/hooks/apt diff --git a/src/sonic-build-hooks/hooks/apt b/src/sonic-build-hooks/hooks/apt new file mode 100755 index 000000000000..f4b0f97287b1 --- /dev/null +++ b/src/sonic-build-hooks/hooks/apt @@ -0,0 +1,5 @@ +#!/bin/bash + +. /usr/local/share/buildinfo/scripts/buildinfo_base.sh + +APT_REAL_COMMAND=$(get_command apt) $(dirname "$0")/apt-get "$@" diff --git a/src/sonic-build-hooks/hooks/apt-get b/src/sonic-build-hooks/hooks/apt-get index 9ae50a118650..f1f789542b7a 100755 --- a/src/sonic-build-hooks/hooks/apt-get +++ b/src/sonic-build-hooks/hooks/apt-get @@ -3,36 +3,23 @@ INSTALL= . /usr/local/share/buildinfo/scripts/buildinfo_base.sh -REAL_COMMAND=$(get_command apt-get) +REAL_COMMAND=$APT_REAL_COMMAND +[ -z "$REAL_COMMAND" ] && REAL_COMMAND=$(get_command apt-get) if [ -z "$REAL_COMMAND" ]; then echo "The command apt-get does not exist." 1>&2 exit 1 fi -VERSION_FILE="/usr/local/share/buildinfo/versions/versions-deb" -if [ "$ENABLE_VERSION_CONTROL_DEB" == "y" ]; then - for para in $@ - do - if [[ "$para" != -* ]]; then - continue - fi - if [ ! -z "$INSTALL" ]; then - if [[ "$para" == *=* ]]; then - continue - elif [[ "$para" == *=* ]]; then - continue - else - package=$para - if ! grep -q "^${package}=" $VERSION_FILE; then - echo "The version of the package ${package} is not specified." - exit 1 - fi - fi - elif [[ "$para" == "install" ]]; then - INSTALL=y - fi - done +INSTALL=$(check_apt_install) +COMMAND_INFO="Locked by command: $REAL_COMMAND $@" +if [ "$INSTALL" == y ]; then + check_apt_version + lock_result=$(acquire_apt_installation_lock "$COMMAND_INFO" ) + $REAL_COMMAND "$@" + command_result=$? + [ "$lock_result" == y ] && release_apt_installation_lock + exit $command_result +else + $REAL_COMMAND "$@" fi - -$REAL_COMMAND "$@" diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index d46ffec18330..22ab3da4e9ae 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -12,6 +12,7 @@ VERSION_DEB_PREFERENCE=$BUILDINFO_PATH/versions/01-versions-deb WEB_VERSION_FILE=$VERSION_PATH/versions-web BUILD_WEB_VERSION_FILE=$BUILD_VERSION_PATH/versions-web REPR_MIRROR_URL_PATTERN='http:\/\/packages.trafficmanager.net\/debian' +DPKG_INSTALLTION_LOCK_FILE=/tmp/.dpkg_installation.lock . $BUILDINFO_PATH/config/buildinfo.config @@ -182,6 +183,79 @@ run_pip_command() return $result } +# Check if the command is to install the debian packages +# The apt/apt-get command format: apt/apt-get [options] {update|install} +check_apt_install() +{ + for para in "$@" + do + if [[ "$para" == -* ]]; then + continue + fi + + if [[ "$para" == "install" ]]; then + echo y + fi + + break + done +} + +# Print warning message if a debian package version not specified when debian version control enabled. +check_apt_version() +{ + VERSION_FILE="/usr/local/share/buildinfo/versions/versions-deb" + local install=$(check_apt_install "$@") + if [ "$ENABLE_VERSION_CONTROL_DEB" == "y" ] && [ "$install" == "y" ]; then + for para in "$@" + do + if [[ "$para" == -* ]]; then + continue + fi + + if [[ "$para" == *=* ]]; then + continue + else + package=$para + if ! grep -q "^${package}=" $VERSION_FILE; then + echo "Warning: the version of the package ${package} is not specified." 1>&2 + fi + fi + done + fi +} + +acquire_apt_installation_lock() +{ + local result=n + local wait_in_second=10 + local count=60 + local info="$1" + for ((i=1; i<=$count; i++)); do + if [ -f $DPKG_INSTALLTION_LOCK_FILE ]; then + local lock_info=$(cat $DPKG_INSTALLTION_LOCK_FILE || true) + echo "Waiting dpkg lock for $wait_in_second, $i/$count, info: $lock_info" 1>&2 + sleep $wait_in_second + else + # Create file in an atomic operation + if (set -o noclobber; echo "$info">$DPKG_INSTALLTION_LOCK_FILE) &>/dev/null; then + result=y + break + else + echo "Failed to creat lock, Waiting dpkg lock for $wait_in_second, $i/$count, info: $lock_info" 1>&2 + sleep $wait_in_second + fi + fi + done + + echo $result +} + +release_apt_installation_lock() +{ + rm -f $DPKG_INSTALLTION_LOCK_FILE +} + ENABLE_VERSION_CONTROL_DEB=$(check_version_control "deb") ENABLE_VERSION_CONTROL_PY2=$(check_version_control "py2") ENABLE_VERSION_CONTROL_PY3=$(check_version_control "py3") From eea3cc7ad167d2f53bee0a1e5d301f62802cbd12 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 14 Mar 2022 13:41:37 +0800 Subject: [PATCH 075/817] [Build]: only install grpc in amd64 (#10212) [Build]: only install grpc in amd64 Unblock marvell-armhf build. --- files/build_templates/sonic_debian_extension.j2 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 991b838a6d23..6cafa76014d1 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -131,8 +131,10 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install psutil sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install ipaddr # Install Python module for grpcio and grpcio-toole -sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install "grpcio==1.39.0" -sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install "grpcio-tools==1.39.0" +if [[ $CONFIGURED_ARCH == amd64 ]]; then + sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install "grpcio==1.39.0" + sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install "grpcio-tools==1.39.0" +fi # Install SwSS SDK Python 3 package # Note: the scripts will be overwritten by corresponding Python 2 package From 3fa627f290bf1d04a11aa13118bbbff57058bea3 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 14 Mar 2022 18:09:20 +0800 Subject: [PATCH 076/817] Add a config variable to override default container registry instead of dockerhub. (#10166) * Add variable to reset default docker registry * fix bug in docker version control --- Makefile.work | 9 +++++++-- dockers/docker-base-bullseye/Dockerfile.j2 | 7 ++++--- dockers/docker-base-buster/Dockerfile.j2 | 7 ++++--- dockers/docker-base-stretch/Dockerfile.j2 | 7 ++++--- dockers/docker-base/Dockerfile.j2 | 7 ++++--- dockers/docker-ptf/Dockerfile.j2 | 7 ++++--- dockers/docker-sonic-mgmt/Dockerfile.j2 | 3 ++- rules/config | 3 +++ scripts/docker_version_control.sh | 6 ++++-- slave.mk | 3 +++ sonic-slave-bullseye/Dockerfile.j2 | 11 ++++++----- sonic-slave-buster/Dockerfile.j2 | 9 +++++---- sonic-slave-jessie/Dockerfile.j2 | 7 ++++--- sonic-slave-stretch/Dockerfile.j2 | 7 ++++--- 14 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Makefile.work b/Makefile.work index 39879110d4e8..8042de7d198b 100644 --- a/Makefile.work +++ b/Makefile.work @@ -115,6 +115,10 @@ rules/config.user: include rules/config -include rules/config.user +ifneq ($(DEFAULT_CONTAINER_REGISTRY),) +override DEFAULT_CONTAINER_REGISTRY := $(DEFAULT_CONTAINER_REGISTRY)/ +endif + ifeq ($(ENABLE_DOCKER_BASE_PULL),) override ENABLE_DOCKER_BASE_PULL = n endif @@ -139,9 +143,9 @@ $(shell SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \ scripts/generate_buildinfo_config.sh) # Generate the slave Dockerfile, and prepare build info for it -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) -$(shell BUILD_SLAVE=y scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV)) +$(shell BUILD_SLAVE=y DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV)) # Add the versions in the tag, if the version change, need to rebuild the slave SLAVE_BASE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* src/sonic-build-hooks/hooks/* | sha1sum | awk '{print substr($$1,0,11);}') @@ -291,6 +295,7 @@ SONIC_BUILD_INSTRUCTION := make \ EXTRA_DOCKER_TARGETS=$(EXTRA_DOCKER_TARGETS) \ BUILD_LOG_TIMESTAMP=$(BUILD_LOG_TIMESTAMP) \ SONIC_ENABLE_IMAGE_SIGNATURE=$(ENABLE_IMAGE_SIGNATURE) \ + SONIC_DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ ENABLE_HOST_SERVICE_ON_START=$(ENABLE_HOST_SERVICE_ON_START) \ SLAVE_DIR=$(SLAVE_DIR) \ ENABLE_AUTO_TECH_SUPPORT=$(ENABLE_AUTO_TECH_SUPPORT) \ diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index 3ac14a4841c4..1b33003ce0a9 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -1,10 +1,11 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-bullseye +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-bullseye {% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-bullseye +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-bullseye {% else %} -FROM {{DOCKER_BASE_ARCH}}/debian:bullseye +FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bullseye {% endif %} # Clean documentation in FROM image diff --git a/dockers/docker-base-buster/Dockerfile.j2 b/dockers/docker-base-buster/Dockerfile.j2 index ac3fd7743e77..e16a0f677b07 100644 --- a/dockers/docker-base-buster/Dockerfile.j2 +++ b/dockers/docker-base-buster/Dockerfile.j2 @@ -1,10 +1,11 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-buster +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-buster {% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-buster +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-buster {% else %} -FROM {{DOCKER_BASE_ARCH}}/debian:buster +FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:buster {% endif %} # Clean documentation in FROM image diff --git a/dockers/docker-base-stretch/Dockerfile.j2 b/dockers/docker-base-stretch/Dockerfile.j2 index b77814bb2820..5603dc502792 100644 --- a/dockers/docker-base-stretch/Dockerfile.j2 +++ b/dockers/docker-base-stretch/Dockerfile.j2 @@ -1,10 +1,11 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-stretch {% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch {% else %} -FROM {{DOCKER_BASE_ARCH}}/debian:stretch +FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:stretch {% endif %} # Clean documentation in FROM image diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index 616a4cde7aff..15df3fe8a754 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -1,9 +1,10 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-jessie {% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-jessie {% else %} -FROM {{DOCKER_BASE_ARCH}}/debian:jessie +FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:jessie {% endif %} ## Remove retired jessie-updates repo diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index b152e94e99b0..d999d01e0026 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -1,9 +1,10 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-stretch {% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch {% else %} -FROM debian:buster +FROM {{ prefix }}debian:buster {% endif %} MAINTAINER Pavel Shirshov diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 8349df8e439f..df26f2ccf38c 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -1,4 +1,5 @@ -FROM ubuntu:18.04 +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} +FROM {{ prefix }}ubuntu:18.04 ENV DEBIAN_FRONTEND=noninteractive diff --git a/rules/config b/rules/config index c7ffbcaa4510..fe5d7ac3e991 100644 --- a/rules/config +++ b/rules/config @@ -211,3 +211,6 @@ INCLUDE_MUX = y # ENABLE_ASAN - enable address sanitizer ENABLE_ASAN ?= n + +# reset default container registry from dockerhub to other +DEFAULT_CONTAINER_REGISTRY ?= diff --git a/scripts/docker_version_control.sh b/scripts/docker_version_control.sh index 595477c859c6..da8cd0484f49 100755 --- a/scripts/docker_version_control.sh +++ b/scripts/docker_version_control.sh @@ -16,6 +16,8 @@ mkdir -p target/versions/default . src/sonic-build-hooks/buildinfo/config/buildinfo.config image_tag=`grep "^FROM " $DOCKERFILE | awk '{print$2}'` +image_tag_noprefix=$image_tag +[ -n "$DEFAULT_CONTAINER_REGISTRY" ] && image_tag_noprefix=$(echo $image_tag | sed "s#$DEFAULT_CONTAINER_REGISTRY##") image=`echo $image_tag | cut -f1 -d:` tag=`echo $image_tag | cut -f2 -d:` @@ -25,7 +27,7 @@ if [[ ",$SONIC_VERSION_CONTROL_COMPONENTS," == *,all,* ]] || [[ ",$SONIC_VERSION exit 0 fi if [ -f $version_file ];then - hash_value=`grep "${ARCH}:${image_tag}" $version_file | awk -F== '{print$2}'` + hash_value=`grep "${ARCH}:${image_tag_noprefix}" $version_file | awk -F== '{print$2}'` fi if [ -z $hash_value ];then hash_value=unknown @@ -43,5 +45,5 @@ else fi fi if [[ "$hash_value" != "unknown" ]];then - echo -e "${ARCH}:${image_tag}==$hash_value" >> $new_version_file + echo -e "${ARCH}:${image_tag_noprefix}==$hash_value" >> $new_version_file fi diff --git a/slave.mk b/slave.mk index 66831571aa7d..0bd81ff371a7 100644 --- a/slave.mk +++ b/slave.mk @@ -130,6 +130,8 @@ include $(RULES_PATH)/config export PACKAGE_URL_PREFIX export TRUSTED_GPG_URLS export SONIC_VERSION_CONTROL_COMPONENTS +DEFAULT_CONTAINER_REGISTRY := $(SONIC_DEFAULT_CONTAINER_REGISTRY) +export DEFAULT_CONTAINER_REGISTRY ifeq ($(SONIC_ENABLE_PFCWD_ON_START),y) ENABLE_PFCWD_ON_START = y @@ -326,6 +328,7 @@ $(info "PDDF_SUPPORT" : "$(PDDF_SUPPORT)") $(info "MULTIARCH_QEMU_ENVIRON" : "$(MULTIARCH_QEMU_ENVIRON)") $(info "SONIC_VERSION_CONTROL_COMPONENTS": "$(SONIC_VERSION_CONTROL_COMPONENTS)") $(info "ENABLE_ASAN" : "$(ENABLE_ASAN)") +$(info "DEFAULT_CONTAINER_REGISTRY" : "$(SONIC_DEFAULT_CONTAINER_REGISTRY)") ifeq ($(CONFIGURED_PLATFORM),vs) $(info "BUILD_MULTIASIC_KVM" : "$(BUILD_MULTIASIC_KVM)") endif diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index dc6ba779e264..a75cef0b680e 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -1,13 +1,14 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/qemu-user-static:x86_64-arm-6.1.0-8 as qemu -FROM multiarch/debian-debootstrap:armhf-bullseye +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm-6.1.0-8 as qemu +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-bullseye COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin {%- elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/qemu-user-static:x86_64-aarch64-6.1.0-8 as qemu -FROM multiarch/debian-debootstrap:arm64-bullseye +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-aarch64-6.1.0-8 as qemu +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-bullseye COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin {%- else -%} -FROM debian:bullseye +FROM {{ prefix }}debian:bullseye {%- endif %} MAINTAINER gulv@microsoft.com diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 715ad8e19057..fa8ac44f1b9e 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -1,11 +1,12 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/qemu-user-static:x86_64-arm-5.0.0-2 as qemu -FROM multiarch/debian-debootstrap:armhf-buster +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm-5.0.0-2 as qemu +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-buster COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin {%- elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-buster +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-buster {%- else -%} -FROM debian:buster +FROM {{ prefix }}debian:buster {%- endif %} MAINTAINER gulv@microsoft.com diff --git a/sonic-slave-jessie/Dockerfile.j2 b/sonic-slave-jessie/Dockerfile.j2 index 2eaa306cdce4..1d98e6d9b6c5 100644 --- a/sonic-slave-jessie/Dockerfile.j2 +++ b/sonic-slave-jessie/Dockerfile.j2 @@ -1,9 +1,10 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {%- if CONFIGURED_ARCH == "armhf" -%} -FROM multiarch/debian-debootstrap:armhf-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-jessie {%- elif CONFIGURED_ARCH == "arm64" -%} -FROM multiarch/debian-debootstrap:arm64-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-jessie {%- else -%} -FROM debian:jessie +FROM {{ prefix }}debian:jessie {%- endif %} MAINTAINER johnar@microsoft.com diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2 index d9528f67d02a..ad13ed0c124a 100644 --- a/sonic-slave-stretch/Dockerfile.j2 +++ b/sonic-slave-stretch/Dockerfile.j2 @@ -1,9 +1,10 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:armhf-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-stretch {%- elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM multiarch/debian-debootstrap:arm64-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch {%- else -%} -FROM debian:stretch +FROM {{ prefix }}debian:stretch {%- endif %} MAINTAINER gulv@microsoft.com From 2919b4820f95bd49ceb579986f5c58b4e3532c6e Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Mon, 14 Mar 2022 13:45:27 +0200 Subject: [PATCH 077/817] [hostcfgd] record feature state in STATE DB (#9842) - Why I did it To implement blocking feature state change. - How I did it Record the actual feature state in STATE DB from hostcfg. - How to verify it UT + verification by running on the switch and checking STATE DB. Signed-off-by: Stepan Blyschak --- files/image_config/monit/container_checker | 13 +++---- src/sonic-host-services/scripts/hostcfgd | 39 ++++++++++++++----- .../tests/hostcfgd/hostcfgd_radius_test.py | 1 + .../tests/hostcfgd/hostcfgd_tacacs_test.py | 3 +- .../tests/hostcfgd/hostcfgd_test.py | 24 ++++++++++-- 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/files/image_config/monit/container_checker b/files/image_config/monit/container_checker index 197e4f04a499..a67a96a0c18c 100755 --- a/files/image_config/monit/container_checker +++ b/files/image_config/monit/container_checker @@ -32,7 +32,7 @@ def get_expected_running_containers(): value of field 'has_global_scope', the number of ASICs and the value of field 'has_per_asic_scope'. If the device has single ASIC, the container name was put into the list. - @return: A set which contains the expected running containers and a set that has + @return: A set which contains the expected running containers and a set that has containers marked as "always_enabled". """ config_db = swsssdk.ConfigDBConnector() @@ -82,7 +82,7 @@ def get_current_running_from_DB(always_running_containers): state_db = swsscommon.DBConnector("STATE_DB", 0) tbl = swsscommon.Table(state_db, "FEATURE") if not tbl.getKeys(): - return False, None + return running_containers for name in tbl.getKeys(): data = dict(tbl.get(name)[1]) @@ -101,7 +101,7 @@ def get_current_running_from_DB(always_running_containers): print("Failed to get container '{}'. Error: '{}'".format(name, err)) pass - return True, running_containers + return running_containers def get_current_running_from_dockers(): @@ -128,13 +128,12 @@ def get_current_running_containers(always_running_containers): """ @summary: This function will get the list of currently running containers. If available in STATE-DB, get from DB else from list of dockers. - + @return: A set of currently running containers. """ - ret, current_running_containers = get_current_running_from_DB(always_running_containers) - if not ret: - current_running_containers = get_current_running_from_dockers() + current_running_containers = get_current_running_from_DB(always_running_containers) + current_running_containers.update(get_current_running_from_dockers()) return current_running_containers diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd index 9b39fb5eb807..be8317259e38 100755 --- a/src/sonic-host-services/scripts/hostcfgd +++ b/src/sonic-host-services/scripts/hostcfgd @@ -12,7 +12,7 @@ import signal import jinja2 from sonic_py_common import device_info from swsscommon.swsscommon import SubscriberStateTable, DBConnector, Select -from swsscommon.swsscommon import ConfigDBConnector, TableConsumable +from swsscommon.swsscommon import ConfigDBConnector, TableConsumable, Table # FILE PAM_AUTH_CONF = "/etc/pam.d/common-auth-sonic" @@ -41,6 +41,7 @@ RADIUS_PAM_AUTH_CONF_DIR = "/etc/pam_radius_auth.d/" # MISC Constants CFG_DB = "CONFIG_DB" +STATE_DB = "STATE_DB" HOSTCFGD_MAX_PRI = 10 # Used to enforce ordering b/w daemons under Hostcfgd DEFAULT_SELECT_TIMEOUT = 1000 @@ -166,16 +167,23 @@ class FeatureHandler(object): SYSTEMD_SYSTEM_DIR = '/etc/systemd/system/' SYSTEMD_SERVICE_CONF_DIR = os.path.join(SYSTEMD_SYSTEM_DIR, '{}.service.d/') - def __init__(self, config_db, device_config): + # Feature state constants + FEATURE_STATE_ENABLED = "enabled" + FEATURE_STATE_DISABLED = "disabled" + FEATURE_STATE_FAILED = "failed" + + def __init__(self, config_db, feature_state_table, device_config): self._config_db = config_db + self._feature_state_table = feature_state_table self._device_config = device_config self._cached_config = {} self.is_multi_npu = device_info.is_multi_npu() def handle(self, feature_name, op, feature_cfg): if not feature_cfg: - self._cached_config.pop(feature_name) syslog.syslog(syslog.LOG_INFO, "Deregistering feature {}".format(feature_name)) + self._cached_config.pop(feature_name) + self._feature_state_table._del(feature_name) return feature = Feature(feature_name, feature_cfg, self._device_config) @@ -253,7 +261,6 @@ class FeatureHandler(object): return True def update_feature_auto_restart(self, feature, feature_name): - dir_name = self.SYSTEMD_SERVICE_CONF_DIR.format(feature_name) auto_restart_conf = os.path.join(dir_name, 'auto_restart.conf') @@ -341,8 +348,11 @@ class FeatureHandler(object): except Exception as err: syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be enabled and started" .format(feature.name, feature_suffixes[-1])) + self.set_feature_state(feature, self.FEATURE_STATE_FAILED) return + self.set_feature_state(feature, self.FEATURE_STATE_ENABLED) + def disable_feature(self, feature): cmds = [] feature_names, feature_suffixes = self.get_feature_attribute(feature) @@ -363,11 +373,17 @@ class FeatureHandler(object): except Exception as err: syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be stopped and disabled" .format(feature.name, feature_suffixes[-1])) + self.set_feature_state(feature, self.FEATURE_STATE_FAILED) return + self.set_feature_state(feature, self.FEATURE_STATE_DISABLED) + def resync_feature_state(self, feature): self._config_db.mod_entry('FEATURE', feature.name, {'state': feature.state}) + def set_feature_state(self, feature, state): + self._feature_state_table.set(feature.name, [('state', state)]) + class Iptables(object): def __init__(self): @@ -914,14 +930,14 @@ class NtpCfg(object): new_src = data.get('src_intf', '') new_src_set = set(new_src.split(";")) new_vrf = data.get('vrf', '') - + # Update the Local Cache self.ntp_global = data # check if ntp server configured, if not, do nothing if not self.ntp_servers: syslog.syslog(syslog.LOG_INFO, "No ntp server when global config change, do nothing") - return + return if orig_src_set != new_src_set: syslog.syslog(syslog.LOG_INFO, "ntp global update for source intf old {} new {}, restarting ntp-config" @@ -957,6 +973,7 @@ class HostConfigDaemon: self.config_db = ConfigDBConnector() self.config_db.connect(wait_for_init=True, retry_on=True) self.dbconn = DBConnector(CFG_DB, 0) + self.state_db_conn = DBConnector(STATE_DB, 0) self.selector = Select() syslog.syslog(syslog.LOG_INFO, 'ConfigDB connect success') @@ -964,6 +981,8 @@ class HostConfigDaemon: self.callbacks = dict() self.subscriber_map = dict() + feature_state_table = Table(self.state_db_conn, 'FEATURE') + # Load DEVICE metadata configurations self.device_config = {} self.device_config['DEVICE_METADATA'] = self.config_db.get_table('DEVICE_METADATA') @@ -976,7 +995,7 @@ class HostConfigDaemon: self.iptables = Iptables() # Intialize Feature Handler - self.feature_handler = FeatureHandler(self.config_db, self.device_config) + self.feature_handler = FeatureHandler(self.config_db, feature_state_table, self.device_config) self.feature_handler.sync_state_field() # Initialize Ntp Config Handler @@ -987,7 +1006,7 @@ class HostConfigDaemon: # Initialize AAACfg self.hostname_cache="" self.aaacfg = AaaCfg() - + def load(self): aaa = self.config_db.get_table('AAA') @@ -1004,7 +1023,7 @@ class HostConfigDaemon: self.hostname_cache = dev_meta['localhost']['hostname'] except Exception as e: pass - + # Update AAA with the hostname self.aaacfg.hostname_update(self.hostname_cache) @@ -1130,7 +1149,7 @@ class HostConfigDaemon: self.subscribe('VLAN_SUB_INTERFACE', lambda table, key, op, data: self.vlan_sub_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) self.subscribe('PORTCHANNEL_INTERFACE', lambda table, key, op, data: self.portchannel_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) self.subscribe('INTERFACE', lambda table, key, op, data: self.phy_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - + syslog.syslog(syslog.LOG_INFO, "Waiting for systemctl to finish initialization") self.wait_till_system_init_done() diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py index 4e3d18648100..9738f16852e5 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py @@ -36,6 +36,7 @@ hostcfgd.SubscriberStateTable = MockSubscriberStateTable hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector +hostcfgd.Table = mock.Mock() class TestHostcfgdRADIUS(TestCase): diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py index 3cc3504d606b..18bf5c17e6c2 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py @@ -35,6 +35,7 @@ hostcfgd.SubscriberStateTable = MockSubscriberStateTable hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector +hostcfgd.Table = mock.Mock() class TestHostcfgdTACACS(TestCase): """ @@ -44,7 +45,7 @@ def run_diff(self, file1, file2): return subprocess.check_output('diff -uR {} {} || true'.format(file1, file2), shell=True) """ - Check different config + Check different config """ def check_config(self, test_name, test_data, config_name): t_path = templates_path diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py index bbce866e2331..db9a35075a02 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py @@ -27,20 +27,23 @@ hostcfgd.SubscriberStateTable = MockSubscriberStateTable hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector +hostcfgd.Table = mock.Mock() class TestHostcfgd(TestCase): """ Test hostcfd daemon - feature """ - def __verify_table(self, table, expected_table): + def __verify_table(self, table, feature_state_table, expected_table): """ verify config db tables - Compares Config DB table (FEATURE) with expected output table + Compares Config DB table (FEATURE) with expected output table. + Verifies that State DB table (FEATURE) is updated. Args: table(dict): Current Config Db table + feature_state_table(Mock): Mocked State DB FEATURE table expected_table(dict): Expected Config Db table Returns: @@ -48,6 +51,19 @@ def __verify_table(self, table, expected_table): """ ddiff = DeepDiff(table, expected_table, ignore_order=True) print('DIFF:', ddiff) + + def get_state(cfg_state): + """ Translates CONFIG DB state field into STATE DB state field """ + if cfg_state == 'always_disabled': + return 'disabled' + elif cfg_state == 'always_enabled': + return 'enabled' + else: + return cfg_state + + feature_state_table.set.assert_has_calls([ + mock.call(feature, [('state', get_state(table[feature]['state']))]) for feature in table + ]) return True if not ddiff else False def __verify_fs(self, table): @@ -93,6 +109,7 @@ def test_hostcfgd_feature_handler(self, test_name, test_data, fs): fs.add_real_paths(swsscommon_package.__path__) # add real path of swsscommon for database_config.json fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) MockConfigDb.set_config_db(test_data['config_db']) + feature_state_table_mock = mock.Mock() with mock.patch('hostcfgd.subprocess') as mocked_subprocess: popen_mock = mock.Mock() attrs = test_data['popen_attributes'] @@ -102,7 +119,7 @@ def test_hostcfgd_feature_handler(self, test_name, test_data, fs): # Initialize Feature Handler device_config = {} device_config['DEVICE_METADATA'] = MockConfigDb.CONFIG_DB['DEVICE_METADATA'] - feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), device_config) + feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) # sync the state field and Handle Feature Updates feature_handler.sync_state_field() @@ -113,6 +130,7 @@ def test_hostcfgd_feature_handler(self, test_name, test_data, fs): # Verify if the updates are properly updated assert self.__verify_table( MockConfigDb.get_config_db()['FEATURE'], + feature_state_table_mock, test_data['expected_config_db']['FEATURE'] ), 'Test failed for test data: {0}'.format(test_data) mocked_subprocess.check_call.assert_has_calls(test_data['expected_subprocess_calls'], any_order=True) From 330eb8dda9e4ce276e50e9d3d3fcf8cb90d89fb0 Mon Sep 17 00:00:00 2001 From: Song Yuan <64041228+ysmanman@users.noreply.github.com> Date: Mon, 14 Mar 2022 11:24:26 -0700 Subject: [PATCH 078/817] update submodule sonic-py-swsssdk (#10220) --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 7cd7e0c1580d..24366480c213 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 7cd7e0c1580d15c341160c68b73fd7d948e9fd24 +Subproject commit 24366480c213893388766a3b0dd3c492b9c04b8f From d7c3ce00454682cc9c5b6b7a5d56dd82384f4536 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 14 Mar 2022 11:34:02 -0700 Subject: [PATCH 079/817] Specify the filesystem type when mounting to /host (#10169) When mounting the partition that contains `/host` during initramfs, the mount binary available there (coming from busybox) tries each filesystem in `/proc/filesystems` and sees which one succeeds. During this time, there may be some error messages logged into dmesg because some of the incorrect filesystems failed to mount the partition. Specify the filesystem type explicitly so that initramfs knows it's that type, and we know what filesystem will always get used there. Fixes #9998 Signed-off-by: Saikrishna Arcot --- files/initramfs-tools/union-mount.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index c680e69300d1..7a64f71d70bb 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -132,7 +132,7 @@ case "${ROOT}" in ;; *) ## Mount the raw partition again - mount ${ROOT} ${rootmnt}/host + mount -t ext4 ${ROOT} ${rootmnt}/host ;; esac From 0243ed95387792635edcde3800633f610df35204 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 15 Mar 2022 10:03:54 +0800 Subject: [PATCH 080/817] [build]: Fix marvell-armhf build hung issue (#10156) (#10229) Why I did it The marvel-armhf build is hung, it does not exit after waiting for a long time. It is caused by the process /etc/entropy.py which is started by the postinst script in target/debs/buster/sonic-platform-nokia-7215_1.0_armhf.deb --- files/build_templates/sonic_debian_extension.j2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 6cafa76014d1..455179c08029 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -652,6 +652,11 @@ fi {% if installer_images.strip() -%} ## ensure proc is mounted sudo mount proc /proc -t proc || true +if [[ $CONFIGURED_ARCH == armhf ]]; then + # A workaround to fix the armhf build hung issue, caused by sonic-platform-nokia-7215_1.0_armhf.deb post installation script + ps -eo pid,cmd | grep python | grep "/etc/entropy.py" | awk '{print $1}' | xargs sudo kill -9 2>/dev/null || true +fi + sudo mkdir $FILESYSTEM_ROOT/target sudo mount --bind target $FILESYSTEM_ROOT/target sudo LANG=C DOCKER_HOST="$DOCKER_HOST" chroot $FILESYSTEM_ROOT docker info From 286ff289f56835117e8890014e41f5cc16f27e4d Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Tue, 15 Mar 2022 14:47:36 +0800 Subject: [PATCH 081/817] [sonic-config-engine] Add failure details in sonic-config-engine unit test. (#10210) --- src/sonic-config-engine/tests/test_j2files.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index eb002720d98d..b922ae45dbcf 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -1,4 +1,3 @@ -import filecmp import json import os import shutil @@ -110,7 +109,7 @@ def test_ipinip(self): self.run_script(argument) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'ipinip.json') - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_l2switch_template(self): argument = '-k Mellanox-SN2700 --preset l2 -p ' + self.t0_port_config @@ -211,7 +210,7 @@ def test_qos_arista7050_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', 'x86_64-arista_7800r3_48cq2_lc', 'Arista-7800R3-48CQ2-C48') @@ -235,7 +234,7 @@ def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): os.remove(cfg_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, sample_output_file) - assert filecmp.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_qos_dell9332_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') @@ -254,7 +253,7 @@ def test_qos_dell9332_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell9332.json') - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_qos_dell6100_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100') @@ -273,7 +272,7 @@ def test_qos_dell6100_render_template(self): os.remove(qos_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell6100.json') - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer_template, expected): dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) @@ -293,7 +292,7 @@ def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer os.remove(buffers_config_file_new) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, expected) - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_buffers_dell6100_render_template(self): self._test_buffers_render_template('dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100', 'sample-dell-6100-t0-minigraph.xml', 'buffers.json.j2', 'buffers-dell6100.json') @@ -313,7 +312,7 @@ def test_ipinip_multi_asic(self): print(argument) self.run_script(argument) sample_output_file = os.path.join(self.test_dir, 'multi_npu_data', utils.PYvX_DIR, 'ipinip.json') - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_swss_switch_render_template(self): switch_template = os.path.join( @@ -342,7 +341,7 @@ def test_swss_switch_render_template(self): self.test_dir, 'sample_output', v["output"] ) self.run_script(argument) - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_swss_switch_render_template_multi_asic(self): # verify the ECMP hash seed changes per namespace @@ -374,7 +373,7 @@ def test_swss_switch_render_template_multi_asic(self): self.test_dir, 'sample_output', v["output"] ) self.run_script(argument) - assert utils.cmp(sample_output_file, self.output_file) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) os.environ["NAMESPACE_ID"] = "" def test_ndppd_conf(self): From 18d00dfbe70d1dba75e2c534585879944b4e9230 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Tue, 15 Mar 2022 09:20:36 +0200 Subject: [PATCH 082/817] [teamd.sh] kill teamd docker on warm shutdown for faster shutdown (#10219) This can save 6 sec for teamd LAG restoration - the time between: ``` Mar 9 13:51:10.467757 r-panther-13 WARNING teamd#teamd_PortChannel1[28]: Got SIGUSR1. Mar 9 13:52:33.310707 r-panther-13 INFO teamd#teamd_PortChannel1[27]: carrier changed to UP ``` - Why I did it Optimize warm boot. Specifically reduce the time needed for LAG restoration. - How I did it Kill teamd docker after graceful shutdown of teamd processes. - How to verify it Run warm reboot. Signed-off-by: Stepan Blyschak --- files/scripts/teamd.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/files/scripts/teamd.sh b/files/scripts/teamd.sh index 57b70913e917..4de3f25c4dbd 100755 --- a/files/scripts/teamd.sh +++ b/files/scripts/teamd.sh @@ -93,13 +93,17 @@ stop() { # We call `docker kill teamd` to ensure the container stops as quickly as possible, # Note: teamd must be killed before syncd, because it will send the last packet through CPU port docker exec -i ${SERVICE}$DEV pkill -USR2 -f ${TEAMD_CMD} || [ $? == 1 ] + fi + + if [[ x"$WARM_BOOT" == x"true" ]] || [[ x"$FAST_BOOT" == x"true" ]]; then while docker exec -i ${SERVICE}$DEV pgrep -f ${TEAMD_CMD} > /dev/null; do sleep 0.05 done docker kill ${SERVICE}$DEV &> /dev/null || debug "Docker ${SERVICE}$DEV is not running ($?) ..." + else + /usr/bin/${SERVICE}.sh stop $DEV fi - /usr/bin/${SERVICE}.sh stop $DEV debug "Stopped ${SERVICE}$DEV service..." } From d08add5523096bd40a880724dded9fe2d0e923ed Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Tue, 15 Mar 2022 21:40:55 +0800 Subject: [PATCH 083/817] [submodule] Update sonic-swss submodule pointer (#10209) Update sonic-swss with the following changes: 29d5d8da Use abort instead of exit in case calling SAI API failure (#2170) 12f980c8 Fix issue config qos reload causing orchagent aborted via tracking dependencies among QoS tables (#2116) 6e5ed1c0 [chassis][syncd][sai] Adjusting response timeout during syncd init (#2159) 0a99f546 Try get port operational speed from STATE DB (#2119) 828cccfe [crm] Use sai_object_type_get_availability() API to get counters (#2098) 18c73a19 Allow IPv4 link-local nexthops (#1903) Signed-off-by: Stephen Sun --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 7d2942f7ef4a..00266891a9f4 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 7d2942f7ef4ac01209582c02d142bd131208b2a4 +Subproject commit 00266891a9f41e5bd37100b05237e865cde429b2 From 5a531f4eb24edf0caca47edcf0d5a2c73e0e63d4 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Tue, 15 Mar 2022 12:21:50 -0400 Subject: [PATCH 084/817] [Nokia][VoQ] The role of the Inband port should be "Inb" and recycle port (#9950) Signed-off-by: mlok --- .../Nokia-IXR7250E-36x400G/0/port_config.ini | 3 ++- .../Nokia-IXR7250E-36x400G/1/port_config.ini | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/port_config.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/port_config.ini index 8d017026081c..3633842330f8 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/port_config.ini +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/port_config.ini @@ -17,4 +17,5 @@ Ethernet14 24,25,26,27,28,29,30,31 Ethernet14 15 Eth14 Ethernet15 16,17,18,19,20,21,22,23 Ethernet15 16 Eth15-ASIC0 Ext 400000 0 16 8 Ethernet16 8,9,10,11,12,13,14,15 Ethernet16 17 Eth16-ASIC0 Ext 400000 0 17 8 Ethernet17 0,1,2,3,4,5,6,7 Ethernet17 18 Eth17-ASIC0 Ext 400000 0 18 8 -Ethernet-IB0 115 Ethernet-IB0 37 Rcy-ASIC0 Int 10000 0 19 8 +Ethernet-IB0 115 Ethernet-IB0 37 Rcy1-ASIC0 Inb 10000 0 19 8 +Ethernet-Rec0 116 Ethernet-Rec0 39 Rcy2-ASIC0 Rec 10000 1 20 8 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/port_config.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/port_config.ini index 76fd968fec28..90376150d657 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/port_config.ini +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/port_config.ini @@ -17,4 +17,5 @@ Ethernet32 24,25,26,27,28,29,30,31 Ethernet32 33 Eth14 Ethernet33 16,17,18,19,20,21,22,23 Ethernet33 34 Eth15-ASIC1 Ext 400000 0 16 8 Ethernet34 8,9,10,11,12,13,14,15 Ethernet34 35 Eth16-ASIC1 Ext 400000 0 17 8 Ethernet35 0,1,2,3,4,5,6,7 Ethernet35 36 Eth17-ASIC1 Ext 400000 0 18 8 -Ethernet-IB1 115 Ethernet-IB1 38 Rcy-ASIC1 Int 10000 0 19 8 +Ethernet-IB1 115 Ethernet-IB1 38 Rcy1-ASIC1 Inb 10000 0 19 8 +Ethernet-Rec1 116 Ethernet-Rec1 40 Rcy2-ASIC1 Rec 10000 1 20 8 From 28f6a51d26af0a744ab5194bd8a8101953ce1304 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Tue, 15 Mar 2022 10:26:36 -0700 Subject: [PATCH 085/817] [doc] Moving Configuration.md from swss to sonic-yang-models folder (#10078) #### Why I did it Moved Configuration.md from swss to yang folder. The configuration schema should be present along with yang models and when users add yang model they could update configuration document as well. --- src/sonic-yang-models/doc/Configuration.md | 1540 ++++++++++++++++++++ 1 file changed, 1540 insertions(+) create mode 100644 src/sonic-yang-models/doc/Configuration.md diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md new file mode 100644 index 000000000000..b5890681ce41 --- /dev/null +++ b/src/sonic-yang-models/doc/Configuration.md @@ -0,0 +1,1540 @@ +# SONiC Configuration Database Manual + +Table of Contents +================= + + * [Introduction](#introduction) + * [Configuration](#configuration) + * [Config Load and Save](#config-load-and-save) + * [Incremental Configuration](#incremental-configuration) + * [Redis and Json Schema](#redis-and-json-schema) + * [ACL and Mirroring](#acl-and-mirroring) + * [BGP Sessions](#bgp-sessions) + * [BUFFER_PG](#buffer_pg) + * [Buffer pool](#buffer-pool) + * [Buffer profile](#buffer-profile) + * [Buffer queue](#buffer-queue) + * [Buffer port ingress profile list](#buffer-port-ingress-profile-list) + * [Buffer port egress profile list](#buffer-port-egress-profile-list) + * [Cable length](#cable-length) + * [COPP_TABLE](#copp_table) + * [CRM](#crm) + * [Data Plane L3 Interfaces](#data-plane-l3-interfaces) + * [DEFAULT_LOSSLESS_BUFFER_PARAMETER](#DEFAULT_LOSSLESS_BUFFER_PARAMETER) + * [Device Metadata](#device-metadata) + * [Device neighbor metada](#device-neighbor-metada) + * [DSCP_TO_TC_MAP](#dscp_to_tc_map) + * [FLEX_COUNTER_TABLE](#flex_counter_table) + * [L2 Neighbors](#l2-neighbors) + * [Loopback Interface](#loopback-interface) + * [LOSSLESS_TRAFFIC_PATTERN](#LOSSLESS_TRAFFIC_PATTERN) + * [Management Interface](#management-interface) + * [Management port](#management-port) + * [Management VRF](#management-vrf) + * [MAP_PFC_PRIORITY_TO_QUEUE](#map_pfc_priority_to_queue) + * [NTP Global Configuration](#ntp-global-configuration) + * [NTP and SYSLOG servers](#ntp-and-syslog-servers) + * [Policer](#policer) + * [Port](#port) + * [Port Channel](#port-channel) + * [Portchannel member](#portchannel-member) + * [Scheduler](#scheduler) + * [Port QoS Map](#port-qos-map) + * [Queue](#queue) + * [Tacplus Server](#tacplus-server) + * [TC to Priority group map](#tc-to-priority-group-map) + * [TC to Queue map](#tc-to-queue-map) + * [Versions](#versions) + * [VLAN](#vlan) + * [VLAN_MEMBER](#vlan_member) + * [Virtual router](#virtual-router) + * [WRED_PROFILE](#wred_profile) + * [For Developers](#for-developers) + * [Generating Application Config by Jinja2 Template](#generating-application-config-by-jinja2-template) + * [Incremental Configuration by Subscribing to ConfigDB](#incremental-configuration-by-subscribing-to-configdb) + + + +# Introduction +This document lists the configuration commands schema applied in the SONiC eco system. All these commands find relevance in collecting system information, analysis and even for trouble shooting. All the commands are categorized under relevant topics with corresponding examples. + +# Configuration + +SONiC is managing configuration in a single source of truth - a redisDB +instance that we refer as ConfigDB. Applications subscribe to ConfigDB +and generate their running configuration correspondingly. + +(Before Sep 2017, we were using an XML file named minigraph.xml to +configure SONiC devices. For historical documentation, please refer to +[Configuration with +Minigraph](https://github.com/Azure/SONiC/wiki/Configuration-with-Minigraph-(~Sep-2017))) + +# **Config Load and Save** + +In current version of SONiC, ConfigDB is implemented as database 4 of +local redis. When system boots, configurations will be loaded from +/etc/sonic/config_db.json file into redis. Please note that ConfigDB +content won't be written back into /etc/sonic/config_db.json file +automatically. In order to do that, a config save command need to be +manually executed from CLI. Similarly, config load will trigger a force +load of json file into DB. Generally, content in +/etc/sonic/config_db.json can be considered as starting config, and +content in redisDB running config. + +We keep a way to load configuration from minigraph and write into +ConfigDB for backward compatibility. To do that, run `config +load_minigraph`. + +### Incremental Configuration + +The design of ConfigDB supports incremental configuration - application +could subscribe to changes in ConfigDB and response correspondingly. +However, this feature is not implemented by all applications yet. By Sep +2017 now, the only application that supports incremental configuration +is BGP (docker-fpm-quagga). For other applications, a manual restart is +required after configuration changes in ConfigDB. + +# **Redis and Json Schema** + +ConfigDB uses a table-object schema that is similar with +[AppDB](https://github.com/Azure/sonic-swss/blob/4c56d23b9ff4940bdf576cf7c9e5aa77adcbbdcc/doc/swss-schema.md), +and `config_db.json` is a straight-forward serialization of DB. As an +example, the following fragments could be BGP-related configuration in +redis and json, correspondingly: + + +***Redis format*** +``` +127.0.0.1:6379[4]> keys BGP_NEIGHBOR:* + +1) "BGP_NEIGHBOR:10.0.0.31" +2) "BGP_NEIGHBOR:10.0.0.39" +3) "BGP_NEIGHBOR:10.0.0.11" +4) "BGP_NEIGHBOR:10.0.0.7" + +... + +127.0.0.1:6379[4]> hgetall BGP_NEIGHBOR:10.0.0.3 + +1) "admin_status" +2) "up" +3) "peer_addr" +4) "10.0.0.2" +5) "asn" +6) "65200" +7) "name" +8) "ARISTA07T2" +``` + +***Json format*** +``` +"BGP_NEIGHBOR": { + "10.0.0.57": { + "rrclient": "0", + "name": "ARISTA01T1", + "local_addr": "10.0.0.56", + "nhopself": "0", + "holdtime": "10", + "asn": "64600", + "keepalive": "3" + }, + "10.0.0.59": { + "rrclient": "0", + "name": "ARISTA02T1", + "local_addr": "10.0.0.58", + "nhopself": "0", + "holdtime": "10", + "asn": "64600", + "keepalive": "3" + }, +} +``` + +Full sample config_db.json files are availables at +[here](https://github.com/Azure/SONiC/blob/gh-pages/doc/config_db.json) +and +[here](https://github.com/Azure/SONiC/blob/gh-pages/doc/config_db_t0.json). + + +### ACL and Mirroring + +ACL and mirroring related configuration are defined in +**MIRROR_SESSION**, **ACL_TABLE** and **ACL_RULE** tables. Those +tables are in progress of migrating from APPDB. Please refer to their +schema in APPDB +[here](https://github.com/Azure/sonic-swss/blob/4c56d23b9ff4940bdf576cf7c9e5aa77adcbbdcc/doc/swss-schema.md) +and migration plan +[here](https://github.com/Azure/SONiC/wiki/ACL-Configuration-Requirement-Description). + +``` +{ +"MIRROR_SESSION": { + "everflow0": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2" + } + }, + +"ACL_TABLE": { + "DATAACL": { + "policy_desc" : "data_acl", + "type": "l3", + "ports": [ + "Ethernet0", + "Ethernet4", + "Ethernet8", + "Ethernet12" + ] + } + } +} +``` + +***Below ACL table added as per the mail*** +``` +{ +"ACL_TABLE": { + "aaa": { + "type": "L3", + "ports": "Ethernet0" + } + }, +"ACL_RULE": { + "aaa|rule_0": { + "PRIORITY": "55", + "PACKET_ACTION": "DROP", + "L4_SRC_PORT": "0" + }, + "aaa|rule_1": { + "PRIORITY": "55", + "PACKET_ACTION": "DROP", + "L4_SRC_PORT": "1" + } + } +} +``` + +***Below ACL table added by comparig minigraph.xml & config_db.json*** + +``` +{ +"ACL_TABLE": { + "EVERFLOW": { + "type": "MIRROR", + "policy_desc": "EVERFLOW", + "ports": [ + "PortChannel0001", + "PortChannel0002", + "PortChannel0003", + "PortChannel0004" + ] + }, + "EVERFLOWV6": { + "type": "MIRRORV6", + "policy_desc": "EVERFLOWV6", + "ports": [ + "PortChannel0001", + "PortChannel0002", + "PortChannel0003", + "PortChannel0004" + ] + }, + "SNMP_ACL": { + "services": [ + "SNMP" + ], + "type": "CTRLPLANE", + "policy_desc": "SNMP_ACL" + }, + "SSH_ONLY": { + "services": [ + "SSH" + ], + "type": "CTRLPLANE", + "policy_desc": "SSH_ONLY" + } + }, + +"ACL_RULE": { + "SNMP_ACL|DEFAULT_RULE": { + "PRIORITY": "1", + "PACKET_ACTION": "DROP", + "ETHER_TYPE": "2048" + }, + "SNMP_ACL|RULE_1": { + "PRIORITY": "9999", + "PACKET_ACTION": "ACCEPT", + "SRC_IP": "1.1.1.1/32", + "IP_PROTOCOL": "17" + }, + "SNMP_ACL|RULE_2": { + "PRIORITY": "9998", + "PACKET_ACTION": "ACCEPT", + "SRC_IP": "2.2.2.2/32", + "IP_PROTOCOL": "17" + }, + "SSH_ONLY|DEFAULT_RULE": { + "PRIORITY": "1", + "PACKET_ACTION": "DROP", + "ETHER_TYPE": "2048" + }, + "SSH_ONLY|RULE_1": { + "PRIORITY": "9999", + "PACKET_ACTION": "ACCEPT", + "SRC_IP": "4.4.4.4/8", + "IP_PROTOCOL": "6" + } + } +} + +``` + +***ACL table type configuration example*** +``` +{ + "ACL_TABLE_TYPE": { + "CUSTOM_L3": { + "MATCHES": [ + "IN_PORTS", + "OUT_PORTS", + "SRC_IP" + ], + "ACTIONS": [ + "PACKET_ACTION", + "MIRROR_INGRESS_ACTION" + ], + "BIND_POINTS": [ + "PORT", + "LAG" + ] + } + }, + "ACL_TABLE": { + "DATAACL": { + "STAGE": "INGRESS", + "TYPE": "CUSTOM_L3", + "PORTS": [ + "Ethernet0", + "PortChannel1" + ] + } + }, + "ACL_RULE": { + "DATAACL|RULE0": { + "PRIORITY": "999", + "PACKET_ACTION": "DROP", + "SRC_IP": "1.1.1.1/32", + } + } +} +``` + +### BGP Sessions + +BGP session configuration is defined in **BGP_NEIGHBOR** table. BGP +neighbor address is used as key of bgp neighbor objects. Object +attributes include remote AS number, neighbor router name, and local +peering address. Dynamic neighbor is also supported by defining peer +group name and IP ranges in **BGP_PEER_RANGE** table. + +``` +{ +"BGP_NEIGHBOR": { + "10.0.0.61": { + "local_addr": "10.0.0.60", + "asn": 64015, + "name": "ARISTA15T0" + }, + "10.0.0.49": { + "local_addr": "10.0.0.48", + "asn": 64009, + "name": "ARISTA09T0" + }, + + "10.0.0.63": { + "rrclient": "0", + "name": "ARISTA04T1", + "local_addr": "10.0.0.62", + "nhopself": "0", + "holdtime": "10", + "asn": "64600", + "keepalive": "3" + } + +"BGP_PEER_RANGE": { + "BGPSLBPassive": { + "name": "BGPSLBPassive", + "ip_range": [ + "10.250.0.0/27" + ] + }, + "BGPVac": { + "name": "BGPVac", + "ip_range": [ + "10.2.0.0/16" + ] + } + } +} +``` + +### BUFFER_PG + +When the system is running in traditional buffer model, profiles needs to explicitly configured: + +``` +{ +"BUFFER_PG": { + "Ethernet0|3-4": { + "profile": "pg_lossless_40000_5m_profile" + }, + "Ethernet1|3-4": { + "profile": "pg_lossless_40000_5m_profile" + }, + "Ethernet2|3-4": { + "profile": "pg_lossless_40000_5m_profile" + } + } +} + +``` + +When the system is running in dynamic buffer model, profiles can be: + + - either calculated dynamically according to ports' configuration and just configured as "NULL"; + - or configured explicitly. + +``` +{ +"BUFFER_PG": { + "Ethernet0|3-4": { + "profile": "NULL" + }, + "Ethernet1|3-4": { + "profile": "NULL" + }, + "Ethernet2|3-4": { + "profile": "static_profile" + } + } +} + +``` + +### Buffer pool + +When the system is running in traditional buffer model, the size of all of the buffer pools and xoff of ingress_lossless_pool need to be configured explicitly. + +``` +{ +"BUFFER_POOL": { + "egress_lossless_pool": { + "type": "egress", + "mode": "static", + "size": "15982720" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic", + "size": "9243812" + }, + "ingress_lossless_pool": { + "xoff": "4194112", + "type": "ingress", + "mode": "dynamic", + "size": "10875072" + } + } +} + +``` + +When the system is running in dynamic buffer model, the size of some of the buffer pools can be omitted and will be dynamically calculated. + +``` +{ +"BUFFER_POOL": { + "egress_lossless_pool": { + "type": "egress", + "mode": "static", + "size": "15982720" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic", + }, + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic", + } + } +} + +``` + + +### Buffer profile + +``` +{ +"BUFFER_PROFILE": { + "egress_lossless_profile": { + "static_th": "3995680", + "pool": "egress_lossless_pool", + "size": "1518" + }, + "egress_lossy_profile": { + "dynamic_th": "3", + "pool": "egress_lossy_pool", + "size": "1518" + }, + "ingress_lossy_profile": { + "dynamic_th": "3", + "pool": "ingress_lossless_pool", + "size": "0" + }, + "pg_lossless_40000_5m_profile": { + "xon_offset": "2288", + "dynamic_th": "-3", + "xon": "2288", + "xoff": "66560", + "pool": "ingress_lossless_pool", + "size": "1248" + }, + "pg_lossless_40000_40m_profile": { + "xon_offset": "2288", + "dynamic_th": "-3", + "xon": "2288", + "xoff": "71552", + "pool": "ingress_lossless_pool", + "size": "1248" + } + } +} + +``` + +When the system is running in dynamic buffer model and the headroom_type is dynamic, only dynamic_th needs to be configured and rest of fields can be omitted. +This kind of profiles will be handled by buffer manager and won't be applied to SAI. + +``` +{ + { + "non_default_dynamic_th_profile": { + "dynamic_th": 1, + "headroom_type": "dynamic" + } + } +} +``` + +### Buffer queue + +``` +{ +"BUFFER_QUEUE": { + "Ethernet50,Ethernet52,Ethernet54,Ethernet56|0-2": { + "profile": "egress_lossy_profile" + }, + "Ethernet50,Ethernet52,Ethernet54,Ethernet56|3-4": { + "profile": "egress_lossless_profile" + }, + "Ethernet50,Ethernet52,Ethernet54,Ethernet56|5-6": { + "profile": "egress_lossy_profile" + } + } +} + +``` + +### Buffer port ingress profile list + +``` +{ +"BUFFER_PORT_INGRESS_PROFILE_LIST": { + "Ethernet50": { + "profile_list": "ingress_lossy_profile,ingress_lossless_profile" + }, + "Ethernet52": { + "profile_list": "ingress_lossy_profile,ingress_lossless_profile" + }, + "Ethernet56": { + "profile_list": "ingress_lossy_profile,ingress_lossless_profile" + } + } +} + +``` + +### Buffer port egress profile list + +``` +{ +"BUFFER_PORT_EGRESS_PROFILE_LIST": { + "Ethernet50": { + "profile_list": "egress_lossy_profile,egress_lossless_profile" + }, + "Ethernet52": { + "profile_list": "egress_lossy_profile,egress_lossless_profile" + }, + "Ethernet56": { + "profile_list": "egress_lossy_profile,egress_lossless_profile" + } + } +} + +``` + +### Cable length + +``` +{ +"CABLE_LENGTH": { + "AZURE": { + "Ethernet8": "5m", + "Ethernet9": "5m", + "Ethernet2": "5m", + "Ethernet58": "5m", + "Ethernet59": "5m", + "Ethernet50": "40m", + "Ethernet51": "5m", + "Ethernet52": "40m", + "Ethernet53": "5m", + "Ethernet54": "40m", + "Ethernet55": "5m", + "Ethernet56": "40m" + } + } +} + +``` + +### COPP_TABLE + +``` +{ +"COPP_TABLE": { + "default": { + "cbs": "600", + "cir": "600", + "meter_type": "packets", + "mode": "sr_tcm", + "queue": "0", + "red_action": "drop" + }, + + "trap.group.arp": { + "cbs": "600", + "cir": "600", + "meter_type": "packets", + "mode": "sr_tcm", + "queue": "4", + "red_action": "drop", + "trap_action": "trap", + "trap_ids": "arp_req,arp_resp,neigh_discovery", + "trap_priority": "4" + }, + + "trap.group.lldp.dhcp.udld": { + "queue": "4", + "trap_action": "trap", + "trap_ids": "lldp,dhcp,udld", + "trap_priority": "4" + }, + + "trap.group.bgp.lacp": { + "queue": "4", + "trap_action": "trap", + "trap_ids": "bgp,bgpv6,lacp", + "trap_priority": "4" + }, + + "trap.group.ip2me": { + "cbs": "600", + "cir": "600", + "meter_type": "packets", + "mode": "sr_tcm", + "queue": "1", + "red_action": "drop", + "trap_action": "trap", + "trap_ids": "ip2me", + "trap_priority": "1" + } + } +} +``` + +### CRM + +``` +{ +"CRM": { + "Config": { + "acl_table_threshold_type": "percentage", + "nexthop_group_threshold_type": "percentage", + "fdb_entry_high_threshold": "85", + "acl_entry_threshold_type": "percentage", + "ipv6_neighbor_low_threshold": "70", + "nexthop_group_member_low_threshold": "70", + "acl_group_high_threshold": "85", + "ipv4_route_high_threshold": "85", + "acl_counter_high_threshold": "85", + "ipv4_route_low_threshold": "70", + "ipv4_route_threshold_type": "percentage", + "ipv4_neighbor_low_threshold": "70", + "acl_group_threshold_type": "percentage", + "ipv4_nexthop_high_threshold": "85", + "ipv6_route_threshold_type": "percentage", + "snat_entry_threshold_type": "percentage", + "snat_entry_high_threshold": "85", + "snat_entry_low_threshold": "70", + "dnat_entry_threshold_type": "percentage", + "dnat_entry_high_threshold": "85", + "dnat_entry_low_threshold": "70", + "ipmc_entry_threshold_type": "percentage", + "ipmc_entry_high_threshold": "85", + "ipmc_entry_low_threshold": "70" + } + } +} + +``` + +### Data Plane L3 Interfaces + +IP configuration for data plane are defined in **INTERFACE**, +**PORTCHANNEL_INTERFACE**, and **VLAN_INTERFACE** table. The objects +in all three tables have the interface (could be physical port, port +channel, or vlan) that IP address is attached to as first-level key, and +IP prefix as second-level key. IP interface objects don't have any +attributes. + +``` +{ +"INTERFACE": { + "Ethernet0|10.0.0.0/31": {}, + "Ethernet4|10.0.0.2/31": {}, + "Ethernet8|10.0.0.4/31": {} + ... + }, + +"PORTCHANNEL_INTERFACE": { + "PortChannel01|10.0.0.56/31": {}, + "PortChannel01|FC00::71/126": {}, + "PortChannel02|10.0.0.58/31": {}, + "PortChannel02|FC00::75/126": {} + ... + }, +"VLAN_INTERFACE": { + "Vlan1000|192.168.0.1/27": {} + } +} + +``` + + +### DEFAULT_LOSSLESS_BUFFER_PARAMETER + +This table stores the default lossless buffer parameters for dynamic buffer calculation. + +``` +{ + "DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "AZURE": { + "default_dynamic_th": "0", + "over_subscribe_ratio": "2" + } + } +} +``` + +### Device Metadata + +The **DEVICE_METADATA** table contains only one object named +*localhost*. In this table the device metadata such as hostname, hwsku, +deployment envionment id and deployment type are specified. BGP local AS +number is also specified in this table as current only single BGP +instance is supported in SONiC. + +``` +{ +"DEVICE_METADATA": { + "localhost": { + "hwsku": "Force10-S6100", + "default_bgp_status": "up", + "docker_routing_config_mode": "unified", + "hostname": "sonic-s6100-01", + "platform": "x86_64-dell_s6100_c2538-r0", + "mac": "4c:76:25:f4:70:82", + "default_pfcwd_status": "disable", + "bgp_asn": "65100", + "deployment_id": "1", + "type": "ToRRouter", + "buffer_model": "traditional" + } + } +} + +``` + + +### Device neighbor metada + +``` +{ +"DEVICE_NEIGHBOR_METADATA": { + "ARISTA01T1": { + "lo_addr": "None", + "mgmt_addr": "10.11.150.45", + "hwsku": "Arista-VM", + "type": "LeafRouter" + }, + "ARISTA02T1": { + "lo_addr": "None", + "mgmt_addr": "10.11.150.46", + "hwsku": "Arista-VM", + "type": "LeafRouter" + } + } +} + +``` + + +### DSCP_TO_TC_MAP +``` +{ +"DSCP_TO_TC_MAP": { + "AZURE": { + "1": "1", + "0": "1", + "3": "3", + "2": "1", + "5": "2", + "4": "4", + "7": "1", + "6": "1", + "9": "1", + "8": "0" + } + } +} + +``` + + +### MPLS_TC_TO_TC_MAP +``` +{ +"MPLS_TC_TO_TC_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "2", + "5": "3", + "6": "3", + "7": "4" + } + } +} + +``` + +### FLEX_COUNTER_TABLE + +``` +{ +"FLEX_COUNTER_TABLE": { + "PFCWD": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT": { + "FLEX_COUNTER_STATUS": "enable" + }, + "QUEUE": { + "FLEX_COUNTER_STATUS": "enable" + } + } +} + +``` + + +### L2 Neighbors + +The L2 neighbor and connection information can be configured in +**DEVICE_NEIGHBOR** table. Those information are used mainly for LLDP. +While mandatory fields include neighbor name acting as object key and +remote port / local port information in attributes, optional information +about neighbor device such as device type, hwsku, management address and +loopback address can also be defined. + +``` +{ +"DEVICE_NEIGHBOR": { + "ARISTA04T1": { + "mgmt_addr": "10.20.0.163", + "hwsku": "Arista", + "lo_addr": null, + "local_port": "Ethernet124", + "type": "LeafRouter", + "port": "Ethernet1" + }, + "ARISTA03T1": { + "mgmt_addr": "10.20.0.162", + "hwsku": "Arista", + "lo_addr": null, + "local_port": "Ethernet120", + "type": "LeafRouter", + "port": "Ethernet1" + }, + "ARISTA02T1": { + "mgmt_addr": "10.20.0.161", + "hwsku": "Arista", + "lo_addr": null, + "local_port": "Ethernet116", + "type": "LeafRouter", + "port": "Ethernet1" + }, + "ARISTA01T1": { + "mgmt_addr": "10.20.0.160", + "hwsku": "Arista", + "lo_addr": null, + "local_port": "Ethernet112", + "type": "LeafRouter", + "port": "Ethernet1" + } + } +} +``` + +### Loopback Interface + +Loopback interface configuration lies in **LOOPBACK_INTERFACE** table +and has similar schema with data plane interfaces. The loopback device +name and loopback IP prefix act as multi-level key for loopback +interface objects. + +``` +{ +"LOOPBACK_INTERFACE": { + "Loopback0|10.1.0.32/32": {}, + "Loopback0|FC00:1::32/128": {} + } +} + +``` + +### LOSSLESS_TRAFFIC_PATTERN + +The LOSSLESS_TRAFFIC_PATTERN table stores parameters related to +lossless traffic for dynamic buffer calculation + +``` +{ + "LOSSLESS_TRAFFIC_PATTERN": { + "AZURE": { + "mtu": "1024", + "small_packet_percentage": "100" + } + } +} +``` + +### Management Interface + +Management interfaces are defined in **MGMT_INTERFACE** table. Object +key is composed of management interface name and IP prefix. Attribute +***gwaddr*** specify the gateway address of the prefix. +***forced_mgmt_routes*** attribute can be used to specify addresses / +prefixes traffic to which are forced to go through management network +instead of data network. + +``` +{ +"MGMT_INTERFACE": { + "eth0|10.11.150.11/16": { + "gwaddr": "10.11.0.1" + }, + "eth0|FC00:2::32/64": { + "forced_mgmt_routes": [ + "10.0.0.100/31", + "10.250.0.8", + "10.255.0.0/28" + ], + "gwaddr": "fc00:2::1" + } + } +} + +``` + +### Management port + +``` +{ +"MGMT_PORT": { + "eth0": { + "alias": "eth0", + "admin_status": "up" + } + } +} + +``` + + +### Management VRF + +``` +{ +"MGMT_VRF_CONFIG": { + "vrf_global": { + "mgmtVrfEnabled": "true" + } + } +} +``` + +### MAP_PFC_PRIORITY_TO_QUEUE + +``` +{ +"MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "2": "2", + "5": "5", + "4": "4", + "7": "7", + "6": "6" + } + } +} +``` +### NTP Global Configuration + +These configuration options are used to modify the way that +ntp binds to the ports on the switch and which port it uses to +make ntp update requests from. + +***NTP VRF*** + +If this option is set to `default` then ntp will run within the default vrf +**when the management vrf is enabled**. If the mgmt vrf is enabled and this value is +not set to default then ntp will run within the mgmt vrf. + +This option **has no effect** if the mgmt vrf is not enabled. + +``` +{ +"NTP": { + "global": { + "vrf": "default" + } + } +} +``` + + +***NTP Source Port*** + +This option sets the port which ntp will choose to send time update requests from by. + +NOTE: If a Loopback interface is defined on the switch ntp will choose this by default, so this setting +is **required** if the switch has a Loopback interface and the ntp peer does not have defined routes +for that address. + +``` +{ +"NTP": { + "global": { + "src_intf": "Ethernet1" + } + } +} +``` + +### NTP and SYSLOG servers + +These information are configured in individual tables. Domain name or IP +address of the server is used as object key. Currently there are no +attributes in those objects. + +***NTP server*** +``` +{ +"NTP_SERVER": { + "2.debian.pool.ntp.org": {}, + "1.debian.pool.ntp.org": {}, + "3.debian.pool.ntp.org": {}, + "0.debian.pool.ntp.org": {} + }, + +"NTP_SERVER": { + "23.92.29.245": {}, + "204.2.134.164": {} + } +} +``` + +***Syslogserver*** +``` +{ +"SYSLOG_SERVER": { + "10.0.0.5": {}, + "10.0.0.6": {}, + "10.11.150.5": {} + } +} +``` + +### Policer + +Below is an example of the policer table configuration. +``` +{ + "POLICER": { + "everflow_static_policer": { + "meter_type": "bytes", + "mode": "sr_tcm", + "cir": "12500000", + "cbs": "12500000", + "pir": "17500000", + "pbs": "17500000", + "color": "aware", + "red_packet_action": "drop", + "yellow_packet_action": "drop" + "green_packet_action": "forward" + } + } +} + +``` +Key to the table defines policer name Below are the fields +- meter_type - Mandatory field. Defines how the metering is done. values - bytes, packets +- mode - Mandatory field. Defines one of the three modes support. values - sr_tcm, tr_tcm, storm +- cir - Committed information rate bytes/sec or packets/sec based on meter_type +- cbs - Committed burst size in bytes or packets based on meter_type +- pir - Peak information rate in bytes/sec or packets/sec based on meter_type +- pbs - Peak burst size in bytes or packets based on meter_type +- color - Defines the color source for the policer. values - aware, blind +- red_packet_action - Defines the action to be taken for red color packets +- yellow_packet_action - Defines the action to be taken for yellow color packets +- green_packet_action - Defines the action to be taken for green color packets. + +The packet action could be: + +- 'drop' +- 'forward' +- 'copy' +- 'copy_cancel' +- 'trap' +- 'log' +- 'deny' +- 'transit' +### Port + +In this table the physical port configurations are defined. Each object +will have port name as its key, and port name alias and port speed as +optional attributes. + +``` +{ +"PORT": { + "Ethernet0": { + "index": "0", + "lanes": "101,102", + "description": "fortyGigE1/1/1", + "mtu": "9100", + "alias": "fortyGigE1/1/1", + "speed": "40000" + }, + "Ethernet1": { + "index": "1", + "lanes": "103,104", + "description": "fortyGigE1/1/2", + "mtu": "9100", + "alias": "fortyGigE1/1/2", + "admin_status": "up", + "speed": "40000" + }, + "Ethernet63": { + "index": "63", + "lanes": "87,88", + "description": "fortyGigE1/4/16", + "mtu": "9100", + "alias": "fortyGigE1/4/16", + "speed": "40000" + } + } +} + +``` + +### Port Channel + +Port channels are defined in **PORTCHANNEL** table with port channel +name as object key and member list as attribute. + +``` +{ +"PORTCHANNEL": { + "PortChannel0003": { + "admin_status": "up", + "min_links": "1", + "members": [ + "Ethernet54" + ], + "mtu": "9100" + }, + "PortChannel0004": { + "admin_status": "up", + "min_links": "1", + "members": [ + "Ethernet56" + ], + "mtu": "9100" + } + } +} +``` + + +### Portchannel member + +``` +{ +"PORTCHANNEL_MEMBER": { + "PortChannel0001|Ethernet50": {}, + "PortChannel0002|Ethernet52": {}, + "PortChannel0003|Ethernet54": {}, + "PortChannel0004|Ethernet56": {} + } +} + +``` +### Scheduler + +``` +{ +"SCHEDULER": { + "scheduler.0": { + "type": "STRICT" + }, + "scheduler.1": { + "type": "WRR" + "weight": "1", + "meter_type": "bytes", + "pir": "1250000000", + "pbs": "8192" + }, + "scheduler.port": { + "meter_type": "bytes", + "pir": "1000000000", + "pbs": "8192" + } + } +} +``` + +### Port QoS Map + +``` +{ +"PORT_QOS_MAP": { + "Ethernet50,Ethernet52,Ethernet54,Ethernet56": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "pfc_enable": "3,4", + "pfc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "dscp_to_fc_map": "AZURE", + "exp_to_fc_map": "AZURE", + "scheduler": "scheduler.port" + } + } +} +``` + +### Queue +``` +{ +"QUEUE": { + "Ethernet56|4": { + "wred_profile": "AZURE_LOSSLESS", + "scheduler": "scheduler.1" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + } + } +} +``` + + +### Tacplus Server + +``` +{ +"TACPLUS_SERVER": { + "10.0.0.8": { + "priority": "1", + "tcp_port": "49" + }, + "10.0.0.9": { + "priority": "1", + "tcp_port": "49" + } + } +} +``` + + +### TC to Priority group map + +``` +{ +"TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "2": "2", + "5": "5", + "4": "4", + "7": "7", + "6": "6" + } + } +} +``` + +### TC to Queue map + +``` +{ +"TC_TO_QUEUE_MAP": { + "AZURE": { + "1": "1", + "0": "0", + "3": "3", + "2": "2", + "5": "5", + "4": "4", + "7": "7", + "6": "6" + } + } +} +``` + +### Versions + +This table is where the curret version of the software is recorded. +``` +{ + "VERSIONS": { + "DATABASE": { + "VERSION": "version_1_0_1" + } + } +} +``` + +### VLAN + +This table is where VLANs are defined. VLAN name is used as object key, +and member list as well as an integer id are defined as attributes. If a +DHCP relay is required for this VLAN, a dhcp_servers attribute must be +specified for that VLAN, the value of which is a list that must contain +the domain name or IP address of one or more DHCP servers. + +``` +{ +"VLAN": { + "Vlan1000": { + "dhcp_servers": [ + "192.0.0.1", + "192.0.0.2", + "192.0.0.3", + "192.0.0.4" + ], + "members": [ + "Ethernet0", + "Ethernet4", + "Ethernet8", + "Ethernet12" + ], + "vlanid": "1000" + } + } +} +``` + +### VLAN_MEMBER + +VLAN member table has Vlan name together with physical port or port +channel name as object key, and tagging mode as attributes. + +``` +{ +"VLAN_MEMBER": { + "Vlan1000|PortChannel47": { + "tagging_mode": "untagged" + }, + "Vlan1000|Ethernet8": { + "tagging_mode": "untagged" + }, + "Vlan2000|PortChannel47": { + "tagging_mode": "tagged" + } + } +} +``` + +### Virtual router + +The virtual router table allows to insert or update a new virtual router +instance. The key of the instance is its name. The attributes in the +table allow to change properties of a virtual router. Attributes: + +- 'v4' contains boolean value 'true' or 'false'. Enable or + disable IPv4 in the virtual router +- 'v6' contains boolean value 'true' or 'false'. Enable or + disable IPv6 in the virtual router +- 'src_mac' contains MAC address. What source MAC address will be + used for packets egressing from the virtual router +- 'ttl_action' contains packet action. Defines the action for + packets with TTL == 0 or TTL == 1 +- 'ip_opt_action' contains packet action. Defines the action for + packets with IP options +- 'l3_mc_action' contains packet action. Defines the action for + unknown L3 multicast packets + +The packet action could be: + +- 'drop' +- 'forward' +- 'copy' +- 'copy_cancel' +- 'trap' +- 'log' +- 'deny' +- 'transit' + + +***TBD*** +``` +'VRF:rid1': { + 'v4': 'true', + 'v6': 'false', + 'src_mac': '02:04:05:06:07:08', + 'ttl_action': 'copy', + 'ip_opt_action': 'deny', + 'l3_mc_action': 'drop' +} +``` + + +### WRED_PROFILE + +``` +{ +"WRED_PROFILE": { + "AZURE_LOSSLESS": { + "red_max_threshold": "2097152", + "wred_green_enable": "true", + "ecn": "ecn_all", + "green_min_threshold": "1048576", + "red_min_threshold": "1048576", + "wred_yellow_enable": "true", + "yellow_min_threshold": "1048576", + "green_max_threshold": "2097152", + "green_drop_probability": "5", + "yellow_max_threshold": "2097152", + "wred_red_enable": "true", + "yellow_drop_probability": "5", + "red_drop_probability": "5" + } + } +} +``` + +### BREAKOUT_CFG + +This table is introduced as part of Dynamic Port Breakout(DPB) feature. +It shows the current breakout mode of all ports(root ports). +The list of root ports, all possible breakout modes, and default breakout modes + are obtained/derived from platform.json and hwsku.json files. + +``` +"BREAKOUT_CFG": { + "Ethernet0": { + "brkout_mode": "4x25G[10G]" + }, + "Ethernet4": { + "brkout_mode": "4x25G[10G]" + }, + "Ethernet8": { + "brkout_mode": "4x25G[10G]" + }, + + ...... + + "Ethernet116": { + "brkout_mode": "2x50G" + }, + "Ethernet120": { + "brkout_mode": "2x50G" + }, + "Ethernet124": { + "brkout_mode": "2x50G" + } +} +``` + +### AAA + +The AAA table defined the method SONiC used for Authentication, Authorization and Accounting. +The method could be: +- default +- local +- tacacs+ +- radius + +``` +"AAA": { + "authentication": { + "login": "local" + }, + "authorization": { + "login": "local" + }, + "accounting": { + "login": "local" + } +} +``` + +For Developers +============== + +Generating Application Config by Jinja2 Template +------------------------------------------------ + +To be added. + +Incremental Configuration by Subscribing to ConfigDB +---------------------------------------------------- + +Detail instruction to be added. A sample could be found in this +[PR](https://github.com/Azure/sonic-buildimage/pull/861) that +implemented dynamic configuration for BGP. From 004dc699104a898c2ac5d5938661e2efeff47954 Mon Sep 17 00:00:00 2001 From: gechiang <62408185+gechiang@users.noreply.github.com> Date: Tue, 15 Mar 2022 11:50:33 -0700 Subject: [PATCH 086/817] [BRCM SAI 6.0.0.13-3] Fix Warmreboot issue (#10225) --- platform/broadcom/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ce3470e6635c..e23515a1f5ea 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,4 +1,4 @@ -LIBSAIBCM_VERSION = 6.0.0.13-1 +LIBSAIBCM_VERSION = 6.0.0.13-3 LIBSAIBCM_BRANCH_NAME = REL_6.0 LIBSAIBCM_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_VERSION)" From 98cfec29823720d3410a06d66f17597bb07891d8 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Wed, 16 Mar 2022 06:35:34 +0530 Subject: [PATCH 087/817] Using SFP refactoring framework in PDDF sfp class (#10047) * Using SFP refactoring framework in PDDF sfp class * Fixing a typo error --- .../sonic_platform_pddf_base/pddf_sfp.py | 1237 +---------------- 1 file changed, 66 insertions(+), 1171 deletions(-) diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py index cf77986aba64..f11acf1a209b 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py @@ -5,164 +5,21 @@ ############################################################################# try: - import time - from ctypes import create_string_buffer - from sonic_platform_base.sfp_base import SfpBase - from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId - from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom - from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId - from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom - from sonic_platform_base.sonic_sfp.sff8472 import sffbase - from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -# definitions of the offset and width for values in XCVR info eeprom -XCVR_INTFACE_BULK_OFFSET = 0 -XCVR_INTFACE_BULK_WIDTH_QSFP = 20 -XCVR_INTFACE_BULK_WIDTH_SFP = 21 -XCVR_TYPE_OFFSET = 0 -XCVR_TYPE_WIDTH = 1 -XCVR_EXT_TYPE_OFFSET = 1 -XCVR_EXT_TYPE_WIDTH = 1 -XCVR_CONNECTOR_OFFSET = 2 -XCVR_CONNECTOR_WIDTH = 1 -XCVR_COMPLIANCE_CODE_OFFSET = 3 -XCVR_COMPLIANCE_CODE_WIDTH = 8 -XCVR_ENCODING_OFFSET = 11 -XCVR_ENCODING_WIDTH = 1 -XCVR_NBR_OFFSET = 12 -XCVR_NBR_WIDTH = 1 -XCVR_EXT_RATE_SEL_OFFSET = 13 -XCVR_EXT_RATE_SEL_WIDTH = 1 -XCVR_CABLE_LENGTH_OFFSET = 14 -XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 -XCVR_CABLE_LENGTH_WIDTH_SFP = 6 -XCVR_VENDOR_NAME_OFFSET = 20 -XCVR_VENDOR_NAME_WIDTH = 16 -XCVR_VENDOR_OUI_OFFSET = 37 -XCVR_VENDOR_OUI_WIDTH = 3 -XCVR_VENDOR_PN_OFFSET = 40 -XCVR_VENDOR_PN_WIDTH = 16 -XCVR_HW_REV_OFFSET = 56 -XCVR_HW_REV_WIDTH_OSFP = 2 -XCVR_HW_REV_WIDTH_QSFP = 2 -XCVR_HW_REV_WIDTH_SFP = 4 -XCVR_VENDOR_SN_OFFSET = 68 -XCVR_VENDOR_SN_WIDTH = 16 -XCVR_VENDOR_DATE_OFFSET = 84 -XCVR_VENDOR_DATE_WIDTH = 8 -XCVR_DOM_CAPABILITY_OFFSET = 92 -XCVR_DOM_CAPABILITY_WIDTH = 1 -# definitions of the offset for values in OSFP info eeprom -OSFP_TYPE_OFFSET = 0 -OSFP_VENDOR_NAME_OFFSET = 129 -OSFP_VENDOR_PN_OFFSET = 148 -OSFP_HW_REV_OFFSET = 164 -OSFP_VENDOR_SN_OFFSET = 166 - -# definitions of the offset and width for values in DOM info eeprom -QSFP_DOM_REV_OFFSET = 1 -QSFP_DOM_REV_WIDTH = 1 -QSFP_TEMPE_OFFSET = 22 -QSFP_TEMPE_WIDTH = 2 -QSFP_VOLT_OFFSET = 26 -QSFP_VOLT_WIDTH = 2 -QSFP_CHANNL_MON_OFFSET = 34 -QSFP_CHANNL_MON_WIDTH = 16 -QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 -QSFP_CONTROL_OFFSET = 86 -QSFP_CONTROL_WIDTH = 8 -QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 -QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 -QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 -QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 -QSFP_POWEROVERRIDE_OFFSET = 93 -QSFP_POWEROVERRIDE_WIDTH = 1 -QSFP_MODULE_THRESHOLD_OFFSET = 128 -QSFP_MODULE_THRESHOLD_WIDTH = 24 -QSFP_CHANNEL_THRESHOLD_OFFSET = 176 -QSFP_CHANNEL_THRESHOLD_WIDTH = 24 - - -SFP_TEMPE_OFFSET = 96 -SFP_TEMPE_WIDTH = 2 -SFP_VOLT_OFFSET = 98 -SFP_VOLT_WIDTH = 2 -SFP_CHANNL_MON_OFFSET = 100 -SFP_CHANNL_MON_WIDTH = 6 -SFP_MODULE_THRESHOLD_OFFSET = 0 -SFP_MODULE_THRESHOLD_WIDTH = 40 -SFP_STATUS_CONTROL_OFFSET = 110 -SFP_STATUS_CONTROL_WIDTH = 1 -SFP_TX_DISABLE_HARD_BIT = 7 -SFP_TX_DISABLE_SOFT_BIT = 6 - - -qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', - 'Length OM2(m)', 'Length OM1(m)', - 'Length Cable Assembly(m)') - -sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', - 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', - 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') - -sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', - 'ESCONComplianceCodes', 'SONETComplianceCodes', - 'EthernetComplianceCodes', 'FibreChannelLinkLength', - 'FibreChannelTechnology', 'SFP+CableTechnology', - 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') - -qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', - 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', - 'Fibre Channel link length/Transmitter Technology', - 'Fibre Channel transmission media', 'Fibre Channel Speed') - -PAGE_OFFSET = 0 -KEY_OFFSET = 1 -KEY_WIDTH = 2 -FUNC_NAME = 3 - -INFO_OFFSET = 128 -DOM_OFFSET = 0 -DOM_OFFSET1 = 384 - - -class PddfSfp(SfpBase): +class PddfSfp(SfpOptoeBase): """ PDDF generic Sfp class """ pddf_obj = {} plugin_data = {} - _port_to_eeprom_mapping = {} _port_start = 0 _port_end = 0 - _port_to_type_mapping = {} - _qsfp_ports = [] - _sfp_ports = [] - - # Read out any bytes from any offset - def __read_eeprom_specific_bytes(self, offset, num_bytes): - sysfsfile_eeprom = None - eeprom_raw = [] - for i in range(0, num_bytes): - eeprom_raw.append("0x00") - try: - sysfsfile_eeprom = open(self.eeprom_path, mode="rb", buffering=0) - sysfsfile_eeprom.seek(offset) - raw = sysfsfile_eeprom.read(num_bytes) - for n in range(0, num_bytes): - eeprom_raw[n] = hex(raw[n])[2:].zfill(2) - except Exception as e: - print("Error: Unable to open eeprom_path: %s" % (str(e))) - finally: - if sysfsfile_eeprom: - sysfsfile_eeprom.close() - - return eeprom_raw def __init__(self, index, pddf_data=None, pddf_plugin_data=None): if not pddf_data or not pddf_plugin_data: @@ -183,492 +40,49 @@ def __init__(self, index, pddf_data=None, pddf_plugin_data=None): self.port_index = index+1 self.device = 'PORT{}'.format(self.port_index) self.sfp_type = self.pddf_obj.get_device_type(self.device) - self.is_qsfp_port = True if (self.sfp_type == 'QSFP' or self.sfp_type == 'QSFP28') else False - self.is_osfp_port = True if (self.sfp_type == 'OSFP' or self.sfp_type == 'QSFP-DD') else False self.eeprom_path = self.pddf_obj.get_path(self.device, 'eeprom') - self.info_dict_keys = ['type', 'vendor_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', - 'ext_identifier', 'ext_rateselect_compliance', 'cable_type', 'cable_length', - 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', - 'application_advertisement'] - - self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disable_channel', - 'temperature', 'voltage', 'rx1power', 'rx2power', 'rx3power', 'rx4power', 'tx1bias', - 'tx2bias', 'tx3bias', 'tx4bias', 'tx1power', 'tx2power', 'tx3power', 'tx4power'] - - self.threshold_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', - 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', - 'rxpowerhighalarm', 'rxpowerhighwarning', 'rxpowerlowalarm', 'rxpowerlowwarning', - 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', - 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] - - SfpBase.__init__(self) - - def get_transceiver_info(self): - """ - Retrieves transceiver info of this SFP - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - type |1*255VCHAR |type of SFP - vendor_rev |1*255VCHAR |vendor revision of SFP - serial |1*255VCHAR |serial number of the SFP - manufacturer |1*255VCHAR |SFP vendor name - model |1*255VCHAR |SFP model name - connector |1*255VCHAR |connector information - encoding |1*255VCHAR |encoding information - ext_identifier |1*255VCHAR |extend identifier - ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance - cable_length |INT |cable length in m - nominal_bit_rate |INT |nominal bit rate by 100Mbs - specification_compliance |1*255VCHAR |specification compliance - vendor_date |1*255VCHAR |vendor date - vendor_oui |1*255VCHAR |vendor OUI - application_advertisement |1*255VCHAR |supported applications advertisement - ======================================================================== - """ - # check present status - if not self.get_presence(): - return None - - if self.is_osfp_port: - sfpi_obj = inf8628InterfaceId() - offset = 0 - type_offset = OSFP_TYPE_OFFSET - vendor_rev_width = XCVR_HW_REV_WIDTH_OSFP - hw_rev_offset = OSFP_HW_REV_OFFSET - vendor_name_offset = OSFP_VENDOR_NAME_OFFSET - vendor_pn_offset = OSFP_VENDOR_PN_OFFSET - vendor_sn_offset = OSFP_VENDOR_SN_OFFSET - interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP - sfp_type = 'OSFP' - - elif self.is_qsfp_port: - sfpi_obj = sff8436InterfaceId() - offset = 128 - type_offset = XCVR_TYPE_OFFSET - vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP - hw_rev_offset = XCVR_HW_REV_OFFSET - vendor_name_offset = XCVR_VENDOR_NAME_OFFSET - vendor_pn_offset = XCVR_VENDOR_PN_OFFSET - vendor_sn_offset = XCVR_VENDOR_SN_OFFSET - interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP - sfp_type = 'QSFP' - else: - sfpi_obj = sff8472InterfaceId() - offset = 0 - type_offset = XCVR_TYPE_OFFSET - vendor_rev_width = XCVR_HW_REV_WIDTH_SFP - hw_rev_offset = XCVR_HW_REV_OFFSET - vendor_name_offset = XCVR_VENDOR_NAME_OFFSET - vendor_pn_offset = XCVR_VENDOR_PN_OFFSET - vendor_sn_offset = XCVR_VENDOR_SN_OFFSET - interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_SFP - sfp_type = 'SFP' - - if sfpi_obj is None: - return None - - if self.is_osfp_port: - sfp_type_raw = self.__read_eeprom_specific_bytes((offset + type_offset), XCVR_TYPE_WIDTH) - if sfp_type_raw is not None: - sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) - sfp_type_abbrv_name = sfpi_obj.parse_sfp_type_abbrv_name(sfp_typ_raw, 0) - else: - sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_INTFACE_BULK_OFFSET), interface_info_bulk_width) - if sfp_interface_bulk_raw is not None: - sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw, 0) - - sfp_vendor_oui_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) - if sfp_vendor_oui_raw is not None: - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) - - sfp_vendor_date_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) - if sfp_vendor_date_raw is not None: - sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) - - sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( - (offset + vendor_name_offset), XCVR_VENDOR_NAME_WIDTH) - sfp_vendor_name_data = sfpi_obj.parse_vendor_name( - sfp_vendor_name_raw, 0) - - sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( - (offset + vendor_pn_offset), XCVR_VENDOR_PN_WIDTH) - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( - sfp_vendor_pn_raw, 0) - - sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( - (offset + hw_rev_offset), vendor_rev_width) - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( - sfp_vendor_rev_raw, 0) - - sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( - (offset + vendor_sn_offset), XCVR_VENDOR_SN_WIDTH) - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( - sfp_vendor_sn_raw, 0) - - xcvr_info_dict = dict.fromkeys(self.info_dict_keys, 'N/A') - compliance_code_dict = dict() - - if sfp_interface_bulk_data: - xcvr_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - xcvr_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] - xcvr_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] - xcvr_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] - xcvr_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] - xcvr_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - else: - xcvr_info_dict['type'] = sfp_type_data['data']['type']['value'] if sfp_type_data else 'N/A' - xcvr_info_dict['type_abbrv_name'] = sfp_type_abbrv_name['data']['type_abbrv_name']['value'] \ - if sfp_type_abbrv_name else 'N/A' - - xcvr_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] \ - if sfp_vendor_name_data else 'N/A' - xcvr_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - xcvr_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] \ - if sfp_vendor_rev_data else 'N/A' - xcvr_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' - xcvr_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] \ - if sfp_vendor_oui_data else 'N/A' - xcvr_info_dict['vendor_date'] = sfp_vendor_date_data['data'][ - 'VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' - xcvr_info_dict['cable_type'] = "Unknown" - xcvr_info_dict['cable_length'] = "Unknown" - - if sfp_type == 'QSFP': - for key in qsfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - xcvr_info_dict['cable_type'] = key - xcvr_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) + SfpOptoeBase.__init__(self) - for key in qsfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance'][ - 'value'][key]['value'] - xcvr_info_dict['specification_compliance'] = str(compliance_code_dict) + def get_eeprom_path(self): + return self.eeprom_path - nkey = 'Nominal Bit Rate(100Mbs)' - if nkey in sfp_interface_bulk_data['data']: - xcvr_info_dict['nominal_bit_rate'] = str( - sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) - else: - xcvr_info_dict['nominal_bit_rate'] = 'N/A' - elif sfp_type == 'OSFP': - pass - else: - for key in sfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - xcvr_info_dict['cable_type'] = key - xcvr_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) - - for key in sfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance'][ - 'value'][key]['value'] - xcvr_info_dict['specification_compliance'] = str(compliance_code_dict) - - xcvr_info_dict['nominal_bit_rate'] = str( - sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) - - return xcvr_info_dict - - def get_transceiver_bulk_status(self): + def get_name(self): """ - Retrieves transceiver bulk status of this SFP - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. - tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. - reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. - lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. - tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. - tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 - | |to channel 3. - temperature |INT |module temperature in Celsius - voltage |INT |supply voltage in mV - txbias |INT |TX Bias Current in mA, n is the channel number, - | |for example, tx2bias stands for tx bias of channel 2. - rxpower |INT |received optical power in mW, n is the channel number, - | |for example, rx2power stands for rx power of channel 2. - txpower |INT |TX output power in mW, n is the channel number, - | |for example, tx2power stands for tx power of channel 2. - ======================================================================== + Retrieves the name of the device + Returns: + string: The name of the device """ - # check present status - if not self.get_presence(): - return None - - xcvr_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') - - if self.is_osfp_port: - # Below part is added to avoid fail xcvrd, shall be implemented later - pass - elif self.is_qsfp_port: - # QSFPs - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - sfpi_obj = sff8436InterfaceId() - if sfpi_obj is None: - return None - - qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( - (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) - if qsfp_dom_capability_raw is not None: - qspf_dom_capability_data = sfpi_obj.parse_dom_capability( - qsfp_dom_capability_raw, 0) - else: - return None - - dom_temperature_raw = self.__read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - else: - return None - - dom_voltage_raw = self.__read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - else: - return None - - qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes((offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) - if qsfp_dom_rev_raw is not None: - qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) - else: - return None - - xcvr_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - xcvr_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - - # The tx_power monitoring is only available on QSFP which compliant with SFF-8636 - # and claimed that it support tx_power with one indicator bit. - dom_channel_monitor_data = {} - qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] - qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] - if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - else: - return None - - xcvr_dom_info_dict['tx1power'] = 'N/A' - xcvr_dom_info_dict['tx2power'] = 'N/A' - xcvr_dom_info_dict['tx3power'] = 'N/A' - xcvr_dom_info_dict['tx4power'] = 'N/A' - else: - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( - dom_channel_monitor_raw, 0) - else: - return None - - xcvr_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] - xcvr_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] - xcvr_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] - xcvr_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] - - if dom_channel_monitor_raw: - xcvr_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - xcvr_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - xcvr_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] - xcvr_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] - xcvr_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] - xcvr_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] - xcvr_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] - xcvr_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] - xcvr_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] - xcvr_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] - - else: - # SFPs - offset = 256 - - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - - dom_temperature_raw = self.__read_eeprom_specific_bytes((offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - else: - return None - - dom_voltage_raw = self.__read_eeprom_specific_bytes((offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - else: - return None - - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - else: - return None - - xcvr_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - xcvr_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - xcvr_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RXPower']['value'] - xcvr_dom_info_dict['rx2power'] = 'N/A' - xcvr_dom_info_dict['rx3power'] = 'N/A' - xcvr_dom_info_dict['rx4power'] = 'N/A' - xcvr_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TXBias']['value'] - xcvr_dom_info_dict['tx2bias'] = 'N/A' - xcvr_dom_info_dict['tx3bias'] = 'N/A' - xcvr_dom_info_dict['tx4bias'] = 'N/A' - xcvr_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TXPower']['value'] - xcvr_dom_info_dict['tx2power'] = 'N/A' - xcvr_dom_info_dict['tx3power'] = 'N/A' - xcvr_dom_info_dict['tx4power'] = 'N/A' - - xcvr_dom_info_dict['rx_los'] = self.get_rx_los() - xcvr_dom_info_dict['tx_fault'] = self.get_tx_fault() - xcvr_dom_info_dict['reset_status'] = self.get_reset_status() - xcvr_dom_info_dict['lp_mode'] = self.get_lpmode() - - return xcvr_dom_info_dict + # Name of the port/sfp ? + return 'PORT{}'.format(self.port_index) - def get_transceiver_threshold_info(self): + def get_presence(self): """ - Retrieves transceiver threshold info of this SFP + Retrieves the presence of the PSU Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. - templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. - temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. - templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. - vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. - vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. - vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. - vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. - rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. - rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. - rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. - rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. - txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. - txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. - txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. - txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. - txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. - txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. - txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. - txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. - ======================================================================== + bool: True if PSU is present, False if not """ - # check present status - if not self.get_presence(): - return None - - xcvr_dom_threshold_info_dict = dict.fromkeys(self.threshold_dict_keys, 'N/A') - - if self.is_osfp_port: - # Below part is added to avoid fail xcvrd, shall be implemented later - pass - elif self.is_qsfp_port: - # QSFPs - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - offset = 384 - dom_thres_raw = self.__read_eeprom_specific_bytes( - (offset+QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) - if dom_thres_raw: - module_threshold_values = sfpd_obj.parse_module_threshold_values( - dom_thres_raw, 0) - module_threshold_data = module_threshold_values.get('data') - if module_threshold_data: - xcvr_dom_threshold_info_dict['temphighalarm'] = module_threshold_data['TempHighAlarm']['value'] - xcvr_dom_threshold_info_dict['templowalarm'] = module_threshold_data['TempLowAlarm']['value'] - xcvr_dom_threshold_info_dict['temphighwarning'] = module_threshold_data['TempHighWarning']['value'] - xcvr_dom_threshold_info_dict['templowwarning'] = module_threshold_data['TempLowWarning']['value'] - xcvr_dom_threshold_info_dict['vcchighalarm'] = module_threshold_data['VccHighAlarm']['value'] - xcvr_dom_threshold_info_dict['vcclowalarm'] = module_threshold_data['VccLowAlarm']['value'] - xcvr_dom_threshold_info_dict['vcchighwarning'] = module_threshold_data['VccHighWarning']['value'] - xcvr_dom_threshold_info_dict['vcclowwarning'] = module_threshold_data['VccLowWarning']['value'] - - dom_thres_raw = self.__read_eeprom_specific_bytes((offset + QSFP_CHANNEL_THRESHOLD_OFFSET), - QSFP_CHANNEL_THRESHOLD_WIDTH) - if dom_thres_raw: - channel_threshold_values = sfpd_obj.parse_channel_threshold_values( - dom_thres_raw, 0) - ch_th_data = channel_threshold_values.get('data') - if ch_th_data: - xcvr_dom_threshold_info_dict['rxpowerhighalarm'] = ch_th_data['RxPowerHighAlarm']['value'] - xcvr_dom_threshold_info_dict['rxpowerlowalarm'] = ch_th_data['RxPowerLowAlarm']['value'] - xcvr_dom_threshold_info_dict['rxpowerhighwarning'] = ch_th_data['RxPowerHighWarning']['value'] - xcvr_dom_threshold_info_dict['rxpowerlowwarning'] = ch_th_data['RxPowerLowWarning']['value'] - xcvr_dom_threshold_info_dict['txpowerhighalarm'] = "0.0dBm" - xcvr_dom_threshold_info_dict['txpowerlowalarm'] = "0.0dBm" - xcvr_dom_threshold_info_dict['txpowerhighwarning'] = "0.0dBm" - xcvr_dom_threshold_info_dict['txpowerlowwarning'] = "0.0dBm" - xcvr_dom_threshold_info_dict['txbiashighalarm'] = ch_th_data['TxBiasHighAlarm']['value'] - xcvr_dom_threshold_info_dict['txbiaslowalarm'] = ch_th_data['TxBiasLowAlarm']['value'] - xcvr_dom_threshold_info_dict['txbiashighwarning'] = ch_th_data['TxBiasHighWarning']['value'] - xcvr_dom_threshold_info_dict['txbiaslowwarning'] = ch_th_data['TxBiasLowWarning']['value'] + output = self.pddf_obj.get_attr_name_output(self.device, 'xcvr_present') + if not output: + return False + mode = output['mode'] + modpres = output['status'].rstrip() + if 'XCVR' in self.plugin_data: + if 'xcvr_present' in self.plugin_data['XCVR']: + ptype = self.sfp_type + vtype = 'valmap-'+ptype + if vtype in self.plugin_data['XCVR']['xcvr_present'][mode]: + vmap = self.plugin_data['XCVR']['xcvr_present'][mode][vtype] + if modpres in vmap: + return vmap[modpres] + else: + return False + # if self.plugin_data doesn't specify anything regarding Transceivers + if modpres == '1': + return True else: - # SFPs - sfpd_obj = sff8472Dom() - offset = 256 - eeprom_ifraw = self.__read_eeprom_specific_bytes(0, offset) - sfpi_obj = sff8472InterfaceId(eeprom_ifraw) - cal_type = sfpi_obj.get_calibration_type() - sfpd_obj._calibration_type = cal_type - - dom_module_threshold_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is not None: - dom_mod_th_data = sfpd_obj.parse_alarm_warning_threshold( - dom_module_threshold_raw, 0) - - xcvr_dom_threshold_info_dict['temphighalarm'] = dom_mod_th_data['data']['TempHighAlarm']['value'] - xcvr_dom_threshold_info_dict['templowalarm'] = dom_mod_th_data['data']['TempLowAlarm']['value'] - xcvr_dom_threshold_info_dict['temphighwarning'] = dom_mod_th_data['data']['TempHighWarning']['value'] - xcvr_dom_threshold_info_dict['templowwarning'] = dom_mod_th_data['data']['TempLowWarning']['value'] - xcvr_dom_threshold_info_dict['vcchighalarm'] = dom_mod_th_data['data']['VoltageHighAlarm']['value'] - xcvr_dom_threshold_info_dict['vcclowalarm'] = dom_mod_th_data['data']['VoltageLowAlarm']['value'] - xcvr_dom_threshold_info_dict['vcchighwarning'] = dom_mod_th_data[ - 'data']['VoltageHighWarning']['value'] - xcvr_dom_threshold_info_dict['vcclowwarning'] = dom_mod_th_data['data']['VoltageLowWarning']['value'] - xcvr_dom_threshold_info_dict['txbiashighalarm'] = dom_mod_th_data['data']['BiasHighAlarm']['value'] - xcvr_dom_threshold_info_dict['txbiaslowalarm'] = dom_mod_th_data['data']['BiasLowAlarm']['value'] - xcvr_dom_threshold_info_dict['txbiashighwarning'] = dom_mod_th_data['data']['BiasHighWarning']['value'] - xcvr_dom_threshold_info_dict['txbiaslowwarning'] = dom_mod_th_data['data']['BiasLowWarning']['value'] - xcvr_dom_threshold_info_dict['txpowerhighalarm'] = dom_mod_th_data['data']['TXPowerHighAlarm']['value'] - xcvr_dom_threshold_info_dict['txpowerlowalarm'] = dom_mod_th_data['data']['TXPowerLowAlarm']['value'] - xcvr_dom_threshold_info_dict['txpowerhighwarning'] = dom_mod_th_data['data']['TXPowerHighWarning'][ - 'value'] - xcvr_dom_threshold_info_dict['txpowerlowwarning'] = dom_mod_th_data['data']['TXPowerLowWarning'][ - 'value'] - xcvr_dom_threshold_info_dict['rxpowerhighalarm'] = dom_mod_th_data['data']['RXPowerHighAlarm']['value'] - xcvr_dom_threshold_info_dict['rxpowerlowalarm'] = dom_mod_th_data['data']['RXPowerLowAlarm']['value'] - xcvr_dom_threshold_info_dict['rxpowerhighwarning'] = dom_mod_th_data['data']['RXPowerHighWarning'][ - 'value'] - xcvr_dom_threshold_info_dict['rxpowerlowwarning'] = dom_mod_th_data['data']['RXPowerLowWarning'][ - 'value'] - - return xcvr_dom_threshold_info_dict + return False def get_reset_status(self): """ @@ -677,20 +91,16 @@ def get_reset_status(self): A Boolean, True if reset enabled, False if disabled """ reset_status = None - if not self.get_presence(): - return reset_status - device = 'PORT{}'.format(self.port_index) output = self.pddf_obj.get_attr_name_output(device, 'xcvr_reset') - if not output: - return False - status = int(output['status'].rstrip()) + if output: + status = int(output['status'].rstrip()) - if status == 1: - reset_status = True - else: - reset_status = False + if status == 1: + reset_status = True + else: + reset_status = False return reset_status @@ -702,42 +112,19 @@ def get_rx_los(self): Note : RX LOS status is latched until a call to get_rx_los or a reset. """ rx_los = None - if not self.get_presence(): - return rx_los - device = 'PORT{}'.format(self.port_index) output = self.pddf_obj.get_attr_name_output(device, 'xcvr_rxlos') - if not output: - # read the values from EEPROM - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - rx_los_list = [] - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNL_RX_LOS_STATUS_OFFSET, QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence() else None - if dom_channel_monitor_raw is not None: - rx_los_data = int(dom_channel_monitor_raw[0], 16) - rx_los_list.append(rx_los_data & 0x01 != 0) - rx_los_list.append(rx_los_data & 0x02 != 0) - rx_los_list.append(rx_los_data & 0x04 != 0) - rx_los_list.append(rx_los_data & 0x08 != 0) - rx_los = rx_los_list[0] and rx_los_list[1] and rx_los_list[2] and rx_los_list[3] - else: - # SFP ports - status_control_raw = self.__read_eeprom_specific_bytes( - SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) - if status_control_raw: - data = int(status_control_raw[0], 16) - rx_los = (sffbase().test_bit(data, 1) != 0) - - else: + if output: status = int(output['status'].rstrip()) if status == 1: rx_los = True else: rx_los = False + else: + # Use common SfpOptoeBase implementation for get_rx_los + rx_los = super().get_rx_los() return rx_los @@ -749,42 +136,19 @@ def get_tx_fault(self): Note : TX fault status is lached until a call to get_tx_fault or a reset. """ tx_fault = None - if not self.get_presence(): - return tx_fault - device = 'PORT{}'.format(self.port_index) output = self.pddf_obj.get_attr_name_output(device, 'xcvr_txfault') - if not output: - # read the values from EEPROM - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - tx_fault_list = [] - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) \ - if self.get_presence() else None - if dom_channel_monitor_raw is not None: - tx_fault_data = int(dom_channel_monitor_raw[0], 16) - tx_fault_list.append(tx_fault_data & 0x01 != 0) - tx_fault_list.append(tx_fault_data & 0x02 != 0) - tx_fault_list.append(tx_fault_data & 0x04 != 0) - tx_fault_list.append(tx_fault_data & 0x08 != 0) - tx_fault = tx_fault_list[0] and tx_fault_list[1] and tx_fault_list[2] and tx_fault_list[3] - else: - # SFP - status_control_raw = self.__read_eeprom_specific_bytes( - SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) - if status_control_raw: - data = int(status_control_raw[0], 16) - tx_fault = (sffbase().test_bit(data, 2) != 0) - else: + if output: status = int(output['status'].rstrip()) if status == 1: tx_fault = True else: tx_fault = False + else: + # Use common SfpOptoeBase implementation for get_tx_fault + tx_fault = super().get_tx_fault() return tx_fault @@ -795,86 +159,22 @@ def get_tx_disable(self): A Boolean, True if tx_disable is enabled, False if disabled """ tx_disable = False - if not self.get_presence(): - return tx_disable - device = 'PORT{}'.format(self.port_index) output = self.pddf_obj.get_attr_name_output(device, 'xcvr_txdisable') - if not output: - # read the values from EEPROM - if self.is_osfp_port: - return tx_disable - elif self.is_qsfp_port: - tx_disable_list = [] - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return False - - dom_control_raw = self.__read_eeprom_specific_bytes( - QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None - if dom_control_raw is not None: - dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX1Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX2Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX3Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX4Disable']['value']) - - return tx_disable_list - else: - status_control_raw = self.__read_eeprom_specific_bytes( - SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) - if status_control_raw: - data = int(status_control_raw[0], 16) - tx_disable_hard = (sffbase().test_bit( - data, SFP_TX_DISABLE_HARD_BIT) != 0) - tx_disable_soft = (sffbase().test_bit( - data, SFP_TX_DISABLE_SOFT_BIT) != 0) - tx_disable = tx_disable_hard | tx_disable_soft - - return tx_disable - else: + if output: status = int(output['status'].rstrip()) if status == 1: tx_disable = True else: tx_disable = False + else: + # Use common SfpOptoeBase implementation for get_tx_disable + tx_disable = super().get_tx_disable() return tx_disable - def get_tx_disable_channel(self): - """ - Retrieves the TX disabled channels in this SFP - Returns: - A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent - TX channels which have been disabled in this SFP. - As an example, a returned value of 0x5 indicates that channel 0 - and channel 2 have been disabled. - """ - if not self.get_presence(): - return 0 - - if self.is_osfp_port: - return 0 - elif self.is_qsfp_port: - tx_disable_list = self.get_tx_disable() - if tx_disable_list is None: - return 0 - tx_disabled = 0 - for i in range(len(tx_disable_list)): - if tx_disable_list[i]: - tx_disabled |= 1 << i - return tx_disabled - else: - # SFP doesnt support this - return 0 - def get_lpmode(self): """ Retrieves the lpmode (low power mode) status of this SFP @@ -882,162 +182,21 @@ def get_lpmode(self): A Boolean, True if lpmode is enabled, False if disabled """ lpmode = False - if not self.get_presence(): - return lpmode - device = 'PORT{}'.format(self.port_index) output = self.pddf_obj.get_attr_name_output(device, 'xcvr_lpmode') - if not output: - # Read from EEPROM - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - try: - eeprom = None - ctype = self.get_connector_type() - if ctype in ['Copper pigtail', 'No separable connector']: - return False - - eeprom = open(self.eeprom_path, "rb") - eeprom.seek(93) - status = ord(eeprom.read(1)) - - if ((status & 0x3) == 0x3): - # Low Power Mode if "Power override" bit is 1 and "Power set" bit is 1 - lpmode = True - else: - # High Power Mode if one of the following conditions is matched: - # 1. "Power override" bit is 0 - # 2. "Power override" bit is 1 and "Power set" bit is 0 - lpmode = False - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom is not None: - eeprom.close() - time.sleep(0.01) - else: - # SFP - pass - else: + if output: status = int(output['status'].rstrip()) if status == 1: lpmode = True else: lpmode = False - - return lpmode - - def get_power_override(self): - """ - Retrieves the power-override status of this SFP - Returns: - A Boolean, True if power-override is enabled, False if disabled - """ - power_override = False - if not self.get_presence(): - return power_override - - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return False - - dom_control_raw = self.__read_eeprom_specific_bytes( - QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None - if dom_control_raw is not None: - dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) - power_override = ('On' == dom_control_data['data']['PowerOverride']['value']) - else: - # SFP doesnt suppor this - pass - - return power_override - - def get_temperature(self): - """ - Retrieves the temperature of this SFP - Returns: - An integer number of current temperature in Celsius - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - if transceiver_dom_info_dict is not None: - # returns None if temperature is not found in the dictionary - return transceiver_dom_info_dict.get("temperature") - else: - return None - - def get_voltage(self): - """ - Retrieves the supply voltage of this SFP - Returns: - An integer number of supply voltage in mV - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - # returns None if voltage is not found in the dictionary - if transceiver_dom_info_dict is not None: - return transceiver_dom_info_dict.get("voltage") else: - return None + # Use common SfpOptoeBase implementation for get_lpmode + lpmode = super().get_lpmode() - def get_tx_bias(self): - """ - Retrieves the TX bias current of this SFP - Returns: - A list of four integer numbers, representing TX bias in mA - for channel 0 to channel 4. - Ex. ['110.09', '111.12', '108.21', '112.09'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - if transceiver_dom_info_dict is not None: - tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") - tx2_bs = transceiver_dom_info_dict.get("tx2bias", "N/A") - tx3_bs = transceiver_dom_info_dict.get("tx3bias", "N/A") - tx4_bs = transceiver_dom_info_dict.get("tx4bias", "N/A") - return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] if transceiver_dom_info_dict else [] - else: - return None - - def get_rx_power(self): - """ - Retrieves the received optical power for this SFP - Returns: - A list of four integer numbers, representing received optical - power in mW for channel 0 to channel 4. - Ex. ['1.77', '1.71', '1.68', '1.70'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - if transceiver_dom_info_dict is not None: - rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") - rx2_pw = transceiver_dom_info_dict.get("rx2power", "N/A") - rx3_pw = transceiver_dom_info_dict.get("rx3power", "N/A") - rx4_pw = transceiver_dom_info_dict.get("rx4power", "N/A") - return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] if transceiver_dom_info_dict else [] - else: - return None - - def get_tx_power(self): - """ - Retrieves the TX power of this SFP - Returns: - A list of four integer numbers, representing TX power in mW - for channel 0 to channel 4. - Ex. ['1.86', '1.86', '1.86', '1.86'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - if transceiver_dom_info_dict is not None: - tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") - tx2_pw = transceiver_dom_info_dict.get("tx2power", "N/A") - tx3_pw = transceiver_dom_info_dict.get("tx3power", "N/A") - tx4_pw = transceiver_dom_info_dict.get("tx4power", "N/A") - return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] - else: - return None + return lpmode def get_intr_status(self): """ @@ -1068,17 +227,10 @@ def reset(self): A boolean, True if successful, False if not """ status = False - if not self.get_presence(): - return status - device = 'PORT{}'.format(self.port_index) - # TODO: Implement a wrapper set function to write the sequence path = self.pddf_obj.get_path(device, 'xcvr_reset') - # TODO: put the optic based reset logic using EEPROM - if path is None: - pass - else: + if path: try: f = open(path, 'r+') except IOError as e: @@ -1095,6 +247,9 @@ def reset(self): status = True except IOError as e: status = False + else: + # Use common SfpOptoeBase implementation for reset + status = super().reset() return status @@ -1109,61 +264,11 @@ def tx_disable(self, tx_disable): """ # find out a generic implementation of tx_disable for SFP, QSFP and OSFP status = False - if not self.get_presence(): - return tx_disable - device = 'PORT{}'.format(self.port_index) path = self.pddf_obj.get_path(device, 'xcvr_txdisable') # TODO: put the optic based reset logic using EEPROM - if path is None: - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - eeprom_f = None - try: - txdisable_ctl = 0xf if tx_disable else 0x0 - buf = create_string_buffer(1) - buf[0] = bytes([txdisable_ctl]) - # Write to eeprom - eeprom_f = open(self.eeprom_path, "r+b") - eeprom_f.seek(QSFP_CONTROL_OFFSET) - eeprom_f.write(buf[0]) - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom_f is not None: - eeprom_f.close() - time.sleep(0.01) - - status = True - else: - status_control_raw = self.__read_eeprom_specific_bytes( - SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) - if status_control_raw is not None: - # Set bit 6 for Soft TX Disable Select - # 01000000 = 64 and 10111111 = 191 - txdisable_bit = 64 if tx_disable else 191 - status_control = int(status_control_raw[0], 16) - txdisable_ctl = (status_control | txdisable_bit) if tx_disable else ( - status_control & txdisable_bit) - try: - eeprom_f = open(self.eeprom_path, mode="r+b", buffering=0) - buf = create_string_buffer(1) - buf[0] = bytes([txdisable_ctl]) - # Write to eeprom - eeprom_f.seek(SFP_STATUS_CONTROL_OFFSET) - eeprom_f.write(buf[0]) - except Exception as e: - print(("Error: unable to open file: %s" % str(e))) - return False - finally: - if eeprom_f: - eeprom_f.close() - time.sleep(0.01) - status = True - else: + if path: try: f = open(path, 'r+') except IOError as e: @@ -1178,48 +283,10 @@ def tx_disable(self, tx_disable): status = True except IOError as e: status = False - - return status - - def tx_disable_channel(self, channel, disable): - """ - Sets the tx_disable for specified SFP channels - Args: - channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, - e.g. 0x5 for channel 0 and channel 2. - disable : A boolean, True to disable TX channels specified in channel, - False to enable - Returns: - A boolean, True if successful, False if not - """ - # TODO: find a implementation - status = False - if not self.get_presence(): - return status - - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - eeprom_f = None - try: - channel_state = self.get_tx_disable_channel() - txdisable_ctl = (channel_state | channel) if disable else (channel_state & ~channel) - buf = create_string_buffer(1) - buf[0] = bytes([txdisable_ctl]) - # Write to eeprom - eeprom_f = open(self.eeprom_path, "r+b") - eeprom_f.seek(QSFP_CONTROL_OFFSET) - eeprom_f.write(buf[0]) - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom_f is not None: - eeprom_f.close() - time.sleep(0.01) - status = True else: - pass + # Use common SfpOptoeBase implementation for tx_disable + status = super().tx_disable(tx_disable) + return status @@ -1233,44 +300,10 @@ def set_lpmode(self, lpmode): A boolean, True if lpmode is set successfully, False if not """ status = False - if not self.get_presence(): - return status - device = 'PORT{}'.format(self.port_index) path = self.pddf_obj.get_path(device, 'xcvr_lpmode') - # TODO: put the optic based reset logic using EEPROM - if path is None: - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - try: - eeprom_f = None - ctype = self.get_connector_type() - if ctype in ['Copper pigtail', 'No separable connector']: - return False - - # Fill in write buffer - regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode - buffer = create_string_buffer(1) - buffer[0] = bytes([regval]) - - # Write to eeprom - eeprom_f = open(self.eeprom_path, "r+b") - eeprom_f.seek(93) - eeprom_f.write(buffer[0]) - return True - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom_f is not None: - eeprom_f.close() - time.sleep(0.01) - else: - pass - - else: + if path: try: f = open(path, 'r+') except IOError as e: @@ -1286,149 +319,11 @@ def set_lpmode(self, lpmode): status = True except IOError as e: status = False - - return status - - def set_power_override(self, power_override, power_set): - """ - Sets SFP power level using power_override and power_set - Args: - power_override : - A Boolean, True to override set_lpmode and use power_set - to control SFP power, False to disable SFP power control - through power_override/power_set and use set_lpmode - to control SFP power. - power_set : - Only valid when power_override is True. - A Boolean, True to set SFP to low power mode, False to set - SFP to high power mode. - Returns: - A boolean, True if power-override and power_set are set successfully, - False if not - """ - status = False - if not self.get_presence(): - return status - - if self.is_osfp_port: - pass - elif self.is_qsfp_port: - try: - power_override_bit = 0 - if power_override: - power_override_bit |= 1 << 0 - - power_set_bit = 0 - if power_set: - power_set_bit |= 1 << 1 - - buffer = create_string_buffer(1) - buffer[0] = bytes([power_override_bit | power_set_bit]) - # Write to eeprom - eeprom_f = open(self.eeprom_path, "r+b") - eeprom_f.seek(QSFP_POWEROVERRIDE_OFFSET) - eeprom_f.write(buffer[0]) - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom_f is not None: - eeprom_f.close() - time.sleep(0.01) - return True else: - pass + # Use common SfpOptoeBase implementation for set_lpmode + status = super().set_lpmode(lpmode) return status - def get_name(self): - """ - Retrieves the name of the device - Returns: - string: The name of the device - """ - # Name of the port/sfp ? - return 'PORT{}'.format(self.port_index) - - def get_presence(self): - """ - Retrieves the presence of the PSU - Returns: - bool: True if PSU is present, False if not - """ - output = self.pddf_obj.get_attr_name_output(self.device, 'xcvr_present') - if not output: - return False - - mode = output['mode'] - modpres = output['status'].rstrip() - if 'XCVR' in self.plugin_data: - if 'xcvr_present' in self.plugin_data['XCVR']: - ptype = self.sfp_type - vtype = 'valmap-'+ptype - if vtype in self.plugin_data['XCVR']['xcvr_present'][mode]: - vmap = self.plugin_data['XCVR']['xcvr_present'][mode][vtype] - if modpres in vmap: - return vmap[modpres] - else: - return False - # if self.plugin_data doesn't specify anything regarding Transceivers - if modpres == '1': - return True - else: - return False - - def get_model(self): - """ - Retrieves the model number (or part number) of the device - Returns: - string: Model/part number of device - """ - transceiver_dom_info_dict = self.get_transceiver_info() - if transceiver_dom_info_dict is not None: - return transceiver_dom_info_dict.get("model", "N/A") - else: - return None - - def get_serial(self): - """ - Retrieves the serial number of the device - Returns: - string: Serial number of device - """ - transceiver_dom_info_dict = self.get_transceiver_info() - if transceiver_dom_info_dict is not None: - return transceiver_dom_info_dict.get("serial", "N/A") - else: - return None - - def get_status(self): - """ - Retrieves the operational status of the device - Returns: - A boolean value, True if device is operating properly, False if not - """ - return self.get_presence() and self.get_transceiver_bulk_status() - - def get_connector_type(self): - """ - Retrieves the device connector type - Returns: - enum: connector_code - """ - transceiver_dom_info_dict = self.get_transceiver_info() - if transceiver_dom_info_dict is not None: - return transceiver_dom_info_dict.get("connector", "N/A") - else: - return None - - def get_transceiver_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring SFP(Xcvrd) - on this platform. - """ - raise NotImplementedError - def dump_sysfs(self): return self.pddf_obj.cli_dump_dsysfs('xcvr') From 5617b1ae3efc6cee52b875651135ada67898ebf0 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 15 Mar 2022 18:12:49 -0700 Subject: [PATCH 088/817] Image disk space reduction (#10172) # Why I did it Reduce the disk space taken up during bootup and runtime. # How I did it 1. Remove python package cache from the base image and from the containers. 2. During bootup, if logs are to be stored in memory, then don't create the `var-log.ext4` file just to delete it later during bootup. 3. For the partition containing `/host`, don't reserve any blocks for just the root user. This just makes sure all disk space is available for all users, if needed during upgrades (for example). * Remove pip2 and pip3 caches from some containers Only containers which appeared to have a significant pip cache size are included here. Signed-off-by: Saikrishna Arcot * Don't create var-log.ext4 if we're storing logs in memory Signed-off-by: Saikrishna Arcot * Run tune2fs on the device containing /host to not reserve any blocks for just the root user Signed-off-by: Saikrishna Arcot --- dockers/docker-base-bullseye/Dockerfile.j2 | 2 +- dockers/docker-base-buster/Dockerfile.j2 | 2 +- dockers/docker-config-engine-bullseye/Dockerfile.j2 | 2 +- dockers/docker-config-engine-buster/Dockerfile.j2 | 2 +- dockers/docker-orchagent/Dockerfile.j2 | 2 +- dockers/docker-sonic-mgmt-framework/Dockerfile.j2 | 2 +- files/Aboot/boot0.j2 | 7 ++++++- files/initramfs-tools/varlog | 10 ++++++++++ installer/arm64/install.sh | 5 +++++ installer/armhf/install.sh | 5 +++++ installer/x86_64/install.sh | 11 +++++++++++ 11 files changed, 43 insertions(+), 7 deletions(-) diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index 1b33003ce0a9..cae555174174 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -102,7 +102,7 @@ RUN apt-get -y purge \ RUN apt-get clean -y && \ apt-get autoclean -y && \ apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/* /tmp/* + rm -rf /var/lib/apt/lists/* /tmp/* ~/.cache COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] diff --git a/dockers/docker-base-buster/Dockerfile.j2 b/dockers/docker-base-buster/Dockerfile.j2 index e16a0f677b07..52c784e9a7fe 100644 --- a/dockers/docker-base-buster/Dockerfile.j2 +++ b/dockers/docker-base-buster/Dockerfile.j2 @@ -121,7 +121,7 @@ RUN apt-get -y purge \ RUN apt-get clean -y && \ apt-get autoclean -y && \ apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/* /tmp/* + rm -rf /var/lib/apt/lists/* /tmp/* ~/.cache/ COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] diff --git a/dockers/docker-config-engine-bullseye/Dockerfile.j2 b/dockers/docker-config-engine-bullseye/Dockerfile.j2 index 84785d0669f1..9d0ca97c7604 100644 --- a/dockers/docker-config-engine-bullseye/Dockerfile.j2 +++ b/dockers/docker-config-engine-bullseye/Dockerfile.j2 @@ -49,4 +49,4 @@ RUN apt-get purge -y \ apt-get clean -y && \ apt-get autoclean -y && \ apt-get autoremove -y && \ - rm -rf /debs /python-wheels + rm -rf /debs /python-wheels ~/.cache diff --git a/dockers/docker-config-engine-buster/Dockerfile.j2 b/dockers/docker-config-engine-buster/Dockerfile.j2 index 3022546a068c..1e7a64bfcd36 100644 --- a/dockers/docker-config-engine-buster/Dockerfile.j2 +++ b/dockers/docker-config-engine-buster/Dockerfile.j2 @@ -49,4 +49,4 @@ RUN apt-get purge -y \ apt-get clean -y && \ apt-get autoclean -y && \ apt-get autoremove -y && \ - rm -rf /debs /python-wheels + rm -rf /debs /python-wheels ~/.cache diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 5e403213c1d4..f71f31cfc0ac 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -64,7 +64,7 @@ RUN apt-get purge -y \ apt-get clean -y && \ apt-get autoclean -y && \ apt-get autoremove -y && \ - rm -rf /debs + rm -rf /debs ~/.cache COPY ["files/arp_update", "/usr/bin"] COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] diff --git a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 index d727ac449d46..937c5368483a 100644 --- a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 @@ -34,6 +34,6 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] RUN apt-get remove -y g++ python3-dev RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +RUN rm -rf /debs ~/.cache ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 38eb8b5fe78a..7306c36cfc0c 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -351,7 +351,12 @@ extract_image() { unzip -oq "$swipath" -x boot0 "$dockerfs" -d "$image_path" ## detect rootfs type - rootfs_type=`grep " $target_path " /proc/mounts | cut -d' ' -f3` + local mountstr="$(grep " $target_path " /proc/mounts)" + local rootdev="$(echo $mountstr | cut -f1 -d' ')" + rootfs_type="$(echo $mountstr | cut -d' ' -f3)" + + ## Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $rootdev info "Extracting $dockerfs from swi" ## Unpacking dockerfs delayed diff --git a/files/initramfs-tools/varlog b/files/initramfs-tools/varlog index e8063e41a59c..980b24523452 100644 --- a/files/initramfs-tools/varlog +++ b/files/initramfs-tools/varlog @@ -11,17 +11,27 @@ case $1 in ;; esac +logs_inram=false + # Extract kernel parameters set -- $(cat /proc/cmdline) for x in "$@"; do case "$x" in varlog_size=*) varlog_size="${x#varlog_size=}" + ;; + logs_inram=on) + logs_inram=true + ;; esac done [ -z "$varlog_size" ] && exit 0 +# If logs are being stored in memory, then don't bother +# creating the log file just to have it deleted afterwards. +$logs_inram && exit 0 + # exit when the var_log.ext4 exists and the size matches if [ -e "${rootmnt}/host/disk-img/var-log.ext4" ]; then cur_varlog_size=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}') diff --git a/installer/arm64/install.sh b/installer/arm64/install.sh index dee3ceec9038..249c5b521700 100755 --- a/installer/arm64/install.sh +++ b/installer/arm64/install.sh @@ -139,6 +139,11 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done + + demo_dev=$(findmnt -n -o SOURCE --target /host) + + # Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $demo_dev fi # Create target directory or clean it up if exists diff --git a/installer/armhf/install.sh b/installer/armhf/install.sh index 9ade40d5149e..8cffa755734f 100755 --- a/installer/armhf/install.sh +++ b/installer/armhf/install.sh @@ -139,6 +139,11 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done + + demo_dev=$(findmnt -n -o SOURCE --target /host) + + # Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $demo_dev fi # Create target directory or clean it up if exists diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index dbab4d54ab72..950d765d2418 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -477,6 +477,9 @@ if [ "$install_env" = "onie" ]; then # Make filesystem mkfs.ext4 -L $demo_volume_label $demo_dev + # Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $demo_dev + # Mount demo filesystem demo_mnt=$(${onie_bin} mktemp -d) || { echo "Error: Unable to create file system mount point" @@ -509,12 +512,20 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done + + demo_dev=$(findmnt -n -o SOURCE --target /host) + + # Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $demo_dev else demo_mnt="build_raw_image_mnt" demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" mkfs.ext4 -L $demo_volume_label $demo_dev + # Don't reserve any blocks just for root + tune2fs -m 0 -r 0 $demo_dev + echo "Mounting $demo_dev on $demo_mnt..." mkdir $demo_mnt mount -t auto -o loop $demo_dev $demo_mnt From c5849c9650f099428f10207992b58623445db314 Mon Sep 17 00:00:00 2001 From: Oleksandr Kozodoi Date: Wed, 16 Mar 2022 06:00:51 +0200 Subject: [PATCH 089/817] Add scapy support for python3 virtual environment in the sonic-mgmt docker container (#10234) Why I did it Migration of sonic-mgmt codebase from Python 2 to Python 3 How I did it Added scapy dependencies to the env-python3 virtual environment. How to verify it Run test case: py.test --testbed=testbed-t0 --inventory=../ansible/lab --testbed_file=../ansible/testbed.csv --host-pattern=testbed-t0 -- module-path=../ansible/library lldp Signed-off-by: Oleksandr Kozodoi --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index df26f2ccf38c..99ad9fa8fb80 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -245,7 +245,8 @@ RUN python3 -m pip install setuptools-rust \ allure-pytest==2.8.22 \ retry \ thrift==0.11.0 \ - ptf + ptf \ + scapy==2.4.5 # Deactivating a virtualenv. ENV PATH="$BACKUP_OF_PATH" From 5c7aa50463512e16fefe564c80eb8838a49a3ee2 Mon Sep 17 00:00:00 2001 From: Arun Saravanan Balachandran <52521751+ArunSaravananBalachandran@users.noreply.github.com> Date: Thu, 17 Mar 2022 02:46:26 +0530 Subject: [PATCH 090/817] DellEMC: Z9332f - Component API Fixes (#10187) --- .../common/ipmihelper.py | 5 ++- .../common/onie_stage_fwpkg | 2 +- .../common/sonic_platform/hwaccess.py | 5 ++- .../z9332f/sonic_platform/component.py | 38 +++++++++++++++---- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/common/ipmihelper.py b/platform/broadcom/sonic-platform-modules-dell/common/ipmihelper.py index d95329c40de2..3908f90bdad4 100644 --- a/platform/broadcom/sonic-platform-modules-dell/common/ipmihelper.py +++ b/platform/broadcom/sonic-platform-modules-dell/common/ipmihelper.py @@ -90,7 +90,10 @@ def get_twos_complement(val, bits): R_exp = get_twos_complement((factors[6] & 0xF0) >> 4, 4) B_exp = get_twos_complement(factors[6] & 0x0F, 4) - converted_reading = ((M * raw_value) + (B * 10**B_exp)) * 10**R_exp + if R_exp < 0: + converted_reading = ((M * raw_value) + (B * 10**B_exp)) / 10**(-R_exp) + else: + converted_reading = ((M * raw_value) + (B * 10**B_exp)) * 10**R_exp return True, converted_reading diff --git a/platform/broadcom/sonic-platform-modules-dell/common/onie_stage_fwpkg b/platform/broadcom/sonic-platform-modules-dell/common/onie_stage_fwpkg index 1ceaf32fe8c1..dcc74a09a91e 100755 --- a/platform/broadcom/sonic-platform-modules-dell/common/onie_stage_fwpkg +++ b/platform/broadcom/sonic-platform-modules-dell/common/onie_stage_fwpkg @@ -45,7 +45,7 @@ function show_help_and_exit() echo " " echo " Available options:" echo " -h, -? : getting this help" - echo " -o [fwpkg] : stages the firmware update package" + echo " -a [fwpkg] : stages the firmware update package" exit 0 } diff --git a/platform/broadcom/sonic-platform-modules-dell/common/sonic_platform/hwaccess.py b/platform/broadcom/sonic-platform-modules-dell/common/sonic_platform/hwaccess.py index 373f71bdd5bf..642a6ddc6fc8 100644 --- a/platform/broadcom/sonic-platform-modules-dell/common/sonic_platform/hwaccess.py +++ b/platform/broadcom/sonic-platform-modules-dell/common/sonic_platform/hwaccess.py @@ -39,7 +39,10 @@ def pci_set_value(resource, val, offset): # Read I2C device def i2c_get(bus, i2caddr, ofs): - return int(subprocess.check_output(['/usr/sbin/i2cget', '-y', str(bus), str(i2caddr), str(ofs)]), 16) + try: + return int(subprocess.check_output(['/usr/sbin/i2cget', '-y', str(bus), str(i2caddr), str(ofs)]), 16) + except (FileNotFoundError, subprocess.CalledProcessError): + return -1 def io_reg_read(io_resource, offset): fd = os.open(io_resource, os.O_RDONLY) diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py index f652c2eccf85..214467f8c35d 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py @@ -23,20 +23,36 @@ def get_bios_version(): - return subprocess.check_output( - ['dmidecode', '-s', 'bios-version']).decode('utf-8').strip() + try: + return subprocess.check_output(['dmidecode', '-s', 'bios-version'], + text=True).strip() + except (FileNotFoundError, subprocess.CalledProcessError): + return 'NA' def get_fpga_version(): val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:09:00.0/resource0', 0) return '{}.{}'.format((val >> 16) & 0xffff, val & 0xffff) def get_bmc_version(): - return subprocess.check_output( - ['cat', '/sys/class/ipmi/ipmi0/device/bmc/firmware_revision'] - ).decode('utf-8').strip() + val = 'NA' + try: + bmc_ver = subprocess.check_output(['ipmitool', 'mc', 'info'], + stderr=subprocess.STDOUT, text=True) + except (FileNotFoundError, subprocess.CalledProcessError): + pass + else: + version = re.search(r'Firmware Revision\s*:\s(.*)', bmc_ver) + if version: + val = version.group(1).strip() + + return val def get_cpld_version(bus, i2caddr): - return '{}'.format(hwaccess.i2c_get(bus, i2caddr, 0)) + val = hwaccess.i2c_get(bus, i2caddr, 0) + if val != -1: + return '{:x}.{:x}'.format((val >> 4) & 0xf, val & 0xf) + else: + return 'NA' def get_cpld0_version(): return get_cpld_version(5, 0x0d) @@ -69,7 +85,7 @@ def get_pciephy_version(): except (FileNotFoundError, subprocess.CalledProcessError): pass else: - version = re.search(r'PCIe FW loader version:\s(.*)', pcie_ver) + version = re.search(r'PCIe FW version:\s(.*)', pcie_ver) if version: val = version.group(1).strip() @@ -158,6 +174,14 @@ def _get_available_firmware_version(image_path): ver_info = ver_info.get("x86_64-dellemc_z9332f_d1508-r0") if ver_info: + components = list(ver_info.keys()) + for component in components: + if "CPLD" in component and ver_info[component].get('version'): + val = ver_info.pop(component) + ver = int(val['version'], 16) + val['version'] = "{:x}.{:x}".format((ver >> 4) & 0xf, ver & 0xf) + ver_info[component.replace("-", " ")] = val + return True, ver_info else: return False, "ERROR: Version info not available" From e1f57db81863ab1fc63b5204d3e75195eafbb7b7 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 18 Mar 2022 01:16:43 +0800 Subject: [PATCH 091/817] [Submodule]: Update sonic-restapi (#10257) #### Why I did it ``` Update submodule sonic-restapi bd97dfe Fix urllib3 CVE-2021-33503 issue (#104) f159bfa Upgrade the containers to be based on Debian Buster (#103) a1830c1 (origin/201911) Fix OpenAPI spec to be readable by autorest (#101) ``` --- src/sonic-restapi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-restapi b/src/sonic-restapi index 94805a39ac07..bd97dfeb4b45 160000 --- a/src/sonic-restapi +++ b/src/sonic-restapi @@ -1 +1 @@ -Subproject commit 94805a39ac0712219f7dc08faa2cfdbf371dd177 +Subproject commit bd97dfeb4b4564defbc10e521ee05bbfe0638315 From 52c2a3ad230ddef314418cd2906d889da375f5ec Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Thu, 17 Mar 2022 10:26:03 -0700 Subject: [PATCH 092/817] [yang] Fixing Ethertype field regex in acl rule yang to accept decimal values (#10108) #### Why I did it Fixing issue https://github.com/Azure/sonic-buildimage/issues/9991 The ACL RULE table field ETHER_TYPE can accept both hex as well as decimal values. However yang model didn't allow decimal values. Fixed it to allow decimal values (same pattern as in hex (1536-65535) #### How I did it Updated yang model to handle decimal values #### How to verify it Added UT to verify it. --- .../tests/files/sample_config_db.json | 3 +- .../tests/yang_model_tests/tests/acl.json | 9 ++- .../yang_model_tests/tests_config/acl.json | 60 ++++++++++++++++++- .../yang-templates/sonic-acl.yang.j2 | 2 +- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 920181646c46..ae0cc60da648 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -150,7 +150,8 @@ "V4-ACL-TABLE|DEFAULT_DENY": { "PACKET_ACTION": "DROP", "IP_TYPE": "IPv4ANY", - "PRIORITY": "0" + "PRIORITY": "0", + "ETHER_TYPE": "2048" }, "V4-ACL-TABLE|Rule_20": { "PACKET_ACTION": "FORWARD", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json index 980622cbd3e8..243554d60f9a 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json @@ -100,7 +100,14 @@ "eStrKey" : "Pattern" }, "ACL_RULE_L2_INVALID_ETHER": { - "desc": "Configure invalid MAC address format.", + "desc": "Configure invalid ethertype.", + "eStrKey" : "Pattern" + }, + "ACL_RULE_L2_VALID_ETHER_IN_DECIMAL": { + "desc": "Configure valid ethertype in decimal format." + }, + "ACL_RULE_L2_INVALID_ETHER_IN_DECIMAL": { + "desc": "Configure invalid ethertype in decimal format.", "eStrKey" : "Pattern" }, "ACL_PACKET_ACTION_VALIDATE_VALUE_ACCEPT": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json index b2aa6b3fb15d..4829eb3971dc 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json @@ -768,8 +768,8 @@ "ACL_RULE_LIST": [ { "ACL_TABLE_NAME": "L2ACL_INVALID_ETHER", - "SRC_MAC": "00.00.AB.CD.EF.00/FF.FF.FF.00.00.00", - "DST_MAC": "00.00.AB.CD.EF.FF/FF.FF.FF.FF.FF.FF", + "SRC_MAC": "00:00:AB:CD:EF:00/FF:FF:FF:00:00:00", + "DST_MAC": "00:00:AB:CD:EF:FF/FF:FF:FF:FF:FF:FF", "ETHER_TYPE": "64", "PACKET_ACTION": "FORWARD", "PRIORITY": 999980, @@ -790,6 +790,62 @@ } } }, + "ACL_RULE_L2_VALID_ETHER_IN_DECIMAL": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "L2ACL_VALID_ETHER_DECIMAL", + "SRC_MAC": "00:00:AB:CD:EF:00/FF:FF:FF:00:00:00", + "DST_MAC": "00:00:AB:CD:EF:FF/FF:FF:FF:FF:FF:FF", + "ETHER_TYPE": "2048", + "PACKET_ACTION": "FORWARD", + "PRIORITY": 999980, + "RULE_NAME": "Rule_20" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "L2ACL_VALID_ETHER_DECIMAL", + "policy_desc": "L2ACL Test", + "ports": [ "" ], + "stage": "INGRESS", + "type": "L2" + } + ] + } + } + }, + "ACL_RULE_L2_INVALID_ETHER_IN_DECIMAL": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "L2ACL_INVALID_ETHER_DECIMAL", + "SRC_MAC": "00:00:AB:CD:EF:00/FF:FF:FF:00:00:00", + "DST_MAC": "00:00:AB:CD:EF:FF/FF:FF:FF:FF:FF:FF", + "ETHER_TYPE": "66789", + "PACKET_ACTION": "FORWARD", + "PRIORITY": 999980, + "RULE_NAME": "Rule_20" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "L2ACL_INVALID_ETHER_DECIMAL", + "policy_desc": "L2ACL Test", + "ports": [ "" ], + "stage": "INGRESS", + "type": "L2" + } + ] + } + } + }, "ACL_PACKET_ACTION_VALIDATE_VALUE_ACCEPT": { "sonic-acl:sonic-acl": { "sonic-acl:ACL_RULE": { diff --git a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 index d007f82e0964..9fd442297c9f 100644 --- a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 @@ -168,7 +168,7 @@ module sonic-acl { leaf ETHER_TYPE { type string { - pattern "0x0[6-9a-fA-F][0-9a-fA-F]{2}|0x[1-9a-fA-F][0-9a-fA-F]{3}"; + pattern "0x0[6-9a-fA-F][0-9a-fA-F]{2}|0x[1-9a-fA-F][0-9a-fA-F]{3}|153[6-9]|15[4-9][0-9]|1[6-9][0-9][0-9]|[2-9][0-9]{3}|[1-5][0-9]{4}|6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}"; } } From ad6200029f3176eef4d08d519aac7f5ef76f0ac8 Mon Sep 17 00:00:00 2001 From: Jeff Henning <94179951+jeffhtgt@users.noreply.github.com> Date: Thu, 17 Mar 2022 19:47:08 -0500 Subject: [PATCH 093/817] Edgecore 4630/5835/7326/7816 API2.0 platform support (#10053) * Initial pass of EdgeCore platform changes. * Remove libevent dependency from lldpd. * Remove python2 dependencies python3.7 force from platform install script. * Include usbmount support changes. * Add missing 4630 install file. * Update a few file permissions. Add umask line to Makefile. Specify python3.9 in install script. * Misc platform updates: - Add missing fan drawer component to sonic_platform - Remove kernel version specification from Makefile - Update to 4630 utility * - Fix file permissions on source files - Fix compile issue with 4630 driver modules (set_fs, get_fs, no longer supported in kernel 5.10) * Fix missing/extra parens in 4630 util script. * Fix indentation in fanutil.py. * Integrate deltas from Edgecore to ec_platform branch. * Installer update from Edgecore to resolve smbus serial console errors. * Update stable_size for warm boot. * Fix SFP dictionary key to match xcvrd. * - Add missing define in event.py files needed for xcvrd - Fix SFP info dict key for 7xxx switches * 5835 platform file updates including installer and 5835 utility. * 5835 fix for DMAR errors on serial console. * Don't skip starting thermalctld in the pmon container. * Revert several changes that were not related to platform. * Run thermalctld in pmon container. * Don't disable thermalctld in the pmon container. * Fix prints/parens in 7816 install utility. * - Incorporate 7816 changes from Edgecore - Fix 7326 driver file using old kernel function * Update kernel modules to use kernel_read(). * Fix compile errors with 7816 and 7326 driver modules. * Fix some indents preventing platform files from loading. * Update 7816 platform sfp dictionary to match field names in xcvrd. * Add missing service and util files for 7816. * Update file names, etc. based on full SKU for 7816. * Delete pddf files not needed. These were causing conflicts with API2.0 implementation. * Remove pddf files suggested by Edgecore that were preventing API2.0 support from starting. * Install API2.0 file instead of pddf. * Update 7326 mac service file to not use pddf. Fix syntax errors in 7326 utility script. * Fix sonic_platform setup file for 7326. * Fix syntax errors in python scripts. * Updates to 7326 platform files. * Fix some tab errors pulled down from master merge. * Remove pddf files that were added from previous merge. * Updates for 5835. * Fix missing command byte for 5835 psu status. * Fix permission bits on 4630 service files. * Update platforms to use new SFP refactoring. * Fix unused var warnings. --- .../hx5-as4630-48x1G+4x25G+2x100G.bcm | 2 +- .../pddf/pd-plugin.json | 66 - .../x86_64-accton_as4630_54pe-r0/pddf_support | 0 .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 255 ++ .../sonic_platform/component.py | 172 + .../sonic_platform/eeprom.py | 134 + .../sonic_platform/event.py | 63 + .../sonic_platform/fan.py | 284 ++ .../sonic_platform/fan_drawer.py | 90 + .../sonic_platform/helper.py | 117 + .../sonic_platform/platform.py | 21 + .../sonic_platform/psu.py | 269 ++ .../sonic_platform/sfp.py | 484 +++ .../sonic_platform/thermal.py | 236 ++ .../installer.conf | 1 - .../plugins/sfputil.py | 2 +- .../pmon_daemon_control.json | 2 +- .../sonic_platform/__init__.py | 2 +- .../sonic_platform/chassis.py | 94 +- .../sonic_platform/component.py | 58 +- .../sonic_platform/eeprom.py | 7 +- .../sonic_platform/event.py | 47 +- .../sonic_platform/fan.py | 95 +- .../sonic_platform/fan_drawer.py | 90 + .../sonic_platform/helper.py | 2 +- .../sonic_platform/psu.py | 23 +- .../sonic_platform/sfp.py | 730 +---- .../sonic_platform/thermal.py | 131 +- .../system_health_monitoring_config.json | 15 + .../pddf/pd-plugin.json | 67 - .../pddf/pddf-device.json | 2916 ----------------- .../x86_64-accton_as7326_56x-r0/pddf_support | 0 .../plugins/eeprom.py | 7 +- .../pmon_daemon_control.json | 2 +- .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 264 ++ .../sonic_platform/component.py | 161 + .../sonic_platform/eeprom.py | 139 + .../sonic_platform/event.py | 60 + .../sonic_platform/fan.py | 270 ++ .../sonic_platform/fan_drawer.py | 90 + .../sonic_platform/platform.py | 21 + .../sonic_platform/psu.py | 264 ++ .../sonic_platform/sfp.py | 626 ++++ .../sonic_platform/thermal.py | 232 ++ .../system_health_monitoring_config.json | 15 + .../pddf/pd-plugin.json | 64 - .../x86_64-accton_as7816_64x-r0/pddf_support | 0 .../pmon_daemon_control.json | 3 +- .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 250 ++ .../sonic_platform/component.py | 177 + .../sonic_platform/eeprom.py | 134 + .../sonic_platform/event.py | 62 + .../sonic_platform/fan.py | 263 ++ .../sonic_platform/fan_drawer.py | 90 + .../sonic_platform/helper.py | 117 + .../sonic_platform/platform.py | 21 + .../sonic_platform/psu.py | 283 ++ .../sonic_platform/sfp.py | 506 +++ .../sonic_platform/thermal.py | 236 ++ .../system_health_monitoring_config.json | 15 + .../as4630-54pe/modules/Makefile | 5 +- .../modules/x86-64-accton-as4630-54pe-cpld.c | 1 - .../modules/x86-64-accton-as4630-54pe-leds.c | 30 +- .../modules/x86-64-accton-as4630-54pe-psu.c | 0 .../as4630-54pe-pddf-platform-monitor.service | 16 - ...4pe-platform-handle-mgmt-interface.service | 11 + .../service/pddf-platform-init.service | 1 - .../as4630-54pe/sonic_platform_setup.py | 13 +- .../utils/accton_as4630_54pe_util.py | 70 +- .../utils/handle_mgmt_interface.sh | 9 + .../as5835-54x/classes/fanutil.py | 15 +- .../as5835-54x/classes/thermalutil.py | 89 +- .../utils/accton_as5835_54x_monitor.py | 4 +- .../utils/accton_as5835_54x_util.py | 40 +- .../as7326-56x/classes/fanutil.py | 4 +- .../modules/accton_as7326_56x_leds.c | 2 +- .../as7326-56x-pddf-platform-monitor.service | 16 - .../as7326-platform-handle_mac.service | 2 +- .../service/pddf-platform-init.service | 1 - .../as7326-56x/sonic_platform_setup.py | 9 +- .../as7326-56x/utils/accton_as7326_monitor.py | 12 +- .../as7326-56x/utils/accton_as7326_util.py | 339 +- .../as7816-64x/classes/fanutil.py | 4 +- .../as7816-64x/classes/thermalutil.py | 4 +- .../service/as7816-64x-platform-init.service | 17 + ...ce => as7816-64x-platform-monitor.service} | 5 +- .../service/as7816-platform-init.service | 13 - .../service/pddf-platform-init.service | 1 - .../as7816-64x/sonic_platform_setup.py | 11 +- ...onitor.py => accton_as7816_64x_monitor.py} | 2 +- ...7816_util.py => accton_as7816_64x_util.py} | 74 +- .../common/modules/ym2651y.c | 90 +- .../sonic-platform-accton-as4630-54pe.install | 2 +- ...sonic-platform-accton-as4630-54pe.postinst | 8 - .../sonic-platform-accton-as7326-56x.install | 3 +- .../sonic-platform-accton-as7816-64x.install | 3 +- 99 files changed, 7422 insertions(+), 4357 deletions(-) delete mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json delete mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/pddf_support create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/__init__.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/chassis.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/component.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/eeprom.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/event.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan_drawer.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/helper.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/platform.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/psu.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/sfp.py create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/thermal.py create mode 100644 device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan_drawer.py create mode 100644 device/accton/x86_64-accton_as5835_54x-r0/system_health_monitoring_config.json delete mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json delete mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json delete mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf_support create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/__init__.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/chassis.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/component.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/eeprom.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/event.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan_drawer.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/platform.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/psu.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/sfp.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/thermal.py create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/system_health_monitoring_config.json delete mode 100644 device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json delete mode 100644 device/accton/x86_64-accton_as7816_64x-r0/pddf_support create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/__init__.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/chassis.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/component.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/eeprom.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/event.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan_drawer.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/helper.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/platform.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/psu.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/sfp.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/thermal.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/system_health_monitoring_config.json mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/Makefile mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-cpld.c mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-psu.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-pddf-platform-monitor.service create mode 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-platform-handle-mgmt-interface.service delete mode 120000 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/handle_mgmt_interface.sh delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service delete mode 120000 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-init.service rename platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/{as7816-pddf-platform-monitor.service => as7816-64x-platform-monitor.service} (64%) delete mode 100755 platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-platform-init.service delete mode 120000 platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service rename platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/{accton_as7816_monitor.py => accton_as7816_64x_monitor.py} (99%) rename platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/{accton_as7816_util.py => accton_as7816_64x_util.py} (80%) delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/Accton-AS4630-54PE/hx5-as4630-48x1G+4x25G+2x100G.bcm b/device/accton/x86_64-accton_as4630_54pe-r0/Accton-AS4630-54PE/hx5-as4630-48x1G+4x25G+2x100G.bcm index 331f6d002647..a5e7903abf24 100755 --- a/device/accton/x86_64-accton_as4630_54pe-r0/Accton-AS4630-54PE/hx5-as4630-48x1G+4x25G+2x100G.bcm +++ b/device/accton/x86_64-accton_as4630_54pe-r0/Accton-AS4630-54PE/hx5-as4630-48x1G+4x25G+2x100G.bcm @@ -1,4 +1,4 @@ -stable_size=71303168 +stable_size=76303168 #polarity/lanemap is using TH2 style. core_clock_frequency=893 diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json deleted file mode 100644 index 0abf66aab7a5..000000000000 --- a/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "XCVR": - { - "xcvr_present": - { - "i2c": - { - "valmap-SFP28": {"1":true, "0":false }, - "valmap-QSFP28": {"1":true, "0":false} - } - } - }, - - "PSU": - { - "psu_present": - { - "i2c": - { - "valmap": { "1":true, "0":false } - } - }, - - "psu_power_good": - { - "i2c": - { - "valmap": { "1": true, "0":false } - } - }, - - "psu_fan_dir": - { - "i2c": - { - "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } - } - }, - - "PSU_FAN_MAX_SPEED":"18000" - }, - - "FAN": - { - "direction": - { - "i2c": - { - "valmap": {"1":"EXHAUST", "0":"INTAKE"} - } - }, - - "present": - { - "i2c": - { - "valmap": {"1":true, "0":false} - } - }, - - "duty_cycle_to_pwm": "lambda dc: ((dc*100.0)/625)", - - "pwm_to_duty_cycle": "lambda pwm: ((pwm*625.0)/100)" - } - -} diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pddf_support b/device/accton/x86_64-accton_as4630_54pe-r0/pddf_support deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/__init__.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/__init__.py new file mode 100644 index 000000000000..73a7720e8979 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = [ "platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer" ] +from . import platform diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/chassis.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/chassis.py new file mode 100644 index 000000000000..310d0433d8bc --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/chassis.py @@ -0,0 +1,255 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +import os +import sys + +try: + from sonic_platform_base.chassis_base import ChassisBase + from .helper import APIHelper + from .event import SfpEvent +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN_TRAY = 3 +NUM_FAN = 2 +NUM_PSU = 2 +NUM_THERMAL = 3 +PORT_START = 49 +PORT_END = 54 +NUM_COMPONENT = 2 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" +SYSLED_FNODE = "/sys/class/leds/diag/brightness" +SYSLED_MODES = { + "0" : "STATUS_LED_COLOR_OFF", + "1" : "STATUS_LED_COLOR_GREEN", + "2" : "STATUS_LED_COLOR_AMBER", + "5" : "STATUS_LED_COLOR_GREEN_BLINK" +} + + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + ChassisBase.__init__(self) + self._api_helper = APIHelper() + self.is_host = self._api_helper.is_host() + + self.config_data = {} + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_components() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, PORT_END): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self._sfpevent = SfpEvent(self._sfp_list) + self.sfp_module_initialized = True + + def __initialize_fan(self): + from sonic_platform.fan_drawer import FanDrawer + for fant_index in range(NUM_FAN_TRAY): + fandrawer = FanDrawer(fant_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + def __initialize_watchdog(self): + from sonic_platform.watchdog import Watchdog + self._watchdog = Watchdog() + + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + + return self._eeprom.get_product_name() + + def get_presence(self): + """ + Retrieves the presence of the Chassis + Returns: + bool: True if Chassis is present, False if not + """ + return True + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + sw_reboot_cause = self._api_helper.read_txt_file( + reboot_cause_path) or "Unknown" + + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) + + def get_change_event(self, timeout=0): + # SFP event + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return self._sfpevent.get_sfp_event(timeout) + + def get_sfp(self, index): + """ + Retrieves sfp represented by (1-based) index + Args: + index: An integer, the index (1-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 1. + For example, 1 for Ethernet0, 2 for Ethernet4 and so on. + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + # The index will start from 1 + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + + def initizalize_system_led(self): + return True + + def get_status_led(self): + val = self._api_helper.read_txt_file(SYSLED_FNODE) + return SYSLED_MODES[val] if val in SYSLED_MODES else "UNKNOWN" + + def set_status_led(self, color): + mode = None + for key, val in SYSLED_MODES.items(): + if val == color: + mode = key + break + if mode is None: + return False + else: + return self._api_helper.write_txt_file(SYSLED_FNODE, mode) + diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/component.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/component.py new file mode 100644 index 000000000000..53a01c1f1475 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/component.py @@ -0,0 +1,172 @@ +############################################################################# +# Edgecore +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +import shlex +import subprocess + + +try: + from sonic_platform_base.component_base import ComponentBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + "CPLD1": "3-0060" +} +SYSFS_PATH = "/sys/bus/i2c/devices/" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("BIOS", "Basic Input/Output System") + +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self._api_helper=APIHelper() + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + + def __run_command(self, command): + # Run bash command and print output to stdout + try: + process = subprocess.Popen( + shlex.split(command), stdout=subprocess.PIPE) + while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + rc = process.poll() + if rc != 0: + return False + except Exception: + return False + return True + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def __get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_ADDR_MAPPING: + try: + cpld_path = "{}{}{}".format(SYSFS_PATH, CPLD_ADDR_MAPPING[cpld_name], '/version') + cpld_version_raw= self._api_helper.read_txt_file(cpld_path) + cpld_version[cpld_name] = "{}".format(int(cpld_version_raw,16)) + except Exception as e: + print('Get exception when read cpld') + cpld_version[cpld_name] = 'None' + + return cpld_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + if self.name == "BIOS": + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + cpld_version = self.__get_cpld_version() + fw_version = cpld_version.get(self.name) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/eeprom.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..64a484faf5cf --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/eeprom.py @@ -0,0 +1,134 @@ +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +NULL = 'N/A' + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except Exception: + pass + + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def _valid_tlv(self, eeprom_data): + tlvinfo_type_codes_list = [ + self._TLV_CODE_PRODUCT_NAME, + self._TLV_CODE_PART_NUMBER, + self._TLV_CODE_SERIAL_NUMBER, + self._TLV_CODE_MAC_BASE, + self._TLV_CODE_MANUF_DATE, + self._TLV_CODE_DEVICE_VERSION, + self._TLV_CODE_LABEL_REVISION, + self._TLV_CODE_PLATFORM_NAME, + self._TLV_CODE_ONIE_VERSION, + self._TLV_CODE_MAC_SIZE, + self._TLV_CODE_MANUF_NAME, + self._TLV_CODE_MANUF_COUNTRY, + self._TLV_CODE_VENDOR_NAME, + self._TLV_CODE_DIAG_VERSION, + self._TLV_CODE_SERVICE_TAG, + self._TLV_CODE_VENDOR_EXT, + self._TLV_CODE_CRC_32 + ] + + for code in tlvinfo_type_codes_list: + code_str = "0x{:X}".format(code) + eeprom_data[code_str] = eeprom_data.get(code_str, NULL) + return eeprom_data + + def get_eeprom(self): + return self._valid_tlv(self._eeprom) + + def get_pn(self): + return self._eeprom.get('0x22', NULL) + + def get_serial(self): + return self._eeprom.get('0x23', NULL) + + def get_mac(self): + return self._eeprom.get('0x24', NULL) + + def get_product_name(self): + return self._eeprom.get('0x21', NULL) diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/event.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/event.py new file mode 100644 index 000000000000..96f853402abb --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/event.py @@ -0,0 +1,63 @@ +try: + import time + from .helper import APIHelper + from sonic_py_common.logger import Logger +except ImportError as e: + raise ImportError(repr(e) + " - required module not found") + +POLL_INTERVAL_IN_SEC = 1 + +class SfpEvent: + ''' Listen to insert/remove sfp events ''' + + def __init__(self, sfp_list): + self._api_helper = APIHelper() + self._sfp_list = sfp_list + self._logger = Logger() + self._sfp_change_event_data = {'present': 0} + + def get_presence_bitmap(self): + bitmap = 0 + for sfp in self._sfp_list: + modpres = sfp.get_presence() + i=sfp.port_num-1 + if modpres: + bitmap = bitmap | (1 << i) + return bitmap + + def get_sfp_event(self, timeout=2000): + #now = time.time() + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + + if timeout < 1000: + cd_ms = 1000 + else: + cd_ms = timeout + + while cd_ms > 0: + bitmap = self.get_presence_bitmap() + changed_ports = self._sfp_change_event_data['present'] ^ bitmap + if changed_ports != 0: + break + time.sleep(POLL_INTERVAL_IN_SEC) + # timeout=0 means wait for event forever + if timeout != 0: + cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000 + + if changed_ports != 0: + for sfp in self._sfp_list: + i=sfp.port_num-1 + if (changed_ports & (1 << i)): + if (bitmap & (1 << i)) == 0: + port_dict[i+1] = '0' + else: + port_dict[i+1] = '1' + + + # Update the cache dict + self._sfp_change_event_data['present'] = bitmap + return True, change_dict + else: + return True, change_dict diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan.py new file mode 100644 index 000000000000..eb9d526217bb --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan.py @@ -0,0 +1,284 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + + + +try: + from sonic_platform_base.fan_base import FanBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_FAN_MAX_RPM = 26688 +SPEED_TOLERANCE = 15 +CPLD_FAN_I2C_PATH = "/sys/bus/i2c/devices/3-0060/fan_" +I2C_PATH ="/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "58" + }, + 1: { + "num": 11, + "addr": "59" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "50" + }, + 1: { + "num": 11, + "addr": "51" + }, +} + + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", + "FAN-3F", "FAN-3R"] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self._api_helper=APIHelper() + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + + if self.is_psu_fan: + self.psu_index = psu_index + self.psu_i2c_num = PSU_HWMON_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_HWMON_I2C_MAPPING[self.psu_index]['addr'] + self.psu_hwmon_path = I2C_PATH.format( + self.psu_i2c_num, self.psu_i2c_addr) + + self.psu_i2c_num = PSU_CPLD_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_CPLD_I2C_MAPPING[self.psu_index]['addr'] + self.psu_cpld_path = I2C_PATH.format( + self.psu_i2c_num, self.psu_i2c_addr) + + FanBase.__init__(self) + + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + if not self.is_psu_fan: + dir_str = "{}{}{}".format(CPLD_FAN_I2C_PATH, 'direction_', self.fan_tray_index+1) + val=self._api_helper.read_txt_file(dir_str) + if val is not None: + if int(val, 10)==0:#F2B + direction=self.FAN_DIRECTION_EXHAUST + else: + direction=self.FAN_DIRECTION_INTAKE + else: + direction=self.FAN_DIRECTION_EXHAUST + + else: #For PSU + dir_str = "{}{}".format(self.psu_hwmon_path,'psu_fan_dir') + val=self._api_helper.read_txt_file(dir_str) + if val is not None: + if val=='F2B': + direction=self.FAN_DIRECTION_EXHAUST + else: + direction=self.FAN_DIRECTION_INTAKE + else: + direction=self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + + """ + speed = 0 + if self.is_psu_fan: + psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_speed_rpm') + fan_speed_rpm = self._api_helper.read_txt_file(psu_fan_path) + if fan_speed_rpm is not None: + speed = (int(fan_speed_rpm,10))*100/26688 + if speed > 100: + speed=100 + else: + return 0 + elif self.get_presence(): + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, 'duty_cycle_percentage') + speed=self._api_helper.read_txt_file(speed_path) + if speed is None: + return 0 + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + + Note: + speed_pc = pwm_target/255*100 + + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + return self.get_speed() + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + + """ + + if not self.is_psu_fan and self.get_presence(): + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, 'duty_cycle_percentage') + return self._api_helper.write_txt_file(speed_path, int(speed)) + + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False #Not supported + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_presence() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index*2 + self.fan_index] \ + if not self.is_psu_fan \ + else "PSU-{} FAN-{}".format(self.psu_index+1, self.fan_index+1) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + + + if self.is_psu_fan: + present_path="{}{}".format(self.psu_cpld_path, 'psu_present') + else: + present_path = "{}{}{}".format(CPLD_FAN_I2C_PATH, 'present_', self.fan_tray_index+1) + + val=self._api_helper.read_txt_file(present_path) + if val is not None: + return int(val, 10)==1 + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu_fan: + psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_fault') + val=self._api_helper.read_txt_file(psu_fan_path) + if val is not None: + return int(val, 10)==0 + else: + return False + else: + path = "{}{}{}".format(CPLD_FAN_I2C_PATH, 'fault_', self.fan_tray_index+1) + val=self._api_helper.read_txt_file(path) + if val is not None: + return int(val, 10)==0 + else: + return False + + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fan_index+1) \ + if not self.is_psu_fan else (self.psu_index+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False + diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan_drawer.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..17d339ee55f6 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/fan_drawer.py @@ -0,0 +1,90 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 + + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self._fan_list[0].get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/helper.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/helper.py new file mode 100644 index 000000000000..b124ca29f0df --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/helper.py @@ -0,0 +1,117 @@ +import os +import struct +import subprocess +from mmap import * +from sonic_py_common import device_info + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except Exception: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except Exception: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except Exception: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r', errors='replace') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except IOError: + return False + return True + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = "ipmitool raw {} {}".format(str(netfn), str(cmd)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = "ipmitool fru print {}".format(str( + id)) if not key else "ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key)) + + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = "ipmitool sensor thresh '{}' {} {}".format(str(id), str(threshold_key), str(value)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/platform.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/platform.py new file mode 100644 index 000000000000..2f2c2a447fcf --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/platform.py @@ -0,0 +1,21 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/psu.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/psu.py new file mode 100644 index 000000000000..6f21de491b38 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/psu.py @@ -0,0 +1,269 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +#import sonic_platform + +try: + from sonic_platform_base.psu_base import PsuBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +I2C_PATH ="/sys/bus/i2c/devices/{0}-00{1}/" + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] +PSU_NUM_FAN = [1, 1] +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "58" + }, + 1: { + "num": 11, + "addr": "59" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "50" + }, + 1: { + "num": 11, + "addr": "51" + }, +} + +class Psu(PsuBase): + """Platform-specific Psu class""" + + def __init__(self, psu_index=0): + PsuBase.__init__(self) + self.index = psu_index + self._api_helper = APIHelper() + + self.i2c_num = PSU_HWMON_I2C_MAPPING[self.index]["num"] + self.i2c_addr = PSU_HWMON_I2C_MAPPING[self.index]["addr"] + self.hwmon_path = I2C_PATH.format(self.i2c_num, self.i2c_addr) + + self.i2c_num = PSU_CPLD_I2C_MAPPING[self.index]["num"] + self.i2c_addr = PSU_CPLD_I2C_MAPPING[self.index]["addr"] + self.cpld_path = I2C_PATH.format(self.i2c_num, self.i2c_addr) + self.__initialize_fan() + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, PSU_NUM_FAN[self.index]): + fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) + self._fan_list.append(fan) + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_v_out') + vout_val=self._api_helper.read_txt_file(vout_path) + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + iout_path = "{}{}".format(self.hwmon_path, 'psu_i_out') + val=self._api_helper.read_txt_file(iout_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + pout_path = "{}{}".format(self.hwmon_path, 'psu_p_out') + val=self._api_helper.read_txt_file(pout_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + + return False #Controlled by HW + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_status() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_path = "{}{}".format(self.hwmon_path, 'psu_temp1_input') + val=self._api_helper.read_txt_file(temp_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return False #Not supported + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_mfr_vout_max') + vout_val=self._api_helper.read_txt_file(vout_path) + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_mfr_vout_min') + vout_val=self._api_helper.read_txt_file(vout_path) + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + presence_path="{}{}".format(self.cpld_path, 'psu_present') + val=self._api_helper.read_txt_file(presence_path) + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + power_path="{}{}".format(self.cpld_path, 'psu_power_good') + val=self._api_helper.read_txt_file(power_path) + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model_path="{}{}".format(self.cpld_path, 'psu_model_name') + model=self._api_helper.read_txt_file(model_path) + if model is None: + return "N/A" + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial_path="{}{}".format(self.cpld_path, 'psu_serial_number') + serial=self._api_helper.read_txt_file(serial_path) + if serial is None: + return "N/A" + return serial + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/sfp.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..c421761025cf --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/sfp.py @@ -0,0 +1,484 @@ +############################################################################# +# Edgecore +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import os +import time +import sys + +from ctypes import create_string_buffer + +try: + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_I2C_PATH = "/sys/bus/i2c/devices/3-0060/" + +class Sfp(SfpOptoeBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 49 + PORT_END = 54 + + # Path to sysfs + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" + + PLATFORM = "x86_64-accton_as4630_54pe-r0" + HWSKU = "Accton-AS4630-54PE" + + _port_to_i2c_mapping = { + 49: 18, + 50: 19, + 51: 20, + 52: 21, + 53: 22, + 54: 23, + } + + def __init__(self, sfp_index=0): + SfpOptoeBase.__init__(self) + self._api_helper=APIHelper() + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + # Init eeprom path + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' + self.port_to_eeprom_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) + + def get_eeprom_path(self): + return self.port_to_eeprom_mapping[self.port_num] + + def __is_host(self): + return os.system(self.HOST_CHK_CMD) == 0 + + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) + hwsku_path = "/".join([platform_path, self.HWSKU] + ) if self.__is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except Exception: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + if self.port_num < 53: #Copper port and sfp ports are suported. + return False + + reset_path="{}{}{}".format(CPLD_I2C_PATH , "module_reset_" , str(self.port_num)) + val = self._api_helper.read_txt_file(reset_path) + + if val is not None: + return int(val, 10) == 1 + else: + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los = False + + if self.port_num < 49: #Copper port, no sysfs + return False + + if self.port_num < 53: + rx_path = "{}{}{}".format(CPLD_I2C_PATH, '/module_rx_los_', self.port_num) + rx_los=self._api_helper.read_txt_file(rx_path) + if rx_los is None: + return False + else: + rx_los_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_RX_LOS_STATUS_OFFSET, QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence() else None + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + rx_los = rx_los_list[0] and rx_los_list[1] and rx_los_list[2] and rx_los_list[3] + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault = False + if self.port_num < 49: #Copper port, no sysfs + return False + + if self.port_num < 53: + tx_path = "{}{}{}".format(CPLD_I2C_PATH, '/module_tx_fault_', self.port_num) + tx_fault=self._api_helper.read_txt_file(tx_path) + if tx_fault is None: + return False + else: + tx_fault_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) if self.get_presence() else None + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + tx_fault = tx_fault_list[0] and tx_fault_list[1] and tx_fault_list[2] and tx_fault_list[3] + + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + if self.port_num < 49: #Copper port, no sysfs + return False + + if self.port_num < 53: + tx_disable = False + + tx_path = "{}{}{}".format(CPLD_I2C_PATH, '/module_tx_disable_', self.port_num) + tx_disable=self._api_helper.read_txt_file(tx_path) + + if tx_disable is not None: + return tx_disable + else: + return False + + else: + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX1Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX2Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX3Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX4Disable']['value']) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + if self.port_num < 53: + # SFP doesn't support this feature + return False + else: + tx_disable_list = self.get_tx_disable() + if tx_disable_list is None: + return 0 + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + if self.port_num < 53: + # SFP doesn't support this feature + return False + else: + power_set=self.get_power_set() + power_override = self.get_power_override() + return power_set and power_override + + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # Check for invalid port_num + if self.port_num < 53: #Copper port and sfp ports are not supported. + return False + + reset_path = "{}{}{}".format(CPLD_I2C_PATH, 'module_reset_', self.port_num) + ret = self._api_helper.write_txt_file(reset_path, 1) + if ret is not True: + return ret + + time.sleep(0.01) + ret = self._api_helper.write_txt_file(reset_path, 0) + time.sleep(0.2) + + return ret + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + if self.port_num < 49: #Copper port, no sysfs + return False + + if self.port_num < 53: + tx_path = "{}{}{}".format(CPLD_I2C_PATH, '/module_tx_disable_', self.port_num) + ret = self._api_helper.write_txt_file(tx_path, 1 if tx_disable else 0) + if ret is not None: + time.sleep(0.01) + return ret + else: + return False + + else: + if not self.get_presence(): + return False + sysfsfile_eeprom = None + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = tx_disable_ctl + else: + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print ('Error: unable to open file: ',str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + + if self.port_num < 53: + return False # SFP doesn't support this feature + else: + if not self.get_presence(): + return False + + sysfsfile_eeprom = None + try: + channel_state = self.get_tx_disable_channel() + + for i in range(4): + channel_mask = (1 << i) + if not (channel & channel_mask): + continue + + if disable: + channel_state |= channel_mask + else: + channel_state &= ~channel_mask + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = channel_state + else: + buffer[0] = chr(channel_state) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print ('Error: unable to open file: ', str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + if self.port_num < 53: + return False # SFP doesn't support this feature + else: + if lpmode is True: + self.set_power_override(True, True) + else: + self.set_power_override(False, False) + + return True + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + if self.port_num < 53: + return False # SFP doesn't support this feature + else: + if not self.get_presence(): + return False + try: + power_override_bit = (1 << 0) if power_override else 0 + power_set_bit = (1 << 1) if power_set else (1 << 3) + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = (power_override_bit | power_set_bit) + else: + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as fd: + fd.seek(QSFP_POWEROVERRIDE_OFFSET) + fd.write(buffer[0]) + time.sleep(0.01) + except IOError as e: + print ('Error: unable to open file: ', str(e)) + return False + return True + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + name = None + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + if self.port_num < 49: #Copper port, no sysfs + return False + + present_path = "{}{}{}".format(CPLD_I2C_PATH, '/module_present_', self.port_num) + val=self._api_helper.read_txt_file(present_path) + if val is not None: + return int(val, 10)==1 + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.port_num + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/thermal.py b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/thermal.py new file mode 100644 index 000000000000..938afca80e9e --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/sonic_platform/thermal.py @@ -0,0 +1,236 @@ +############################################################################# +# Edgecore +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path +import glob + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" +PSU_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "58" + }, + 1: { + "num": 11, + "addr": "59" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "50" + }, + 1: { + "num": 11, + "addr": "51" + }, +} + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + PSU_THERMAL_NAME_LIST = [] + SYSFS_PATH = "/sys/bus/i2c/devices" + + def __init__(self, thermal_index=0, is_psu=False, psu_index=0): + self.index = thermal_index + self.is_psu = is_psu + self.psu_index = psu_index + + if self.is_psu: + psu_i2c_bus = PSU_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_I2C_MAPPING[psu_index]["addr"] + self.psu_hwmon_path = PSU_I2C_PATH.format(psu_i2c_bus, + psu_i2c_addr) + psu_i2c_bus = PSU_CPLD_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_CPLD_I2C_MAPPING[psu_index]["addr"] + self.cpld_path = PSU_I2C_PATH.format(psu_i2c_bus, psu_i2c_addr) + # Add thermal name + self.THERMAL_NAME_LIST.append("Temp sensor 1") + self.THERMAL_NAME_LIST.append("Temp sensor 2") + self.THERMAL_NAME_LIST.append("Temp sensor 3") + self.PSU_THERMAL_NAME_LIST.append("PSU-1 temp sensor 1") + self.PSU_THERMAL_NAME_LIST.append("PSU-2 temp sensor 1") + + # Set hwmon path + i2c_path = { + 0: "14-0048/hwmon/hwmon*/", + 1: "24-004b/hwmon/hwmon*/", + 2: "25-004a/hwmon/hwmon*/" + }.get(self.index, None) + + self.hwmon_path = "{}/{}".format(self.SYSFS_PATH, i2c_path) + self.ss_key = self.THERMAL_NAME_LIST[self.index] + self.ss_index = 1 + + def __read_txt_file(self, file_path): + for filename in glob.glob(file_path): + try: + with open(filename, 'r') as fd: + data =fd.readline().rstrip() + return data + except IOError as e: + pass + + return None + + def __get_temp(self, temp_file): + if not self.is_psu: + temp_file_path = os.path.join(self.hwmon_path, temp_file) + else: + temp_file_path = temp_file + raw_temp = self.__read_txt_file(temp_file_path) + if raw_temp is not None: + return float(raw_temp)/1000 + else: + return 0 + + def __set_threshold(self, file_name, temperature): + if self.is_psu: + return True + temp_file_path = os.path.join(self.hwmon_path, file_name) + for filename in glob.glob(temp_file_path): + try: + with open(filename, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError as e: + print("IOError") + + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + if not self.is_psu: + temp_file = "temp{}_input".format(self.ss_index) + else: + temp_file = self.psu_hwmon_path + "psu_temp1_input" + + return self.__get_temp(temp_file) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.is_psu: + return 0 + + temp_file = "temp{}_max".format(self.ss_index) + return self.__get_temp(temp_file) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + temp_file = "temp{}_max".format(self.ss_index) + temperature = temperature *1000 + self.__set_threshold(temp_file, temperature) + + return True + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + if self.is_psu: + return self.PSU_THERMAL_NAME_LIST[self.psu_index] + else: + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the Thermal + Returns: + bool: True if Thermal is present, False if not + """ + if self.is_psu: + val = self.__read_txt_file(self.cpld_path + "psu_present") + return int(val, 10) == 1 + temp_file = "temp{}_input".format(self.ss_index) + temp_file_path = os.path.join(self.hwmon_path, temp_file) + raw_txt = self.__read_txt_file(temp_file_path) + if raw_txt is not None: + return True + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu: + temp_file = self.psu_hwmon_path + "psu_temp_fault" + return self.get_presence() and (not int( + self.__read_txt_file(temp_file))) + + file_str = "temp{}_input".format(self.ss_index) + file_path = os.path.join(self.hwmon_path, file_str) + raw_txt = self.__read_txt_file(file_path) + if raw_txt is None: + return False + else: + return int(raw_txt) != 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False diff --git a/device/accton/x86_64-accton_as5835_54x-r0/installer.conf b/device/accton/x86_64-accton_as5835_54x-r0/installer.conf index a0944fd0e30f..735fa7992dbc 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/installer.conf +++ b/device/accton/x86_64-accton_as5835_54x-r0/installer.conf @@ -2,4 +2,3 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=0 CONSOLE_SPEED=115200 ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off modprobe.blacklist=i2c-ismt,i2c_ismt,i2c-i801,i2c_i801" - diff --git a/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py index b18b15f3e68c..0c815452a7a4 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py @@ -148,7 +148,7 @@ def get_cage_num(self, port_num): cage_num = port_num if (port_num >= self.QSFP_PORT_START): cage_num = (port_num - self.QSFP_PORT_START)/4 - cage_num = cage_num + self.QSFP_PORT_START + cage_num = int(cage_num + self.QSFP_PORT_START) return cage_num diff --git a/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json index 584a14b9d942..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json @@ -1,5 +1,5 @@ { "skip_ledd": true, - "skip_thermalctld": true + "skip_pcied": true } diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/__init__.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/__init__.py index 43435472a423..73a7720e8979 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/__init__.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/__init__.py @@ -1,2 +1,2 @@ -__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp', 'thermal', 'fan'] +__all__ = [ "platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer" ] from . import platform diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/chassis.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/chassis.py index 49805d6d7858..dce9f3c150cd 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/chassis.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/chassis.py @@ -28,7 +28,14 @@ PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" REBOOT_CAUSE_FILE = "reboot-cause.txt" PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" -HOST_CHK_CMD = "docker > /dev/null 2>&1" +HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" +SYSLED_FNODE= "/sys/class/leds/as5835_54x_led::diag/brightness" + +SYSLED_MODES = { + "0" : "STATUS_LED_COLOR_OFF", + "1" : "STATUS_LED_COLOR_GREEN", + "3" : "STATUS_LED_COLOR_AMBER" +} class Chassis(ChassisBase): @@ -37,7 +44,6 @@ class Chassis(ChassisBase): def __init__(self): ChassisBase.__init__(self) self._api_helper = APIHelper() - self._api_helper = APIHelper() self.is_host = self._api_helper.is_host() self.config_data = {} @@ -54,15 +60,16 @@ def __initialize_sfp(self): for index in range(0, PORT_END): sfp = Sfp(index) self._sfp_list.append(sfp) + self._sfpevent = SfpEvent(self._sfp_list) self.sfp_module_initialized = True def __initialize_fan(self): - from sonic_platform.fan import Fan - for fant_index in range(0, NUM_FAN_TRAY): - for fan_index in range(0, NUM_FAN): - fan = Fan(fant_index, fan_index) - self._fan_list.append(fan) - + from sonic_platform.fan_drawer import FanDrawer + for fant_index in range(NUM_FAN_TRAY): + fandrawer = FanDrawer(fant_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + def __initialize_psu(self): from sonic_platform.psu import Psu for index in range(0, NUM_PSU): @@ -84,12 +91,12 @@ def __initialize_components(self): for index in range(0, NUM_COMPONENT): component = Component(index) self._component_list.append(component) - + def __initialize_watchdog(self): from sonic_platform.watchdog import Watchdog self._watchdog = Watchdog() - + def __is_host(self): return os.system(HOST_CHK_CMD) == 0 @@ -101,23 +108,14 @@ def __read_txt_file(self, file_path): except IOError: pass return None - - def get_model(self): - """ - Retrieves the model number (or part number) of the device - Returns: - string: Model/part number of device - """ - return self._eeprom.get_pn() - + def get_name(self): """ Retrieves the name of the device Returns: string: The name of the device """ - - return self._api_helper.hwsku + return self._eeprom.get_product_name() def get_presence(self): """ @@ -144,7 +142,15 @@ def get_base_mac(self): """ return self._eeprom.get_mac() - def get_serial_number(self): + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): """ Retrieves the hardware serial number for the chassis Returns: @@ -173,7 +179,7 @@ def get_reboot_cause(self): is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used to pass a description of the reboot cause. """ - + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) sw_reboot_cause = self._api_helper.read_txt_file( reboot_cause_path) or "Unknown" @@ -185,10 +191,7 @@ def get_change_event(self, timeout=0): # SFP event if not self.sfp_module_initialized: self.__initialize_sfp() - - status, sfp_event = SfpEvent(self._sfp_list).get_sfp_event(timeout) - - return status, sfp_event + return self._sfpevent.get_sfp_event(timeout) def get_sfp(self, index): """ @@ -212,3 +215,40 @@ def get_sfp(self, index): sys.stderr.write("SFP index {} out of range (1-{})\n".format( index, len(self._sfp_list))) return sfp + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + + def initizalize_system_led(self): + return True + + def get_status_led(self): + val = self._api_helper.read_txt_file(SYSLED_FNODE) + return SYSLED_MODES[val] if val in SYSLED_MODES else "UNKNOWN" + + def set_status_led(self, color): + mode = None + for key, val in SYSLED_MODES.items(): + if val == color: + mode = key + break + if mode is None: + return False + else: + return self._api_helper.write_txt_file(SYSLED_FNODE, mode) + diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/component.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/component.py index deebd5936d0d..f3c9b3cee754 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/component.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/component.py @@ -1,5 +1,5 @@ ############################################################################# -# Celestica +# Edgecore # # Component contains an implementation of SONiC Platform Base API and # provides the components firmware management function @@ -67,14 +67,14 @@ def __get_bios_version(self): with open(BIOS_VERSION_PATH, 'r') as fd: bios_version = fd.read() return bios_version.strip() - except Exception as e: + except Exception as e: print('Get exception when read bios') return None def __get_cpld_version(self): # Retrieves the CPLD firmware version cpld_version = dict() - for cpld_name in CPLD_ADDR_MAPPING: + for cpld_name in CPLD_ADDR_MAPPING: try: cpld_path = "{}{}{}".format(SYSFS_PATH, CPLD_ADDR_MAPPING[cpld_name], '/version') cpld_version_raw= self._api_helper.read_txt_file(cpld_path) @@ -126,3 +126,55 @@ def install_firmware(self, image_path): A boolean, True if install successfully, False if not """ raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/eeprom.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/eeprom.py index f3bdcbccad3f..bc9041d56b53 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/eeprom.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/eeprom.py @@ -20,7 +20,7 @@ class Tlv(eeprom_tlvinfo.TlvInfoDecoder): EEPROM_DECODE_HEADLINES = 6 def __init__(self): - self._eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + self._eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" super(Tlv, self).__init__(self._eeprom_path, 0, '', True) self._eeprom = self._load_eeprom() @@ -123,9 +123,12 @@ def get_eeprom(self): def get_pn(self): return self._eeprom.get('0x22', NULL) - + def get_serial(self): return self._eeprom.get('0x23', NULL) def get_mac(self): return self._eeprom.get('0x24', NULL) + + def get_product_name(self): + return self._eeprom.get('0x21', NULL) diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/event.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/event.py index d77ee8c29dc5..7ce2598732e2 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/event.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/event.py @@ -1,42 +1,49 @@ try: import time - from .helper import APIHelper from sonic_py_common.logger import Logger except ImportError as e: raise ImportError(repr(e) + " - required module not found") +POLL_INTERVAL_IN_SEC = 1 class SfpEvent: ''' Listen to insert/remove sfp events ''' def __init__(self, sfp_list): - self._api_helper = APIHelper() self._sfp_list = sfp_list self._logger = Logger() + self._sfp_change_event_data = {'present': 0} - sfp_change_event_data = {'valid': 0, 'last': 0, 'present': 0} - def get_sfp_event(self, timeout=2000): - now = time.time() - port_dict = {} - change_dict = {} - change_dict['sfp'] = port_dict - - if timeout < 1000: - timeout = 1000 - timeout = timeout / float(1000) # Convert to secs - - if now < (self.sfp_change_event_data['last'] + timeout) and self.sfp_change_event_data['valid']: - return True, change_dict - + def get_presence_bitmap(self): bitmap = 0 for sfp in self._sfp_list: modpres = sfp.get_presence() i=sfp.port_num-1 if modpres: bitmap = bitmap | (1 << i) + return bitmap - changed_ports = self.sfp_change_event_data['present'] ^ bitmap - if changed_ports: + def get_sfp_event(self, timeout=2000): + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + + if timeout < 1000: + cd_ms = 1000 + else: + cd_ms = timeout + + while cd_ms > 0: + bitmap = self.get_presence_bitmap() + changed_ports = self._sfp_change_event_data['present'] ^ bitmap + if changed_ports != 0: + break + time.sleep(POLL_INTERVAL_IN_SEC) + # timeout=0 means wait for event forever + if timeout != 0: + cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000 + + if changed_ports != 0: for sfp in self._sfp_list: i=sfp.port_num-1 if (changed_ports & (1 << i)): @@ -47,9 +54,7 @@ def get_sfp_event(self, timeout=2000): # Update the cache dict - self.sfp_change_event_data['present'] = bitmap - self.sfp_change_event_data['last'] = now - self.sfp_change_event_data['valid'] = 1 + self._sfp_change_event_data['present'] = bitmap return True, change_dict else: return True, change_dict diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan.py index cf698bf6d014..8cb1c17fdf72 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan.py @@ -15,9 +15,10 @@ raise ImportError(str(e) + "- required module not found") PSU_FAN_MAX_RPM = 26688 -CPLD_I2C_PATH = "/sys/bus/i2c/devices/3-0063/fan" -PSU_HWMON_I2C_PATH ="/sys/bus/i2c/devices/{}-00{}/" -PSU_I2C_MAPPING = { +SPEED_TOLERANCE = 15 +CPLD_FAN_I2C_PATH = "/sys/bus/i2c/devices/3-0063/fan" +I2C_PATH ="/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { 0: { "num": 11, "addr": "58" @@ -28,6 +29,20 @@ }, } + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 11, + "addr": "50" + }, + 1: { + "num": 12, + "addr": "53" + }, +} + + + FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", "FAN-3F", "FAN-3R", "FAN-4F", "FAN-4R", "FAN-5F", "FAN-5R"] @@ -42,13 +57,18 @@ def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): self.is_psu_fan = is_psu_fan if self.is_psu_fan: self.psu_index = psu_index - self.psu_i2c_num = PSU_I2C_MAPPING[self.psu_index]['num'] - self.psu_i2c_addr = PSU_I2C_MAPPING[self.psu_index]['addr'] - self.psu_hwmon_path = PSU_HWMON_I2C_PATH.format( + self.psu_i2c_num = PSU_HWMON_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_HWMON_I2C_MAPPING[self.psu_index]['addr'] + self.psu_hwmon_path = I2C_PATH.format( self.psu_i2c_num, self.psu_i2c_addr) + self.psu_i2c_num = PSU_CPLD_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_CPLD_I2C_MAPPING[self.psu_index]['addr'] + self.psu_cpld_path = I2C_PATH.format( + self.psu_i2c_num, self.psu_i2c_addr) + FanBase.__init__(self) - + def get_direction(self): """ @@ -60,9 +80,9 @@ def get_direction(self): if not self.is_psu_fan: - dir_str = "{}{}{}".format(CPLD_I2C_PATH, self.fan_tray_index+1, '_direction') + dir_str = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_direction') val=self._api_helper.read_txt_file(dir_str) - if val is not None: + if val is not None: if int(val, 10)==0: direction=self.FAN_DIRECTION_EXHAUST else: @@ -90,26 +110,26 @@ def get_speed(self): Returns: An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) - + """ speed = 0 if self.is_psu_fan: psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_speed_rpm') fan_speed_rpm = self._api_helper.read_txt_file(psu_fan_path) if fan_speed_rpm is not None: - speed = (int(fan_speed_rpm,10))*100/26688 + speed = (int(fan_speed_rpm,10))*100/26688 if speed > 100: speed=100 else: return 0 elif self.get_presence(): - speed_path = "{}{}".format(CPLD_I2C_PATH, '_duty_cycle_percentage') + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, '_duty_cycle_percentage') speed=self._api_helper.read_txt_file(speed_path) if speed is None: return 0 return int(speed) - + def get_target_speed(self): """ Retrieves the target (expected) speed of the fan @@ -123,7 +143,7 @@ def get_target_speed(self): 0 : when PWM mode is use pwm : when pwm mode is not use """ - return False #Not supported + return self.get_speed() def get_speed_tolerance(self): """ @@ -132,7 +152,7 @@ def get_speed_tolerance(self): An integer, the percentage of variance from target speed which is considered tolerable """ - return False #Not supported + return SPEED_TOLERANCE def set_speed(self, speed): """ @@ -146,7 +166,7 @@ def set_speed(self, speed): """ if not self.is_psu_fan and self.get_presence(): - speed_path = "{}{}".format(CPLD_I2C_PATH, '_duty_cycle_percentage') + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, '_duty_cycle_percentage') return self._api_helper.write_txt_file(speed_path, int(speed)) return False @@ -195,17 +215,18 @@ def get_presence(self): Returns: bool: True if FAN is present, False if not """ - present_path = "{}{}{}".format(CPLD_I2C_PATH, self.fan_tray_index+1, '_present') + + + if self.is_psu_fan: + present_path="{}{}".format(self.psu_cpld_path, 'psu_present') + else: + present_path = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_present') + val=self._api_helper.read_txt_file(present_path) - - if not self.is_psu_fan: - if val is not None: - return int(val, 10)==1 - else: - return False - + if val is not None: + return int(val, 10)==1 else: - return True + return False def get_status(self): """ @@ -221,7 +242,7 @@ def get_status(self): else: return False else: - path = "{}{}{}".format(CPLD_I2C_PATH, self.fan_index+1, '_fault') + path = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_fault') val=self._api_helper.read_txt_file(path) if val is not None: return int(val, 10)==0 @@ -245,3 +266,25 @@ def get_serial(self): string: Serial number of device """ return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fan_index+1) \ + if not self.is_psu_fan else (self.psu_index+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False + diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan_drawer.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..17d339ee55f6 --- /dev/null +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/fan_drawer.py @@ -0,0 +1,90 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 + + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self._fan_list[0].get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/helper.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/helper.py index 4cd60ac90611..b124ca29f0df 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/helper.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/helper.py @@ -51,7 +51,7 @@ def run_interactive_command(self, cmd): def read_txt_file(self, file_path): try: - with open(file_path, 'r') as fd: + with open(file_path, 'r', errors='replace') as fd: data = fd.read() return data.strip() except IOError: diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/psu.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/psu.py index dd6058920667..c2baa2ebf26a 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/psu.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/psu.py @@ -10,7 +10,7 @@ try: from sonic_platform_base.psu_base import PsuBase - #from sonic_platform.fan import Fan + from sonic_platform.thermal import Thermal from .helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -64,6 +64,8 @@ def __initialize_fan(self): for fan_index in range(0, PSU_NUM_FAN[self.index]): fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) self._fan_list.append(fan) + + self._thermal_list.append(Thermal(is_psu=True, psu_index=self.index)) def get_voltage(self): """ @@ -154,7 +156,7 @@ def get_temperature(self): return float(val)/1000 else: return 0 - + def get_temperature_high_threshold(self): """ Retrieves the high threshold temperature of PSU @@ -251,3 +253,20 @@ def get_serial(self): if serial is None: return "N/A" return serial + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/sfp.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/sfp.py index f8f87532f085..ec16e80568f4 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/sfp.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/sfp.py @@ -13,108 +13,14 @@ from ctypes import create_string_buffer try: - from sonic_platform_base.sfp_base import SfpBase - from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom - from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId - from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom - from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId - #from sonic_platform_base.sonic_sfp.sff8472 import sffbase - from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase from .helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") CPLD_I2C_PATH = "/sys/bus/i2c/devices/" -QSFP_INFO_OFFSET = 128 -QSFP_DOM_OFFSET = 0 - -SFP_INFO_OFFSET = 0 -SFP_DOM_OFFSET = 256 - -XCVR_INTFACE_BULK_OFFSET = 0 -XCVR_INTFACE_BULK_WIDTH_QSFP = 20 -XCVR_INTFACE_BULK_WIDTH_SFP = 21 -XCVR_HW_REV_WIDTH_QSFP = 2 -XCVR_HW_REV_WIDTH_SFP = 4 -XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 -XCVR_VENDOR_NAME_OFFSET = 20 -XCVR_VENDOR_NAME_WIDTH = 16 -XCVR_VENDOR_OUI_OFFSET = 37 -XCVR_VENDOR_OUI_WIDTH = 3 -XCVR_VENDOR_PN_OFFSET = 40 -XCVR_VENDOR_PN_WIDTH = 16 -XCVR_HW_REV_OFFSET = 56 -XCVR_HW_REV_WIDTH_OSFP = 2 -XCVR_HW_REV_WIDTH_SFP = 4 -XCVR_VENDOR_SN_OFFSET = 68 -XCVR_VENDOR_SN_WIDTH = 16 -XCVR_VENDOR_DATE_OFFSET = 84 -XCVR_VENDOR_DATE_WIDTH = 8 -XCVR_DOM_CAPABILITY_OFFSET = 92 -XCVR_DOM_CAPABILITY_WIDTH = 1 - -# Offset for values in QSFP eeprom -QSFP_DOM_REV_OFFSET = 1 -QSFP_DOM_REV_WIDTH = 1 -QSFP_TEMPE_OFFSET = 22 -QSFP_TEMPE_WIDTH = 2 -QSFP_VOLT_OFFSET = 26 -QSFP_VOLT_WIDTH = 2 -QSFP_CHANNL_MON_OFFSET = 34 -QSFP_CHANNL_MON_WIDTH = 16 -QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 -QSFP_CONTROL_OFFSET = 86 -QSFP_CONTROL_WIDTH = 8 -QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 -QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 -QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 -QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 -QSFP_POWEROVERRIDE_OFFSET = 93 -QSFP_POWEROVERRIDE_WIDTH = 1 -QSFP_MODULE_THRESHOLD_OFFSET = 128 -QSFP_MODULE_THRESHOLD_WIDTH = 24 -QSFP_CHANNEL_THRESHOLD_OFFSET = 176 -QSFP_CHANNEL_THRESHOLD_WIDTH = 16 - -qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', - 'Length OM2(m)', 'Length OM1(m)', - 'Length Cable Assembly(m)') - -qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', - 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', - 'Fibre Channel link length/Transmitter Technology', - 'Fibre Channel transmission media', 'Fibre Channel Speed') - - -# Offset for values in SFP eeprom -SFP_TEMPE_OFFSET = 96 -SFP_TEMPE_WIDTH = 2 -SFP_VOLT_OFFSET = 98 -SFP_VOLT_WIDTH = 2 -SFP_CHANNL_MON_OFFSET = 100 -SFP_CHANNL_MON_WIDTH = 6 -SFP_MODULE_THRESHOLD_OFFSET = 0 -SFP_MODULE_THRESHOLD_WIDTH = 40 -SFP_CHANNL_THRESHOLD_OFFSET = 112 -SFP_CHANNL_THRESHOLD_WIDTH = 2 -SFP_STATUS_CONTROL_OFFSET = 110 -SFP_STATUS_CONTROL_WIDTH = 1 -SFP_TX_DISABLE_HARD_BIT = 7 -SFP_TX_DISABLE_SOFT_BIT = 6 - -sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', - 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', - 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') - -sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', - 'ESCONComplianceCodes', 'SONETComplianceCodes', - 'EthernetComplianceCodes', 'FibreChannelLinkLength', - 'FibreChannelTechnology', 'SFP+CableTechnology', - 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') - - -class Sfp(SfpBase): +class Sfp(SfpOptoeBase): """Platform-specific Sfp class""" # Port number @@ -125,7 +31,7 @@ class Sfp(SfpBase): # Path to sysfs PLATFORM_ROOT_PATH = "/usr/share/sonic/device" PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" - HOST_CHK_CMD = "docker > /dev/null 2>&1" + HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" PLATFORM = "x86_64-accton_as5835_54x-r0" HWSKU = "Accton-AS5835-54X" @@ -194,6 +100,7 @@ class Sfp(SfpBase): } def __init__(self, sfp_index=0): + SfpOptoeBase.__init__(self) self._api_helper=APIHelper() # Init index self.index = sfp_index @@ -204,44 +111,15 @@ def __init__(self, sfp_index=0): self.port_to_eeprom_mapping = {} for x in range(self.PORT_START, self.PORT_END + 1): self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) - - self.info_dict_keys = ['type', 'vendor_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', - 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', - 'application_advertisement', 'type_abbrv_name'] - - self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disable_channel', 'temperature', 'voltage', - 'rx1power', 'rx2power', 'rx3power', 'rx4power', 'tx1bias', 'tx2bias', 'tx3bias', 'tx4bias', 'tx1power', 'tx2power', 'tx3power', 'tx4power'] - - self.threshold_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', 'rxpowerhighalarm', 'rxpowerhighwarning', - 'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] - SfpBase.__init__(self) - + def get_eeprom_path(self): + return self.port_to_eeprom_mapping[self.port_num] + # For cage 1~38 are at cpld2, others are at cpld3. def __get_cpld_num(self, port_num): return 1 if (port_num < 39) else 2 - def _convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -277,422 +155,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def get_transceiver_info(self): - """ - Retrieves transceiver info of this SFP - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - type |1*255VCHAR |type of SFP - vendor_rev |1*255VCHAR |vendor revision of SFP - serial |1*255VCHAR |serial number of the SFP - manufacturer |1*255VCHAR |SFP vendor name - model |1*255VCHAR |SFP model name - connector |1*255VCHAR |connector information - encoding |1*255VCHAR |encoding information - ext_identifier |1*255VCHAR |extend identifier - ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance - cable_length |INT |cable length in m - nominal_bit_rate |INT |nominal bit rate by 100Mbs - specification_compliance |1*255VCHAR |specification compliance - vendor_date |1*255VCHAR |vendor date - vendor_oui |1*255VCHAR |vendor OUI - application_advertisement |1*255VCHAR |supported applications advertisement - ======================================================================== - """ - # check present status - if self.port_num < 49: - sfpi_obj = sff8472InterfaceId() #SFP - else: - sfpi_obj = sff8436InterfaceId() #QSFP - if not self.get_presence() or not sfpi_obj: - return {} - - if self.port_num < 49: - offset = SFP_INFO_OFFSET - sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_INTFACE_BULK_OFFSET), XCVR_INTFACE_BULK_WIDTH_SFP) - else: - offset = QSFP_INFO_OFFSET - sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_INTFACE_BULK_OFFSET), XCVR_INTFACE_BULK_WIDTH_QSFP) - - sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( - sfp_interface_bulk_raw, 0) - - sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) - sfp_vendor_name_data = sfpi_obj.parse_vendor_name( - sfp_vendor_name_raw, 0) - - sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( - sfp_vendor_pn_raw, 0) - - if self.port_num < 49: - sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_HW_REV_OFFSET), XCVR_HW_REV_WIDTH_SFP) - else: - sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_HW_REV_OFFSET), XCVR_HW_REV_WIDTH_QSFP) - - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( - sfp_vendor_rev_raw, 0) - - sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( - sfp_vendor_sn_raw, 0) - - sfp_vendor_oui_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) - if sfp_vendor_oui_raw is not None: - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( - sfp_vendor_oui_raw, 0) - - sfp_vendor_date_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) - sfp_vendor_date_data = sfpi_obj.parse_vendor_date( - sfp_vendor_date_raw, 0) - - transceiver_info_dict = dict.fromkeys(self.info_dict_keys, 'N/A') - compliance_code_dict = dict() - - if sfp_interface_bulk_data: - transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] - transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] - transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] - transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - - transceiver_info_dict['manufacturer'] = sfp_vendor_name_data[ - 'data']['Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' - transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' - transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' - transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' - transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ - 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' - transceiver_info_dict['cable_type'] = "Unknown" - transceiver_info_dict['cable_length'] = "Unknown" - - if self.port_num < 49: - for key in sfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - transceiver_info_dict['cable_type'] = key - transceiver_info_dict['cable_length'] = str( - sfp_interface_bulk_data['data'][key]['value']) - - for key in sfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] - - transceiver_info_dict['specification_compliance'] = str( - compliance_code_dict) - transceiver_info_dict['nominal_bit_rate'] = str( - sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) - else: - for key in qsfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - transceiver_info_dict['cable_type'] = key - transceiver_info_dict['cable_length'] = str( - sfp_interface_bulk_data['data'][key]['value']) - - for key in qsfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] - - transceiver_info_dict['specification_compliance'] = str( - compliance_code_dict) - transceiver_info_dict['nominal_bit_rate'] = str( - sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) - - - return transceiver_info_dict - - def get_transceiver_bulk_status(self): - """ - Retrieves transceiver bulk status of this SFP - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. - tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. - reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. - lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. - tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. - tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 - | |to channel 3. - temperature |INT |module temperature in Celsius - voltage |INT |supply voltage in mV - txbias |INT |TX Bias Current in mA, n is the channel number, - | |for example, tx2bias stands for tx bias of channel 2. - rxpower |INT |received optical power in mW, n is the channel number, - | |for example, rx2power stands for rx power of channel 2. - txpower |INT |TX output power in mW, n is the channel number, - | |for example, tx2power stands for tx power of channel 2. - ======================================================================== - """ - # check present status - if self.port_num < 49: #SFP case - sfpd_obj = sff8472Dom() - if not self.get_presence() or not sfpd_obj: - return {} - - eeprom_ifraw = self.__read_eeprom_specific_bytes(0, SFP_DOM_OFFSET) - sfpi_obj = sff8472InterfaceId(eeprom_ifraw) - cal_type = sfpi_obj.get_calibration_type() - sfpd_obj._calibration_type = cal_type - - offset = SFP_DOM_OFFSET - transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') - dom_temperature_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) - - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature( - dom_temperature_raw, 0) - transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - - dom_voltage_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_voltage_data = sfpd_obj.parse_channel_monitor_params( - dom_channel_monitor_raw, 0) - transceiver_dom_info_dict['tx1power'] = dom_voltage_data['data']['TXPower']['value'] - transceiver_dom_info_dict['rx1power'] = dom_voltage_data['data']['RXPower']['value'] - transceiver_dom_info_dict['tx1bias'] = dom_voltage_data['data']['TXBias']['value'] - - else: #QSFP case - sfpd_obj = sff8436Dom() - sfpi_obj = sff8436InterfaceId() - - if not self.get_presence() or not sfpi_obj or not sfpd_obj: - return {} - - transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') - offset = QSFP_DOM_OFFSET - offset_xcvr = QSFP_INFO_OFFSET - - # QSFP capability byte parse, through this byte can know whether it support tx_power or not. - # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, - # need to add more code for determining the capability and version compliance - # in SFF-8636 dom capability definitions evolving with the versions. - qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( - (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) - if qsfp_dom_capability_raw is not None: - qspf_dom_capability_data = sfpi_obj.parse_dom_capability( - qsfp_dom_capability_raw, 0) - else: - return None - - dom_temperature_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature( - dom_temperature_raw, 0) - transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - - dom_voltage_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - - qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) - if qsfp_dom_rev_raw is not None: - qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) - qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] - - # The tx_power monitoring is only available on QSFP which compliant with SFF-8636 - # and claimed that it support tx_power with one indicator bit. - dom_channel_monitor_data = {} - dom_channel_monitor_raw = None - qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] - if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( - dom_channel_monitor_raw, 0) - - else: - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( - dom_channel_monitor_raw, 0) - transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] - transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] - transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] - transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] - - if dom_channel_monitor_raw: - transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] - transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] - transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] - transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] - transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] - transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] - transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] - transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] - #End of else - - - for key in transceiver_dom_info_dict: - transceiver_dom_info_dict[key] = self._convert_string_to_num( - transceiver_dom_info_dict[key]) - - transceiver_dom_info_dict['rx_los'] = self.get_rx_los() - transceiver_dom_info_dict['tx_fault'] = self.get_tx_fault() - transceiver_dom_info_dict['reset_status'] = self.get_reset_status() - transceiver_dom_info_dict['lp_mode'] = self.get_lpmode() - - return transceiver_dom_info_dict - - def get_transceiver_threshold_info(self): - """ - Retrieves transceiver threshold info of this SFP - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. - templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. - temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. - templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. - vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. - vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. - vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. - vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. - rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. - rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. - rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. - rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. - txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. - txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. - txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. - txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. - txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. - txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. - txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. - txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. - ======================================================================== - """ - # check present status - if self.port_num < 49: - sfpd_obj = sff8472Dom() - - if not self.get_presence() and not sfpd_obj: - return {} - - eeprom_ifraw = self.__read_eeprom_specific_bytes(0, SFP_DOM_OFFSET) - sfpi_obj = sff8472InterfaceId(eeprom_ifraw) - cal_type = sfpi_obj.get_calibration_type() - sfpd_obj._calibration_type = cal_type - - offset = SFP_DOM_OFFSET - transceiver_dom_threshold_info_dict = dict.fromkeys( - self.threshold_dict_keys, 'N/A') - dom_module_threshold_raw = self.__read_eeprom_specific_bytes( - (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is not None: - dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( - dom_module_threshold_raw, 0) - - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data[ - 'data']['VoltageHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] - - for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num( - transceiver_dom_threshold_info_dict[key]) - - return transceiver_dom_threshold_info_dict - - - else: - sfpd_obj = sff8436Dom() - - if not self.get_presence() or not sfpd_obj: - return {} - - transceiver_dom_threshold_dict = dict.fromkeys( - self.threshold_dict_keys, 'N/A') - dom_thres_raw = self.__read_eeprom_specific_bytes( - QSFP_MODULE_THRESHOLD_OFFSET, QSFP_MODULE_THRESHOLD_WIDTH) if self.get_presence() and sfpd_obj else None - - if dom_thres_raw: - module_threshold_values = sfpd_obj.parse_module_threshold_values( - dom_thres_raw, 0) - module_threshold_data = module_threshold_values.get('data') - if module_threshold_data: - transceiver_dom_threshold_dict['temphighalarm'] = module_threshold_data['TempHighAlarm']['value'] - transceiver_dom_threshold_dict['templowalarm'] = module_threshold_data['TempLowAlarm']['value'] - transceiver_dom_threshold_dict['temphighwarning'] = module_threshold_data['TempHighWarning']['value'] - transceiver_dom_threshold_dict['templowwarning'] = module_threshold_data['TempLowWarning']['value'] - transceiver_dom_threshold_dict['vcchighalarm'] = module_threshold_data['VccHighAlarm']['value'] - transceiver_dom_threshold_dict['vcclowalarm'] = module_threshold_data['VccLowAlarm']['value'] - transceiver_dom_threshold_dict['vcchighwarning'] = module_threshold_data['VccHighWarning']['value'] - transceiver_dom_threshold_dict['vcclowwarning'] = module_threshold_data['VccLowWarning']['value'] - - dom_thres_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNEL_THRESHOLD_OFFSET, QSFP_CHANNEL_THRESHOLD_WIDTH) if self.get_presence() and sfpd_obj else None - channel_threshold_values = sfpd_obj.parse_channel_threshold_values( - dom_thres_raw, 0) - channel_threshold_data = channel_threshold_values.get('data') - if channel_threshold_data: - transceiver_dom_threshold_dict['rxpowerhighalarm'] = channel_threshold_data['RxPowerHighAlarm']['value'] - transceiver_dom_threshold_dict['rxpowerlowalarm'] = channel_threshold_data['RxPowerLowAlarm']['value'] - transceiver_dom_threshold_dict['rxpowerhighwarning'] = channel_threshold_data['RxPowerHighWarning']['value'] - transceiver_dom_threshold_dict['rxpowerlowwarning'] = channel_threshold_data['RxPowerLowWarning']['value'] - transceiver_dom_threshold_dict['txpowerhighalarm'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerlowalarm'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerhighwarning'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerlowwarning'] = "0.0dBm" - transceiver_dom_threshold_dict['txbiashighalarm'] = channel_threshold_data['TxBiasHighAlarm']['value'] - transceiver_dom_threshold_dict['txbiaslowalarm'] = channel_threshold_data['TxBiasLowAlarm']['value'] - transceiver_dom_threshold_dict['txbiashighwarning'] = channel_threshold_data['TxBiasHighWarning']['value'] - transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] - - for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self._convert_string_to_num( - transceiver_dom_threshold_dict[key]) - - return transceiver_dom_threshold_dict - def get_reset_status(self): """ Retrieves the reset status of SFP @@ -725,8 +187,10 @@ def get_rx_los(self): rx_path = "{}{}{}{}".format(CPLD_I2C_PATH, cpld_path, '/module_rx_los_', self.port_num) rx_los=self._api_helper.read_txt_file(rx_path) - if rx_los is None: - return False + if int(rx_los, 10) == 1: + return [True] + else: + return [False] #status_control_raw = self.__read_eeprom_specific_bytes( # SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) #if status_control_raw: @@ -743,15 +207,18 @@ def get_rx_los(self): rx_los_list.append(rx_los_data & 0x02 != 0) rx_los_list.append(rx_los_data & 0x04 != 0) rx_los_list.append(rx_los_data & 0x08 != 0) - rx_los = rx_los_list[0] and rx_los_list[1] and rx_los_list[2] and rx_los_list[3] - - return rx_los + return rx_los_list + else: + return [False]*4 def get_tx_fault(self): """ Retrieves the TX fault status of SFP Returns: - A Boolean, True if SFP has TX fault, False if not + A list of boolean values, representing the TX fault status + of each available channel, value is True if SFP channel + has TX fault, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] Note : TX fault status is lached until a call to get_tx_fault or a reset. """ tx_fault = False @@ -761,8 +228,10 @@ def get_tx_fault(self): tx_path = "{}{}{}{}".format(CPLD_I2C_PATH, cpld_path, '/module_tx_fault_', self.port_num) tx_fault=self._api_helper.read_txt_file(tx_path) - if tx_fault is None: - return False + if int(tx_fault, 10) == 1: + return [True] + else: + return [False] #status_control_raw = self.__read_eeprom_specific_bytes( # SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) #if status_control_raw: @@ -778,15 +247,19 @@ def get_tx_fault(self): tx_fault_list.append(tx_fault_data & 0x02 != 0) tx_fault_list.append(tx_fault_data & 0x04 != 0) tx_fault_list.append(tx_fault_data & 0x08 != 0) - tx_fault = tx_fault_list[0] and tx_fault_list[1] and tx_fault_list[2] and tx_fault_list[3] + return tx_fault_list + else: + return [False]*4 - return tx_fault def get_tx_disable(self): """ Retrieves the tx_disable status of this SFP Returns: - A Boolean, True if tx_disable is enabled, False if disabled + A list of boolean values, representing the TX disable status + of each available channel, value is True if SFP channel + is TX disabled, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] """ if self.port_num < 49: tx_disable = False @@ -806,10 +279,11 @@ def get_tx_disable(self): # tx_disable_soft = (sffbase().test_bit( # data, SFP_TX_DISABLE_SOFT_BIT) != 0) # tx_disable = tx_disable_hard | tx_disable_soft - if tx_disable is not None: - return tx_disable + if int(tx_disable, 10)==0: + return [False] else: - return False + return [True] + else: tx_disable_list = [] @@ -829,8 +303,9 @@ def get_tx_disable(self): 'On' == dom_control_data['data']['TX3Disable']['value']) tx_disable_list.append( 'On' == dom_control_data['data']['TX4Disable']['value']) - - return tx_disable_list + return tx_disable_list + else: + return [False]*4 def get_tx_disable_channel(self): """ @@ -841,18 +316,14 @@ def get_tx_disable_channel(self): As an example, a returned value of 0x5 indicates that channel 0 and channel 2 have been disabled. """ - if self.port_num < 49: - # SFP doesn't support this feature - return False - else: - tx_disable_list = self.get_tx_disable() - if tx_disable_list is None: - return 0 - tx_disabled = 0 - for i in range(len(tx_disable_list)): - if tx_disable_list[i]: - tx_disabled |= 1 << i - return tx_disabled + tx_disable_list = self.get_tx_disable() + if tx_disable_list is None: + return 0 + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled def get_lpmode(self): """ @@ -915,78 +386,6 @@ def get_power_override(self): return power_override - def get_temperature(self): - """ - Retrieves the temperature of this SFP - Returns: - An integer number of current temperature in Celsius - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - return transceiver_dom_info_dict.get("temperature", "N/A") - - def get_voltage(self): - """ - Retrieves the supply voltage of this SFP - Returns: - An integer number of supply voltage in mV - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - return transceiver_dom_info_dict.get("voltage", "N/A") - - def get_tx_bias(self): - """ - Retrieves the TX bias current of this SFP - Returns: - A list of four integer numbers, representing TX bias in mA - for channel 0 to channel 4. - Ex. ['110.09', '111.12', '108.21', '112.09'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - - tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") - if self.port_num < 49: - return [tx1_bs, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] - - tx2_bs = transceiver_dom_info_dict.get("tx2bias", "N/A") - tx3_bs = transceiver_dom_info_dict.get("tx3bias", "N/A") - tx4_bs = transceiver_dom_info_dict.get("tx4bias", "N/A") - return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] if transceiver_dom_info_dict else [] - - def get_rx_power(self): - """ - Retrieves the received optical power for this SFP - Returns: - A list of four integer numbers, representing received optical - power in mW for channel 0 to channel 4. - Ex. ['1.77', '1.71', '1.68', '1.70'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - - rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") - if self.port_num < 49: - return [rx1_pw, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] - rx2_pw = transceiver_dom_info_dict.get("rx2power", "N/A") - rx3_pw = transceiver_dom_info_dict.get("rx3power", "N/A") - rx4_pw = transceiver_dom_info_dict.get("rx4power", "N/A") - return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] if transceiver_dom_info_dict else [] - - def get_tx_power(self): - """ - Retrieves the TX power of this SFP - Returns: - A list of four integer numbers, representing TX power in mW - for channel 0 to channel 4. - Ex. ['1.86', '1.86', '1.86', '1.86'] - """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") - if self.port_num < 49: - return [tx1_pw, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] - tx2_pw = transceiver_dom_info_dict.get("tx2power", "N/A") - tx3_pw = transceiver_dom_info_dict.get("tx3power", "N/A") - tx4_pw = transceiver_dom_info_dict.get("tx4power", "N/A") - return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] - def reset(self): """ Reset SFP and return all user module settings to their default srate. @@ -1000,15 +399,15 @@ def reset(self): cpld_path = self._cpld_mapping[cpld_i] reset_path = "{}{}{}{}".format(CPLD_I2C_PATH, cpld_path, '/module_reset_', self.port_num) ret = self._api_helper.write_txt_file(reset_path, 1) - + if ret is not True: - time.sleep(0.01) - ret = self.self._api_helper.write_txt_file(reset_path, 0) - time.sleep(0.2) return ret - else: - return False + time.sleep(0.01) + ret = self._api_helper.write_txt_file(reset_path, 0) + time.sleep(0.2) + + return ret def tx_disable(self, tx_disable): """ @@ -1120,7 +519,7 @@ def set_lpmode(self, lpmode): if self.port_num < 49: return False # SFP doesn't support this feature else: - if lpmode is True: + if lpmode: self.set_power_override(True, True) else: self.set_power_override(False, False) @@ -1195,28 +594,27 @@ def get_presence(self): else: return False - def get_model(self): + def get_status(self): """ - Retrieves the model number (or part number) of the device + Retrieves the operational status of the device Returns: - string: Model/part number of device + A boolean value, True if device is operating properly, False if not """ - transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("model", "N/A") + return self.get_presence() - def get_serial(self): + def get_position_in_parent(self): """ - Retrieves the serial number of the device + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned Returns: - string: Serial number of device + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position """ - transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("serial", "N/A") + return self.port_num - def get_status(self): + def is_replaceable(self): """ - Retrieves the operational status of the device + Indicate whether this device is replaceable. Returns: - A boolean value, True if device is operating properly, False if not + bool: True if it is replaceable. """ - return self.get_presence() and self.get_transceiver_bulk_status() + return True diff --git a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/thermal.py b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/thermal.py index 46458d02a118..4d06ad170cba 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/thermal.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/sonic_platform/thermal.py @@ -15,22 +15,53 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +PSU_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 11, + "addr": "58" + }, + 1: { + "num": 12, + "addr": "5b" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 11, + "addr": "50" + }, + 1: { + "num": 12, + "addr": "53" + }, +} + +THERMAL_NAME_LIST = ["Temp sensor 1", "Temp sensor 2", + "Temp sensor 3", "Temp sensor 4"] + +PSU_THERMAL_NAME_LIST = ["PSU-1 temp sensor 1", "PSU-2 temp sensor 2"] + +SYSFS_PATH = "/sys/bus/i2c/devices" class Thermal(ThermalBase): """Platform-specific Thermal class""" - THERMAL_NAME_LIST = [] - SYSFS_PATH = "/sys/bus/i2c/devices" - - def __init__(self, thermal_index=0): + def __init__(self, thermal_index=0, is_psu=False, psu_index=0): self.index = thermal_index - - # Add thermal name - self.THERMAL_NAME_LIST.append("Temp sensor 1") - self.THERMAL_NAME_LIST.append("Temp sensor 2") - self.THERMAL_NAME_LIST.append("Temp sensor 3") - self.THERMAL_NAME_LIST.append("Temp sensor 4") - + self.is_psu = is_psu + self.psu_index = psu_index + + if self.is_psu: + psu_i2c_bus = PSU_HWMON_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_HWMON_I2C_MAPPING[psu_index]["addr"] + self.psu_hwmon_path = PSU_I2C_PATH.format(psu_i2c_bus, + psu_i2c_addr) + psu_i2c_bus = PSU_CPLD_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_CPLD_I2C_MAPPING[psu_index]["addr"] + self.cpld_path = PSU_I2C_PATH.format(psu_i2c_bus, psu_i2c_addr) + # Set hwmon path i2c_path = { 0: "18-004b/hwmon/hwmon*/", @@ -38,9 +69,9 @@ def __init__(self, thermal_index=0): 2: "20-0049/hwmon/hwmon*/", 3: "21-004a/hwmon/hwmon*/" }.get(self.index, None) - - self.hwmon_path = "{}/{}".format(self.SYSFS_PATH, i2c_path) - self.ss_key = self.THERMAL_NAME_LIST[self.index] + + self.hwmon_path = "{}/{}".format(SYSFS_PATH, i2c_path) + self.ss_key = THERMAL_NAME_LIST[self.index] self.ss_index = 1 def __read_txt_file(self, file_path): @@ -51,20 +82,23 @@ def __read_txt_file(self, file_path): return data except IOError as e: pass - + return None - def __get_temp(self, temp_file): - temp_file_path = os.path.join(self.hwmon_path, temp_file) + if not self.is_psu: + temp_file_path = os.path.join(self.hwmon_path, temp_file) + else: + temp_file_path = temp_file raw_temp = self.__read_txt_file(temp_file_path) if raw_temp is not None: return float(raw_temp)/1000 else: - return 0 - + return 0 def __set_threshold(self, file_name, temperature): + if self.is_psu: + return True temp_file_path = os.path.join(self.hwmon_path, file_name) for filename in glob.glob(temp_file_path): try: @@ -73,6 +107,8 @@ def __set_threshold(self, file_name, temperature): return True except IOError as e: print("IOError") + return False + def get_temperature(self): @@ -82,7 +118,11 @@ def get_temperature(self): A float number of current temperature in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - temp_file = "temp{}_input".format(self.ss_index) + if not self.is_psu: + temp_file = "temp{}_input".format(self.ss_index) + else: + temp_file = self.psu_hwmon_path + "psu_temp1_input" + return self.__get_temp(temp_file) def get_high_threshold(self): @@ -92,6 +132,9 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ + if self.is_psu: + return 80 + temp_file = "temp{}_max".format(self.ss_index) return self.__get_temp(temp_file) @@ -116,7 +159,10 @@ def get_name(self): Returns: string: The name of the thermal device """ - return self.THERMAL_NAME_LIST[self.index] + if self.is_psu: + return PSU_THERMAL_NAME_LIST[self.psu_index] + else: + return THERMAL_NAME_LIST[self.index] def get_presence(self): """ @@ -124,6 +170,9 @@ def get_presence(self): Returns: bool: True if Thermal is present, False if not """ + if self.is_psu: + val = self.__read_txt_file(self.cpld_path + "psu_present") + return int(val, 10) == 1 temp_file = "temp{}_input".format(self.ss_index) temp_file_path = os.path.join(self.hwmon_path, temp_file) raw_txt = self.__read_txt_file(temp_file_path) @@ -138,11 +187,49 @@ def get_status(self): Returns: A boolean value, True if device is operating properly, False if not """ + if self.is_psu: + temp_file = self.psu_hwmon_path + "psu_temp_fault" + return self.get_presence() and (not int( + self.__read_txt_file(temp_file))) file_str = "temp{}_input".format(self.ss_index) file_path = os.path.join(self.hwmon_path, file_str) raw_txt = self.__read_txt_file(file_path) if raw_txt is None: return False - else: + else: return int(raw_txt) != 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False diff --git a/device/accton/x86_64-accton_as5835_54x-r0/system_health_monitoring_config.json b/device/accton/x86_64-accton_as5835_54x-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..5f3b3b07e73f --- /dev/null +++ b/device/accton/x86_64-accton_as5835_54x-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu.temperature" + + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "STATUS_LED_COLOR_AMBER", + "normal": "STATUS_LED_COLOR_GREEN", + "booting": "STATUS_LED_COLOR_GREEN" + } +} diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json deleted file mode 100644 index 317cf23b7362..000000000000 --- a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - - "XCVR": - { - "xcvr_present": - { - "i2c": - { - "valmap-SFP": {"1":true, "0":false }, - "valmap-SFP28": {"1":true, "0":false }, - "valmap-QSFP28": {"1":true, "0":false} - } - } - }, - "PSU": - { - "psu_present": - { - "i2c": - { - "valmap": { "1":true, "0":false } - } - }, - - "psu_power_good": - { - "i2c": - { - "valmap": { "1": true, "0":false } - } - }, - - "psu_fan_dir": - { - "i2c": - { - "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } - } - }, - - "PSU_FAN_MAX_SPEED":"18000" - }, - - "FAN": - { - "direction": - { - "i2c": - { - "valmap": {"1":"INTAKE", "0":"EXHAUST"} - } - }, - - "present": - { - "i2c": - { - "valmap": {"1":true, "0":false} - } - }, - - "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 -1)", - - "pwm_to_duty_cycle": "lambda pwm: (((pwm+1)*625+75)/100)" - } - -} diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json deleted file mode 100644 index 78be7f2b61c9..000000000000 --- a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json +++ /dev/null @@ -1,2916 +0,0 @@ -{ - "PLATFORM": - { - "num_psus":2, - "num_fantrays":6, - "num_fans_pertray":2, - "num_ports":58, - "num_temps": 4, - "pddf_dev_types": - { - "description":"AS7326-56X - Below is the list of supported PDDF device types (chip names) for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", - "CPLD": - [ - "i2c_cpld" - ], - "PSU": - [ - "psu_eeprom", - "psu_pmbus" - ], - "FAN": - [ - "fan_ctrl", - "fan_eeprom" - ], - "PORT_MODULE": - [ - "pddf_xcvr" - ] - }, - "std_kos": - [ - "i2c-i801", - "i2c_dev", - "i2c_mux_pca954x", - "optoe" - ], - "pddf_kos": - [ - "pddf_client_module", - "pddf_cpld_module", - "pddf_cpld_driver", - "pddf_mux_module", - "pddf_xcvr_module", - "pddf_xcvr_driver_module", - "pddf_psu_driver_module", - "pddf_psu_module", - "pddf_fan_driver_module", - "pddf_fan_module", - "pddf_led_module", - "pddf_sysstatus_module" - ] - }, - - "SYSTEM": - { - "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, - "i2c": - { - "CONTROLLERS": - [ - { "dev_name":"i2c-0", "dev":"SMBUS0" } - ] - } - }, - - "SMBUS0": - { - "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, - "i2c": - { - "topo_info": {"dev_addr": "0x0"}, - "DEVICES": - [ - {"dev": "EEPROM1"}, - {"dev": "CPU_CPLD"}, - {"dev": "MUX1"} - ] - } - }, - - "EEPROM1": - { - "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, - "i2c": - { - "topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c04"}, - "dev_attr": {"access_mode": "BLOCK"}, - "attr_list": [ - {"attr_name": "eeprom"} - ] - } - }, - - "CPU_CPLD": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPU_CPLD", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x65", "dev_type":"i2c_cpld"}, - "dev_attr": { } - } - }, - - "MUX1": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x1"}, - "channel": - [ - { "chn":"0", "dev":"MUX2" }, - { "chn":"0", "dev":"MUX3" }, - { "chn":"1", "dev":"MUX4" } - - ] - } - }, - "MUX2": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1", "dev_addr":"0x70", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x9"}, - "channel": - [ - { "chn":"2", "dev":"FAN-CTRL" }, - { "chn":"3", "dev":"CPLD2" }, - { "chn":"4", "dev":"PSU2" } , - { "chn":"6", "dev":"TEMP1" }, - { "chn":"6", "dev":"TEMP2" }, - { "chn":"6", "dev":"TEMP3" }, - { "chn":"6", "dev":"TEMP4" } - ] - } - }, - "MUX3": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x11"}, - "channel": - [ - { "chn":"0", "dev":"PSU1" }, - { "chn":"1", "dev":"CPLD1" }, - { "chn":"2", "dev":"CPLD3" }, - { "chn":"5", "dev":"PORT57" }, - { "chn":"6", "dev":"PORT58" }, - { "chn":"7", "dev":"MUX11" } - ] - } - }, - "MUX4": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2", "dev_addr":"0x70", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x21"}, - "channel": - [ - { "chn":"0", "dev":"MUX5" }, - { "chn":"1", "dev":"MUX6" }, - { "chn":"2", "dev":"MUX7" }, - { "chn":"3", "dev":"MUX8" }, - { "chn":"4", "dev":"MUX9" }, - { "chn":"5", "dev":"MUX10" } - ] - } - }, - "PSU2": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" }, - "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU2-PMBUS"} - ] - } - }, - - "PSU2-PMBUS": - { - "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xd", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "PSU1": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX3" }, - "dev_attr": { "dev_idx":"1", "num_psu_fans":"1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU1-PMBUS"} - ] - } - }, - - "PSU1-PMBUS": - { - "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX3", "virt_parent":"PSU1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x59", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_temp1_input", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "CPLD1": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX3"}, - "i2c": - { - "topo_info": { "parent_bus":"0x12", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, - "dev_attr":{} - } - }, - "CPLD2": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPLD2", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xc", "dev_addr":"0x62", "dev_type":"i2c_cpld"}, - "dev_attr":{} - } - }, - "CPLD3": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPLD3", "device_parent":"MUX3"}, - "i2c": - { - "topo_info": { "parent_bus":"0x13", "dev_addr":"0x64", "dev_type":"i2c_cpld"}, - "dev_attr":{} - } - }, - "TEMP1" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xf", "dev_addr":"0x48", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - "TEMP2" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xf", "dev_addr":"0x49", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - "TEMP3" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4A", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - "TEMP4" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4B", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - "FAN-CTRL": - { - "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0xb", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, - "dev_attr": { "num_fantrays":"5"}, - "attr_list": - [ - { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan7_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan8_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan9_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan10_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan11_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan12_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"fan7_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"fan8_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"fan9_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"fan10_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"fan11_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"fan12_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"fan1_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan2_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan3_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan4_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan5_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan6_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan7_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan8_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan9_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan10_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan11_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan12_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan7_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan8_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan9_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan10_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan11_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, - { "attr_name":"fan12_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" } - ] - } - }, - "PORT57": - { - "dev_info": { "device_type":"SFP", "device_name":"PORT57", "device_parent":"MUX3"}, - "dev_attr": { "dev_idx":"57"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT57-EEPROM" }, - { "itf":"control", "dev":"PORT57-CTRL" } - ] - } - }, - "PORT57-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT57-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT57"}, - "i2c": - { - "topo_info": { "parent_bus":"0x16", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT57-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT57-CTRL", "device_parent":"MUX3", "virt_parent":"PORT57"}, - "i2c": - { - "topo_info": { "parent_bus":"0x16", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1c", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - "PORT58": - { - "dev_info": { "device_type":"SFP", "device_name":"PORT58", "device_parent":"MUX3"}, - "dev_attr": { "dev_idx":"58"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT58-EEPROM" }, - { "itf":"control", "dev":"PORT58-CTRL" } - ] - } - }, - "PORT58-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT58-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT58"}, - "i2c": - { - "topo_info": { "parent_bus":"0x17", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT58-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT58-CTRL", "device_parent":"MUX3", "virt_parent":"PORT58"}, - "i2c": - { - "topo_info": { "parent_bus":"0x17", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1c", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - "MUX5": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x21", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x29"}, - "channel": - [ - { "chn":"0", "dev":"PORT2" }, - { "chn":"1", "dev":"PORT1" }, - { "chn":"2", "dev":"PORT4" }, - { "chn":"3", "dev":"PORT3" }, - { "chn":"4", "dev":"PORT6" }, - { "chn":"5", "dev":"PORT7" }, - { "chn":"6", "dev":"PORT5" }, - { "chn":"7", "dev":"PORT9" } - ] - } - }, - "MUX6": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x22", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x31"}, - "channel": - [ - { "chn":"0", "dev":"PORT10" }, - { "chn":"1", "dev":"PORT8" }, - { "chn":"2", "dev":"PORT12" }, - { "chn":"3", "dev":"PORT11" }, - { "chn":"4", "dev":"PORT13" }, - { "chn":"5", "dev":"PORT16" }, - { "chn":"6", "dev":"PORT15" }, - { "chn":"7", "dev":"PORT14" } - ] - } - }, - "MUX7": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x23", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x39"}, - "channel": - [ - { "chn":"0", "dev":"PORT18" }, - { "chn":"1", "dev":"PORT17" }, - { "chn":"2", "dev":"PORT20" }, - { "chn":"3", "dev":"PORT19" }, - { "chn":"4", "dev":"PORT21" }, - { "chn":"5", "dev":"PORT23" }, - { "chn":"6", "dev":"PORT22" }, - { "chn":"7", "dev":"PORT24" } - ] - } - }, - "MUX8": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX8", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x24", "dev_addr":"0x74", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x41"}, - "channel": - [ - { "chn":"0", "dev":"PORT27" }, - { "chn":"1", "dev":"PORT25" }, - { "chn":"2", "dev":"PORT28" }, - { "chn":"3", "dev":"PORT26" }, - { "chn":"4", "dev":"PORT29" }, - { "chn":"5", "dev":"PORT32" }, - { "chn":"6", "dev":"PORT30" }, - { "chn":"7", "dev":"PORT31" } - ] - } - }, - "MUX9": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX9", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x25", "dev_addr":"0x75", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x49"}, - "channel": - [ - { "chn":"0", "dev":"PORT34" }, - { "chn":"1", "dev":"PORT33" }, - { "chn":"2", "dev":"PORT36" }, - { "chn":"3", "dev":"PORT35" }, - { "chn":"4", "dev":"PORT37" }, - { "chn":"5", "dev":"PORT39" }, - { "chn":"6", "dev":"PORT38" }, - { "chn":"7", "dev":"PORT40" } - ] - } - }, - "MUX10": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX10", "device_parent":"MUX4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x26", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x51"}, - "channel": - [ - { "chn":"0", "dev":"PORT41" }, - { "chn":"1", "dev":"PORT42" }, - { "chn":"2", "dev":"PORT45" }, - { "chn":"3", "dev":"PORT43" }, - { "chn":"4", "dev":"PORT44" }, - { "chn":"5", "dev":"PORT48" }, - { "chn":"6", "dev":"PORT46" }, - { "chn":"7", "dev":"PORT47" } - ] - } - }, - "MUX11": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX11", "device_parent":"MUX3"}, - "i2c": - { - "topo_info": { "parent_bus":"0x18", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x19"}, - "channel": - [ - { "chn":"0", "dev":"PORT49" }, - { "chn":"1", "dev":"PORT50" }, - { "chn":"2", "dev":"PORT51" }, - { "chn":"3", "dev":"PORT52" }, - { "chn":"4", "dev":"PORT53" }, - { "chn":"5", "dev":"PORT54" }, - { "chn":"6", "dev":"PORT55" }, - { "chn":"7", "dev":"PORT56" } - ] - } - }, - - - - "PORT2": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT2", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"2"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT2-EEPROM" }, - { "itf":"control", "dev":"PORT2-CTRL" } - ] - } - }, - "PORT2-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT2-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT2"}, - "i2c": - { - "topo_info": { "parent_bus":"0x29", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT2-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT2-CTRL", "device_parent":"MUX5", "virt_parent":"PORT2"}, - "i2c": - { - "topo_info": { "parent_bus":"0x29", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xb", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT1": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT1", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"1"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT1-EEPROM" }, - { "itf":"control", "dev":"PORT1-CTRL" } - ] - } - }, - "PORT1-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT1-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2a", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT1-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT1-CTRL", "device_parent":"MUX5", "virt_parent":"PORT1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xb", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - "PORT4": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT4", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"4"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT4-EEPROM" }, - { "itf":"control", "dev":"PORT4-CTRL" } - ] - } - }, - "PORT4-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT4-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2b", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT4-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT4-CTRL", "device_parent":"MUX5", "virt_parent":"PORT4"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - "PORT3": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT3", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"3"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT3-EEPROM" }, - { "itf":"control", "dev":"PORT3-CTRL" } - ] - } - }, - "PORT3-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT3-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT3"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2c", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT3-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT3-CTRL", "device_parent":"MUX5", "virt_parent":"PORT3"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - "PORT6": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT6", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"6"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT6-EEPROM" }, - { "itf":"control", "dev":"PORT6-CTRL" } - ] - } - }, - "PORT6-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT6-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT6"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2d", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT6-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT6-CTRL", "device_parent":"MUX5", "virt_parent":"PORT6"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - "PORT7": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT7", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"7"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT7-EEPROM" }, - { "itf":"control", "dev":"PORT7-CTRL" } - ] - } - }, - "PORT7-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT7-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2e", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT7-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT7-CTRL", "device_parent":"MUX5", "virt_parent":"PORT7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} - ] - } - }, - "PORT5": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT5", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"5"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT5-EEPROM" }, - { "itf":"control", "dev":"PORT5-CTRL" } - ] - } - }, - "PORT5-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT5-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT5"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2f", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT5-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT5-CTRL", "device_parent":"MUX5", "virt_parent":"PORT5"}, - "i2c": - { - "topo_info": { "parent_bus":"0x2f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_offset":"0xB", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - "PORT9": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT9", "device_parent":"MUX5"}, - "dev_attr": { "dev_idx":"9"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT9-EEPROM" }, - { "itf":"control", "dev":"PORT9-CTRL" } - ] - } - }, - "PORT9-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT9-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT9"}, - "i2c": - { - "topo_info": { "parent_bus":"0x30", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT9-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT9-CTRL", "device_parent":"MUX5", "virt_parent":"PORT9"}, - "i2c": - { - "topo_info": { "parent_bus":"0x30", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_offset":"0xC", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - "PORT10": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT10", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"10"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT10-EEPROM" }, - { "itf":"control", "dev":"PORT10-CTRL" } - ] - } - }, - "PORT10-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT10-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT10"}, - "i2c": - { - "topo_info": { "parent_bus":"0x31", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT10-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT10-CTRL", "device_parent":"MUX6", "virt_parent":"PORT10"}, - "i2c": - { - "topo_info": { "parent_bus":"0x31", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT8": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT8", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"8"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT8-EEPROM" }, - { "itf":"control", "dev":"PORT8-CTRL" } - ] - } - }, - "PORT8-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT8-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT8"}, - "i2c": - { - "topo_info": { "parent_bus":"0x32", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT8-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT8-CTRL", "device_parent":"MUX6", "virt_parent":"PORT8"}, - "i2c": - { - "topo_info": { "parent_bus":"0x32", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} - ] - } - }, - "PORT12": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT12", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"12"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT12-EEPROM" }, - { "itf":"control", "dev":"PORT12-CTRL" } - ] - } - }, - "PORT12-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT12-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT12"}, - "i2c": - { - "topo_info": { "parent_bus":"0x33", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT12-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT12-CTRL", "device_parent":"MUX6", "virt_parent":"PORT12"}, - "i2c": - { - "topo_info": { "parent_bus":"0x33", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - "PORT11": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT11", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"11"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT11-EEPROM" }, - { "itf":"control", "dev":"PORT11-CTRL" } - ] - } - }, - "PORT11-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT11-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT11"}, - "i2c": - { - "topo_info": { "parent_bus":"0x34", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT11-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT11-CTRL", "device_parent":"MUX6", "virt_parent":"PORT11"}, - "i2c": - { - "topo_info": { "parent_bus":"0x34", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - "PORT13": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT13", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"13"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT13-EEPROM" }, - { "itf":"control", "dev":"PORT13-CTRL" } - ] - } - }, - "PORT13-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT13-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT13"}, - "i2c": - { - "topo_info": { "parent_bus":"0x35", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT13-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT13-CTRL", "device_parent":"MUX6", "virt_parent":"PORT13"}, - "i2c": - { - "topo_info": { "parent_bus":"0x35", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - "PORT16": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT16", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"16"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT16-EEPROM" }, - { "itf":"control", "dev":"PORT16-CTRL" } - ] - } - }, - "PORT16-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT16-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT16"}, - "i2c": - { - "topo_info": { "parent_bus":"0x36", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT16-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT16-CTRL", "device_parent":"MUX6", "virt_parent":"PORT16"}, - "i2c": - { - "topo_info": { "parent_bus":"0x36", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} - ] - } - }, - "PORT15": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT15", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"15"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT15-EEPROM" }, - { "itf":"control", "dev":"PORT15-CTRL" } - ] - } - }, - "PORT15-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT15-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT15"}, - "i2c": - { - "topo_info": { "parent_bus":"0x37", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT15-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT15-CTRL", "device_parent":"MUX6", "virt_parent":"PORT15"}, - "i2c": - { - "topo_info": { "parent_bus":"0x37", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} - ] - } - }, - "PORT14": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT14", "device_parent":"MUX6"}, - "dev_attr": { "dev_idx":"14"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT14-EEPROM" }, - { "itf":"control", "dev":"PORT14-CTRL" } - ] - } - }, - "PORT14-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT14-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT14"}, - "i2c": - { - "topo_info": { "parent_bus":"0x38", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT14-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT14-CTRL", "device_parent":"MUX6", "virt_parent":"PORT14"}, - "i2c": - { - "topo_info": { "parent_bus":"0x38", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - "PORT18": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT18", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"18"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT18-EEPROM" }, - { "itf":"control", "dev":"PORT18-CTRL" } - ] - } - }, - "PORT18-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT18-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT18"}, - "i2c": - { - "topo_info": { "parent_bus":"0x39", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT18-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT18-CTRL", "device_parent":"MUX7", "virt_parent":"PORT18"}, - "i2c": - { - "topo_info": { "parent_bus":"0x39", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - - "PORT17": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT17", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"17"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT17-EEPROM" }, - { "itf":"control", "dev":"PORT17-CTRL" } - ] - } - }, - "PORT17-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT17-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT17"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3a", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT17-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT17-CTRL", "device_parent":"MUX7", "virt_parent":"PORT17"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - - "PORT20": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT20", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"20"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT20-EEPROM" }, - { "itf":"control", "dev":"PORT20-CTRL" } - ] - } - }, - "PORT20-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT20-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT20"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3b", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT20-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT20-CTRL", "device_parent":"MUX7", "virt_parent":"PORT20"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - - "PORT19": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT19", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"19"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT19-EEPROM" }, - { "itf":"control", "dev":"PORT19-CTRL" } - ] - } - }, - "PORT19-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT19-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT19"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3c", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT19-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT19-CTRL", "device_parent":"MUX7", "virt_parent":"PORT19"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - - "PORT21": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT21", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"21"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT21-EEPROM" }, - { "itf":"control", "dev":"PORT21-CTRL" } - ] - } - }, - "PORT21-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT21-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT21"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3d", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT21-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT21-CTRL", "device_parent":"MUX7", "virt_parent":"PORT21"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - - "PORT23": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT23", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"23"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT23-EEPROM" }, - { "itf":"control", "dev":"PORT23-CTRL" } - ] - } - }, - "PORT23-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT23-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT23"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3e", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT23-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT23-CTRL", "device_parent":"MUX7", "virt_parent":"PORT23"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} - ] - } - }, - - "PORT22": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT22", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"22"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT22-EEPROM" }, - { "itf":"control", "dev":"PORT22-CTRL" } - ] - } - }, - "PORT22-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT22-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT22"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3f", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT22-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT22-CTRL", "device_parent":"MUX7", "virt_parent":"PORT22"}, - "i2c": - { - "topo_info": { "parent_bus":"0x3f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - "PORT24": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT24", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"24"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT24-EEPROM" }, - { "itf":"control", "dev":"PORT24-CTRL" } - ] - } - }, - "PORT24-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT24-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT24"}, - "i2c": - { - "topo_info": { "parent_bus":"0x40", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT24-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT24-CTRL", "device_parent":"MUX7", "virt_parent":"PORT24"}, - "i2c": - { - "topo_info": { "parent_bus":"0x40", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} - ] - } - }, - "PORT27": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT27", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"27"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT27-EEPROM" }, - { "itf":"control", "dev":"PORT27-CTRL" } - ] - } - }, - "PORT27-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT27-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT27"}, - "i2c": - { - "topo_info": { "parent_bus":"0x41", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT27-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT27-CTRL", "device_parent":"MUX8", "virt_parent":"PORT27"}, - "i2c": - { - "topo_info": { "parent_bus":"0x41", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - "PORT25": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT25", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"25"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT25-EEPROM" }, - { "itf":"control", "dev":"PORT25-CTRL" } - ] - } - }, - "PORT25-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT25-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT25"}, - "i2c": - { - "topo_info": { "parent_bus":"0x42", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT25-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT25-CTRL", "device_parent":"MUX8", "virt_parent":"PORT25"}, - "i2c": - { - "topo_info": { "parent_bus":"0x42", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - - "PORT28": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT28", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"28"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT28-EEPROM" }, - { "itf":"control", "dev":"PORT28-CTRL" } - ] - } - }, - "PORT28-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT28-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT28"}, - "i2c": - { - "topo_info": { "parent_bus":"0x43", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT28-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT28-CTRL", "device_parent":"MUX8", "virt_parent":"PORT28"}, - "i2c": - { - "topo_info": { "parent_bus":"0x43", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - "PORT26": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT26", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"26"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT26-EEPROM" }, - { "itf":"control", "dev":"PORT26-CTRL" } - ] - } - }, - "PORT26-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT26-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT26"}, - "i2c": - { - "topo_info": { "parent_bus":"0x44", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT26-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT26-CTRL", "device_parent":"MUX8", "virt_parent":"PORT26"}, - "i2c": - { - "topo_info": { "parent_bus":"0x44", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT29": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT29", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"29"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT29-EEPROM" }, - { "itf":"control", "dev":"PORT29-CTRL" } - ] - } - }, - "PORT29-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT29-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT29"}, - "i2c": - { - "topo_info": { "parent_bus":"0x45", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT29-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT29-CTRL", "device_parent":"MUX8", "virt_parent":"PORT29"}, - "i2c": - { - "topo_info": { "parent_bus":"0x45", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - - "PORT32": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT32", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"32"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT32-EEPROM" }, - { "itf":"control", "dev":"PORT32-CTRL" } - ] - } - }, - "PORT32-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT32-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT32"}, - "i2c": - { - "topo_info": { "parent_bus":"0x46", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT32-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT32-CTRL", "device_parent":"MUX8", "virt_parent":"PORT32"}, - "i2c": - { - "topo_info": { "parent_bus":"0x46", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT30": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT30", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"30"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT30-EEPROM" }, - { "itf":"control", "dev":"PORT30-CTRL" } - ] - } - }, - "PORT30-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT30-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT30"}, - "i2c": - { - "topo_info": { "parent_bus":"0x47", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT30-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT30-CTRL", "device_parent":"MUX8", "virt_parent":"PORT30"}, - "i2c": - { - "topo_info": { "parent_bus":"0x47", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - - "PORT31": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT31", "device_parent":"MUX8"}, - "dev_attr": { "dev_idx":"31"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT31-EEPROM" }, - { "itf":"control", "dev":"PORT31-CTRL" } - ] - } - }, - "PORT31-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT31-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT31"}, - "i2c": - { - "topo_info": { "parent_bus":"0x48", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT31-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT31-CTRL", "device_parent":"MUX8", "virt_parent":"PORT31"}, - "i2c": - { - "topo_info": { "parent_bus":"0x48", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - - "PORT34": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT34", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"34"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT34-EEPROM" }, - { "itf":"control", "dev":"PORT34-CTRL" } - ] - } - }, - "PORT34-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT34-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT34"}, - "i2c": - { - "topo_info": { "parent_bus":"0x49", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT34-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT34-CTRL", "device_parent":"MUX9", "virt_parent":"PORT34"}, - "i2c": - { - "topo_info": { "parent_bus":"0x49", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - - "PORT33": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT33", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"33"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT33-EEPROM" }, - { "itf":"control", "dev":"PORT33-CTRL" } - ] - } - }, - "PORT33-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT33-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT33"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4a", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT33-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT33-CTRL", "device_parent":"MUX9", "virt_parent":"PORT33"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - - "PORT36": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT36", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"36"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT36-EEPROM" }, - { "itf":"control", "dev":"PORT36-CTRL" } - ] - } - }, - "PORT36-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT36-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT36"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4b", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT36-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT36-CTRL", "device_parent":"MUX9", "virt_parent":"PORT36"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - - "PORT35": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT35", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"35"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT35-EEPROM" }, - { "itf":"control", "dev":"PORT35-CTRL" } - ] - } - }, - "PORT35-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT35-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT35"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4c", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT35-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT35-CTRL", "device_parent":"MUX9", "virt_parent":"PORT35"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - - "PORT37": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT37", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"37"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT37-EEPROM" }, - { "itf":"control", "dev":"PORT37-CTRL" } - ] - } - }, - "PORT37-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT37-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT37"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4d", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT37-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT37-CTRL", "device_parent":"MUX9", "virt_parent":"PORT37"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} - ] - } - }, - - "PORT39": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT39", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"39"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT39-EEPROM" }, - { "itf":"control", "dev":"PORT39-CTRL" } - ] - } - }, - "PORT39-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT39-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT39"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4e", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT39-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT39-CTRL", "device_parent":"MUX9", "virt_parent":"PORT39"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - - "PORT38": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT38", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"38"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT38-EEPROM" }, - { "itf":"control", "dev":"PORT38-CTRL" } - ] - } - }, - "PORT38-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT38-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT38"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4f", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT38-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT38-CTRL", "device_parent":"MUX9", "virt_parent":"PORT38"}, - "i2c": - { - "topo_info": { "parent_bus":"0x4f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} - ] - } - }, - - "PORT40": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT40", "device_parent":"MUX9"}, - "dev_attr": { "dev_idx":"40"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT40-EEPROM" }, - { "itf":"control", "dev":"PORT40-CTRL" } - ] - } - }, - "PORT40-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT40-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT40"}, - "i2c": - { - "topo_info": { "parent_bus":"0x50", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT40-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT40-CTRL", "device_parent":"MUX9", "virt_parent":"PORT40"}, - "i2c": - { - "topo_info": { "parent_bus":"0x50", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT41": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT41", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"41"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT41-EEPROM" }, - { "itf":"control", "dev":"PORT41-CTRL" } - ] - } - }, - "PORT41-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT41-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT41"}, - "i2c": - { - "topo_info": { "parent_bus":"0x51", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT41-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT41-CTRL", "device_parent":"MUX10", "virt_parent":"PORT41"}, - "i2c": - { - "topo_info": { "parent_bus":"0x51", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} - ] - } - }, - "PORT42": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT42", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"42"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT42-EEPROM" }, - { "itf":"control", "dev":"PORT42-CTRL" } - ] - } - }, - "PORT42-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT42-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT42"}, - "i2c": - { - "topo_info": { "parent_bus":"0x52", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT42-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT42-CTRL", "device_parent":"MUX10", "virt_parent":"PORT42"}, - "i2c": - { - "topo_info": { "parent_bus":"0x52", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} - ] - } - }, - "PORT45": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT45", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"45"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT45-EEPROM" }, - { "itf":"control", "dev":"PORT45-CTRL" } - ] - } - }, - "PORT45-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT45-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT45"}, - "i2c": - { - "topo_info": { "parent_bus":"0x53", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT45-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT45-CTRL", "device_parent":"MUX10", "virt_parent":"PORT45"}, - "i2c": - { - "topo_info": { "parent_bus":"0x53", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} - ] - } - }, - "PORT43": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT43", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"43"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT43-EEPROM" }, - { "itf":"control", "dev":"PORT43-CTRL" } - ] - } - }, - "PORT43-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT43-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT43"}, - "i2c": - { - "topo_info": { "parent_bus":"0x54", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT43-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT43-CTRL", "device_parent":"MUX10", "virt_parent":"PORT43"}, - "i2c": - { - "topo_info": { "parent_bus":"0x54", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_devname":"CPLD1", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B","attr_devname":"CPLD1", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_devname":"CPLD1", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_devname":"CPLD1","attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} - ] - } - }, - "PORT44": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT44", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"44"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT44-EEPROM" }, - { "itf":"control", "dev":"PORT44-CTRL" } - ] - } - }, - "PORT44-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT44-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT44"}, - "i2c": - { - "topo_info": { "parent_bus":"0x55", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT44-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT44-CTRL", "device_parent":"MUX10", "virt_parent":"PORT44"}, - "i2c": - { - "topo_info": { "parent_bus":"0x55", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} - ] - } - }, - "PORT48": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT48", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"48"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT48-EEPROM" }, - { "itf":"control", "dev":"PORT48-CTRL" } - ] - } - }, - "PORT48-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT48-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT48"}, - "i2c": - { - "topo_info": { "parent_bus":"0x56", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT48-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT48-CTRL", "device_parent":"MUX10", "virt_parent":"PORT48"}, - "i2c": - { - "topo_info": { "parent_bus":"0x56", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_devname":"CPLD1","attr_offset":"0x1C", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} - ] - } - }, - "PORT46": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT46", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"46"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT46-EEPROM" }, - { "itf":"control", "dev":"PORT46-CTRL" } - ] - } - }, - "PORT46-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT46-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT46"}, - "i2c": - { - "topo_info": { "parent_bus":"0x57", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT46-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT46-CTRL", "device_parent":"MUX10", "virt_parent":"PORT46"}, - "i2c": - { - "topo_info": { "parent_bus":"0x57", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1","attr_offset":"0x1B", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1","attr_offset":"0x18", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} - ] - } - }, - "PORT47": - { - "dev_info": { "device_type":"SFP28", "device_name":"PORT47", "device_parent":"MUX10"}, - "dev_attr": { "dev_idx":"47"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT47-EEPROM" }, - { "itf":"control", "dev":"PORT47-CTRL" } - ] - } - }, - "PORT47-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT47-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT47"}, - "i2c": - { - "topo_info": { "parent_bus":"0x58", "dev_addr":"0x50", "dev_type":"optoe2"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT47-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT47-CTRL", "device_parent":"MUX10", "virt_parent":"PORT47"}, - "i2c": - { - "topo_info": { "parent_bus":"0x58", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1C", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} - ] - } - }, - - "PORT49": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT49", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"49"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT49-EEPROM" }, - { "itf":"control", "dev":"PORT49-CTRL" } - ] - } - }, - "PORT49-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT49-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT49"}, - "i2c": - { - "topo_info": { "parent_bus":"0x19", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT49-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT49-CTRL", "device_parent":"MUX11", "virt_parent":"PORT49"}, - "i2c": - { - "topo_info": { "parent_bus":"0x19", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT50": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT50", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"50"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT50-EEPROM" }, - { "itf":"control", "dev":"PORT50-CTRL" } - ] - } - }, - "PORT50-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT50-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT50"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1a", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT50-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT50-CTRL", "device_parent":"MUX11", "virt_parent":"PORT50"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT51": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT51", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"51"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT51-EEPROM" }, - { "itf":"control", "dev":"PORT51-CTRL" } - ] - } - }, - "PORT51-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT51-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT51"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1b", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT51-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT51-CTRL", "device_parent":"MUX11", "virt_parent":"PORT51"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT52": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT52", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"52"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT52-EEPROM" }, - { "itf":"control", "dev":"PORT52-CTRL" } - ] - } - }, - "PORT52-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT52-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT52"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1c", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT52-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT52-CTRL", "device_parent":"MUX11", "virt_parent":"PORT52"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT53": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT53", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"53"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT53-EEPROM" }, - { "itf":"control", "dev":"PORT53-CTRL" } - ] - } - }, - "PORT53-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT53-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT53"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1d", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT53-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT53-CTRL", "device_parent":"MUX11", "virt_parent":"PORT53"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT54": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT54", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"54"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT54-EEPROM" }, - { "itf":"control", "dev":"PORT54-CTRL" } - ] - } - }, - "PORT54-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT54-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT54"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1e", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT54-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT54-CTRL", "device_parent":"MUX11", "virt_parent":"PORT54"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT55": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT55", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"55"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT55-EEPROM" }, - { "itf":"control", "dev":"PORT55-CTRL" } - ] - } - }, - "PORT55-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT55-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT55"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1f", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT55-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT55-CTRL", "device_parent":"MUX11", "virt_parent":"PORT55"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - - "PORT56": - { - "dev_info": { "device_type":"QSFP28", "device_name":"PORT56", "device_parent":"MUX11"}, - "dev_attr": { "dev_idx":"56"}, - "i2c": - { - "interface": - [ - { "itf":"eeprom", "dev":"PORT56-EEPROM" }, - { "itf":"control", "dev":"PORT56-CTRL" } - ] - } - }, - "PORT56-EEPROM": - { - "dev_info": { "device_type":"", "device_name":"PORT56-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT56"}, - "i2c": - { - "topo_info": { "parent_bus":"0x20", "dev_addr":"0x50", "dev_type":"optoe1"}, - "attr_list": - [ - { "attr_name":"eeprom"} - ] - } - }, - "PORT56-CTRL": - { - "dev_info": { "device_type":"", "device_name":"PORT56-CTRL", "device_parent":"MUX11", "virt_parent":"PORT56"}, - "i2c": - { - "topo_info": { "parent_bus":"0x20", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, - "attr_list": - [ - { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} - - ] - } - }, - "LOC_LED": - { - "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, - "dev_attr": { "index":"0"}, - "i2c" : - { - "attr_list": - [ - {"attr_name":"STATUS_LED_COLOR_BLUE_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x27", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_GREEN_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x17", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_AMBER_BLINK", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_BLUE", "descr": "" , "bits" : "5:0", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_GREEN", "descr": "" , "bits" : "5:0", "value" : "0x5", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_AMBER", "descr": "" , "bits" : "5:0", "value" : "0x6", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, - {"attr_name":"STATUS_LED_COLOR_OFF", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"} - ] - } - }, - "DIAG_LED": - { - "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, - "dev_attr": { "index":"0"}, - "i2c" : - { - "attr_list": - [ - {"attr_name":"STATUS_LED_COLOR_BLUE_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x27", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_GREEN_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x17", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_AMBER_BLINK", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_BLUE", "descr": "" , "bits" : "5:0", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_GREEN", "descr": "" , "bits" : "5:0", "value" : "0x5", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_AMBER", "descr": "" , "bits" : "5:0", "value" : "0x6", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, - {"attr_name":"STATUS_LED_COLOR_OFF", "descr": "" , "bits" : "5:0", "value" : "0x7", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"} - - ] - } - } -} diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf_support b/device/accton/x86_64-accton_as7326_56x-r0/pddf_support deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/device/accton/x86_64-accton_as7326_56x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7326_56x-r0/plugins/eeprom.py index 4241483d68eb..8139f856f973 100644 --- a/device/accton/x86_64-accton_as7326_56x-r0/plugins/eeprom.py +++ b/device/accton/x86_64-accton_as7326_56x-r0/plugins/eeprom.py @@ -16,5 +16,10 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): _TLV_INFO_MAX_LEN = 256 def __init__(self, name, path, cpld_root, ro): - self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + exists = os.path.isfile('/sys/bus/i2c/devices/0-0056/eeprom') + if (exists is True): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + else: + self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json index 584a14b9d942..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json @@ -1,5 +1,5 @@ { "skip_ledd": true, - "skip_thermalctld": true + "skip_pcied": true } diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/__init__.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/__init__.py new file mode 100644 index 000000000000..73a7720e8979 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = [ "platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer" ] +from . import platform diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/chassis.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/chassis.py new file mode 100644 index 000000000000..f32f381b7c21 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/chassis.py @@ -0,0 +1,264 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +import os +import sys + +try: + from sonic_platform_base.chassis_base import ChassisBase + from .event import SfpEvent + from sonic_py_common import device_info + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN_TRAY = 6 +NUM_PSU = 2 +NUM_THERMAL = 4 +NUM_PORT = 58 +NUM_COMPONENT = 4 + +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" +SYSLED_FNODE= "/sys/class/leds/accton_as7326_56x_led::diag/brightness" +SYSLED_MODES = { + "0" : "STATUS_LED_COLOR_OFF", + "1" : "STATUS_LED_COLOR_GREEN", + "3" : "STATUS_LED_COLOR_RED", + "5" : "STATUS_LED_COLOR_GREEN_BLINK" +} + + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + ChassisBase.__init__(self) + self.config_data = {} + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_components() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(NUM_PORT): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self._sfpevent = SfpEvent(self._sfp_list) + self.sfp_module_initialized = True + + def __initialize_fan(self): + from sonic_platform.fan_drawer import FanDrawer + for fant_index in range(NUM_FAN_TRAY): + fandrawer = FanDrawer(fant_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + def __initialize_watchdog(self): + self._watchdog = Watchdog() + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + return fd.read().strip() + except IOError: + pass + return None + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception: + return False + return True + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._eeprom.get_product_name() + + def get_presence(self): + """ + Retrieves the presence of the Chassis + Returns: + bool: True if Chassis is present, False if not + """ + return True + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + description = 'None' + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else (PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + prev_reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE) if self.__is_host( + ) else (PMON_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE) + + sw_reboot_cause = self.__read_txt_file(reboot_cause_path) or "Unknown" + prev_sw_reboot_cause = self.__read_txt_file(prev_reboot_cause_path) or "Unknown" + + if sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + elif prev_reboot_cause_path != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = prev_sw_reboot_cause + + return (reboot_cause, description) + + def get_change_event(self, timeout=0): + # SFP event + if not self.sfp_module_initialized: + self.__initialize_sfp() + return self._sfpevent.get_sfp_event(timeout) + + def get_sfp(self, index): + """ + Retrieves sfp represented by (1-based) index + Args: + index: An integer, the index (1-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 1. + For example, 1 for Ethernet0, 2 for Ethernet4 and so on. + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + # The index will start from 1 + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + + def initizalize_system_led(self): + return True + + def get_status_led(self): + val = self.__read_txt_file(SYSLED_FNODE) + return SYSLED_MODES[val] if val in SYSLED_MODES else "UNKNOWN" + + def set_status_led(self, color): + mode = None + for key, val in SYSLED_MODES.items(): + if val == color: + mode = key + break + if mode is None: + return False + else: + return self.__write_txt_file(SYSLED_FNODE, mode) diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/component.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/component.py new file mode 100644 index 000000000000..75c2d3b918d4 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/component.py @@ -0,0 +1,161 @@ +############################################################################# +# Edgecore +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +try: + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + "CPLD-1": "18-0060", + "CPLD-2": "12-0062", + "CPLD-3": "19-0064", +} +SYSFS_PATH = "/sys/bus/i2c/devices/" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_NAME_LIST = ["CPLD-1", "CPLD-2", "CPLD-3", "BIOS"] +COMPONENT_DES_LIST = [ + "CPLD-1", "CPLD-2", "CPLD-3", "Basic Input/Output System" +] + + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def __get_sysfs_value(self, addr, name): + # Retrieves the cpld register value + try: + with open(SYSFS_PATH + addr + '/' + name, 'r') as fd: + return fd.read().strip() + except Exception as e: + return None + + def __get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_ADDR_MAPPING: + try: + cpld_addr = CPLD_ADDR_MAPPING[cpld_name] + cpld_version_raw = self.__get_sysfs_value(cpld_addr, "version") + cpld_version[cpld_name] = "{}".format( + int(cpld_version_raw, 16)) + except Exception as e: + cpld_version[cpld_name] = 'None' + + return cpld_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_NAME_LIST[self.index] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_DES_LIST[self.index] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + cpld_version = self.__get_cpld_version() + fw_version = cpld_version.get(self.name) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/eeprom.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..d0bffe53a279 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/eeprom.py @@ -0,0 +1,139 @@ +try: + import os + import sys + import re + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +NULL = 'N/A' + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + #self._eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + exists = os.path.isfile('/sys/bus/i2c/devices/0-0056/eeprom') + if (exists is True): + self._eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + else: + self._eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search('(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', + line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except Exception: + pass + + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def _valid_tlv(self, eeprom_data): + tlvinfo_type_codes_list = [ + self._TLV_CODE_PRODUCT_NAME, + self._TLV_CODE_PART_NUMBER, + self._TLV_CODE_SERIAL_NUMBER, + self._TLV_CODE_MAC_BASE, + self._TLV_CODE_MANUF_DATE, + self._TLV_CODE_DEVICE_VERSION, + self._TLV_CODE_LABEL_REVISION, + self._TLV_CODE_PLATFORM_NAME, + self._TLV_CODE_ONIE_VERSION, + self._TLV_CODE_MAC_SIZE, + self._TLV_CODE_MANUF_NAME, + self._TLV_CODE_MANUF_COUNTRY, + self._TLV_CODE_VENDOR_NAME, + self._TLV_CODE_DIAG_VERSION, + self._TLV_CODE_SERVICE_TAG, + self._TLV_CODE_VENDOR_EXT, + self._TLV_CODE_CRC_32 + ] + + for code in tlvinfo_type_codes_list: + code_str = "0x{:X}".format(code) + eeprom_data[code_str] = eeprom_data.get(code_str, NULL) + return eeprom_data + + def get_eeprom(self): + return self._valid_tlv(self._eeprom) + + def get_pn(self): + return self._eeprom.get('0x22', NULL) + + def get_serial(self): + return self._eeprom.get('0x23', NULL) + + def get_mac(self): + return self._eeprom.get('0x24', NULL) + + def get_product_name(self): + return self._eeprom.get('0x21', NULL) diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/event.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/event.py new file mode 100644 index 000000000000..3d6f81518a26 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/event.py @@ -0,0 +1,60 @@ +try: + import time + from sonic_py_common.logger import Logger +except ImportError as e: + raise ImportError(repr(e) + " - required module not found") + +POLL_INTERVAL_IN_SEC = 1 + +class SfpEvent: + ''' Listen to insert/remove sfp events ''' + + def __init__(self, sfp_list): + self._sfp_list = sfp_list + self._logger = Logger() + self._sfp_change_event_data = {'present': 0} + + def get_presence_bitmap(self): + bitmap = 0 + for sfp in self._sfp_list: + modpres = sfp.get_presence() + i=sfp.port_num-1 + if modpres: + bitmap = bitmap | (1 << i) + return bitmap + + def get_sfp_event(self, timeout=2000): + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + + if timeout < 1000: + cd_ms = 1000 + else: + cd_ms = timeout + + while cd_ms > 0: + bitmap = self.get_presence_bitmap() + changed_ports = self._sfp_change_event_data['present'] ^ bitmap + if changed_ports != 0: + break + time.sleep(POLL_INTERVAL_IN_SEC) + # timeout=0 means wait for event forever + if timeout != 0: + cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000 + + if changed_ports != 0: + for sfp in self._sfp_list: + i=sfp.port_num-1 + if (changed_ports & (1 << i)): + if (bitmap & (1 << i)) == 0: + port_dict[i+1] = '0' + else: + port_dict[i+1] = '1' + + + # Update the cache dict + self._sfp_change_event_data['present'] = bitmap + return True, change_dict + else: + return True, change_dict diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan.py new file mode 100644 index 000000000000..c64d953b758b --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan.py @@ -0,0 +1,270 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +try: + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_MAX_RPM = 25500 +PSU_FAN_MAX_RPM = 25500 +SPEED_TOLERANCE = 15 +CPLD_I2C_PATH = "/sys/bus/i2c/devices/11-0066/fan" +PSU_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "59" + }, + 1: { + "bus": 13, + "addr": "5b" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "51" + }, + 1: { + "bus": 13, + "addr": "53" + }, +} + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", + "FAN-3F", "FAN-3R", "FAN-4F", "FAN-4R", + "FAN-5F", "FAN-5R", "FAN-6F", "FAN-6R"] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, + fan_tray_index, + fan_index=0, + is_psu_fan=False, + psu_index=0): + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + self.psu_index = psu_index + + if self.is_psu_fan: + psu_i2c_bus = PSU_HWMON_I2C_MAPPING[psu_index]["bus"] + psu_i2c_addr = PSU_HWMON_I2C_MAPPING[psu_index]["addr"] + self.psu_hwmon_path = PSU_I2C_PATH.format(psu_i2c_bus, + psu_i2c_addr) + psu_i2c_bus = PSU_CPLD_I2C_MAPPING[psu_index]["bus"] + psu_i2c_addr = PSU_CPLD_I2C_MAPPING[psu_index]["addr"] + self.cpld_path = PSU_I2C_PATH.format(psu_i2c_bus, psu_i2c_addr) + + FanBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + return fd.read().strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception: + return False + return True + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + if not self.is_psu_fan: + val = self.__read_txt_file( + CPLD_I2C_PATH + str(self.fan_tray_index+1) + "_direction") + direction = self.FAN_DIRECTION_EXHAUST if ( + val == "0") else self.FAN_DIRECTION_INTAKE + else: + val = self.__read_txt_file(self.psu_hwmon_path + "psu_fan_dir") + direction = self.FAN_DIRECTION_EXHAUST if ( + val == "F2B") else self.FAN_DIRECTION_INTAKE + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed = 0 + if self.is_psu_fan: + speed = self.__read_txt_file( + self.psu_hwmon_path + "psu_fan1_speed_rpm") + speed = (int(speed, 10)) * 100 / PSU_FAN_MAX_RPM + speed = 100 if (speed > 100) else speed + elif self.get_presence(): + speed = self.__read_txt_file(CPLD_I2C_PATH + str( + self.fan_index * 10 + self.fan_tray_index + 1) + "_input") + speed = (int(speed, 10)) * 100 / FAN_MAX_RPM + speed = 100 if (speed > 100) else speed + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + Note: + speed_pc = pwm_target/255*100 + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + return self.get_speed() + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + """ + + if not self.is_psu_fan and self.get_presence(): + return self.__write_txt_file( + CPLD_I2C_PATH + "_duty_cycle_percentage", int(speed)) + + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False #Not supported + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_presence() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index*2 + self.fan_index] \ + if not self.is_psu_fan \ + else "PSU-{} FAN-{}".format(self.psu_index+1, self.fan_index+1) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.is_psu_fan: + val = self.__read_txt_file(self.cpld_path + "psu_present") + return int(val, 10) == 1 + + val = self.__read_txt_file( + CPLD_I2C_PATH + str(self.fan_tray_index + 1) + "_present") + return int(val, 10)==1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu_fan: + psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_fault') + val=self.__read_txt_file(psu_fan_path) + if val is not None: + return int(val, 10)==0 + else: + return False + else: + path = "{}{}{}".format(CPLD_I2C_PATH, self.fan_tray_index+1, '_fault') + val=self.__read_txt_file(path) + if val is not None: + return int(val, 10)==0 + else: + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fan_index+1) \ + if not self.is_psu_fan else (self.psu_index+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan_drawer.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..e21163c106c1 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/fan_drawer.py @@ -0,0 +1,90 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 + + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self._fan_list[0].get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/platform.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/platform.py new file mode 100644 index 000000000000..2f2c2a447fcf --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/platform.py @@ -0,0 +1,21 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/psu.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/psu.py new file mode 100644 index 000000000000..44566aba1f3c --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/psu.py @@ -0,0 +1,264 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +#import sonic_platform + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.thermal import Thermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] +PSU_NUM_FAN = [1, 1] +PSU_HWMON_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "59" + }, + 1: { + "bus": 13, + "addr": "5b" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "51" + }, + 1: { + "bus": 13, + "addr": "53" + }, +} + +NUM_FAN_TRAY = 6 + + +class Psu(PsuBase): + """Platform-specific Psu class""" + + def __init__(self, psu_index=0): + PsuBase.__init__(self) + self.index = psu_index + + bus = PSU_HWMON_I2C_MAPPING[self.index]["bus"] + addr = PSU_HWMON_I2C_MAPPING[self.index]["addr"] + self.hwmon_path = I2C_PATH.format(bus, addr) + + bus = PSU_CPLD_I2C_MAPPING[self.index]["bus"] + addr = PSU_CPLD_I2C_MAPPING[self.index]["addr"] + self.cpld_path = I2C_PATH.format(bus, addr) + self.__initialize_fan() + + def __initialize_fan(self): + from sonic_platform.fan import Fan + self._fan_list.append( + Fan(NUM_FAN_TRAY + self.index, + is_psu_fan=True, + psu_index=self.index)) + self._thermal_list.append(Thermal(is_psu=True, psu_index=self.index)) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + return fd.read().strip() + except IOError: + pass + return None + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + val = self.__read_txt_file(self.hwmon_path + "psu_v_out") + if val is not None: + return float(val)/ 1000 + else: + return 0 + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + val = self.__read_txt_file(self.hwmon_path + "psu_i_out") + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + val = self.__read_txt_file(self.hwmon_path + "psu_p_out") + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + + return False #Controlled by HW + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_status() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + return self._thermal_list[0].get_temperature() + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return False #Not supported + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + val = self.__read_txt_file(self.hwmon_path + "psu_mfr_vout_max") + if val is not None: + return float(val)/ 1000 + else: + return 0 + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + val = self.__read_txt_file(self.hwmon_path + "psu_mfr_vout_min") + if val is not None: + return float(val)/ 1000 + else: + return 0 + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + val = self.__read_txt_file(self.cpld_path + "psu_present") + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + val = self.__read_txt_file(self.cpld_path + "psu_power_good") + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model = self.__read_txt_file(self.cpld_path + "psu_model_name") + if model is None: + return "N/A" + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = self.__read_txt_file(self.cpld_path + "psu_serial_number") + if serial is None: + return "N/A" + return serial + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/sfp.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..95a54e554a01 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/sfp.py @@ -0,0 +1,626 @@ +############################################################################# +# Edgecore +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import os +import time +import sys + +from ctypes import create_string_buffer + +try: + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + 0: { + "bus": 18, + "addr": "60" + }, # port 31-56 + 1: { + "bus": 12, + "addr": "62" + }, # port 1-30 +} +CPLD_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" + +class Sfp(SfpOptoeBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 1 + PORT_END = 58 + + # Path to sysfs + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" + + PLATFORM = "x86_64-accton_as7326_56x-r0" + HWSKU = "Accton-AS7326-56X" + + _port_to_i2c_mapping = { + 1: [42], + 2: [41], + 3: [44], + 4: [43], + 5: [47], + 6: [45], + 7: [46], + 8: [50], + 9: [48], + 10: [49], + 11: [52], + 12: [51], + 13: [53], + 14: [56], + 15: [55], + 16: [54], + 17: [58], + 18: [57], + 19: [60], + 20: [59], + 21: [61], + 22: [63], + 23: [62], + 24: [64], + 25: [66], + 26: [68], + 27: [65], + 28: [67], + 29: [69], + 30: [71], + 31: [72], + 32: [70], + 33: [74], + 34: [73], + 35: [76], + 36: [75], + 37: [77], + 38: [79], + 39: [78], + 40: [80], + 41: [81], + 42: [82], + 43: [84], + 44: [85], + 45: [83], + 46: [87], + 47: [88], + 48: [86], + 49: [25], + 50: [26], + 51: [27], + 52: [28], + 53: [29], + 54: [30], + 55: [31], + 56: [32], + 57: [22], + 58: [23] + } + + def __init__(self, sfp_index=0): + SfpOptoeBase.__init__(self) + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + cpld_idx = 0 if self.port_num > 30 else 1 + bus = CPLD_ADDR_MAPPING[cpld_idx]["bus"] + addr = CPLD_ADDR_MAPPING[cpld_idx]["addr"] + self.cpld_path = CPLD_I2C_PATH.format(bus, addr) + + # Init eeprom path + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' + self.port_to_eeprom_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x][0]) + + def get_eeprom_path(self): + return self.port_to_eeprom_mapping[self.port_num] + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + return fd.read().strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception: + return False + return True + + def __is_host(self): + return os.system(self.HOST_CHK_CMD) == 0 + + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) + hwsku_path = "/".join( + [platform_path, + self.HWSKU]) if self.__is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[ + self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + for n in range(0, num_bytes): + if sys.version_info[0] >= 3: + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except Exception: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + if self.port_num <= 48 or self.port_num >=57: + return False # SPF port doesn't support this feature + + val = self.__read_txt_file( + self.cpld_path + "module_reset_" + str(self.port_num)) + return int(val, 10) == 1 + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + if self.port_num <= 48 or self.port_num >=57: + rx_los = self.__read_txt_file( + self.cpld_path + "module_rx_los_" + str(self.port_num)) + if int(rx_los, 10) == 1: + return [True] + else: + return [False] + #status_control_raw = self.__read_eeprom_specific_bytes( + # SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + #if status_control_raw: + # data = int(status_control_raw[0], 16) + # rx_los = (sffbase().test_bit(data, 1) != 0) + else: + rx_los_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_RX_LOS_STATUS_OFFSET, + QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence( + ) else None + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + return rx_los_list + else: + return [False]*4 + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A list of boolean values, representing the TX fault status + of each available channel, value is True if SFP channel + has TX fault, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault = False + if self.port_num <= 48 or self.port_num >=57: + tx_fault = self.__read_txt_file( + self.cpld_path + "module_tx_fault_" + str(self.port_num)) + if int(tx_fault, 10) == 1: + return [True] + else: + return [False] + #status_control_raw = self.__read_eeprom_specific_bytes( + # SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + #if status_control_raw: + # data = int(status_control_raw[0], 16) + # tx_fault = (sffbase().test_bit(data, 2) != 0) + else: + tx_fault_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, + QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) if self.get_presence( + ) else None + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + return tx_fault_list + else: + return [False]*4 + + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A list of boolean values, representing the TX disable status + of each available channel, value is True if SFP channel + is TX disabled, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + """ + if self.port_num <= 48 or self.port_num >=57: + tx_disable = False + + status_control_raw = self.__read_eeprom_specific_bytes( + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + if status_control_raw: + cpld_val = self.__read_txt_file( + self.cpld_path + "module_tx_disable_" + str(self.port_num)) + tx_disable_hard = (int(cpld_val, 10) == 1) + data = int(status_control_raw[0], 16) + #tx_disable_hard = (sffbase().test_bit( + # data, SFP_TX_DISABLE_HARD_BIT) != 0) + tx_disable_soft = (sffbase().test_bit( + data, SFP_TX_DISABLE_SOFT_BIT) != 0) + tx_disable = tx_disable_hard | tx_disable_soft + if tx_disable==0: + return [False] + else: + return [True] + + else: + return [False] + + else: + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return [False] + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, + QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX1Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX2Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX3Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX4Disable']['value']) + return tx_disable_list + else: + return [False]*4 + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_list = self.get_tx_disable() + if tx_disable_list is None: + return 0 + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + if self.port_num <= 48 or self.port_num >= 57: + # SFP doesn't support this feature + return False + + power_set = self.get_power_set() + power_override = self.get_power_override() + return power_set and power_override + + def get_power_set(self): + + if self.port_num <= 48 or self.port_num >= 57: + # SFP doesn't support this feature + return False + else: + power_set = False + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, + QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + power_set = ( + 'On' == dom_control_data['data']['PowerSet']['value']) + + return power_set + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + if self.port_num <= 48 or self.port_num >= 57: + return False # SFP doesn't support this feature + else: + power_override = False + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, + QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + + return power_override + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # Check for invalid port_num + if self.port_num <= 48 or self.port_num >=57: + return False # SFP doesn't support this feature + + ret = self.__write_txt_file( + self.cpld_path + "module_reset_" + str(self.port_num), 1) + if ret is not True: + return ret + + time.sleep(0.01) + ret = self.__write_txt_file( + self.cpld_path + "module_reset_" + str(self.port_num), 0) + time.sleep(0.2) + return ret + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + if self.port_num <= 48 or self.port_num >=57: + ret = self.__write_txt_file( + self.cpld_path + "module_tx_disable_" + str(self.port_num), 1 + if tx_disable else 0) + time.sleep(0.01) + return ret + else: + if not self.get_presence(): + return False + + sysfsfile_eeprom = None + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = tx_disable_ctl + else: + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + + if self.port_num <= 48 or self.port_num >=57: + return False # SFP doesn't support this feature + else: + if not self.get_presence(): + return False + + sysfsfile_eeprom = None + try: + channel_state = self.get_tx_disable_channel() + + for i in range(4): + channel_mask = (1 << i) + if not (channel & channel_mask): + continue + + if disable: + channel_state |= channel_mask + else: + channel_state &= ~channel_mask + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = channel_state + else: + buffer[0] = chr(channel_state) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + if self.port_num <= 48 or self.port_num >=57: + return False # SFP doesn't support this feature + + if lpmode: + return self.set_power_override(True, True) + else: + return self.set_power_override(True, False) + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + if self.port_num <= 48 or self.port_num >=57: + return False # SFP doesn't support this feature + else: + if not self.get_presence(): + return False + try: + power_override_bit = (1 << 0) if power_override else 0 + power_set_bit = (1 << 1) if power_set else (1 << 3) + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = (power_override_bit | power_set_bit) + else: + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + with open(self.port_to_eeprom_mapping[self.port_num], + "r+b") as fd: + fd.seek(QSFP_POWEROVERRIDE_OFFSET) + fd.write(buffer[0]) + time.sleep(0.01) + except Exception: + print("Error: unable to open file: %s" % str(e)) + return False + return True + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + val = self.__read_txt_file( + self.cpld_path + "module_present_" + str(self.port_num)) + return val == '1' + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.port_num + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/thermal.py b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/thermal.py new file mode 100644 index 000000000000..b2233e7b5a72 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/sonic_platform/thermal.py @@ -0,0 +1,232 @@ +############################################################################# +# Edgecore +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path +import glob + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "59" + }, + 1: { + "bus": 13, + "addr": "5b" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "bus": 17, + "addr": "51" + }, + 1: { + "bus": 13, + "addr": "53" + }, +} + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + PSU_THERMAL_NAME_LIST = [] + SYSFS_PATH = "/sys/bus/i2c/devices" + + def __init__(self, thermal_index=0, is_psu=False, psu_index=0): + self.index = thermal_index + self.is_psu = is_psu + self.psu_index = psu_index + + if self.is_psu: + psu_i2c_bus = PSU_HWMON_I2C_MAPPING[psu_index]["bus"] + psu_i2c_addr = PSU_HWMON_I2C_MAPPING[psu_index]["addr"] + self.psu_hwmon_path = PSU_I2C_PATH.format(psu_i2c_bus, + psu_i2c_addr) + psu_i2c_bus = PSU_CPLD_I2C_MAPPING[psu_index]["bus"] + psu_i2c_addr = PSU_CPLD_I2C_MAPPING[psu_index]["addr"] + self.cpld_path = PSU_I2C_PATH.format(psu_i2c_bus, psu_i2c_addr) + + # Add thermal name + self.THERMAL_NAME_LIST.append("Temp sensor 1") + self.THERMAL_NAME_LIST.append("Temp sensor 2") + self.THERMAL_NAME_LIST.append("Temp sensor 3") + self.THERMAL_NAME_LIST.append("Temp sensor 4") + self.PSU_THERMAL_NAME_LIST.append("PSU-1 temp sensor 1") + self.PSU_THERMAL_NAME_LIST.append("PSU-2 temp sensor 1") + + # Set hwmon path + i2c_path = { + 0: "15-0048/hwmon/hwmon*/", + 1: "15-0049/hwmon/hwmon*/", + 2: "15-004a/hwmon/hwmon*/", + 3: "15-004b/hwmon/hwmon*/" + }.get(self.index, None) + + self.hwmon_path = "{}/{}".format(self.SYSFS_PATH, i2c_path) + self.ss_key = self.THERMAL_NAME_LIST[self.index] + self.ss_index = 1 + + def __read_txt_file(self, file_path): + for filename in glob.glob(file_path): + try: + with open(filename, 'r') as fd: + return fd.readline().rstrip() + except IOError as e: + pass + + def __get_temp(self, temp_file): + if not self.is_psu: + temp_file_path = os.path.join(self.hwmon_path, temp_file) + else: + temp_file_path = temp_file + + raw_temp = self.__read_txt_file(temp_file_path) + return float(raw_temp) / 1000 + + def __set_threshold(self, file_name, temperature): + if self.is_psu: + return True + + temp_file_path = os.path.join(self.hwmon_path, file_name) + try: + with open(temp_file_path, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError: + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + if not self.is_psu: + temp_file = "temp{}_input".format(self.ss_index) + else: + temp_file = self.psu_hwmon_path + "psu_temp1_input" + + return self.__get_temp(temp_file) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.is_psu: + return 0 + + temp_file = "temp{}_max".format(self.ss_index) + return self.__get_temp(temp_file) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + temp_file = "temp{}_max".format(self.ss_index) + temperature = temperature *1000 + self.__set_threshold(temp_file, temperature) + + return True + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + if self.is_psu: + return self.PSU_THERMAL_NAME_LIST[self.psu_index] + else: + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.is_psu: + val = self.__read_txt_file(self.cpld_path + "psu_present") + return int(val, 10) == 1 + + temp_file = "temp{}_input".format(self.ss_index) + temp_file_path = os.path.join(self.hwmon_path, temp_file) + raw_txt = self.__read_txt_file(temp_file_path) + return raw_txt != None + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu: + temp_file = self.psu_hwmon_path + "psu_temp_fault" + return self.get_presence() and (not int( + self.__read_txt_file(temp_file))) + + file_str = "temp{}_input".format(self.ss_index) + file_path = os.path.join(self.hwmon_path, file_str) + + raw_txt = self.__read_txt_file(file_path) + if raw_txt is None: + return False + else: + return int(raw_txt) != 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False diff --git a/device/accton/x86_64-accton_as7326_56x-r0/system_health_monitoring_config.json b/device/accton/x86_64-accton_as7326_56x-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..18d47b22a9d3 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu.temperature" + + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "STATUS_LED_COLOR_RED", + "normal": "STATUS_LED_COLOR_GREEN", + "booting": "STATUS_LED_COLOR_GREEN_BLINK" + } +} diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json deleted file mode 100644 index eae22f99e394..000000000000 --- a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - - "XCVR": - { - "xcvr_present": - { - "i2c": - { - "valmap-QSFP28": {"1":true, "0":false} - } - } - }, - "PSU": - { - "psu_present": - { - "i2c": - { - "valmap": { "1":true, "0":false } - } - }, - - "psu_power_good": - { - "i2c": - { - "valmap": { "1": true, "0":false } - } - }, - - "psu_fan_dir": - { - "i2c": - { - "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } - } - }, - - "PSU_FAN_MAX_SPEED":"18000" - }, - - "FAN": - { - "direction": - { - "i2c": - { - "valmap": {"1":"INTAKE", "0":"EXHAUST"} - } - }, - - "present": - { - "i2c": - { - "valmap": {"1":true, "0":false} - } - }, - - "duty_cycle_to_pwm": "lambda dc: ((dc - 10) / 6)", - "pwm_to_duty_cycle": "lambda pwm: ( (pwm * 6) + 10)" - } - -} diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf_support b/device/accton/x86_64-accton_as7816_64x-r0/pddf_support deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json index 0d3f1fb4561d..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json @@ -1,6 +1,5 @@ { "skip_ledd": true, - "skip_pcied": true, - "skip_thermalctld": true + "skip_pcied": true } diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/__init__.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/__init__.py new file mode 100644 index 000000000000..73a7720e8979 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = [ "platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer" ] +from . import platform diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/chassis.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/chassis.py new file mode 100644 index 000000000000..44a759045b6b --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/chassis.py @@ -0,0 +1,250 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +import os +import sys + +try: + from sonic_platform_base.chassis_base import ChassisBase + from .helper import APIHelper + from .event import SfpEvent +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN_TRAY = 4 +NUM_FAN = 2 +NUM_PSU = 2 +NUM_THERMAL = 6 +NUM_PORT = 64 +NUM_COMPONENT = 5 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" +SYSLED_FNODE = "/sys/class/leds/as7816_64x_led::diag/brightness" +SYSLED_MODES = { + "0" : "STATUS_LED_COLOR_OFF", + "16" : "STATUS_LED_COLOR_GREEN", + "10" : "STATUS_LED_COLOR_RED" + +} + + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + ChassisBase.__init__(self) + self._api_helper = APIHelper() + self.is_host = self._api_helper.is_host() + + self.config_data = {} + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_components() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_PORT): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self._sfpevent = SfpEvent(self._sfp_list) + self.sfp_module_initialized = True + + def __initialize_fan(self): + from sonic_platform.fan_drawer import FanDrawer + for fant_index in range(NUM_FAN_TRAY): + fandrawer = FanDrawer(fant_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + def __initialize_watchdog(self): + from sonic_platform.watchdog import Watchdog + self._watchdog = Watchdog() + + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._eeprom.get_product_name() + + def get_presence(self): + """ + Retrieves the presence of the Chassis + Returns: + bool: True if Chassis is present, False if not + """ + return True + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + sw_reboot_cause = self._api_helper.read_txt_file( + reboot_cause_path) or "Unknown" + + + return ('REBOOT_CAUSE_NON_HARDWARE', sw_reboot_cause) + + def get_change_event(self, timeout=0): + # SFP event + if not self.sfp_module_initialized: + self.__initialize_sfp() + return self._sfpevent.get_sfp_event(timeout) + + def get_sfp(self, index): + """ + Retrieves sfp represented by (1-based) index + Args: + index: An integer, the index (1-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 1. + For example, 1 for Ethernet0, 2 for Ethernet4 and so on. + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + # The index will start from 1 + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + + def initizalize_system_led(self): + return True + + def get_status_led(self): + val = self._api_helper.read_txt_file(SYSLED_FNODE) + return SYSLED_MODES[val] if val in SYSLED_MODES else "UNKNOWN" + + def set_status_led(self, color): + mode = None + for key, val in SYSLED_MODES.items(): + if val == color: + mode = key + break + if mode is None: + return False + else: + return self._api_helper.write_txt_file(SYSLED_FNODE, mode) diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/component.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/component.py new file mode 100644 index 000000000000..6af2f6008e72 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/component.py @@ -0,0 +1,177 @@ +############################################################################# +# Edgecore +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +import shlex +import subprocess + +try: + from sonic_platform_base.component_base import ComponentBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + "CPLD1": "19-0060", + "CPLD2": "20-0062", + "CPLD3": "21-0064", + "CPLD4": "22-0066", +} +SYSFS_PATH = "/sys/bus/i2c/devices/" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("CPLD3", "CPLD 3"), + ("CPLD4", "CPLD 4"), + ("BIOS", "Basic Input/Output System") + +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + self._api_helper=APIHelper() + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + + def __run_command(self, command): + # Run bash command and print output to stdout + try: + process = subprocess.Popen( + shlex.split(command), stdout=subprocess.PIPE) + while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + rc = process.poll() + if rc != 0: + return False + except Exception: + return False + return True + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def __get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_ADDR_MAPPING: + try: + cpld_path = "{}{}{}".format(SYSFS_PATH, CPLD_ADDR_MAPPING[cpld_name], '/version') + cpld_version_raw= self._api_helper.read_txt_file(cpld_path) + cpld_version[cpld_name] = "{}".format(int(cpld_version_raw,16)) + except Exception as e: + print('Get exception when read cpld') + cpld_version[cpld_name] = 'None' + + return cpld_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + cpld_version = self.__get_cpld_version() + fw_version = cpld_version.get(self.name) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/eeprom.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..c87f01c50a52 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/eeprom.py @@ -0,0 +1,134 @@ +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +NULL = 'N/A' + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except Exception: + pass + + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def _valid_tlv(self, eeprom_data): + tlvinfo_type_codes_list = [ + self._TLV_CODE_PRODUCT_NAME, + self._TLV_CODE_PART_NUMBER, + self._TLV_CODE_SERIAL_NUMBER, + self._TLV_CODE_MAC_BASE, + self._TLV_CODE_MANUF_DATE, + self._TLV_CODE_DEVICE_VERSION, + self._TLV_CODE_LABEL_REVISION, + self._TLV_CODE_PLATFORM_NAME, + self._TLV_CODE_ONIE_VERSION, + self._TLV_CODE_MAC_SIZE, + self._TLV_CODE_MANUF_NAME, + self._TLV_CODE_MANUF_COUNTRY, + self._TLV_CODE_VENDOR_NAME, + self._TLV_CODE_DIAG_VERSION, + self._TLV_CODE_SERVICE_TAG, + self._TLV_CODE_VENDOR_EXT, + self._TLV_CODE_CRC_32 + ] + + for code in tlvinfo_type_codes_list: + code_str = "0x{:X}".format(code) + eeprom_data[code_str] = eeprom_data.get(code_str, NULL) + return eeprom_data + + def get_eeprom(self): + return self._valid_tlv(self._eeprom) + + def get_pn(self): + return self._eeprom.get('0x22', NULL) + + def get_serial(self): + return self._eeprom.get('0x23', NULL) + + def get_mac(self): + return self._eeprom.get('0x24', NULL) + + def get_product_name(self): + return self._eeprom.get('0x21', NULL) diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/event.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/event.py new file mode 100644 index 000000000000..eb845c7e4aad --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/event.py @@ -0,0 +1,62 @@ +try: + import time + from .helper import APIHelper + from sonic_py_common.logger import Logger +except ImportError as e: + raise ImportError(repr(e) + " - required module not found") + +POLL_INTERVAL_IN_SEC = 1 + +class SfpEvent: + ''' Listen to insert/remove sfp events ''' + + def __init__(self, sfp_list): + self._api_helper = APIHelper() + self._sfp_list = sfp_list + self._logger = Logger() + self._sfp_change_event_data = {'present': 0} + + def get_presence_bitmap(self): + bitmap = 0 + for sfp in self._sfp_list: + modpres = sfp.get_presence() + i=sfp.port_num-1 + if modpres: + bitmap = bitmap | (1 << i) + return bitmap + + def get_sfp_event(self, timeout=2000): + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + + if timeout < 1000: + cd_ms = 1000 + else: + cd_ms = timeout + + while cd_ms > 0: + bitmap = self.get_presence_bitmap() + changed_ports = self._sfp_change_event_data['present'] ^ bitmap + if changed_ports != 0: + break + time.sleep(POLL_INTERVAL_IN_SEC) + # timeout=0 means wait for event forever + if timeout != 0: + cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000 + + if changed_ports != 0: + for sfp in self._sfp_list: + i=sfp.port_num-1 + if (changed_ports & (1 << i)): + if (bitmap & (1 << i)) == 0: + port_dict[i+1] = '0' + else: + port_dict[i+1] = '1' + + + # Update the cache dict + self._sfp_change_event_data['present'] = bitmap + return True, change_dict + else: + return True, change_dict diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan.py new file mode 100644 index 000000000000..0ec1fc3962f9 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan.py @@ -0,0 +1,263 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +try: + from sonic_platform_base.fan_base import FanBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +SPEED_TOLERANCE = 15 +CPLD_FAN_I2C_PATH = "/sys/bus/i2c/devices/17-0068/fan" +I2C_PATH ="/sys/bus/i2c/devices/{}-00{}/" +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "5b" + }, + 1: { + "num": 9, + "addr": "58" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "53" + }, + 1: { + "num": 9, + "addr": "50" + }, +} + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", + "FAN-3F", "FAN-3R", "FAN-4F", "FAN-4R"] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self._api_helper=APIHelper() + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + + + if self.is_psu_fan: + self.psu_index = psu_index + self.psu_i2c_num = PSU_HWMON_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_HWMON_I2C_MAPPING[self.psu_index]['addr'] + self.psu_hwmon_path = I2C_PATH.format( + self.psu_i2c_num, self.psu_i2c_addr) + + self.psu_i2c_num = PSU_CPLD_I2C_MAPPING[self.psu_index]['num'] + self.psu_i2c_addr = PSU_CPLD_I2C_MAPPING[self.psu_index]['addr'] + self.psu_cpld_path = I2C_PATH.format( + self.psu_i2c_num, self.psu_i2c_addr) + + FanBase.__init__(self) + + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + if not self.is_psu_fan: + dir_str = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_direction') + val=self._api_helper.read_txt_file(dir_str) + if val is not None: #F2B is FAN_DIRECTION_EXHAUST + direction = self.FAN_DIRECTION_EXHAUST if ( + val == "0") else self.FAN_DIRECTION_INTAKE + else: + direction=self.FAN_DIRECTION_EXHAUST + + else: #For PSU + direction=self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed = 0 + if self.is_psu_fan: + psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_speed_rpm') + fan_speed_rpm = self._api_helper.read_txt_file(psu_fan_path) + if fan_speed_rpm is not None: + speed = (int(fan_speed_rpm,10))*100/26688 + if speed > 100: + speed=100 + else: + return 0 + elif self.get_presence(): + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, '_duty_cycle_percentage') + speed=self._api_helper.read_txt_file(speed_path) + if speed is None: + return 0 + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + Note: + speed_pc = pwm_target/255*100 + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + return self.get_speed() + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + """ + + if not self.is_psu_fan and self.get_presence(): + speed_path = "{}{}".format(CPLD_FAN_I2C_PATH, '_duty_cycle_percentage') + return self._api_helper.write_txt_file(speed_path, int(speed)) + + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False #Not supported + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_presence() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index*2 + self.fan_index] \ + if not self.is_psu_fan \ + else "PSU-{} FAN-{}".format(self.psu_index+1, self.fan_index+1) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + present_path = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_present') + val=self._api_helper.read_txt_file(present_path) + if not self.is_psu_fan: + if val is not None: + return int(val, 10)==1 + else: + return False + else: + return True + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu_fan: + psu_fan_path= "{}{}".format(self.psu_hwmon_path, 'psu_fan1_fault') + val=self._api_helper.read_txt_file(psu_fan_path) + if val is not None: + return int(val, 10)==0 + else: + return False + else: + path = "{}{}{}".format(CPLD_FAN_I2C_PATH, self.fan_tray_index+1, '_fault') + val=self._api_helper.read_txt_file(path) + if val is not None: + return int(val, 10)==0 + else: + return False + + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fan_index+1) \ + if not self.is_psu_fan else (self.psu_index+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan_drawer.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..17d339ee55f6 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/fan_drawer.py @@ -0,0 +1,90 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 + + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self._fan_list[0].get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + If the agent cannot determine the parent-relative position + for some reason, or if the associated value of + entPhysicalContainedIn is'0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device + or -1 if cannot determine the position + """ + return (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/helper.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/helper.py new file mode 100644 index 000000000000..b124ca29f0df --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/helper.py @@ -0,0 +1,117 @@ +import os +import struct +import subprocess +from mmap import * +from sonic_py_common import device_info + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except Exception: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except Exception: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except Exception: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r', errors='replace') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except IOError: + return False + return True + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = "ipmitool raw {} {}".format(str(netfn), str(cmd)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = "ipmitool fru print {}".format(str( + id)) if not key else "ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key)) + + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = "ipmitool sensor thresh '{}' {} {}".format(str(id), str(threshold_key), str(value)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/platform.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/platform.py new file mode 100644 index 000000000000..2f2c2a447fcf --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/platform.py @@ -0,0 +1,21 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/psu.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/psu.py new file mode 100644 index 000000000000..53dd058bbac7 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/psu.py @@ -0,0 +1,283 @@ +############################################################################# +# Edgecore +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.thermal import Thermal + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +I2C_PATH ="/sys/bus/i2c/devices/{0}-00{1}/" + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] +PSU_NUM_FAN = [1, 1] +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "53" + }, + 1: { + "num": 9, + "addr": "50" + }, +} + +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "5b" + }, + 1: { + "num": 9, + "addr": "58" + }, +} + +NUM_FAN_TRAY = 4 + +class Psu(PsuBase): + """Platform-specific Psu class""" + def __init__(self, psu_index=0): + PsuBase.__init__(self) + self.index = psu_index + self._api_helper = APIHelper() + + self.i2c_num = PSU_HWMON_I2C_MAPPING[self.index]["num"] + self.i2c_addr = PSU_HWMON_I2C_MAPPING[self.index]["addr"] + self.hwmon_path = I2C_PATH.format(self.i2c_num, self.i2c_addr) + + self.i2c_num = PSU_CPLD_I2C_MAPPING[self.index]["num"] + self.i2c_addr = PSU_CPLD_I2C_MAPPING[self.index]["addr"] + self.cpld_path = I2C_PATH.format(self.i2c_num, self.i2c_addr) + + self.__initialize_fan() + + def __initialize_fan(self): + from sonic_platform.fan import Fan + self._fan_list.append( + Fan(NUM_FAN_TRAY + self.index, + is_psu_fan=True, + psu_index=self.index)) + self._thermal_list.append(Thermal(is_psu=True, psu_index=self.index)) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + return fd.read().strip() + except IOError: + pass + return None + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_v_out') + vout_val=self._api_helper.read_txt_file(vout_path) + + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + iout_path = "{}{}".format(self.hwmon_path, 'psu_i_out') + val=self._api_helper.read_txt_file(iout_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + pout_path = "{}{}".format(self.hwmon_path, 'psu_p_out') + val=self._api_helper.read_txt_file(pout_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + + return False #Controlled by HW + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_status() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_path = "{}{}".format(self.hwmon_path, 'psu_temp1_input') + val=self._api_helper.read_txt_file(temp_path) + if val is not None: + return float(val)/1000 + else: + return 0 + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return False #Not supported + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_mfr_vout_max') + vout_val=self._api_helper.read_txt_file(vout_path) + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + vout_path = "{}{}".format(self.hwmon_path, 'psu_mfr_vout_min') + vout_val=self._api_helper.read_txt_file(vout_path) + if vout_val is not None: + return float(vout_val)/ 1000 + else: + return 0 + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + presence_path="{}{}".format(self.cpld_path, 'psu_present') + val=self._api_helper.read_txt_file(presence_path) + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + power_path="{}{}".format(self.cpld_path, 'psu_power_good') + val=self._api_helper.read_txt_file(power_path) + if val is not None: + return int(val, 10) == 1 + else: + return 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model_path="{}{}".format(self.hwmon_path, 'psu_mfr_model') + val=self._api_helper.read_txt_file(model_path) + if val is None: + return "N/A" + model=val[1:] + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial_path="{}{}".format(self.hwmon_path, 'psu_mfr_serial') + val=self._api_helper.read_txt_file(serial_path) + if val is None: + return "N/A" + serial=val[1:] + + return serial + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/sfp.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..01e568ef3e78 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/sfp.py @@ -0,0 +1,506 @@ +############################################################################# +# Edgecore +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import os +import time +import sys + +from ctypes import create_string_buffer + +try: + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + from .helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_I2C_PATH = "/sys/bus/i2c/devices/19-0060/" + + +class Sfp(SfpOptoeBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 1 + PORT_END = 64 + + # Path to sysfs + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + HOST_CHK_CMD = "which systemctl > /dev/null 2>&1" + + PLATFORM = "x86_64-accton_as7816_64x-r0" + HWSKU = "Accton-AS7816-64X" + + _port_to_i2c_mapping = { + 61: 25, + 62: 26, + 63: 27, + 64: 28, + 55: 29, + 56: 30, + 53: 31, + 54: 32, + 9: 33, + 10: 34, + 11: 35, + 12: 36, + 1: 37, + 2: 38, + 3: 39, + 4: 40, + 6: 41, + 5: 42, + 8: 43, + 7: 44, + 13: 45, + 14: 46, + 15: 47, + 16: 48, + 17: 49, + 18: 50, + 19: 51, + 20: 52, + 25: 53, + 26: 54, + 27: 55, + 28: 56, + 29: 57, + 30: 58, + 31: 59, + 32: 60, + 21: 61, + 22: 62, + 23: 63, + 24: 64, + 41: 65, + 42: 66, + 43: 67, + 44: 68, + 33: 69, + 34: 70, + 35: 71, + 36: 72, + 45: 73, + 46: 74, + 47: 75, + 48: 76, + 37: 77, + 38: 78, + 39: 79, + 40: 80, + 57: 81, + 58: 82, + 59: 83, + 60: 84, + 49: 85, + 50: 86, + 51: 87, + 52: 88 + } + + def __init__(self, sfp_index=0): + SfpOptoeBase.__init__(self) + self._api_helper=APIHelper() + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + # Init eeprom path + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' + self.port_to_eeprom_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) + + def get_eeprom_path(self): + return self.port_to_eeprom_mapping[self.port_num] + + def __is_host(self): + return os.system(self.HOST_CHK_CMD) == 0 + + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) + hwsku_path = "/".join([platform_path, self.HWSKU] + ) if self.__is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except Exception: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + reset_path="{}{}{}".format(CPLD_I2C_PATH , "module_reset_" , str(self.port_num)) + val = self._api_helper.read_txt_file(reset_path) + + if val is not None: + return int(val, 10) == 1 + else: + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + + rx_los_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_RX_LOS_STATUS_OFFSET, QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence() else None + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + return rx_los_list + else: + return [False]*4 + + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) if self.get_presence() else None + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + return tx_fault_list + else: + return [False]*4 + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX1Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX2Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX3Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX4Disable']['value']) + return tx_disable_list + else: + return [False]*4 + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_list = self.get_tx_disable() + if tx_disable_list is None: + return 0 + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + + power_set=self.get_power_set() + power_override = self.get_power_override() + return power_set and power_override + + def get_power_set(self): + power_set = False + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + power_set = ( + 'On' == dom_control_data['data']['PowerSet']['value']) + + return power_set + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + power_override = False + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + + return power_override + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + reset_path = "{}{}{}".format(CPLD_I2C_PATH , 'module_reset_' , self.port_num) + ret = self._api_helper.write_txt_file(reset_path, 1) + if ret is not True: + return ret + + time.sleep(0.01) + ret = self._api_helper.write_txt_file(reset_path, 0) + time.sleep(0.2) + + return ret + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + if not self.get_presence(): + return False + sysfsfile_eeprom = None + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = tx_disable_ctl + else: + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print ('Error: unable to open file: ',str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + + return True + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + if not self.get_presence(): + return False + + sysfsfile_eeprom = None + try: + channel_state = self.get_tx_disable_channel() + for i in range(4): + channel_mask = (1 << i) + if not (channel & channel_mask): + continue + + if disable: + channel_state |= channel_mask + else: + channel_state &= ~channel_mask + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = channel_state + else: + buffer[0] = chr(channel_state) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print ('Error: unable to open file: ', str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + if lpmode: + self.set_power_override(True, True) + else: + self.set_power_override(False, False) + + return True + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + + if not self.get_presence(): + return False + try: + power_override_bit = (1 << 0) if power_override else 0 + power_set_bit = (1 << 1) if power_set else (1 << 3) + + buffer = create_string_buffer(1) + if sys.version_info[0] >= 3: + buffer[0] = (power_override_bit | power_set_bit) + else: + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as fd: + fd.seek(QSFP_POWEROVERRIDE_OFFSET) + fd.write(buffer[0]) + time.sleep(0.01) + except Exception: + print ('Error: unable to open file: ', str(e)) + return False + + return True + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + present_path = "{}{}{}".format(CPLD_I2C_PATH , '/module_present_' , self.port_num) + val=self._api_helper.read_txt_file(present_path) + if val is not None: + return int(val, 10)==1 + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.port_num + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/thermal.py b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/thermal.py new file mode 100644 index 000000000000..34256bf8c244 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/sonic_platform/thermal.py @@ -0,0 +1,236 @@ +############################################################################# +# Edgecore +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path +import glob + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_I2C_PATH = "/sys/bus/i2c/devices/{}-00{}/" + +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "5b" + }, + 1: { + "num": 9, + "addr": "58" + }, +} + +PSU_CPLD_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "53" + }, + 1: { + "num": 9, + "addr": "50" + }, +} + +THERMAL_NAME_LIST = ["Temp sensor 1", "Temp sensor 2", "Temp sensor 3", + "Temp sensor 4", "Temp sensor 5", "Temp sensor 6"] + +PSU_THERMAL_NAME_LIST = ["PSU-1 temp sensor 1", "PSU-2 temp sensor 2"] + +SYSFS_PATH = "/sys/bus/i2c/devices" + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + def __init__(self, thermal_index=0, is_psu=False, psu_index=0): + self.index = thermal_index + self.is_psu = is_psu + self.psu_index = psu_index + + if self.is_psu: + psu_i2c_bus = PSU_HWMON_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_HWMON_I2C_MAPPING[psu_index]["addr"] + self.psu_hwmon_path = PSU_I2C_PATH.format(psu_i2c_bus, + psu_i2c_addr) + psu_i2c_bus = PSU_CPLD_I2C_MAPPING[psu_index]["num"] + psu_i2c_addr = PSU_CPLD_I2C_MAPPING[psu_index]["addr"] + self.cpld_path = PSU_I2C_PATH.format(psu_i2c_bus, psu_i2c_addr) + + # Set hwmon path + i2c_path = { + 0: "18-0048/hwmon/hwmon*/", + 1: "18-0049/hwmon/hwmon*/", + 2: "18-004a/hwmon/hwmon*/", + 3: "18-004b/hwmon/hwmon*/", + 4: "17-004d/hwmon/hwmon*/", + 5: "17-004d/hwmon/hwmon*/" + }.get(self.index, None) + + self.hwmon_path = "{}/{}".format(SYSFS_PATH, i2c_path) + self.ss_key = THERMAL_NAME_LIST[self.index] + self.ss_index = 1 + + def __read_txt_file(self, file_path): + for filename in glob.glob(file_path): + try: + with open(filename, 'r') as fd: + data =fd.readline().rstrip() + return data + except IOError as e: + pass + + return None + + def __get_temp(self, temp_file): + if not self.is_psu: + temp_file_path = os.path.join(self.hwmon_path, temp_file) + else: + temp_file_path = temp_file + raw_temp = self.__read_txt_file(temp_file_path) + if raw_temp is not None: + return float(raw_temp)/1000 + else: + return 0 + + def __set_threshold(self, file_name, temperature): + if self.is_psu: + return True + temp_file_path = os.path.join(self.hwmon_path, file_name) + for filename in glob.glob(temp_file_path): + try: + with open(filename, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError as e: + print("IOError") + return False + + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + if not self.is_psu: + temp_file = "temp{}_input".format(self.ss_index) + else: + temp_file = self.psu_hwmon_path + "psu_temp1_input" + return self.__get_temp(temp_file) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.is_psu: + return 80 + + temp_file = "temp{}_max".format(self.ss_index) + return self.__get_temp(temp_file) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if not + """ + temp_file = "temp{}_max".format(self.ss_index) + temperature = temperature *1000 + self.__set_threshold(temp_file, temperature) + + return True + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + if self.is_psu: + return PSU_THERMAL_NAME_LIST[self.psu_index] + else: + return THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the Thermal + Returns: + bool: True if Thermal is present, False if not + """ + if self.is_psu: + val = self.__read_txt_file(self.cpld_path + "psu_present") + return int(val, 10) == 1 + temp_file = "temp{}_input".format(self.ss_index) + temp_file_path = os.path.join(self.hwmon_path, temp_file) + raw_txt = self.__read_txt_file(temp_file_path) + if raw_txt is not None: + return True + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.is_psu: + temp_file = self.psu_hwmon_path + "psu_temp_fault" + return self.get_presence() and (not int( + self.__read_txt_file(temp_file))) + + file_str = "temp{}_input".format(self.ss_index) + file_path = os.path.join(self.hwmon_path, file_str) + raw_txt = self.__read_txt_file(file_path) + if raw_txt is None: + return False + else: + return int(raw_txt) != 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return self.index+1 + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False diff --git a/device/accton/x86_64-accton_as7816_64x-r0/system_health_monitoring_config.json b/device/accton/x86_64-accton_as7816_64x-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..92be29dfdea6 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/system_health_monitoring_config.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu.temperature" + + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "STATUS_LED_COLOR_RED", + "normal": "STATUS_LED_COLOR_GREEN", + "booting": "STATUS_LED_COLOR_GREEN" + } +} diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/Makefile old mode 100755 new mode 100644 index f845f2e17d86..41953f866b6c --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/Makefile @@ -4,10 +4,7 @@ obj-m:= x86-64-accton-as4630-54pe-cpld.o x86-64-accton-as4630-54pe-psu.o \ else ifeq (,$(KERNEL_SRC)) -#$(error KERNEL_SRC is not defined) -KVERSION=3.16.0-8-amd64 -KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ -KERNELDIR:=$(KERNEL_DIR) +$(error KERNEL_SRC is not defined) else KERNELDIR:=$(KERNEL_SRC) endif diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-cpld.c b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-cpld.c old mode 100755 new mode 100644 index 3a3c594f9fa8..0e9fc11aca81 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-cpld.c +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-cpld.c @@ -598,7 +598,6 @@ static u8 is_fan_fault(struct as4630_54pe_cpld_data *data, enum fan_id id) return ret; } - static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, char *buf) { diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c index 34c22fd82aa1..e758dd5cc47b 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-leds.c @@ -64,7 +64,7 @@ static struct accton_as4630_54pe_led_data *ledctl = NULL; #define LED_TYPE_POE_REG_MASK (0x2|0x1) #define LED_MODE_POE_GREEN_VALUE 0x1 #define LED_MODE_POE_AMBER_VALUE 0x2 -#define LED_MODE_POE_OFF_VALUE 0x0 +#define LED_MODE_POE_OFF_VALUE 0x3 #define LED_TYPE_STK1_REG_MASK 0x20 #define LED_MODE_STK1_GREEN_VALUE 0x0 @@ -74,20 +74,20 @@ static struct accton_as4630_54pe_led_data *ledctl = NULL; #define LED_MODE_STK2_GREEN_VALUE 0x0 #define LED_MODE_STK2_OFF_VALUE 0x10 -#define LED_TYPE_FAN_REG_MASK (0x20|0x10) -#define LED_MODE_FAN_AMBER_VALUE 0x20 -#define LED_MODE_FAN_GREEN_VALUE 0x10 -#define LED_MODE_FAN_OFF_VALUE (0x0) +#define LED_TYPE_FAN_REG_MASK (0x8|0x4) +#define LED_MODE_FAN_AMBER_VALUE 0x8 +#define LED_MODE_FAN_GREEN_VALUE 0x4 +#define LED_MODE_FAN_OFF_VALUE (0xC) -#define LED_TYPE_PSU2_REG_MASK (0x8|0x4) -#define LED_MODE_PSU2_AMBER_VALUE 0x8 -#define LED_MODE_PSU2_GREEN_VALUE 0x4 -#define LED_MODE_PSU2_OFF_VALUE (0x0) +#define LED_TYPE_PSU2_REG_MASK (0x80|0x40) +#define LED_MODE_PSU2_AMBER_VALUE 0x80 +#define LED_MODE_PSU2_GREEN_VALUE 0x40 +#define LED_MODE_PSU2_OFF_VALUE (0xC0) #define LED_TYPE_PSU1_REG_MASK (0x2|0x1) #define LED_MODE_PSU1_AMBER_VALUE 0x2 #define LED_MODE_PSU1_GREEN_VALUE 0x1 -#define LED_MODE_PSU1_OFF_VALUE (0x0) +#define LED_MODE_PSU1_OFF_VALUE (0x3) enum led_type { LED_TYPE_DIAG, @@ -106,8 +106,8 @@ struct led_reg { }; static const struct led_reg led_reg_map[] = { - {(1<reg_val[0]); + return led_reg_val_to_light_mode(LED_TYPE_FAN, ledctl->reg_val[1]); } static void accton_as4630_54pe_led_psu1_set(struct led_classdev *led_cdev, @@ -395,7 +395,7 @@ static void accton_as4630_54pe_led_psu2_set(struct led_classdev *led_cdev, static enum led_brightness accton_as4630_54pe_led_psu2_get(struct led_classdev *cdev) { accton_as4630_54pe_led_update(); - return led_reg_val_to_light_mode(LED_TYPE_PSU2, ledctl->reg_val[0]); + return led_reg_val_to_light_mode(LED_TYPE_PSU2, ledctl->reg_val[1]); } static struct led_classdev accton_as4630_54pe_leds[] = { @@ -405,7 +405,7 @@ static struct led_classdev accton_as4630_54pe_leds[] = { .brightness_set = accton_as4630_54pe_led_diag_set, .brightness_get = accton_as4630_54pe_led_diag_get, .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_GREEN, + .max_brightness = LED_MODE_GREEN_BLINK, }, [LED_TYPE_PRI] = { .name = "pri", diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-psu.c b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/modules/x86-64-accton-as4630-54pe-psu.c old mode 100755 new mode 100644 diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-pddf-platform-monitor.service deleted file mode 100644 index 99bca2684f4d..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-pddf-platform-monitor.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Accton AS4630-54PE Platform Monitoring service -Before=pmon.service -After=pddf-platform-init.service -DefaultDependencies=no - -[Service] -ExecStart=/usr/local/bin/accton_as4630_54pe_pddf_monitor.py -KillSignal=SIGKILL -SuccessExitStatus=SIGKILL - -# Resource Limitations -LimitCORE=infinity - -[Install] -WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-platform-handle-mgmt-interface.service b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-platform-handle-mgmt-interface.service new file mode 100644 index 000000000000..d978b1fe6845 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/as4630-54pe-platform-handle-mgmt-interface.service @@ -0,0 +1,11 @@ +[Unit] +Description=Accton AS4630-54PE Platform handle management interface service +After=sysinit.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/local/bin/handle_mgmt_interface.sh + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c5e..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py index 59dad237f3b4..553325484a92 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py @@ -1,14 +1,23 @@ from setuptools import setup +DEVICE_NAME = 'accton' +HW_SKU = 'x86_64-accton_as4630_54pe-r0' + setup( name='sonic-platform', version='1.0', - description='SONiC platform API implementation on Accton Platforms using PDDF', + description='SONiC platform API implementation on Accton Platforms', license='Apache 2.0', author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - packages=['sonic_platform'], + maintainer='Jostar Yang', + maintainer_email='jostar_yang@edge-core.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py index 66599ad88ad6..b954da8726d2 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/accton_as4630_54pe_util.py @@ -30,6 +30,7 @@ import sys import logging import time +import os PROJECT_NAME = 'as4630_54pe' version = '0.0.1' @@ -88,8 +89,8 @@ if DEBUG == True: - print((sys.argv[0])) - print(('ARGV :', sys.argv[1:])) + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): @@ -107,7 +108,7 @@ def main(): if DEBUG == True: print(options) print(args) - print((len(sys.argv))) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -124,6 +125,10 @@ def main(): do_install() elif arg == 'clean': do_uninstall() + elif arg == 'api': + do_sonic_platform_install() + elif arg == 'api_clean': + do_sonic_platform_clean() else: show_help() @@ -131,12 +136,12 @@ def main(): return 0 def show_help(): - print(( __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})) + print( __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def my_log(txt): if DEBUG == True: - print(("[ACCTON DBG]: ",txt)) + print("[ACCTON DBG]: ",txt) return def log_os_system(cmd, show): @@ -150,7 +155,7 @@ def log_os_system(cmd, show): if status: logging.info('Failed :'+cmd) if show: - print(('Failed :'+cmd)) + print('Failed :'+cmd) return status, output def driver_inserted(): @@ -168,7 +173,7 @@ def driver_inserted(): 'modprobe i2c_dev', 'modprobe i2c_i801', 'modprobe i2c_ismt', -'modprobe i2c_mux_pca954x', +'modprobe i2c_mux_pca954x force_deselect_on_exit=1', 'modprobe ym2651y', 'modprobe x86_64_accton_as4630_54pe_cpld', 'modprobe x86_64_accton_as4630_54pe_leds', @@ -285,6 +290,44 @@ def system_ready(): return False return True +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +PLATFORM_API2_WHL_FILE_PY3 ='sonic_platform-1.0-py3-none-any.whl' +def do_sonic_platform_install(): + device_path = "{}{}{}{}".format(PLATFORM_ROOT_PATH, '/x86_64-accton_', PROJECT_NAME, '-r0') + SONIC_PLATFORM_BSP_WHL_PKG_PY3 = "/".join([device_path, PLATFORM_API2_WHL_FILE_PY3]) + + #Check API2.0 on py whl file + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + if os.path.exists(SONIC_PLATFORM_BSP_WHL_PKG_PY3): + status, output = log_os_system("pip3 install "+ SONIC_PLATFORM_BSP_WHL_PKG_PY3, 1) + if status: + print ("Error: Failed to install {}".format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print("Successfully installed {} package".format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} is not found'.format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} has installed'.format(PLATFORM_API2_WHL_FILE_PY3)) + + return + +def do_sonic_platform_clean(): + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + print('{} does not install, not need to uninstall'.format(PLATFORM_API2_WHL_FILE_PY2)) + + else: + status, output = log_os_system("pip3 uninstall sonic-platform -y", 0) + if status: + print('Error: Failed to uninstall {}'.format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print('{} is uninstalled'.format(PLATFORM_API2_WHL_FILE_PY3)) + + return + def do_install(): if driver_inserted() == False: status = driver_install() @@ -292,25 +335,28 @@ def do_install(): if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" drivers detected....")) + print(PROJECT_NAME.upper()+" drivers detected....") if not device_exist(): status = device_install() if status: if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" devices detected....")) + print(PROJECT_NAME.upper()+" devices detected....") for i in range(len(cpld_set)): status, output = log_os_system(cpld_set[i], 1) if status: if FORCE == 0: return status + + do_sonic_platform_install() + return def do_uninstall(): if not device_exist(): - print((PROJECT_NAME.upper()+" has no device installed....")) + print(PROJECT_NAME.upper()+" has no device installed....") else: print("Removing device....") status = device_uninstall() @@ -319,7 +365,7 @@ def do_uninstall(): return status if driver_inserted()== False : - print((PROJECT_NAME.upper()+" has no driver installed....")) + print(PROJECT_NAME.upper()+" has no driver installed....") else: print("Removing installed driver....") status = driver_uninstall() @@ -327,6 +373,8 @@ def do_uninstall(): if FORCE == 0: return status + do_sonic_platform_clean() + return def device_exist(): diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/handle_mgmt_interface.sh b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/handle_mgmt_interface.sh new file mode 100755 index 000000000000..e1acd16a0161 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/utils/handle_mgmt_interface.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +#Due to the hardware design, as4630-54pe use "eth2" instead of "eth0" as management interface. +#Rename netdev "eth0" and "eth2" to swap original "eth2" to "eth0". + +ifconfig eth0 down +ip link set eth0 name eth3 +ip link set eth2 name eth0 +ifconfig eth0 up diff --git a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/fanutil.py b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/fanutil.py index e60236c9c781..b8b4820f9e4a 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/fanutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/fanutil.py @@ -104,7 +104,7 @@ def _get_fan_node_val(self, fan_num, node_num): return None try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None @@ -135,7 +135,7 @@ def _set_fan_node_val(self, fan_num, node_num, val): val_file.write(content) try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None @@ -224,14 +224,3 @@ def get_fan_status(self, fan_num): return True -#def main(): -# fan = FanUtil() -# -# print 'get_size_node_map : %d' % fan.get_size_node_map() -# print 'get_size_path_map : %d' % fan.get_size_path_map() -# for x in range(fan.get_idx_fan_start(), fan.get_num_fans()+1): -# for y in range(fan.get_idx_node_start(), fan.get_num_nodes()+1): -# print fan.get_fan_to_device_path(x, y) -# -#if __name__ == '__main__': -# main() diff --git a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/thermalutil.py b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/thermalutil.py index ceb9ab464026..4e8ef9adcbe7 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/thermalutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/classes/thermalutil.py @@ -22,7 +22,6 @@ # ------------------------------------------------------------------ try: - import os import time import logging import glob @@ -34,7 +33,7 @@ class ThermalUtil(object): """Platform-specific ThermalUtil class""" THERMAL_NUM_MAX = 4 - THERMAL_NUM_1_IDX = 1 # 1_ON_CPU_BROAD. LM75 + THERMAL_NUM_1_IDX = 1 # 1_ON_CPU_BROAD. LM75 THERMAL_NUM_2_IDX = 2 # 2_ON_MAIN_BROAD. LM75 THERMAL_NUM_3_IDX = 3 # 3_ON_MAIN_BROAD. LM75 THERMAL_NUM_4_IDX = 4 # 4_ON_MAIN_BROAD. LM75 @@ -42,88 +41,52 @@ class ThermalUtil(object): """ Dictionary where key1 = thermal id index (integer) starting from 1 value = path to fan device file (string) """ - #_thermal_to_device_path_mapping = {} - - _thermal_to_device_node_mapping = { - THERMAL_NUM_1_IDX: ['18', '4b'], - THERMAL_NUM_2_IDX: ['19', '4c'], - THERMAL_NUM_3_IDX: ['20', '49'], - THERMAL_NUM_4_IDX: ['21', '4a'], - } + thermal_sysfspath ={ - THERMAL_NUM_1_IDX: ["/sys/bus/i2c/devices/18-004b/hwmon/hwmon3/temp1_input"], - THERMAL_NUM_2_IDX: ["/sys/bus/i2c/devices/19-004c/hwmon/hwmon4/temp1_input"], - THERMAL_NUM_3_IDX: ["/sys/bus/i2c/devices/20-0049/hwmon/hwmon5/temp1_input"], - THERMAL_NUM_4_IDX: ["/sys/bus/i2c/devices/21-004a/hwmon/hwmon6/temp1_input"], + THERMAL_NUM_1_IDX: ["/sys/bus/i2c/devices/18-004b/hwmon/hwmon*/temp1_input"], + THERMAL_NUM_2_IDX: ["/sys/bus/i2c/devices/19-004c/hwmon/hwmon*/temp1_input"], + THERMAL_NUM_3_IDX: ["/sys/bus/i2c/devices/20-0049/hwmon/hwmon*/temp1_input"], + THERMAL_NUM_4_IDX: ["/sys/bus/i2c/devices/21-004a/hwmon/hwmon*/temp1_input"], } - #def __init__(self): - def _get_thermal_val(self, thermal_num): + def get_thermal_val(self, thermal_num): if thermal_num < self.THERMAL_NUM_1_IDX or thermal_num > self.THERMAL_NUM_MAX: logging.debug('GET. Parameter error. thermal_num, %d', thermal_num) return None - device_path = self.get_thermal_to_device_path(thermal_num) - if(os.path.isfile(device_path)): - for filename in glob.glob(device_path): - try: - val_file = open(filename, 'r') - except IOError as e: - logging.error('GET. unable to open file: %s', str(e)) - return None + device_path = self.get_thermal_path(thermal_num) + for filename in glob.glob(device_path): + try: + val_file = open(filename, 'r') + except IOError as e: + logging.error('GET. unable to open file: %s', str(e)) + return None content = val_file.readline().rstrip() if content == '': logging.debug('GET. content is NULL. device_path:%s', device_path) return None try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None return int(content) - - else: - print("No such device_path=%s"%device_path) - return 0 + + return 0 def get_num_thermals(self): return self.THERMAL_NUM_MAX - - def get_idx_thermal_start(self): - return self.THERMAL_NUM_1_IDX - - def get_size_node_map(self): - return len(self._thermal_to_device_node_mapping) - - def get_size_path_map(self): - return len(self.thermal_sysfspath) - - def get_thermal_to_device_path(self, thermal_num): + + def get_thermal_path(self, thermal_num): return self.thermal_sysfspath[thermal_num][0] - def get_thermal_1_val(self): - return self._get_thermal_val(self.THERMAL_NUM_1_IDX) - - def get_thermal_2_val(self): - return self._get_thermal_val(self.THERMAL_NUM_2_IDX) - - def get_thermal_3_val(self): - return self._get_thermal_val(self.THERMAL_NUM_3_IDX) - - def get_thermal_temp(self): - return (self._get_thermal_val(self.THERMAL_NUM_1_IDX) + self._get_thermal_val(self.THERMAL_NUM_2_IDX) +self._get_thermal_val(self.THERMAL_NUM_3_IDX)) - def main(): thermal = ThermalUtil() - print("termal1=%d" %thermal._get_thermal_val(1)) - print("termal2=%d" %thermal._get_thermal_val(2)) - print("termal3=%d" %thermal._get_thermal_val(3)) - print("termal4=%d" %thermal._get_thermal_val(4)) -# -# print 'get_size_node_map : %d' % thermal.get_size_node_map() -# print 'get_size_path_map : %d' % thermal.get_size_path_map() -# for x in range(thermal.get_idx_thermal_start(), thermal.get_num_thermals()+1): -# print thermal.get_thermal_to_device_path(x) -# + logging.basicConfig(level=logging.DEBUG) + logging.debug('thermal1=%d', thermal.get_thermal_val(1)) + logging.debug('thermal2=%d', thermal.get_thermal_val(2)) + logging.debug('thermal3=%d', thermal.get_thermal_val(3)) + logging.debug('thermal4=%d', thermal.get_thermal_val(4)) + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_monitor.py b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_monitor.py index e3b3fe742db9..49a12cd51ece 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_monitor.py +++ b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_monitor.py @@ -91,11 +91,11 @@ def manage_fans(self): thermal = ThermalUtil() fan = FanUtil() - temp2 = thermal.get_thermal_2_val() + temp2 = thermal.get_thermal_val(2) if temp2 is None: return False - temp3 = thermal.get_thermal_3_val() + temp3 = thermal.get_thermal_val(3) if temp3 is None: return False diff --git a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py index 79b1e730ee9e..5292d1ec3b18 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as5835-54x/utils/accton_as5835_54x_util.py @@ -48,8 +48,8 @@ if DEBUG == True: - print((sys.argv[0])) - print(("ARGV :", sys.argv[1:])) + print(sys.argv[0]) + print("ARGV :", sys.argv[1:]) def main(): @@ -67,7 +67,7 @@ def main(): if DEBUG == True: print(options) print(args) - print((len(sys.argv))) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -96,13 +96,13 @@ def main(): return 0 def show_help(): - print((__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})) + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def my_log(txt): if DEBUG == True: - print(("[Debug]"+txt)) + print("[Debug]"+txt) return def log_os_system(cmd, show): @@ -113,7 +113,7 @@ def log_os_system(cmd, show): if status: logging.info('Failed :'+cmd) if show: - print(('Failed :'+cmd)) + print('Failed :'+cmd) return status, output def driver_check(): @@ -295,6 +295,10 @@ def device_install(): for i in range(49, 55): #Set qsfp port to normal state log_os_system("echo 0 > /sys/bus/i2c/devices/3-0062/module_reset_" + str(i), 1) + for i in range(1, 39): #Set disable tx_disable to sfp port + log_os_system("echo 0 > /sys/bus/i2c/devices/3-0061/module_tx_disable_" + str(i), 1) + for i in range(39, 49): #Set disable tx_disable to sfp port + log_os_system("echo 0 > /sys/bus/i2c/devices/3-0062/module_tx_disable_" + str(i), 1) for i in range(0,len(sfp_map)): if i < qsfp_start: @@ -358,31 +362,29 @@ def do_sonic_platform_install(): if os.path.exists(SONIC_PLATFORM_BSP_WHL_PKG_PY3): status, output = log_os_system("pip3 install "+ SONIC_PLATFORM_BSP_WHL_PKG_PY3, 1) if status: - print(("Error: Failed to install {}".format(PLATFORM_API2_WHL_FILE_PY3) )) + print("Error: Failed to install {}".format(PLATFORM_API2_WHL_FILE_PY3) ) return status else: - print(("Successfully installed {} package".format(PLATFORM_API2_WHL_FILE_PY3) )) + print("Successfully installed {} package".format(PLATFORM_API2_WHL_FILE_PY3) ) else: - print(('{} is not found'.format(PLATFORM_API2_WHL_FILE_PY3))) + print('{} is not found'.format(PLATFORM_API2_WHL_FILE_PY3)) else: - print(('{} has installed'.format(PLATFORM_API2_WHL_FILE_PY3))) + print('{} has installed'.format(PLATFORM_API2_WHL_FILE_PY3)) return def do_sonic_platform_clean(): status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) if status: - print(('{} does not install, not need to uninstall'.format(PLATFORM_API2_WHL_FILE_PY3))) + print('{} does not install, not need to uninstall'.format(PLATFORM_API2_WHL_FILE_PY3)) else: status, output = log_os_system("pip3 uninstall sonic-platform -y", 0) if status: - print(('Error: Failed to uninstall {}'.format(PLATFORM_API2_WHL_FILE_PY3))) + print('Error: Failed to uninstall {}'.format(PLATFORM_API2_WHL_FILE_PY3)) return status else: - print(('{} is uninstalled'.format(PLATFORM_API2_WHL_FILE_PY3))) - - return + print('{} is uninstalled'.format(PLATFORM_API2_WHL_FILE_PY3)) def do_install(): print("Checking system....") @@ -393,7 +395,7 @@ def do_install(): if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" drivers detected....")) + print(PROJECT_NAME.upper()+" drivers detected....") if not device_exist(): print("No device, installing....") status = device_install() @@ -401,7 +403,7 @@ def do_install(): if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" devices detected....")) + print(PROJECT_NAME.upper()+" devices detected....") do_sonic_platform_install() @@ -410,7 +412,7 @@ def do_install(): def do_uninstall(): print("Checking system....") if not device_exist(): - print((PROJECT_NAME.upper() +" has no device installed....")) + print(PROJECT_NAME.upper() +" has no device installed....") else: print("Removing device....") status = device_uninstall() @@ -419,7 +421,7 @@ def do_uninstall(): return status if driver_check()== False : - print((PROJECT_NAME.upper() +" has no driver installed....")) + print(PROJECT_NAME.upper() +" has no driver installed....") else: print("Removing installed driver....") status = driver_uninstall() diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py index affed9ad804d..7c994864318c 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/classes/fanutil.py @@ -112,7 +112,7 @@ def _get_fan_node_val(self, fan_num, node_num): return None try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None @@ -143,7 +143,7 @@ def _set_fan_node_val(self, fan_num, node_num, val): val_file.write(content) try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c index ed98daf2011a..035f9ad82ec8 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/accton_as7326_56x_leds.c @@ -146,7 +146,7 @@ static int accton_getLedReg(enum led_type type, u8 *reg) int i; for (i = 0; i < ARRAY_SIZE(led_reg_map); i++) { - if(led_reg_map[i].types ==type) { + if (led_reg_map[i].types ==type) { *reg = led_reg_map[i].reg_addr; return 0; } diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service deleted file mode 100644 index 03351824b7b4..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Accton AS7326-56X Platform Monitoring service -Before=pmon.service -After=pddf-platform-init.service -DefaultDependencies=no - -[Service] -ExecStart=/usr/local/bin/accton_as7326_pddf_monitor.py -KillSignal=SIGKILL -SuccessExitStatus=SIGKILL - -# Resource Limitations -LimitCORE=infinity - -[Install] -WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service index ac196c219b91..3d03ec4f1540 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-platform-handle_mac.service @@ -1,6 +1,6 @@ [Unit] Description=Accton AS7326-56X Platform MAC handle service -Before=opennsl-modules.service pddf-platform-init.service +Before=opennsl-modules.service After=local-fs.target [Service] diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c5e..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py index 22bd354ea686..15806d24fff0 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py @@ -1,5 +1,8 @@ from setuptools import setup +DEVICE_NAME = 'accton' +HW_SKU = 'x86_64-accton_as7326_56x-r0' + setup( name='sonic-platform', version='1.0', @@ -8,7 +11,11 @@ author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - packages=['sonic_platform'], + packages=[ + 'sonic_platform' + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py index 56f1bd585428..ec3a4c133cdd 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_monitor.py @@ -166,14 +166,14 @@ def manage_fans(self): thermal = ThermalUtil() fan = FanUtil() - fan_dir=fan.get_fan_dir(1) - if fan_dir > 1: - fan_dri=1 #something wrong, set fan_dir to default val - if fan_dir < 0: - fan_dri=1 #something wrong, set fan_dir to default val + #fan_dir=fan.get_fan_dir(1) + #if fan_dir > 1: + # fan_dri=1 #something wrong, set fan_dir to default val + #if fan_dir < 0: + # fan_dri=1 #something wrong, set fan_dir to default val ori_pwm=fan.get_fan_duty_cycle() new_pwm=0 - logging.debug('fan_dir=%d, ori_pwm=%d', fan_dir, ori_pwm) + #logging.debug('fan_dir=%d, ori_pwm=%d', fan_dir, ori_pwm) logging.debug('test_temp=%d', test_temp) if test_temp==0: temp1 = thermal._get_thermal_val(1) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py index 997f8a64359d..c3e1c50366b7 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/accton_as7326_util.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright (C) 2016 Accton Networks, Inc. # @@ -14,15 +14,6 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# -# -# Description: -# Due to adoption of optoe drivers, sideband signals of SFPs are moved -# into cpld drivers. Add a new dict, cpld_of_module, for mapping this -# attributes to corresponding cpld nodes. -# - - """ Usage: %(scriptName)s [options] command object @@ -34,18 +25,14 @@ command: install : install drivers and generate related sysfs nodes clean : uninstall drivers and remove related sysfs nodes - show : show all systen status - sff : dump SFP eeprom - set : change board setting with fan|led|sfp """ - import subprocess import getopt import sys import logging import re import time - +import os @@ -96,41 +83,21 @@ def main(): for arg in args: if arg == 'install': do_install() + elif arg == 'api': + do_sonic_platform_install() + elif arg == 'api_clean': + do_sonic_platform_clean() elif arg == 'clean': do_uninstall() - elif arg == 'show': - device_traversal() - elif arg == 'sff': - if len(args)!=2: - show_eeprom_help() - elif int(args[1]) ==0 or int(args[1]) > DEVICE_NO['sfp']: - show_eeprom_help() - else: - show_eeprom(args[1]) - return - elif arg == 'set': - if len(args)<3: - show_set_help() - else: - set_device(args[1:]) - return else: show_help() - - return 0 def show_help(): print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) -def show_set_help(): - cmd = sys.argv[0].split("/")[-1]+ " " + args[0] - print(cmd +" [led|sfp|fan]") - print(" use \""+ cmd + " led 0-4 \" to set led color") - print(" use \""+ cmd + " fan 0-100\" to set fan duty percetage") - print(" use \""+ cmd + " sfp 1-56 {0|1}\" to set sfp# tx_disable") - sys.exit(0) + def dis_i2c_ir3570a(addr): cmd = "i2cset -y 0 0x%x 0xE5 0x01" % addr @@ -156,11 +123,6 @@ def ir3570_check(): return ret -def show_eeprom_help(): - cmd = sys.argv[0].split("/")[-1]+ " " + args[0] - print(" use \""+ cmd + " 1-56 \" to dump sfp# eeprom") - sys.exit(0) - def my_log(txt): if DEBUG == True: print("[ROY]"+txt) @@ -174,7 +136,7 @@ def log_os_system(cmd, show): if status: logging.info('Failed :'+cmd) if show: - print(('Failed :'+cmd)) + print('Failed :'+cmd) return status, output def driver_check(): @@ -189,7 +151,7 @@ def driver_check(): kos = [ 'modprobe i2c_dev', -'modprobe i2c_mux_pca954x force_deselect_on_exit=1', +'modprobe i2c_mux_pca954x', 'modprobe accton_i2c_cpld' , 'modprobe ym2651y' , 'modprobe accton_as7326_56x_fan' , @@ -207,6 +169,8 @@ def driver_install(): if status: if FORCE == 0: return status + print("Done driver_install") + return 0 def driver_uninstall(): @@ -224,12 +188,8 @@ def driver_uninstall(): return status return 0 -led_prefix ='/sys/class/leds/accton_'+PROJECT_NAME+'_led::' -hwmon_types = {'led': ['diag','fan','loc','psu1','psu2']} -hwmon_nodes = {'led': ['brightness'] } -hwmon_prefix ={'led': led_prefix} - i2c_prefix = '/sys/bus/i2c/devices/' +''' i2c_bus = {'fan': ['11-0066'] , 'thermal': ['15-0048','15-0049', '15-004a', '15-004b'] , 'psu': ['17-0051','13-0053'], @@ -238,7 +198,7 @@ def driver_uninstall(): 'thermal': ['hwmon/hwmon*/temp1_input'] , 'psu': ['psu_present ', 'psu_power_good'] , 'sfp': ['module_present_', 'module_tx_disable_']} - +''' sfp_map = [ 42,41,44,43,47,45,46,50, 48,49,52,51,53,56,55,54, @@ -268,7 +228,6 @@ def driver_uninstall(): 'echo pca9548 0x74 > /sys/bus/i2c/devices/i2c-36/new_device', 'echo pca9548 0x75 > /sys/bus/i2c/devices/i2c-37/new_device', 'echo pca9548 0x76 > /sys/bus/i2c/devices/i2c-38/new_device', -'echo 24c04 0x56 > /sys/bus/i2c/devices/i2c-0/new_device', 'echo as7326_56x_fan 0x66 > /sys/bus/i2c/devices/i2c-11/new_device ', 'echo lm75 0x48 > /sys/bus/i2c/devices/i2c-15/new_device', @@ -286,12 +245,22 @@ def driver_uninstall(): mknod2 =[ ] +#EERPOM +eeprom_mknod =[ +'echo 24c04 0x56 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo 24c02 0x57 > /sys/bus/i2c/devices/i2c-0/new_device' +] def i2c_order_check(): # This project has only 1 i2c bus. return 0 +def eeprom_check(): + cmd = "i2cget -y -f 0 0x56" + status, output = subprocess.getstatusoutput(cmd) + return status + def device_install(): global FORCE @@ -320,6 +289,30 @@ def device_install(): print(output) if FORCE == 0: return status + + # set all pca954x idle_disconnect + cmd = 'echo -2 | tee /sys/bus/i2c/drivers/pca954x/*-00*/idle_state' + status, output = log_os_system(cmd, 1) + if status: + print(output) + if FORCE == 0: + return status + + # initiate IDPROM + # Close 0x77 mux to make sure if the I2C address of IDPROM is 0x56 or 0x57 + log_os_system("i2cset -f -y 0 0x77 0 ", 1) + ret=eeprom_check() + if ret==0: + log_os_system(eeprom_mknod[0], 1) #old board, 0x56 eeprom + time.sleep(0.2) + exists = os.path.isfile('/sys/bus/i2c/devices/0-0056/eeprom') + if (exists is False): + subprocess.call('echo 0x56 > /sys/bus/i2c/devices/i2c-0/delete_device', shell=True) + log_os_system(eeprom_mknod[1], 1) + else: + log_os_system(eeprom_mknod[1], 1) #new board, 0x57 eeprom + + for i in range(0,len(sfp_map)): if i < qsfp_start or i >= qsfp_end: status, output =log_os_system("echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/new_device", 1) @@ -329,6 +322,7 @@ def device_install(): print(output) if FORCE == 0: return status + print("Done device_install") return def device_uninstall(): @@ -364,6 +358,23 @@ def device_uninstall(): if FORCE == 0: return status + #Deal with for del 0x56 or 0x57 sysfs device + exists = os.path.isfile('/sys/bus/i2c/devices/0-0056/eeprom') + + if (exists is True): + target = eeprom_mknod[0] #0x56 + else: + target = eeprom_mknod[1] #0x57 + + temp = target.split() + del temp[1] + temp[-1] = temp[-1].replace('new_device', 'delete_device') + status, output = log_os_system(" ".join(temp), 1) + if status: + print(output) + if FORCE == 0: + return status + return def system_ready(): @@ -372,6 +383,44 @@ def system_ready(): if not device_exist(): return False return True +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +PLATFORM_API2_WHL_FILE_PY3 ='sonic_platform-1.0-py3-none-any.whl' +def do_sonic_platform_install(): + device_path = "{}{}{}{}".format(PLATFORM_ROOT_PATH, '/x86_64-accton_', PROJECT_NAME, '-r0') + SONIC_PLATFORM_BSP_WHL_PKG_PY3 = "/".join([device_path, PLATFORM_API2_WHL_FILE_PY3]) + + #Check API2.0 on py whl file + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + if os.path.exists(SONIC_PLATFORM_BSP_WHL_PKG_PY3): + status, output = log_os_system("pip3 install "+ SONIC_PLATFORM_BSP_WHL_PKG_PY3, 1) + if status: + print("Error: Failed to install {}".format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print("Successfully installed {} package".format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} is not found'.format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} has installed'.format(PLATFORM_API2_WHL_FILE_PY3)) + + return + +def do_sonic_platform_clean(): + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + print('{} does not install, not need to uninstall'.format(PLATFORM_API2_WHL_FILE_PY3)) + + else: + status, output = log_os_system("pip3 uninstall sonic-platform -y", 0) + if status: + print('Error: Failed to uninstall {}'.format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print('{} is uninstalled'.format(PLATFORM_API2_WHL_FILE_PY3)) + + + return def do_install(): print("Checking system....") @@ -394,6 +443,9 @@ def do_install(): return status else: print(PROJECT_NAME.upper()+" devices detected....") + + do_sonic_platform_install() + return def do_uninstall(): @@ -416,185 +468,8 @@ def do_uninstall(): if FORCE == 0: return status - return - -def devices_info(): - global DEVICE_NO - global ALL_DEVICE - global i2c_bus, hwmon_types - for key in DEVICE_NO: - ALL_DEVICE[key]= {} - for i in range(0,DEVICE_NO[key]): - ALL_DEVICE[key][key+str(i+1)] = [] - - for key in i2c_bus: - buses = i2c_bus[key] - nodes = i2c_nodes[key] - for i in range(0,len(buses)): - for j in range(0,len(nodes)): - if 'fan' == key: - for k in range(0,DEVICE_NO[key]): - node = key+str(k+1) - path = i2c_prefix+ buses[i]+"/fan"+str(k+1)+"_"+ nodes[j] - my_log(node+": "+ path) - ALL_DEVICE[key][node].append(path) - elif 'sfp' == key: - for k in range(0,DEVICE_NO[key]): - for lk in cpld_of_module: - if k in cpld_of_module[lk]: - cpld_str = lk - node = key+str(k+1) - path = i2c_prefix+ lk + "/"+ nodes[j] + str(k+1) - my_log(node+": "+ path) - ALL_DEVICE[key][node].append(path) - else: - node = key+str(i+1) - path = i2c_prefix+ buses[i]+"/"+ nodes[j] - my_log(node+": "+ path) - ALL_DEVICE[key][node].append(path) - - for key in hwmon_types: - itypes = hwmon_types[key] - nodes = hwmon_nodes[key] - for i in range(0,len(itypes)): - for j in range(0,len(nodes)): - node = key+"_"+itypes[i] - path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j] - my_log(node+": "+ path) - ALL_DEVICE[key][ key+str(i+1)].append(path) - - #show dict all in the order - if DEBUG == True: - for i in sorted(ALL_DEVICE.keys()): - print((i+": ")) - for j in sorted(ALL_DEVICE[i].keys()): - print((" "+j)) - for k in (ALL_DEVICE[i][j]): - print((" "+" "+k)) - return - -def show_eeprom(index): - if system_ready()==False: - print("System's not ready.") - print("Please install first!") - return - - if len(ALL_DEVICE)==0: - devices_info() - node = ALL_DEVICE['sfp'] ['sfp'+str(index)][0] - node = node.replace(node.split("/")[-1], 'eeprom') - # check if got hexdump command in current environment - ret, log = log_os_system("which hexdump", 0) - ret, log2 = log_os_system("which busybox hexdump", 0) - if len(log): - hex_cmd = 'hexdump' - elif len(log2): - hex_cmd = ' busybox hexdump' - else: - log = 'Failed : no hexdump cmd!!' - logging.info(log) - print(log) - return 1 - - print(node + ":") - ret, log = log_os_system("cat "+node+"| "+hex_cmd+" -C", 1) - if ret==0: - print(log) - else: - print("**********device no found**********") - return - -def set_device(args): - global DEVICE_NO - global ALL_DEVICE - if system_ready()==False: - print("System's not ready.") - print("Please install first!") - return - - if len(ALL_DEVICE)==0: - devices_info() - - if args[0]=='led': - if int(args[1])>4: - show_set_help() - return - #print ALL_DEVICE['led'] - for i in range(0,len(ALL_DEVICE['led'])): - for k in (ALL_DEVICE['led']['led'+str(i+1)]): - ret, log = log_os_system("echo "+args[1]+" >"+k, 1) - if ret: - return ret - elif args[0]=='fan': - if int(args[1])>100: - show_set_help() - return - #print ALL_DEVICE['fan'] - #fan1~6 is all fine, all fan share same setting - node = ALL_DEVICE['fan'] ['fan1'][0] - node = node.replace(node.split("/")[-1], 'fan_duty_cycle_percentage') - ret, log = log_os_system("cat "+ node, 1) - if ret==0: - print(("Previous fan duty: " + log.strip() +"%")) - ret, log = log_os_system("echo "+args[1]+" >"+node, 1) - if ret==0: - print(("Current fan duty: " + args[1] +"%")) - return ret - elif args[0]=='sfp': - if int(args[1])> DEVICE_NO[args[0]] or int(args[1])==0: - show_set_help() - return - if len(args)<2: - show_set_help() - return - - if int(args[2])>1: - show_set_help() - return - - #print ALL_DEVICE[args[0]] - for i in range(0,len(ALL_DEVICE[args[0]])): - for j in ALL_DEVICE[args[0]][args[0]+str(args[1])]: - if j.find('tx_disable')!= -1: - ret, log = log_os_system("echo "+args[2]+" >"+ j, 1) - if ret: - return ret - return + do_sonic_platform_clean() -#get digits inside a string. -#Ex: 31 for "sfp31" -def get_value(input): - digit = re.findall('\d+', input) - return int(digit[0]) - -def device_traversal(): - if system_ready()==False: - print("System's not ready.") - print("Please install first!") - return - - if len(ALL_DEVICE)==0: - devices_info() - for i in sorted(ALL_DEVICE.keys()): - print("============================================") - print((i.upper()+": ")) - print("============================================") - - for j in sorted(list(ALL_DEVICE[i].keys()), key=get_value): - print(" "+j+":", end=' ') - for k in (ALL_DEVICE[i][j]): - ret, log = log_os_system("cat "+k, 0) - func = k.split("/")[-1].strip() - func = re.sub(j+'_','',func,1) - func = re.sub(i.lower()+'_','',func,1) - if ret==0: - print(func+"="+log+" ", end=' ') - else: - print(func+"="+"X"+" ", end=' ') - print() - print("----------------------------------------------------------------") - - print() return def device_exist(): diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/fanutil.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/fanutil.py index f4807487bf38..519aaa76749d 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/fanutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/fanutil.py @@ -104,7 +104,7 @@ def _get_fan_node_val(self, fan_num, node_num): return None try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None @@ -135,7 +135,7 @@ def _set_fan_node_val(self, fan_num, node_num, val): val_file.write(content) try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/thermalutil.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/thermalutil.py index 65e872c6beb8..2a4afca9b7e0 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/thermalutil.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/classes/thermalutil.py @@ -81,11 +81,11 @@ def _get_thermal_node_val(self, thermal_num): return None try: - val_file.close() + val_file.close() except: logging.debug('GET. unable to close file. device_path:%s', device_path) return None - + return int(content) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-init.service new file mode 100644 index 000000000000..7f3b7d87f99f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-init.service @@ -0,0 +1,17 @@ +[Unit] +Description=Accton AS7816-64X Platform initialization service +Before=pmon.service determine-reboot-cause.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/local/bin/accton_as7816_64x_util.py install +ExecStop=/usr/local/bin/accton_as7816_64x_util.py clean + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-monitor.service similarity index 64% rename from platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service rename to platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-monitor.service index 7b6db7ddac01..f361642e69fc 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-64x-platform-monitor.service @@ -1,11 +1,12 @@ [Unit] Description=Accton AS7816-64X Platform Monitoring service Before=pmon.service -After=pddf-platform-init.service +After=as7816-64x-platform-init.service +Requires=as7816-64x-platform-init.service DefaultDependencies=no [Service] -ExecStart=/usr/local/bin/accton_as7816_pddf_monitor.py +ExecStart=/usr/local/bin/accton_as7816_64x_monitor.py KillSignal=SIGKILL SuccessExitStatus=SIGKILL diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-platform-init.service deleted file mode 100755 index 486ed74f8243..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-platform-init.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Accton AS7816-64X Platform initialization service -Before=pmon.service -After=sysinit.target -DefaultDependencies=no - -[Service] -ExecStartPre=/usr/local/bin/accton_as7816_util.py install -ExecStart=/usr/local/bin/accton_as7816_monitor.py -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c5e..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py index 22bd354ea686..607a9ef78dd9 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py @@ -1,5 +1,8 @@ from setuptools import setup +DEVICE_NAME = 'accton' +HW_SKU = 'x86_64-accton_as7816_64x-r0' + setup( name='sonic-platform', version='1.0', @@ -8,7 +11,13 @@ author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - packages=['sonic_platform'], + maintainer='Jostar Yang', + maintainer_email='jostar_yang@edge-core.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_monitor.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_monitor.py similarity index 99% rename from platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_monitor.py rename to platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_monitor.py index d98cec58d2e5..f3ed87398bc1 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_monitor.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_monitor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright (C) 2017 Accton Technology Corporation # diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_util.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_util.py similarity index 80% rename from platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_util.py rename to platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_util.py index 525f2786647e..1e9314fb824e 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/accton_as7816_64x_util.py @@ -48,8 +48,8 @@ if DEBUG == True: - print((sys.argv[0])) - print(('ARGV :', sys.argv[1:] )) + print(sys.argv[0]) + print('ARGV :', sys.argv[1:] ) def main(): @@ -67,7 +67,7 @@ def main(): if DEBUG == True: print(options) print(args) - print((len(sys.argv))) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -81,9 +81,14 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - do_install() + do_install() elif arg == 'clean': - do_uninstall() + do_uninstall() + elif arg == 'api': + do_sonic_platform_install() + elif arg == 'api_clean': + do_sonic_platform_clean() + else: show_help() @@ -91,7 +96,7 @@ def main(): return 0 def show_help(): - print(( __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})) + print( __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) @@ -114,13 +119,13 @@ def ir3570_check(): else: ret = 0 except Exception as e: - print(("Error on ir3570_check() e:" + str(e))) + print("Error on ir3570_check() e:" + str(e)) return -1 return ret def my_log(txt): if DEBUG == True: - print(("[ROY]"+txt)) + print("[ROY]"+txt) return def log_os_system(cmd, show): @@ -131,7 +136,7 @@ def log_os_system(cmd, show): if status: logging.info('Failed :'+cmd) if show: - print(('Failed :'+cmd)) + print('Failed :'+cmd) return status, output def driver_check(): @@ -298,7 +303,44 @@ def system_ready(): if not device_exist(): return False return True - + +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +PLATFORM_API2_WHL_FILE_PY3 ='sonic_platform-1.0-py3-none-any.whl' +def do_sonic_platform_install(): + device_path = "{}{}{}{}".format(PLATFORM_ROOT_PATH, '/x86_64-accton_', PROJECT_NAME, '-r0') + SONIC_PLATFORM_BSP_WHL_PKG_PY3 = "/".join([device_path, PLATFORM_API2_WHL_FILE_PY3]) + + #Check API2.0 on py whl file + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + if os.path.exists(SONIC_PLATFORM_BSP_WHL_PKG_PY3): + status, output = log_os_system("pip3 install "+ SONIC_PLATFORM_BSP_WHL_PKG_PY3, 1) + if status: + print("Error: Failed to install {}".format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print("Successfully installed {} package".format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} is not found'.format(PLATFORM_API2_WHL_FILE_PY3)) + else: + print('{} has installed'.format(PLATFORM_API2_WHL_FILE_PY3)) + + return + +def do_sonic_platform_clean(): + status, output = log_os_system("pip3 show sonic-platform > /dev/null 2>&1", 0) + if status: + print('{} does not install, not need to uninstall'.format(PLATFORM_API2_WHL_FILE_PY3)) + + else: + status, output = log_os_system("pip3 uninstall sonic-platform -y", 0) + if status: + print('Error: Failed to uninstall {}'.format(PLATFORM_API2_WHL_FILE_PY3)) + return status + else: + print('{} is uninstalled'.format(PLATFORM_API2_WHL_FILE_PY3)) + + return def do_install(): print("Checking system....") if driver_check() == False: @@ -308,7 +350,7 @@ def do_install(): if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" drivers detected....")) + print(PROJECT_NAME.upper()+" drivers detected....") ir3570_check() @@ -319,13 +361,15 @@ def do_install(): if FORCE == 0: return status else: - print((PROJECT_NAME.upper()+" devices detected....")) + print(PROJECT_NAME.upper()+" devices detected....") + do_sonic_platform_install() + return def do_uninstall(): print("Checking system....") if not device_exist(): - print((PROJECT_NAME.upper() +" has no device installed....")) + print(PROJECT_NAME.upper() +" has no device installed....") else: print("Removing device....") status = device_uninstall() @@ -334,7 +378,7 @@ def do_uninstall(): return status if driver_check()== False : - print((PROJECT_NAME.upper() +" has no driver installed....")) + print(PROJECT_NAME.upper() +" has no driver installed....") else: print("Removing installed driver....") status = driver_uninstall() @@ -342,6 +386,8 @@ def do_uninstall(): if FORCE == 0: return status + do_sonic_platform_clean() + return def device_exist(): diff --git a/platform/broadcom/sonic-platform-modules-accton/common/modules/ym2651y.c b/platform/broadcom/sonic-platform-modules-accton/common/modules/ym2651y.c index 5834b1d4ef8b..20cef5d61a38 100755 --- a/platform/broadcom/sonic-platform-modules-accton/common/modules/ym2651y.c +++ b/platform/broadcom/sonic-platform-modules-accton/common/modules/ym2651y.c @@ -42,7 +42,8 @@ enum chips { YM2651, YM2401, YM2851, - YPEB1200AM + YM1401A, + YPEB1200AM }; /* Each client has this additional data @@ -66,8 +67,9 @@ struct ym2651y_data { u16 fan_duty_cycle[2]; /* Register value */ u8 fan_dir[4]; /* Register value */ u8 pmbus_revision; /* Register value */ + u8 mfr_serial[21]; /* Register value */ u8 mfr_id[10]; /* Register value */ - u8 mfr_model[10]; /* Register value */ + u8 mfr_model[16]; /* Register value */ u8 mfr_revsion[3]; /* Register value */ u16 mfr_vin_min; /* Register value */ u16 mfr_vin_max; /* Register value */ @@ -113,9 +115,11 @@ enum ym2651y_sysfs_attributes { PSU_FAN1_SPEED, PSU_FAN1_DUTY_CYCLE, PSU_PMBUS_REVISION, + PSU_SERIAL_NUM, PSU_MFR_ID, PSU_MFR_MODEL, PSU_MFR_REVISION, + PSU_MFR_SERIAL, PSU_MFR_VIN_MIN, PSU_MFR_VIN_MAX, PSU_MFR_VOUT_MIN, @@ -141,9 +145,11 @@ static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FA static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_ascii, NULL, PSU_FAN_DIRECTION); static SENSOR_DEVICE_ATTR(psu_pmbus_revision, S_IRUGO, show_byte, NULL, PSU_PMBUS_REVISION); +static SENSOR_DEVICE_ATTR(psu_serial_num, S_IRUGO, show_ascii, NULL, PSU_SERIAL_NUM); static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IRUGO, show_ascii, NULL, PSU_MFR_ID); static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IRUGO, show_ascii, NULL, PSU_MFR_MODEL); static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu_mfr_serial, S_IRUGO, show_ascii, NULL, PSU_MFR_SERIAL); static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN); static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX); static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN); @@ -175,9 +181,11 @@ static struct attribute *ym2651y_attributes[] = { &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, &sensor_dev_attr_psu_fan_dir.dev_attr.attr, &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, + &sensor_dev_attr_psu_serial_num.dev_attr.attr, &sensor_dev_attr_psu_mfr_id.dev_attr.attr, &sensor_dev_attr_psu_mfr_model.dev_attr.attr, &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, + &sensor_dev_attr_psu_mfr_serial.dev_attr.attr, &sensor_dev_attr_psu_mfr_vin_min.dev_attr.attr, &sensor_dev_attr_psu_mfr_vin_max.dev_attr.attr, &sensor_dev_attr_psu_mfr_pout_max.dev_attr.attr, @@ -362,14 +370,17 @@ static ssize_t show_ascii(struct device *dev, struct device_attribute *da, } ptr = data->fan_dir; break; + case PSU_MFR_SERIAL: /* psu_mfr_serial */ + ptr = data->mfr_serial+1; /* The first byte is the count byte of string. */ + break; case PSU_MFR_ID: /* psu_mfr_id */ - ptr = data->mfr_id; + ptr = data->mfr_id+1; /* The first byte is the count byte of string. */ break; case PSU_MFR_MODEL: /* psu_mfr_model */ - ptr = data->mfr_model; + ptr = data->mfr_model+1; /* The first byte is the count byte of string. */ break; case PSU_MFR_REVISION: /* psu_mfr_revision */ - ptr = data->mfr_revsion; + ptr = data->mfr_revsion+1; break; default: return 0; @@ -415,7 +426,7 @@ static ssize_t show_vout(struct device *dev, struct device_attribute *da, struct i2c_client *client = to_i2c_client(dev); struct ym2651y_data *data = i2c_get_clientdata(client); - if (data->chip == YM2401) { + if (data->chip == YM2401 || data->chip==YM1401A) { return show_vout_by_mode(dev, da, buf); } else { @@ -493,6 +504,7 @@ static const struct i2c_device_id ym2651y_id[] = { { "ym2651", YM2651 }, { "ym2401", YM2401 }, { "ym2851", YM2851 }, + { "ym1401a",YM1401A}, { "ype1200am", YPEB1200AM }, {} }; @@ -561,8 +573,8 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { - int i, status; - u8 command; + int i, status, length; + u8 command, buf; u8 fan_dir[5] = {0}; struct reg_data_byte regs_byte[] = { {0x19, &data->capability}, {0x20, &data->vout_mode}, @@ -599,6 +611,7 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) dev_dbg(&client->dev, "reg %d, err %d\n", regs_byte[i].reg, status); *(regs_byte[i].value) = 0; + goto exit; } else { *(regs_byte[i].value) = status; @@ -614,6 +627,7 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) dev_dbg(&client->dev, "reg %d, err %d\n", regs_word[i].reg, status); *(regs_word[i].value) = 0; + goto exit; } else { *(regs_word[i].value) = status; @@ -626,6 +640,7 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) if (status < 0) { dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; } strncpy(data->fan_dir, fan_dir+1, ARRAY_SIZE(data->fan_dir)-1); @@ -642,12 +657,61 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) /* Read mfr_model */ command = 0x9a; - status = ym2651y_read_block(client, command, data->mfr_model, - ARRAY_SIZE(data->mfr_model)-1); - data->mfr_model[ARRAY_SIZE(data->mfr_model)-1] = '\0'; + length = 1; + /* Read first byte to determine the length of data */ + status = ym2651y_read_block(client, command, &buf, length); + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; + } + status = ym2651y_read_block(client, command, data->mfr_model, buf+1); + + if ((buf+1) >= (ARRAY_SIZE(data->mfr_model)-1)) + { + data->mfr_model[ARRAY_SIZE(data->mfr_model)-1] = '\0'; + } + else + data->mfr_model[buf+1] = '\0'; if (status < 0) + { dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; + } + + /*YM-1401A PSU doens't support to get serial_num, so ignore it. + *It's vout doesn't support linear, so let it use show_vout_by_mode(). + */ + if(!strncmp("YM-1401A", data->mfr_model+1, strlen("YM-1401A"))) + { + data->chip=YM1401A; + } + else + { + /* Read mfr_serial */ + command = 0x9e; + length = 1; + /* Read first byte to determine the length of data */ + status = ym2651y_read_block(client, command, &buf, length); + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; + } + status = ym2651y_read_block(client, command, data->mfr_serial, buf+1); + + if ((buf+1) >= (ARRAY_SIZE(data->mfr_serial)-1)) + { + data->mfr_serial[ARRAY_SIZE(data->mfr_serial)-1] = '\0'; + } + else + data->mfr_serial[buf+1] = '\0'; + + if (status < 0) + { + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; + } + } /* Read mfr_revsion */ command = 0x9b; @@ -656,12 +720,16 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) data->mfr_revsion[ARRAY_SIZE(data->mfr_revsion)-1] = '\0'; if (status < 0) + { dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + goto exit; + } data->last_updated = jiffies; data->valid = 1; } + exit: mutex_unlock(&data->update_lock); return data; diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install index 4ba26bed2625..a87ebb5b046a 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install @@ -1 +1 @@ -as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0/pddf +as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0 diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst deleted file mode 100644 index 23bebd3b295c..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst +++ /dev/null @@ -1,8 +0,0 @@ -# Special arrangement to make PDDF mode default -# Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) -# Enable pddf-platform-monitor -depmod -a -systemctl enable pddf-platform-init.service -systemctl start pddf-platform-init.service -systemctl enable as4630-54pe-pddf-platform-monitor.service -systemctl start as4630-54pe-pddf-platform-monitor.service diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install index 1d9885d22d27..a6b7094e0e03 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install @@ -1 +1,2 @@ -as7326-56x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf +as7326-56x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7326_56x-r0 + diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install index 01b33cc19e54..8f214208a6b8 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install @@ -1 +1,2 @@ -as7816-64x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf +as7816-64x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7816_64x-r0 + From d3f2da867952a429d29d115ca259249d0df8e6c1 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Fri, 18 Mar 2022 23:44:10 +0530 Subject: [PATCH 094/817] [pddf]: Adding support for fan_drawer class in PDDF common platform APIs (#10213) Why I did it fan_drawer support was missing in PDDF common platform APIs. This resulted in 'thermalctld' not working and 'show platform fan' and 'show platfomr temperature' commands not working. _thermal_list array inside PSU class was not initialized. Made changes to attach the PSU related thermal sensors in the PSU instance. How I did it Added a common class pddf_fan_drawer.py. This class uses the PDDF JSON to fetch the platform specific data. A platform which uses PDDF would follow the below hierarchy. fan_drawer_base.py ---> pddf_fan_drawer.py ---> fan_drawer.py How to verify it Run the 'show platform fan' and 'show platform temperature' commands and check the o/p. o/p on AS7326: root@sonic:/home/admin# show platform fan s Drawer LED FAN Speed Direction Presence Status Timestamp -------- ----- ---------- ------- ----------- ---------- -------- ----------------- Fantray1 green Fantray1_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray1 green Fantray1_2 38% EXHAUST Present OK 20220311 04:15:03 Fantray2 green Fantray2_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray2 green Fantray2_2 38% EXHAUST Present OK 20220311 04:15:03 Fantray3 green Fantray3_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray3 green Fantray3_2 38% EXHAUST Present OK 20220311 04:15:03 Fantray4 green Fantray4_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray4 green Fantray4_2 38% EXHAUST Present OK 20220311 04:15:03 Fantray5 green Fantray5_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray5 green Fantray5_2 38% EXHAUST Present OK 20220311 04:15:03 Fantray6 green Fantray6_1 38% EXHAUST Present OK 20220311 04:15:03 Fantray6 green Fantray6_2 38% EXHAUST Present OK 20220311 04:15:03 N/A off PSU1_FAN1 0% Present Not OK 20220311 04:15:05 N/A green PSU2_FAN1 34% EXHAUST Present OK 20220311 04:15:05 hroot@sonic:/home/admin# show platform temperature Sensor Temperature High TH Low TH Crit High TH Crit Low TH Warning Timestamp ---------- ------------- --------- -------- -------------- ------------- --------- ----------------- PSU1_TEMP1 0 N/A N/A N/A N/A False 20220311 04:15:05 PSU2_TEMP1 37 N/A N/A N/A N/A False 20220311 04:15:05 TEMP1 37 80.0 N/A N/A N/A False 20220311 04:15:05 TEMP2 27 80.0 N/A N/A N/A False 20220311 04:15:05 TEMP3 28.5 80.0 N/A N/A N/A False 20220311 04:15:05 TEMP4 30.5 80.0 N/A N/A N/A False 20220311 04:15:05 root@sonic:/home/admin# root@sonic:/home/admin# root@sonic:/home/admin# o/p on AS7726: root@as7726-32x-2:~# show platform fan Drawer LED FAN Speed Direction Presence Status Timestamp -------- ----- ---------- ------- ----------- ---------- -------- ----------------- Fantray1 green Fantray1_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray1 green Fantray1_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray2 green Fantray2_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray2 green Fantray2_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray3 green Fantray3_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray3 green Fantray3_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray4 green Fantray4_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray4 green Fantray4_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray5 green Fantray5_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray5 green Fantray5_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray6 green Fantray6_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray6 green Fantray6_2 38% EXHAUST Present OK 20220311 08:13:04 N/A green PSU1_FAN1 23% EXHAUST Present OK 20220311 08:13:04 N/A green PSU2_FAN1 22% EXHAUST Present OK 20220311 08:13:04 root@as7726-32x-2:~# show platform temp Sensor Temperature High TH Low TH Crit High TH Crit Low TH Warning Timestamp ---------- ------------- --------- -------- -------------- ------------- --------- ----------------- PSU1_TEMP1 28 N/A N/A N/A N/A False 20220311 08:13:04 PSU2_TEMP1 25 N/A N/A N/A N/A False 20220311 08:13:04 TEMP1 23.5 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP2 27 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP3 24 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP4 27 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP5 24 80.0 N/A N/A N/A False 20220311 08:13:04 --- .../sonic_platform_pddf_base/pddf_chassis.py | 8 +- .../sonic_platform_pddf_base/pddf_fan.py | 2 +- .../pddf_fan_drawer.py | 110 ++++++++++ .../sonic_platform_pddf_base/pddf_psu.py | 6 + .../sonic_platform_pddf_base/pddf_thermal.py | 198 +++++++++++------- 5 files changed, 248 insertions(+), 76 deletions(-) create mode 100755 platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan_drawer.py diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py index 0ba2e8902c9c..d90949184d5b 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py @@ -10,7 +10,7 @@ from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.sfp import Sfp from sonic_platform.psu import Psu - from sonic_platform.fan import Fan + from sonic_platform.fan_drawer import FanDrawer from sonic_platform.thermal import Thermal from sonic_platform.eeprom import Eeprom except ImportError as e: @@ -52,9 +52,9 @@ def __init__(self, pddf_data=None, pddf_plugin_data=None): # FANs for i in range(self.platform_inventory['num_fantrays']): - for j in range(self.platform_inventory['num_fans_pertray']): - fan = Fan(i, j, self.pddf_obj, self.plugin_data) - self._fan_list.append(fan) + fandrawer = FanDrawer(i, self.pddf_obj, self.plugin_data) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) # PSUs for i in range(self.platform_inventory['num_psus']): diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py index d272d40e61a4..2a8ef46085c5 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py @@ -153,7 +153,7 @@ def get_speed(self): speed = int(output['status']) max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED']) - speed_percentage = (speed*100)/max_speed + speed_percentage = round((speed*100)/max_speed) return speed_percentage else: # TODO This calculation should change based on MAX FAN SPEED diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan_drawer.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan_drawer.py new file mode 100755 index 000000000000..f88e833408dd --- /dev/null +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan_drawer.py @@ -0,0 +1,110 @@ +############################################################################# +# PDDF +# +# PDDF fan_drawer base class inherited from the common base class fan_drawer.py +# +############################################################################# + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PddfFanDrawer(FanDrawerBase): + """PDDF generic Fan Drawer class""" + + pddf_obj = {} + plugin_data = {} + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + FanDrawerBase.__init__(self) + if not pddf_data or not pddf_plugin_data: + raise ValueError('PDDF JSON data error') + + self.pddf_obj = pddf_data + self.plugin_data = pddf_plugin_data + self.platform = self.pddf_obj.get_platform() + + if tray_idx < 0 or tray_idx >= self.platform['num_fantrays']: + print("Invalid fantray index %d\n" % tray_idx) + return + + self.fantray_index = tray_idx+1 + for j in range(self.platform['num_fans_pertray']): + # Fan index is 0-based for the init call + self._fan_list.append(Fan(tray_idx, j, self.pddf_obj, self.plugin_data)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: String containing fan-drawer name + """ + return "Fantray{0}".format(self.fantray_index) + + def get_presence(self): + status = False + # Usually if a tray is removed, all the fans inside it are absent + if self._fan_list: + status = self._fan_list[0].get_presence() + + return status + + def get_status(self): + status = False + # if all the fans are working fine, then tray status should be okay + if self._fan_list: + status = all(fan.get_status() == True for fan in self._fan_list) + + return status + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + # Usually Fantrays are replaceable + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantray_index + + def get_status_led(self): + led_device_name = "FANTRAY{}".format(self.fantray_index) + "_LED" + + if led_device_name not in self.pddf_obj.data.keys(): + # Implement a generic status_led color scheme + if self.get_status(): + return self.STATUS_LED_COLOR_GREEN + else: + return self.STATUS_LED_COLOR_OFF + + device_name = self.pddf_obj.data[led_device_name]['dev_info']['device_name'] + self.pddf_obj.create_attr('device_name', device_name, self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('index', str(self.fantray_index-1), self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('dev_ops', 'get_status', self.pddf_obj.get_led_path()) + color = self.pddf_obj.get_led_color() + return (color) + + def set_status_led(self, color): + result = False + led_device_name = "FANTRAY{}".format(self.fantray_index) + "_LED" + result, msg = self.pddf_obj.is_supported_sysled_state(led_device_name, color) + if result == False: + print(msg) + return (False) + + device_name = self.pddf_obj.data[led_device_name]['dev_info']['device_name'] + self.pddf_obj.create_attr('device_name', device_name, self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('index', str(self.fantray_index-1), self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('color', color, self.pddf_obj.get_led_cur_state_path()) + self.pddf_obj.create_attr('dev_ops', 'set_status', self.pddf_obj.get_led_path()) + return (True) diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_psu.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_psu.py index 912333df8b57..bbe7dc0a1a44 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_psu.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_psu.py @@ -20,6 +20,7 @@ try: from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan + from sonic_platform.thermal import Thermal except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -45,6 +46,11 @@ def __init__(self, index, pddf_data=None, pddf_plugin_data=None): psu_fan = Fan(0, psu_fan_idx, pddf_data, pddf_plugin_data, True, self.psu_index) self._fan_list.append(psu_fan) + self.num_psu_thermals = 1 # Fixing it 1 for now + for psu_thermal_idx in range(self.num_psu_thermals): + psu_thermal = Thermal(psu_thermal_idx, pddf_data, pddf_plugin_data, True, self.psu_index) + self._thermal_list.append(psu_thermal) + def get_num_fans(self): """ Retrieves the number of fan modules available on this PSU diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py index 644292eb17e5..a0fe6a28bf44 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py @@ -22,7 +22,7 @@ class PddfThermal(ThermalBase): pddf_obj = {} plugin_data = {} - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): if not pddf_data or not pddf_plugin_data: raise ValueError('PDDF JSON data error') @@ -35,78 +35,129 @@ def __init__(self, index, pddf_data=None, pddf_plugin_data=None): self.thermal_obj_name = "TEMP{}".format(self.thermal_index) self.thermal_obj = self.pddf_obj.data[self.thermal_obj_name] + self.is_psu_thermal = is_psu_thermal + if self.is_psu_thermal: + self.thermals_psu_index = psu_index + def get_name(self): - if 'dev_attr' in self.thermal_obj.keys(): - if 'display_name' in self.thermal_obj['dev_attr']: - return str(self.thermal_obj['dev_attr']['display_name']) - # In case of errors - return (self.thermal_obj_name) + if self.is_psu_thermal: + return "PSU{}_TEMP{}".format(self.thermals_psu_index, self.thermal_index) + else: + if 'dev_attr' in self.thermal_obj.keys(): + if 'display_name' in self.thermal_obj['dev_attr']: + return str(self.thermal_obj['dev_attr']['display_name']) + # In case of errors + return (self.thermal_obj_name) + + def get_presence(self): + if self.is_psu_thermal: + # Temp sensor on the PSU + device = "PSU{}".format(self.thermals_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_present") + if not output: + return False + + mode = output['mode'] + status = output['status'] + + vmap = self.plugin_data['PSU']['psu_present'][mode]['valmap'] + + if status.rstrip('\n') in vmap: + return vmap[status.rstrip('\n')] + else: + return False + else: + # Temp sensor on the board + return True def get_temperature(self): - output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_input") - if not output: - return None + if self.is_psu_thermal: + device = "PSU{}".format(self.thermals_psu_index) + output = self.pddf_obj.get_attr_name_output(device, "psu_temp1_input") + if not output: + return None - if output['status'].isalpha(): - attr_value = None + temp1 = output['status'] + # temperature returned is in milli celcius + return float(temp1)/1000 else: - attr_value = float(output['status']) + output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_input") + if not output: + return None - if output['mode'] == 'bmc': - return attr_value - else: - return (attr_value/float(1000)) + if output['status'].isalpha(): + attr_value = None + else: + attr_value = float(output['status']) + + if output['mode'] == 'bmc': + return attr_value + else: + return (attr_value/float(1000)) def get_high_threshold(self): - output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_high_threshold") - if not output: - return None + if not self.is_psu_thermal: + output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_high_threshold") + if not output: + return None - if output['status'].isalpha(): - attr_value = None - else: - attr_value = float(output['status']) + if output['status'].isalpha(): + attr_value = None + else: + attr_value = float(output['status']) - if output['mode'] == 'bmc': - return attr_value + if output['mode'] == 'bmc': + return attr_value + else: + return (attr_value/float(1000)) else: - return (attr_value/float(1000)) + raise NotImplementedError + def get_low_threshold(self): - output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_low_threshold") - if not output: - return None + if not self.is_psu_thermal: + output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_low_threshold") + if not output: + return None - if output['status'].isalpha(): - attr_value = None - else: - attr_value = float(output['status']) + if output['status'].isalpha(): + attr_value = None + else: + attr_value = float(output['status']) - if output['mode'] == 'bmc': - return attr_value + if output['mode'] == 'bmc': + return attr_value + else: + return (attr_value/float(1000)) else: - return (attr_value/float(1000)) + raise NotImplementedError def set_high_threshold(self, temperature): - node = self.pddf_obj.get_path(self.thermal_obj_name, "temp1_high_threshold") - if node is None: - print("ERROR %s does not exist" % node) - return None + if not self.is_psu_thermal: + node = self.pddf_obj.get_path(self.thermal_obj_name, "temp1_high_threshold") + if node is None: + print("ERROR %s does not exist" % node) + return None - cmd = "echo '%d' > %s" % (temperature * 1000, node) - os.system(cmd) + cmd = "echo '%d' > %s" % (temperature * 1000, node) + os.system(cmd) - return (True) + return (True) + else: + raise NotImplementedError def set_low_threshold(self, temperature): - node = self.pddf_obj.get_path(self.thermal_obj_name, "temp1_low_threshold") - if node is None: - print("ERROR %s does not exist" % node) - return None - cmd = "echo '%d' > %s" % (temperature * 1000, node) - os.system(cmd) + if not self.is_psu_thermal: + node = self.pddf_obj.get_path(self.thermal_obj_name, "temp1_low_threshold") + if node is None: + print("ERROR %s does not exist" % node) + return None + cmd = "echo '%d' > %s" % (temperature * 1000, node) + os.system(cmd) - return (True) + return (True) + else: + raise NotImplementedError def get_high_critical_threshold(self): """ @@ -116,19 +167,22 @@ def get_high_critical_threshold(self): A float number, the high critical threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_high_crit_threshold") - if not output: - return None + if not self.is_psu_thermal: + output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_high_crit_threshold") + if not output: + return None - if output['status'].isalpha(): - attr_value = None - else: - attr_value = float(output['status']) + if output['status'].isalpha(): + attr_value = None + else: + attr_value = float(output['status']) - if output['mode'] == 'bmc': - return attr_value + if output['mode'] == 'bmc': + return attr_value + else: + return (attr_value/float(1000)) else: - return (attr_value/float(1000)) + raise NotImplementedError def get_low_critical_threshold(self): """ @@ -138,22 +192,24 @@ def get_low_critical_threshold(self): A float number, the low critical threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_low_crit_threshold") - if not output: - return None + if not self.is_psu_thermal: + output = self.pddf_obj.get_attr_name_output(self.thermal_obj_name, "temp1_low_crit_threshold") + if not output: + return None - if output['status'].isalpha(): - attr_value = None - else: - attr_value = float(output['status']) + if output['status'].isalpha(): + attr_value = None + else: + attr_value = float(output['status']) - if output['mode'] == 'bmc': - return attr_value + if output['mode'] == 'bmc': + return attr_value + else: + return (attr_value/float(1000)) else: - return (attr_value/float(1000)) + raise NotImplementedError # Helper Functions - def get_temp_label(self): if 'bmc' in self.pddf_obj.data[self.thermal_obj_name].keys(): return None From 64822d80b1e12319639f302e7b29df18d1f38b41 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Fri, 18 Mar 2022 11:31:38 -0700 Subject: [PATCH 095/817] [sonic-linkmgrd][master] submodule update (#10271) f00efef Longxiang Lyu Wed Mar 16 09:12:46 2022 +0800 Add a command line option to store logs into a separate file (#41) ff2e67d Longxiang Lyu Tue Mar 15 09:10:59 2022 +0800 Add default port cable type (#39) ebbb4d8 Jing Zhang Mon Mar 14 15:41:11 2022 -0700 Prevent switching MUX to "Unknown" (#36) c779b8f Longxiang Lyu Thu Mar 10 21:35:11 2022 +0800 [nonfunctional] Use LinkProberStateMachineBase (#38) b9fedd0 Longxiang Lyu Wed Mar 9 13:03:58 2022 +0800 [NONFUNCTIONAL] Add LinkProberStateMachineBase (#37) bedd42b Longxiang Lyu Wed Mar 9 10:03:00 2022 +0800 Add .clang-format file to format code (#28) 9fe4fc6 Guohan Lu Thu Mar 3 17:51:43 2022 -0800 [doc]: add lgtm badge in README.md c1249d9 Longxiang Lyu Wed Mar 2 18:05:18 2022 +0800 Enable lgtm (#33) b8514c6 Longxiang Lyu Wed Mar 2 13:34:39 2022 +0800 Collect port cable type to use corresponding state machine (#31) 9b59ef9 Longxiang Lyu Wed Mar 2 07:19:33 2022 +0800 Improve make clean (#32) --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index ce72b0d2b8bb..f00efefd3099 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit ce72b0d2b8bb10c8734d841cf27614c2e3b197c8 +Subproject commit f00efefd30995de447fd6932369cb5be250ddf90 From 3a4ed995930ae0991797ff29ed92bb40e2090475 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 18 Mar 2022 12:10:30 -0700 Subject: [PATCH 096/817] [Arista] Update driver submodules (#10267) - Fix i2c bus on crow cpu - Fix exception handling in logs - Improve linecard mgmt interface configuration - Add new PSU models for chassis - Misc fixes --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 516ece8126ed..da8370423b07 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 516ece8126ed8ad35b23c40782ec75dc836b4850 +Subproject commit da8370423b07c9271fad515c9ef1fd6149abbeed diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 516ece8126ed..da8370423b07 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 516ece8126ed8ad35b23c40782ec75dc836b4850 +Subproject commit da8370423b07c9271fad515c9ef1fd6149abbeed From 9d2078c446d2b56a49a55bee7e16c128ab8a6e5d Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Sat, 19 Mar 2022 03:11:13 +0800 Subject: [PATCH 097/817] [Mellanox] Update Mellanox SN2201 device specific files (#10275) Update device-specific files for new platform SN2201, including: device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/buffers_defaults_objects.j2 device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/hwsku.json device/mellanox/x86_64-nvidia_sn2201-r0/default_sku device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml device/mellanox/x86_64-nvidia_sn2201-r0/platform.json device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json device/mellanox/x86_64-nvidia_sn2201-r0/sensors.conf Signed-off-by: Kebo Liu Co-authored-by: Stephen Sun --- .../ACS-SN2201/buffers_defaults_objects.j2 | 1 + .../ACS-SN2201/hwsku.json | 144 ++++++++++++------ .../x86_64-nvidia_sn2201-r0/default_sku | 2 +- .../x86_64-nvidia_sn2201-r0/pcie.yaml | 130 +++++++--------- .../x86_64-nvidia_sn2201-r0/platform.json | 134 +++++++++------- .../platform_components.json | 12 ++ .../x86_64-nvidia_sn2201-r0/sensors.conf | 133 ++++++++++++++-- 7 files changed, 373 insertions(+), 183 deletions(-) create mode 120000 device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/buffers_defaults_objects.j2 create mode 100644 device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/buffers_defaults_objects.j2 b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/buffers_defaults_objects.j2 new file mode 120000 index 000000000000..33b6704f9902 --- /dev/null +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/buffers_defaults_objects.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_objects.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/hwsku.json b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/hwsku.json index fcd6343ca905..435135cef434 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/hwsku.json +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/hwsku.json @@ -1,148 +1,196 @@ { "interfaces": { "Ethernet0": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet1": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet2": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet3": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet4": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet5": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet6": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet7": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet8": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet9": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet10": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet11": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet12": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet13": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet14": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet15": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet16": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet17": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet18": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet19": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet20": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet21": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet22": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet23": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet24": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet25": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet26": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet27": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet28": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet29": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet30": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet31": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet32": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet33": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet34": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet35": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet36": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet37": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet38": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet39": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet40": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet41": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet42": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet43": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet44": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet45": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet46": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet47": { - "default_brkout_mode": "1x1G[100]" + "default_brkout_mode": "1x1000[100,10]", + "port_type": "RJ45" }, "Ethernet48": { "default_brkout_mode": "1x100G[50G,40G,25G,10G]" diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/default_sku b/device/mellanox/x86_64-nvidia_sn2201-r0/default_sku index 46029c3e83e3..2ef2c5dd0d32 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/default_sku +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/default_sku @@ -1 +1 @@ -ACS-MSN2201 t1 +ACS-SN2201 t1 diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml b/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml index 49de6829aa70..51ffd949d54a 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml @@ -19,107 +19,114 @@ dev: '00' fn: '0' id: '1980' - name: 'Host bridge: Intel Corporation Device (rev 11)' + name: 'Host bridge: Intel Corporation Atom Processor C3000 Series System Agent (rev + 11)' - bus: '00' dev: '04' fn: '0' - id: '19a1' - name: 'Host bridge: Intel Corporation Device (rev 11)' + id: 19a1 + name: 'Host bridge: Intel Corporation Atom Processor C3000 Series Error Registers + (rev 11)' - bus: '00' dev: '05' fn: '0' - id: '19a2' - name: 'Generic system peripheral: Intel Corporation Device (rev 11)' + id: 19a2 + name: 'Generic system peripheral [0807]: Intel Corporation Atom Processor C3000 + Series Root Complex Event Collector (rev 11)' - bus: '00' dev: '06' fn: '0' - id: '19a3' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19a3 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated QAT + Root Port (rev 11)' - bus: '00' - dev: '09' + dev: 09 fn: '0' - id: '19a4' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19a4 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root + Port #0 (rev 11)' - bus: '00' - dev: '0b' + dev: 0b fn: '0' - id: '19a6' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19a6 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root + Port #2 (rev 11)' - bus: '00' - dev: '0f' + dev: 0f fn: '0' - id: '19a9' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19a9 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root + Port #5 (rev 11)' - bus: '00' dev: '10' fn: '0' - id: '19aa' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19aa + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root + Port #6 (rev 11)' - bus: '00' - dev: 11 + dev: '11' fn: '0' - id: '19ab' - name: 'PCI bridge: Intel Corporation Device (rev 11)' + id: 19ab + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root + Port #7 (rev 11)' - bus: '00' - dev: 12 + dev: '12' fn: '0' id: 19ac - name: 'System peripheral: Intel Corporation DNV SMBus Contoller - Host (rev 11)' + name: 'System peripheral: Intel Corporation Atom Processor C3000 Series SMBus Contoller + - Host (rev 11)' - bus: '00' - dev: 15 + dev: '15' fn: '0' id: 19d0 - name: 'USB controller: Intel Corporation Device (rev 11)' + name: 'USB controller: Intel Corporation Atom Processor C3000 Series USB 3.0 xHCI + Controller (rev 11)' - bus: '00' - dev: 16 + dev: '18' fn: '0' - id: 19d1 - name: 'PCI bridge: Intel Corporation Device (rev 11)' -- bus: '00' - dev: 17 - fn: '0' - id: 19d2 - name: 'PCI bridge: Intel Corporation Device (rev 11)' -- bus: '00' - dev: 18 - fn: '0' - id: 1973 - name: 'Communication controller: Intel Corporation Device (rev 11)' + id: 19d3 + name: 'Communication controller: Intel Corporation Atom Processor C3000 Series ME + HECI 1 (rev 11)' - bus: '00' dev: 1c fn: '0' id: 19db - name: 'SD Host controller: Intel Corporation Device (rev 11)' + name: 'SD Host controller: Intel Corporation Device 19db (rev 11)' - bus: '00' dev: 1f fn: '0' id: 19dc - name: 'ISA bridge: Intel Corporation DNV LPC or eSPI (rev 11)' + name: 'ISA bridge: Intel Corporation Atom Processor C3000 Series LPC or eSPI (rev + 11)' - bus: '00' dev: 1f fn: '2' - id: 197e - name: 'Memory controller: Intel Corporation Device (rev 11)' + id: 19de + name: 'Memory controller: Intel Corporation Atom Processor C3000 Series Power Management + Controller (rev 11)' - bus: '00' - dev: '1f' + dev: 1f fn: '4' id: 19df - name: 'SMBus: Intel Corporation DNV SMBus controller (rev 11)' + name: 'SMBus: Intel Corporation Atom Processor C3000 Series SMBus controller (rev + 11)' - bus: '00' - dev: '1f' + dev: 1f fn: '5' id: 19e0 - name: 'Serial bus controller: Intel Corporation DNV SPI Controller (rev 11)' + name: 'Serial bus controller [0c80]: Intel Corporation Atom Processor C3000 Series + SPI Controller (rev 11)' - bus: '01' dev: '00' fn: '0' id: 19e2 - name: 'Co-processor: Intel Corporation Device (rev 11)' + name: 'Co-processor: Intel Corporation Atom Processor C3000 Series QuickAssist Technology + (rev 11)' - bus: '02' dev: '00' fn: '0' - id: 0026 - name: 'Non-Volatile memory controller: Device (rev 03)' + id: '0026' + name: 'Non-Volatile memory controller: Device 1dd4:0026 (rev 03)' - bus: '03' dev: '00' fn: '0' @@ -128,25 +135,6 @@ - bus: '06' dev: '00' fn: '0' - id: 1533 - name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)' -- bus: '07' - dev: '00' - fn: '0' - id: 15c3 - name: 'Ethernet controller: Intel Corporation Device (rev 11)' -- bus: '07' - dev: '00' - fn: '1' - id: 15c3 - name: 'Ethernet controller: Intel Corporation Device (rev 11)' -- bus: '08' - dev: '00' - fn: '0' - id: 15c3 - name: 'Ethernet controller: Intel Corporation Device (rev 11)' -- bus: '08' - dev: '00' - fn: '1' - id: 15c3 - name: 'Ethernet controller: Intel Corporation Device (rev 11)' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json index d98a191d0ad7..f600f26293ce 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json @@ -17,17 +17,39 @@ "name": "CPLD2" } ], - "fans": [{ - "name": "fan1" + "fans": [], + "fan_drawers": [ + { + "name": "drawer1", + "fans": [ + { + "name": "fan1" + } + ] }, { - "name": "fan2" + "name": "drawer2", + "fans": [ + { + "name": "fan2" + } + ] }, { - "name": "fan3" + "name": "drawer3", + "fans": [ + { + "name": "fan3" + } + ] }, { - "name": "fan4" + "name": "drawer4", + "fans": [ + { + "name": "fan4" + } + ] } ], "psus": [ @@ -65,6 +87,12 @@ { "name": "Ambient Fan Side Temp" }, + { + "name": "Ambient CPU Board Temp" + }, + { + "name": "Ambient Switch Board Temp" + }, { "name": "CPU Pack Temp" }, @@ -109,56 +137,56 @@ "index": "1", "lanes": "0", "breakout_modes": { - "1x1G[100]": ["etp1"] + "1x1000[100,10]": ["etp1"] } }, "Ethernet1": { "index": "2", "lanes": "4", "breakout_modes": { - "1x1G[100]": ["etp2"] + "1x1000[100,10]": ["etp2"] } }, "Ethernet2": { "index": "3", "lanes": "8", "breakout_modes": { - "1x1G[100]": ["etp3"] + "1x1000[100,10]": ["etp3"] } }, "Ethernet3": { "index": "4", "lanes": "12", "breakout_modes": { - "1x1G[100]": ["etp4"] + "1x1000[100,10]": ["etp4"] } }, "Ethernet4": { "index": "5", "lanes": "16", "breakout_modes": { - "1x1G[100]": ["etp5"] + "1x1000[100,10]": ["etp5"] } }, "Ethernet5": { "index": "6", "lanes": "20", "breakout_modes": { - "1x1G[100]": ["etp6"] + "1x1000[100,10]": ["etp6"] } }, "Ethernet6": { "index": "7", "lanes": "24", "breakout_modes": { - "1x1G[100]": ["etp7"] + "1x1000[100,10]": ["etp7"] } }, "Ethernet7": { "index": "8", "lanes": "28", "breakout_modes": { - "1x1G[100]": ["etp8"] + "1x1000[100,10]": ["etp8"] } }, @@ -166,56 +194,56 @@ "index": "9", "lanes": "32", "breakout_modes": { - "1x1G[100]": ["etp9"] + "1x1000[100,10]": ["etp9"] } }, "Ethernet9": { "index": "10", "lanes": "36", "breakout_modes": { - "1x1G[100]": ["etp10"] + "1x1000[100,10]": ["etp10"] } }, "Ethernet10": { "index": "11", "lanes": "40", "breakout_modes": { - "1x1G[100]": ["etp11"] + "1x1000[100,10]": ["etp11"] } }, "Ethernet11": { "index": "12", "lanes": "44", "breakout_modes": { - "1x1G[100]": ["etp12"] + "1x1000[100,10]": ["etp12"] } }, "Ethernet12": { "index": "13", "lanes": "48", "breakout_modes": { - "1x1G[100]": ["etp13"] + "1x1000[100,10]": ["etp13"] } }, "Ethernet13": { "index": "14", "lanes": "52", "breakout_modes": { - "1x1G[100]": ["etp14"] + "1x1000[100,10]": ["etp14"] } }, "Ethernet14": { "index": "15", "lanes": "56", "breakout_modes": { - "1x1G[100]": ["etp15"] + "1x1000[100,10]": ["etp15"] } }, "Ethernet15": { "index": "16", "lanes": "60", "breakout_modes": { - "1x1G[100]": ["etp16"] + "1x1000[100,10]": ["etp16"] } }, @@ -223,224 +251,224 @@ "index": "17", "lanes": "64", "breakout_modes": { - "1x1G[100]": ["etp17"] + "1x1000[100,10]": ["etp17"] } }, "Ethernet17": { "index": "18", "lanes": "68", "breakout_modes": { - "1x1G[100]": ["etp18"] + "1x1000[100,10]": ["etp18"] } }, "Ethernet18": { "index": "19", "lanes": "72", "breakout_modes": { - "1x1G[100]": ["etp19"] + "1x1000[100,10]": ["etp19"] } }, "Ethernet19": { "index": "20", "lanes": "76", "breakout_modes": { - "1x1G[100]": ["etp20"] + "1x1000[100,10]": ["etp20"] } }, "Ethernet20": { "index": "21", "lanes": "80", "breakout_modes": { - "1x1G[100]": ["etp21"] + "1x1000[100,10]": ["etp21"] } }, "Ethernet21": { "index": "22", "lanes": "84", "breakout_modes": { - "1x1G[100]": ["etp22"] + "1x1000[100,10]": ["etp22"] } }, "Ethernet22": { "index": "23", "lanes": "88", "breakout_modes": { - "1x1G[100]": ["etp23"] + "1x1000[100,10]": ["etp23"] } }, "Ethernet23": { "index": "24", "lanes": "92", "breakout_modes": { - "1x1G[100]": ["etp24"] + "1x1000[100,10]": ["etp24"] } }, "Ethernet24": { "index": "25", "lanes": "96", "breakout_modes": { - "1x1G[100]": ["etp25"] + "1x1000[100,10]": ["etp25"] } }, "Ethernet25": { "index": "26", "lanes": "100", "breakout_modes": { - "1x1G[100]": ["etp26"] + "1x1000[100,10]": ["etp26"] } }, "Ethernet26": { "index": "27", "lanes": "104", "breakout_modes": { - "1x1G[100]": ["etp27"] + "1x1000[100,10]": ["etp27"] } }, "Ethernet27": { "index": "28", "lanes": "108", "breakout_modes": { - "1x1G[100]": ["etp28"] + "1x1000[100,10]": ["etp28"] } }, "Ethernet28": { "index": "29", "lanes": "112", "breakout_modes": { - "1x1G[100]": ["etp29"] + "1x1000[100,10]": ["etp29"] } }, "Ethernet29": { "index": "30", "lanes": "116", "breakout_modes": { - "1x1G[100]": ["etp30"] + "1x1000[100,10]": ["etp30"] } }, "Ethernet30": { "index": "31", "lanes": "120", "breakout_modes": { - "1x1G[100]": ["etp31"] + "1x1000[100,10]": ["etp31"] } }, "Ethernet31": { "index": "32", "lanes": "124", "breakout_modes": { - "1x1G[100]": ["etp32"] + "1x1000[100,10]": ["etp32"] } }, "Ethernet32": { "index": "33", "lanes": "128", "breakout_modes": { - "1x1G[100]": ["etp33"] + "1x1000[100,10]": ["etp33"] } }, "Ethernet33": { "index": "34", "lanes": "132", "breakout_modes": { - "1x1G[100]": ["etp34"] + "1x1000[100,10]": ["etp34"] } }, "Ethernet34": { "index": "35", "lanes": "136", "breakout_modes": { - "1x1G[100]": ["etp35"] + "1x1000[100,10]": ["etp35"] } }, "Ethernet35": { "index": "36", "lanes": "140", "breakout_modes": { - "1x1G[100]": ["etp36"] + "1x1000[100,10]": ["etp36"] } }, "Ethernet36": { "index": "37", "lanes": "144", "breakout_modes": { - "1x1G[100]": ["etp37"] + "1x1000[100,10]": ["etp37"] } }, "Ethernet37": { "index": "38", "lanes": "148", "breakout_modes": { - "1x1G[100]": ["etp38"] + "1x1000[100,10]": ["etp38"] } }, "Ethernet38": { "index": "39", "lanes": "152", "breakout_modes": { - "1x1G[100]": ["etp39"] + "1x1000[100,10]": ["etp39"] } }, "Ethernet39": { "index": "40", "lanes": "156", "breakout_modes": { - "1x1G[100]": ["etp40"] + "1x1000[100,10]": ["etp40"] } }, "Ethernet40": { "index": "41", "lanes": "160", "breakout_modes": { - "1x1G[100]": ["etp41"] + "1x1000[100,10]": ["etp41"] } }, "Ethernet41": { "index": "42", "lanes": "164", "breakout_modes": { - "1x1G[100]": ["etp42"] + "1x1000[100,10]": ["etp42"] } }, "Ethernet42": { "index": "43", "lanes": "168", "breakout_modes": { - "1x1G[100]": ["etp43"] + "1x1000[100,10]": ["etp43"] } }, "Ethernet43": { "index": "44", "lanes": "172", "breakout_modes": { - "1x1G[100]": ["etp44"] + "1x1000[100,10]": ["etp44"] } }, "Ethernet44": { "index": "45", "lanes": "176", "breakout_modes": { - "1x1G[100]": ["etp45"] + "1x1000[100,10]": ["etp45"] } }, "Ethernet45": { "index": "46", "lanes": "180", "breakout_modes": { - "1x1G[100]": ["etp46"] + "1x1000[100,10]": ["etp46"] } }, "Ethernet46": { "index": "47", "lanes": "184", "breakout_modes": { - "1x1G[100]": ["etp47"] + "1x1000[100,10]": ["etp47"] } }, "Ethernet47": { "index": "48", "lanes": "188", "breakout_modes": { - "1x1G[100]": ["etp48"] + "1x1000[100,10]": ["etp48"] } }, "Ethernet48": { diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json b/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json new file mode 100644 index 000000000000..e28c19087875 --- /dev/null +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json @@ -0,0 +1,12 @@ +{ + "chassis": { + "SN2201": { + "component": { + "ONIE": { }, + "SSD": { }, + "CPLD1": { }, + "CPLD2": { } + } + } + } +} diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/sensors.conf b/device/mellanox/x86_64-nvidia_sn2201-r0/sensors.conf index 176502c4731a..1c29cfd2d7b3 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/sensors.conf +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/sensors.conf @@ -6,7 +6,11 @@ # Fan Controller emc2305. bus "i2c-7" "i2c-1-mux (chan_id 5)" - chip "emc2305-i2c-7-4d" + chip "emc2305-i2c-7-4d" + label fan1 "Chassis Fan Drawer-1" + label fan2 "Chassis Fan Drawer-2" + label fan3 "Chassis Fan Drawer-3" + label fan4 "Chassis Fan Drawer-4" ignore fan5 # Temperature sensors @@ -14,6 +18,59 @@ chip "coretemp-isa-0000" label temp8 "Core 0" label temp14 "Core 1" +bus "i2c-2" "i2c-1-mux (chan_id 4)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + ignore temp2 + ignore temp3 + ignore temp4 + ignore temp5 + ignore temp6 + ignore temp7 + ignore temp8 + ignore temp9 + ignore temp10 + ignore temp11 + ignore temp12 + ignore temp13 + ignore temp14 + ignore temp15 + ignore temp16 + ignore temp17 + ignore temp18 + ignore temp19 + ignore temp20 + ignore temp21 + ignore temp22 + ignore temp23 + ignore temp24 + ignore temp25 + ignore temp26 + ignore temp26 + ignore temp27 + ignore temp28 + ignore temp29 + ignore temp30 + ignore temp31 + ignore temp32 + ignore temp33 + ignore temp34 + ignore temp35 + ignore temp36 + ignore temp37 + ignore temp38 + ignore temp39 + ignore temp40 + ignore temp41 + ignore temp42 + ignore temp43 + ignore temp44 + ignore temp45 + ignore temp46 + ignore temp47 + ignore temp48 + ignore temp49 + bus "i2c-2" "i2c-1-mux (chan_id 0)" chip "lm75-i2c-*-4a" label temp1 "Ambient Switch Board Temp" @@ -33,15 +90,71 @@ bus "i2c-8" "i2c-1-mux (chan_id 6)" # Power controllers bus "i2c-9" "i2c-1-mux (chan_id 7)" chip "pmbus-i2c-*-40" - ignore curr3 - ignore in3 - ignore power3 + label curr1 "VR IC PSU 12V Rail Curr(in)" + label curr2 "ASIC 0.9V VCORE Rail Curr(out)" + label in1 "VR IC PSU 12V Rail" + label in2 "VR IC ASIC 0.9V VCORE Rail" + label power1 "VR IC PSU 12V Rail Pwr(in)" + label power2 "ASIC 0.9V VCORE Rail Pwr(out)" + ignore curr3 + ignore in3 + ignore power3 + label temp1 "VR IC Temp1" bus "i2c-2" "i2c-1-mux (chan_id 0)" chip "ads1015-i2c-*-49" - ignore in1 - ignore in2 - ignore in4 - ignore in5 - ignore in6 - ignore in7 + label in0 "ASIC 1.8V Rail" + label in3 "MONITOR MB 12V" + compute in3 (7.2)*@, @/(7.2) + ignore in1 + ignore in2 + ignore in4 + ignore in5 + ignore in6 + ignore in7 + +bus "i2c-8" "i2c-1-mux (chan_id 6)" + chip "powr1014-i2c-8-37" + label in0 "MONITOR CPU Board V3P3" + label in1 "MONITOR CPU Board VR_VCC_1V15" + label in2 "MONITOR CPU Board VR_VNN_1V05" + label in3 "MONITOR CPU Board VR_VCCRAM_1V15" + label in4 "MONITOR CPU Board VR_VDDQ_1V20" + label in5 "MONITOR CPU Board V1P05" + label in6 "MONITOR CPU Board P2V5_VPP" + label in7 "MONITOR CPU Board P0V6_VTT_DIMM" + label in8 "MONITOR CPU Board V1P8" + label in9 "MONITOR CPU Board V1P24" + +# PSU PMBus sensors +bus "i2c-3" "i2c-1-mux (chan_id 1)" + chip "pmbus-i2c-3-58" + label in1 "PSU-1 220V Rail(in)" + label in2 "PSU-1 12V Rail(out)" + ignore in3 + label fan1 "PSU-1 Fan1" + label temp1 "PSU-1 Temp1" + label temp2 "PSU-1 Temp2" + label temp3 "PSU-1 Temp3" + label curr1 "PSU-1 220V Rail Curr(in)" + label curr2 "PSU-1 12V Rail Curr(out)" + ignore curr3 + label power1 "PSU-1 220V Rail Pwr(in)" + label power2 "PSU-1 12V Rail Pwr(out)" + ignore power3 + +bus "i2c-4" "i2c-1-mux (chan_id 2)" + chip "pmbus-i2c-4-58" + label in1 "PSU-2 220V Rail(in)" + label in2 "PSU-2 12V Rail(out)" + ignore in3 + label fan1 "PSU-2 Fan1" + label temp1 "PSU-2 Temp1" + label temp2 "PSU-2 Temp2" + label temp3 "PSU-2 Temp3" + label curr1 "PSU-2 220V Rail Curr(in)" + label curr2 "PSU-2 12V Rail Curr(out)" + ignore curr3 + label power1 "PSU-2 220V Rail Pwr(in)" + label power2 "PSU-2 12V Rail Pwr(out)" + ignore power3 From fb7f046143bfe0356237352a412ac6cb52a4e341 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Sat, 19 Mar 2022 08:27:02 +0800 Subject: [PATCH 098/817] [yang] Update YANG model for mirror session to support decimal value for GRE type (#10140) #### Why I did it PR https://github.com/Azure/sonic-utilities/pull/1825 added validation for the input of `config mirror session add`, and only decimal value is accepted. An issue https://github.com/Azure/sonic-buildimage/issues/10096 was raised to suggest accepting HEX value as well, and the suggestion makes sense to me. To accept HEX value for GRE type, and keep backward compatibility as well, I updated the YANG model to support both decimal and hexadecimal input for GRE type. #### How I did it Update the regex for GRE type. #### How to verify it Verified by UT ``` platform linux -- Python 3.9.2, pytest-6.0.2, py-1.10.0, pluggy-0.13.0 rootdir: /sonic/src/sonic-yang-models plugins: pyfakefs-4.5.4, cov-2.10.1 collected 3 items tests/test_sonic_yang_models.py .. [ 66%] tests/yang_model_tests/test_yang_model.py . [100%] ========================================================================================== 3 passed in 2.53s ========================================================================================== ``` #### Description for the changelog Update YANG model for mirror session to support decimal value for GRE type. --- .../tests/mirror_session.json | 24 ++++- .../tests_config/mirror_session.json | 100 +++++++++++++++++- .../yang-models/sonic-mirror-session.yang | 2 +- 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json b/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json index 6d53b0e9cffb..c54ca3d9595a 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json @@ -1,6 +1,18 @@ { - "MIRROR_ERSPAN_ENTRY_WITH_VALID_VALUES": { - "desc": "Configuring ERSPAN entry with valid values." + "MIRROR_ERSPAN_ENTRY_WITH_VALID_HEX_VALUES": { + "desc": "Configuring ERSPAN entry with valid heximal values." + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_HEX_VALUES_1": { + "desc": "Configuring ERSPAN entry with valid heximal values." + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES": { + "desc": "Configuring ERSPAN entry with valid decimal values." + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES_1": { + "desc": "Configuring ERSPAN entry with valid decimal values." + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES_2": { + "desc": "Configuring ERSPAN entry with valid decimal values." }, "MIRROR_ERSPAN_ENTRY_WRONG_TYPE": { "desc": "Configuring ERSPAN entry with invalid type", @@ -26,6 +38,14 @@ "desc": "Configuring ERSPAN entry with invalid GRE type", "eStrKey" : "Pattern" }, + "MIRROR_ERSPAN_ENTRY_WRONG_GRE_TYPE_1": { + "desc": "Configuring ERSPAN entry with invalid GRE type", + "eStrKey" : "Pattern" + }, + "MIRROR_ERSPAN_ENTRY_WRONG_GRE_TYPE_2": { + "desc": "Configuring ERSPAN entry with invalid GRE type", + "eStrKey" : "Pattern" + }, "MIRROR_ERSPAN_ENTRY_GRE_WRONG_TYPE": { "desc": "Configuring ERSPAN entry with invalid GRE type", "eStrKey" : "When" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json index ddf956c79f83..5e820b5f5fdf 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json @@ -1,5 +1,5 @@ { - "MIRROR_ERSPAN_ENTRY_WITH_VALID_VALUES": { + "MIRROR_ERSPAN_ENTRY_WITH_VALID_HEX_VALUES": { "sonic-mirror-session:sonic-mirror-session": { "MIRROR_SESSION": { "MIRROR_SESSION_LIST": [ @@ -15,6 +15,70 @@ } } }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_HEX_VALUES_1": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "0x0", + "dscp": "10" + } + ] + } + } + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "1234", + "dscp": "10" + } + ] + } + } + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES_1": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "65535", + "dscp": "10" + } + ] + } + } + }, + "MIRROR_ERSPAN_ENTRY_WITH_VALID_DEC_VALUES_2": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "0", + "dscp": "10" + } + ] + } + } + }, "MIRROR_ERSPAN_ENTRY_WRONG_TYPE": { "sonic-mirror-session:sonic-mirror-session": { "MIRROR_SESSION": { @@ -104,7 +168,39 @@ "type": "ERSPAN", "dst_ip": "11.1.1.1", "src_ip": "10.1.1.1", - "gre_type": "0", + "gre_type": "100000", + "dscp": "10" + } + ] + } + } + }, + "MIRROR_ERSPAN_ENTRY_WRONG_GRE_TYPE_1": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "-1", + "dscp": "10" + } + ] + } + } + }, + "MIRROR_ERSPAN_ENTRY_WRONG_GRE_TYPE_2": { + "sonic-mirror-session:sonic-mirror-session": { + "MIRROR_SESSION": { + "MIRROR_SESSION_LIST": [ + { + "name": "erspan", + "type": "ERSPAN", + "dst_ip": "11.1.1.1", + "src_ip": "10.1.1.1", + "gre_type": "65536", "dscp": "10" } ] diff --git a/src/sonic-yang-models/yang-models/sonic-mirror-session.yang b/src/sonic-yang-models/yang-models/sonic-mirror-session.yang index ba8a1e13c7d6..9ea1954d7a37 100644 --- a/src/sonic-yang-models/yang-models/sonic-mirror-session.yang +++ b/src/sonic-yang-models/yang-models/sonic-mirror-session.yang @@ -99,7 +99,7 @@ module sonic-mirror-session { leaf gre_type { when "current()/../type = 'ERSPAN'"; type string { - pattern "0[xX][0-9a-fA-F]*"; + pattern "0[xX][0-9a-fA-F]*|([0-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[0-5])"; length 1..6 { error-message "Invalid GRE type"; error-app-tag gre-type-invalid; From ed4f19fb28142a2221c9c5c27aede3ecdb9b83c8 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 19 Mar 2022 21:48:27 +0800 Subject: [PATCH 099/817] [Build][Bug]: fix the warning message not printed as expected issue (#10278) Fix the warning message not printed as expected issue --- src/sonic-build-hooks/hooks/apt-get | 4 ++-- src/sonic-build-hooks/scripts/buildinfo_base.sh | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sonic-build-hooks/hooks/apt-get b/src/sonic-build-hooks/hooks/apt-get index f1f789542b7a..625b06843610 100755 --- a/src/sonic-build-hooks/hooks/apt-get +++ b/src/sonic-build-hooks/hooks/apt-get @@ -10,10 +10,10 @@ if [ -z "$REAL_COMMAND" ]; then exit 1 fi -INSTALL=$(check_apt_install) +INSTALL=$(check_apt_install "$@") COMMAND_INFO="Locked by command: $REAL_COMMAND $@" if [ "$INSTALL" == y ]; then - check_apt_version + check_apt_version "$@" lock_result=$(acquire_apt_installation_lock "$COMMAND_INFO" ) $REAL_COMMAND "$@" command_result=$? diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index 22ab3da4e9ae..3873d1362926 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -213,6 +213,10 @@ check_apt_version() continue fi + if [ "$para" == "install" ]; then + continue + fi + if [[ "$para" == *=* ]]; then continue else From dc04d64219cc1d207fc32eb3bf23841d358deb99 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Sun, 20 Mar 2022 16:34:04 +0800 Subject: [PATCH 100/817] [Mellanox] Fix issue: psu might use wrong voltage sysfs which causes invalid voltage value (#10231) - Why I did it Fix issue: psu might use wrong voltage sysfs which causes invalid voltage value. The flow is like: 1. User power off a PSU 2. All sysfs files related to this PSU are removed 3. User did a reboot/config reload 4. PSU will use wrong sysfs as voltage node - How I did it Always try find an existing sysfs. - How to verify it Manual test --- .../mlnx-platform-api/sonic_platform/psu.py | 57 +++++++++++++++---- .../mlnx-platform-api/tests/test_psu.py | 6 ++ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index 160fd8bd7469..64aa0166086f 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -200,16 +200,10 @@ class Psu(FixedPsu): def __init__(self, psu_index): super(Psu, self).__init__(psu_index) - psu_voltage_out2 = os.path.join(PSU_PATH, "power/psu{}_volt_out2".format(self.index)) - psu_voltage = os.path.join(PSU_PATH, "power/psu{}_volt".format(self.index)) - # Workaround for psu voltage sysfs file as the file name differs among platforms - if os.path.exists(psu_voltage_out2): - self.psu_voltage = psu_voltage_out2 - else: - self.psu_voltage = psu_voltage - self.psu_voltage_min = self.psu_voltage + "_min" - self.psu_voltage_max = self.psu_voltage + "_max" - self.psu_voltage_capability = self.psu_voltage + "_capability" + self._psu_voltage = None + self._psu_voltage_min = None + self._psu_voltage_max = None + self._psu_voltage_capability = None self.psu_current = os.path.join(PSU_PATH, self.PSU_CURRENT.format(self.index)) self.psu_power = os.path.join(PSU_PATH, self.PSU_POWER.format(self.index)) @@ -228,6 +222,47 @@ def __init__(self, psu_index): from .thermal import initialize_psu_thermal self._thermal_list = initialize_psu_thermal(psu_index, self.get_power_available_status) + @property + def psu_voltage(self): + if not self._psu_voltage: + psu_voltage_out = os.path.join(PSU_PATH, "power/psu{}_volt_out2".format(self.index)) + if os.path.exists(psu_voltage_out): + self._psu_voltage = psu_voltage_out + else: + psu_voltage_out = os.path.join(PSU_PATH, "power/psu{}_volt".format(self.index)) + if os.path.exists(psu_voltage_out): + self._psu_voltage = psu_voltage_out + + return self._psu_voltage + + @property + def psu_voltage_min(self): + if not self._psu_voltage_min: + psu_voltage = self.psu_voltage + if psu_voltage: + self._psu_voltage_min = psu_voltage + "_min" + + return self._psu_voltage_min + + @property + def psu_voltage_max(self): + if not self._psu_voltage_max: + psu_voltage = self.psu_voltage + if psu_voltage: + self._psu_voltage_max = psu_voltage + "_max" + + return self._psu_voltage_max + + @property + def psu_voltage_capability(self): + if not self._psu_voltage_capability: + psu_voltage = self.psu_voltage + if psu_voltage: + self._psu_voltage_capability = psu_voltage + "_capability" + + return self._psu_voltage_capability + + def get_model(self): """ Retrieves the model number (or part number) of the device @@ -272,7 +307,7 @@ def get_voltage(self): A float number, the output voltage in volts, e.g. 12.1 """ - if self.get_powergood_status(): + if self.get_powergood_status() and self.psu_voltage: # TODO: should we put log_func=None here? If not do this, when a PSU is back to power, some PSU related # sysfs may not ready, read_int_from_file would encounter exception and log an error. voltage = utils.read_int_from_file(self.psu_voltage, log_func=logger.log_info) diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 6de042e7bd8b..34fa70c7beca 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -50,6 +50,7 @@ def test_fixed_psu(self): assert psu.get_temperature() is None assert psu.get_temperature_high_threshold() is None + @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) def test_psu(self): psu = Psu(0) assert len(psu._fan_list) == 1 @@ -58,6 +59,8 @@ def test_psu(self): psu.psu_presence: 1, psu.psu_oper_status: 1, psu.psu_voltage: 10234, + psu.psu_voltage_min: 9000, + psu.psu_voltage_max: 12000, psu.psu_current: 20345, psu.psu_power: 30456, psu.psu_temp: 40567, @@ -68,6 +71,7 @@ def mock_read_int_from_file(file_path, **kwargs): return mock_sysfs_content[file_path] utils.read_int_from_file = mock_read_int_from_file + utils.read_str_from_file = mock.MagicMock(return_value='min max') assert psu.get_presence() is True mock_sysfs_content[psu.psu_presence] = 0 assert psu.get_presence() is False @@ -84,6 +88,8 @@ def mock_read_int_from_file(file_path, **kwargs): mock_sysfs_content[psu.psu_oper_status] = 1 assert psu.get_voltage() == 10.234 + assert psu.get_voltage_high_threshold() == 12.0 + assert psu.get_voltage_low_threshold() == 9.0 assert psu.get_current() == 20.345 assert psu.get_power() == 0.030456 assert psu.get_temperature() == 40.567 From 4659f8b8e807aa80defd6c521b2b9a62a1d8b3d8 Mon Sep 17 00:00:00 2001 From: liuh-80 <58683130+liuh-80@users.noreply.github.com> Date: Mon, 21 Mar 2022 08:33:12 +0800 Subject: [PATCH 101/817] [Submodule] Update src/sonic-utilities (#10272) Updating sonic-utilities sub module with the following commits b00b870 [build] stop vstest in the Azure pipeline 2c56e92 [GCU] Marking fields under BGP_PEER_RANGE, BGP_MONITORS as create-only 6289987 Fix sonic-installer failure due to missing import 45e6ac1 [show] add support for hwstatus in show muxcable status 93384ed Try get port operational speed from STATE DB 483fc6e [techsupport] Added a lock to avoid running techsupport in parallel 398da58 Validation check correction while adding a member to PortChannel a8a7edb [generate_dump] exclude mft and mlx folders from /etc 1cf1d03 Fix UT failed cause by change pycommon to use swsscommon --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 47c243eb7e9c..a2e68a05a8e6 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 47c243eb7e9cbe6ebd3479290a98183071cf2124 +Subproject commit a2e68a05a8e6ab296978a59bf107971beb899546 From 49ac9f9005cafbea419819598fbc4b0768464344 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 21 Mar 2022 10:27:24 +0800 Subject: [PATCH 102/817] [Build]: Support to set jobFilters (#10280) [Build]: Support to set jobFilters --- .../azure-pipelines-UpgrateVersion.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 5cd85ab5520b..0c7f7f966297 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -20,6 +20,20 @@ schedules: pool: sonicbld +parameters: +- name: 'jobFilters' + type: object + default: + - vs + - barefoot + - broadcom + - centec + - centec-arm64 + - generic + - innovium + - marvell-armhf + - mellanox + stages: - stage: Build variables: @@ -28,6 +42,7 @@ stages: jobs: - template: azure-pipelines-build.yml parameters: + jobFilters: ${{ parameters.jobFilters }} buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' preSteps: - script: | From 87af5659c55bd1774aeb1d117a8a8f5336ed14a9 Mon Sep 17 00:00:00 2001 From: liuh-80 <58683130+liuh-80@users.noreply.github.com> Date: Mon, 21 Mar 2022 13:04:22 +0800 Subject: [PATCH 103/817] Update submodule sonic-snmpagent (#10277) Updating sonic-snmpagent submodule with the following commits dae8146 [ci]: Support code diff coverage 6bd51c4 Fix: LAG counters, if LAG don't have L3 interface 2654f4a Fix snmp agent Initialize config DB multiple times issue #### Why I did it When change pycommon to use swsscommon UT failed in sonic-snmpagent, need submodule update with UT issue fix. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog [ci]: Support code diff coverage Fix: LAG counters, if LAG don't have L3 interface Fix snmp agent Initialize config DB multiple times issue #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 4ee573cddc4e..2654f4a66794 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 4ee573cddc4e356b589bcf29c19cedc4562a8b34 +Subproject commit 2654f4a667941296d4e56a16e8e1a7d1d5fca7b6 From 1017ee60023bf0046be00a3da859b874b51bf6b4 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 21 Mar 2022 16:47:20 +0800 Subject: [PATCH 104/817] [Build]: Use one debian mirror config (#10274) Why I did it Use one debian mirror config. The empty config in https://github.com/Azure/sonic-buildimage/blob/master/files/image_config/apt/sources.list overrides the file https://github.com/Azure/sonic-buildimage/blob/master/files/apt/sources.list.amd64 (armhf/arm64), it does not make sense. All the content in files/image_config/apt is no use, any one wants to add mirror config, please add in files/apt. How I did it Remove files/image_config/apt and the reference. --- files/apt/sources.list.amd64 | 22 +++++++------- files/apt/sources.list.arm64 | 20 ++++++------- files/apt/sources.list.armhf | 20 ++++++------- .../build_templates/sonic_debian_extension.j2 | 6 ---- files/image_config/apt/sonic-dev.gpg.key | 30 ------------------- files/image_config/apt/sources.list | 0 ...ian_archive_trafficmanager_net_debian.list | 3 -- .../arm64/debian_mirror_arm64.list | 9 ------ .../armhf/debian_mirror_armhf.list | 9 ------ 9 files changed, 30 insertions(+), 89 deletions(-) delete mode 100644 files/image_config/apt/sonic-dev.gpg.key delete mode 100644 files/image_config/apt/sources.list delete mode 100644 files/image_config/apt/sources.list.d/amd64/debian_archive_trafficmanager_net_debian.list delete mode 100644 files/image_config/apt/sources.list.d/arm64/debian_mirror_arm64.list delete mode 100644 files/image_config/apt/sources.list.d/armhf/debian_mirror_armhf.list diff --git a/files/apt/sources.list.amd64 b/files/apt/sources.list.amd64 index 04a2b143532d..fb0a1e994932 100644 --- a/files/apt/sources.list.amd64 +++ b/files/apt/sources.list.amd64 @@ -1,15 +1,13 @@ ## Debian mirror on Microsoft Azure ## Ref: http://debian-archive.trafficmanager.net/ -deb [arch=amd64] http://deb.debian.org/debian/ bullseye main contrib non-free -deb-src [arch=amd64] http://deb.debian.org/debian/ bullseye main contrib non-free -#deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free -#deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free -#deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye/updates main contrib non-free -#deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye/updates main contrib non-free -#deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free -#deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -#deb-src [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -#deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security/ bullseye_updates main contrib non-free -#deb-src [arch=amd64] http://packages.trafficmanager.net/debian/debian-security/ bullseye_updates main contrib non-free -#deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye-backports main contrib non-free +deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye-backports main contrib non-free diff --git a/files/apt/sources.list.arm64 b/files/apt/sources.list.arm64 index abd625070414..75bebe1a91d1 100644 --- a/files/apt/sources.list.arm64 +++ b/files/apt/sources.list.arm64 @@ -1,13 +1,13 @@ ## Debian mirror for ARM ## Not the repo mirror site can change in future, and needs to be updated to be in sync -deb [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free -deb-src [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free -deb [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb-src [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb [arch=arm64] http://ftp.debian.org/debian bullseye-backports main -# deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -# deb-src [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -# deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free -# deb-src [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free -# deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-backports main +deb [arch=arm64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb-src [arch=arm64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb [arch=arm64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb-src [arch=arm64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb [arch=arm64] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free +deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb-src [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb-src [arch=arm64] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-backports main contrib non-free diff --git a/files/apt/sources.list.armhf b/files/apt/sources.list.armhf index ded8e27e6b2b..378aa084524e 100644 --- a/files/apt/sources.list.armhf +++ b/files/apt/sources.list.armhf @@ -1,13 +1,13 @@ ## Debian mirror for ARM ## Not the repo mirror site can change in future, and needs to be updated to be in sync -deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free -deb [arch=armhf] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb [arch=armhf] http://ftp.debian.org/debian bullseye-backports main -# deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -# deb-src [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free -# deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free -# deb-src [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free -# deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-backports main +deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +deb [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-backports main contrib non-free diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 455179c08029..a49e29406eeb 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -75,12 +75,6 @@ else sudo chroot $FILESYSTEM_ROOT $DOCKER_CTL_SCRIPT start fi -# Apply apt configuration files -sudo cp $IMAGE_CONFIGS/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ -sudo mkdir -p $FILESYSTEM_ROOT/etc/apt/sources.list.d/ -sudo cp -R $IMAGE_CONFIGS/apt/sources.list.d/${CONFIGURED_ARCH}/* $FILESYSTEM_ROOT/etc/apt/sources.list.d/ -cat $IMAGE_CONFIGS/apt/sonic-dev.gpg.key | sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - - # Update apt's snapshot of its repos sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get update diff --git a/files/image_config/apt/sonic-dev.gpg.key b/files/image_config/apt/sonic-dev.gpg.key deleted file mode 100644 index fb9a37901bc7..000000000000 --- a/files/image_config/apt/sonic-dev.gpg.key +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mQENBFQ1bTIBCAC7oGfkv/ck0XsLuG8cdcSB2ISqxFAcBvH9BitEtxmpW2uhykKk -xY4rVD/4Uys1s3PF1/64QfPR+hYcewueOwz0ZAcLyFXXk4McICXaPq3NrLiWYKKX -UZLnrPzcrGZoW/kHDDp4OmBiDmT1PGvZlpuimwkMCusUzIr7Cbbp2dIy8MERL5tA -LcgLu3KL6clJ+aTW2jgepI1D7sTepOeGd7eRSb5njKg2M7k/93v/7MipZxiVtyXH -B74YiK6jSbst5JpuYsLa/Dqryvx7Xq3n53oif892pv3euTduo1fYw8Hgh/OOYdeT -c9WCj03KA1jCSFURjdrug0kR8BPlfjqtRLXFABEBAAG0JE1TIE9wZW4gVGVjaCA8 -aW50ZXJvcEBtaWNyb3NvZnQuY29tPokBOAQTAQIAIgUCVDVtMgIbAwYLCQgHAwIG -FQgCCQoLBBYCAwECHgECF4AACgkQsCxG30F6CJO1uAf/cmL68bM8YgF/61hkaY56 -LqrppUTJH/w4fKq47Pf6KfgSLvxfNU6soi2KHYRjIvTRx3tV4vUM5n2plaQg2s8V -/Epg4FeIRTk75YwiHAzLhLnp5cdUaTvC4j4mwxoB6j9Ty+fXJwQ0MvpDhIZb9vM4 -GXw/fEQHCT4f3gx4nReeqE+FB2wVHleX9+Lpodu98JyJTKJRBRHYLqy6S+/lyp2W -aBlsI1LOqBcx1uRK24U7duIpbYwIyrx0cafSruqR2GjVdu+imkhHyUn52VbzYhq1 -af0rqYiZ1VOamVOG0By8+hVyNa1MLc1K2uWGs0o5fDe9F5/swbvLHVXI+M50Vs+m -J7kBDQRUNW0yAQgAu7DkTVj0ZQC4F7bFivAwrdby8gCakTXOl1kcK622hjRJ8nam -aZeW+eADfLRsTmdUmXgZu1YWS5Gn2ZVngC8SGPUBT071+oRETCz4uNB7IimB9QfP -++orI6o2vmnVVsq5wWCbEdNU+TCVv1zjrYev5lwckkKpjHt6o8MNoX2DFuQymSyR -eZKaqhdKmcji4Ke7OIYqwgPjch3wxzE1b5gNOR/iwxWyjjOffZPLr/VhIfIJRs86 -dSXrwjHtEh810SKDLghHM0VAdY34nyC5ZZ61yhts5HtQDFK+9mNpH1mkc4gDBlgG -266pVvknumK6lPNm/osF/cpjWmEw24ypcQIvOQARAQABiQEfBBgBAgAJBQJUNW0y -AhsMAAoJELAsRt9BegiTMBUH/0sZ6gZy7mCTSAYT+NSXLFtGC2zNUVL80SWvfgYm -k9XPVI22MrefZfQ6M01RylyxtWXjRM8UoN8SDKWPpXumzJf831f/7om5zwutaG7b -tjDPYqRKJSbAIFZu2mN+uLrNQ2SV6XK7FoV0dtcrEX9S7RICb6i19D+70+Oh/qgU -R04H1jqS29XBzqAlIzdBoA+sYAwbOIJsSL3YyNQcUv3B5+5yR/bo/L8pnUJt6iuL -nWW+mi7r8gWPHDSrcdYq1TmmlOM7CwZPgWRZzkQPSeZz52Tt7IP47eyGJ09U4PIf -FtMH1ElL2UgHoA/F9Q88e7LkztaTqE59uXWbIYyuSMJVvRU= -=sb3d ------END PGP PUBLIC KEY BLOCK----- diff --git a/files/image_config/apt/sources.list b/files/image_config/apt/sources.list deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/files/image_config/apt/sources.list.d/amd64/debian_archive_trafficmanager_net_debian.list b/files/image_config/apt/sources.list.d/amd64/debian_archive_trafficmanager_net_debian.list deleted file mode 100644 index db55f3dd60cf..000000000000 --- a/files/image_config/apt/sources.list.d/amd64/debian_archive_trafficmanager_net_debian.list +++ /dev/null @@ -1,3 +0,0 @@ -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free -#deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye/updates main contrib non-free -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free diff --git a/files/image_config/apt/sources.list.d/arm64/debian_mirror_arm64.list b/files/image_config/apt/sources.list.d/arm64/debian_mirror_arm64.list deleted file mode 100644 index a34ce92658cc..000000000000 --- a/files/image_config/apt/sources.list.d/arm64/debian_mirror_arm64.list +++ /dev/null @@ -1,9 +0,0 @@ -deb [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free -deb-src [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free -deb [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb-src [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb [arch=arm64] http://security.debian.org bullseye-security main contrib non-free -deb-src [arch=arm64] http://security.debian.org bullseye-security main contrib non-free -deb [arch=arm64] https://download.docker.com/linux/debian bullseye stable -deb [arch=arm64] http://ftp.debian.org/debian bullseye-backports main - diff --git a/files/image_config/apt/sources.list.d/armhf/debian_mirror_armhf.list b/files/image_config/apt/sources.list.d/armhf/debian_mirror_armhf.list deleted file mode 100644 index 7c4865525feb..000000000000 --- a/files/image_config/apt/sources.list.d/armhf/debian_mirror_armhf.list +++ /dev/null @@ -1,9 +0,0 @@ -deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free -deb [arch=armhf] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian bullseye-updates main contrib non-free -deb [arch=armhf] http://security.debian.org bullseye-security main contrib non-free -deb-src [arch=armhf] http://security.debian.org bullseye-security main contrib non-free -deb [arch=armhf] https://download.docker.com/linux/debian bullseye stable -deb [arch=armhf] http://ftp.debian.org/debian bullseye-backports main - From 92363eadbeff78e0a29344574115177e8c790cca Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 21 Mar 2022 17:10:33 +0800 Subject: [PATCH 105/817] [Build]: support to collect version when purging debian package (#10287) Why I did it support to collect version when purging debian package Support to collect version multiple times How I did it Add the collection action before purging. --- src/sonic-build-hooks/hooks/apt-get | 5 +++++ .../scripts/collect_version_files | 18 +++++++++++++++--- .../scripts/post_run_buildinfo | 2 -- .../scripts/pre_run_buildinfo | 2 ++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/sonic-build-hooks/hooks/apt-get b/src/sonic-build-hooks/hooks/apt-get index 625b06843610..bdff703d01d7 100755 --- a/src/sonic-build-hooks/hooks/apt-get +++ b/src/sonic-build-hooks/hooks/apt-get @@ -20,6 +20,11 @@ if [ "$INSTALL" == y ]; then [ "$lock_result" == y ] && release_apt_installation_lock exit $command_result else + if [[ "$1" == "purge" || "$@" == *" purge "* ]]; then + # When running the purge command, collect the debian versions + dpkg-query -W -f '${Package}==${Version}\n' >> $POST_VERSION_PATH/purge-versions-deb + chmod a+wr $POST_VERSION_PATH/purge-versions-deb + fi $REAL_COMMAND "$@" fi diff --git a/src/sonic-build-hooks/scripts/collect_version_files b/src/sonic-build-hooks/scripts/collect_version_files index b62beb4a2115..570883701e98 100755 --- a/src/sonic-build-hooks/scripts/collect_version_files +++ b/src/sonic-build-hooks/scripts/collect_version_files @@ -1,14 +1,26 @@ #!/bin/bash +. /usr/local/share/buildinfo/scripts/buildinfo_base.sh + TARGET_PATH=$1 +[ -z "$TARGET_PATH" ] && TARGET_PATH=$POST_VERSION_PATH ARCH=$(dpkg --print-architecture) DIST=$(grep VERSION_CODENAME /etc/os-release | cut -d= -f2) ([ -z "$DIST" ] && grep -q jessie /etc/os-release) && DIST=jessie mkdir -p $TARGET_PATH chmod a+rw $TARGET_PATH -dpkg-query -W -f '${Package}==${Version}\n' > "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" -([ -x "/usr/local/bin/pip2" ] || [ -x "/usr/bin/pip2" ]) && pip2 freeze > "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" -([ -x "/usr/local/bin/pip3" ] || [ -x "/usr/bin/pip3" ]) && pip3 freeze > "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" + +dpkg-query -W -f '${Package}==${Version}\n' >> "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" +([ -x "/usr/local/bin/pip2" ] || [ -x "/usr/bin/pip2" ]) && pip2 freeze >> "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" +([ -x "/usr/local/bin/pip3" ] || [ -x "/usr/bin/pip3" ]) && pip3 freeze >> "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" + +## Add the the packages purged +[ -f $POST_VERSION_PATH/purge-versions-deb ] && cat $POST_VERSION_PATH/purge-versions-deb >> "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" + +## Print the unique and sorted result +sort -u "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" +sort -u "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" +sort -u "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" exit 0 diff --git a/src/sonic-build-hooks/scripts/post_run_buildinfo b/src/sonic-build-hooks/scripts/post_run_buildinfo index 614389fd424c..e0d84d35bb08 100755 --- a/src/sonic-build-hooks/scripts/post_run_buildinfo +++ b/src/sonic-build-hooks/scripts/post_run_buildinfo @@ -2,8 +2,6 @@ . /usr/local/share/buildinfo/scripts/buildinfo_base.sh -[ -d $POST_VERSION_PATH ] && rm -rf $POST_VERSION_PATH - # Collect the version files collect_version_files $POST_VERSION_PATH diff --git a/src/sonic-build-hooks/scripts/pre_run_buildinfo b/src/sonic-build-hooks/scripts/pre_run_buildinfo index 3cf0cf7c8dfe..d9b927ab42f9 100755 --- a/src/sonic-build-hooks/scripts/pre_run_buildinfo +++ b/src/sonic-build-hooks/scripts/pre_run_buildinfo @@ -8,6 +8,8 @@ mkdir -p $BUILD_VERSION_PATH mkdir -p $LOG_PATH [ -d $PRE_VERSION_PATH ] && rm -rf $PRE_VERSION_PATH +[ -d $POST_VERSION_PATH ] && rm -rf $POST_VERSION_PATH +mkdir -p $POST_VERSION_PATH collect_version_files $PRE_VERSION_PATH symlink_build_hooks set_reproducible_mirrors From e4b507fa0309717f459fadaabcefb38e989153fd Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 21 Mar 2022 05:25:23 -0700 Subject: [PATCH 106/817] [Arista] rename management interface in initrd (#9856) On some products the pci enumeration adds randomness into which nic gets initialized first. Because SONiC doesn't use deterministic interface naming but instead old style interface naming, this leads to eth0 not always being the management port. To make sure eth0 is always the management port (SONiC expectation) rename the interfaces in the initramfs for Arista products. --- files/initramfs-tools/arista-net | 42 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/files/initramfs-tools/arista-net b/files/initramfs-tools/arista-net index 8759746458d6..64308630098c 100644 --- a/files/initramfs-tools/arista-net +++ b/files/initramfs-tools/arista-net @@ -95,19 +95,33 @@ fi # Iterate over all the net_maX items found in the cmdline two times. # First time renaming the interfaces to maX. # The second time renaming them to their final name ethX. -if [ -n "$aboot_flag" -a "$platform_flag" == 'rook' ]; then - for item in $items; do - key="${item%=*}" - value="${item#*=}" - arista_net_rename "$value" "$key" eth - done - for item in $items; do - key="${item%=*}" - value="${item#*=}" - index="${key#ma}" - index="$(( $index - 1 ))" - newKey="eth$index" - arista_net_rename "$value" "$newKey" ma - done +if [ -n "$aboot_flag" ]; then + if [ "$platform_flag" = 'rook' -o "$platform_flag" = 'lorikeet' ]; then + # Rename existing ethX interfaces to tmpX + for x in $(ls /sys/class/net/); do + case $x in + eth*) + value="${x#*eth}" + newname="tmp$value" + ip link set $x down + ip link set $x name "$newname" + ;; + *) + esac + done + for item in $items; do + key="${item%=*}" + value="${item#*=}" + arista_net_rename "$value" "$key" tmp + done + for item in $items; do + key="${item%=*}" + value="${item#*=}" + index="${key#ma}" + index="$(( $index - 1 ))" + newKey="eth$index" + arista_net_rename "$value" "$newKey" ma + done + fi fi From e919f4dafaaa92ee3dfa1dd33bb6bda7b5a655ea Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Mon, 21 Mar 2022 08:28:03 -0400 Subject: [PATCH 107/817] [Nokia][IXR7250E]Update Nokia IXR7250E platform device data file (#10091) Signed-off-by: mlok --- .../platform.json | 153 ++++++++++++----- .../Nokia-IXR7250E-SUP-10/platform.json | 161 ++++++++++++------ 2 files changed, 220 insertions(+), 94 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json index ad911fb609b0..55630de1126a 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json @@ -12,148 +12,209 @@ "name": "FPGA2" } ], - + "watchdog": { + "disarm": false + }, + "get_module_attributes": { + "model": false, + "serial": false, + "base_mac": false, + "system_eeprom_info": false + }, + "thermal_temperature": { + "minimum": 0, + "maximum": 110 + }, "fans": [], "fan_drawers": [], "master_psu_led_color": [], "psus": [], "thermals": [ { - "name": "temp_1(fan)" + "name": "temp_1(fan)", + "controllable": false }, { - "name": "temp_2(fan)" + "name": "temp_2(fan)", + "controllable": false }, { - "name": "temp_3" + "name": "temp_3(fan)", + "controllable": false }, { - "name": "temp_4" + "name": "temp_4", + "controllable": false }, { - "name": "temp_5" + "name": "temp_5", + "controllable": false }, { - "name": "temp_6" + "name": "temp_6(fan)", + "controllable": false }, { - "name": "temp_7" + "name": "temp_7(fan)", + "controllable": false }, { - "name": "temp_8" + "name": "temp_8(fan)", + "controllable": false }, { - "name": "temp_9" + "name": "temp_9(fan)", + "controllable": false + }, + { + "name": "temp_10(fan)", + "controllable": false } ], "sfps": [ { - "name": "QSFPDD_1" + "name": "QSFPDD_1", + "tx_disable_channel": false }, { - "name": "QSFPDD_2" + "name": "QSFPDD_2", + "tx_disable_channel": false }, { - "name": "QSFPDD_3" + "name": "QSFPDD_3", + "tx_disable_channel": false }, { - "name": "QSFPDD_4" + "name": "QSFPDD_4", + "tx_disable_channel": false }, { - "name": "QSFPDD_5" + "name": "QSFPDD_5", + "tx_disable_channel": false }, { - "name": "QSFPDD_6" + "name": "QSFPDD_6", + "tx_disable_channel": false }, { - "name": "QSFPDD_7" + "name": "QSFPDD_7", + "tx_disable_channel": false }, { - "name": "QSFPDD_8" + "name": "QSFPDD_8", + "tx_disable_channel": false }, { - "name": "QSFPDD_9" + "name": "QSFPDD_9", + "tx_disable_channel": false }, { - "name": "QSFPDD_10" + "name": "QSFPDD_10", + "tx_disable_channel": false }, { - "name": "QSFPDD_11" + "name": "QSFPDD_11", + "tx_disable_channel": false }, { - "name": "QSFPDD_12" + "name": "QSFPDD_12", + "tx_disable_channel": false }, { - "name": "QSFPDD_13" + "name": "QSFPDD_13", + "tx_disable_channel": false }, { - "name": "QSFPDD_14" + "name": "QSFPDD_14", + "tx_disable_channel": false }, { - "name": "QSFPDD_15" + "name": "QSFPDD_15", + "tx_disable_channel": false }, { - "name": "QSFPDD_16" + "name": "QSFPDD_16", + "tx_disable_channel": false }, { - "name": "QSFPDD_17" + "name": "QSFPDD_17", + "tx_disable_channel": false }, { - "name": "QSFPDD_18" + "name": "QSFPDD_18", + "tx_disable_channel": false }, { - "name": "QSFPDD_19" + "name": "QSFPDD_19", + "tx_disable_channel": false }, { - "name": "QSFPDD_20" + "name": "QSFPDD_20", + "tx_disable_channel": false }, { - "name": "QSFPDD_21" + "name": "QSFPDD_21", + "tx_disable_channel": false }, { - "name": "QSFPDD_22" + "name": "QSFPDD_22", + "tx_disable_channel": false }, { - "name": "QSFPDD_23" + "name": "QSFPDD_23", + "tx_disable_channel": false }, { - "name": "QSFPDD_24" + "name": "QSFPDD_24", + "tx_disable_channel": false }, { - "name": "QSFPDD_25" + "name": "QSFPDD_25", + "tx_disable_channel": false }, { - "name": "QSFPDD_26" + "name": "QSFPDD_26", + "tx_disable_channel": false }, { - "name": "QSFPDD_27" + "name": "QSFPDD_27", + "tx_disable_channel": false }, { - "name": "QSFPDD_28" + "name": "QSFPDD_28", + "tx_disable_channel": false }, { - "name": "QSFPDD_29" + "name": "QSFPDD_29", + "tx_disable_channel": false }, { - "name": "QSFPDD_30" + "name": "QSFPDD_30", + "tx_disable_channel": false }, { - "name": "QSFPDD_31" + "name": "QSFPDD_31", + "tx_disable_channel": false }, { - "name": "QSFPDD_32" + "name": "QSFPDD_32", + "tx_disable_channel": false }, { - "name": "QSFPDD_33" + "name": "QSFPDD_33", + "tx_disable_channel": false }, { - "name": "QSFPDD_34" + "name": "QSFPDD_34", + "tx_disable_channel": false }, { - "name": "QSFPDD_35" + "name": "QSFPDD_35", + "tx_disable_channel": false }, { - "name": "QSFPDD_36" + "name": "QSFPDD_36", + "tx_disable_channel": false } ] }, diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json index ec96ac39ae09..4e24bb3e8d92 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json @@ -9,6 +9,19 @@ "name": "FPGA1" } ], + "watchdog": { + "disarm": false + }, + "get_module_attributes": { + "model": false, + "serial": false, + "base_mac": false, + "system_eeprom_info": false + }, + "thermal_temperature": { + "minimum": 0, + "maximum": 110 + }, "fans": [], "fan_drawers": [ { @@ -16,7 +29,8 @@ "num_fans": 1, "fans": [ { - "name": "Fan0" + "name": "Fan0", + "speed": { "controllable": false } } ] }, @@ -25,7 +39,8 @@ "num_fans": 1, "fans": [ { - "name": "Fan1" + "name": "Fan1", + "speed": { "controllable": false } } ] }, @@ -34,7 +49,8 @@ "num_fans": 1, "fans": [ { - "name": "Fan2" + "name": "Fan2", + "speed": { "controllable": false } } ] }, @@ -43,7 +59,8 @@ "num_fans": 1, "fans": [ { - "name": "Fan3" + "name": "Fan3", + "speed": { "controllable": false } } ] } @@ -113,136 +130,184 @@ ], "thermals": [ { - "name": "temp_1" + "name": "temp_1(fan)", + "controllable": false }, { - "name": "temp_2" + "name": "temp_2", + "controllable": false }, { - "name": "temp_3(fan)" + "name": "temp_3", + "controllable": false }, { - "name": "temp_4(fan)" + "name": "temp_4(fan)", + "controllable": false }, { - "name": "sfm1_1(fan)" + "name": "temp_5(fan)", + "controllable": false }, { - "name": "sfm1_2" + "name": "sfm1_1(fan)", + "controllable": false }, { - "name": "sfm1_3" + "name": "sfm1_2", + "controllable": false }, { - "name": "sfm1_4" + "name": "sfm1_3", + "controllable": false }, { - "name": "sfm1_5" + "name": "sfm1_4(fan)", + "controllable": false }, { - "name": "sfm2_1(fan)" + "name": "sfm1_5(fan)", + "controllable": false }, { - "name": "sfm2_2" + "name": "sfm2_1(fan)", + "controllable": false }, { - "name": "sfm2_3" + "name": "sfm2_2", + "controllable": false }, { - "name": "sfm2_4" + "name": "sfm2_3", + "controllable": false }, { - "name": "sfm2_5" + "name": "sfm2_4(fan)", + "controllable": false }, { - "name": "sfm3_1(fan)" + "name": "sfm2_5(fan)", + "controllable": false }, { - "name": "sfm3_2" + "name": "sfm3_1(fan)", + "controllable": false }, { - "name": "sfm3_3" + "name": "sfm3_2", + "controllable": false }, { - "name": "sfm3_4" + "name": "sfm3_3", + "controllable": false }, { - "name": "sfm3_5" + "name": "sfm3_4(fan)", + "controllable": false }, { - "name": "sfm4_1(fan)" + "name": "sfm3_5(fan)", + "controllable": false }, { - "name": "sfm4_2" + "name": "sfm4_1(fan)", + "controllable": false }, { - "name": "sfm4_3" + "name": "sfm4_2", + "controllable": false }, { - "name": "sfm4_4" + "name": "sfm4_3", + "controllable": false }, { - "name": "sfm4_5" + "name": "sfm4_4(fan)", + "controllable": false }, { - "name": "sfm5_1(fan)" + "name": "sfm4_5(fan)", + "controllable": false }, { - "name": "sfm5_2" + "name": "sfm5_1(fan)", + "controllable": false }, { - "name": "sfm5_3" + "name": "sfm5_2", + "controllable": false }, { - "name": "sfm5_4" + "name": "sfm5_3", + "controllable": false }, { - "name": "sfm5_5" + "name": "sfm5_4(fan)", + "controllable": false }, { - "name": "sfm6_1(fan)" + "name": "sfm5_5(fan)", + "controllable": false }, { - "name": "sfm6_2" + "name": "sfm6_1(fan)", + "controllable": false }, { - "name": "sfm6_3" + "name": "sfm6_2", + "controllable": false }, { - "name": "sfm6_4" + "name": "sfm6_3", + "controllable": false }, { - "name": "sfm6_5" + "name": "sfm6_4(fan)", + "controllable": false }, { - "name": "sfm7_1(fan)" + "name": "sfm6_5(fan)", + "controllable": false }, { - "name": "sfm7_2" + "name": "sfm7_1(fan)", + "controllable": false }, { - "name": "sfm7_3" + "name": "sfm7_2", + "controllable": false }, { - "name": "sfm7_4" + "name": "sfm7_3", + "controllable": false }, { - "name": "sfm7_5" + "name": "sfm7_4(fan)", + "controllable": false }, { - "name": "sfm8_1(fan)" + "name": "sfm7_5(fan)", + "controllable": false }, { - "name": "sfm8_2" + "name": "sfm8_1(fan)", + "controllable": false }, { - "name": "sfm8_3" + "name": "sfm8_2", + "controllable": false + }, + { + "name": "sfm8_3", + "controllable": false }, { - "name": "sfm8_4" + "name": "sfm8_4(fan)", + "controllable": false }, { - "name": "sfm8_5" + "name": "sfm8_5(fan)", + "controllable": false } ], "sfps": [ From 4caa8876425eb381c360a4348347d25c81ff191a Mon Sep 17 00:00:00 2001 From: Eric Zhu <79439153+cel-eric@users.noreply.github.com> Date: Tue, 22 Mar 2022 00:25:36 +0800 Subject: [PATCH 108/817] Fix issue of partially parsing syseeprom value (#10020) (#10276) Why I did it The current code assumes that the value part does not have whitespace. So everything after the whitespace will be ignored. The syseeprom values returned from platform API do not match the output of "show platform syseeprom" on dx010 and e1031 device. How I did it This change improved the regular expression for parsing syseeprom values to accommodate whitespaces in the value. PR 10021 provides the solution, but committed to the wrong place for dx010 and e1031. How to verify it Compile the sonic_platform wheel for dx010, then upload to device and install the wheel, verify the platform eeprom API. Signed-off-by: Eric Zhu --- device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py | 2 +- .../celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py index dc43a4d7ddda..48643b403071 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py @@ -45,7 +45,7 @@ def __parse_output(self, decode_output): for line in lines: try: match = re.search( - '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)(.*$)', line) if match is not None: idx = match.group(1) value = match.group(3).rstrip('\0') diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py index b0d37d57beac..bfde69c8d296 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py @@ -44,7 +44,7 @@ def __parse_output(self, decode_output): for line in lines: try: match = re.search( - '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)(.*$)', line) if match is not None: idx = match.group(1) value = match.group(3).rstrip('\0') From f0ddd102d546ecb4be3e819dd210244e1e1c1938 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 22 Mar 2022 00:54:52 +0800 Subject: [PATCH 109/817] [Mellanox] Add CPU thermal control for Nvidia platforms (#10202) Why I did it Add CPU thermal control for Nvidia platforms which will be enabled for platforms that have heavy CPU load. Now it is only enabled on 4800, and it will be enabled on future platforms. How I did it Check CPU pack temperature and update cooling level accordingly How to verify it Manual test Added sonic-mgmt test case, PR link will update later --- .../sonic_platform/cpu_thermal_control.py | 70 ++++++++++++++++ .../sonic_platform/device_data.py | 22 ++++- .../sonic_platform/thermal.py | 4 +- .../sonic_platform/thermal_manager.py | 29 ++++++- .../tests/test_cpu_thermal_control.py | 83 +++++++++++++++++++ 5 files changed, 202 insertions(+), 6 deletions(-) create mode 100644 platform/mellanox/mlnx-platform-api/sonic_platform/cpu_thermal_control.py create mode 100644 platform/mellanox/mlnx-platform-api/tests/test_cpu_thermal_control.py diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/cpu_thermal_control.py b/platform/mellanox/mlnx-platform-api/sonic_platform/cpu_thermal_control.py new file mode 100644 index 000000000000..f86a5b09fe07 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/cpu_thermal_control.py @@ -0,0 +1,70 @@ +# +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +from sonic_py_common.task_base import ThreadTaskBase + +from . import utils +from .device_data import DeviceDataManager + + +class CPUThermalControl(ThreadTaskBase): + CPU_COOLING_STATE = '/var/run/hw-management/thermal/cooling2_cur_state' + CPU_TEMP_FILE = '/var/run/hw-management/thermal/cpu_pack' + MAX_COOLING_STATE = 10 + MIN_COOLING_STATE = 2 + INTERVAL = 3 + + def __init__(self): + super(CPUThermalControl, self).__init__() + self.temp_low, self.temp_high = DeviceDataManager.get_cpu_thermal_threshold() + + def task_worker(self): + last_temp = 0 + while not self.task_stopping_event.wait(self.INTERVAL): + last_temp = self.run(last_temp) + + def run(self, last_temp): + current_temp = self.read_cpu_temp() + if current_temp < self.temp_low: + self.set_cooling_state(self.MIN_COOLING_STATE) + elif current_temp > self.temp_high: + self.set_cooling_state(self.MAX_COOLING_STATE) + else: + cooling_state = self.get_cooling_state() + if current_temp > last_temp: + self.set_cooling_state(min(cooling_state + 1, self.MAX_COOLING_STATE)) + elif current_temp < last_temp: + self.set_cooling_state(max(cooling_state - 1, self.MIN_COOLING_STATE)) + return current_temp + + def set_cooling_state(self, state): + utils.write_file(self.CPU_COOLING_STATE, state, log_func=None) + + def get_cooling_state(self): + return utils.read_int_from_file(self.CPU_COOLING_STATE, default=self.MAX_COOLING_STATE, log_func=None) + + def read_cpu_temp(self): + cpu_temp = utils.read_int_from_file(self.CPU_TEMP_FILE, default=self.temp_high, log_func=None) + return cpu_temp if cpu_temp <= 1000 else int(cpu_temp / 1000) + \ No newline at end of file diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py index b4610fe045f0..cd909231d1bc 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -148,7 +148,8 @@ 'thermal': { "capability": { "comex_amb": False - } + }, + 'cpu_threshold': (80, 95) # min=80, max=95 }, 'sfp': { 'max_port_per_line_card': 16 @@ -263,3 +264,20 @@ def get_linecard_max_port_count(cls): if not sfp_data: return 0 return sfp_data.get('max_port_per_line_card', 0) + + @classmethod + def is_cpu_thermal_control_supported(cls): + return cls.get_cpu_thermal_threshold() != (None, None) + + @classmethod + @utils.read_only_cache() + def get_cpu_thermal_threshold(cls): + platform_data = DEVICE_DATA.get(cls.get_platform_name(), None) + if not platform_data: + return None, None + + thermal_data = platform_data.get('thermal', None) + if not thermal_data: + return None, None + + return thermal_data.get('cpu_threshold', (None, None)) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py index 22cf5a513529..bc307bc5e076 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -524,7 +524,7 @@ def monitor_asic_themal_zone(cls): else: cls.expect_cooling_state = None - + class RemovableThermal(Thermal): def __init__(self, name, temp_file, high_th_file, high_crit_th_file, position, presence_cb): super(RemovableThermal, self).__init__(name, temp_file, high_th_file, high_crit_th_file, position) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_manager.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_manager.py index 895d3aaefedb..dcdd25e90635 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_manager.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_manager.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,6 +15,8 @@ # limitations under the License. # from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase +from .cpu_thermal_control import CPUThermalControl +from .device_data import DeviceDataManager from .thermal_actions import * from .thermal_conditions import * from .thermal_infos import * @@ -22,6 +24,8 @@ class ThermalManager(ThermalManagerBase): + cpu_thermal_control = None + @classmethod def start_thermal_control_algorithm(cls): """ @@ -42,8 +46,30 @@ def stop_thermal_control_algorithm(cls): """ Thermal.set_thermal_algorithm_status(False) + @classmethod + def start_cpu_thermal_control_algoritm(cls): + if cls.cpu_thermal_control: + return + + if not DeviceDataManager.is_cpu_thermal_control_supported(): + return + + cls.cpu_thermal_control = CPUThermalControl() + cls.cpu_thermal_control.task_run() + + @classmethod + def stop_cpu_thermal_control_algoritm(cls): + if cls.cpu_thermal_control: + cls.cpu_thermal_control.task_stop() + cls.cpu_thermal_control = None + @classmethod def run_policy(cls, chassis): + if cls._running: + cls.start_cpu_thermal_control_algoritm() + else: + cls.stop_cpu_thermal_control_algoritm() + if not cls._policy_dict: return @@ -59,7 +85,6 @@ def run_policy(cls, chassis): if not cls._running: return try: - print(policy.name) if policy.is_match(cls._thermal_info_dict): policy.do_action(cls._thermal_info_dict) except Exception as e: diff --git a/platform/mellanox/mlnx-platform-api/tests/test_cpu_thermal_control.py b/platform/mellanox/mlnx-platform-api/tests/test_cpu_thermal_control.py new file mode 100644 index 000000000000..8970e659c0c8 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/test_cpu_thermal_control.py @@ -0,0 +1,83 @@ +# +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +import glob +import os +import pytest +import sys +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +sys.path.insert(0, modules_path) + +from sonic_platform.cpu_thermal_control import CPUThermalControl + + +class TestCPUThermalControl: + @mock.patch('sonic_platform.device_data.DeviceDataManager.get_cpu_thermal_threshold', mock.MagicMock(return_value=(85, 95))) + @mock.patch('sonic_platform.utils.read_int_from_file') + @mock.patch('sonic_platform.utils.write_file') + def test_run(self, mock_write_file, mock_read_file): + instance = CPUThermalControl() + file_content = { + CPUThermalControl.CPU_COOLING_STATE: 5, + CPUThermalControl.CPU_TEMP_FILE: instance.temp_high + 1 + } + + def read_file(file_path, **kwargs): + return file_content[file_path] + + mock_read_file.side_effect = read_file + # Test current temp is higher than high threshold + instance.run(0) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, CPUThermalControl.MAX_COOLING_STATE, log_func=None) + + # Test current temp is lower than low threshold + file_content[CPUThermalControl.CPU_TEMP_FILE] = instance.temp_low - 1 + instance.run(0) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, CPUThermalControl.MIN_COOLING_STATE, log_func=None) + + # Test current temp increasing + file_content[CPUThermalControl.CPU_TEMP_FILE] = instance.temp_low + instance.run(0) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, 6, log_func=None) + + # Test current temp decreasing + instance.run(instance.temp_low + 1) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, 4, log_func=None) + + # Test current temp increasing and current cooling state is already the max + file_content[CPUThermalControl.CPU_TEMP_FILE] = 85 + file_content[CPUThermalControl.CPU_COOLING_STATE] = CPUThermalControl.MAX_COOLING_STATE + instance.run(84) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, CPUThermalControl.MAX_COOLING_STATE, log_func=None) + + # Test current temp decreasing and current cooling state is already the max + file_content[CPUThermalControl.CPU_COOLING_STATE] = CPUThermalControl.MIN_COOLING_STATE + instance.run(86) + mock_write_file.assert_called_with(CPUThermalControl.CPU_COOLING_STATE, CPUThermalControl.MIN_COOLING_STATE, log_func=None) From bf4ab4a33829ada1ef6b3688c8866e4788fa3cc7 Mon Sep 17 00:00:00 2001 From: Kostiantyn Yarovyi Date: Mon, 21 Mar 2022 19:07:20 +0200 Subject: [PATCH 110/817] [Barefoot][Syncd] restart of the interface for cleaning txquee through which communication takes place between Sonic and openBMC (#9941) Why I did it improvement of starting barefoot SDK How I did it restart of the interface for cleaning txquee through which communication takes place between Sonic and openBMC How to verify it run sonic autorestart tests --- files/scripts/syncd.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 95c3e3841ba8..889495e8c50a 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -28,6 +28,14 @@ function startplatform() { debug "Firmware update procedure ended" fi + if [[ x"$sonic_asic_platform" == x"barefoot" ]]; then + is_usb0=$(ls /sys/class/net | grep usb0) + if [[ "$is_usb0" == "usb0" ]]; then + /usr/bin/ip link set usb0 down + /usr/bin/ip link set usb0 up + fi + fi + if [[ x"$WARM_BOOT" != x"true" ]]; then if [ x$sonic_asic_platform == x'cavium' ]; then /etc/init.d/xpnet.sh start From 42ab5b8eaa14b950a099ab4b57a602ce3972be50 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 22 Mar 2022 01:38:37 +0800 Subject: [PATCH 111/817] [Mellanox] update MFT version to 4.18.0-106 (#10304) - Why I did it With the previous MFT 4.18.1-16 there is a bug in mstdump tool accessing wrong address. it is confirmed this issue does not exist in official 4.18.0-106. - How I did it Update the MFT version to 4.18.0-106 - How to verify it Run regression on Mellanox platforms --- platform/mellanox/mft.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 3a3d95c8ca8d..2616edcd4c41 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -16,8 +16,8 @@ # # Mellanox SAI -MFT_VERSION = 4.18.1 -MFT_REVISION = 16 +MFT_VERSION = 4.18.0 +MFT_REVISION = 106 export MFT_VERSION MFT_REVISION From 24397ead0914950863eb65c7b7800bb980d17626 Mon Sep 17 00:00:00 2001 From: Volodymyr Boiko Date: Mon, 21 Mar 2022 21:43:43 +0200 Subject: [PATCH 112/817] [sonic-config-engine][portconfig] Do not parse JSON as Python AST (#10224) #### Why I did it To fix https://github.com/Azure/sonic-buildimage/issues/9643 #### How I did it Instead of ast.literal_eval added python2 compat code for json strings unicode -> str convertion. We need python2 compatibility since py2 sonic config engine (buster/sonic_config_engine-1.0-py2-none-any.whl target) is still included into the build (ENABLE_PY2_MODULES flag is set for buster). Once we abandon buster and python2, this compat and ast.literal_eval could be cleaned up all through the code base. #### How to verify it run steps from the linked issue --- src/sonic-config-engine/portconfig.py | 21 +++++++++++++------ .../tests/sample_platform.json | 12 +++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/sonic-config-engine/portconfig.py b/src/sonic-config-engine/portconfig.py index 51a4c438faf2..0c056d1cdab7 100644 --- a/src/sonic-config-engine/portconfig.py +++ b/src/sonic-config-engine/portconfig.py @@ -45,16 +45,25 @@ # # Helper Functions # + +# For python2 compatibility +def py2JsonStrHook(j): + if isinstance(j, unicode): + return j.encode('utf-8', 'backslashreplace') + if isinstance(j, list): + return [py2JsonStrHook(item) for item in j] + if isinstance(j, dict): + return {py2JsonStrHook(key): py2JsonStrHook(value) + for key, value in j.iteritems()} + return j + def readJson(filename): # Read 'platform.json' or 'hwsku.json' file try: with open(filename) as fp: - try: - data = json.load(fp) - except json.JSONDecodeError: - print("Json file does not exist") - data_dict = ast.literal_eval(json.dumps(data)) - return data_dict + if sys.version_info.major == 2: + return json.load(fp, object_hook=py2JsonStrHook) + return json.load(fp) except Exception as e: print("error occurred while parsing json: {}".format(sys.exc_info()[1])) return None diff --git a/src/sonic-config-engine/tests/sample_platform.json b/src/sonic-config-engine/tests/sample_platform.json index 4a8804a552fe..fbb281e07393 100644 --- a/src/sonic-config-engine/tests/sample_platform.json +++ b/src/sonic-config-engine/tests/sample_platform.json @@ -1,4 +1,16 @@ { + "chassis": { + "psus": [ + { + "name": "PSU 1", + "temperature": false + }, + { + "name": "PSU 2", + "temperature": false + } + ] + }, "interfaces": { "Ethernet0": { "index": "1,1,1,1", From 90416b565c1a792323ab615a9db4b8547e29097d Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Tue, 22 Mar 2022 12:51:07 +0800 Subject: [PATCH 113/817] [ci] Fix remove sonic-slave-* docker image issue when building sonic-slave* (#10296) --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 12 +----------- .azure-pipelines/docker-sonic-slave-template.yml | 11 +---------- .azure-pipelines/template-clean-sonic-slave.yml | 8 ++++++++ 3 files changed, 10 insertions(+), 21 deletions(-) create mode 100644 .azure-pipelines/template-clean-sonic-slave.yml diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 0c7f7f966297..4f1625b297a9 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -45,17 +45,7 @@ stages: jobFilters: ${{ parameters.jobFilters }} buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' preSteps: - - script: | - containers=$(docker container ls | grep "sonic-slave" | awk '{ print $1 }') - if [ ! -z "$containers" ]; then - docker container kill $containers || true - sleep 5 - fi - images=$(docker images 'sonic-slave-*' -a -q) - if [ ! -z "$images" ]; then - docker rmi -f $images - fi - displayName: 'Cleanup sonic slave' + - template: template-clean-sonic-slave.yml - stage: UpgradeVersions jobs: - job: UpgradeVersions diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index a8b00fa576b7..212b449abb18 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -38,6 +38,7 @@ jobs: pool: ${{ parameters.pool }} steps: - template: cleanup.yml + - template: template-clean-sonic-slave.yml - checkout: self clean: true submodules: recursive @@ -68,16 +69,6 @@ jobs: BUILD_OPTIONS = 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web,git,docker' fi - containers=$(docker container ls | grep "sonic-slave" | awk '{ print $1 }') - if [ ! -z "$containers" ]; then - docker container kill $containers || true - sleep 5 - fi - images=$(docker images 'sonic-slave-*' -a -q) - if [ ! -z "$images" ]; then - docker rmi -f $images - fi - tmpfile=$(mktemp) echo ${{ parameters.arch }} > .arch diff --git a/.azure-pipelines/template-clean-sonic-slave.yml b/.azure-pipelines/template-clean-sonic-slave.yml new file mode 100644 index 000000000000..cc995e9c2621 --- /dev/null +++ b/.azure-pipelines/template-clean-sonic-slave.yml @@ -0,0 +1,8 @@ +steps: +- script: | + containers=$(docker container ls -a | grep "sonic-slave" | awk '{ print $1 }') + [ -n "$containers" ] && docker container rm -f containers + docker images | grep "^" | awk '{print$3}' | xargs -i docker rmi {} + images=$(docker images 'sonic-slave-*' -a -q) + [ -n "$images" ] && docker rmi -f $images + displayName: 'Cleanup sonic slave' From e9ac13678d1b504947d9251d26a5781825703a21 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:24:15 +0800 Subject: [PATCH 114/817] [Build]: Fix armhf mirrors not existing issue (#10312) Why I did it [Build]: Fix armhf mirrors not existing issue The mirror endpoint debian-archive.trafficmanager.net does not support armhf, change to use deb.debian.org and security.debian.org. --- files/apt/sources.list.armhf | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/files/apt/sources.list.armhf b/files/apt/sources.list.armhf index 378aa084524e..4f9d4d0a9020 100644 --- a/files/apt/sources.list.armhf +++ b/files/apt/sources.list.armhf @@ -1,11 +1,16 @@ ## Debian mirror for ARM ## Not the repo mirror site can change in future, and needs to be updated to be in sync -deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free -deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free -deb [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free -deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free -deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free +deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free +deb-src [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free +deb [arch=armhf] http://security.debian.org bullseye-security main contrib non-free +deb-src [arch=armhf] http://security.debian.org bullseye-security main contrib non-free +deb [arch=armhf] http://deb.debian.org/debian bullseye-backports main contrib non-free +#deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +#deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free +#deb [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +#deb-src [arch=armhf] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free +#deb [arch=armhf] http://debian-archive.trafficmanager.net/debian/ bullseye-backports main contrib non-free deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free deb-src [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free deb [arch=armhf] http://packages.trafficmanager.net/debian/debian-security/ bullseye-security main contrib non-free From f8e11042b7b64f654a344ca65f8f8036ce8095c6 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Tue, 22 Mar 2022 15:39:01 +0800 Subject: [PATCH 115/817] [build] Fix docker image cached tag issue. (#10297) before: [ finished ] target/docker-base-buster.gz after: [ cached ] target/docker-base-buster.gz --- slave.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index 0bd81ff371a7..641b732db64e 100644 --- a/slave.mk +++ b/slave.mk @@ -816,7 +816,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform # Load the target deb from DPKG cache $(call LOAD_CACHE,$*.gz,$@) - + $(eval $*_CACHE_LOADED:=$($*.gz_CACHE_LOADED)) # Skip building the target if it is already loaded from cache if [ -z '$($*.gz_CACHE_LOADED)' ] ; then @@ -890,7 +890,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAG # Load the target deb from DPKG cache $(call LOAD_CACHE,$*-$(DBG_IMAGE_MARK).gz,$@) - + $(eval $*_CACHE_LOADED:=$($*-$(DBG_IMAGE_MARK).gz_CACHE_LOADED)) # Skip building the target if it is already loaded from cache if [ -z '$($*-$(DBG_IMAGE_MARK).gz_CACHE_LOADED)' ] ; then From 874d7fc2c6eb99865c661635221ffef7c87c3701 Mon Sep 17 00:00:00 2001 From: Mohamed Ghoneim Date: Tue, 22 Mar 2022 17:12:16 -0700 Subject: [PATCH 116/817] [yang] In ACL_RULE PRIORITY is mandatory and PACKET_ACTION for CTRLPLANE ACLs (#10248) #### Why I did it Fixes https://github.com/Azure/sonic-utilities/issues/2049 from caclmgr: - PRIORITY is a required field [code](https://github.com/Azure/sonic-buildimage/blob/3fa18d18d4c06fe38164ebfefdc3187820fc7496/src/sonic-host-services/scripts/caclmgrd#L548) - PACKET_ACTION is a required field [code](https://github.com/Azure/sonic-buildimage/blob/3fa18d18d4c06fe38164ebfefdc3187820fc7496/src/sonic-host-services/scripts/caclmgrd#L581) I think PRIORITY is a required field for ACLs not only CTRLPLANE ACLs #### How I did it Check code. #### How to verify it Unit-test #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- .../tests/yang_model_tests/tests/acl.json | 10 ++++ .../yang_model_tests/tests_config/acl.json | 57 +++++++++++++++++++ .../yang-templates/sonic-acl.yang.j2 | 4 ++ 3 files changed, 71 insertions(+) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json index 243554d60f9a..b7968e240767 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json @@ -4,6 +4,16 @@ "eStrKey" : "InvalidValue", "eStr": ["PACKET_ACTION"] }, + "ACL_RULE_FOR_CTRLPLANE_ACL_REQUIRES_PACKET_ACTION": { + "desc": "ACL_RULE for CTRLPLANE ACLs require PACKET_ACTION.", + "eStrKey" : "Must", + "eStr": ["CTRLPLANE", "PACKET_ACTION"] + }, + "ACL_RULE_MANDATORY_PRIORITY": { + "desc": "ACL_RULE MANDATORY PRIORITY field.", + "eStrKey" : "Mandatory", + "eStr": ["ACL_RULE", "PRIORITY"] + }, "ACL_TABLE_EMPTY_PORTS": { "desc": "Configure ACL_TABLE with empty ports." }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json index 4829eb3971dc..d98645b8a19c 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json @@ -211,6 +211,63 @@ } } }, + "ACL_RULE_FOR_CTRLPLANE_ACL_REQUIRES_PACKET_ACTION": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "MGMT_ONLY", + "DST_IP": "10.186.72.0/26", + "IP_TYPE": "IPv4ANY", + "PRIORITY": 999980, + "RULE_NAME": "Rule_20", + "SRC_IP": "10.176.0.0/15" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "MGMT_ONLY", + "policy_desc": "Filter IPv4", + "services": [ + "SNMP" + ], + "stage": "EGRESS", + "type": "CTRLPLANE" + } + ] + } + } + }, + "ACL_RULE_MANDATORY_PRIORITY": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW", + "DST_IP": "10.186.72.0/26", + "IP_TYPE": "IPv4ANY", + "RULE_NAME": "Rule_20", + "SRC_IP": "10.176.0.0/15" + } + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "EVERFLOW", + "policy_desc": "Filter IPv4", + "services": [ + "SNMP" + ], + "stage": "EGRESS", + "type": "MIRROR" + } + ] + } + } + }, "ACL_RULE_WITH_NON_EXIST_ACL_TABLE": { "sonic-acl:sonic-acl": { "sonic-acl:ACL_RULE": { diff --git a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 index 9fd442297c9f..2a527aa2bcf9 100644 --- a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 @@ -69,6 +69,9 @@ module sonic-acl { type stypes:packet_action; } + /* Validating 'PACKET_ACTION' exist if ACL type is 'CTRLPLANE' */ + must "(not(../../ACL_TABLE/ACL_TABLE_LIST[ACL_TABLE_NAME=current()/ACL_TABLE_NAME]/type = 'CTRLPLANE')) or (boolean(PACKET_ACTION))"; + leaf MIRROR_INGRESS_ACTION { type leafref { path "/sms:sonic-mirror-session/sms:MIRROR_SESSION/sms:MIRROR_SESSION_LIST/sms:name"; @@ -86,6 +89,7 @@ module sonic-acl { } leaf PRIORITY { + mandatory true; type uint32 { range 0..999999; } From 74c32d0d313fcf1e254da1d592ddc6ad335c5e69 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Tue, 22 Mar 2022 17:58:15 -0700 Subject: [PATCH 117/817] [sonic-py-swsssdk]: Advance submodule (#10308) Update sonic-py-swsssdk submodule to include below commits: 96c0590 [port_util] Fix issue: port_util.get_vlan_interface_oid_map should not raise exception when DB has not RIF data (#117) 96da8b9 [build] pin pytest-azurepipelines version (#119) Signed-off-by: Suvarna Meenakshi --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 24366480c213..96c05900fc6e 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 24366480c213893388766a3b0dd3c492b9c04b8f +Subproject commit 96c05900fc6e4063c51e3f6256f8a8e765605be4 From 99b7891e4d3f03af641f9890727fb57e89dba1b2 Mon Sep 17 00:00:00 2001 From: dflynn-Nokia <60479697+dflynn-Nokia@users.noreply.github.com> Date: Tue, 22 Mar 2022 20:58:46 -0400 Subject: [PATCH 118/817] [Nokia ixs7215] Fixes to support Debian bullseye (#10309) The following changes are provided to support bullseye and the latest master branch content. - Accommodate relocated fan and thermal sysfs entries in bullseye - Add support for chassis and PSU HW revision Why I did it Fix platform issues introduced by the bullseye kernel upgrade. How I did it Minor fixes to Nokia ixs7215 platform code How to verify it Execute the following CLI commands show platform summary show platform fan show platform temperature --- .../plugins/led_control.py | 20 ++++++++++--------- .../7215/sonic_platform/chassis.py | 16 +++++++++++++++ .../7215/sonic_platform/fan.py | 2 +- .../7215/sonic_platform/psu.py | 9 ++++++++- .../7215/sonic_platform/test/test-chassis.py | 2 ++ .../7215/sonic_platform/thermal.py | 9 +++++---- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/device/nokia/armhf-nokia_ixs7215_52x-r0/plugins/led_control.py b/device/nokia/armhf-nokia_ixs7215_52x-r0/plugins/led_control.py index 935343a84ce1..55d5c74808d0 100644 --- a/device/nokia/armhf-nokia_ixs7215_52x-r0/plugins/led_control.py +++ b/device/nokia/armhf-nokia_ixs7215_52x-r0/plugins/led_control.py @@ -60,8 +60,8 @@ def _set_i2c_register(self, reg_file, value): def _initSystemLed(self): # Front Panel System LEDs setting - oldfan = 0xf - oldpsu = 0xf + oldfan = 0xf # 0=amber, 1=green + oldpsu = 0xf # 0=amber, 1=green # Write sys led if smbus_present == 0: @@ -73,18 +73,19 @@ def _initSystemLed(self): bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, 0x02) DBG_PRINT(" System LED set O.K. ") + # Timer loop to monitor and set front panel Status, Fan, and PSU LEDs while True: - # Front Panel FAN Panel LED setting in register 0x08 + # Front Panel FAN Panel LED setting if (self.chassis.get_fan(0).get_status() == self.chassis.get_fan(1).get_status() == True): - if (os.path.isfile("/sys/class/gpio/fanLedAmber/value")): + if (os.path.isfile("/sys/class/gpio/fanLedGreen/value")): if oldfan != 0x1: self._set_i2c_register("/sys/class/gpio/fanLedAmber/value", 0) self._set_i2c_register("/sys/class/gpio/fanLedGreen/value", 1) oldfan = 0x1 else: - oldfan = 0xf + oldfan = 0xf else: - if (os.path.isfile("/sys/class/gpio/fanLedGreen/value")): + if (os.path.isfile("/sys/class/gpio/fanLedAmber/value")): if oldfan != 0x0: self._set_i2c_register("/sys/class/gpio/fanLedGreen/value", 0) self._set_i2c_register("/sys/class/gpio/fanLedAmber/value", 1) @@ -92,9 +93,9 @@ def _initSystemLed(self): else: oldfan = 0xf - # Front Panel PSU Panel LED setting in register 0x09 + # Front Panel PSU Panel LED setting if (self.chassis.get_psu(0).get_status() == self.chassis.get_psu(1).get_status() == True): - if (os.path.isfile("/sys/class/gpio/psuLedAmber/value")): + if (os.path.isfile("/sys/class/gpio/psuLedGreen/value")): if oldpsu != 0x1: self._set_i2c_register("/sys/class/gpio/psuLedAmber/value", 0) self._set_i2c_register("/sys/class/gpio/psuLedGreen/value", 1) @@ -102,13 +103,14 @@ def _initSystemLed(self): else: oldpsu = 0xf else: - if (os.path.isfile("/sys/class/gpio/psuLedGreen/value")): + if (os.path.isfile("/sys/class/gpio/psuLedAmber/value")): if oldpsu != 0x0: self._set_i2c_register("/sys/class/gpio/psuLedGreen/value", 0) self._set_i2c_register("/sys/class/gpio/psuLedAmber/value", 1) oldpsu = 0x0 else: oldpsu = 0xf + time.sleep(6) # Helper method to map SONiC port name to index diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/chassis.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/chassis.py index cf67a7bb30ac..eb507a49ef17 100755 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/chassis.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/chassis.py @@ -201,6 +201,22 @@ def get_serial(self): """ return self._eeprom.serial_number_str() + def get_revision(self): + """ + Retrieves the hardware revision of the chassis + + Returns: + string: Revision value of chassis + """ + if smbus_present == 0: # called from host + cmdstatus, value = cmd.getstatusoutput('sudo i2cget -y 0 0x41 0x0') + else: + bus = smbus.SMBus(0) + DEVICE_ADDRESS = 0x41 + DEVICE_REG = 0x0 + value = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG) + return str(value) + def get_system_eeprom_info(self): """ Retrieves the full content of system EEPROM information for the diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/fan.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/fan.py index b8fd335930d6..71334ca48585 100644 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/fan.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/fan.py @@ -33,7 +33,7 @@ class Fan(FanBase): def __init__(self, fan_index, fan_drawer, psu_fan=False, dependency=None): self.is_psu_fan = psu_fan - ADT7473_DIR = "/sys/bus/i2c/devices/0-002e/" + ADT7473_DIR = "/sys/bus/i2c/devices/0-002e/hwmon/hwmon1/" if not self.is_psu_fan: # Fan is 1-based in Nokia platforms diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/psu.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/psu.py index 6217555f0d58..383eb2481f68 100644 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/psu.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/psu.py @@ -114,7 +114,6 @@ def get_model(self): """ return self.eeprom.modelstr() - def get_serial(self): """ Retrieves the serial number of the PSU @@ -124,6 +123,14 @@ def get_serial(self): """ return self.eeprom.serial_number_str() + def get_revision(self): + """ + Retrieves the HW revision of the PSU + + Returns: + string: HW revision of PSU + """ + return self.eeprom.part_number_str() def get_part_number(self): """ diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-chassis.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-chassis.py index 53c047ca2329..93dfcaac3d05 100755 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-chassis.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-chassis.py @@ -21,6 +21,8 @@ def main(): print(" Chassis serial: {}".format(chassis.get_serial())) + print(" Chassis revision: {}".format(chassis.get_revision())) + print(" Chassis status: {}".format(chassis.get_status())) print(" Chassis base_mac: {}".format(chassis.get_base_mac())) diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py index 20fdec61f38e..c7e408c3f3e9 100644 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py @@ -22,9 +22,9 @@ class Thermal(ThermalBase): I2C_CLASS_DIR = "/sys/class/i2c-adapter/" I2C_DEV_MAPPING = (['i2c-0/0-004a/hwmon/', 1], ['i2c-0/0-004b/hwmon/', 1], - ['i2c-0/0-002e/', 1], - ['i2c-0/0-002e/', 2], - ['i2c-0/0-002e/', 3]) + ['i2c-0/0-002e/hwmon/', 1], + ['i2c-0/0-002e/hwmon/', 2], + ['i2c-0/0-002e/hwmon/', 3]) HWMON_CLASS_DIR = "/sys/class/hwmon/" @@ -55,7 +55,8 @@ def __init__(self, thermal_index): sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1] sensor_max_suffix = "max" sensor_crit_suffix = "crit" - self.SENSOR_DIR = i2c_path + hwmon_node = os.listdir(i2c_path)[0] + self.SENSOR_DIR = i2c_path + hwmon_node + '/' # Armada 38x SOC temperature sensor else: From 4a5e75e45e570609d47cfc2385a8b43c6b1caa99 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 22 Mar 2022 18:34:42 -0700 Subject: [PATCH 119/817] [restapi]: Don't use python/python2 for restapi start scripts (#10285) Python 2 isn't installed by default in Buster and Bullseye containers, and the scripts/modules can be used with Python 3, so make sure Python 3 is used. Why I did it After the Buster and Bullseye upgrade for the restapi container, processes will no longer start because supervisord is trying to call python and python2, both of which are unavailable. Signed-off-by: Saikrishna Arcot --- dockers/docker-sonic-restapi/supervisord.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-sonic-restapi/supervisord.conf b/dockers/docker-sonic-restapi/supervisord.conf index a873ba03d7da..c95b4b6b92d8 100644 --- a/dockers/docker-sonic-restapi/supervisord.conf +++ b/dockers/docker-sonic-restapi/supervisord.conf @@ -4,7 +4,7 @@ logfile_backups=2 nodaemon=true [eventlistener:dependent-startup] -command=python -m supervisord_dependent_startup +command=python3 -m supervisord_dependent_startup autostart=true autorestart=unexpected startretries=0 @@ -13,7 +13,7 @@ events=PROCESS_STATE buffer_size=1024 [eventlistener:supervisor-proc-exit-listener] -command=python2 /usr/bin/supervisor-proc-exit-listener --container-name restapi +command=/usr/bin/supervisor-proc-exit-listener --container-name restapi events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING autostart=true autorestart=false From 9451a9d43e70fa4642e3184ea41052e932ba9608 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 22 Mar 2022 21:57:15 -0700 Subject: [PATCH 120/817] Check to see that the py2 and py3 version files exist before trying to sort them (#10325) For Bullseye, Python 2 isn't present at all. This means that in certain build cases (such as building something only for Bullseye), the version file may not exist, and so the sort command would fail. For most normal build commands, this probably won't be an issue, because the SONiC build will start with Buster (which has both Python 2 and Python 3 wheels built), and so the py2 and py3 files will be present even during the Bullseye builds. Signed-off-by: Saikrishna Arcot --- src/sonic-build-hooks/scripts/collect_version_files | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sonic-build-hooks/scripts/collect_version_files b/src/sonic-build-hooks/scripts/collect_version_files index 570883701e98..a4b33eeaa897 100755 --- a/src/sonic-build-hooks/scripts/collect_version_files +++ b/src/sonic-build-hooks/scripts/collect_version_files @@ -20,7 +20,11 @@ dpkg-query -W -f '${Package}==${Version}\n' >> "${TARGET_PATH}/versions-deb-${DI ## Print the unique and sorted result sort -u "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-deb-${DIST}-${ARCH}" -sort -u "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" -sort -u "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" +if [ -e "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" ]; then + sort -u "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py2-${DIST}-${ARCH}" +fi +if [ -e "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" ]; then + sort -u "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" -o "${TARGET_PATH}/versions-py3-${DIST}-${ARCH}" +fi exit 0 From 9565ef7a9a85dcb5d08a12adbb3a3d607876fe31 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 23 Mar 2022 09:16:03 +0200 Subject: [PATCH 121/817] [Mellanox] Refactor SFP to use new APIs. (#10317) - Why I did it Refactor SFP code to remove code duplication and to be able to use the latest features available in new APIs. - How I did it Refactor SFP code to remove code duplication and to be able to use the latest features available in new APIs. - How to verify it Run sonic-mgmt/platform_tests/sfp tests --- .../sonic_platform/chassis.py | 20 +- .../mlnx-platform-api/sonic_platform/sfp.py | 1836 +---------------- .../mlnx-platform-api/tests/test_chassis.py | 4 +- .../mlnx-platform-api/tests/test_sfp.py | 2 +- 4 files changed, 38 insertions(+), 1824 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index 6a712af68ff2..1cc3d0f75660 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -74,7 +74,7 @@ def __init__(self): # Initialize DMI data self.dmi_data = None - + # move the initialization of each components to their dedicated initializer # which will be called from platform # @@ -115,7 +115,7 @@ def __del__(self): if SFP.shared_sdk_handle: deinitialize_sdk_handle(SFP.shared_sdk_handle) - + ############################################## # PSU methods ############################################## @@ -238,7 +238,7 @@ def initialize_single_sfp(self, index): if index < sfp_count: if not self._sfp_list: self._sfp_list = [None] * sfp_count - + if not self._sfp_list[index]: from .sfp import SFP self._sfp_list[index] = SFP(index) @@ -295,7 +295,7 @@ def get_sfp(self, index): index = index - 1 self.initialize_single_sfp(index) return super(Chassis, self).get_sfp(index) - + def get_change_event(self, timeout=0): """ Returns a nested dictionary containing all devices which have @@ -310,7 +310,7 @@ def get_change_event(self, timeout=0): - True if call successful, False if not; - A nested dictionary where key is a device type, value is a dictionary with key:value pairs in the format of - {'device_id':'device_event'}, + {'device_id':'device_event'}, where device_id is the device ID for this device and device_event, status='1' represents device inserted, @@ -596,7 +596,7 @@ def get_watchdog(self): Note: We overload this method to ensure that watchdog is only initialized when it is referenced. Currently, only one daemon can open the watchdog. - To initialize watchdog in the constructor causes multiple daemon + To initialize watchdog in the constructor causes multiple daemon try opening watchdog when loading and constructing a chassis object and fail. By doing so we can eliminate that risk. """ @@ -609,11 +609,11 @@ def get_watchdog(self): return self._watchdog - + def get_revision(self): """ Retrieves the hardware revision of the device - + Returns: string: Revision value of device """ @@ -647,7 +647,7 @@ def _parse_dmi(self, filename): def _verify_reboot_cause(self, filename): ''' - Open and read the reboot cause file in + Open and read the reboot cause file in /var/run/hwmanagement/system (which is defined as REBOOT_CAUSE_ROOT) If a reboot cause file doesn't exists, returns '0'. ''' @@ -754,7 +754,7 @@ def initialize_single_module(self, index): if index < count: if not self._module_list: self._module_list = [None] * count - + if not self._module_list[index]: from .module import Module self._module_list[index] = Module(index + 1) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 59f71bebc9a5..29d1c7c081f6 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -25,24 +25,17 @@ try: import subprocess import os - from sonic_platform_base.sfp_base import SfpBase from sonic_platform_base.sonic_eeprom import eeprom_dts - from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId - from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom - from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId - from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom - from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId - from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId - from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom from sonic_py_common.logger import Logger from . import utils from .device_data import DeviceDataManager + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: raise ImportError (str(e) + "- required module not found") try: - # python_sdk_api does not support python3 for now. Daemons like thermalctld or psud + # python_sdk_api does not support python3 for now. Daemons like thermalctld or psud # also import this file without actually use the sdk lib. So we catch the ImportError # and ignore it here. Meanwhile, we have to trigger xcvrd using python2 now because it # uses the sdk lib. @@ -63,171 +56,6 @@ except KeyError: pass -# definitions of the offset and width for values in XCVR info eeprom -XCVR_INTFACE_BULK_OFFSET = 0 -XCVR_INTFACE_BULK_WIDTH_QSFP = 20 -XCVR_INTFACE_BULK_WIDTH_SFP = 21 -XCVR_TYPE_OFFSET = 0 -XCVR_TYPE_WIDTH = 1 -XCVR_EXT_TYPE_OFFSET = 1 -XCVR_EXT_TYPE_WIDTH = 1 -XCVR_CONNECTOR_OFFSET = 2 -XCVR_CONNECTOR_WIDTH = 1 -XCVR_COMPLIANCE_CODE_OFFSET = 3 -XCVR_COMPLIANCE_CODE_WIDTH = 8 -XCVR_ENCODING_OFFSET = 11 -XCVR_ENCODING_WIDTH = 1 -XCVR_NBR_OFFSET = 12 -XCVR_NBR_WIDTH = 1 -XCVR_EXT_RATE_SEL_OFFSET = 13 -XCVR_EXT_RATE_SEL_WIDTH = 1 -XCVR_CABLE_LENGTH_OFFSET = 14 -XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 -XCVR_CABLE_LENGTH_WIDTH_SFP = 6 -XCVR_VENDOR_NAME_OFFSET = 20 -XCVR_VENDOR_NAME_WIDTH = 16 -XCVR_VENDOR_OUI_OFFSET = 37 -XCVR_VENDOR_OUI_WIDTH = 3 -XCVR_VENDOR_PN_OFFSET = 40 -XCVR_VENDOR_PN_WIDTH = 16 -XCVR_HW_REV_OFFSET = 56 -XCVR_HW_REV_WIDTH_OSFP = 2 -XCVR_HW_REV_WIDTH_QSFP = 2 -XCVR_HW_REV_WIDTH_SFP = 4 -XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET = 64 -XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH = 1 -XCVR_VENDOR_SN_OFFSET = 68 -XCVR_VENDOR_SN_WIDTH = 16 -XCVR_VENDOR_DATE_OFFSET = 84 -XCVR_VENDOR_DATE_WIDTH = 8 -XCVR_DOM_CAPABILITY_OFFSET = 92 -XCVR_DOM_CAPABILITY_WIDTH = 2 - -# definitions of the offset and width for values in XCVR_QSFP_DD info eeprom -XCVR_EXT_TYPE_OFFSET_QSFP_DD = 72 -XCVR_EXT_TYPE_WIDTH_QSFP_DD = 2 -XCVR_CONNECTOR_OFFSET_QSFP_DD = 75 -XCVR_CONNECTOR_WIDTH_QSFP_DD = 1 -XCVR_CABLE_LENGTH_OFFSET_QSFP_DD = 74 -XCVR_CABLE_LENGTH_WIDTH_QSFP_DD = 1 -XCVR_HW_REV_OFFSET_QSFP_DD = 36 -XCVR_HW_REV_WIDTH_QSFP_DD = 2 -XCVR_VENDOR_DATE_OFFSET_QSFP_DD = 54 -XCVR_VENDOR_DATE_WIDTH_QSFP_DD = 8 -XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD = 2 -XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD = 1 -XCVR_MEDIA_TYPE_OFFSET_QSFP_DD = 85 -XCVR_MEDIA_TYPE_WIDTH_QSFP_DD = 1 -XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD = 86 -XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD = 32 -XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD = 351 -XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD = 28 - -# to improve performance we retrieve all eeprom data via a single ethtool command -# in function get_transceiver_info and get_transceiver_bulk_status -# XCVR_INTERFACE_DATA_SIZE stands for the max size to be read -# this variable is only used by get_transceiver_info. -# please be noted that each time some new value added to the function -# we should make sure that it falls into the area -# [XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE] or -# adjust XCVR_INTERFACE_MAX_SIZE to contain the new data -# It's same for [QSFP_DOM_BULK_DATA_START, QSFP_DOM_BULK_DATA_SIZE] and -# [SFP_DOM_BULK_DATA_START, SFP_DOM_BULK_DATA_SIZE] which are used by -# get_transceiver_bulk_status -XCVR_INTERFACE_DATA_START = 0 -XCVR_INTERFACE_DATA_SIZE = 92 -SFP_MODULE_ADDRA2_OFFSET = 256 -SFP_MODULE_THRESHOLD_OFFSET = 0 -SFP_MODULE_THRESHOLD_WIDTH = 56 - -QSFP_DOM_BULK_DATA_START = 22 -QSFP_DOM_BULK_DATA_SIZE = 36 -SFP_DOM_BULK_DATA_START = 96 -SFP_DOM_BULK_DATA_SIZE = 10 - -QSFP_DD_DOM_BULK_DATA_START = 14 -QSFP_DD_DOM_BULK_DATA_SIZE = 4 - -# definitions of the offset for values in OSFP info eeprom -OSFP_TYPE_OFFSET = 0 -OSFP_VENDOR_NAME_OFFSET = 129 -OSFP_VENDOR_PN_OFFSET = 148 -OSFP_HW_REV_OFFSET = 164 -OSFP_VENDOR_SN_OFFSET = 166 - -# definitions of the offset for values in QSFP_DD info eeprom -QSFP_DD_TYPE_OFFSET = 0 -QSFP_DD_VENDOR_NAME_OFFSET = 1 -QSFP_DD_VENDOR_PN_OFFSET = 20 -QSFP_DD_VENDOR_SN_OFFSET = 38 -QSFP_DD_VENDOR_OUI_OFFSET = 17 - -#definitions of the offset and width for values in DOM info eeprom -QSFP_DOM_REV_OFFSET = 1 -QSFP_DOM_REV_WIDTH = 1 -QSFP_TEMPE_OFFSET = 22 -QSFP_TEMPE_WIDTH = 2 -QSFP_VOLT_OFFSET = 26 -QSFP_VOLT_WIDTH = 2 -QSFP_VERSION_COMPLIANCE_OFFSET = 1 -QSFP_VERSION_COMPLIANCE_WIDTH = 2 -QSFP_CHANNL_MON_OFFSET = 34 -QSFP_CHANNL_MON_WIDTH = 16 -QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 -QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 -QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 -QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 -QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 -QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 -QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 -QSFP_CONTROL_OFFSET = 86 -QSFP_CONTROL_WIDTH = 8 -QSFP_MODULE_MONITOR_OFFSET = 0 -QSFP_MODULE_MONITOR_WIDTH = 9 -QSFP_POWEROVERRIDE_OFFSET = 93 -QSFP_POWEROVERRIDE_WIDTH = 1 -QSFP_POWEROVERRIDE_BIT = 0 -QSFP_POWERSET_BIT = 1 -QSFP_OPTION_VALUE_OFFSET = 192 -QSFP_OPTION_VALUE_WIDTH = 4 - -QSFP_MODULE_UPPER_PAGE3_START = 384 -QSFP_MODULE_THRESHOLD_OFFSET = 128 -QSFP_MODULE_THRESHOLD_WIDTH = 24 -QSFP_CHANNL_THRESHOLD_OFFSET = 176 -QSFP_CHANNL_THRESHOLD_WIDTH = 24 - -SFP_TEMPE_OFFSET = 96 -SFP_TEMPE_WIDTH = 2 -SFP_VOLT_OFFSET = 98 -SFP_VOLT_WIDTH = 2 -SFP_CHANNL_MON_OFFSET = 100 -SFP_CHANNL_MON_WIDTH = 6 -SFP_CHANNL_STATUS_OFFSET = 110 -SFP_CHANNL_STATUS_WIDTH = 1 - -QSFP_DD_TEMPE_OFFSET = 14 -QSFP_DD_TEMPE_WIDTH = 2 -QSFP_DD_VOLT_OFFSET = 16 -QSFP_DD_VOLT_WIDTH = 2 -QSFP_DD_TX_BIAS_OFFSET = 42 -QSFP_DD_TX_BIAS_WIDTH = 16 -QSFP_DD_RX_POWER_OFFSET = 58 -QSFP_DD_RX_POWER_WIDTH = 16 -QSFP_DD_TX_POWER_OFFSET = 26 -QSFP_DD_TX_POWER_WIDTH = 16 -QSFP_DD_CHANNL_MON_OFFSET = 26 -QSFP_DD_CHANNL_MON_WIDTH = 48 -QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET = 86 -QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH = 1 -QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET = 19 -QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH = 1 -QSFP_DD_CHANNL_TX_FAULT_STATUS_OFFSET = 7 -QSFP_DD_CHANNL_TX_FAULT_STATUS_WIDTH = 1 -QSFP_DD_MODULE_THRESHOLD_OFFSET = 0 -QSFP_DD_MODULE_THRESHOLD_WIDTH = 72 -QSFP_DD_CHANNL_STATUS_OFFSET = 26 -QSFP_DD_CHANNL_STATUS_WIDTH = 1 # identifier value of xSFP module which is in the first byte of the EEPROM # if the identifier value falls into SFP_TYPE_CODE_LIST the module is treated as a SFP module and parsed according to 8472 @@ -252,31 +80,6 @@ '18' # QSFP-DD Double Density 8X Pluggable Transceiver ] -qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', - 'Length OM2(m)', 'Length OM1(m)', - 'Length Cable Assembly(m)') - -sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', - 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', - 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') - -sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', - 'ESCONComplianceCodes', 'SONETComplianceCodes', - 'EthernetComplianceCodes','FibreChannelLinkLength', - 'FibreChannelTechnology', 'SFP+CableTechnology', - 'FibreChannelTransmissionMedia','FibreChannelSpeed') - -qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', - 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', - 'Fibre Channel link length/Transmitter Technology', - 'Fibre Channel transmission media', 'Fibre Channel Speed') - -SFP_PATH = "/var/run/hw-management/qsfp/" -SFP_TYPE = "SFP" -QSFP_TYPE = "QSFP" -OSFP_TYPE = "OSFP" -QSFP_DD_TYPE = "QSFP_DD" - #variables for sdk REGISTER_NUM = 1 DEVICE_ID = 1 @@ -331,6 +134,7 @@ def initialize_sdk_handle(): return sdk_handle + def deinitialize_sdk_handle(sdk_handle): if sdk_handle is not None: rc = sx_api_close(sdk_handle) @@ -355,23 +159,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): deinitialize_sdk_handle(self.sdk_handle) -class SfpCapability: - def __init__(self): - self.dom_supported = False - self.dom_temp_supported = False - self.dom_volt_supported = False - self.dom_rx_power_supported = False - self.dom_tx_bias_power_supported = False - self.dom_tx_power_supported = False - self.dom_tx_disable_supported = False - self.dom_thresholds_supported = False - self.dom_rx_tx_power_bias_supported = False - self.calibration = 0 - self.qsfp_page3_available = False - self.second_application_list = False - - -class SFP(SfpBase): +class SFP(SfpOptoeBase): """Platform-specific SFP class""" shared_sdk_handle = None SFP_MLNX_ERROR_DESCRIPTION_LONGRANGE_NON_MLNX_CABLE = 'Long range for non-Mellanox cable or module' @@ -388,7 +176,7 @@ class SFP(SfpBase): def __init__(self, sfp_index, slot_id=0, linecard_port_count=0, lc_name=None): super(SFP, self).__init__() - + if slot_id == 0: # For non-modular chassis self.index = sfp_index + 1 self.sdk_index = sfp_index @@ -406,9 +194,7 @@ def __init__(self, sfp_index, slot_id=0, linecard_port_count=0, lc_name=None): self._thermal_list = initialize_linecard_sfp_thermal(lc_name, slot_id, sfp_index) self.slot_id = slot_id - self._sfp_type = None - self._sfp_capability = None - + @property def sdk_handle(self): if not SFP.shared_sdk_handle: @@ -417,218 +203,12 @@ def sdk_handle(self): logger.log_error('Failed to open SDK handle') return SFP.shared_sdk_handle - @property - def sfp_type(self): - if not self._sfp_type: - eeprom_raw = [] - eeprom_raw = self._read_eeprom_specific_bytes(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH) - if eeprom_raw: - if eeprom_raw[0] in SFP_TYPE_CODE_LIST: - self._sfp_type = SFP_TYPE - elif eeprom_raw[0] in QSFP_TYPE_CODE_LIST: - self._sfp_type = QSFP_TYPE - elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: - self._sfp_type = QSFP_DD_TYPE - - # we don't regonize this identifier value, treat the xSFP module as the default type - if not self._sfp_type: - raise RuntimeError("Failed to detect SFP type for SFP {}".format(self.index)) - else: - return self._sfp_type - - def _dom_capability_detect(self): - if self._sfp_capability: - return - - self._sfp_capability = SfpCapability() - if not self.get_presence(): - return - - if self.sfp_type == QSFP_TYPE: - self._sfp_capability.calibration = 1 - sfpi_obj = sff8436InterfaceId() - if sfpi_obj is None: - self._sfp_capability.dom_supported = False - offset = 128 - - # QSFP capability byte parse, through this byte can know whether it support tx_power or not. - # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, - # need to add more code for determining the capability and version compliance - # in SFF-8636 dom capability definitions evolving with the versions. - qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) - if qsfp_dom_capability_raw is not None: - qsfp_version_compliance_raw = self._read_eeprom_specific_bytes(QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) - qsfp_version_compliance = int(qsfp_version_compliance_raw[0], 16) - dom_capability = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0) - if qsfp_version_compliance >= 0x08: - self._sfp_capability.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' - self._sfp_capability.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' - self._sfp_capability.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' - self._sfp_capability.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' - else: - self._sfp_capability.dom_temp_supported = True - self._sfp_capability.dom_volt_supported = True - self._sfp_capability.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' - self._sfp_capability.dom_tx_power_supported = True - self._sfp_capability.dom_supported = True - self._sfp_capability.calibration = 1 - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - qsfp_option_value_raw = self._read_eeprom_specific_bytes(QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) - if qsfp_option_value_raw is not None: - optional_capability = sfpd_obj.parse_option_params(qsfp_option_value_raw, 0) - self._sfp_capability.dom_tx_disable_supported = optional_capability['data']['TxDisable']['value'] == 'On' - dom_status_indicator = sfpd_obj.parse_dom_status_indicator(qsfp_version_compliance_raw, 1) - self._sfp_capability.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' - else: - self._sfp_capability.dom_supported = False - self._sfp_capability.dom_temp_supported = False - self._sfp_capability.dom_volt_supported = False - self._sfp_capability.dom_rx_power_supported = False - self._sfp_capability.dom_tx_power_supported = False - self._sfp_capability.calibration = 0 - self._sfp_capability.qsfp_page3_available = False - - elif self.sfp_type == QSFP_DD_TYPE: - sfpi_obj = qsfp_dd_InterfaceId() - if sfpi_obj is None: - self._sfp_capability.dom_supported = False - - offset = 0 - # two types of QSFP-DD cable types supported: Copper and Optical. - qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD), XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD) - if qsfp_dom_capability_raw is not None: - self._sfp_capability.dom_temp_supported = True - self._sfp_capability.dom_volt_supported = True - dom_capability = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0) - if dom_capability['data']['Flat_MEM']['value'] == 'Off': - self._sfp_capability.dom_supported = True - self._sfp_capability.second_application_list = True - self._sfp_capability.dom_rx_power_supported = True - self._sfp_capability.dom_tx_power_supported = True - self._sfp_capability.dom_tx_bias_power_supported = True - self._sfp_capability.dom_thresholds_supported = True - self._sfp_capability.dom_rx_tx_power_bias_supported = True - else: - self._sfp_capability.dom_supported = False - self._sfp_capability.second_application_list = False - self._sfp_capability.dom_rx_power_supported = False - self._sfp_capability.dom_tx_power_supported = False - self._sfp_capability.dom_tx_bias_power_supported = False - self._sfp_capability.dom_thresholds_supported = False - self._sfp_capability.dom_rx_tx_power_bias_supported = False - else: - self._sfp_capability.dom_supported = False - self._sfp_capability.dom_temp_supported = False - self._sfp_capability.dom_volt_supported = False - self._sfp_capability.dom_rx_power_supported = False - self._sfp_capability.dom_tx_power_supported = False - self._sfp_capability.dom_tx_bias_power_supported = False - self._sfp_capability.dom_thresholds_supported = False - self._sfp_capability.dom_rx_tx_power_bias_supported = False - - elif self.sfp_type == SFP_TYPE: - sfpi_obj = sff8472InterfaceId() - if sfpi_obj is None: - return None - sfp_dom_capability_raw = self._read_eeprom_specific_bytes(XCVR_DOM_CAPABILITY_OFFSET, XCVR_DOM_CAPABILITY_WIDTH) - if sfp_dom_capability_raw is not None: - sfp_dom_capability = int(sfp_dom_capability_raw[0], 16) - self._sfp_capability.dom_supported = (sfp_dom_capability & 0x40 != 0) - if self._sfp_capability.dom_supported: - self._sfp_capability.dom_temp_supported = True - self._sfp_capability.dom_volt_supported = True - self._sfp_capability.dom_rx_power_supported = True - self._sfp_capability.dom_tx_power_supported = True - if sfp_dom_capability & 0x20 != 0: - self._sfp_capability.calibration = 1 - elif sfp_dom_capability & 0x10 != 0: - self._sfp_capability.calibration = 2 - else: - self._sfp_capability.calibration = 0 - else: - self._sfp_capability.dom_temp_supported = False - self._sfp_capability.dom_volt_supported = False - self._sfp_capability.dom_rx_power_supported = False - self._sfp_capability.dom_tx_power_supported = False - self._sfp_capability.calibration = 0 - self._sfp_capability.dom_tx_disable_supported = (int(sfp_dom_capability_raw[1], 16) & 0x40 != 0) - else: - self._sfp_capability.dom_supported = False - self._sfp_capability.dom_temp_supported = False - self._sfp_capability.dom_volt_supported = False - self._sfp_capability.dom_rx_power_supported = False - self._sfp_capability.dom_tx_power_supported = False - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_supported(self): - return self._sfp_capability.dom_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_temp_supported(self): - return self._sfp_capability.dom_temp_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_volt_supported(self): - return self._sfp_capability.dom_volt_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_rx_power_supported(self): - return self._sfp_capability.dom_rx_power_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_tx_power_supported(self): - return self._sfp_capability.dom_tx_power_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def calibration(self): - return self._sfp_capability.calibration - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_tx_bias_power_supported(self): - return self._sfp_capability.dom_tx_bias_power_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_tx_disable_supported(self): - return self._sfp_capability.dom_tx_disable_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def qsfp_page3_available(self): - return self._sfp_capability.qsfp_page3_available - - @property - @utils.pre_initialize(_dom_capability_detect) - def second_application_list(self): - return self._sfp_capability.second_application_list - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_thresholds_supported(self): - return self._sfp_capability.dom_thresholds_supported - - @property - @utils.pre_initialize(_dom_capability_detect) - def dom_rx_tx_power_bias_supported(self): - return self._sfp_capability.dom_rx_tx_power_bias_supported - def reinit(self): - """ Re-initialize this SFP object when a new SFP inserted - :return: + :return: """ - self._sfp_type = None - self._sfp_capability = None + self.refresh_xcvr_api() def get_presence(self): """ @@ -637,32 +217,17 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - presence = False - ethtool_cmd = "ethtool -m sfp{} hex on offset 0 length 1 2>/dev/null".format(self.index) - try: - proc = subprocess.Popen(ethtool_cmd, - stdout=subprocess.PIPE, - shell=True, - stderr=subprocess.STDOUT, - universal_newlines=True) - stdout = proc.communicate()[0] - proc.wait() - result = stdout.rstrip('\n') - if result != '': - presence = True - - except OSError as e: - raise OSError("Cannot detect sfp") - - return presence + eeprom_raw = self.read_eeprom(0, 1) + + return eeprom_raw is not None # Read out any bytes from any offset - def _read_eeprom_specific_bytes(self, offset, num_bytes): + def read_eeprom(self, offset, num_bytes): eeprom_raw = [] ethtool_cmd = "ethtool -m sfp{} hex on offset {} length {}".format(self.index, offset, num_bytes) try: - output = subprocess.check_output(ethtool_cmd, - shell=True, + output = subprocess.check_output(ethtool_cmd, + shell=True, universal_newlines=True) output_lines = output.splitlines() first_line_raw = output_lines[0] @@ -673,933 +238,8 @@ def _read_eeprom_specific_bytes(self, offset, num_bytes): except subprocess.CalledProcessError as e: return None - return eeprom_raw - - def _convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - - def get_transceiver_info(self): - """ - Retrieves transceiver info of this SFP - - Returns: - A dict which contains following keys/values : - ================================================================================ - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - type |1*255VCHAR |type of SFP - vendor_rev |1*255VCHAR |vendor revision of SFP - serial |1*255VCHAR |serial number of the SFP - manufacturer |1*255VCHAR |SFP vendor name - model |1*255VCHAR |SFP model name - connector |1*255VCHAR |connector information - encoding |1*255VCHAR |encoding information - ext_identifier |1*255VCHAR |extend identifier - ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance - cable_length |INT |cable length in m - mominal_bit_rate |INT |nominal bit rate by 100Mbs - specification_compliance |1*255VCHAR |specification compliance - vendor_date |1*255VCHAR |vendor date - vendor_oui |1*255VCHAR |vendor OUI - application_advertisement |1*255VCHAR |supported applications advertisement - ================================================================================ - """ - transceiver_info_dict = {} - compliance_code_dict = {} - - # ToDo: OSFP tranceiver info parsing not fully supported. - # in inf8628.py lack of some memory map definition - # will be implemented when the inf8628 memory map ready - if self.sfp_type == OSFP_TYPE: - offset = 0 - vendor_rev_width = XCVR_HW_REV_WIDTH_OSFP - - sfpi_obj = inf8628InterfaceId() - if sfpi_obj is None: - return None - - sfp_type_raw = self._read_eeprom_specific_bytes((offset + OSFP_TYPE_OFFSET), XCVR_TYPE_WIDTH) - if sfp_type_raw is not None: - sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) - else: - return None - - sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + OSFP_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) - if sfp_vendor_name_raw is not None: - sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) - else: - return None - - sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + OSFP_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) - if sfp_vendor_pn_raw is not None: - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) - else: - return None - - sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + OSFP_HW_REV_OFFSET), vendor_rev_width) - if sfp_vendor_rev_raw is not None: - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) - else: - return None - - sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + OSFP_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) - if sfp_vendor_sn_raw is not None: - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) - else: - return None - - transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] - transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] - transceiver_info_dict['vendor_oui'] = 'N/A' - transceiver_info_dict['vendor_date'] = 'N/A' - transceiver_info_dict['connector'] = 'N/A' - transceiver_info_dict['encoding'] = 'N/A' - transceiver_info_dict['ext_identifier'] = 'N/A' - transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' - transceiver_info_dict['cable_type'] = 'N/A' - transceiver_info_dict['cable_length'] = 'N/A' - transceiver_info_dict['specification_compliance'] = 'N/A' - transceiver_info_dict['nominal_bit_rate'] = 'N/A' - transceiver_info_dict['application_advertisement'] = 'N/A' - - elif self.sfp_type == QSFP_TYPE: - offset = 128 - vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP - interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP - - sfpi_obj = sff8436InterfaceId() - if sfpi_obj is None: - print("Error: sfp_object open failed") - return None - - elif self.sfp_type == QSFP_DD_TYPE: - offset = 128 - - sfpi_obj = qsfp_dd_InterfaceId() - if sfpi_obj is None: - print("Error: sfp_object open failed") - return None - - sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) - if sfp_type_raw is not None: - sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) - else: - return None - - sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) - if sfp_vendor_name_raw is not None: - sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) - else: - return None - - sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) - if sfp_vendor_pn_raw is not None: - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) - else: - return None - - sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET_QSFP_DD), XCVR_HW_REV_WIDTH_QSFP_DD) - if sfp_vendor_rev_raw is not None: - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) - else: - return None - - sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) - if sfp_vendor_sn_raw is not None: - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) - else: - return None - - sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) - if sfp_vendor_oui_raw is not None: - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) - else: - return None - - sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET_QSFP_DD), XCVR_VENDOR_DATE_WIDTH_QSFP_DD) - if sfp_vendor_date_raw is not None: - sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) - else: - return None - - sfp_connector_raw = self._read_eeprom_specific_bytes((offset + XCVR_CONNECTOR_OFFSET_QSFP_DD), XCVR_CONNECTOR_WIDTH_QSFP_DD) - if sfp_connector_raw is not None: - sfp_connector_data = sfpi_obj.parse_connector(sfp_connector_raw, 0) - else: - return None - - sfp_ext_identifier_raw = self._read_eeprom_specific_bytes((offset + XCVR_EXT_TYPE_OFFSET_QSFP_DD), XCVR_EXT_TYPE_WIDTH_QSFP_DD) - if sfp_ext_identifier_raw is not None: - sfp_ext_identifier_data = sfpi_obj.parse_ext_iden(sfp_ext_identifier_raw, 0) - else: - return None - - sfp_cable_len_raw = self._read_eeprom_specific_bytes((offset + XCVR_CABLE_LENGTH_OFFSET_QSFP_DD), XCVR_CABLE_LENGTH_WIDTH_QSFP_DD) - if sfp_cable_len_raw is not None: - sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_cable_len_raw, 0) - else: - return None - - sfp_media_type_raw = self._read_eeprom_specific_bytes(XCVR_MEDIA_TYPE_OFFSET_QSFP_DD, XCVR_MEDIA_TYPE_WIDTH_QSFP_DD) - if sfp_media_type_raw is not None: - sfp_media_type_dict = sfpi_obj.parse_media_type(sfp_media_type_raw, 0) - if sfp_media_type_dict is None: - return None - - host_media_list = "" - sfp_application_type_first_list = self._read_eeprom_specific_bytes((XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD) - if self.second_application_list: - possible_application_count = 15 - sfp_application_type_second_list = self._read_eeprom_specific_bytes((XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD) - if sfp_application_type_first_list is not None and sfp_application_type_second_list is not None: - sfp_application_type_list = sfp_application_type_first_list + sfp_application_type_second_list - else: - return None - else: - possible_application_count = 8 - if sfp_application_type_first_list is not None: - sfp_application_type_list = sfp_application_type_first_list - else: - return None - - for i in range(0, possible_application_count): - if sfp_application_type_list[i * 4] == 'ff': - break - host_electrical, media_interface = sfpi_obj.parse_application(sfp_media_type_dict, sfp_application_type_list[i * 4], sfp_application_type_list[i * 4 + 1]) - host_media_list = host_media_list + host_electrical + ' - ' + media_interface + '\n\t\t\t\t ' - else: - return None - - transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) - transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) - transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) - transceiver_info_dict['vendor_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) - transceiver_info_dict['serial'] = str(sfp_vendor_sn_data['data']['Vendor SN']['value']) - transceiver_info_dict['vendor_oui'] = str(sfp_vendor_oui_data['data']['Vendor OUI']['value']) - transceiver_info_dict['vendor_date'] = str(sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value']) - transceiver_info_dict['connector'] = str(sfp_connector_data['data']['Connector']['value']) - transceiver_info_dict['encoding'] = "Not supported for CMIS cables" - transceiver_info_dict['ext_identifier'] = str(sfp_ext_identifier_data['data']['Extended Identifier']['value']) - transceiver_info_dict['ext_rateselect_compliance'] = "Not supported for CMIS cables" - transceiver_info_dict['specification_compliance'] = "Not supported for CMIS cables" - transceiver_info_dict['cable_type'] = "Length Cable Assembly(m)" - transceiver_info_dict['cable_length'] = str(sfp_cable_len_data['data']['Length Cable Assembly(m)']['value']) - transceiver_info_dict['nominal_bit_rate'] = "Not supported for CMIS cables" - transceiver_info_dict['application_advertisement'] = host_media_list - - else: - offset = 0 - vendor_rev_width = XCVR_HW_REV_WIDTH_SFP - interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_SFP - - sfpi_obj = sff8472InterfaceId() - if sfpi_obj is None: - print("Error: sfp_object open failed") - return None - - if self.sfp_type != QSFP_DD_TYPE: - sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) - if sfp_interface_bulk_raw is None: - return None - - start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START - end = start + interface_info_bulk_width - sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START - end = start + XCVR_VENDOR_NAME_WIDTH - sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START - end = start + XCVR_VENDOR_PN_WIDTH - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START - end = start + vendor_rev_width - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START - end = start + XCVR_VENDOR_SN_WIDTH - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START - end = start + XCVR_VENDOR_OUI_WIDTH - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) - - start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START - end = start + XCVR_VENDOR_DATE_WIDTH - sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) - - transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] - transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] - transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] - transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] - transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] - transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] - transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] - transceiver_info_dict['application_advertisement'] = 'N/A' - - if self.sfp_type == QSFP_TYPE: - for key in qsfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - transceiver_info_dict['cable_type'] = key - transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) - - for key in qsfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] - sfp_ext_specification_compliance_raw = self._read_eeprom_specific_bytes(offset + XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET, XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH) - if sfp_ext_specification_compliance_raw is not None: - sfp_ext_specification_compliance_data = sfpi_obj.parse_ext_specification_compliance(sfp_ext_specification_compliance_raw[0 : 1], 0) - if sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] != "Unspecified": - compliance_code_dict['Extended Specification compliance'] = sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] - transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) - - transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) - else: - for key in sfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - transceiver_info_dict['cable_type'] = key - transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) - - for key in sfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] - transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) - - transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) - - return transceiver_info_dict - - - def get_transceiver_bulk_status(self): - """ - Retrieves transceiver bulk status of this SFP - - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - RX LOS |BOOLEAN |RX lost-of-signal status, - | |True if has RX los, False if not. - TX FAULT |BOOLEAN |TX fault status, - | |True if has TX fault, False if not. - Reset status |BOOLEAN |reset status, - | |True if SFP in reset, False if not. - LP mode |BOOLEAN |low power mode status, - | |True in lp mode, False if not. - TX disable |BOOLEAN |TX disable status, - | |True TX disabled, False if not. - TX disabled channel |HEX |disabled TX channles in hex, - | |bits 0 to 3 represent channel 0 - | |to channel 3. - Temperature |INT |module temperature in Celsius - Voltage |INT |supply voltage in mV - TX bias |INT |TX Bias Current in mA - RX power |INT |received optical power in mW - TX power |INT |TX output power in mW - ======================================================================== - """ - transceiver_dom_info_dict = {} - - dom_info_dict_keys = ['temperature', 'voltage', - 'rx1power', 'rx2power', - 'rx3power', 'rx4power', - 'rx5power', 'rx6power', - 'rx7power', 'rx8power', - 'tx1bias', 'tx2bias', - 'tx3bias', 'tx4bias', - 'tx5bias', 'tx6bias', - 'tx7bias', 'tx8bias', - 'tx1power', 'tx2power', - 'tx3power', 'tx4power', - 'tx5power', 'tx6power', - 'tx7power', 'tx8power' - ] - transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') - - if self.sfp_type == OSFP_TYPE: - pass - - elif self.sfp_type == QSFP_TYPE: - if not self.dom_supported: - return transceiver_dom_info_dict - - offset = 0 - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return transceiver_dom_info_dict - - dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) - if dom_data_raw is None: - return transceiver_dom_info_dict - - if self.dom_temp_supported: - start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START - end = start + QSFP_TEMPE_WIDTH - dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - if temp is not None: - transceiver_dom_info_dict['temperature'] = temp - - if self.dom_volt_supported: - start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START - end = start + QSFP_VOLT_WIDTH - dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) - volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - if volt is not None: - transceiver_dom_info_dict['voltage'] = volt - - start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START - end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) - - if self.dom_tx_power_supported: - transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) - transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) - transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) - transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) - - if self.dom_rx_power_supported: - transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) - transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) - transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) - transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) - - transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] - transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] - transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] - transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] - - elif self.sfp_type == QSFP_DD_TYPE: - - offset = 0 - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return transceiver_dom_info_dict - - dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_DOM_BULK_DATA_START), QSFP_DD_DOM_BULK_DATA_SIZE) - if dom_data_raw is None: - return transceiver_dom_info_dict - - if self.dom_temp_supported: - start = QSFP_DD_TEMPE_OFFSET - QSFP_DD_DOM_BULK_DATA_START - end = start + QSFP_DD_TEMPE_WIDTH - dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - if temp is not None: - transceiver_dom_info_dict['temperature'] = temp - - if self.dom_volt_supported: - start = QSFP_DD_VOLT_OFFSET - QSFP_DD_DOM_BULK_DATA_START - end = start + QSFP_DD_VOLT_WIDTH - dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) - volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - if volt is not None: - transceiver_dom_info_dict['voltage'] = volt - - if self.dom_rx_tx_power_bias_supported: - # page 11h - offset = 512 - dom_data_raw = self._read_eeprom_specific_bytes(offset + QSFP_DD_CHANNL_MON_OFFSET, QSFP_DD_CHANNL_MON_WIDTH) - if dom_data_raw is None: - return transceiver_dom_info_dict - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw, 0) - - if self.dom_tx_power_supported: - transceiver_dom_info_dict['tx1power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) - transceiver_dom_info_dict['tx2power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) - transceiver_dom_info_dict['tx3power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) - transceiver_dom_info_dict['tx4power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) - transceiver_dom_info_dict['tx5power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX5Power']['value'])) - transceiver_dom_info_dict['tx6power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX6Power']['value'])) - transceiver_dom_info_dict['tx7power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX7Power']['value'])) - transceiver_dom_info_dict['tx8power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['TX8Power']['value'])) - - if self.dom_rx_power_supported: - transceiver_dom_info_dict['rx1power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) - transceiver_dom_info_dict['rx2power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) - transceiver_dom_info_dict['rx3power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) - transceiver_dom_info_dict['rx4power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) - transceiver_dom_info_dict['rx5power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX5Power']['value'])) - transceiver_dom_info_dict['rx6power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX6Power']['value'])) - transceiver_dom_info_dict['rx7power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX7Power']['value'])) - transceiver_dom_info_dict['rx8power'] = str(self._convert_string_to_num(dom_channel_monitor_data['data']['RX8Power']['value'])) - - if self.dom_tx_bias_power_supported: - transceiver_dom_info_dict['tx1bias'] = str(dom_channel_monitor_data['data']['TX1Bias']['value']) - transceiver_dom_info_dict['tx2bias'] = str(dom_channel_monitor_data['data']['TX2Bias']['value']) - transceiver_dom_info_dict['tx3bias'] = str(dom_channel_monitor_data['data']['TX3Bias']['value']) - transceiver_dom_info_dict['tx4bias'] = str(dom_channel_monitor_data['data']['TX4Bias']['value']) - transceiver_dom_info_dict['tx5bias'] = str(dom_channel_monitor_data['data']['TX5Bias']['value']) - transceiver_dom_info_dict['tx6bias'] = str(dom_channel_monitor_data['data']['TX6Bias']['value']) - transceiver_dom_info_dict['tx7bias'] = str(dom_channel_monitor_data['data']['TX7Bias']['value']) - transceiver_dom_info_dict['tx8bias'] = str(dom_channel_monitor_data['data']['TX8Bias']['value']) - - return transceiver_dom_info_dict - - else: - if not self.dom_supported: - return transceiver_dom_info_dict - - offset = 256 - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return transceiver_dom_info_dict - sfpd_obj._calibration_type = self.calibration - - dom_data_raw = self._read_eeprom_specific_bytes((offset + SFP_DOM_BULK_DATA_START), SFP_DOM_BULK_DATA_SIZE) - - start = SFP_TEMPE_OFFSET - SFP_DOM_BULK_DATA_START - end = start + SFP_TEMPE_WIDTH - dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start: end], 0) - - start = SFP_VOLT_OFFSET - SFP_DOM_BULK_DATA_START - end = start + SFP_VOLT_WIDTH - dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start: end], 0) - - start = SFP_CHANNL_MON_OFFSET - SFP_DOM_BULK_DATA_START - end = start + SFP_CHANNL_MON_WIDTH - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw[start: end], 0) - - transceiver_dom_info_dict['temperature'] = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - transceiver_dom_info_dict['voltage'] = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RXPower']['value']) - transceiver_dom_info_dict['tx1bias'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TXBias']['value']) - transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TXPower']['value']) - - return transceiver_dom_info_dict - - - def get_transceiver_threshold_info(self): - """ - Retrieves transceiver threshold info of this SFP - - Returns: - A dict which contains following keys/values : - ======================================================================== - keys |Value Format |Information - ---------------------------|---------------|---------------------------- - temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. - templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. - temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. - templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. - vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. - vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. - vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. - vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. - rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. - rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. - rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. - rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. - txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. - txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. - txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. - txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. - txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. - txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. - txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. - txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. - ======================================================================== - """ - transceiver_dom_threshold_info_dict = {} - - dom_info_dict_keys = ['temphighalarm', 'temphighwarning', - 'templowalarm', 'templowwarning', - 'vcchighalarm', 'vcchighwarning', - 'vcclowalarm', 'vcclowwarning', - 'rxpowerhighalarm', 'rxpowerhighwarning', - 'rxpowerlowalarm', 'rxpowerlowwarning', - 'txpowerhighalarm', 'txpowerhighwarning', - 'txpowerlowalarm', 'txpowerlowwarning', - 'txbiashighalarm', 'txbiashighwarning', - 'txbiaslowalarm', 'txbiaslowwarning' - ] - transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') - - if self.sfp_type == OSFP_TYPE: - pass - - elif self.sfp_type == QSFP_TYPE: - if not self.dom_supported or not self.qsfp_page3_available: - return transceiver_dom_threshold_info_dict - - # Dom Threshold data starts from offset 384 - # Revert offset back to 0 once data is retrieved - offset = QSFP_MODULE_UPPER_PAGE3_START - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return transceiver_dom_threshold_info_dict - - dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is None: - return transceiver_dom_threshold_info_dict - - dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) - - dom_channel_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), - QSFP_CHANNL_THRESHOLD_WIDTH) - if dom_channel_threshold_raw is None: - return transceiver_dom_threshold_info_dict - dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) - - # Threshold Data - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] - - elif self.sfp_type == QSFP_DD_TYPE: - if not self.dom_supported: - return transceiver_dom_threshold_info_dict - - if not self.dom_thresholds_supported: - return transceiver_dom_threshold_info_dict - - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return transceiver_dom_threshold_info_dict - - # page 02 - offset = 384 - dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_MODULE_THRESHOLD_OFFSET), QSFP_DD_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is None: - return transceiver_dom_threshold_info_dict - - dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) - - # Threshold Data - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RxPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RxPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['TxBiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['TxBiasLowWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TxPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TxPowerLowWarning']['value'] - - else: - offset = SFP_MODULE_ADDRA2_OFFSET - - if not self.dom_supported: - return transceiver_dom_threshold_info_dict - - sfpd_obj = sff8472Dom(None, self.calibration) - if sfpd_obj is None: - return transceiver_dom_threshold_info_dict - - dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + SFP_MODULE_THRESHOLD_OFFSET), - SFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is not None: - dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold(dom_module_threshold_raw, 0) - else: - return transceiver_dom_threshold_info_dict - - # Threshold Data - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VoltageHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] - - return transceiver_dom_threshold_info_dict - - - def get_reset_status(self): - """ - Retrieves the reset status of SFP - - Returns: - A Boolean, True if reset enabled, False if disabled - - for QSFP, originally I would like to make use of Initialization complete flag bit - which is at Page a0 offset 6 bit 0 to test whether reset is complete. - However as unit testing was carried out I find this approach may fail because: - 1. we make use of ethtool to read data on I2C bus rather than to read directly - 2. ethtool is unable to access I2C during QSFP module being reset - In other words, whenever the flag is able to be retrived, the value is always be 1 - As a result, it doesn't make sense to retrieve that flag. Just treat successfully - retrieving data as "data ready". - for SFP it seems that there is not flag indicating whether reset succeed. However, - we can also do it in the way for QSFP. - """ - if not self.dom_supported: - return False - - if self.sfp_type == OSFP_TYPE: - return False - elif self.sfp_type == QSFP_TYPE: - offset = 0 - sfpd_obj = sff8436Dom() - dom_module_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_MONITOR_OFFSET), QSFP_MODULE_MONITOR_WIDTH) - - if dom_module_monitor_raw is not None: - return True - else: - return False - elif self.sfp_type == SFP_TYPE: - offset = 0 - sfpd_obj = sff8472Dom() - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) - - if dom_channel_monitor_raw is not None: - return True - else: - return False - elif self.sfp_type == QSFP_DD_TYPE: - offset = 0 - sfpd_obj = qsfp_dd_Dom() - dom_channel_status_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_STATUS_OFFSET), QSFP_DD_CHANNL_STATUS_WIDTH) - - if dom_channel_status_raw is None: - return False - - dom_channel_status_data = sfpd_obj.parse_dom_channel_status(dom_channel_status_raw, 0) - return dom_channel_status_data['data']['Status']['value'] == 'On' - - def get_rx_los(self): - """ - Retrieves the RX LOS (lost-of-signal) status of SFP - - Returns: - A Boolean, True if SFP has RX LOS, False if not. - Note : RX LOS status is latched until a call to get_rx_los or a reset. - """ - if not self.dom_supported: - return None - - rx_los_list = [] - if self.sfp_type == OSFP_TYPE: - return None - elif self.sfp_type == QSFP_TYPE: - offset = 0 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - rx_los_data = int(dom_channel_monitor_raw[0], 16) - rx_los_list.append(rx_los_data & 0x01 != 0) - rx_los_list.append(rx_los_data & 0x02 != 0) - rx_los_list.append(rx_los_data & 0x04 != 0) - rx_los_list.append(rx_los_data & 0x08 != 0) - - elif self.sfp_type == QSFP_DD_TYPE: - # page 11h - if self.dom_rx_tx_power_bias_supported: - offset = 512 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - rx_los_data = int(dom_channel_monitor_raw[0], 8) - rx_los_list.append(rx_los_data & 0x01 != 0) - rx_los_list.append(rx_los_data & 0x02 != 0) - rx_los_list.append(rx_los_data & 0x04 != 0) - rx_los_list.append(rx_los_data & 0x08 != 0) - rx_los_list.append(rx_los_data & 0x10 != 0) - rx_los_list.append(rx_los_data & 0x20 != 0) - rx_los_list.append(rx_los_data & 0x40 != 0) - rx_los_list.append(rx_los_data & 0x80 != 0) - - else: - offset = 256 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - rx_los_data = int(dom_channel_monitor_raw[0], 16) - rx_los_list.append(rx_los_data & 0x02 != 0) - else: - return None - return rx_los_list - - - def get_tx_fault(self): - """ - Retrieves the TX fault status of SFP - - Returns: - A Boolean, True if SFP has TX fault, False if not - Note : TX fault status is lached until a call to get_tx_fault or a reset. - """ - if not self.dom_supported: - return None - - tx_fault_list = [] - if self.sfp_type == OSFP_TYPE: - return None - elif self.sfp_type == QSFP_TYPE: - offset = 0 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_fault_data = int(dom_channel_monitor_raw[0], 16) - tx_fault_list.append(tx_fault_data & 0x01 != 0) - tx_fault_list.append(tx_fault_data & 0x02 != 0) - tx_fault_list.append(tx_fault_data & 0x04 != 0) - tx_fault_list.append(tx_fault_data & 0x08 != 0) - - elif self.sfp_type == QSFP_DD_TYPE: - return None - # page 11h - if self.dom_rx_tx_power_bias_supported: - offset = 512 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_DD_CHANNL_TX_FAULT_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_fault_data = int(dom_channel_monitor_raw[0], 8) - tx_fault_list.append(tx_fault_data & 0x01 != 0) - tx_fault_list.append(tx_fault_data & 0x02 != 0) - tx_fault_list.append(tx_fault_data & 0x04 != 0) - tx_fault_list.append(tx_fault_data & 0x08 != 0) - tx_fault_list.append(tx_fault_data & 0x10 != 0) - tx_fault_list.append(tx_fault_data & 0x20 != 0) - tx_fault_list.append(tx_fault_data & 0x40 != 0) - tx_fault_list.append(tx_fault_data & 0x80 != 0) - - else: - offset = 256 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_fault_data = int(dom_channel_monitor_raw[0], 16) - tx_fault_list.append(tx_fault_data & 0x04 != 0) - else: - return None - return tx_fault_list - - - def get_tx_disable(self): - """ - Retrieves the tx_disable status of this SFP - - Returns: - A Boolean, True if tx_disable is enabled, False if disabled - - for QSFP, the disable states of each channel which are the lower 4 bits in byte 85 page a0 - for SFP, the TX Disable State and Soft TX Disable Select is ORed as the tx_disable status returned - These two bits are bit 7 & 6 in byte 110 page a2 respectively - """ - if not self.dom_supported: - return None - - tx_disable_list = [] - if self.sfp_type == OSFP_TYPE: - return None - elif self.sfp_type == QSFP_TYPE: - offset = 0 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_disable_data = int(dom_channel_monitor_raw[0], 16) - tx_disable_list.append(tx_disable_data & 0x01 != 0) - tx_disable_list.append(tx_disable_data & 0x02 != 0) - tx_disable_list.append(tx_disable_data & 0x04 != 0) - tx_disable_list.append(tx_disable_data & 0x08 != 0) - - elif self.sfp_type == QSFP_DD_TYPE: - if self.dom_rx_tx_power_bias_supported: - offset = 128 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET), QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_disable_data = int(dom_channel_monitor_raw[0], 16) - tx_disable_list.append(tx_disable_data & 0x01 != 0) - tx_disable_list.append(tx_disable_data & 0x02 != 0) - tx_disable_list.append(tx_disable_data & 0x04 != 0) - tx_disable_list.append(tx_disable_data & 0x08 != 0) - tx_disable_list.append(tx_disable_data & 0x10 != 0) - tx_disable_list.append(tx_disable_data & 0x20 != 0) - tx_disable_list.append(tx_disable_data & 0x40 != 0) - tx_disable_list.append(tx_disable_data & 0x80 != 0) - - else: - offset = 256 - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) - if dom_channel_monitor_raw is not None: - tx_disable_data = int(dom_channel_monitor_raw[0], 16) - tx_disable_list.append(tx_disable_data & 0xC0 != 0) - else: - return None - return tx_disable_list - - - def get_tx_disable_channel(self): - """ - Retrieves the TX disabled channels in this SFP - - Returns: - A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent - TX channels which have been disabled in this SFP. - As an example, a returned value of 0x5 indicates that channel 0 - and channel 2 have been disabled. - """ - tx_disable_list = self.get_tx_disable() - if tx_disable_list is None: - return 0 - tx_disabled = 0 - for i in range(len(tx_disable_list)): - if tx_disable_list[i]: - tx_disabled |= 1 << i - return tx_disabled - + eeprom_raw = list(map(lambda h: int(h, base=16), eeprom_raw)) + return bytearray(eeprom_raw) @classmethod def mgmt_phy_mod_pwr_attr_get(cls, power_attr_type, sdk_handle, sdk_index, slot_id): @@ -1619,8 +259,6 @@ def mgmt_phy_mod_pwr_attr_get(cls, power_attr_type, sdk_handle, sdk_index, slot_ finally: delete_sx_mgmt_phy_mod_pwr_attr_t_p(sx_mgmt_phy_mod_pwr_attr_p) - - def get_lpmode(self): """ Retrieves the lpmode (low power mode) status of this SFP @@ -1629,7 +267,7 @@ def get_lpmode(self): A Boolean, True if lpmode is enabled, False if disabled """ if utils.is_host(): - # To avoid performance issue, + # To avoid performance issue, # call class level method to avoid initialize the whole sonic platform API get_lpmode_code = 'from sonic_platform import sfp;\n' \ 'with sfp.SdkHandleContext() as sdk_handle:' \ @@ -1644,10 +282,9 @@ def get_lpmode(self): else: return self._get_lpmode(self.sdk_handle, self.sdk_index, self.slot_id) - @classmethod def _get_lpmode(cls, sdk_handle, sdk_index, slot_id): - """Class level method to get low power mode. + """Class level method to get low power mode. Args: sdk_handle: SDK handle @@ -1660,369 +297,6 @@ def _get_lpmode(cls, sdk_handle, sdk_index, slot_id): _, oper_pwr_mode = cls.mgmt_phy_mod_pwr_attr_get(SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E, sdk_handle, sdk_index, slot_id) return oper_pwr_mode == SX_MGMT_PHY_MOD_PWR_MODE_LOW_E - - def get_power_override(self): - """ - Retrieves the power-override status of this SFP - - Returns: - A Boolean, True if power-override is enabled, False if disabled - """ - if self.sfp_type == QSFP_TYPE: - offset = 0 - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return False - - dom_control_raw = self._read_eeprom_specific_bytes((offset + QSFP_CONTROL_OFFSET), QSFP_CONTROL_WIDTH) - if dom_control_raw is not None: - dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) - return ('On' == dom_control_data['data']['PowerOverride']) - else: - return NotImplementedError - - - def get_temperature(self): - """ - Retrieves the temperature of this SFP - - Returns: - An integer number of current temperature in Celsius - """ - if not self.dom_supported: - return None - if self.sfp_type == QSFP_TYPE: - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - if self.dom_temp_supported: - dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - return temp - else: - return None - else: - return None - - elif self.sfp_type == QSFP_DD_TYPE: - offset = 0 - - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return None - - if self.dom_temp_supported: - dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TEMPE_OFFSET), QSFP_DD_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - return temp - return None - - else: - offset = 256 - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - sfpd_obj._calibration_type = 1 - - dom_temperature_raw = self._read_eeprom_specific_bytes((offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - return temp - else: - return None - - - def get_voltage(self): - """ - Retrieves the supply voltage of this SFP - - Returns: - An integer number of supply voltage in mV - """ - if not self.dom_supported: - return None - if self.sfp_type == QSFP_TYPE: - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - if self.dom_volt_supported: - dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - return voltage - else: - return None - return None - - if self.sfp_type == QSFP_DD_TYPE: - offset = 128 - - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return None - - if self.dom_volt_supported: - dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VOLT_OFFSET), QSFP_DD_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - return voltage - return None - - else: - offset = 256 - - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - - sfpd_obj._calibration_type = self.calibration - - dom_voltage_raw = self._read_eeprom_specific_bytes((offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - return voltage - else: - return None - - - def get_tx_bias(self): - """ - Retrieves the TX bias current of this SFP - - Returns: - A list of four integer numbers, representing TX bias in mA - for channel 0 to channel 4. - Ex. ['110.09', '111.12', '108.21', '112.09'] - """ - tx_bias_list = [] - if self.sfp_type == QSFP_TYPE: - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) - tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Bias']['value'])) - - elif self.sfp_type == QSFP_DD_TYPE: - # page 11h - if self.dom_rx_tx_power_bias_supported: - offset = 512 - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return None - - if self.dom_tx_bias_power_supported: - dom_tx_bias_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_BIAS_OFFSET), QSFP_DD_TX_BIAS_WIDTH) - if dom_tx_bias_raw is not None: - dom_tx_bias_data = sfpd_obj.parse_dom_tx_bias(dom_tx_bias_raw, 0) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX1Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX2Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX3Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX4Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX5Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX6Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX7Bias']['value'])) - tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX8Bias']['value'])) - - else: - offset = 256 - - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - sfpd_obj._calibration_type = self.calibration - - if self.dom_supported: - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TXBias']['value'])) - else: - return None - else: - return None - - return tx_bias_list - - - def get_rx_power(self): - """ - Retrieves the received optical power for this SFP - - Returns: - A list of four integer numbers, representing received optical - power in mW for channel 0 to channel 4. - Ex. ['1.77', '1.71', '1.68', '1.70'] - """ - rx_power_list = [] - if self.sfp_type == OSFP_TYPE: - # OSFP not supported on our platform yet. - return None - - elif self.sfp_type == QSFP_TYPE: - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - if self.dom_rx_power_supported: - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) - rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) - else: - return None - else: - return None - - elif self.sfp_type == QSFP_DD_TYPE: - # page 11 - if self.dom_rx_tx_power_bias_supported: - offset = 512 - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return None - - if self.dom_rx_power_supported: - dom_rx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_RX_POWER_OFFSET), QSFP_DD_RX_POWER_WIDTH) - if dom_rx_power_raw is not None: - dom_rx_power_data = sfpd_obj.parse_dom_rx_power(dom_rx_power_raw, 0) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX1Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX2Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX3Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX4Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX5Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX6Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX7Power']['value'])) - rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX8Power']['value'])) - - else: - offset = 256 - - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - - if self.dom_supported: - sfpd_obj._calibration_type = self.calibration - - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RXPower']['value'])) - else: - return None - else: - return None - return rx_power_list - - - def get_tx_power(self): - """ - Retrieves the TX power of this SFP - - Returns: - A list of four integer numbers, representing TX power in mW - for channel 0 to channel 4. - Ex. ['1.86', '1.86', '1.86', '1.86'] - """ - tx_power_list = [] - if self.sfp_type == OSFP_TYPE: - # OSFP not supported on our platform yet. - return None - - elif self.sfp_type == QSFP_TYPE: - offset = 0 - offset_xcvr = 128 - - sfpd_obj = sff8436Dom() - if sfpd_obj is None: - return None - - if self.dom_tx_power_supported: - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) - tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) - else: - return None - else: - return None - - elif self.sfp_type == QSFP_DD_TYPE: - return None - # page 11 - if self.dom_rx_tx_power_bias_supported: - offset = 512 - sfpd_obj = qsfp_dd_Dom() - if sfpd_obj is None: - return None - - if self.dom_tx_power_supported: - dom_tx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_POWER_OFFSET), QSFP_DD_TX_POWER_WIDTH) - if dom_tx_power_raw is not None: - dom_tx_power_data = sfpd_obj.parse_dom_tx_power(dom_tx_power_raw, 0) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX1Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX2Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX3Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX4Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX5Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX6Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX7Power']['value'])) - tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX8Power']['value'])) - - else: - offset = 256 - sfpd_obj = sff8472Dom() - if sfpd_obj is None: - return None - - if self.dom_supported: - sfpd_obj._calibration_type = self.calibration - - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TXPower']['value'])) - else: - return None - else: - return None - return tx_power_list - - def reset(self): """ Reset SFP and return all user module settings to their default state. @@ -2033,7 +307,7 @@ def reset(self): refer plugins/sfpreset.py """ if utils.is_host(): - # To avoid performance issue, + # To avoid performance issue, # call class level method to avoid initialize the whole sonic platform API reset_code = 'from sonic_platform import sfp;\n' \ 'with sfp.SdkHandleContext() as sdk_handle:' \ @@ -2050,7 +324,6 @@ def reset(self): else: return self._reset(self.sdk_handle, self.sdk_index, self.slot_id) - @classmethod def _reset(cls, sdk_handle, sdk_index, slot_id): module_id_info = sx_mgmt_module_id_info_t() @@ -2063,41 +336,6 @@ def _reset(cls, sdk_handle, sdk_index, slot_id): return rc == SX_STATUS_SUCCESS - def tx_disable(self, tx_disable): - """ - Disable SFP TX for all channels - - Args: - tx_disable : A Boolean, True to enable tx_disable mode, False to disable - tx_disable mode. - - Returns: - A boolean, True if tx_disable is set successfully, False if not - - for SFP, make use of bit 6 of byte at (offset 110, a2h (i2c addr 0x51)) to disable/enable tx - for QSFP, set all channels to disable/enable tx - """ - return NotImplementedError - - - def tx_disable_channel(self, channel, disable): - """ - Sets the tx_disable for specified SFP channels - - Args: - channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, - e.g. 0x5 for channel 0 and channel 2. - disable : A boolean, True to disable TX channels specified in channel, - False to enable - - Returns: - A boolean, True if successful, False if not - - QSFP: page a0, address 86, lower 4 bits - """ - return NotImplementedError - - @classmethod def is_nve(cls, port): return (port & NVE_MASK) != 0 @@ -2117,7 +355,7 @@ def is_port_admin_status_up(cls, sdk_handle, log_port): assert rc == SXD_STATUS_SUCCESS, "sx_api_port_state_get failed, rc = %d" % rc admin_state = sx_port_admin_state_t_p_value(admin_state_p) - + delete_sx_port_oper_state_t_p(oper_state_p) delete_sx_port_admin_state_t_p(admin_state_p) delete_sx_port_module_state_t_p(module_state_p) @@ -2220,7 +458,7 @@ def set_lpmode(self, lpmode): A boolean, True if lpmode is set successfully, False if not """ if utils.is_host(): - # To avoid performance issue, + # To avoid performance issue, # call class level method to avoid initialize the whole sonic platform API set_lpmode_code = 'from sonic_platform import sfp;\n' \ 'with sfp.SdkHandleContext() as sdk_handle:' \ @@ -2238,42 +476,20 @@ def set_lpmode(self, lpmode): else: return self._set_lpmode(lpmode, self.sdk_handle, self.sdk_index, self.slot_id) - + @classmethod def _set_lpmode(cls, lpmode, sdk_handle, sdk_index, slot_id): log_port_list = cls.get_logical_ports(sdk_handle, sdk_index, slot_id) sdk_lpmode = SX_MGMT_PHY_MOD_PWR_MODE_LOW_E if lpmode else SX_MGMT_PHY_MOD_PWR_MODE_AUTO_E - cls._set_lpmode_raw(sdk_handle, - sdk_index, + cls._set_lpmode_raw(sdk_handle, + sdk_index, slot_id, - log_port_list, - SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E, + log_port_list, + SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E, sdk_lpmode) logger.log_info("{} low power mode for module {}, slot {}".format("Enabled" if lpmode else "Disabled", sdk_index, slot_id)) return True - - def set_power_override(self, power_override, power_set): - """ - Sets SFP power level using power_override and power_set - - Args: - power_override : - A Boolean, True to override set_lpmode and use power_set - to control SFP power, False to disable SFP power control - through power_override/power_set and use set_lpmode - to control SFP power. - power_set : - Only valid when power_override is True. - A Boolean, True to set SFP to low power mode, False to set - SFP to high power mode. - - Returns: - A boolean, True if power-override and power_set are set successfully, - False if not - """ - return NotImplementedError - def is_replaceable(self): """ Indicate whether this device is replaceable. diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index cfa2d8224718..a7eff5b08625 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -38,7 +38,7 @@ class TestChassis: 2. Fan drawer related API 3. SFP related API (Except modular chassis SFP related API) 4. Reboot cause related API - + Thermal, Eeprom, Watchdog, Component, System LED related API will be tested in seperate class """ @classmethod @@ -166,7 +166,6 @@ def test_sfp(self): @mock.patch('sonic_platform.sfp_event.sfp_event.check_sfp_status', MagicMock()) @mock.patch('sonic_platform.sfp_event.sfp_event.__init__', MagicMock(return_value=None)) @mock.patch('sonic_platform.sfp_event.sfp_event.initialize', MagicMock()) - @mock.patch('sonic_platform.sfp.SFP.reinit', MagicMock()) @mock.patch('sonic_platform.device_data.DeviceDataManager.get_sfp_count', MagicMock(return_value=3)) def test_change_event(self): from sonic_platform.sfp_event import sfp_event @@ -185,7 +184,6 @@ def mock_check_sfp_status(self, port_dict, error_dict, timeout): assert status is True assert 'sfp' in event_dict and event_dict['sfp'][1] == '1' assert len(chassis._sfp_list) == 3 - assert SFP.reinit.call_count == 1 # Call get_change_event with timeout=1.0 return_port_dict = {} diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index 0ad9537430b9..261a03b527aa 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -49,7 +49,7 @@ def test_sfp_index(self, mock_max_port): assert sfp.sdk_index == 1 assert sfp.index == 5 - @mock.patch('sonic_platform.sfp.SFP._read_eeprom_specific_bytes', mock.MagicMock(return_value=None)) + @mock.patch('sonic_platform.sfp.SFP.read_eeprom', mock.MagicMock(return_value=None)) @mock.patch('sonic_platform.sfp.SFP._get_error_code') @mock.patch('sonic_platform.chassis.Chassis.get_num_sfps', mock.MagicMock(return_value=2)) def test_sfp_get_error_status(self, mock_get_error_code): From 8bc81206c57a5e5105dfd843a46856997f1cf957 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Wed, 23 Mar 2022 13:19:25 +0200 Subject: [PATCH 122/817] [Mellanox] Update NVIDIA License header for files changed since 1.1.2022 (#10289) - Why I did it Update NVIDIA Copyright header to "mellanox" files which were changed since 1.1.2022 - How I did it Update the copyright header - How to verify it Sanity tests and PR checkers. --- device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml | 2 +- platform/mellanox/asic_table.j2 | 2 +- platform/mellanox/docker-saiserver-mlnx.mk | 2 +- platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 | 2 +- platform/mellanox/fw.mk | 2 +- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/install-pending-fw.mk | 2 +- platform/mellanox/install-pending-fw.py | 2 +- platform/mellanox/libsaithrift-dev.mk | 2 +- platform/mellanox/mft.mk | 2 +- platform/mellanox/mlnx-onie-fw-update.sh | 2 +- platform/mellanox/mlnx-platform-api/sonic_platform/component.py | 2 +- platform/mellanox/mlnx-platform-api/sonic_platform/fan.py | 2 +- platform/mellanox/mlnx-platform-api/sonic_platform/psu.py | 2 +- platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py | 2 +- .../mlnx-platform-api/sonic_platform/thermal_actions.py | 2 +- .../mlnx-platform-api/sonic_platform/thermal_conditions.py | 2 +- platform/mellanox/mlnx-platform-api/tests/conftest.py | 2 +- platform/mellanox/mlnx-platform-api/tests/test_fan_api.py | 2 +- platform/mellanox/mlnx-platform-api/tests/test_firmware.py | 2 +- platform/mellanox/mlnx-platform-api/tests/test_psu.py | 2 +- platform/mellanox/mlnx-platform-api/tests/test_thermal.py | 2 +- .../mellanox/mlnx-platform-api/tests/test_thermal_policy.py | 2 +- platform/mellanox/mlnx-ssd-fw-update.sh | 2 +- platform/mellanox/rules.mk | 2 +- platform/mellanox/sdk.mk | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml b/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml index 51ffd949d54a..c4fb7293cc10 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/pcie.yaml @@ -1,5 +1,5 @@ ## -## Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +## Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. ## Apache-2.0 ## ## Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/asic_table.j2 b/platform/mellanox/asic_table.j2 index a12f8d38d254..3cda40be51d5 100644 --- a/platform/mellanox/asic_table.j2 +++ b/platform/mellanox/asic_table.j2 @@ -1,5 +1,5 @@ {# - Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. + Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. Apache-2.0 Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/docker-saiserver-mlnx.mk b/platform/mellanox/docker-saiserver-mlnx.mk index b765b338eddd..d71349a28ae7 100644 --- a/platform/mellanox/docker-saiserver-mlnx.mk +++ b/platform/mellanox/docker-saiserver-mlnx.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2018-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2018-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index d5b5e92ea81c..b356f145c9a4 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -1,5 +1,5 @@ ## -## Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +## Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. ## Apache-2.0 ## ## Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index eb7371175c9e..8293b38cd5fe 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 620dd39a96b0..1f2a08b32d4d 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/install-pending-fw.mk b/platform/mellanox/install-pending-fw.mk index 0160bb81ed53..714ac6bdec6f 100644 --- a/platform/mellanox/install-pending-fw.mk +++ b/platform/mellanox/install-pending-fw.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/install-pending-fw.py b/platform/mellanox/install-pending-fw.py index 55287854bfe2..c5b61341be9d 100755 --- a/platform/mellanox/install-pending-fw.py +++ b/platform/mellanox/install-pending-fw.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index d50311976cfe..579a41f02a24 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2017-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2017-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 2616edcd4c41..981c456906b3 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-onie-fw-update.sh b/platform/mellanox/mlnx-onie-fw-update.sh index d60c6694c0cd..4d441c5ced9b 100755 --- a/platform/mellanox/mlnx-onie-fw-update.sh +++ b/platform/mellanox/mlnx-onie-fw-update.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py index 37f04f9a1dee..d2820090798b 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/fan.py b/platform/mellanox/mlnx-platform-api/sonic_platform/fan.py index b67bb065a70c..8c40e2b61809 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/fan.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/fan.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index 64aa0166086f..39494a124ed4 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py index 06948af3286b..4749a6fbe710 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2019-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_actions.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_actions.py index 3b93a7468b15..bada4476d4c2 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_actions.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_actions.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_conditions.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_conditions.py index 456923d230c2..24a22c41019b 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_conditions.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal_conditions.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/conftest.py b/platform/mellanox/mlnx-platform-api/tests/conftest.py index c69ba8464e28..b69fdd6c75f0 100644 --- a/platform/mellanox/mlnx-platform-api/tests/conftest.py +++ b/platform/mellanox/mlnx-platform-api/tests/conftest.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/test_fan_api.py b/platform/mellanox/mlnx-platform-api/tests/test_fan_api.py index 2aa33c213882..5845a1b2cadb 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_fan_api.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_fan_api.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/test_firmware.py b/platform/mellanox/mlnx-platform-api/tests/test_firmware.py index 5d576cd2d0cd..a08dbb9d1464 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_firmware.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_firmware.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 34fa70c7beca..c53a9d44797d 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py index 89c940d89260..9c1526479a9b 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-platform-api/tests/test_thermal_policy.py b/platform/mellanox/mlnx-platform-api/tests/test_thermal_policy.py index b0ef02c347d7..ffdc6afbb0a9 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_thermal_policy.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_thermal_policy.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/mlnx-ssd-fw-update.sh b/platform/mellanox/mlnx-ssd-fw-update.sh index 7a180bde7bc7..07ec9ce103ea 100755 --- a/platform/mellanox/mlnx-ssd-fw-update.sh +++ b/platform/mellanox/mlnx-ssd-fw-update.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 7048920f6c5f..a6fc81b3beb4 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index f1c53e0dd134..08051e5ca0c7 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2016-2021 NVIDIA CORPORATION & AFFILIATES. +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. # Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); From 8f418bb6524b6060e79966dc64ab9d510ac9b21c Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 23 Mar 2022 22:36:53 +0800 Subject: [PATCH 123/817] [Build]: Enable marvell-armhf PR check (#10259) Why I did it [Build]: Enable marvell-armhf PR check Improve the azp dependencies, make the Test stage only depended on BuildVS stage. The Test stage will be triggered once the BuildVS stage finished, reduce the waiting time. --- .../azure-pipelines-image-template.yml | 2 +- .azure-pipelines/official-build-cache.yml | 5 ++++ azure-pipelines.yml | 26 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 0a83c334074f..7f2874024740 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -28,7 +28,7 @@ jobs: - template: cleanup.yml - ${{ parameters.preSteps }} - script: | - if [ -n "$(CACHE_MODE)" ] && echo $(PLATFORM_AZP) | grep -E -q "^(vs|broadcom|mellanox)$"; then + if [ -n "$(CACHE_MODE)" ] && echo $(PLATFORM_AZP) | grep -E -q "^(vs|broadcom|mellanox|marvell-armhf)$"; then CACHE_OPTIONS="SONIC_DPKG_CACHE_METHOD=$(CACHE_MODE) SONIC_DPKG_CACHE_SOURCE=/nfs/dpkg_cache/$(PLATFORM_AZP)" BUILD_OPTIONS="$(BUILD_OPTIONS) $CACHE_OPTIONS" echo "##vso[task.setvariable variable=BUILD_OPTIONS]$BUILD_OPTIONS" diff --git a/.azure-pipelines/official-build-cache.yml b/.azure-pipelines/official-build-cache.yml index 4019dbba4f97..94fd48ede501 100644 --- a/.azure-pipelines/official-build-cache.yml +++ b/.azure-pipelines/official-build-cache.yml @@ -37,3 +37,8 @@ stages: variables: docker_syncd_rpc_image: yes platform_rpc: mlnx + - name: marvell-armhf + pool: sonicbld-armhf + timeoutInMinutes: 1200 + variables: + PLATFORM_ARCH: armhf diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b96deeefb37b..557ce3beff82 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -31,25 +31,41 @@ resources: name: Azure/sonic-mgmt endpoint: build +variables: +- template: .azure-pipelines/azure-pipelines-repd-build-variables.yml +- name: CACHE_MODE + value: rcache + stages: -- stage: Build +- stage: BuildVS pool: sonicbld - variables: - - template: .azure-pipelines/azure-pipelines-repd-build-variables.yml - - name: CACHE_MODE - value: rcache jobs: - template: .azure-pipelines/azure-pipelines-build.yml parameters: buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' jobGroups: - name: vs + +- stage: Build + pool: sonicbld + dependsOn: [] + jobs: + - template: .azure-pipelines/azure-pipelines-build.yml + parameters: + buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' + jobGroups: - name: broadcom variables: swi_image: yes - name: mellanox + - name: marvell-armhf + pool: sonicbld-armhf + timeoutInMinutes: 1200 + variables: + PLATFORM_ARCH: armhf - stage: Test + dependsOn: BuildVS variables: - name: inventory value: veos_vtb From 147d63106510c69d8916f752a08db0d2bdfcbbed Mon Sep 17 00:00:00 2001 From: "Robert J. Halstead" Date: Wed, 23 Mar 2022 17:21:36 -0700 Subject: [PATCH 124/817] [PINS] update sonic-p4rt docker to bullseye (#10182) #### Why I did it SONiC is migrating to bullseye. This will update the sonic-pins container to bullseye. #### How I did it The [sonic-pins code](https://github.com/Azure/sonic-buildimage/blob/master/rules/p4rt.mk) isn't dependent on any architecture so it will already build successfully for bullseye. This PR updates the docker to use bullseye. #### How to verify it Today we cannot build the docker-sonic-p4rt.gz target (e.g. Issue #9885). With this change the docker will build successfully. The P4RT executable will not run, because of a missing runtime library, libgmpxx, which I'll address in a followup PR. #### Description for the changelog Update docker-sonic-p4rt.gz target to build with Bullseye instead of Buster. --- dockers/docker-sonic-p4rt/Dockerfile.j2 | 2 +- rules/docker-p4rt.mk | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dockers/docker-sonic-p4rt/Dockerfile.j2 b/dockers/docker-sonic-p4rt/Dockerfile.j2 index c27dadad6cf7..8708518340c8 100644 --- a/dockers/docker-sonic-p4rt/Dockerfile.j2 +++ b/dockers/docker-sonic-p4rt/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-bullseye ARG docker_container_name ARG git_commit diff --git a/rules/docker-p4rt.mk b/rules/docker-p4rt.mk index 6d8a650aad82..60e0d7d75244 100644 --- a/rules/docker-p4rt.mk +++ b/rules/docker-p4rt.mk @@ -7,12 +7,12 @@ DOCKER_P4RT_DBG = $(DOCKER_P4RT_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_P4RT)_PATH = $(DOCKERS_PATH)/$(DOCKER_P4RT_STEM) $(DOCKER_P4RT)_DEPENDS += $(SONIC_P4RT) -$(DOCKER_P4RT)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_P4RT)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_P4RT)_DBG_DEPENDS += $(SONIC_P4RT_DBG) $(LIBSWSSCOMMON_DBG) $(DOCKER_P4RT)_DBG_DEPENDS += $(LIBSAIREDIS_DBG) -$(DOCKER_P4RT)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_P4RT)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_P4RT)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_P4RT)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_P4RT)_VERSION = 1.0.0 $(DOCKER_P4RT)_PACKAGE_NAME = p4rt From 97c02075f5d6590ca8b5083e9141182cd4492299 Mon Sep 17 00:00:00 2001 From: pavannaregundi <92989231+pavannaregundi@users.noreply.github.com> Date: Thu, 24 Mar 2022 19:54:13 +0530 Subject: [PATCH 125/817] [Marvell-armhf] Fixing issues related to partition label (#10203) Why I did it Removing incorrect check in plt setup for fw_env config: This check was added before to compare 2 different types of disk. Now the check is redundant and check is not required as transition is complete. 2)Removing legacy_volume_label in create_partition: legacy_volume_label is not used in armhf install files. With legacy_volume_label initialized to NULL, current code will always return true for check, if demo_part exits. How I did it Change is about removing the redundant/incorrect code explained above. How to verify it uboot fw_printenv and fw_setenv is tested onie-nos-install has be verified. Signed-off-by: Pavan Naregundi --- platform/marvell-armhf/platform.conf | 2 +- .../sonic-platform-nokia/nokia-7215_plt_setup.sh | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index 58748808fef7..3a9869158abc 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -196,7 +196,7 @@ create_ubi_partition() { create_gpt_partition() { blk_dev="/dev/sda" - demo_part=$(sgdisk -p $blk_dev | grep -e "$demo_volume_label" -e "$legacy_volume_label" | awk '{print $1}') + demo_part=$(sgdisk -p $blk_dev | grep -e "$demo_volume_label" | awk '{print $1}') # ONIE partition size 168MB onie_part_size=168 diff --git a/platform/marvell-armhf/sonic-platform-nokia/nokia-7215_plt_setup.sh b/platform/marvell-armhf/sonic-platform-nokia/nokia-7215_plt_setup.sh index 8301999d0d0a..0af85d730615 100755 --- a/platform/marvell-armhf/sonic-platform-nokia/nokia-7215_plt_setup.sh +++ b/platform/marvell-armhf/sonic-platform-nokia/nokia-7215_plt_setup.sh @@ -10,12 +10,6 @@ fw_uboot_env_cfg() if [ "$PLATFORM" = "armhf-nokia_ixs7215_52x-r0" ]; then # Ixs7215 / IPD6448M board Uboot ENV offset FW_ENV_DEFAULT='/dev/mtd0 0x00100000 0x10000 0x10000' - - demo_part=$(sgdisk -p /dev/sda | grep -e "SONiC-OS") - if [ -z "$demo_part" ]; then - # ET6448M Board - For Backward compatibility - FW_ENV_DEFAULT='/dev/mtd0 0x00500000 0x80000 0x100000 8' - fi else FW_ENV_DEFAULT='/dev/mtd0 0x00500000 0x80000 0x100000 8' fi From 7eb321c376fd1fcdbc67462185b8d4a7cff5f76f Mon Sep 17 00:00:00 2001 From: pavannaregundi <92989231+pavannaregundi@users.noreply.github.com> Date: Thu, 24 Mar 2022 19:54:49 +0530 Subject: [PATCH 126/817] [Marvell-armhf] Setting u-boot ftd_high to resolve kernel hung (#10204) Why I did it Kernel hang in during early boot is caused due overwriting of device tree with uncompressing kernel. Added the fdt_high which gives a safe offset from kernel location. How I did it Setting uboot environment variable fdt_high. How to verify it Successful boot of bullseye kernel on Marvell Armada 380/385. Change-Id: I3e2521780f5ecdb3bdf6cbb6542250814ca11959 Signed-off-by: Pavan Naregundi --- platform/marvell-armhf/platform.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index 3a9869158abc..0ef500e16e4f 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -7,6 +7,7 @@ echo "Preparing for installation ... " # global defines kernel_addr=0x1100000 fdt_addr=0x1000000 +fdt_high=0x10fffff initrd_addr=0x2000000 VAR_LOG=512 @@ -152,6 +153,7 @@ prepare_boot_menu() { # Set boot configs fw_setenv ${FW_ARG} kernel_addr $kernel_addr > /dev/null fw_setenv ${FW_ARG} fdt_addr $fdt_addr > /dev/null + fw_setenv ${FW_ARG} fdt_high $fdt_high > /dev/null fw_setenv ${FW_ARG} initrd_addr $initrd_addr > /dev/null fw_setenv ${FW_ARG} mtdids 'nand0=armada-nand' > /dev/null if [ $UBOOT_FW_DEFAULT -eq 1 ] From e2502edefdb38b3f93aab3ff4e4129e021a43a1f Mon Sep 17 00:00:00 2001 From: Santhosh Kumar T <53558409+santhosh-kt@users.noreply.github.com> Date: Thu, 24 Mar 2022 23:44:37 +0530 Subject: [PATCH 127/817] Refactoring DELL platform init to reduce rc.local processing time porting changes in master (#10318) Why I did it To reduce the processing time of rc.local, refactoring s6100 platform initialization. Porting changes from 202012 branch [202012] Refactoring DELL platform init to reduce rc.local processing time #10171 --- files/image_config/platform/rc.local | 3 +- .../debian/platform-modules-s6100.install | 4 +- .../s6100/scripts/fast-reboot_plugin | 2 +- .../s6100/scripts/reboot_plugin | 2 +- .../s6100/scripts/s6100_platform.sh | 56 +++++++------------ ...umeration.sh => s6100_platform_startup.sh} | 31 +++++++++- .../s6100/systemd/s6100-i2c-enumerate.service | 12 ---- .../systemd/s6100-platform-startup.service | 12 ++++ 8 files changed, 68 insertions(+), 54 deletions(-) rename platform/broadcom/sonic-platform-modules-dell/s6100/scripts/{s6100_i2c_enumeration.sh => s6100_platform_startup.sh} (89%) delete mode 100644 platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-i2c-enumerate.service create mode 100644 platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index b01c802f086f..7043da9fe143 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -225,11 +225,10 @@ if [ ! -e /host/machine.conf ]; then grub_installation_needed="TRUE" fi + migrate_nos_configuration umount /mnt/onie-boot fi -migrate_nos_configuration - . /host/machine.conf program_console_speed diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install index cac4ffbf65db..4770ac7c2caf 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install @@ -1,6 +1,6 @@ s6100/scripts/iom_power_*.sh usr/local/bin s6100/scripts/s6100_platform.sh usr/local/bin -s6100/scripts/s6100_i2c_enumeration.sh usr/local/bin +s6100/scripts/s6100_platform_startup.sh usr/local/bin s6100/scripts/s6100_bitbang_reset.sh usr/local/bin s6100/scripts/pcisysfs.py usr/bin common/dell_i2c_utils.sh usr/local/bin @@ -33,7 +33,7 @@ s6100/systemd/s6100-ssd-monitor.service etc/systemd/system s6100/systemd/s6100-ssd-monitor.timer etc/systemd/system s6100/systemd/s6100-ssd-upgrade-status.service etc/systemd/system s6100/systemd/s6100-reboot-cause.service etc/systemd/system -s6100/systemd/s6100-i2c-enumerate.service etc/systemd/system +s6100/systemd/s6100-platform-startup.service etc/systemd/system s6100/scripts/s6100_serial_getty_monitor etc/monit/conf.d common/fw-updater usr/local/bin common/onie_mode_set usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin index 683dcc6733ae..20a5d8cf5ac2 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin @@ -8,4 +8,4 @@ fi io_rd_wr.py --set --val 40 --offset 0x131 io_rd_wr.py --set --val 06 --offset 210; io_rd_wr.py --set --val 0B --offset 211; io_rd_wr.py --set --val aa --offset 213 -/usr/local/bin/s6100_i2c_enumeration.sh deinit & > /dev/null +/usr/local/bin/s6100_platform_startup.sh deinit & > /dev/null diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/reboot_plugin index 4ccfecdfe2af..84b525fe6bac 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/reboot_plugin +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/reboot_plugin @@ -5,4 +5,4 @@ if [[ -d /sys/devices/platform/SMF.512/hwmon/ ]]; then echo 0xcc > mb_poweron_reason fi -/usr/local/bin/s6100_i2c_enumeration.sh deinit & > /dev/null +/usr/local/bin/s6100_platform_startup.sh deinit & > /dev/null diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh index 2afa571aa809..15763bbc9e36 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh @@ -2,20 +2,6 @@ #platform init script for Dell S6100 -install_python_api_package() { - device="/usr/share/sonic/device" - platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) - rv=$(pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl) -} - -remove_python_api_package() { - rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) - if [ $? -eq 0 ]; then - rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) - fi -} - - if [[ "$1" == "init" ]]; then pericom="/sys/bus/pci/devices/0000:08:00.0" @@ -38,30 +24,31 @@ if [[ "$1" == "init" ]]; then systemctl start --no-block s6100-ssd-upgrade-status.service - is_fast_warm=$(cat /proc/cmdline | grep SONIC_BOOT_TYPE | wc -l) - - if [[ "$is_fast_warm" == "1" ]]; then - systemctl start --no-block s6100-i2c-enumerate.service + case "$(cat /proc/cmdline)" in + *SONIC_BOOT_TYPE=warm*) + TYPE='warm' + ;; + *SONIC_BOOT_TYPE=fastfast*) + TYPE='fastfast' + ;; + *SONIC_BOOT_TYPE=fast*|*fast-reboot*) + TYPE='fast' + ;; + *SONIC_BOOT_TYPE=soft*) + TYPE='soft' + ;; + *) + TYPE='cold' + esac + + if [[ "$TYPE" == "cold" ]]; then + systemctl start s6100-platform-startup.service else - systemctl start s6100-i2c-enumerate.service + systemctl start --no-block s6100-platform-startup.service fi - echo -2 > /sys/bus/i2c/drivers/pca954x/0-0070/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/4-0071/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/6-0071/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/6-0072/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/7-0071/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/7-0072/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/8-0071/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/8-0072/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/9-0071/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/9-0072/idle_state - - install_python_api_package - monit reload - elif [[ "$1" == "deinit" ]]; then - /usr/local/bin/s6100_i2c_enumeration.sh deinit + /usr/local/bin/s6100_platform_startup.sh deinit modprobe -r dell_s6100_lpc modprobe -r dell_s6100_iom_cpld @@ -69,7 +56,6 @@ elif [[ "$1" == "deinit" ]]; then modprobe -r i2c-dev modprobe -r dell_ich modprobe -r nvram - remove_python_api_package else echo "s6100_platform : Invalid option !" fi diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_i2c_enumeration.sh b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform_startup.sh similarity index 89% rename from platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_i2c_enumeration.sh rename to platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform_startup.sh index d00fec233eaa..d6f6d74cf290 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_i2c_enumeration.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform_startup.sh @@ -1,9 +1,22 @@ #!/bin/bash -### DellEMC S6100 I2C MUX Enumeration script +### DellEMC S6100 Platform Startup script source dell_i2c_utils.sh +install_python_api_package() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + rv=$(pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl) +} + +remove_python_api_package() { + rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) + if [ $? -eq 0 ]; then + rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) + fi +} + init_devnum() { found=0 for devnum in 0 1; do @@ -292,6 +305,20 @@ if [[ "$1" == "init" ]]; then switch_board_qsfp_lpmode "disable" /usr/local/bin/s6100_bitbang_reset.sh xcvr_presence_interrupts "enable" + + echo -2 > /sys/bus/i2c/drivers/pca954x/0-0070/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/4-0071/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/6-0071/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/6-0072/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/7-0071/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/7-0072/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/8-0071/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/8-0072/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/9-0071/idle_state + echo -2 > /sys/bus/i2c/drivers/pca954x/9-0072/idle_state + + install_python_api_package + monit reload elif [[ "$1" == "deinit" ]]; then xcvr_presence_interrupts "disable" switch_board_sfp "delete_device" @@ -302,4 +329,6 @@ elif [[ "$1" == "deinit" ]]; then switch_board_qsfp "delete_device" switch_board_qsfp_mux "delete_device" cpu_board_mux "delete_device" + + remove_python_api_package fi diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-i2c-enumerate.service b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-i2c-enumerate.service deleted file mode 100644 index c63482831940..000000000000 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-i2c-enumerate.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Dell S6100 I2C MUX Enumeration -Before=pmon.service -DefaultDependencies=no - -[Service] -Type=oneshot -ExecStart=/usr/local/bin/s6100_i2c_enumeration.sh init -RemainAfterExit=no - -[Install] -WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service new file mode 100644 index 000000000000..d7a40f43033c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service @@ -0,0 +1,12 @@ +[Unit] +Description=Dell S6100 Platform Startup Service +Before=pmon.service determine-reboot-cause.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/s6100_platform_startup.sh init +RemainAfterExit=no + +[Install] +WantedBy=multi-user.target From 928261845058a177c4b65ebaf20495e85d48a497 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 25 Mar 2022 06:14:30 +0800 Subject: [PATCH 128/817] [YANG] Add route flow counter support (#9814) * [YANG] Add route flow counter support --- .../tests/files/sample_config_db.json | 15 ++++ .../yang_model_tests/tests/flex_counter.json | 11 +++ .../tests_config/flex_counter.json | 73 +++++++++++++++++++ .../yang-models/sonic-flex_counter.yang | 65 +++++++++++++++++ 4 files changed, 164 insertions(+) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index ae0cc60da648..6415fb6100e9 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1021,6 +1021,21 @@ }, "DEBUG_COUNTER": { "FLEX_COUNTER_STATUS": "enable" + }, + "FLOW_CNT_ROUTE": { + "FLEX_COUNTER_STATUS": "enable", + "POLL_INTERVAL": "10000" + } + }, + "FLOW_COUNTER_ROUTE_PATTERN": { + "1.1.1.0/24": { + "max_match_count": "30" + }, + "2000::/64": { + "max_match_count": "30" + }, + "Vnet1|2.2.2.0/24": { + "max_match_count": "30" } }, "CRM": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/flex_counter.json b/src/sonic-yang-models/tests/yang_model_tests/tests/flex_counter.json index 7a328ca693c1..92d96b54f3a1 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/flex_counter.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/flex_counter.json @@ -6,5 +6,16 @@ "desc": "Out of range poll interval.", "eStrKey": "Range", "eStr": "100..4294967295" + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_VRF": { + "desc": "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_VRF no failure." + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_DEFAULT_VRF": { + "desc": "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_DEFAULT_VRF no failure." + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_INVALID_MAX_MATCH_COUNT": { + "desc": "Out of range max_match_count.", + "eStrKey": "Range", + "eStr": "1..50" } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/flex_counter.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/flex_counter.json index 9043132791fd..169a38ff6d7c 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/flex_counter.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/flex_counter.json @@ -46,6 +46,10 @@ "FLOW_CNT_TRAP": { "FLEX_COUNTER_STATUS": "enable", "POLL_INTERVAL": 10000 + }, + "FLOW_CNT_ROUTE": { + "FLEX_COUNTER_STATUS": "enable", + "POLL_INTERVAL": 10000 } } } @@ -97,8 +101,77 @@ "FLOW_CNT_TRAP": { "FLEX_COUNTER_STATUS": "enable", "POLL_INTERVAL": 99 + }, + "FLOW_CNT_ROUTE": { + "FLEX_COUNTER_STATUS": "enable", + "POLL_INTERVAL": 99 } } } + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_VRF": { + "sonic-vrf:sonic-vrf":{ + "sonic-vrf:VRF": { + "VRF_LIST": [ + { + "name":"Vrf1" + } + ] + } + }, + "sonic-flex_counter:sonic-flex_counter": { + "sonic-flex_counter:FLOW_COUNTER_ROUTE_PATTERN": { + "FLOW_COUNTER_ROUTE_PATTERN_VRF_LIST": [ + { + "vrf_name": "Vrf1", + "ip_prefix": "1.1.1.0/24", + "max_match_count": 30 + }, + { + "vrf_name": "Vrf1", + "ip_prefix": "2000::/64", + "max_match_count": 30 + } + ] + } + } + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_DEFAULT_VRF": { + "sonic-flex_counter:sonic-flex_counter": { + "sonic-flex_counter:FLOW_COUNTER_ROUTE_PATTERN": { + "FLOW_COUNTER_ROUTE_PATTERN_LIST": [ + { + "ip_prefix": "1.1.1.0/24", + "max_match_count": 30 + }, + { + "ip_prefix": "2000::/64", + "max_match_count": 30 + } + ] + } + } + }, + "FLOW_COUNTER_ROUTE_PATTERN_TABLE_WITH_INVALID_MAX_MATCH_COUNT": { + "sonic-vrf:sonic-vrf":{ + "sonic-vrf:VRF": { + "VRF_LIST": [ + { + "name":"Vrf1" + } + ] + } + }, + "sonic-flex_counter:sonic-flex_counter": { + "sonic-flex_counter:FLOW_COUNTER_ROUTE_PATTERN": { + "FLOW_COUNTER_ROUTE_PATTERN_VRF_LIST": [ + { + "vrf_name": "Vrf1", + "ip_prefix": "1.1.1.0/24", + "max_match_count": 0 + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-flex_counter.yang b/src/sonic-yang-models/yang-models/sonic-flex_counter.yang index 8e958af2f427..9ced223e94bc 100644 --- a/src/sonic-yang-models/yang-models/sonic-flex_counter.yang +++ b/src/sonic-yang-models/yang-models/sonic-flex_counter.yang @@ -5,6 +5,10 @@ module sonic-flex_counter { namespace "http://github.com/Azure/sonic-flex_counter"; prefix flex_counter; + import ietf-inet-types { + prefix inet; + } + import sonic-types { prefix stypes; } @@ -211,8 +215,69 @@ module sonic-flex_counter { } } + container FLOW_CNT_ROUTE { + /* ROUTE_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + leaf FLEX_COUNTER_DELAY_STATUS { + type flex_delay_status; + } + leaf POLL_INTERVAL { + type poll_interval; + } + } + } /* end of container FLEX_COUNTER_TABLE */ + + container FLOW_COUNTER_ROUTE_PATTERN { + description "Flow counter route pattern of config_db.json"; + + list FLOW_COUNTER_ROUTE_PATTERN_LIST { + + key "ip_prefix"; + + leaf ip_prefix { + type inet:ip-prefix; + } + + leaf max_match_count { + type uint32 { + range 1..50; + } + } + + } + + list FLOW_COUNTER_ROUTE_PATTERN_VRF_LIST { + + key "vrf_name ip_prefix"; + + leaf vrf_name { + /* + We don't use vrf_name reference here because: + 1. User is allowed to configure a VRF that does not exist yet here, orchagent is designed to resolve the VRF name once the VRF is created. + 2. The field vrf_name accept both VRF name and VNET name. + */ + type string { + length 0..16; + } + } + + leaf ip_prefix { + type inet:ip-prefix; + } + + leaf max_match_count { + type uint32 { + range 1..50; + } + } + + } + } + /* end of container FLOW_COUNTER_ROUTE_PATTERN */ } /* end of top level container */ } From cc938e73a3a22dfa1527344b5c4e772cf4aaf8c6 Mon Sep 17 00:00:00 2001 From: tomer-israel <76040066+tomer-israel@users.noreply.github.com> Date: Sat, 26 Mar 2022 03:47:24 +0300 Subject: [PATCH 129/817] Dynamic port configuration - solve lldp issues when adding/removing ports (#9386) #### Why I did it when adding and removing ports after init stage we saw two issues: first: In several cases, after removing a port, lldpmgr is continuing to try to add a port to lldp with lldpcli command. the execution of this command is continuing to fail since the port is not existing anymore. second: after adding a port, we sometimes see this warning messgae: "Command failed 'lldpcli configure ports Ethernet18 lldp portidsubtype local etp5b': 2021-07-27T14:16:54 [WARN/lldpctl] cannot find port Ethernet18" we added these changes in order to solve it. #### How I did it port create events are taken from app db only. lldpcli command is executed only when linux port is up. when delete port event is received we remove this command from pending_cmds dictionary #### How to verify it manual tests and running lldp tests #### Description for the changelog Dynamic port configuration - solve lldp issues when adding/removing ports --- dockers/docker-lldp/lldpmgrd | 116 ++++++++++++++++------------------- 1 file changed, 54 insertions(+), 62 deletions(-) diff --git a/dockers/docker-lldp/lldpmgrd b/dockers/docker-lldp/lldpmgrd index a6eb84bcab93..9e85406d4510 100755 --- a/dockers/docker-lldp/lldpmgrd +++ b/dockers/docker-lldp/lldpmgrd @@ -30,6 +30,8 @@ VERSION = "1.0" SYSLOG_IDENTIFIER = "lldpmgrd" PORT_INIT_TIMEOUT = 300 +FAILED_CMD_TIMEOUT = 6 +RETRY_LIMIT = 5 class LldpManager(daemon_base.DaemonBase): @@ -41,7 +43,8 @@ class LldpManager(daemon_base.DaemonBase): state_db: Handle to Redis State database via swsscommon lib config_db: Handle to Redis Config database via swsscommon lib pending_cmds: Dictionary where key is port name, value is pending - LLDP configuration command to run + LLDP configuration command to run + and the last timestamp that this command was failed (used for retry mechanism) """ REDIS_TIMEOUT_MS = 0 @@ -58,6 +61,11 @@ class LldpManager(daemon_base.DaemonBase): self.REDIS_TIMEOUT_MS, False) + # Open a handle to the State database + self.state_db = swsscommon.DBConnector("STATE_DB", + self.REDIS_TIMEOUT_MS, + False) + self.pending_cmds = {} self.hostname = "None" self.mgmt_ip = "None" @@ -66,6 +74,7 @@ class LldpManager(daemon_base.DaemonBase): self.port_table = swsscommon.Table(self.config_db, swsscommon.CFG_PORT_TABLE_NAME) self.mgmt_table = swsscommon.Table(self.config_db, swsscommon.CFG_MGMT_INTERFACE_TABLE_NAME) self.app_port_table = swsscommon.Table(self.appl_db, swsscommon.APP_PORT_TABLE_NAME) + self.state_port_table = swsscommon.Table(self.state_db, swsscommon.STATE_PORT_TABLE_NAME) def update_hostname(self, hostname): cmd = "lldpcli configure system hostname {0}".format(hostname) @@ -99,32 +108,25 @@ class LldpManager(daemon_base.DaemonBase): def is_port_up(self, port_name): """ - Determine if a port is up or down by looking into the oper-status for the port in - PORT TABLE in the Application DB + Determine if a port is up or down by looking into the netdev_oper_status for the port in + PORT TABLE in the State DB """ # Retrieve all entires for this port from the Port table - (status, fvp) = self.app_port_table.get(port_name) + (status, fvp) = self.state_port_table.get(port_name) if status: # Convert list of tuples to a dictionary port_table_dict = dict(fvp) # Get the oper-status for the port - if "oper_status" in port_table_dict: - port_oper_status = port_table_dict.get("oper_status") - self.log_info("Port name {} oper status: {}".format(port_name, port_oper_status)) + if "netdev_oper_status" in port_table_dict: + port_oper_status = port_table_dict.get("netdev_oper_status") return port_oper_status == "up" else: return False else: - # Retrieve PortInitDone entry from the Port table - (init_status, init_fvp) = self.port_table.get("PortInitDone") - # The initialization procedure is done, but don't have this port entry - if init_status: - self.log_error("Port '{}' not found in {} table in App DB".format( - port_name, swsscommon.APP_PORT_TABLE_NAME)) return False - def generate_pending_lldp_config_cmd_for_port(self, port_name): + def generate_pending_lldp_config_cmd_for_port(self, port_name, port_table_dict): """ For port `port_name`, look up the description and alias in the Config database, then form the appropriate lldpcli configuration command and run it. @@ -135,27 +137,16 @@ class LldpManager(daemon_base.DaemonBase): # asic-to-asic communication in VOQ based chassis system. We do not configure LLDP on these. if port_name.startswith(inband_prefix()): return - - # Retrieve all entires for this port from the Port table - (status, fvp) = self.port_table.get(port_name) - if status: - # Convert list of tuples to a dictionary - port_table_dict = dict(fvp) - - # Get the port alias. If None or empty string, use port name instead - port_alias = port_table_dict.get("alias") - if not port_alias: - self.log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name)) - port_alias = port_name - - # Get the port description. If None or empty string, we'll skip this configuration - port_desc = port_table_dict.get("description") - - else: - self.log_error("Port '{}' not found in {} table in Config DB. Using port name instead of port alias.".format( - port_name, swsscommon.CFG_PORT_TABLE_NAME)) + + # Get the port alias. If None or empty string, use port name instead + port_alias = port_table_dict.get("alias") + if not port_alias: + self.log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name)) port_alias = port_name - + + # Get the port description. If None or empty string, we'll skip this configuration + port_desc = port_table_dict.get("description") + lldpcli_cmd = "lldpcli configure ports {0} lldp portidsubtype local {1}".format(port_name, port_alias) # if there is a description available, also configure that @@ -166,17 +157,25 @@ class LldpManager(daemon_base.DaemonBase): # Add the command to our dictionary of pending commands, overwriting any # previous pending command for this port - self.pending_cmds[port_name] = lldpcli_cmd + self.pending_cmds[port_name] = { 'cmd': lldpcli_cmd, 'failed_count': 0} def process_pending_cmds(self): # List of port names (keys of elements) to delete from self.pending_cmds to_delete = [] - for (port_name, cmd) in self.pending_cmds.items(): - self.log_debug("Running command: '{}'".format(cmd)) + for (port_name, port_item) in self.pending_cmds.items(): + cmd = port_item['cmd'] - rc, stderr = run_cmd(self, cmd) + # check if linux port is up + if not self.is_port_up(port_name): + self.log_info("port %s is not up, continue"%port_name) + continue + + if 'failed_timestamp' in port_item and time.time()-port_item['failed_timestamp']= RETRY_LIMIT: + self.log_error("Command failed '{}': {} - command was failed {} times, disabling retry".format(cmd, stderr, RETRY_LIMIT+1)) + # not retrying again + to_delete.append(port_name) + else: + self.pending_cmds[port_name]['failed_count'] += 1 + self.pending_cmds[port_name]['failed_timestamp'] = time.time() + self.log_info("Command failed '{}': {} - cmd failed {} times, retrying again".format(cmd, stderr, self.pending_cmds[port_name]['failed_count'])) + # Delete all successful commands from self.pending_cmds for port_name in to_delete: self.pending_cmds.pop(port_name, None) @@ -268,10 +274,6 @@ class LldpManager(daemon_base.DaemonBase): sel = swsscommon.Select() - # Subscribe to PORT table notifications in the Config DB - sst_confdb = swsscommon.SubscriberStateTable(self.config_db, swsscommon.CFG_PORT_TABLE_NAME) - sel.addSelectable(sst_confdb) - # Subscribe to PORT table notifications in the App DB sst_appdb = swsscommon.SubscriberStateTable(self.appl_db, swsscommon.APP_PORT_TABLE_NAME) sel.addSelectable(sst_appdb) @@ -289,17 +291,6 @@ class LldpManager(daemon_base.DaemonBase): (state, c) = sel.select(SELECT_TIMEOUT_MS) if state == swsscommon.Select.OBJECT: - (key, op, fvp) = sst_confdb.pop() - if fvp: - fvp_dict = dict(fvp) - - # handle config change - if ("alias" in fvp_dict or "description" in fvp_dict) and (op in ["SET", "DEL"]): - if self.is_port_up(key): - self.generate_pending_lldp_config_cmd_for_port(key) - else: - self.pending_cmds.pop(key, None) - (key, op, fvp) = sst_mgmt_ip_confdb.pop() if key: self.lldp_process_mgmt_info_change(op, dict(fvp), key) @@ -310,15 +301,16 @@ class LldpManager(daemon_base.DaemonBase): (key, op, fvp) = sst_appdb.pop() if (key != "PortInitDone") and (key != "PortConfigDone"): - if fvp: - fvp_dict = dict(fvp) - - # handle port status change - if "oper_status" in fvp_dict: - if "up" in fvp_dict.get("oper_status"): - self.generate_pending_lldp_config_cmd_for_port(key) + if op == "SET": + if fvp: + if "up" in dict(fvp).get("oper_status",""): + self.generate_pending_lldp_config_cmd_for_port(key, dict(fvp)) else: self.pending_cmds.pop(key, None) + elif op == "DEL": + self.pending_cmds.pop(key, None) + else: + self.log_error("unknown operation") elif key == "PortInitDone": port_init_done = True From 8e642848c2064067819a1ba39c63a3200ba29cc2 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:22:32 -0700 Subject: [PATCH 130/817] Introduce the asic_subtype field for adding the sub platform variants. (#10235) * Introduce the asic_subtype field for adding the sub platform variants. It uses the value of TARGET_MACHINE variable in slave.mk. --- build_debian.sh | 1 + dockers/docker-orchagent/orchagent.sh | 1 + files/build_templates/sonic_version.yml.j2 | 3 +++ files/build_templates/swss_vars.j2 | 3 +++ 4 files changed, 8 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 62de5a8218fb..c509b7097151 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -492,6 +492,7 @@ export build_version="${SONIC_IMAGE_VERSION}" export debian_version="$(cat $FILESYSTEM_ROOT/etc/debian_version)" export kernel_version="${kversion}" export asic_type="${sonic_asic_platform}" +export asic_subtype="${TARGET_MACHINE}" export commit_id="$(git rev-parse --short HEAD)" export branch="$(git rev-parse --abbrev-ref HEAD)" export release="$(if [ -f $FILESYSTEM_ROOT/etc/sonic/sonic_release ]; then cat $FILESYSTEM_ROOT/etc/sonic/sonic_release; fi)" diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index aaa047a42036..7585e4896cf4 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -5,6 +5,7 @@ SWSS_VARS_FILE=/usr/share/sonic/templates/swss_vars.j2 # Retrieve SWSS vars from sonic-cfggen SWSS_VARS=$(sonic-cfggen -d -y /etc/sonic/sonic_version.yml -t $SWSS_VARS_FILE) || exit 1 export platform=$(echo $SWSS_VARS | jq -r '.asic_type') +export sub_platform=$(echo $SWSS_VARS | jq -r '.asic_subtype') MAC_ADDRESS=$(echo $SWSS_VARS | jq -r '.mac') if [ "$MAC_ADDRESS" == "None" ] || [ -z "$MAC_ADDRESS" ]; then diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 index 34486061ea8a..6e3f3acac95a 100644 --- a/files/build_templates/sonic_version.yml.j2 +++ b/files/build_templates/sonic_version.yml.j2 @@ -7,6 +7,9 @@ debian_version: '{{ debian_version }}' kernel_version: '{{ kernel_version }}' {% endif -%} asic_type: {{ asic_type }} +{% if asic_subtype is defined and asic_subtype != '' -%} +asic_subtype: '{{ asic_subtype }}' +{% endif -%} commit_id: '{{ commit_id }}' branch: '{{ branch }}' {% if release is defined and release != '' -%} diff --git a/files/build_templates/swss_vars.j2 b/files/build_templates/swss_vars.j2 index df5e4d038f51..1cd95d16a6d6 100644 --- a/files/build_templates/swss_vars.j2 +++ b/files/build_templates/swss_vars.j2 @@ -1,5 +1,8 @@ { "asic_type": "{{ asic_type }}", + {% if asic_subtype is defined and asic_subtype != '' -%} + "asic_subtype": "{{ asic_subtype }}", + {% endif -%} "asic_id": "{{ DEVICE_METADATA.localhost.asic_id }}", "mac": "{{ DEVICE_METADATA.localhost.mac }}", "resource_type": "{{ DEVICE_METADATA.localhost.resource_type }}", From beead0a6cf8a27e62ea65489096333f198502e2e Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:34:46 +0800 Subject: [PATCH 131/817] [Build]: Fix host image debian package version issue (#10358) Why I did it Fix host image debian package version issue. The package dependencies may have issue, when some of debian packages of the base image are upgraded. For example, libc is installed in base image, but if the mirror has new version, when running "apt-get upgrade", the package will be upgraded unexpected. To avoid such issue, need to add the versions when building the host image. How I did it The package versions of host-image should contain host-base-image. --- scripts/prepare_slave_container_buildinfo.sh | 4 ++++ scripts/versions_manager.py | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_slave_container_buildinfo.sh b/scripts/prepare_slave_container_buildinfo.sh index be6fe078bdfb..5d306a0e1c20 100755 --- a/scripts/prepare_slave_container_buildinfo.sh +++ b/scripts/prepare_slave_container_buildinfo.sh @@ -10,6 +10,10 @@ sudo dpkg -i --force-overwrite $SLAVE_DIR/buildinfo/sonic-build-hooks_*.deb > /d # Enable the build hooks symlink_build_hooks +# Enable reproducible mirrors +set_reproducible_mirrors +apt-get update > /dev/null 2>&1 + # Build the slave running config cp -rf $SLAVE_DIR/buildinfo/* /usr/local/share/buildinfo/ . /usr/local/share/buildinfo/scripts/buildinfo_base.sh diff --git a/scripts/versions_manager.py b/scripts/versions_manager.py index c986e29a4e17..a20684e97bb4 100755 --- a/scripts/versions_manager.py +++ b/scripts/versions_manager.py @@ -174,11 +174,20 @@ def overwrite(self, module, for_all_dist=False, for_all_arch=False): self.components.append(tmp_component) self.adjust() - def get_config_module(self, default_module, dist, arch): + def get_config_module(self, source_path, dist, arch): if self.is_individule_version(): return self + default_module_path = VersionModule.get_module_path_by_name(source_path, DEFAULT_MODULE) + default_module = VersionModule() + default_module.load(default_module_path, filter_dist=dist, filter_arch=arch) module = default_module - if not self.is_aggregatable_module(self.name): + if self.name == 'host-image': + base_module_path = VersionModule.get_module_path_by_name(source_path, 'host-base-image') + base_module = VersionModule() + base_module.load(base_module_path, filter_dist=dist, filter_arch=arch) + module = default_module.clone(exclude_ctypes=DEFAULT_OVERWRITE_COMPONENTS) + module.overwrite(base_module, True, True) + elif not self.is_aggregatable_module(self.name): module = default_module.clone(exclude_ctypes=DEFAULT_OVERWRITE_COMPONENTS) return self._get_config_module(module, dist, arch) @@ -661,10 +670,7 @@ def generate(self): os.makedirs(args.target_path) module = VersionModule() module.load(module_path, filter_dist=args.distribution, filter_arch=args.architecture) - default_module_path = VersionModule.get_module_path_by_name(args.source_path, DEFAULT_MODULE) - default_module = VersionModule() - default_module.load(default_module_path, filter_dist=args.distribution, filter_arch=args.architecture) - config = module.get_config_module(default_module, args.distribution, args.architecture) + config = module.get_config_module(args.source_path, args.distribution, args.architecture) config.clean_info(force=True) config.dump(args.target_path, config=True, priority=args.priority) From f054d07df5e0b8990dac7e2bd789e84c9d0ee5d4 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Tue, 29 Mar 2022 16:34:24 +0300 Subject: [PATCH 132/817] [sonic-swss]: Advance submodule (#10332) Update sonic-swss submodule to include below commits: d80094b [aclorch] Do not fail ACL rule remove flow if rule already deleted (#2183) bea0b70 [gcov]: Change coverage.xml file references (#2120) 829b219 [tunnelmgrd]: Warm boot support (#2166) ad65b0a Fix issue: sometimes PFC WD unable to create zero buffer pool (#2164) 608acc3 [doc] Moving Configuration.md from swss to yang sub-folder (#2177) 0294376 [orchagent] NVGRE Tunnel orchestration agent implementation (#1953) ce88696 [ci] Update default sonic image downloading build ID. (#2175) Co-authored-by: liora --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 00266891a9f4..d80094b248e7 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 00266891a9f41e5bd37100b05237e865cde429b2 +Subproject commit d80094b248e7df5ac9df309d785ddf21e0ab92d7 From 7debcffe6249a97996222114c2963b47f4fe4326 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Wed, 30 Mar 2022 04:35:42 +0800 Subject: [PATCH 133/817] [Accton/PDDF] Enable thermalctld in pmon (#9982) When do "skip_thermalcltd: true" will let "show platform fan" and "show platform temp" fail. When enable thermalctld, these cmd will work well. Signed-off-by: Jostar Yang --- .../x86_64-accton_as5835_54t-r0/pmon_daemon_control.json | 2 +- .../x86_64-accton_as7712_32x-r0/pmon_daemon_control.json | 2 +- .../x86_64-accton_as7726_32x-r0/pmon_daemon_control.json | 3 +-- .../x86_64-accton_as9716_32d-r0/pmon_daemon_control.json | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json index 584a14b9d942..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json @@ -1,5 +1,5 @@ { "skip_ledd": true, - "skip_thermalctld": true + "skip_pcied": true } diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json index 59bdebeb4b52..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json @@ -1,5 +1,5 @@ { "skip_ledd": true, - "skip_thermalctld": true, "skip_pcied": true } + diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json index 0d3f1fb4561d..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json @@ -1,6 +1,5 @@ { "skip_ledd": true, - "skip_pcied": true, - "skip_thermalctld": true + "skip_pcied": true } diff --git a/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json index 584a14b9d942..a3b204e20d8d 100644 --- a/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json +++ b/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json @@ -1,5 +1,5 @@ { "skip_ledd": true, - "skip_thermalctld": true + "skip_pcied": true } From ab3053b3df8d072fa62de5babbd910675eea6928 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Wed, 30 Mar 2022 04:36:58 +0800 Subject: [PATCH 134/817] [Accton/PDDF] Support show cmd for psu-temp and fan (#10215) Why I did it Support for show platform temp/fan for psu-temp and fan. Original code doesn't has fan_drawer to support these information. How I did it Support for show platform temp/fan for psu-temp and fan. Add fan_drawer.py and update thermal.py to add needed code. It need PDDF common code to support . (Refer to #10213) How to verify it Test show platform temp and show platform fan. root@as7726-32x-2:~# show platform fan Drawer LED FAN Speed Direction Presence Status Timestamp Fantray1 green Fantray1_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray1 green Fantray1_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray2 green Fantray2_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray2 green Fantray2_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray3 green Fantray3_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray3 green Fantray3_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray4 green Fantray4_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray4 green Fantray4_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray5 green Fantray5_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray5 green Fantray5_2 38% EXHAUST Present OK 20220311 08:13:04 Fantray6 green Fantray6_1 38% EXHAUST Present OK 20220311 08:13:04 Fantray6 green Fantray6_2 38% EXHAUST Present OK 20220311 08:13:04 N/A green PSU1_FAN1 23% EXHAUST Present OK 20220311 08:13:04 N/A green PSU2_FAN1 22% EXHAUST Present OK 20220311 08:13:04 root@as7726-32x-2:~# show platform temp Sensor Temperature High TH Low TH Crit High TH Crit Low TH Warning Timestamp PSU1_TEMP1 28 N/A N/A N/A N/A False 20220311 08:13:04 PSU2_TEMP1 25 N/A N/A N/A N/A False 20220311 08:13:04 TEMP1 23.5 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP2 27 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP3 24 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP4 27 80.0 N/A N/A N/A False 20220311 08:13:04 TEMP5 24 80.0 N/A N/A N/A False 20220311 08:13:04 Co-authored-by: Jostar Yang --- .../as4630-54pe/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as4630-54pe/sonic_platform/thermal.py | 4 ++-- .../as7326-56x/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as7326-56x/sonic_platform/thermal.py | 4 ++-- .../as7712-32x/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as7712-32x/sonic_platform/thermal.py | 4 ++-- .../as7726-32x/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as7726-32x/sonic_platform/thermal.py | 4 ++-- .../as7816-64x/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as7816-64x/sonic_platform/thermal.py | 4 ++-- .../as9716-32d/sonic_platform/fan_drawer.py | 17 +++++++++++++++++ .../as9716-32d/sonic_platform/thermal.py | 4 ++-- 12 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/fan_drawer.py diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..3b9bb607f632 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/fan_drawer.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/thermal.py index 5b829fc26caa..77d6ec7ae886 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/sonic_platform/thermal.py @@ -11,7 +11,7 @@ class Thermal(PddfThermal): """PDDF Platform-Specific Thermal class""" - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data) + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) # Provide the functions/variables below for which implementation is to be overwritten From 1ddcfd0c3c516a28a63faac922a9df25061641b8 Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:41:31 -0700 Subject: [PATCH 135/817] Update Broadcom SAI version to 6.1 (#10344) --- platform/broadcom/sai-modules.mk | 4 ++-- platform/broadcom/sai.mk | 4 ++-- platform/broadcom/saibcm-modules-dnx | 2 +- platform/broadcom/saibcm-modules/debian/changelog | 6 ++++++ platform/broadcom/saibcm-modules/make/Make.config | 5 +++++ .../saibcm-modules/systems/linux/user/common/Makefile | 4 ++++ 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/platform/broadcom/sai-modules.mk b/platform/broadcom/sai-modules.mk index b4f28f125687..1236e06d6240 100644 --- a/platform/broadcom/sai-modules.mk +++ b/platform/broadcom/sai-modules.mk @@ -1,6 +1,6 @@ # Broadcom SAI modules -BRCM_OPENNSL_KERNEL_VERSION = 6.0.0.13 +BRCM_OPENNSL_KERNEL_VERSION = 6.1.0.3 BRCM_OPENNSL_KERNEL = opennsl-modules_$(BRCM_OPENNSL_KERNEL_VERSION)_amd64.deb $(BRCM_OPENNSL_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/saibcm-modules @@ -10,7 +10,7 @@ $(BRCM_OPENNSL_KERNEL)_MACHINE = broadcom SONIC_DPKG_DEBS += $(BRCM_OPENNSL_KERNEL) # SAI bcm modules for DNX family ASIC -BRCM_DNX_OPENNSL_KERNEL_VERSION = 6.0.0.13 +BRCM_DNX_OPENNSL_KERNEL_VERSION = 6.1.0.3 BRCM_DNX_OPENNSL_KERNEL = opennsl-modules-dnx_$(BRCM_DNX_OPENNSL_KERNEL_VERSION)_amd64.deb $(BRCM_DNX_OPENNSL_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/saibcm-modules-dnx diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index e23515a1f5ea..1ec8d915e5bd 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ -LIBSAIBCM_VERSION = 6.0.0.13-3 -LIBSAIBCM_BRANCH_NAME = REL_6.0 +LIBSAIBCM_VERSION = 6.1.0.3 +LIBSAIBCM_BRANCH_NAME = REL_6.1 LIBSAIBCM_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_VERSION)" BRCM_SAI = libsaibcm_$(LIBSAIBCM_VERSION)_amd64.deb diff --git a/platform/broadcom/saibcm-modules-dnx b/platform/broadcom/saibcm-modules-dnx index 3fc83d5e5f9d..6bf58f8310bc 160000 --- a/platform/broadcom/saibcm-modules-dnx +++ b/platform/broadcom/saibcm-modules-dnx @@ -1 +1 @@ -Subproject commit 3fc83d5e5f9d1abad3ddf7fa6767b8cdd6121232 +Subproject commit 6bf58f8310bcb29168ae5b2dabed84fc942429fc diff --git a/platform/broadcom/saibcm-modules/debian/changelog b/platform/broadcom/saibcm-modules/debian/changelog index e9e36aaaf302..0ff357c57279 100644 --- a/platform/broadcom/saibcm-modules/debian/changelog +++ b/platform/broadcom/saibcm-modules/debian/changelog @@ -1,3 +1,9 @@ +opennsl (6.1.0.3) unstable; urgency=medium + + * Update to Broadcom SAI 6.1.0.3 + + -- Tejaswini Chadaga Fri, 24 MAR 2022 12:30:00 +0000 + opennsl (6.0.0.13) unstable; urgency=medium * Update to Broadcom SAI 6.0.0.13 diff --git a/platform/broadcom/saibcm-modules/make/Make.config b/platform/broadcom/saibcm-modules/make/Make.config index b6f42bf65c48..01869634e295 100644 --- a/platform/broadcom/saibcm-modules/make/Make.config +++ b/platform/broadcom/saibcm-modules/make/Make.config @@ -120,7 +120,12 @@ ifndef SDKBUILD SDKBUILD :=build endif +ifdef SDK_OUTDIR +BLDROOT = ${SDK_OUTDIR}/${SDKBUILD}/$(if ${BLDCONFIG},${BLDCONFIG}/)${target}${all_suffix}${bldroot_suffix} +export DEST_DIR := ${SDK_OUTDIR}/${SDKBUILD}$(if ${BLDCONFIG},/${BLDCONFIG})$(DEST_DIR_SUFFIX) +else BLDROOT = ${SDK}/${SDKBUILD}/$(if ${BLDCONFIG},${BLDCONFIG}/)${target}${all_suffix}${bldroot_suffix} +endif endif # ifeq "$(HOSTTYPE)" "Windows2000PC" diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile index 3dc6425e6ee0..7a342f6ef60e 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile +++ b/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile @@ -69,8 +69,12 @@ kernel-override=linux-$(platform) ifdef BLDCONFIG KERN_BLDROOT=${SDK}/${SDKBUILD}/${BLDCONFIG}/$(kernel-override)$(bldroot_suffix) else +ifdef SDK_OUTDIR +KERN_BLDROOT=${SDK_OUTDIR}/${SDKBUILD}/$(kernel-override)$(bldroot_suffix) +else KERN_BLDROOT=${SDK}/${SDKBUILD}/$(kernel-override)$(bldroot_suffix) endif +endif ifeq (,$(kernel_version)) kernel_version=2_4 From ced22db1e3870d363c3c330f111606ad6ff3f7ae Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 30 Mar 2022 14:43:51 +0800 Subject: [PATCH 136/817] [Build]: fix ENABLE_DOCKER_BASE_PULL not working issue in armhf/arm64 (#10330) Why I did it Fix ENABLE_DOCKER_BASE_PULL not working issue in armhf/arm64 For build in native armhf/arm64, the expected container registry repo name is sonic-slave- How I did it Publish the slave image to sonic-slave-. --- .azure-pipelines/docker-sonic-slave-arm64.yml | 1 + .azure-pipelines/docker-sonic-slave-armhf.yml | 1 + .azure-pipelines/docker-sonic-slave-template.yml | 15 +++++++++++++++ .azure-pipelines/docker-sonic-slave.yml | 1 + 4 files changed, 18 insertions(+) diff --git a/.azure-pipelines/docker-sonic-slave-arm64.yml b/.azure-pipelines/docker-sonic-slave-arm64.yml index 94c6143eed55..6bb9203b49ae 100644 --- a/.azure-pipelines/docker-sonic-slave-arm64.yml +++ b/.azure-pipelines/docker-sonic-slave-arm64.yml @@ -23,6 +23,7 @@ pr: - sonic-slave-stretch - sonic-slave-buster - sonic-slave-bullseye + - .azure-pipelines parameters: - name: 'dists' diff --git a/.azure-pipelines/docker-sonic-slave-armhf.yml b/.azure-pipelines/docker-sonic-slave-armhf.yml index ab0cefebf61f..250bf7400a69 100644 --- a/.azure-pipelines/docker-sonic-slave-armhf.yml +++ b/.azure-pipelines/docker-sonic-slave-armhf.yml @@ -23,6 +23,7 @@ pr: - sonic-slave-stretch - sonic-slave-buster - sonic-slave-bullseye + - .azure-pipelines parameters: - name: 'dists' diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 212b449abb18..7ba3592044c4 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -81,6 +81,10 @@ jobs: docker tag $SLAVE_BASE_IMAGE:$SLAVE_BASE_TAG $REGISTRY_SERVER/$SLAVE_BASE_IMAGE_UPLOAD:latest docker tag $SLAVE_BASE_IMAGE:$SLAVE_BASE_TAG $REGISTRY_SERVER/$SLAVE_BASE_IMAGE_UPLOAD:$SLAVE_BASE_TAG + if [ "$SLAVE_BASE_IMAGE_UPLOAD" != "$SLAVE_DIR" ]; then + docker tag $SLAVE_BASE_IMAGE:$SLAVE_BASE_TAG $REGISTRY_SERVER/$SLAVE_DIR:latest-${{ parameters.arch }} + docker tag $SLAVE_BASE_IMAGE:$SLAVE_BASE_TAG $REGISTRY_SERVER/$SLAVE_DIR:$SLAVE_BASE_TAG + fi set +x echo "##vso[task.setvariable variable=VARIABLE_SLAVE_BASE_IMAGE]$SLAVE_BASE_IMAGE_UPLOAD" echo "##vso[task.setvariable variable=VARIABLE_SLAVE_BASE_TAG]$SLAVE_BASE_TAG" @@ -89,6 +93,7 @@ jobs: displayName: Build sonic-slave-${{ parameters.dist }}-${{ parameters.arch }} - task: Docker@2 + condition: ne(variables['Build.Reason'], 'PullRequest') displayName: Upload image inputs: containerRegistry: ${{ parameters.registry_conn }} @@ -97,3 +102,13 @@ jobs: tags: | $(VARIABLE_SLAVE_BASE_TAG) latest + - ${{ if ne(parameters.arch, 'amd64') }}: + - task: Docker@2 + condition: ne(variables['Build.Reason'], 'PullRequest') + displayName: Upload image ${{ parameters.dist }} + inputs: + containerRegistry: ${{ parameters.registry_conn }} + repository: "sonic-slave-${{ parameters.dist }}" + command: push + tags: | + $(VARIABLE_SLAVE_BASE_TAG) diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index a0b156bfde19..bf5fce77a722 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -24,6 +24,7 @@ pr: - sonic-slave-buster - sonic-slave-bullseye - src/sonic-build-hooks + - .azure-pipelines parameters: - name: 'arches' From 761ae244271d01f60bb6a4462888590066f78338 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Wed, 30 Mar 2022 14:43:13 +0300 Subject: [PATCH 137/817] [submodule] Advance sonic-utilities submodule pointer (#10333) Update sonic-utilities submodule to include below commits: 510a9b9 Add date to show version (#2086) 61b1396 [sfpshow][recycle_port] sfpshow script needs to skip recycle ports (#2109) 4681697 Support command `show ip fib` and `show ipv6 fib` (#2100) 2a982a1 Update `config mirror_session` CLI to support heximal gre type value (#2095) b25f1e1 [generic-config-updater] Add caclrule validator (#2103) 968900c [sonic-package-manager] do not mod_config for whole config db when setting init_cfg (#2055) bf55ceb [nvgre] Added auto-generated CLI plugins and test for NVGRE Tunnel feature (#1915) 8389c81 [sonic-cli-gen] fix failure "Error: digits_class" when field "digit_class" does not exist in DB (#2054) f71ef64 Fix import statement in mclag.py (#2073) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index a2e68a05a8e6..8389c8137d4f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a2e68a05a8e6ab296978a59bf107971beb899546 +Subproject commit 8389c8137d4fdc5a2d1c803c9c06e6dcb4f849c1 From 1e2e493daa642bff3472953669d0d08ffb3190a4 Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Wed, 30 Mar 2022 20:41:31 +0300 Subject: [PATCH 138/817] [Mellanox] Credo Y-cable read_eeprom/write_eeprom API implementation (#10320) - Why I did it Implement read_eeprom/write_eeprom API for Credo Y-cable for Dual ToR Active-Standby - How I did it Use mlxreg utility for API implementation Signed-off-by: Andriy Yurkiv --- .../mlnx-platform-api/sonic_platform/sfp.py | 164 +++++++++++++++++- .../tests/input_platform/__init__.py | 0 .../tests/input_platform/output_sfp.py | 55 ++++++ .../mlnx-platform-api/tests/test_sfp.py | 29 ++++ 4 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py create mode 100644 platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 29d1c7c081f6..7ebe9d5e5e57 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -121,6 +121,13 @@ # parameters for SFP presence SFP_STATUS_INSERTED = '1' +# SFP constants +SFP_PAGE_SIZE = 256 +SFP_UPPER_PAGE_OFFSET = 128 +SFP_VENDOR_PAGE_START = 640 + +BYTES_IN_DWORD = 4 + # Global logger class instance logger = Logger() @@ -146,6 +153,72 @@ def deinitialize_sdk_handle(sdk_handle): logger.log_warning("Sdk handle is none") return False +class MlxregManager: + def __init__(self, mst_pci_device, slot_id, sdk_index): + self.mst_pci_device = mst_pci_device + self.slot_id = slot_id + self.sdk_index = sdk_index + + def construct_dword(self, write_buffer): + if len(write_buffer) == 0: + return None + + used_bytes_in_dword = len(write_buffer) % BYTES_IN_DWORD + + res = "dword[0]=0x" + for idx, x in enumerate(write_buffer): + word = hex(x)[2:] + + if (idx > 0) and (idx % BYTES_IN_DWORD) == 0: + res += ",dword[{}]=0x".format(str((idx + 1)//BYTES_IN_DWORD)) + res += word.zfill(2) + + if used_bytes_in_dword > 0: + res += (BYTES_IN_DWORD - used_bytes_in_dword) * "00" + return res + + def write_mlxreg_eeprom(self, num_bytes, dword, device_address, page): + if not dword: + return False + + try: + cmd = "mlxreg -d /dev/mst/{} --reg_name MCIA --indexes \ + slot_index={},module={},device_address={},page_number={},i2c_device_address=0x50,size={},bank_number=0 \ + --set {} -y".format(self.mst_pci_device, self.slot_id, self.sdk_index, device_address, page, num_bytes, dword) + subprocess.check_call(cmd, shell=True, universal_newlines=True, stdout=subprocess.DEVNULL) + except subprocess.CalledProcessError as e: + logger.log_error("Error! Unable to write data for {} port, page {} offset {}, rc = {}, err msg: {}".format(self.sdk_index, page, device_address, e.returncode, e.output)) + return False + return True + + def read_mlxred_eeprom(self, offset, page, num_bytes): + try: + cmd = "mlxreg -d /dev/mst/{} --reg_name MCIA --indexes \ + slot_index={},module={},device_address={},page_number={},i2c_device_address=0x50,size={},bank_number=0 \ + --get".format(self.mst_pci_device, self.slot_id, self.sdk_index, offset, page, num_bytes) + result = subprocess.check_output(cmd, universal_newlines=True, shell=True) + except subprocess.CalledProcessError as e: + logger.log_error("Error! Unable to write data for {} port, page {} offset {}, rc = {}, err msg: {}".format(self.sdk_index, page, device_address, e.returncode, e.output)) + return None + return result + + def parse_mlxreg_read_output(self, read_output, num_bytes): + res = "" + dword_num = num_bytes // BYTES_IN_DWORD + used_bytes_in_dword = num_bytes % BYTES_IN_DWORD + arr = [value for value in read_output.split('\n') if value[0:5] == "dword"] + for i in range(dword_num): + dword = arr[i].split()[2] + res += dword[2:] + + if used_bytes_in_dword > 0: + # Cut needed info and insert into final hex string + # Example: 3 bytes : 0x12345600 + # ^ ^ + dword = arr[dword_num].split()[2] + res += dword[2 : 2 + used_bytes_in_dword * 2] + + return bytearray.fromhex(res) if res else None class SdkHandleContext(object): def __init__(self): @@ -194,6 +267,16 @@ def __init__(self, sfp_index, slot_id=0, linecard_port_count=0, lc_name=None): self._thermal_list = initialize_linecard_sfp_thermal(lc_name, slot_id, sfp_index) self.slot_id = slot_id + self.mst_pci_device = self.get_mst_pci_device() + + # get MST PCI device name + def get_mst_pci_device(self): + device_name = None + try: + device_name = subprocess.check_output("ls /dev/mst/ | grep pciconf", universal_newlines=True, shell=True).strip() + except subprocess.CalledProcessError as e: + logger.log_error("Failed to find mst PCI device rc={} err.msg={}".format(e.returncode, e.output)) + return device_name @property def sdk_handle(self): @@ -222,7 +305,11 @@ def get_presence(self): return eeprom_raw is not None # Read out any bytes from any offset - def read_eeprom(self, offset, num_bytes): + def _read_eeprom_specific_bytes(self, offset, num_bytes): + if offset + num_bytes > SFP_VENDOR_PAGE_START: + logger.log_error("Error mismatch between page size and bytes to read (offset: {} num_bytes: {}) ".format(offset, num_bytes)) + return None + eeprom_raw = [] ethtool_cmd = "ethtool -m sfp{} hex on offset {} length {}".format(self.index, offset, num_bytes) try: @@ -241,6 +328,81 @@ def read_eeprom(self, offset, num_bytes): eeprom_raw = list(map(lambda h: int(h, base=16), eeprom_raw)) return bytearray(eeprom_raw) + # read eeprom specfic bytes beginning from offset with size as num_bytes + def read_eeprom(self, offset, num_bytes): + """ + Read eeprom specfic bytes beginning from a random offset with size as num_bytes + Returns: + bytearray, if raw sequence of bytes are read correctly from the offset of size num_bytes + None, if the read_eeprom fails + Example: + mlxreg -d /dev/mst/mt52100_pciconf0 --reg_name MCIA --indexes slot_index=0,module=1,device_address=148,page_number=0,i2c_device_address=0x50,size=16,bank_number=0 -g + Sending access register... + Field Name | Data + =================================== + status | 0x00000000 + slot_index | 0x00000000 + module | 0x00000001 + l | 0x00000000 + device_address | 0x00000094 + page_number | 0x00000000 + i2c_device_address | 0x00000050 + size | 0x00000010 + bank_number | 0x00000000 + dword[0] | 0x43726564 + dword[1] | 0x6f202020 + dword[2] | 0x20202020 + dword[3] | 0x20202020 + dword[4] | 0x00000000 + dword[5] | 0x00000000 + .... + 16 bytes to read from dword -> 0x437265646f2020202020202020202020 -> Credo + """ + # recalculate offset and page. Use 'ethtool' if there is no need to read vendor pages + if offset < SFP_VENDOR_PAGE_START: + return self._read_eeprom_specific_bytes(offset, num_bytes) + else: + page = (offset - SFP_PAGE_SIZE) // SFP_UPPER_PAGE_OFFSET + 1 + # calculate offset per page + device_address = (offset - SFP_PAGE_SIZE) % SFP_UPPER_PAGE_OFFSET + SFP_UPPER_PAGE_OFFSET + + if not self.mst_pci_device: + return None + + mlxreg_mngr = MlxregManager(self.mst_pci_device, self.slot_id, self.sdk_index) + read_output = mlxreg_mngr.read_mlxred_eeprom(device_address, page, num_bytes) + return mlxreg_mngr.parse_mlxreg_read_output(read_output, num_bytes) + + # write eeprom specfic bytes beginning from offset with size as num_bytes + def write_eeprom(self, offset, num_bytes, write_buffer): + """ + write eeprom specfic bytes beginning from a random offset with size as num_bytes + and write_buffer as the required bytes + Returns: + Boolean, true if the write succeeded and false if it did not succeed. + Example: + mlxreg -d /dev/mst/mt52100_pciconf0 --reg_name MCIA --indexes slot_index=0,module=1,device_address=154,page_number=5,i2c_device_address=0x50,size=1,bank_number=0 --set dword[0]=0x01000000 -y + """ + if num_bytes != len(write_buffer): + logger.log_error("Error mismatch between buffer length and number of bytes to be written") + return False + + # recalculate offset and page + if offset < SFP_PAGE_SIZE: + page = 0 + device_address = offset + else: + page = (offset - SFP_PAGE_SIZE) // SFP_UPPER_PAGE_OFFSET + 1 + # calculate offset per page + device_address = (offset - SFP_PAGE_SIZE) % SFP_UPPER_PAGE_OFFSET + SFP_UPPER_PAGE_OFFSET + + if not self.mst_pci_device: + return False + + mlxreg_mngr = MlxregManager(self.mst_pci_device, self.slot_id, self.sdk_index) + dword = mlxreg_mngr.construct_dword(write_buffer) + return mlxreg_mngr.write_mlxreg_eeprom(num_bytes, dword, device_address, page) + @classmethod def mgmt_phy_mod_pwr_attr_get(cls, power_attr_type, sdk_handle, sdk_index, slot_id): sx_mgmt_phy_mod_pwr_attr_p = new_sx_mgmt_phy_mod_pwr_attr_t_p() diff --git a/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py b/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py b/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py new file mode 100644 index 000000000000..20a09d1b54f6 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py @@ -0,0 +1,55 @@ +""" +module holding the correct values for the sfp_test.py +""" + +read_eeprom_output = """ +Sending access register... +Field Name | Data +=================================== +status | 0x00000000 +slot_index | 0x00000000 +module | 0x00000001 +l | 0x00000000 +device_address | 0x000000a8 +page_number | 0x00000000 +i2c_device_address | 0x00000050 +size | 0x00000010 +bank_number | 0x00000000 +dword[0] | 0x43414331 +dword[1] | 0x31353332 +dword[2] | 0x31503250 +dword[3] | 0x41324d53 +dword[4] | 0x00000000 +dword[5] | 0x00000000 +dword[6] | 0x00000000 +dword[7] | 0x00000000 +dword[8] | 0x00000000 +dword[9] | 0x00000000 +dword[10] | 0x00000000 +dword[11] | 0x00000000 +dword[12] | 0x00000000 +dword[13] | 0x00000000 +dword[14] | 0x00000000 +dword[15] | 0x00000000 +dword[16] | 0x00000000 +dword[17] | 0x00000000 +dword[18] | 0x00000000 +dword[19] | 0x00000000 +dword[20] | 0x00000000 +dword[21] | 0x00000000 +dword[22] | 0x00000000 +dword[23] | 0x00000000 +dword[24] | 0x00000000 +dword[25] | 0x00000000 +dword[26] | 0x00000000 +dword[27] | 0x00000000 +dword[28] | 0x00000000 +dword[29] | 0x00000000 +dword[30] | 0x00000000 +dword[31] | 0x00000000 +=================================== +""" + +y_cable_part_number = "CAC115321P2PA2MS" +write_eeprom_dword1 = "dword[0]=0x01020304" +write_eeprom_dword2 = "dword[0]=0x01020304,dword[1]=0x05060000" diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index 261a03b527aa..dcb3953ded88 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -27,6 +27,9 @@ from sonic_platform.sfp import SFP, SX_PORT_MODULE_STATUS_INITIALIZING, SX_PORT_MODULE_STATUS_PLUGGED, SX_PORT_MODULE_STATUS_UNPLUGGED, SX_PORT_MODULE_STATUS_PLUGGED_WITH_ERROR, SX_PORT_MODULE_STATUS_PLUGGED_DISABLED from sonic_platform.chassis import Chassis +from sonic_platform.sfp import MlxregManager +from tests.input_platform import output_sfp + class TestSfp: @mock.patch('sonic_platform.device_data.DeviceDataManager.get_linecard_count', mock.MagicMock(return_value=8)) @@ -80,3 +83,29 @@ def test_sfp_get_error_status(self, mock_get_error_code): description = sfp.get_error_description() assert description == expected_description + + @mock.patch('sonic_platform.sfp.SFP.get_mst_pci_device', mock.MagicMock(return_value="pciconf")) + @mock.patch('sonic_platform.sfp.MlxregManager.write_mlxreg_eeprom', mock.MagicMock(return_value=True)) + def test_sfp_write_eeprom(self): + mlxreg_mngr = MlxregManager("", 0, 0) + write_buffer = bytearray([1,2,3,4]) + offset = 793 + + sfp = SFP(0) + sfp.write_eeprom(offset, 4, write_buffer) + MlxregManager.write_mlxreg_eeprom.assert_called_with(4, output_sfp.write_eeprom_dword1, 153, 5) + + offset = 641 + write_buffer = bytearray([1,2,3,4,5,6]) + sfp.write_eeprom(offset, 6, write_buffer) + MlxregManager.write_mlxreg_eeprom.assert_called_with(6, output_sfp.write_eeprom_dword2, 129, 4) + + @mock.patch('sonic_platform.sfp.SFP.get_mst_pci_device', mock.MagicMock(return_value="pciconf")) + @mock.patch('sonic_platform.sfp.MlxregManager.read_mlxred_eeprom', mock.MagicMock(return_value=output_sfp.read_eeprom_output)) + def test_sfp_read_eeprom(self): + mlxreg_mngr = MlxregManager("", 0, 0) + offset = 644 + + sfp = SFP(0) + assert output_sfp.y_cable_part_number == sfp.read_eeprom(offset, 16).decode() + MlxregManager.read_mlxred_eeprom.assert_called_with(132, 4, 16) From b31df59c7c42a440a22d1b1e8d1bdda8d08e7a40 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 30 Mar 2022 14:03:29 -0700 Subject: [PATCH 139/817] [tun_pkt]: Wait for AsyncSniffer to init fully (#10346) Fix for Tunnel packet handler can crash at system startup Signed-off-by: Lawrence Lee --- .../docker-orchagent/tunnel_packet_handler.py | 86 ++++++++++--------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/dockers/docker-orchagent/tunnel_packet_handler.py b/dockers/docker-orchagent/tunnel_packet_handler.py index 3d9b48b450b6..682316eb6d49 100755 --- a/dockers/docker-orchagent/tunnel_packet_handler.py +++ b/dockers/docker-orchagent/tunnel_packet_handler.py @@ -51,6 +51,10 @@ def __init__(self): self._portchannel_intfs = None self.up_portchannels = None self.netlink_api = IPRoute() + self.sniffer = None + self.self_ip = '' + self.packet_filter = '' + self.sniff_intfs = [] @property def portchannel_intfs(self): @@ -270,6 +274,39 @@ def sniffer_restart_required(self, messages): return True return False + def start_sniffer(self): + """ + Starts an AsyncSniffer and waits for it to inititalize fully + """ + self.sniffer = AsyncSniffer( + iface=self.sniff_intfs, + filter=self.packet_filter, + prn=self.ping_inner_dst, + store=0 + ) + self.sniffer.start() + + while not hasattr(self.sniffer, 'stop_cb'): + time.sleep(0.1) + + def ping_inner_dst(self, packet): + """ + Pings the inner destination IP for an encapsulated packet + + Args: + packet: The encapsulated packet received + """ + inner_packet_type = self.get_inner_pkt_type(packet) + if inner_packet_type and packet[IP].dst == self.self_ip: + cmds = ['timeout', '0.2', 'ping', '-c1', + '-W1', '-i0', '-n', '-q'] + if inner_packet_type == IPv6: + cmds.append('-6') + dst_ip = packet[IP].payload[inner_packet_type].dst + cmds.append(dst_ip) + logger.log_info("Running command '{}'".format(' '.join(cmds))) + subprocess.run(cmds, stdout=subprocess.DEVNULL) + def listen_for_tunnel_pkts(self): """ Listens for tunnel packets that are trapped to CPU @@ -277,59 +314,28 @@ def listen_for_tunnel_pkts(self): These packets may be trapped if there is no neighbor info for the inner packet destination IP in the hardware. """ - - def _ping_inner_dst(packet): - """ - Pings the inner destination IP for an encapsulated packet - - Args: - packet: The encapsulated packet received - """ - inner_packet_type = self.get_inner_pkt_type(packet) - if inner_packet_type and packet[IP].dst == self_ip: - cmds = ['timeout', '0.2', 'ping', '-c1', - '-W1', '-i0', '-n', '-q'] - if inner_packet_type == IPv6: - cmds.append('-6') - dst_ip = packet[IP].payload[inner_packet_type].dst - cmds.append(dst_ip) - logger.log_info("Running command '{}'".format(' '.join(cmds))) - subprocess.run(cmds, stdout=subprocess.DEVNULL) - - self_ip, peer_ip = self.get_ipinip_tunnel_addrs() - if self_ip is None or peer_ip is None: + self.self_ip, peer_ip = self.get_ipinip_tunnel_addrs() + if self.self_ip is None or peer_ip is None: logger.log_notice('Could not get tunnel addresses from ' 'config DB, exiting...') return None - packet_filter = 'host {} and host {}'.format(self_ip, peer_ip) + self.packet_filter = 'host {} and host {}'.format(self.self_ip, peer_ip) logger.log_notice('Starting tunnel packet handler for {}' - .format(packet_filter)) + .format(self.packet_filter)) - sniff_intfs = self.get_up_portchannels() - logger.log_info("Listening on interfaces {}".format(sniff_intfs)) + self.sniff_intfs = self.get_up_portchannels() + logger.log_info("Listening on interfaces {}".format(self.sniff_intfs)) - sniffer = AsyncSniffer( - iface=sniff_intfs, - filter=packet_filter, - prn=_ping_inner_dst, - store=0 - ) - sniffer.start() + self.start_sniffer() while True: msgs = self.wait_for_netlink_msgs() if self.sniffer_restart_required(msgs): - sniffer.stop() + self.sniffer.stop() sniff_intfs = self.get_up_portchannels() logger.log_notice('Restarting tunnel packet handler on ' 'interfaces {}'.format(sniff_intfs)) - sniffer = AsyncSniffer( - iface=sniff_intfs, - filter=packet_filter, - prn=_ping_inner_dst, - store=0 - ) - sniffer.start() + self.start_sniffer() def run(self): """ From 16766c0ea4aff78bb8b749d31e6a2135386681f4 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Thu, 31 Mar 2022 08:24:13 +0800 Subject: [PATCH 140/817] [YANG ] Support vlan sub intf short naming format (#10160) Why I did it To support vlan sub intf short naming format, like subport Eth8.100 for parent portEthernet8 with vlan id 100. How I did it Add checks to must condition to verify there is a port or portchannel with the index same as the vlan sub intf. How to verify it Run the unttests. --- .../tests/files/sample_config_db.json | 16 +- .../tests/vlan_sub_interface.json | 18 ++ .../tests_config/vlan_sub_interface.json | 214 ++++++++++++++++++ .../yang-models/sonic-vlan-sub-interface.yang | 12 +- 4 files changed, 255 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 6415fb6100e9..d33cf20e2038 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -900,11 +900,21 @@ } }, "VLAN_SUB_INTERFACE": { - "Ethernet120.10": { + "Ethernet12.10": { "admin_status": "up" }, - "Ethernet120.10|10.0.1.56/31": {}, - "Ethernet120.10|fc00::1:71/126": {} + "Ethernet12.10|10.0.1.56/31": {}, + "Ethernet12.10|fc00::1:71/126": {}, + "Po0003.10": { + "admin_status": "up" + }, + "Po0003.10|10.0.1.58/31": {}, + "Po0003.10|fc00::1:75/126": {}, + "Eth120.10": { + "admin_status": "up" + }, + "Eth120.10|10.0.1.60/31": {}, + "Eth120.10|fc00::1:79/126": {} }, "VLAN_MEMBER": { "Vlan111|Ethernet0": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json index 789b7ddd364a..e3ffa9dc44b6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json @@ -2,10 +2,28 @@ "VLAN_SUB_INTERFACE_MUST_CONDITION_TRUE_TEST": { "desc": "Configure valid vlan sub interface must condition true." }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_TRUE_TEST": { + "desc": "Configure valid short name format vlan sub interface must condition true." + }, "VLAN_SUB_INTERFACE_MUST_CONDITION_FALSE_TEST": { "desc": "Configure vlan sub interface must condition false.", "eStrKey": "Must" }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { + "desc": "Configure short name format vlan sub interface must condition false.", + "eStrKey": "Must" + }, + "VLAN_SUB_INTERFACE_PO_SHORT_NAME_FORMAT_MUST_CONDITION_TRUE_TEST": { + "desc": "Configure valid portchannel short name format vlan sub interface must condition true." + }, + "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_FALSE_TEST": { + "desc": "Configure portchannel long name format vlan sub interface must condition false.", + "eStrKey": "Must" + }, + "VLAN_SUB_INTERFACE_PO_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { + "desc": "Configure portchannel short name format vlan sub interface must condition false.", + "eStrKey": "Must" + }, "VLAN_SUB_INTERFACE_IP_PREFIX_PORT_NON_EXISTING_LEAF_TEST": { "desc": "Configure ip prefix vlan sub interface with non-existing reference.", "eStrKey": "LeafRef" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json index f95b1af8f049..8adff73e497c 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json @@ -31,6 +31,38 @@ } } }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_TRUE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Eth8.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Eth8.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "admin_status": "up", + "alias": "Ethernet8/1", + "description": "Ethernet8", + "lanes": "45,46,47,48", + "mtu": 9000, + "speed": 100000 + } + ] + } + } + }, "VLAN_SUB_INTERFACE_MUST_CONDITION_FALSE_TEST": { "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { @@ -63,6 +95,188 @@ } } }, + "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Eth8.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Eth8.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet12", + "admin_status": "up", + "alias": "Ethernet12/1", + "description": "Ethernet12", + "lanes": "49,50,51,52", + "mtu": 9000, + "speed": 100000 + } + ] + } + } + }, + "VLAN_SUB_INTERFACE_PO_SHORT_NAME_FORMAT_MUST_CONDITION_TRUE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Po0001.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Po0001.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "tpid": "0x8100", + "speed": 25000 + } + ] + } + }, + "sonic-portchannel:sonic-portchannel": { + "sonic-portchannel:PORTCHANNEL": { + "PORTCHANNEL_LIST": [ + { + "admin_status": "up", + "members": [ + "Ethernet0" + ], + "min_links": "1", + "mtu": "9100", + "tpid": "0x8100", + "lacp_key": "auto", + "name": "PortChannel0001" + } + ] + } + } + }, + "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_FALSE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "PortChannel0001.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "PortChannel0001.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "tpid": "0x8100", + "speed": 25000 + } + ] + } + }, + "sonic-portchannel:sonic-portchannel": { + "sonic-portchannel:PORTCHANNEL": { + "PORTCHANNEL_LIST": [ + { + "admin_status": "up", + "members": [ + "Ethernet0" + ], + "min_links": "1", + "mtu": "9100", + "tpid": "0x8100", + "lacp_key": "auto", + "name": "PortChannel0001" + } + ] + } + } + }, + "VLAN_SUB_INTERFACE_PO_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Po0002.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Po0002.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "tpid": "0x8100", + "speed": 25000 + } + ] + } + }, + "sonic-portchannel:sonic-portchannel": { + "sonic-portchannel:PORTCHANNEL": { + "PORTCHANNEL_LIST": [ + { + "admin_status": "up", + "members": [ + "Ethernet0" + ], + "min_links": "1", + "mtu": "9100", + "tpid": "0x8100", + "lacp_key": "auto", + "name": "PortChannel0001" + } + ] + } + } + }, "VLAN_SUB_INTERFACE_IP_PREFIX_PORT_NON_EXISTING_LEAF_TEST": { "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { diff --git a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang index 6ce391033ab0..953aa7e14c80 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang @@ -14,6 +14,10 @@ module sonic-vlan-sub-interface { prefix port; } + import sonic-portchannel { + prefix lag; + } + import sonic-vrf { prefix vrf; } @@ -36,9 +40,13 @@ module sonic-vlan-sub-interface { key "name"; leaf name { - must "substring-before(current(), '.') = /port:sonic-port/port:PORT/port:PORT_LIST/port:name" + must "(substring-before(current(), '.') = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + + "(starts-with(substring-before(current(), '.'), 'Eth') and " + + "concat('Ethernet', substring-after(substring-before(current(), '.'), 'Eth')) = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + + "(starts-with(substring-before(current(), '.'), 'Po') and " + + "concat('PortChannel', substring-after(substring-before(current(), '.'), 'Po')) = /lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name)" { - error-message "Must condition not satisfied, Try adding PORT: {}, Example: 'Ethernet0': {}"; + error-message "Must condition not satisfied, please follow vlan sub interface naming convention"; } // check if the vlan sub interface have the form as . From 47f4a9d90557e91a98a45976d52966932d6ac14e Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:37:53 +0800 Subject: [PATCH 141/817] [build][Bug]: Fix the command set_reproducible_mirrors not found issue (#10398) Why I did it Fix the command set_reproducible_mirrors not found issue during the build. --- scripts/prepare_slave_container_buildinfo.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_slave_container_buildinfo.sh b/scripts/prepare_slave_container_buildinfo.sh index 5d306a0e1c20..1fb2f006640b 100755 --- a/scripts/prepare_slave_container_buildinfo.sh +++ b/scripts/prepare_slave_container_buildinfo.sh @@ -10,14 +10,14 @@ sudo dpkg -i --force-overwrite $SLAVE_DIR/buildinfo/sonic-build-hooks_*.deb > /d # Enable the build hooks symlink_build_hooks -# Enable reproducible mirrors -set_reproducible_mirrors -apt-get update > /dev/null 2>&1 - # Build the slave running config cp -rf $SLAVE_DIR/buildinfo/* /usr/local/share/buildinfo/ . /usr/local/share/buildinfo/scripts/buildinfo_base.sh +# Enable reproducible mirrors +set_reproducible_mirrors +apt-get update > /dev/null 2>&1 + # Build the slave version config [ -d /usr/local/share/buildinfo/versions ] && rm -rf /usr/local/share/buildinfo/versions scripts/versions_manager.py generate -t "/usr/local/share/buildinfo/versions" -n "build-${SLAVE_DIR}" -d "$DISTRO" -a "$ARCH" From d8b80d2317983bf46d4dd877049e39d4b503762f Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Thu, 31 Mar 2022 12:40:19 +0800 Subject: [PATCH 142/817] [ci] Use template from master branch in UpgrateVersion/sonic-slave pipeline (#10380) --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 10 +++++++++- .azure-pipelines/docker-sonic-slave-template.yml | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 4f1625b297a9..06ef505f0d5d 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -18,6 +18,14 @@ schedules: - 202006 always: true +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build + pool: sonicbld parameters: @@ -45,7 +53,7 @@ stages: jobFilters: ${{ parameters.jobFilters }} buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' preSteps: - - template: template-clean-sonic-slave.yml + - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage - stage: UpgradeVersions jobs: - job: UpgradeVersions diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 7ba3592044c4..40a937a8c89a 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -3,6 +3,13 @@ # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml # Build and push sonic-slave-[buster|jessie|stretch] images for amd64/armhf/arm64 +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build parameters: - name: arch @@ -38,7 +45,7 @@ jobs: pool: ${{ parameters.pool }} steps: - template: cleanup.yml - - template: template-clean-sonic-slave.yml + - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage - checkout: self clean: true submodules: recursive From 8f01c7fba6c0308a7ef9e34ca3b6ac5754ead7a2 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Thu, 31 Mar 2022 13:07:46 +0800 Subject: [PATCH 143/817] [build] Fix issues found in reproducible build. (#10407) --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 2 +- scripts/docker_version_control.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 06ef505f0d5d..03593c551cff 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -51,7 +51,7 @@ stages: - template: azure-pipelines-build.yml parameters: jobFilters: ${{ parameters.jobFilters }} - buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' + buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} ENABLE_DOCKER_BASE_PULL=n SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' preSteps: - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage - stage: UpgradeVersions diff --git a/scripts/docker_version_control.sh b/scripts/docker_version_control.sh index da8cd0484f49..e94370d0e2d9 100755 --- a/scripts/docker_version_control.sh +++ b/scripts/docker_version_control.sh @@ -23,7 +23,7 @@ tag=`echo $image_tag | cut -f2 -d:` if [[ ",$SONIC_VERSION_CONTROL_COMPONENTS," == *,all,* ]] || [[ ",$SONIC_VERSION_CONTROL_COMPONENTS," == *,docker,* ]]; then # if docker image not in white list, exit - if [[ "$image_tag" != */debian:* ]] && [[ "$image_tag" != multiarch/debian-debootstrap:* ]];then + if [[ "$image_tag" != */debian:* ]] && [[ "$image_tag" != debian:* ]] && [[ "$image_tag" != multiarch/debian-debootstrap:* ]];then exit 0 fi if [ -f $version_file ];then @@ -40,7 +40,7 @@ if [[ ",$SONIC_VERSION_CONTROL_COMPONENTS," == *,all,* ]] || [[ ",$SONIC_VERSION sed -i "s/$oldimage/$newimage/" $DOCKERFILE else hash_value=`docker pull $image_tag 2> ${new_version_file}.log | grep Digest | awk '{print$2}'` - if [ -z hash_value ];then + if [ -z "$hash_value" ];then hash_value=unknown fi fi From c03bf075f79929c6688bebdb4d15034e12c77351 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Thu, 31 Mar 2022 13:14:55 +0800 Subject: [PATCH 144/817] [ci] Add azure pipeline to build common libs. (#10367) Why I did it To remove reference on Azure.sonic-buildimage artifacts. Azure.sonic-buildimage has a higher failure rate. --- .azure-pipelines/build-commonlib.yml | 19 ++++++++++++++ .azure-pipelines/template-commonlib.yml | 34 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .azure-pipelines/build-commonlib.yml create mode 100644 .azure-pipelines/template-commonlib.yml diff --git a/.azure-pipelines/build-commonlib.yml b/.azure-pipelines/build-commonlib.yml new file mode 100644 index 000000000000..df9bcb25ae70 --- /dev/null +++ b/.azure-pipelines/build-commonlib.yml @@ -0,0 +1,19 @@ +pr: none +trigger: none +schedules: +- cron: "0 0 * * *" + displayName: Daily build + branches: + include: + - master + - 202??? +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build + +jobs: +- template: .azure-pipelines/template-commonlib.yml@buildimage diff --git a/.azure-pipelines/template-commonlib.yml b/.azure-pipelines/template-commonlib.yml new file mode 100644 index 000000000000..0e42cb4e17ac --- /dev/null +++ b/.azure-pipelines/template-commonlib.yml @@ -0,0 +1,34 @@ +jobs: +- job: Build + timeoutInMinutes: 120 + pool: sonicbld + steps: + - checkout: self + clean: true + submodules: recursive + - script: | + set -ex + case $(Build.SourceBranchName) in + 202012 | 202106) + bldenv=buster + ;; + *) + bldenv=bullseye + ;; + esac + BLDENV=$bldenv make -f Makefile.work configure PLATFORM=vs ENABLE_DOCKER_BASE_PULL=y + echo "##vso[task.setvariable variable=bldenv;]$bldenv" + displayName: Make configure + - script: | + set -ex + LIBNL3_VERSION_BASE=$(grep "LIBNL3_VERSION_BASE =" rules/libnl3.mk | awk '{print$3}') + LIBNL3_VERSION=$(grep "LIBNL3_VERSION =" rules/libnl3.mk | awk '{print$3}' | sed -e "s/(//" -e "s/)//" -e "s/\\$//" -e "s/LIBNL3_VERSION_BASE/$LIBNL3_VERSION_BASE/") + BLDENV=$(bldenv) make -f Makefile.work target/debs/$(bldenv)/libnl-3-200_${LIBNL3_VERSION}_amd64.deb ENABLE_DOCKER_BASE_PULL=y + + LIBYANG_VERSION_BASE=$(grep "LIBYANG_VERSION_BASE =" rules/libyang.mk | awk '{print$3}') + LIBYANG_VERSION=$(grep "LIBYANG_VERSION =" rules/libyang.mk | awk '{print$3}' | sed -e "s/\\$//" -e "s/(//" -e "s/)//" -e "s/LIBYANG_VERSION_BASE/$LIBYANG_VERSION_BASE/") + BLDENV=$(bldenv) make -f Makefile.work target/debs/$(bldenv)/libyang_${LIBYANG_VERSION}_amd64.deb + find target -name *.deb | xargs -i cp {} $(Build.ArtifactStagingDirectory) + displayName: Make common lib packages + - publish: $(Build.ArtifactStagingDirectory) + artifact: common-lib From 85539e7e0852cac76497de43c4add3e3c5856904 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 31 Mar 2022 13:21:09 +0800 Subject: [PATCH 145/817] [Mellanox] Update hw-mgmt package to version V.7.0020.2004 (#10401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Why I did it Take new hw-mgmt release to SONiC, including: New features: 1. hw-mgmt: add to PSU FW upgrade tool command to show current FW version 2. hw-mgmt: add to PSU FW upgrade tool support for single-PSU-in-the-system FW upgrade 3. hw-mgmt: add attribute “/firmware” to show FW version of restricted upgradable PSUs only 4. hw-mgmt: Add NVME temperature reports attributes (_alarm/_crit/_min/_max) Bug fix: 1. psu: redundant i2c_addr attributes being created for psu 3 & 4 in system having only 2 psus. 2. hw-mgmt: in SPC1/2 i2c driver removal is too slow vs. ASIC reset causing non-functional log errors 3. PSU thresholds sysfs changed in 5.10 to “read only” preventing modification (modification required due PSU HW bug) 4. CPLD3 sysfs attribute missing after chip down/up flow 5. sysfs attributes missing when hw-mgmt is restarted (stop/start) within systemd Release notes can be found from link https://github.com/Mellanox/hw-mgmt/blob/V.7.0020.2004/debian/Release.txt - How I did it Update hw-mgmt make file with new version number Update hw-mgmt submodule pointer - How to verify it Run platform regression on all Mellanox platform Signed-off-by: Kebo Liu --- platform/mellanox/hw-management.mk | 2 +- ...03-Remove-unused-non-upstream-kernel-modules-from-load.patch | 2 +- platform/mellanox/hw-management/hw-mgmt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 1f2a08b32d4d..fac7bddc2c24 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -16,7 +16,7 @@ # # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = 7.0020.1300 +MLNX_HW_MANAGEMENT_VERSION = 7.0020.2004 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch index fb114224494b..496085e9d4d8 100644 --- a/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch +++ b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch @@ -16,7 +16,7 @@ index 39f621e..c0980bc 100644 mp2888 i2c-mux-pca954x -emc2305 --ads1015 +-ti-ads1015 powr1220 gpio-pca953x pmbus diff --git a/platform/mellanox/hw-management/hw-mgmt b/platform/mellanox/hw-management/hw-mgmt index cd4e3f7bdc9f..ec2e9173e9f2 160000 --- a/platform/mellanox/hw-management/hw-mgmt +++ b/platform/mellanox/hw-management/hw-mgmt @@ -1 +1 @@ -Subproject commit cd4e3f7bdc9fe77f0dc78b405e52fe876f7ca490 +Subproject commit ec2e9173e9f24cbc02eb87d81889d408528e090b From 6e51779efbb4d1bd8103f167fdb760b03fe2a1a9 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Thu, 31 Mar 2022 15:29:23 +0800 Subject: [PATCH 146/817] [sonic-cfggen] Fix invalid switch_type (#10383) Why I did it sonic-config-engine unit test is using invalid switch_type How I did it Update xml with correct switch_type How to verify it Run UT for sonic-config-engine Signed-off-by: Gang Lv ganglv@microsoft.com --- .../tests/sample-chassis-packet-lc-graph.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml b/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml index 183c578385f0..ac83d87b96ca 100644 --- a/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml +++ b/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml @@ -394,7 +394,7 @@ SwitchType - chassis_packet + chassis-packet DeploymentId @@ -459,7 +459,7 @@ SwitchType - chassis_packet + chassis-packet From 271ef69e60752a9fa22c2bbbc8173a3c70d22363 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 31 Mar 2022 17:33:43 +0800 Subject: [PATCH 147/817] Add j2 template for enable pam_limit and limit SSH session (#10177) #### Why I did it When too many user login concurrently and run commands, SONiC may kernel panic on some device which has very limited memory. #### How I did it Add j2 template for setup pam_limit plugin for limit SSH session per-user. #### How to verify it Manually validate the j2 template can generate correct config file. #### Which release branch to backport (provide reason below if selected) - [x] 201811 - [ ] 201911 - [ ] 202006 - [x] 202012 - [x] 202106 - [x] 202111 #### Description for the changelog Add j2 template for setup pam_limit plugin for limit SSH session per-user. #### A picture of a cute animal (not mandatory but encouraged) --- .../templates/limits.conf.j2 | 69 +++++++++++++++++++ .../templates/pam_limits.j2 | 12 ++++ src/sonic-host-services/scripts/hostcfgd | 65 +++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100755 src/sonic-host-services-data/templates/limits.conf.j2 create mode 100755 src/sonic-host-services-data/templates/pam_limits.j2 diff --git a/src/sonic-host-services-data/templates/limits.conf.j2 b/src/sonic-host-services-data/templates/limits.conf.j2 new file mode 100755 index 000000000000..41b37221e41e --- /dev/null +++ b/src/sonic-host-services-data/templates/limits.conf.j2 @@ -0,0 +1,69 @@ +# /etc/security/limits.conf +# +# This file generate by j2 template file: src/sonic-host-services-data/templates/limits.conf.j2 +# +# Each line describes a limit for a user in the form: +# +# +# +# Where: +# can be: +# - a user name +# - a group name, with @group syntax +# - the wildcard *, for default entry +# - the wildcard %, can be also used with %group syntax, +# for maxlogin limit +# - NOTE: group and wildcard limits are not applied to root. +# To apply a limit to the root user, must be +# the literal username root. +# +# can have the two values: +# - "soft" for enforcing the soft limits +# - "hard" for enforcing hard limits +# +# can be one of the following: +# - core - limits the core file size (KB) +# - data - max data size (KB) +# - fsize - maximum filesize (KB) +# - memlock - max locked-in-memory address space (KB) +# - nofile - max number of open file descriptors +# - rss - max resident set size (KB) +# - stack - max stack size (KB) +# - cpu - max CPU time (MIN) +# - nproc - max number of processes +# - as - address space limit (KB) +# - maxlogins - max number of logins for this user +# - maxsyslogins - max number of logins on the system +# - priority - the priority to run user process with +# - locks - max number of file locks the user can hold +# - sigpending - max number of pending signals +# - msgqueue - max memory used by POSIX message queues (bytes) +# - nice - max nice priority allowed to raise to values: [-20, 19] +# - rtprio - max realtime priority +# - chroot - change root to directory (Debian-specific) +# +# +# is related with : +# All items support the values -1, unlimited or infinity indicating +# no limit, except for priority and nice. +# +# If a hard limit or soft limit of a resource is set to a valid value, +# but outside of the supported range of the local system, the system +# may reject the new limit or unexpected behavior may occur. If the +# control value required is used, the module will reject the login if +# a limit could not be set. +# +# +# + +# * soft core 0 +# root hard core 100000 +# * hard rss 10000 +# @student hard nproc 20 +# @faculty soft nproc 20 +# @faculty hard nproc 50 +# ftp hard nproc 0 +# ftp - chroot /ftp +# @student - maxlogins 4 + +# End of file diff --git a/src/sonic-host-services-data/templates/pam_limits.j2 b/src/sonic-host-services-data/templates/pam_limits.j2 new file mode 100755 index 000000000000..f87906932fb7 --- /dev/null +++ b/src/sonic-host-services-data/templates/pam_limits.j2 @@ -0,0 +1,12 @@ +#THIS IS AN AUTO-GENERATED FILE +# +# This file generate by j2 template file: src/sonic-host-services-data/templates/pam_limits.j2 +# +# /etc/pam.d/pam-limits settings common to all services +# This file is included from other service-specific PAM config files, +# and should contain a list of the authentication modules that define +# the central authentication scheme for use on the system +# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the +# traditional Unix authentication mechanisms. +# +# here are the per-package modules (the "Primary" block) \ No newline at end of file diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd index be8317259e38..5b6693fbcdf7 100755 --- a/src/sonic-host-services/scripts/hostcfgd +++ b/src/sonic-host-services/scripts/hostcfgd @@ -25,6 +25,10 @@ PAM_RADIUS_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_radius_auth.conf NSS_CONF = "/etc/nsswitch.conf" ETC_PAMD_SSHD = "/etc/pam.d/sshd" ETC_PAMD_LOGIN = "/etc/pam.d/login" +PAM_LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_limits.j2" +LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/limits.conf.j2" +PAM_LIMITS_CONF = "/etc/pam.d/pam-limits-conf" +LIMITS_CONF = "/etc/security/limits.conf" # TACACS+ TACPLUS_SERVER_PASSKEY_DEFAULT = "" @@ -966,6 +970,64 @@ class NtpCfg(object): syslog.syslog(syslog.LOG_INFO, 'ntp server update, restarting ntp-config, ntp servers configured {}'.format(self.ntp_servers)) run_cmd(cmd) +class PamLimitsCfg(object): + """ + PamLimit Config Daemon + 1) The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. + 2) Purpose of this daemon is to render pam_limits config file. + """ + def __init__(self, config_db): + self.config_db = config_db + self.hwsku = "" + self.type = "" + + # Load config from ConfigDb and render config file/ + def update_config_file(self): + device_metadata = self.config_db.get_table('DEVICE_METADATA') + if "localhost" not in device_metadata: + return + + self.read_localhost_config(device_metadata["localhost"]) + self.render_conf_file() + + # Read localhost config + def read_localhost_config(self, localhost): + if "hwsku" in localhost: + self.hwsku = localhost["hwsku"] + else: + self.hwsku = "" + + if "type" in localhost: + self.type = localhost["type"] + else: + self.type = "" + + # Render pam_limits config files + def render_conf_file(self): + env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) + env.filters['sub'] = sub + + try: + template_file = os.path.abspath(PAM_LIMITS_CONF_TEMPLATE) + template = env.get_template(template_file) + pam_limits_conf = template.render( + hwsku=self.hwsku, + type=self.type) + with open(PAM_LIMITS_CONF, 'w') as f: + f.write(pam_limits_conf) + + template_file = os.path.abspath(LIMITS_CONF_TEMPLATE) + template = env.get_template(template_file) + limits_conf = template.render( + hwsku=self.hwsku, + type=self.type) + with open(LIMITS_CONF, 'w') as f: + f.write(limits_conf) + except Exception as e: + syslog.syslog(syslog.LOG_ERR, + "modify pam_limits config file failed with exception: {}" + .format(e)) + class HostConfigDaemon: def __init__(self): # Just a sanity check to verify if the CONFIG_DB has been initialized @@ -1007,6 +1069,9 @@ class HostConfigDaemon: self.hostname_cache="" self.aaacfg = AaaCfg() + # Initialize PamLimitsCfg + self.pamLimitsCfg = PamLimitsCfg(self.config_db) + self.pamLimitsCfg.update_config_file() def load(self): aaa = self.config_db.get_table('AAA') From 71a04722f43fd06f32b86d2a4449d2aafd323b8b Mon Sep 17 00:00:00 2001 From: Myron Sosyak Date: Thu, 31 Mar 2022 02:45:29 -0700 Subject: [PATCH 148/817] [submodule] Update sonic-sairedis (#10302) 1ccda8d MACsec in Gearbox (#993) 7a2b824 Update SAI submodule (#1015) 418d5fb Add pre match logic for lag member (#1008) Signed-off-by: Myron Sosyak --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index b9337dc5787a..1ccda8d1d982 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit b9337dc5787aadf71eee9d676d6b7f1181ac0787 +Subproject commit 1ccda8d1d9821a65f73eb5c8f88f9abea0623c0b From 106fac5f09b9764175b1fef93c76dd6c8d7a7fea Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:23:57 +0800 Subject: [PATCH 149/817] [counter] Fix issue: non default counters will be delayed forever after fastboot (#10413) - Why I did it Fastboot will delay all counters in CONFIG DB, it relies on enable_counters.py to recover the delayed counters. However, enable_counters.py does not recover those non-default counters. - How I did it For non-default counters, if it is in CONFIG DB, put delay status to false after the waiting. - How to verify it Manual test --- dockers/docker-orchagent/enable_counters.py | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/dockers/docker-orchagent/enable_counters.py b/dockers/docker-orchagent/enable_counters.py index 7d25643bba43..c45a931e0553 100755 --- a/dockers/docker-orchagent/enable_counters.py +++ b/dockers/docker-orchagent/enable_counters.py @@ -38,16 +38,18 @@ def enable_rates(): def enable_counters(): db = swsssdk.ConfigDBConnector() db.connect() - enable_counter_group(db, 'PORT') - enable_counter_group(db, 'RIF') - enable_counter_group(db, 'QUEUE') - enable_counter_group(db, 'PFCWD') - enable_counter_group(db, 'PG_WATERMARK') - enable_counter_group(db, 'PG_DROP') - enable_counter_group(db, 'QUEUE_WATERMARK') - enable_counter_group(db, 'BUFFER_POOL_WATERMARK') - enable_counter_group(db, 'PORT_BUFFER_DROP') - enable_counter_group(db, 'ACL') + default_enabled_counters = ['PORT', 'RIF', 'QUEUE', 'PFCWD', 'PG_WATERMARK', 'PG_DROP', + 'QUEUE_WATERMARK', 'BUFFER_POOL_WATERMARK', 'PORT_BUFFER_DROP', 'ACL'] + + # Enable those default counters + for key in default_enabled_counters: + enable_counter_group(db, key) + + # Set FLEX_COUNTER_DELAY_STATUS to false for those non-default counters + keys = db.get_keys('FLEX_COUNTER_TABLE') + for key in keys: + if key not in default_enabled_counters: + enable_counter_group(db, key) enable_rates() From 0bce0a7e6db9b2d492ab34641c3a43fa1f6285e6 Mon Sep 17 00:00:00 2001 From: AmitKaushik7 <52193450+AmitKaushik7@users.noreply.github.com> Date: Thu, 31 Mar 2022 22:52:03 +0530 Subject: [PATCH 150/817] =?UTF-8?q?Allow=20NULL=20Buffer=20Profile=20in=20?= =?UTF-8?q?buffer=20pg/queue=20yang=20files=20for=20Dynamic=20B=E2=80=A6?= =?UTF-8?q?=20(#10353)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it To address #10342 (Yang validation fails when Buffer profiles are configured with "NULL" values) --- .../yang_model_tests/tests/buffer_pg.json | 3 ++ .../tests_config/buffer_pg.json | 52 +++++++++++++++++++ .../yang-models/sonic-buffer-pg.yang | 13 +++-- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/buffer_pg.json b/src/sonic-yang-models/tests/yang_model_tests/tests/buffer_pg.json index f92a75365c78..e6e4e59a8fdf 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/buffer_pg.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/buffer_pg.json @@ -10,6 +10,9 @@ "desc": "BUFFER_PG_WRONG_PG_VALUE pattern failure", "eStr": "Invalid Buffer PG number" }, + "BUFFER_PG_NULL_PROFILE_VALUE": { + "desc": "BUFFER_PG_NULL_PROFILE_VALUE no failure" + }, "BUFFER_PG_WRONG_PORT_VALUE": { "desc": "BUFFER_PG_WRONG_PORT_VALUE pattern failure", "eStr": "wrong" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/buffer_pg.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/buffer_pg.json index ec3ea73bf76d..cd0a244a0e0e 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/buffer_pg.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/buffer_pg.json @@ -52,6 +52,58 @@ } } }, + "BUFFER_PG_NULL_PROFILE_VALUE": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": "9000", + "name": "Ethernet4", + "tpid": "0x8100", + "speed": "25000" + } + ] + } + }, + "sonic-buffer-pool:sonic-buffer-pool": { + "sonic-buffer-pool:BUFFER_POOL": { + "BUFFER_POOL_LIST": [ + { + "name": "egress_lossless_pool", + "mode": "static", + "size": "300", + "type": "ingress" + } + ] + } + }, + "sonic-buffer-profile:sonic-buffer-profile": { + "sonic-buffer-profile:BUFFER_PROFILE": { + "BUFFER_PROFILE_LIST": [ + { + "name": "lossless_buffer_profile", + "size": "300", + "pool": "egress_lossless_pool" + } + ] + } + }, + "sonic-buffer-pg:sonic-buffer-pg": { + "sonic-buffer-pg:BUFFER_PG": { + "BUFFER_PG_LIST": [ + { + "port": "Ethernet4", + "pg_num": "3", + "profile": "NULL" + } + ] + } + } + }, "BUFFER_PG_WRONG_PROFILE_VALUE": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-buffer-pg.yang b/src/sonic-yang-models/yang-models/sonic-buffer-pg.yang index efe6e34ad0d6..60d06bf6ef6c 100644 --- a/src/sonic-yang-models/yang-models/sonic-buffer-pg.yang +++ b/src/sonic-yang-models/yang-models/sonic-buffer-pg.yang @@ -2,9 +2,7 @@ module sonic-buffer-pg { namespace "http://github.com/Azure/sonic-buffer-pg"; prefix bpg; - import sonic-extension { - prefix sonic-ext; - } + yang-version 1.1; import sonic-port { prefix prt; @@ -54,8 +52,13 @@ module sonic-buffer-pg { leaf profile { default 0; - type leafref { - path "/bpf:sonic-buffer-profile/bpf:BUFFER_PROFILE/bpf:BUFFER_PROFILE_LIST/bpf:name"; + type union { + type leafref { + path "/bpf:sonic-buffer-profile/bpf:BUFFER_PROFILE/bpf:BUFFER_PROFILE_LIST/bpf:name"; + } + type string { + pattern "NULL"; + } } description "Buffer Profile associated with Priority Group number for a port"; } From eb141f21638b261877bd9ea562b672116e2e4419 Mon Sep 17 00:00:00 2001 From: Myron Sosyak Date: Thu, 31 Mar 2022 12:49:22 -0700 Subject: [PATCH 151/817] [BFN] Remove SAI patches (#10343) Signed-off-by: Myron Sosyak --- platform/barefoot/libsaithrift-dev.mk | 5 -- ...eplace-unions-with-structs-in-thrift.patch | 70 ------------------- ...-Use-std-shared_ptr-instead-of-boost.patch | 25 ------- .../0003-include-algorithm.patch | 24 ------- ...0004-Fix-Thrift-0.14.1-compatibility.patch | 47 ------------- platform/barefoot/saithrift-patches/Makefile | 19 ----- platform/barefoot/saithrift-patches/series | 4 -- 7 files changed, 194 deletions(-) delete mode 100644 platform/barefoot/saithrift-patches/0001-Replace-unions-with-structs-in-thrift.patch delete mode 100644 platform/barefoot/saithrift-patches/0002-Use-std-shared_ptr-instead-of-boost.patch delete mode 100644 platform/barefoot/saithrift-patches/0003-include-algorithm.patch delete mode 100644 platform/barefoot/saithrift-patches/0004-Fix-Thrift-0.14.1-compatibility.patch delete mode 100644 platform/barefoot/saithrift-patches/Makefile delete mode 100644 platform/barefoot/saithrift-patches/series diff --git a/platform/barefoot/libsaithrift-dev.mk b/platform/barefoot/libsaithrift-dev.mk index 40cd5554653e..0fb5ca0cb81d 100644 --- a/platform/barefoot/libsaithrift-dev.mk +++ b/platform/barefoot/libsaithrift-dev.mk @@ -1,7 +1,3 @@ -SAITHRIFT_PATCHES = saithrift-patches -$(SAITHRIFT_PATCHES)_SRC_PATH = $(PLATFORM_PATH)/saithrift-patches -SONIC_MAKE_FILES += $(SAITHRIFT_PATCHES) - # libsaithrift-dev package SAI_VER = 0.9.4 LIBSAITHRIFT_DEV = libsaithrift-dev_$(SAI_VER)_$(CONFIGURED_ARCH).deb @@ -13,7 +9,6 @@ $(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT_0_14_1) $(LIBTHRIFT_0_14_1_DEV) \ #$(LIBSAIVS) $(LIBSAIVS_DEV) $(LIBSAIMETADATA) $(LIBSAIMETADATA_DEV) # $(LIBSAITHRIFT_DEV)_BUILD_ENV = platform=v -$(LIBSAITHRIFT_DEV)_AFTER_FILES = $(SAITHRIFT_PATCHES) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT_0_14_1) $(BFN_SAI) SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) diff --git a/platform/barefoot/saithrift-patches/0001-Replace-unions-with-structs-in-thrift.patch b/platform/barefoot/saithrift-patches/0001-Replace-unions-with-structs-in-thrift.patch deleted file mode 100644 index 762c72c75607..000000000000 --- a/platform/barefoot/saithrift-patches/0001-Replace-unions-with-structs-in-thrift.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 6f0188ad82845ac56729d3db621b2d10bea94ddd Mon Sep 17 00:00:00 2001 -From: Myron Sosyak -Date: Thu, 27 Jan 2022 17:25:42 +0000 -Subject: [PATCH 1/4] Replace unions with structs in thrift - ---- - test/saithrift/src/switch_sai.thrift | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/test/saithrift/src/switch_sai.thrift b/test/saithrift/src/switch_sai.thrift -index a9e1d28..0c24b71 100644 ---- a/test/saithrift/src/switch_sai.thrift -+++ b/test/saithrift/src/switch_sai.thrift -@@ -48,7 +48,7 @@ struct sai_thrift_vlan_port_t { - 2: sai_thrift_vlan_tagging_mode_t tagging_mode; - } - --union sai_thrift_ip_t { -+struct sai_thrift_ip_t { - 1: sai_thrift_ip4_t ip4; - 2: sai_thrift_ip6_t ip6; - } -@@ -79,7 +79,7 @@ struct sai_thrift_s32_list_t { - 2: list s32list; - } - --union sai_thrift_acl_mask_t { -+struct sai_thrift_acl_mask_t { - 1: byte u8; - 2: byte s8; - 3: i16 u16; -@@ -91,7 +91,7 @@ union sai_thrift_acl_mask_t { - 9: sai_thrift_ip6_t ip6; - } - --union sai_thrift_acl_data_t { -+struct sai_thrift_acl_data_t { - 1: byte u8; - 2: byte s8; - 3: i16 u16; -@@ -112,7 +112,7 @@ struct sai_thrift_acl_field_data_t - 3: sai_thrift_acl_data_t data; - } - --union sai_thrift_acl_parameter_t { -+struct sai_thrift_acl_parameter_t { - 1: byte u8; - 2: byte s8; - 3: i16 u16; -@@ -161,7 +161,7 @@ struct sai_thrift_fdb_values_t { - 2: sai_thrift_fdb_entry_t thrift_fdb_entry; - } - --union sai_thrift_attribute_value_t { -+struct sai_thrift_attribute_value_t { - 1: bool booldata; - 2: string chardata; - 3: byte u8; -@@ -207,7 +207,7 @@ struct sai_thrift_attribute_list_t { - 2: i32 attr_count; // redundant - } - --union sai_thrift_result_data_t { -+struct sai_thrift_result_data_t { - 1: sai_thrift_object_list_t objlist; - 2: sai_thrift_object_id_t oid; - 3: i16 u16; --- -2.20.1 - diff --git a/platform/barefoot/saithrift-patches/0002-Use-std-shared_ptr-instead-of-boost.patch b/platform/barefoot/saithrift-patches/0002-Use-std-shared_ptr-instead-of-boost.patch deleted file mode 100644 index 93602dc4e991..000000000000 --- a/platform/barefoot/saithrift-patches/0002-Use-std-shared_ptr-instead-of-boost.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 6605dbe4906173b78f428f42f749674c2722361a Mon Sep 17 00:00:00 2001 -From: Myron Sosyak -Date: Thu, 27 Jan 2022 17:26:08 +0000 -Subject: [PATCH 2/4] Use std::shared_ptr instead of boost - ---- - test/saithrift/src/switch_sai_rpc_server.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/test/saithrift/src/switch_sai_rpc_server.cpp b/test/saithrift/src/switch_sai_rpc_server.cpp -index 0df9b3d..e990c50 100644 ---- a/test/saithrift/src/switch_sai_rpc_server.cpp -+++ b/test/saithrift/src/switch_sai_rpc_server.cpp -@@ -74,7 +74,7 @@ using namespace ::apache::thrift::protocol; - using namespace ::apache::thrift::transport; - using namespace ::apache::thrift::server; - --using boost::shared_ptr; -+using std::shared_ptr; - - using namespace ::switch_sai; - --- -2.20.1 - diff --git a/platform/barefoot/saithrift-patches/0003-include-algorithm.patch b/platform/barefoot/saithrift-patches/0003-include-algorithm.patch deleted file mode 100644 index 22471adc380e..000000000000 --- a/platform/barefoot/saithrift-patches/0003-include-algorithm.patch +++ /dev/null @@ -1,24 +0,0 @@ -From b468a7aa00843be9c5ead478bd074784c04b4ba2 Mon Sep 17 00:00:00 2001 -From: Myron Sosyak -Date: Thu, 27 Jan 2022 17:26:40 +0000 -Subject: [PATCH 3/4] include algorithm - ---- - test/saithrift/src/saiserver.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/test/saithrift/src/saiserver.cpp b/test/saithrift/src/saiserver.cpp -index 846c3f1..7120b26 100644 ---- a/test/saithrift/src/saiserver.cpp -+++ b/test/saithrift/src/saiserver.cpp -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include --- -2.20.1 - diff --git a/platform/barefoot/saithrift-patches/0004-Fix-Thrift-0.14.1-compatibility.patch b/platform/barefoot/saithrift-patches/0004-Fix-Thrift-0.14.1-compatibility.patch deleted file mode 100644 index 19e619aa5be0..000000000000 --- a/platform/barefoot/saithrift-patches/0004-Fix-Thrift-0.14.1-compatibility.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 58d5e21378d3fd5dd3a48adb24423c1bb9ff6f7a Mon Sep 17 00:00:00 2001 -From: Myron Sosyak -Date: Thu, 27 Jan 2022 17:28:05 +0000 -Subject: [PATCH 4/4] Fix Thrift 0.14.1 compatibility - ---- - test/saithrift/Makefile | 10 ++++------ - 1 file changed, 4 insertions(+), 6 deletions(-) - -diff --git a/test/saithrift/Makefile b/test/saithrift/Makefile -index cbe6f48..3734ee7 100644 ---- a/test/saithrift/Makefile -+++ b/test/saithrift/Makefile -@@ -21,8 +21,8 @@ CDEFS = -DBRCMSAI - endif - endif - endif --DEPS = switch_sai_constants.h switch_sai_rpc.h switch_sai_types.h --OBJS = switch_sai_constants.o switch_sai_rpc.o switch_sai_types.o -+DEPS = switch_sai_rpc.h switch_sai_types.h -+OBJS = switch_sai_rpc.o switch_sai_types.o - - ODIR = ./src/obj - SAIDIR = ./include -@@ -42,8 +42,6 @@ endif - SAI_LIBRARY_DIR ?= $(SAI_PREFIX)/lib - LDFLAGS = -L$(SAI_LIBRARY_DIR) -Wl,-rpath=$(SAI_LIBRARY_DIR) - CPP_SOURCES = \ -- src/gen-cpp/switch_sai_constants.cpp \ -- src/gen-cpp/switch_sai_constants.h \ - src/gen-cpp/switch_sai_rpc.cpp \ - src/gen-cpp/switch_sai_rpc.h \ - src/gen-cpp/switch_sai_types.cpp \ -@@ -89,8 +87,8 @@ $(ODIR)/switch_sai_rpc_server.o: src/switch_sai_rpc_server.cpp - $(ODIR)/saiserver.o: src/saiserver.cpp - $(CXX) $(CFLAGS) -c $^ -o $@ $(CFLAGS) $(CDEFS) -I$(SRC)/gen-cpp -I$(SRC) - --$(ODIR)/librpcserver.a: $(ODIR)/switch_sai_rpc.o $(ODIR)/switch_sai_types.o $(ODIR)/switch_sai_constants.o $(ODIR)/switch_sai_rpc_server.o -- ar rcs $(ODIR)/librpcserver.a $(ODIR)/switch_sai_rpc.o $(ODIR)/switch_sai_types.o $(ODIR)/switch_sai_constants.o $(ODIR)/switch_sai_rpc_server.o -+$(ODIR)/librpcserver.a: $(ODIR)/switch_sai_rpc.o $(ODIR)/switch_sai_types.o $(ODIR)/switch_sai_rpc_server.o -+ ar rcs $(ODIR)/librpcserver.a $(ODIR)/switch_sai_rpc.o $(ODIR)/switch_sai_types.o $(ODIR)/switch_sai_rpc_server.o - - saiserver: $(ODIR)/saiserver.o $(ODIR)/librpcserver.a - $(CXX) $(LDFLAGS) $(ODIR)/switch_sai_rpc_server.o $(ODIR)/saiserver.o -o $@ \ --- -2.20.1 - diff --git a/platform/barefoot/saithrift-patches/Makefile b/platform/barefoot/saithrift-patches/Makefile deleted file mode 100644 index 625317dcb5fe..000000000000 --- a/platform/barefoot/saithrift-patches/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -SHELL = /bin/bash -.ONESHELL: -.SHELLFLAGS += -e - -MAIN_TARGET = saithrift-patches - -$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : -# To add some BFN specific patches to SAI under sonic-sairedis while sai is not updated -SRC_DIR = ../saithrift-patches -DST_DIR = ../../../src/sonic-sairedis/SAI.patch/ - -$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - # copy patches to SAI - mkdir -p $(DST_DIR) - cp -f $(SRC_DIR)/* $(DST_DIR) - - touch $(DEST)/saithrift-patches - - diff --git a/platform/barefoot/saithrift-patches/series b/platform/barefoot/saithrift-patches/series deleted file mode 100644 index fe26c2102c25..000000000000 --- a/platform/barefoot/saithrift-patches/series +++ /dev/null @@ -1,4 +0,0 @@ -0001-Replace-unions-with-structs-in-thrift.patch -0002-Use-std-shared_ptr-instead-of-boost.patch -0003-include-algorithm.patch -0004-Fix-Thrift-0.14.1-compatibility.patch From 13353dffe8b4262fcfcd54dd8e5c82a47bab9699 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 31 Mar 2022 23:54:40 -0400 Subject: [PATCH 152/817] [Nokia][device] Update the BCM config with Recycle ports info for Nokia IXR7250E platform (#10389) Signed-off-by: mlok --- .../Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm | 4 +++- .../Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index ecaae10276a4..2ede5ab6d0d0 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -1553,7 +1553,9 @@ ucode_port_18.BCM8885X=CDGE0:core_0.18 ucode_port_19.BCM8885X=RCY0:core_0.19 -ucode_port_20.BCM8885X=OLP:core_1.20 +ucode_port_20.BCM8885X=RCY1:core_1.20 +ucode_port_21.BCM8885X=OLP:core_1.21 + serdes_lane_config_dfe_1.BCM8885X=on diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index 142a718e080f..fd96c3ac4368 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -1553,7 +1553,9 @@ ucode_port_18.BCM8885X=CDGE0:core_0.18 ucode_port_19.BCM8885X=RCY0:core_0.19 -ucode_port_20.BCM8885X=OLP:core_1.20 +ucode_port_20.BCM8885X=RCY1:core_1.20 +ucode_port_21.BCM8885X=OLP:core_1.21 + serdes_lane_config_dfe_1.BCM8885X=on From a9a37c8ba1db35a9e7965219b5603161f8f72967 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Fri, 1 Apr 2022 16:19:48 +0800 Subject: [PATCH 153/817] [ci] Fix docker-sonic-slave-template issue for resources. (#10414) Why I did it Fix bug for wrong resources position. --- .azure-pipelines/docker-sonic-slave-arm64.yml | 7 +++++++ .azure-pipelines/docker-sonic-slave-armhf.yml | 7 +++++++ .azure-pipelines/docker-sonic-slave-template.yml | 8 -------- .azure-pipelines/docker-sonic-slave.yml | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/.azure-pipelines/docker-sonic-slave-arm64.yml b/.azure-pipelines/docker-sonic-slave-arm64.yml index 6bb9203b49ae..2a9af06c3d01 100644 --- a/.azure-pipelines/docker-sonic-slave-arm64.yml +++ b/.azure-pipelines/docker-sonic-slave-arm64.yml @@ -3,6 +3,13 @@ # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml # Build and push sonic-slave-[buster|jessie|stretch] images for amd64/armhf/arm64 +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build schedules: - cron: "0 8 * * *" diff --git a/.azure-pipelines/docker-sonic-slave-armhf.yml b/.azure-pipelines/docker-sonic-slave-armhf.yml index 250bf7400a69..69e73479f342 100644 --- a/.azure-pipelines/docker-sonic-slave-armhf.yml +++ b/.azure-pipelines/docker-sonic-slave-armhf.yml @@ -3,6 +3,13 @@ # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml # Build and push sonic-slave-[buster|jessie|stretch] images for amd64/armhf/arm64 +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build schedules: - cron: "0 8 * * *" diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 40a937a8c89a..6b4b90f371d9 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -3,14 +3,6 @@ # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml # Build and push sonic-slave-[buster|jessie|stretch] images for amd64/armhf/arm64 -resources: - repositories: - - repository: buildimage - type: github - name: Azure/sonic-buildimage - ref: master - endpoint: build - parameters: - name: arch type: string diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index bf5fce77a722..8af6b8b3834f 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -3,6 +3,13 @@ # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml # Build and push sonic-slave-[buster|jessie|stretch] images for amd64/armhf/arm64 +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build schedules: - cron: "0 8 * * *" @@ -53,8 +60,15 @@ stages: - ${{ each dist in parameters.dists }}: - ${{ if endswith(variables['Build.DefinitionName'], dist) }}: - ${{ each arch in parameters.arches }}: + ${{ if eq(variables['System.PullRequest.TargetBranch'], 'master') }}: - template: docker-sonic-slave-template.yml parameters: pool: sonicbld arch: ${{ arch }} dist: ${{ dist }} + ${{ else }}: + - template: .azure-pipelines/docker-sonic-slave-template.yml@buildimage + parameters: + pool: sonicbld + arch: ${{ arch }} + dist: ${{ dist }} From 0f488a8cb61521e92879e1175948b1f961633265 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 1 Apr 2022 01:22:54 -0700 Subject: [PATCH 154/817] [azp]: Fix type in slave container cleanup (#10424) Signed-off-by: Lawrence Lee --- .azure-pipelines/template-clean-sonic-slave.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/template-clean-sonic-slave.yml b/.azure-pipelines/template-clean-sonic-slave.yml index cc995e9c2621..c67f63fff476 100644 --- a/.azure-pipelines/template-clean-sonic-slave.yml +++ b/.azure-pipelines/template-clean-sonic-slave.yml @@ -1,7 +1,7 @@ steps: - script: | containers=$(docker container ls -a | grep "sonic-slave" | awk '{ print $1 }') - [ -n "$containers" ] && docker container rm -f containers + [ -n "$containers" ] && docker container rm -f $containers docker images | grep "^" | awk '{print$3}' | xargs -i docker rmi {} images=$(docker images 'sonic-slave-*' -a -q) [ -n "$images" ] && docker rmi -f $images From 94ec85464b00162c5ac45d6c335a12e543c6ea08 Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 1 Apr 2022 20:03:08 +0530 Subject: [PATCH 155/817] DellEMC: N3248TE/N3248PXE Watchdog Support (#9398) Why I did it DellEMC : Added support for N3248TE/N3248PXE platforms How I did it Implemented the changes to enable/disable the watchdog support How to verify it watchdog_unit_test.txt Co-authored-by: Arun LK --- .../n3248pxe/modules/dell_n3248pxe_platform.c | 37 +++++++++ .../n3248pxe/sonic_platform/watchdog.py | 79 +++++++++--------- .../n3248te/modules/dell_n3248te_platform.c | 40 ++++++++- .../n3248te/sonic_platform/watchdog.py | 83 +++++++++---------- 4 files changed, 154 insertions(+), 85 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/modules/dell_n3248pxe_platform.c b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/modules/dell_n3248pxe_platform.c index 1c5d07bffaba..5fb106f186b3 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/modules/dell_n3248pxe_platform.c +++ b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/modules/dell_n3248pxe_platform.c @@ -853,6 +853,41 @@ static ssize_t fan_led_store(struct device *dev, struct device_attribute *devatt return count; } +static ssize_t watchdog_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "%x\n", data); +} + +static ssize_t watchdog_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret, err; + unsigned long val; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + + if (data) + { + ret = i2c_smbus_write_byte_data(pdata[cpu_cpld].client, 0x7, data); + if (ret < 0) + return ret; + } + + return count; +} static ssize_t power_good_show(struct device *dev, struct device_attribute *devattr, char *buf) @@ -947,6 +982,7 @@ static DEVICE_ATTR_RO(psu1_prs); static DEVICE_ATTR_RO(psu0_status); static DEVICE_ATTR_RO(psu1_status); static DEVICE_ATTR_RW(system_led); +static DEVICE_ATTR_RW(watchdog); static DEVICE_ATTR_RW(locator_led); static DEVICE_ATTR_RW(power_led); static DEVICE_ATTR_RW(master_led); @@ -988,6 +1024,7 @@ static struct attribute *n3248pxe_cpld_attrs[] = { &dev_attr_psu0_status.attr, &dev_attr_psu1_status.attr, &dev_attr_system_led.attr, + &dev_attr_watchdog.attr, &dev_attr_locator_led.attr, &dev_attr_power_led.attr, &dev_attr_master_led.attr, diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/watchdog.py index 876aa4beda51..00277c2872f6 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/watchdog.py @@ -11,7 +11,6 @@ try: import ctypes - import subprocess from sonic_platform_base.watchdog_base import WatchdogBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -29,43 +28,53 @@ class Watchdog(WatchdogBase): Abstract base class for interfacing with a hardware watchdog module """ - TIMERS = [15,20,30,40,50,60,65,70] + TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240] armed_time = 0 timeout = 0 CLOCK_MONOTONIC = 1 def __init__(self): + WatchdogBase.__init__(self) self._librt = ctypes.CDLL('librt.so.1', use_errno=True) self._clock_gettime = self._librt.clock_gettime self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)] + self.watchdog_reg = "watchdog" - def _get_command_result(self, cmdline): + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-n3248pxe-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name try: - proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - result = stdout.rstrip('\n') - except OSError: - result = None + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') - return result + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + + cpld_dir = "/sys/devices/platform/dell-n3248pxe-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv def _get_reg_val(self): - # 0x31 = CPLD I2C Base Address - # 0x07 = Watchdog Function Register - value = self._get_command_result("/usr/sbin/i2cget -y 601 0x31 0x07") - if not value: - return None - else: - return int(value, 16) + value = self._get_cpld_register(self.watchdog_reg).strip() + if value == 'ERR': return False + + return int(value,16) def _set_reg_val(self,val): - # 0x31 = CPLD I2C Base Address - # 0x07 = Watchdog Function Register - value = self._get_command_result("/usr/sbin/i2cset -y 601 0x31 0x07 %s" - % (val)) + value = self._set_cpld_register(self.watchdog_reg, val) return value def _get_time(self): @@ -93,7 +102,7 @@ def arm(self, seconds): """ timer_offset = -1 for key,timer_seconds in enumerate(self.TIMERS): - if seconds <= timer_seconds: + if seconds > 0 and seconds <= timer_seconds: timer_offset = key seconds = timer_seconds break @@ -101,40 +110,29 @@ def arm(self, seconds): if timer_offset == -1: return -1 - # Extracting 5th to 7th bits for WD timer values - # 000 - 15 sec - # 001 - 20 sec - # 010 - 30 sec - # 011 - 40 sec - # 100 - 50 sec - # 101 - 60 sec - # 110 - 65 sec - # 111 - 70 sec + # Extracting 5th to 8th bits for WD timer values reg_val = self._get_reg_val() - wd_timer_offset = (reg_val >> 4) & 0x7 + wd_timer_offset = (reg_val >> 4) & 0xF if wd_timer_offset != timer_offset: - # Setting 5th to 7th bits + # Setting 5th to 8th bits # value from timer_offset self.disarm() - self._set_reg_val(reg_val | (timer_offset << 4)) + self._set_reg_val((reg_val & 0x0F) | (timer_offset << 4)) if self.is_armed(): # Setting last bit to WD Timer punch # Last bit = WD Timer punch self._set_reg_val(reg_val & 0xFE) - self.armed_time = self._get_time() - self.timeout = seconds else: # Setting 4th bit to enable WD # 4th bit = Enable WD reg_val = self._get_reg_val() self._set_reg_val(reg_val | 0x8) - self.armed_time = self._get_time() - self.timeout = seconds - + self.armed_time = self._get_time() + self.timeout = seconds return seconds def disarm(self): @@ -207,4 +205,3 @@ def get_remaining_time(self): return self.timeout - diff_time return 0 - diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/modules/dell_n3248te_platform.c b/platform/broadcom/sonic-platform-modules-dell/n3248te/modules/dell_n3248te_platform.c index f7a13c2a739f..92ee30af312f 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/modules/dell_n3248te_platform.c +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/modules/dell_n3248te_platform.c @@ -572,7 +572,7 @@ static ssize_t system_led_show(struct device *dev, struct device_attribute *deva if (ret < 0) return sprintf(buf, "read error"); - data = (u8)(ret & 0x30) >> 5; + data = (u8)(ret & 0x30) >> 4; switch (data) { @@ -878,6 +878,42 @@ static ssize_t fan_led_store(struct device *dev, struct device_attribute *devatt return count; } +static ssize_t watchdog_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + s32 ret; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, 0x7); + if (ret < 0) + return sprintf(buf, "read error"); + data = ret; + + return sprintf(buf, "%x\n", data); +} + +static ssize_t watchdog_store(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + s32 ret, err; + unsigned long val; + u8 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + + data = (u8) val; + if (data) + { + ret = i2c_smbus_write_byte_data(pdata[cpu_cpld].client, 0x7, data); + if (ret < 0) + return ret; + } + + return count; +} static ssize_t power_good_show(struct device *dev, struct device_attribute *devattr, char *buf) @@ -974,6 +1010,7 @@ static DEVICE_ATTR_RO(psu1_prs); static DEVICE_ATTR_RO(psu0_status); static DEVICE_ATTR_RO(psu1_status); static DEVICE_ATTR_RW(system_led); +static DEVICE_ATTR_RW(watchdog); static DEVICE_ATTR_RW(locator_led); static DEVICE_ATTR_RW(power_led); static DEVICE_ATTR_RW(master_led); @@ -1017,6 +1054,7 @@ static struct attribute *n3248te_cpld_attrs[] = { &dev_attr_psu0_status.attr, &dev_attr_psu1_status.attr, &dev_attr_system_led.attr, + &dev_attr_watchdog.attr, &dev_attr_locator_led.attr, &dev_attr_power_led.attr, &dev_attr_master_led.attr, diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/watchdog.py index ebd4706b4215..1e077e45d122 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/watchdog.py @@ -11,7 +11,6 @@ try: import ctypes - import subprocess from sonic_platform_base.watchdog_base import WatchdogBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -29,43 +28,53 @@ class Watchdog(WatchdogBase): Abstract base class for interfacing with a hardware watchdog module """ - TIMERS = [15,20,30,40,50,60,65,70] + TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240] armed_time = 0 timeout = 0 CLOCK_MONOTONIC = 1 def __init__(self): + WatchdogBase.__init__(self) self._librt = ctypes.CDLL('librt.so.1', use_errno=True) self._clock_gettime = self._librt.clock_gettime self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)] + self.watchdog_reg = "watchdog" - def _get_command_result(self, cmdline): + def _get_cpld_register(self, reg_name): + # On successful read, returns the value read from given + # reg name and on failure rethrns 'ERR' + cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name try: - proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - result = stdout.rstrip('\n') - except OSError: - result = None + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() + except IOError : return 'ERR' + return rv.strip('\r\n').lstrip(' ') - return result + def _set_cpld_register(self, reg_name, value): + # On successful write, returns the value will be written on + # reg_name and on failure returns 'ERR' + + cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" + cpld_reg_file = cpld_dir + '/' + reg_name + + try: + with open(cpld_reg_file, 'w') as fd: + rv = fd.write(str(value)) + except Exception: + rv = 'ERR' + + return rv def _get_reg_val(self): - # 0x31 = CPLD I2C Base Address - # 0x07 = Watchdog Function Register - value = self._get_command_result("/usr/sbin/i2cget -y 601 0x31 0x07") - if not value: - return None - else: - return int(value, 16) + value = self._get_cpld_register(self.watchdog_reg).strip() + if value == 'ERR': return False + + return int(value,16) def _set_reg_val(self,val): - # 0x31 = CPLD I2C Base Address - # 0x07 = Watchdog Function Register - value = self._get_command_result("/usr/sbin/i2cset -y 601 0x31 0x07 %s" - % (val)) + value = self._set_cpld_register(self.watchdog_reg, val) return value def _get_time(self): @@ -93,7 +102,7 @@ def arm(self, seconds): """ timer_offset = -1 for key,timer_seconds in enumerate(self.TIMERS): - if seconds <= timer_seconds: + if seconds > 0 and seconds <= timer_seconds: timer_offset = key seconds = timer_seconds break @@ -101,41 +110,30 @@ def arm(self, seconds): if timer_offset == -1: return -1 - # Extracting 5th to 7th bits for WD timer values - # 000 - 15 sec - # 001 - 20 sec - # 010 - 30 sec - # 011 - 40 sec - # 100 - 50 sec - # 101 - 60 sec - # 110 - 65 sec - # 111 - 70 sec + # Extracting 5th to 8th bits for WD timer values reg_val = self._get_reg_val() - wd_timer_offset = (reg_val >> 4) & 0x7 + wd_timer_offset = (reg_val >> 4) & 0xF if wd_timer_offset != timer_offset: - # Setting 5th to 7th bits + # Setting 5th to 8th bits # value from timer_offset self.disarm() - self._set_reg_val(reg_val | (timer_offset << 4)) + self._set_reg_val((reg_val & 0x0F) | (timer_offset << 4)) if self.is_armed(): # Setting last bit to WD Timer punch # Last bit = WD Timer punch self._set_reg_val(reg_val & 0xFE) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds else: # Setting 4th bit to enable WD # 4th bit = Enable WD reg_val = self._get_reg_val() self._set_reg_val(reg_val | 0x8) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds + self.armed_time = self._get_time() + self.timeout = seconds + return seconds def disarm(self): """ @@ -183,7 +181,7 @@ def get_remaining_time(self): their watchdog timer. If the watchdog is not armed, returns -1. - S5232 doesnot have hardware support to show remaining time. + N3248PXE doesnot have hardware support to show remaining time. Due to this limitation, this API is implemented in software. This API would return correct software time difference if it is called from the process which armed the watchdog timer. @@ -207,4 +205,3 @@ def get_remaining_time(self): return self.timeout - diff_time return 0 - From a9e86c3b82a0e7d4fe5a77d1b685cf101a0806c6 Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 1 Apr 2022 20:04:31 +0530 Subject: [PATCH 156/817] DellEMC: N3248TE platform API2.0 changes (#10400) DellEMC: N3248TE platform API2.0 changes Why I did it N3248TE Platform API 2.0 changes How I did it Implemented the functional API's needed for Platform API 2.0 Added system_health_monitoring_config.json file How to verify it Used the API 2.0 test suite to validate the test cases. Co-authored-by: Arun LK --- .../system_health_monitoring_config.json | 11 ++++ .../n3248te/sonic_platform/chassis.py | 3 +- .../n3248te/sonic_platform/fan.py | 26 +++++++- .../n3248te/sonic_platform/psu.py | 6 +- .../n3248te/sonic_platform/sfp.py | 63 +++++++++++++++++-- 5 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 device/dell/x86_64-dellemc_n3248te_c3338-r0/system_health_monitoring_config.json diff --git a/device/dell/x86_64-dellemc_n3248te_c3338-r0/system_health_monitoring_config.json b/device/dell/x86_64-dellemc_n3248te_c3338-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..dc20d412147f --- /dev/null +++ b/device/dell/x86_64-dellemc_n3248te_c3338-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["fan.speed","psu.temperature","psu.voltage","asic"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault" : "blink_yellow", + "normal" : "green", + "booting": "blink_green" + } +} diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py index d2922eac1fa5..ddc254881ca3 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/chassis.py @@ -118,7 +118,8 @@ def _get_cpld_register(self, reg_name): # reg name and on failure rethrns 'ERR' cpld_reg_file = self.CPLD_DIR + '/' + reg_name try: - rv = open(cpld_reg_file, 'r').read() + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() except IOError : return 'ERR' return rv.strip('\r\n').lstrip(' ') diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py index ff8ea160b95d..e82dc91cc686 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/fan.py @@ -47,7 +47,8 @@ def _get_cpld_register(self, reg_name): cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" cpld_reg_file = cpld_dir + '/' + reg_name try: - buf = open(cpld_reg_file, 'r').read() + with open(cpld_reg_file, 'r')as fd: + buf = fd.read() except (IOError, AttributeError): return 'ERR' return buf.strip('\r\n').lstrip(' ') @@ -228,7 +229,26 @@ def set_status_led(self, color): Returns: bool: True if set success, False if fail. """ - # Fan tray status LED controlled by HW - # Return True to avoid thermalctld alarm + # N3248TE has led only on FanTray and not available for seperate fans return True + def get_status_led(self): + """ + Gets the current system LED color + + Returns: + A string that represents the supported color + """ + + return None + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + # Return current speed to avoid false thermalctld alarm. + return self.get_speed() + diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py index 617b2ce7f966..b2f06785f0dc 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py @@ -38,7 +38,8 @@ def _get_cpld_register(self, reg_name): cpld_dir = "/sys/devices/platform/dell-n3248te-cpld.0/" cpld_reg_file = cpld_dir + '/' + reg_name try: - rv = open(cpld_reg_file, 'r').read() + with open(cpld_reg_file, 'r') as fd: + rv = fd.read() except IOError : return 'ERR' return rv.strip('\r\n').lstrip(' ') @@ -46,7 +47,8 @@ def _get_dps_register(self, reg_name): try : dps_dir = self.dps_hwmon + '/' + os.listdir(self.dps_hwmon)[0] dps_reg_file = dps_dir + '/' + reg_name - rv = open(dps_reg_file, 'r').read() + with open(dps_reg_file, 'r') as fd: + rv = fd.read() except (IOError, OSError) : return 'ERR' return rv diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py index 0a30ae272d76..3a6b0a4cd4cc 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/sfp.py @@ -20,6 +20,22 @@ SFP_PORT_START = 49 SFP_PORT_END = 54 +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + +SFP_TYPE_LIST = [ + '0x3' # SFP/SFP+/SFP28 and later +] +QSFP_TYPE_LIST = [ + '0xc', # QSFP + '0xd', # QSFP+ or later + '0x11' # QSFP28 or later +] +QSFP_DD_TYPE_LIST = [ + '0x18' #QSFP_DD Type +] + class Sfp(SfpOptoeBase): """ DELLEMC Platform-specific Sfp class @@ -35,7 +51,7 @@ def get_eeprom_path(self): return self.eeprom_path def get_name(self): - return "SFP/SFP+/SFP28" + return "SFP/SFP+/SFP28" if self.index < 53 else "QSFP+ or later" def pci_mem_read(self, mm, offset): mm.seek(offset) @@ -70,7 +86,8 @@ def pci_get_value(self, resource, offset): def _get_cpld_register(self, reg): reg_file = '/sys/devices/platform/dell-n3248te-cpld.0/' + reg try: - rv = open(reg_file, 'r').read() + with open(reg_file, 'r') as fd: + rv = fd.read() except IOError : return 'ERR' return rv.strip('\r\n').lstrip(' ') @@ -109,7 +126,7 @@ def reset(self): """ Reset the SFP and returns all user settings to their default state """ - return True + return False def set_lpmode(self, lpmode): """ @@ -128,4 +145,42 @@ def get_max_port_power(self): """ Retrieves the maximumum power allowed on the port in watts """ - return 2.5 + return 5.0 if self.sfp_type == 'QSFP' else 2.5 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK From ddc269ac81178894ec053c15d13f33c881e1212c Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 1 Apr 2022 20:05:07 +0530 Subject: [PATCH 157/817] DellEMC: Added platform.json file for N3248TE (#9404) Why I did it Added platform.json file for N3248TE How I did it Defined the platform.json file with the required components under chassis. How to verify it validated the API 2.0 test suite Co-authored-by: Arun LK --- .../platform.json | 350 ++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 device/dell/x86_64-dellemc_n3248te_c3338-r0/platform.json diff --git a/device/dell/x86_64-dellemc_n3248te_c3338-r0/platform.json b/device/dell/x86_64-dellemc_n3248te_c3338-r0/platform.json new file mode 100644 index 000000000000..0bb2391ca3df --- /dev/null +++ b/device/dell/x86_64-dellemc_n3248te_c3338-r0/platform.json @@ -0,0 +1,350 @@ +{ + "chassis": { + "name": "N3248TE-ON", + "status_led": { + "controllable": true, + "colors": ["green", "blink_green", "yellow", "blink_yellow"] + }, + "thermal_manager" : false, + "components": [ + { + "name": "BIOS" + }, + { + "name": "CPU CPLD" + }, + { + "name": "SYS CPLD" + } + ], + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray2", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray2-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray3", + "status_led": { + "controllable": true, + "colors": ["off", "green", "yellow"] + }, + "fans": [ + { + "name": "FanTray3-Fan1", + "speed": { + "controllable":false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "PSU2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "Front Panel PHY Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Middle Fan Tray Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Near Front Panel Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Switch Near Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Switch Rear Temperature", + "controllable": false, + "low-crit-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + } + ], + "modules": [], + "sfps": [ + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "1GSFPCu" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "QSFP+ or later" + }, + { + "name": "QSFP+ or later" + } + ] + }, + "interfaces": {} +} From b39b7a3f2d6f8c2df0b7db5b385e189726e746b7 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Sat, 2 Apr 2022 00:55:04 +0800 Subject: [PATCH 158/817] [Accton/PDDF] Support pddf to as4630/as7816/as7326 (#10340) Why I did it Support pddf to as4630/as7816/as7326 How I did it Send needed file to the PR for these platform How to verify it Test sensors and show platform cmd. root@as7326-56x-3:/home/admin# show platform psustatus PSU Model Serial HW Rev Voltage (V) Current (A) Power (W) Status LED PSU 1 FSF045-611 FSF0451912000505 N/A 12.06 5.50 66.00 OK green PSU 2 FSF045-611 FSF0451912000568 N/A 12.00 5.50 66.00 OK green root@as7326-56x-3:/home/admin# sensors lm75-i2c-15-4a Adapter: i2c-1-mux (chan_id 6) Main Board Temperature: +35.5 C (high = +80.0 C, hyst = +75.0 C) lm75-i2c-15-4b Adapter: i2c-1-mux (chan_id 6) CPU Board Temperature: +29.0 C (high = +80.0 C, hyst = +75.0 C) fan_ctrl-i2c-11-66 Adapter: i2c-1-mux (chan_id 2) fan1: 9100 RPM fan2: 9400 RPM fan3: 9300 RPM fan4: 9600 RPM fan5: 9000 RPM fan6: 9100 RPM fan7: 9100 RPM fan8: 9300 RPM fan9: 9200 RPM fan10: 9400 RPM fan11: 9200 RPM fan12: 9400 RPM pch_haswell-virtual-0 Adapter: Virtual device temp1: +43.0 C psu_pmbus-i2c-17-59 Adapter: i2c-1-mux (chan_id 0) in3: +12.06 V fan1: 6272 RPM temp1: +37.0 C power2: 60.00 W curr2: +6.00 A lm75-i2c-15-49 Adapter: i2c-1-mux (chan_id 6) Main Board Temperature: +40.0 C (high = +80.0 C, hyst = +75.0 C) lm75-i2c-15-48 Adapter: i2c-1-mux (chan_id 6) Main Board Temperature: +39.0 C (high = +80.0 C, hyst = +75.0 C) psu_pmbus-i2c-13-5b Adapter: i2c-1-mux (chan_id 4) in3: +12.00 V fan1: 6144 RPM temp1: +36.0 C power2: 66.00 W curr2: +5.50 A coretemp-isa-0000 Adapter: ISA adapter Package id 0: +50.0 C (high = +82.0 C, crit = +104.0 C) Core 0: +50.0 C (high = +82.0 C, crit = +104.0 C) Core 1: +50.0 C (high = +82.0 C, crit = +104.0 C) Core 2: +50.0 C (high = +82.0 C, crit = +104.0 C) Core 3: +50.0 C (high = +82.0 C, crit = +104.0 C) Signed-off-by: Jostar Yang --- .../pddf/pd-plugin.json | 66 + .../x86_64-accton_as4630_54pe-r0/pddf_support | 0 .../pddf/pd-plugin.json | 67 + .../pddf/pddf-device.json | 2944 +++++++++++++++++ .../x86_64-accton_as7326_56x-r0/pddf_support | 0 .../pddf/pd-plugin.json | 2 +- .../pddf/pd-plugin.json | 64 + .../pddf/pddf-device.json | 22 +- .../x86_64-accton_as7816_64x-r0/pddf_support | 0 .../service/pddf-platform-init.service | 1 + .../as4630-54pe/sonic_platform_setup.py | 13 +- .../as7326-56x/modules/Makefile | 7 +- .../as7326-56x/modules/pddf_custom_psu.c | 206 ++ .../as7326-56x-pddf-platform-monitor.service | 16 + .../service/pddf-platform-init.service | 1 + .../as7326-56x/sonic_platform_setup.py | 9 +- .../utils/pddf_post_driver_install.sh | 23 + .../utils/pddf_post_driver_install.sh | 4 +- .../as7816-pddf-platform-monitor.service | 16 + .../service/pddf-platform-init.service | 1 + .../as7816-64x/sonic_platform_setup.py | 11 +- .../utils/pddf_post_driver_install.sh | 23 + .../utils/pddf_post_driver_install.sh | 4 +- .../sonic-platform-accton-as4630-54pe.install | 2 +- ...sonic-platform-accton-as4630-54pe.postinst | 8 + .../sonic-platform-accton-as7326-56x.install | 3 +- .../sonic-platform-accton-as7726-32x.postinst | 2 + .../sonic-platform-accton-as7816-64x.install | 3 +- 28 files changed, 3467 insertions(+), 51 deletions(-) create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/pddf_support create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pddf_support create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/pddf_support create mode 120000 platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/pddf_custom_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service create mode 120000 platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pddf_post_driver_install.sh create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service create mode 120000 platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pddf_post_driver_install.sh create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..0abf66aab7a5 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/pddf/pd-plugin.json @@ -0,0 +1,66 @@ +{ + "XCVR": + { + "xcvr_present": + { + "i2c": + { + "valmap-SFP28": {"1":true, "0":false }, + "valmap-QSFP28": {"1":true, "0":false} + } + } + }, + + "PSU": + { + "psu_present": + { + "i2c": + { + "valmap": { "1":true, "0":false } + } + }, + + "psu_power_good": + { + "i2c": + { + "valmap": { "1": true, "0":false } + } + }, + + "psu_fan_dir": + { + "i2c": + { + "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } + } + }, + + "PSU_FAN_MAX_SPEED":"18000" + }, + + "FAN": + { + "direction": + { + "i2c": + { + "valmap": {"1":"EXHAUST", "0":"INTAKE"} + } + }, + + "present": + { + "i2c": + { + "valmap": {"1":true, "0":false} + } + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100.0)/625)", + + "pwm_to_duty_cycle": "lambda pwm: ((pwm*625.0)/100)" + } + +} diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pddf_support b/device/accton/x86_64-accton_as4630_54pe-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..317cf23b7362 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pd-plugin.json @@ -0,0 +1,67 @@ +{ + + "XCVR": + { + "xcvr_present": + { + "i2c": + { + "valmap-SFP": {"1":true, "0":false }, + "valmap-SFP28": {"1":true, "0":false }, + "valmap-QSFP28": {"1":true, "0":false} + } + } + }, + "PSU": + { + "psu_present": + { + "i2c": + { + "valmap": { "1":true, "0":false } + } + }, + + "psu_power_good": + { + "i2c": + { + "valmap": { "1": true, "0":false } + } + }, + + "psu_fan_dir": + { + "i2c": + { + "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } + } + }, + + "PSU_FAN_MAX_SPEED":"18000" + }, + + "FAN": + { + "direction": + { + "i2c": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + } + }, + + "present": + { + "i2c": + { + "valmap": {"1":true, "0":false} + } + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 -1)", + + "pwm_to_duty_cycle": "lambda pwm: (((pwm+1)*625+75)/100)" + } + +} diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json new file mode 100644 index 000000000000..a8bd6d0c4043 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json @@ -0,0 +1,2944 @@ +{ + "PLATFORM": + { + "num_psus":2, + "num_fantrays":6, + "num_fans_pertray":2, + "num_ports":58, + "num_temps": 4, + "pddf_dev_types": + { + "description":"AS7326-56X - Below is the list of supported PDDF device types (chip names) for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom" + ], + "PORT_MODULE": + [ + "pddf_xcvr" + ] + }, + "std_kos": + [ + "i2c-i801", + "i2c_dev", + "i2c_mux_pca954x", + "optoe" + ], + "pddf_kos": + [ + "pddf_client_module", + "pddf_cpld_module", + "pddf_cpld_driver", + "pddf_mux_module", + "pddf_xcvr_module", + "pddf_xcvr_driver_module", + "pddf_psu_driver_module", + "pddf_psu_module", + "pddf_fan_driver_module", + "pddf_fan_module", + "pddf_led_module", + "pddf_sysstatus_module" + ], + "custom_kos": + [ + "pddf_custom_psu" + ] + }, + + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "CPU_CPLD"}, + {"dev": "MUX1"} + ] + } + }, + + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c04"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": [ + {"attr_name": "eeprom"} + ] + } + }, + + "CPU_CPLD": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPU_CPLD", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x65", "dev_type":"i2c_cpld"}, + "dev_attr": { } + } + }, + + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x1", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"MUX2" }, + { "chn":"0", "dev":"MUX3" }, + { "chn":"1", "dev":"MUX4" } + + ] + } + }, + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1", "dev_addr":"0x70", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x9", "idle_state":"-2"}, + "channel": + [ + { "chn":"2", "dev":"FAN-CTRL" }, + { "chn":"3", "dev":"CPLD2" }, + { "chn":"4", "dev":"PSU2" } , + { "chn":"6", "dev":"TEMP1" }, + { "chn":"6", "dev":"TEMP2" }, + { "chn":"6", "dev":"TEMP3" }, + { "chn":"6", "dev":"TEMP4" } + ] + } + }, + "MUX3": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x11", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PSU1" }, + { "chn":"1", "dev":"CPLD1" }, + { "chn":"2", "dev":"CPLD3" }, + { "chn":"5", "dev":"PORT57" }, + { "chn":"6", "dev":"PORT58" }, + { "chn":"7", "dev":"MUX11" } + ] + } + }, + "MUX4": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2", "dev_addr":"0x70", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x21", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"MUX5" }, + { "chn":"1", "dev":"MUX6" }, + { "chn":"2", "dev":"MUX7" }, + { "chn":"3", "dev":"MUX8" }, + { "chn":"4", "dev":"MUX9" }, + { "chn":"5", "dev":"MUX10" } + ] + } + }, + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"}, + { "itf":"eeprom", "dev":"PSU2-EEPROM" } + ] + } + }, + + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xd", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "PSU2-EEPROM": + { + "dev_info": { "device_type":"PSU-EEPROM", "device_name":"PSU2-EEPROM", "device_parent":"MUX2", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info":{ "parent_bus":"0xd", "dev_addr":"0x53", "dev_type":"psu_eeprom"}, + "attr_list": + [ + { "attr_name":"psu_model_name", "attr_devaddr":"0x53", "attr_devtype":"eeprom", "attr_offset":"0x15", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"11" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x53", "attr_devtype":"eeprom", "attr_offset":"0x2e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"17" } + + ] + } + }, + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX3" }, + "dev_attr": { "dev_idx":"1", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS"}, + { "itf":"eeprom", "dev":"PSU1-EEPROM" } + ] + } + }, + + "PSU1-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX3", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x59", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + "PSU1-EEPROM": + { + "dev_info": { "device_type":"PSU-EEPROM", "device_name":"PSU1-EEPROM", "device_parent":"MUX2", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x11", "dev_addr":"0x51", "dev_type":"psu_eeprom"}, + "attr_list": + [ + { "attr_name":"psu_model_name", "attr_devaddr":"0x51", "attr_devtype":"eeprom", "attr_offset":"0x15", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"11" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x51", "attr_devtype":"eeprom", "attr_offset":"0x2e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"17" } + ] + } + }, + "CPLD1": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x12", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, + "CPLD2": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD2", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xc", "dev_addr":"0x62", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, + "CPLD3": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD3", "device_parent":"MUX3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x13", "dev_addr":"0x64", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, + "TEMP1" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xf", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP2" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xf", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP3" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4A", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP4" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4B", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0xb", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, + "dev_attr": { "num_fantrays":"5"}, + "attr_list": + [ + { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan7_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan8_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan9_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan10_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan11_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan12_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0f", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan7_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan8_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan9_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan10_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan11_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan12_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan1_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan2_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan3_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan4_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan5_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan6_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan7_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan8_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan9_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan10_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan11_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan12_input", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan7_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan8_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan9_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan10_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan11_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" }, + { "attr_name":"fan12_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0xF", "attr_len":"1" } + ] + } + }, + "PORT57": + { + "dev_info": { "device_type":"SFP", "device_name":"PORT57", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"57"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT57-EEPROM" }, + { "itf":"control", "dev":"PORT57-CTRL" } + ] + } + }, + "PORT57-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT57-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT57"}, + "i2c": + { + "topo_info": { "parent_bus":"0x16", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT57-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT57-CTRL", "device_parent":"MUX3", "virt_parent":"PORT57"}, + "i2c": + { + "topo_info": { "parent_bus":"0x16", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1c", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT58": + { + "dev_info": { "device_type":"SFP", "device_name":"PORT58", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"58"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT58-EEPROM" }, + { "itf":"control", "dev":"PORT58-CTRL" } + ] + } + }, + "PORT58-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT58-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT58"}, + "i2c": + { + "topo_info": { "parent_bus":"0x17", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT58-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT58-CTRL", "device_parent":"MUX3", "virt_parent":"PORT58"}, + "i2c": + { + "topo_info": { "parent_bus":"0x17", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1c", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + "MUX5": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x21", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x29", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT2" }, + { "chn":"1", "dev":"PORT1" }, + { "chn":"2", "dev":"PORT4" }, + { "chn":"3", "dev":"PORT3" }, + { "chn":"4", "dev":"PORT6" }, + { "chn":"5", "dev":"PORT7" }, + { "chn":"6", "dev":"PORT5" }, + { "chn":"7", "dev":"PORT9" } + ] + } + }, + "MUX6": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x22", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x31", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT10" }, + { "chn":"1", "dev":"PORT8" }, + { "chn":"2", "dev":"PORT12" }, + { "chn":"3", "dev":"PORT11" }, + { "chn":"4", "dev":"PORT13" }, + { "chn":"5", "dev":"PORT16" }, + { "chn":"6", "dev":"PORT15" }, + { "chn":"7", "dev":"PORT14" } + ] + } + }, + "MUX7": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x23", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x39", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT18" }, + { "chn":"1", "dev":"PORT17" }, + { "chn":"2", "dev":"PORT20" }, + { "chn":"3", "dev":"PORT19" }, + { "chn":"4", "dev":"PORT21" }, + { "chn":"5", "dev":"PORT23" }, + { "chn":"6", "dev":"PORT22" }, + { "chn":"7", "dev":"PORT24" } + ] + } + }, + "MUX8": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX8", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x24", "dev_addr":"0x74", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x41", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT27" }, + { "chn":"1", "dev":"PORT25" }, + { "chn":"2", "dev":"PORT28" }, + { "chn":"3", "dev":"PORT26" }, + { "chn":"4", "dev":"PORT29" }, + { "chn":"5", "dev":"PORT32" }, + { "chn":"6", "dev":"PORT30" }, + { "chn":"7", "dev":"PORT31" } + ] + } + }, + "MUX9": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX9", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x25", "dev_addr":"0x75", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x49", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT34" }, + { "chn":"1", "dev":"PORT33" }, + { "chn":"2", "dev":"PORT36" }, + { "chn":"3", "dev":"PORT35" }, + { "chn":"4", "dev":"PORT37" }, + { "chn":"5", "dev":"PORT39" }, + { "chn":"6", "dev":"PORT38" }, + { "chn":"7", "dev":"PORT40" } + ] + } + }, + "MUX10": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX10", "device_parent":"MUX4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x26", "dev_addr":"0x76", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x51", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT41" }, + { "chn":"1", "dev":"PORT42" }, + { "chn":"2", "dev":"PORT45" }, + { "chn":"3", "dev":"PORT43" }, + { "chn":"4", "dev":"PORT44" }, + { "chn":"5", "dev":"PORT48" }, + { "chn":"6", "dev":"PORT46" }, + { "chn":"7", "dev":"PORT47" } + ] + } + }, + "MUX11": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX11", "device_parent":"MUX3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x18", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x19", "idle_state":"-2"}, + "channel": + [ + { "chn":"0", "dev":"PORT49" }, + { "chn":"1", "dev":"PORT50" }, + { "chn":"2", "dev":"PORT51" }, + { "chn":"3", "dev":"PORT52" }, + { "chn":"4", "dev":"PORT53" }, + { "chn":"5", "dev":"PORT54" }, + { "chn":"6", "dev":"PORT55" }, + { "chn":"7", "dev":"PORT56" } + ] + } + }, + + + + "PORT2": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT2", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"2"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT2-EEPROM" }, + { "itf":"control", "dev":"PORT2-CTRL" } + ] + } + }, + "PORT2-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT2-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x29", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT2-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT2-CTRL", "device_parent":"MUX5", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x29", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xb", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT1": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT1", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"1"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT1-EEPROM" }, + { "itf":"control", "dev":"PORT1-CTRL" } + ] + } + }, + "PORT1-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT1-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2a", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT1-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT1-CTRL", "device_parent":"MUX5", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xb", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + "PORT4": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT4", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"4"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT4-EEPROM" }, + { "itf":"control", "dev":"PORT4-CTRL" } + ] + } + }, + "PORT4-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT4-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2b", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT4-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT4-CTRL", "device_parent":"MUX5", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + "PORT3": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT3", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"3"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT3-EEPROM" }, + { "itf":"control", "dev":"PORT3-CTRL" } + ] + } + }, + "PORT3-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT3-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2c", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT3-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT3-CTRL", "device_parent":"MUX5", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT6": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT6", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"6"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT6-EEPROM" }, + { "itf":"control", "dev":"PORT6-CTRL" } + ] + } + }, + "PORT6-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT6-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2d", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT6-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT6-CTRL", "device_parent":"MUX5", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT7": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT7", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"7"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT7-EEPROM" }, + { "itf":"control", "dev":"PORT7-CTRL" } + ] + } + }, + "PORT7-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT7-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2e", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT7-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT7-CTRL", "device_parent":"MUX5", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + "PORT5": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT5", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"5"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT5-EEPROM" }, + { "itf":"control", "dev":"PORT5-CTRL" } + ] + } + }, + "PORT5-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT5-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2f", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT5-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT5-CTRL", "device_parent":"MUX5", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2","attr_offset":"0xB", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + "PORT9": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT9", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"9"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT9-EEPROM" }, + { "itf":"control", "dev":"PORT9-CTRL" } + ] + } + }, + "PORT9-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT9-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT9-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT9-CTRL", "device_parent":"MUX5", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + "PORT10": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT10", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"10"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT10-EEPROM" }, + { "itf":"control", "dev":"PORT10-CTRL" } + ] + } + }, + "PORT10-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT10-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT10-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT10-CTRL", "device_parent":"MUX6", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld","attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT8": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT8", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"8"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT8-EEPROM" }, + { "itf":"control", "dev":"PORT8-CTRL" } + ] + } + }, + "PORT8-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT8-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT8-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT8-CTRL", "device_parent":"MUX6", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xF", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x3", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x7", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xB", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "PORT12": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT12", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"12"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT12-EEPROM" }, + { "itf":"control", "dev":"PORT12-CTRL" } + ] + } + }, + "PORT12-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT12-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT12-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT12-CTRL", "device_parent":"MUX6", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + "PORT11": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT11", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"11"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT11-EEPROM" }, + { "itf":"control", "dev":"PORT11-CTRL" } + ] + } + }, + "PORT11-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT11-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT11-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT11-CTRL", "device_parent":"MUX6", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT13": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT13", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"13"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT13-EEPROM" }, + { "itf":"control", "dev":"PORT13-CTRL" } + ] + } + }, + "PORT13-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT13-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT13-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT13-CTRL", "device_parent":"MUX6", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + "PORT16": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT16", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"16"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT16-EEPROM" }, + { "itf":"control", "dev":"PORT16-CTRL" } + ] + } + }, + "PORT16-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT16-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT16-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT16-CTRL", "device_parent":"MUX6", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "PORT15": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT15", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"15"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT15-EEPROM" }, + { "itf":"control", "dev":"PORT15-CTRL" } + ] + } + }, + "PORT15-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT15-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT15-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT15-CTRL", "device_parent":"MUX6", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + "PORT14": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT14", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"14"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT14-EEPROM" }, + { "itf":"control", "dev":"PORT14-CTRL" } + ] + } + }, + "PORT14-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT14-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x38", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT14-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT14-CTRL", "device_parent":"MUX6", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x38", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x4", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x8", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xC", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT18": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT18", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"18"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT18-EEPROM" }, + { "itf":"control", "dev":"PORT18-CTRL" } + ] + } + }, + "PORT18-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT18-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x39", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT18-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT18-CTRL", "device_parent":"MUX7", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x39", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + + "PORT17": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT17", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"17"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT17-EEPROM" }, + { "itf":"control", "dev":"PORT17-CTRL" } + ] + } + }, + "PORT17-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT17-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3a", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT17-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT17-CTRL", "device_parent":"MUX7", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + + "PORT20": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT20", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"20"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT20-EEPROM" }, + { "itf":"control", "dev":"PORT20-CTRL" } + ] + } + }, + "PORT20-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT20-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3b", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT20-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT20-CTRL", "device_parent":"MUX7", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + + "PORT19": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT19", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"19"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT19-EEPROM" }, + { "itf":"control", "dev":"PORT19-CTRL" } + ] + } + }, + "PORT19-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT19-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3c", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT19-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT19-CTRL", "device_parent":"MUX7", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + + "PORT21": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT21", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"21"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT21-EEPROM" }, + { "itf":"control", "dev":"PORT21-CTRL" } + ] + } + }, + "PORT21-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT21-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3d", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT21-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT21-CTRL", "device_parent":"MUX7", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + + "PORT23": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT23", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"23"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT23-EEPROM" }, + { "itf":"control", "dev":"PORT23-CTRL" } + ] + } + }, + "PORT23-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT23-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3e", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT23-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT23-CTRL", "device_parent":"MUX7", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + + "PORT22": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT22", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"22"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT22-EEPROM" }, + { "itf":"control", "dev":"PORT22-CTRL" } + ] + } + }, + "PORT22-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT22-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3f", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT22-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT22-CTRL", "device_parent":"MUX7", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x3f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT24": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT24", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"24"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT24-EEPROM" }, + { "itf":"control", "dev":"PORT24-CTRL" } + ] + } + }, + "PORT24-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT24-EEPROM", "device_parent":"MUX7", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT24-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT24-CTRL", "device_parent":"MUX7", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x5", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x9", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xD", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "PORT27": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT27", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"27"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT27-EEPROM" }, + { "itf":"control", "dev":"PORT27-CTRL" } + ] + } + }, + "PORT27-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT27-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT27-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT27-CTRL", "device_parent":"MUX8", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT25": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT25", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"25"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT25-EEPROM" }, + { "itf":"control", "dev":"PORT25-CTRL" } + ] + } + }, + "PORT25-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT25-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT25-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT25-CTRL", "device_parent":"MUX8", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + + "PORT28": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT28", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"28"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT28-EEPROM" }, + { "itf":"control", "dev":"PORT28-CTRL" } + ] + } + }, + "PORT28-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT28-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT28-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT28-CTRL", "device_parent":"MUX8", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + "PORT26": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT26", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"26"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT26-EEPROM" }, + { "itf":"control", "dev":"PORT26-CTRL" } + ] + } + }, + "PORT26-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT26-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT26-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT26-CTRL", "device_parent":"MUX8", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT29": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT29", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"29"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT29-EEPROM" }, + { "itf":"control", "dev":"PORT29-CTRL" } + ] + } + }, + "PORT29-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT29-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT29-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT29-CTRL", "device_parent":"MUX8", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + + "PORT32": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT32", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"32"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT32-EEPROM" }, + { "itf":"control", "dev":"PORT32-CTRL" } + ] + } + }, + "PORT32-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT32-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT32-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT32-CTRL", "device_parent":"MUX8", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT30": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT30", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"30"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT30-EEPROM" }, + { "itf":"control", "dev":"PORT30-CTRL" } + ] + } + }, + "PORT30-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT30-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT30-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT30-CTRL", "device_parent":"MUX8", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x12", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0x6", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xA", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x62", "attr_devtype":"cpld", "attr_devname":"CPLD2", "attr_offset":"0xE", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + + "PORT31": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT31", "device_parent":"MUX8"}, + "dev_attr": { "dev_idx":"31"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT31-EEPROM" }, + { "itf":"control", "dev":"PORT31-CTRL" } + ] + } + }, + "PORT31-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT31-EEPROM", "device_parent":"MUX8", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x48", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT31-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT31-CTRL", "device_parent":"MUX8", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x48", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + + "PORT34": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT34", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"34"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT34-EEPROM" }, + { "itf":"control", "dev":"PORT34-CTRL" } + ] + } + }, + "PORT34-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT34-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT34"}, + "i2c": + { + "topo_info": { "parent_bus":"0x49", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT34-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT34-CTRL", "device_parent":"MUX9", "virt_parent":"PORT34"}, + "i2c": + { + "topo_info": { "parent_bus":"0x49", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + + "PORT33": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT33", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"33"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT33-EEPROM" }, + { "itf":"control", "dev":"PORT33-CTRL" } + ] + } + }, + "PORT33-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT33-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT33"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4a", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT33-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT33-CTRL", "device_parent":"MUX9", "virt_parent":"PORT33"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + + "PORT36": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT36", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"36"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT36-EEPROM" }, + { "itf":"control", "dev":"PORT36-CTRL" } + ] + } + }, + "PORT36-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT36-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT36"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4b", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT36-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT36-CTRL", "device_parent":"MUX9", "virt_parent":"PORT36"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + + "PORT35": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT35", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"35"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT35-EEPROM" }, + { "itf":"control", "dev":"PORT35-CTRL" } + ] + } + }, + "PORT35-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT35-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT35"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4c", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT35-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT35-CTRL", "device_parent":"MUX9", "virt_parent":"PORT35"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + + "PORT37": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT37", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"37"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT37-EEPROM" }, + { "itf":"control", "dev":"PORT37-CTRL" } + ] + } + }, + "PORT37-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT37-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT37"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4d", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT37-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT37-CTRL", "device_parent":"MUX9", "virt_parent":"PORT37"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + + "PORT39": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT39", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"39"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT39-EEPROM" }, + { "itf":"control", "dev":"PORT39-CTRL" } + ] + } + }, + "PORT39-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT39-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT39"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4e", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT39-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT39-CTRL", "device_parent":"MUX9", "virt_parent":"PORT39"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + + "PORT38": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT38", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"38"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT38-EEPROM" }, + { "itf":"control", "dev":"PORT38-CTRL" } + ] + } + }, + "PORT38-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT38-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT38"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4f", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT38-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT38-CTRL", "device_parent":"MUX9", "virt_parent":"PORT38"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1A", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x14", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x17", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + + "PORT40": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT40", "device_parent":"MUX9"}, + "dev_attr": { "dev_idx":"40"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT40-EEPROM" }, + { "itf":"control", "dev":"PORT40-CTRL" } + ] + } + }, + "PORT40-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT40-EEPROM", "device_parent":"MUX9", "virt_parent":"PORT40"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT40-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT40-CTRL", "device_parent":"MUX9", "virt_parent":"PORT40"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT41": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT41", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"41"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT41-EEPROM" }, + { "itf":"control", "dev":"PORT41-CTRL" } + ] + } + }, + "PORT41-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT41-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT41"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT41-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT41-CTRL", "device_parent":"MUX10", "virt_parent":"PORT41"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT42": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT42", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"42"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT42-EEPROM" }, + { "itf":"control", "dev":"PORT42-CTRL" } + ] + } + }, + "PORT42-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT42-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT42"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT42-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT42-CTRL", "device_parent":"MUX10", "virt_parent":"PORT42"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + ] + } + }, + "PORT45": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT45", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"45"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT45-EEPROM" }, + { "itf":"control", "dev":"PORT45-CTRL" } + ] + } + }, + "PORT45-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT45-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT45"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT45-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT45-CTRL", "device_parent":"MUX10", "virt_parent":"PORT45"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + "PORT43": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT43", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"43"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT43-EEPROM" }, + { "itf":"control", "dev":"PORT43-CTRL" } + ] + } + }, + "PORT43-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT43-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT43"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT43-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT43-CTRL", "device_parent":"MUX10", "virt_parent":"PORT43"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + ] + } + }, + "PORT44": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT44", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"44"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT44-EEPROM" }, + { "itf":"control", "dev":"PORT44-CTRL" } + ] + } + }, + "PORT44-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT44-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT44"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT44-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT44-CTRL", "device_parent":"MUX10", "virt_parent":"PORT44"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1B", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1","attr_offset":"0x15", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x18", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT48": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT48", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"48"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT48-EEPROM" }, + { "itf":"control", "dev":"PORT48-CTRL" } + ] + } + }, + "PORT48-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT48-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT48"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT48-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT48-CTRL", "device_parent":"MUX10", "virt_parent":"PORT48"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1C", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + ] + } + }, + "PORT46": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT46", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"46"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT46-EEPROM" }, + { "itf":"control", "dev":"PORT46-CTRL" } + ] + } + }, + "PORT46-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT46-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT46"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT46-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT46-CTRL", "device_parent":"MUX10", "virt_parent":"PORT46"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1","attr_offset":"0x1B", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0x15", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1","attr_offset":"0x18", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "PORT47": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT47", "device_parent":"MUX10"}, + "dev_attr": { "dev_idx":"47"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT47-EEPROM" }, + { "itf":"control", "dev":"PORT47-CTRL" } + ] + } + }, + "PORT47-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT47-EEPROM", "device_parent":"MUX10", "virt_parent":"PORT47"}, + "i2c": + { + "topo_info": { "parent_bus":"0x58", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT47-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT47-CTRL", "device_parent":"MUX10", "virt_parent":"PORT47"}, + "i2c": + { + "topo_info": { "parent_bus":"0x58", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1C", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x16", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x19", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + + "PORT49": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT49", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"49"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT49-EEPROM" }, + { "itf":"control", "dev":"PORT49-CTRL" } + ] + } + }, + "PORT49-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT49-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0x19", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT49-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT49-CTRL", "device_parent":"MUX11", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0x19", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT50": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT50", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"50"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT50-EEPROM" }, + { "itf":"control", "dev":"PORT50-CTRL" } + ] + } + }, + "PORT50-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT50-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1a", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT50-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT50-CTRL", "device_parent":"MUX11", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1a", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT51": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT51", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"51"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT51-EEPROM" }, + { "itf":"control", "dev":"PORT51-CTRL" } + ] + } + }, + "PORT51-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT51-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1b", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT51-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT51-CTRL", "device_parent":"MUX11", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1b", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT52": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT52", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"52"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT52-EEPROM" }, + { "itf":"control", "dev":"PORT52-CTRL" } + ] + } + }, + "PORT52-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT52-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1c", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT52-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT52-CTRL", "device_parent":"MUX11", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1c", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT53": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT53", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"53"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT53-EEPROM" }, + { "itf":"control", "dev":"PORT53-CTRL" } + ] + } + }, + "PORT53-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT53-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1d", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT53-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT53-CTRL", "device_parent":"MUX11", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1d", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT54": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT54", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"54"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT54-EEPROM" }, + { "itf":"control", "dev":"PORT54-CTRL" } + ] + } + }, + "PORT54-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT54-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1e", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT54-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT54-CTRL", "device_parent":"MUX11", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1e", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT55": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT55", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"55"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT55-EEPROM" }, + { "itf":"control", "dev":"PORT55-CTRL" } + ] + } + }, + "PORT55-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT55-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1f", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT55-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT55-CTRL", "device_parent":"MUX11", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1f", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + + "PORT56": + { + "dev_info": { "device_type":"QSFP28", "device_name":"PORT56", "device_parent":"MUX11"}, + "dev_attr": { "dev_idx":"56"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT56-EEPROM" }, + { "itf":"control", "dev":"PORT56-CTRL" } + ] + } + }, + "PORT56-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT56-EEPROM", "device_parent":"MUX11", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x20", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT56-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT56-CTRL", "device_parent":"MUX11", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x20", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x13", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld","attr_devname":"CPLD1", "attr_offset":"0xA", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + + ] + } + }, + "LOC_LED": + { + "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : + { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_BLUE_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x27", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_GREEN_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x17", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_AMBER_BLINK", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_BLUE", "descr": "" , "bits" : "5:0", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_GREEN", "descr": "" , "bits" : "5:0", "value" : "0x5", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_AMBER", "descr": "" , "bits" : "5:0", "value" : "0x6", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"}, + {"attr_name":"STATUS_LED_COLOR_OFF", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x25"} + ] + } + }, + "DIAG_LED": + { + "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : + { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_BLUE_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x27", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_GREEN_BLINK", "descr": "" , "bits" : "5:0", "value" : "0x17", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_AMBER_BLINK", "descr": "" , "bits" : "5:0", "value" : "0xf", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_BLUE", "descr": "" , "bits" : "5:0", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_GREEN", "descr": "" , "bits" : "5:0", "value" : "0x5", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_AMBER", "descr": "" , "bits" : "5:0", "value" : "0x6", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"}, + {"attr_name":"STATUS_LED_COLOR_OFF", "descr": "" , "bits" : "5:0", "value" : "0x7", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x24"} + + ] + } + } +} diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf_support b/device/accton/x86_64-accton_as7326_56x-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json index 4d253635cc95..7df46b922ec3 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json @@ -48,7 +48,7 @@ "duty_cycle_to_pwm": "lambda dc: ((dc*100.0)/625 - 1)", - "pwm_to_duty_cycle": "lambda pwm: math.ceil(((pwm+1)*625.0)/100)" + "pwm_to_duty_cycle": "lambda pwm: (((pwm+1)*625.0)/100)" } } diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..eae22f99e394 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pd-plugin.json @@ -0,0 +1,64 @@ +{ + + "XCVR": + { + "xcvr_present": + { + "i2c": + { + "valmap-QSFP28": {"1":true, "0":false} + } + } + }, + "PSU": + { + "psu_present": + { + "i2c": + { + "valmap": { "1":true, "0":false } + } + }, + + "psu_power_good": + { + "i2c": + { + "valmap": { "1": true, "0":false } + } + }, + + "psu_fan_dir": + { + "i2c": + { + "valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" } + } + }, + + "PSU_FAN_MAX_SPEED":"18000" + }, + + "FAN": + { + "direction": + { + "i2c": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + } + }, + + "present": + { + "i2c": + { + "valmap": {"1":true, "0":false} + } + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc - 10) / 6)", + "pwm_to_duty_cycle": "lambda pwm: ( (pwm * 6) + 10)" + } + +} diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json index 12d6c3a115e2..27d181da1829 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json @@ -114,7 +114,7 @@ "i2c": { "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x1"}, + "dev_attr": { "virt_bus":"0x1", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"MUX2" }, @@ -137,7 +137,7 @@ "i2c": { "topo_info": { "parent_bus":"0x1", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x9"}, + "dev_attr": { "virt_bus":"0x9", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PSU2"}, @@ -249,7 +249,7 @@ "i2c": { "topo_info": { "parent_bus":"0x1", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x11"}, + "dev_attr": { "virt_bus":"0x11", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"TEMP1" }, @@ -464,7 +464,7 @@ "i2c": { "topo_info": { "parent_bus":"0x1", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x19"}, + "dev_attr": { "virt_bus":"0x19", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT61" }, @@ -484,7 +484,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x70", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x21"}, + "dev_attr": { "virt_bus":"0x21", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT9" }, @@ -504,7 +504,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x29"}, + "dev_attr": { "virt_bus":"0x29", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT6" }, @@ -524,7 +524,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x31"}, + "dev_attr": { "virt_bus":"0x31", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT17" }, @@ -544,7 +544,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x39"}, + "dev_attr": { "virt_bus":"0x39", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT29" }, @@ -564,7 +564,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x74", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x41"}, + "dev_attr": { "virt_bus":"0x41", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT41" }, @@ -584,7 +584,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x75", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x49"}, + "dev_attr": { "virt_bus":"0x49", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT45" }, @@ -604,7 +604,7 @@ "i2c": { "topo_info": { "parent_bus":"0x2", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x51"}, + "dev_attr": { "virt_bus":"0x51", "idle_state":"-2"}, "channel": [ { "chn":"0", "dev":"PORT57" }, diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf_support b/device/accton/x86_64-accton_as7816_64x-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py index 553325484a92..59dad237f3b4 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as4630-54pe/sonic_platform_setup.py @@ -1,23 +1,14 @@ from setuptools import setup -DEVICE_NAME = 'accton' -HW_SKU = 'x86_64-accton_as4630_54pe-r0' - setup( name='sonic-platform', version='1.0', - description='SONiC platform API implementation on Accton Platforms', + description='SONiC platform API implementation on Accton Platforms using PDDF', license='Apache 2.0', author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - maintainer='Jostar Yang', - maintainer_email='jostar_yang@edge-core.com', - packages=[ - 'sonic_platform', - ], - package_dir={ - 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + packages=['sonic_platform'], classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/Makefile index 85c066571c2f..6789630def0b 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/Makefile @@ -1,7 +1,12 @@ ifneq ($(KERNELRELEASE),) obj-m:= accton_i2c_cpld.o \ accton_as7326_56x_fan.o accton_as7326_56x_leds.o \ - accton_as7326_56x_psu.o ym2651y.o + accton_as7326_56x_psu.o ym2651y.o \ + pddf_custom_psu.o + + +CFLAGS_pddf_custom_psu.o := -I$(M)/../../../../pddf/i2c/modules/include +KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF else ifeq (,$(KERNEL_SRC)) diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/pddf_custom_psu.c b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/pddf_custom_psu.c new file mode 100644 index 000000000000..18c3edf72a8c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/modules/pddf_custom_psu.c @@ -0,0 +1,206 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_psu_defs.h" + +ssize_t pddf_get_custom_psu_model_name(struct device *dev, struct device_attribute *da, char *buf); +ssize_t pddf_get_custom_psu_serial_num(struct device *dev, struct device_attribute *da, char *buf); +extern PSU_SYSFS_ATTR_DATA access_psu_model_name; +extern PSU_SYSFS_ATTR_DATA access_psu_serial_num; + +#define MAX_MODEL_NAME 16 +#define MAX_SERIAL_NUMBER 19 + +enum psu_type { + PSU_TYPE_AC_110V, + PSU_TYPE_DC_48V, + PSU_TYPE_DC_12V, + PSU_TYPE_AC_ACBEL_FSF019, + PSU_TYPE_AC_ACBEL_FSF045 +}; + +struct model_name_info { + enum psu_type type; + u8 offset; + u8 length; + u8 chk_length; + char* model_name; +}; + +struct serial_number_info { + enum psu_type type; + u8 offset; + u8 length; + u8 chk_length; + char* serial_number; +}; + +struct model_name_info models[] = { +{PSU_TYPE_AC_110V, 0x20, 8, 8, "YM-2651Y"}, +{PSU_TYPE_DC_48V, 0x20, 8, 8, "YM-2651V"}, +{PSU_TYPE_DC_12V, 0x00, 11, 11, "PSU-12V-750"}, +{PSU_TYPE_AC_ACBEL_FSF019, 0x15, 10, 7, "FSF019-"}, +{PSU_TYPE_AC_ACBEL_FSF045, 0x15, 10, 7, "FSF045-"} + +}; + +struct serial_number_info serials[] = { +{PSU_TYPE_AC_110V, 0x2e, 18, 18, "YM-2651Y"}, +{PSU_TYPE_DC_48V, 0x2e, 18, 18, "YM-2651V"}, +{PSU_TYPE_DC_12V, 0x2e, 18, 18, "PSU-12V-750"}, +{PSU_TYPE_AC_ACBEL_FSF019, 0x2e, 16, 16, "FSF019-"}, +{PSU_TYPE_AC_ACBEL_FSF019, 0x2e, 16, 16, "FSF045-"} + +}; + +struct pddf_psu_data { + char model_name[MAX_MODEL_NAME+1]; + char serial_number[MAX_SERIAL_NUMBER+1]; +}; + + +static int pddf_psu_read_block(struct i2c_client *client, u8 command, u8 *data, + int data_len) +{ + int result = 0; + int retry_count = 10; + + while (retry_count) { + retry_count--; + + result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); + + if (unlikely(result < 0)) { + msleep(10); + continue; + } + + if (unlikely(result != data_len)) { + result = -EIO; + msleep(10); + continue; + } + + result = 0; + break; + } + + return result; +} + +ssize_t pddf_get_custom_psu_serial_num(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct pddf_psu_data data; + int i, status; + + for (i = 0; i < ARRAY_SIZE(models); i++) { + memset(data.serial_number, 0, sizeof(data.serial_number)); + + status = pddf_psu_read_block(client, models[i].offset, + data.model_name, models[i].length); + if (status < 0) { + data.model_name[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n", + client->addr, models[i].offset); + return status; + } + else { + data.model_name[models[i].length] = '\0'; + } + + /* Determine if the model name is known, if not, read next index + */ + if (strncmp(data.model_name, models[i].model_name, models[i].chk_length) == 0) { + status = pddf_psu_read_block(client, serials[i].offset, + data.serial_number, serials[i].length); + + if (status < 0) { + data.serial_number[0] = '\0'; + dev_dbg(&client->dev, "unable to read serial num from (0x%x) offset(0x%x)\n", + client->addr, serials[i].offset); + return status; + } + else { + data.serial_number[serials[i].length] = '\0'; + return sprintf(buf, "%s\n", data.serial_number); + } + + return 0; + } + else { + data.serial_number[0] = '\0'; + } + } + + return -ENODATA; + + +} + +ssize_t pddf_get_custom_psu_model_name(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct pddf_psu_data data; + int i, status; + + for (i = 0; i < ARRAY_SIZE(models); i++) { + memset(data.model_name, 0, sizeof(data.model_name)); + + status = pddf_psu_read_block(client, models[i].offset, + data.model_name, models[i].length); + if (status < 0) { + data.model_name[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n", + client->addr, models[i].offset); + return status; + } + else { + data.model_name[models[i].length] = '\0'; + } + + /* Determine if the model name is known, if not, read next index + */ + if (strncmp(data.model_name, models[i].model_name, models[i].chk_length) == 0) { + return sprintf(buf, "%s\n", data.model_name); + } + else { + data.model_name[0] = '\0'; + } + } + + return -ENODATA; + +} + +static int __init pddf_custom_psu_init(void) +{ + access_psu_serial_num.show = pddf_get_custom_psu_serial_num; + access_psu_serial_num.do_get = NULL; + + access_psu_model_name.show = pddf_get_custom_psu_model_name; + access_psu_model_name.do_get = NULL; + + return 0; +} + +static void __exit pddf_custom_psu_exit(void) +{ + return; +} + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("pddf custom psu api"); +MODULE_LICENSE("GPL"); + +module_init(pddf_custom_psu_init); +module_exit(pddf_custom_psu_exit); + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service new file mode 100644 index 000000000000..03351824b7b4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/as7326-56x-pddf-platform-monitor.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton AS7326-56X Platform Monitoring service +Before=pmon.service +After=pddf-platform-init.service +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/accton_as7326_pddf_monitor.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py index 15806d24fff0..22bd354ea686 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/sonic_platform_setup.py @@ -1,8 +1,5 @@ from setuptools import setup -DEVICE_NAME = 'accton' -HW_SKU = 'x86_64-accton_as7326_56x-r0' - setup( name='sonic-platform', version='1.0', @@ -11,11 +8,7 @@ author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - packages=[ - 'sonic_platform' - ], - package_dir={ - 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + packages=['sonic_platform'], classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..b2dc4ded1f6d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7326-56x/utils/pddf_post_driver_install.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +dis_i2c_ir3570a() +{ + local addr=$1 + + i2cset -y -a 0 $addr 0xE5 0x01 &>/dev/null + i2cset -y -a 0 $addr 0x12 0x02 &>/dev/null +} + + +ir3570_check() +{ + dump=`i2cdump -y 0 0x42 s 0x9a |awk 'END {print $2}'` + if [ $dump -eq 24 ]; then + echo "Disabling i2c function of ir3570a" + dis_i2c_ir3570a 0x4 + fi +} + +ir3570_check + +echo "AS7326 post PDDF driver install completed" diff --git a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_post_driver_install.sh index c33f0b0c9797..484e5c976b4c 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_post_driver_install.sh +++ b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_post_driver_install.sh @@ -4,8 +4,8 @@ dis_i2c_ir3570a() { local addr=$1 - i2cset -y 0 $addr 0xE5 0x01 &>/dev/null - i2cset -y 0 $addr 0x12 0x02 &>/dev/null + i2cset -y -a 0 $addr 0xE5 0x01 &>/dev/null + i2cset -y -a 0 $addr 0x12 0x02 &>/dev/null } diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service new file mode 100644 index 000000000000..7b6db7ddac01 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/as7816-pddf-platform-monitor.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton AS7816-64X Platform Monitoring service +Before=pmon.service +After=pddf-platform-init.service +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/accton_as7816_pddf_monitor.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service new file mode 120000 index 000000000000..0fd9f25b6c5e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/service/pddf-platform-init.service @@ -0,0 +1 @@ +../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py index 607a9ef78dd9..22bd354ea686 100644 --- a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/sonic_platform_setup.py @@ -1,8 +1,5 @@ from setuptools import setup -DEVICE_NAME = 'accton' -HW_SKU = 'x86_64-accton_as7816_64x-r0' - setup( name='sonic-platform', version='1.0', @@ -11,13 +8,7 @@ author='SONiC Team', author_email='linuxnetdev@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - maintainer='Jostar Yang', - maintainer_email='jostar_yang@edge-core.com', - packages=[ - 'sonic_platform', - ], - package_dir={ - 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + packages=['sonic_platform'], classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', diff --git a/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pddf_post_driver_install.sh new file mode 100755 index 000000000000..9783c323b606 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7816-64x/utils/pddf_post_driver_install.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +dis_i2c_ir3570a() +{ + local addr=$1 + + i2cset -y -a 0 $addr 0xE5 0x01 &>/dev/null + i2cset -y -a 0 $addr 0x12 0x02 &>/dev/null +} + + +ir3570_check() +{ + dump=`i2cdump -y 0 0x42 s 0x9a |awk 'END {print $2}'` + if [ $dump -eq 24 ]; then + echo "Disabling i2c function of ir3570a" + dis_i2c_ir3570a 0x4 + fi +} + +ir3570_check + +echo "AS7816 post PDDF driver install completed" diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh index 484a5f039c0f..61eb4c0fd5c7 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/utils/pddf_post_driver_install.sh @@ -4,8 +4,8 @@ dis_i2c_ir3570a() { local addr=$1 - i2cset -y 0 $addr 0xE5 0x01 &>/dev/null - i2cset -y 0 $addr 0x12 0x02 &>/dev/null + i2cset -y -a 0 $addr 0xE5 0x01 &>/dev/null + i2cset -y -a 0 $addr 0x12 0x02 &>/dev/null } diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install index a87ebb5b046a..4ba26bed2625 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.install @@ -1 +1 @@ -as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0 +as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst new file mode 100644 index 000000000000..23bebd3b295c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as4630-54pe.postinst @@ -0,0 +1,8 @@ +# Special arrangement to make PDDF mode default +# Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) +# Enable pddf-platform-monitor +depmod -a +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service +systemctl enable as4630-54pe-pddf-platform-monitor.service +systemctl start as4630-54pe-pddf-platform-monitor.service diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install index a6b7094e0e03..1d9885d22d27 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7326-56x.install @@ -1,2 +1 @@ -as7326-56x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7326_56x-r0 - +as7326-56x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7326_56x-r0/pddf diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7726-32x.postinst b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7726-32x.postinst index efe159144770..b1c403623c95 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7726-32x.postinst +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7726-32x.postinst @@ -2,6 +2,8 @@ # Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default) # Enable pddf-platform-monitor depmod -a +systemctl enable as7726-32x-platform-handle_mac.service +systemctl start as7726-32x-platform-handle_mac.service systemctl enable pddf-platform-init.service systemctl start pddf-platform-init.service systemctl enable as7726-32x-pddf-platform-monitor.service diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install index 8f214208a6b8..01b33cc19e54 100644 --- a/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install +++ b/platform/broadcom/sonic-platform-modules-accton/debian/sonic-platform-accton-as7816-64x.install @@ -1,2 +1 @@ -as7816-64x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7816_64x-r0 - +as7816-64x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as7816_64x-r0/pddf From 588ed0b760357ae2ba65f7789407730d2fc71ed4 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 1 Apr 2022 16:12:43 -0700 Subject: [PATCH 159/817] Upgrade router-advertiser container to Bullseye (#10374) Change the base image from `docker-config-engine-buster` to `docker-config-engine-bullseye`, and remove the hardcoded `radvd` version from the Dockerfile. Signed-off-by: Saikrishna Arcot --- dockers/docker-router-advertiser/Dockerfile.j2 | 4 ++-- rules/docker-router-advertiser.mk | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 index 7d225cbd4e79..44e2430077cb 100644 --- a/dockers/docker-router-advertiser/Dockerfile.j2 +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-bullseye ARG docker_container_name ARG image_version @@ -15,7 +15,7 @@ ENV IMAGE_VERSION=$image_version RUN apt-get update # Install radvd Debian package -RUN apt-get -y install radvd=1:2.17-2 +RUN apt-get -y install radvd {% if docker_router_advertiser_debs.strip() -%} # Copy built Debian packages diff --git a/rules/docker-router-advertiser.mk b/rules/docker-router-advertiser.mk index c2a5f9bf5d3c..6d5b9e4717bd 100644 --- a/rules/docker-router-advertiser.mk +++ b/rules/docker-router-advertiser.mk @@ -6,12 +6,12 @@ DOCKER_ROUTER_ADVERTISER_DBG = $(DOCKER_ROUTER_ADVERTISER_STEM)-$(DBG_IMAGE_MARK $(DOCKER_ROUTER_ADVERTISER)_PATH = $(DOCKERS_PATH)/$(DOCKER_ROUTER_ADVERTISER_STEM) -$(DOCKER_ROUTER_ADVERTISER)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_ROUTER_ADVERTISER)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_ROUTER_ADVERTISER)_DBG_DEPENDS += $(RADVD_DBG) -$(DOCKER_ROUTER_ADVERTISER)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_ROUTER_ADVERTISER)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_ROUTER_ADVERTISER)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_ROUTER_ADVERTISER)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_ROUTER_ADVERTISER)_VERSION = 1.0.0 $(DOCKER_ROUTER_ADVERTISER)_PACKAGE_NAME = radv @@ -29,6 +29,3 @@ $(DOCKER_ROUTER_ADVERTISER)_RUN_OPT += --privileged -t $(DOCKER_ROUTER_ADVERTISER)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ROUTER_ADVERTISER)_RUN_OPT += -v /usr/share/sonic/scripts:/usr/share/sonic/scripts:ro $(DOCKER_ROUTER_ADVERTISER)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) - -SONIC_BUSTER_DOCKERS += $(DOCKER_ROUTER_ADVERTISER) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_ROUTER_ADVERTISER_DBG) From a8f72e5d452edc85c441ef5e19125d4373de1664 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Sat, 2 Apr 2022 07:32:01 +0800 Subject: [PATCH 160/817] [yang] Update device_metadata to add dhcp_server (#10382) Why I did it dhcp_server is introduced, and need to update yang model. How I did it Update yang models and add unit test. How to verify it Run unit test for sonic-yang-models. Signed-off-by: Gang Lv ganglv@microsoft.com --- .../tests/files/sample_config_db.json | 3 ++- .../tests/device_metadata.json | 7 +++++++ .../tests_config/device_metadata.json | 18 ++++++++++++++++++ .../yang-models/sonic-device_metadata.yang | 5 +++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index d33cf20e2038..e40d75e8f2c5 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -304,7 +304,8 @@ "switch_id": "2", "switch_type": "voq", "max_cores": "8", - "sub_role": "FrondEnd" + "sub_role": "FrondEnd", + "dhcp_server": "disabled" } }, "VLAN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json index ecfff6f69a6f..7f0ddd38496f 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json @@ -103,6 +103,13 @@ }, "DEVICE_METADATA_VALID_SUB_ROLE_CONFIG": { "desc": "Verifying valid sub_role configuration." + }, + "DEVICE_METADATA_VALID_DHCP_SERVER": { + "desc": "Verifying dhcp_server configuration." + }, + "DEVICE_METADATA_INVALID_DHCP_SERVER": { + "desc": "Verifying invalid dhcp_server configuration.", + "eStrKey": "InvalidValue" } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json index de0d4e15dcee..a921e9ef41b2 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json @@ -283,5 +283,23 @@ } } } + }, + "DEVICE_METADATA_VALID_DHCP_SERVER": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "dhcp_server": "enabled" + } + } + } + }, + "DEVICE_METADATA_INVALID_DHCP_SERVER": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "dhcp_server": "invalid" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index 87170850d895..618ed19cd81f 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -183,6 +183,11 @@ module sonic-device_metadata { type uint8; description "Maximum number of cores in a VoQ Switch (chassis)."; } + + leaf dhcp_server { + type stypes:admin_mode; + description "Indicate whether enable the embedded DHCP server."; + } } /* end of container localhost */ } From 12cfb2b8f4faa442353f0b31600c6d2cd0460ba6 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Sat, 2 Apr 2022 07:48:44 +0800 Subject: [PATCH 161/817] [ci] Set default ACR in UpgrateVersion/PR/official pipeline. (#10341) Why I did it docker hub will limit the pull rate. Use ACR instead to pull debian related docker image. How I did it Set DEFAULT_CONTAINER_REGISTRY in pipeline. --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 7 +++++-- .azure-pipelines/docker-sonic-slave-template.yml | 5 ++++- .azure-pipelines/official-build.yml | 11 +++++++++++ .azure-pipelines/template-clean-sonic-slave.yml | 4 +++- .azure-pipelines/template-variables.yml | 2 ++ azure-pipelines.yml | 9 +++++++++ 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 .azure-pipelines/template-variables.yml diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 03593c551cff..6e11e3826e58 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -45,8 +45,11 @@ parameters: stages: - stage: Build variables: - CACHE_MODE: none - VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=' + - name: CACHE_MODE + value: none + - name: VERSION_CONTROL_OPTIONS + value: 'SONIC_VERSION_CONTROL_COMPONENTS=' + - template: .azure-pipelines/template-variables.yml@buildimage jobs: - template: azure-pipelines-build.yml parameters: diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 6b4b90f371d9..2a9421dda338 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -37,7 +37,10 @@ jobs: pool: ${{ parameters.pool }} steps: - template: cleanup.yml - - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage + - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: + - template: template-clean-sonic-slave.yml + - ${{ else }}: + - template: .azure-pipelines/template-variables.yml@buildimage - checkout: self clean: true submodules: recursive diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml index f43c6521fc50..fb986cf67039 100644 --- a/.azure-pipelines/official-build.yml +++ b/.azure-pipelines/official-build.yml @@ -18,9 +18,20 @@ schedules: - 201911 - 201811 +resources: + repositories: + - repository: buildimage + type: github + name: Azure/sonic-buildimage + ref: master + endpoint: build + trigger: none pr: none +variables: +- template: .azure-pipelines/template-variables.yml@buildimage + stages: - stage: Build pool: sonicbld diff --git a/.azure-pipelines/template-clean-sonic-slave.yml b/.azure-pipelines/template-clean-sonic-slave.yml index c67f63fff476..ddb8c8e48f6a 100644 --- a/.azure-pipelines/template-clean-sonic-slave.yml +++ b/.azure-pipelines/template-clean-sonic-slave.yml @@ -1,8 +1,10 @@ steps: - script: | - containers=$(docker container ls -a | grep "sonic-slave" | awk '{ print $1 }') + set -x + containers=$(docker container ls -aq) [ -n "$containers" ] && docker container rm -f $containers docker images | grep "^" | awk '{print$3}' | xargs -i docker rmi {} images=$(docker images 'sonic-slave-*' -a -q) [ -n "$images" ] && docker rmi -f $images + exit 0 displayName: 'Cleanup sonic slave' diff --git a/.azure-pipelines/template-variables.yml b/.azure-pipelines/template-variables.yml new file mode 100644 index 000000000000..f28768e39efe --- /dev/null +++ b/.azure-pipelines/template-variables.yml @@ -0,0 +1,2 @@ +variables: + DEFAULT_CONTAINER_REGISTRY: 'publicmirror.azurecr.io' diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 557ce3beff82..27836a49b1ab 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -30,9 +30,18 @@ resources: type: github name: Azure/sonic-mgmt endpoint: build + - repository: buildimage + type: github + name: Azure/sonic-buildimage + endpoint: build + ref: master variables: - template: .azure-pipelines/azure-pipelines-repd-build-variables.yml +- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: + - template: .azure-pipelines/template-variables.yml +- ${{ else }}: + - template: .azure-pipelines/template-variables.yml@buildimage - name: CACHE_MODE value: rcache From 28939e95ef60e8894d81d23746807a007182ee22 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Sat, 2 Apr 2022 03:14:45 +0300 Subject: [PATCH 162/817] [submodule]: Advance sonic-swss-common and sonic-linkmgrd submodules (#10406) #### Why I did it To take the following into sonic-buildimage 36e1f61 API endpoints to ConfigDBConnector to support pre-loading data without blackout (#587) [sonic-swss-common](https://github.com/Azure/sonic-swss-common) ``` 36e1f61 API endpoints to ConfigDBConnector to support pre-loading data without blackout (#587) 556f4ad Add SAI copy action to ACL schema (#591) db18c3a Fix bitwidth of mac address in SAI ACL schema (#590) e9442bb [ConfigDBPipeConnector]: Added set_entry API (#586) 6c007c0 Update README for gmock (#562) ``` [sonic-linkmgrd](https://github.com/Azure/sonic-linkmgrd) ``` 83dfc99 Enforce uniform file/class naming convention (#52) 83004bf Shutdown ICMP heartbeats when default route state is missing and ToR is in `auto` mode (#44) b81ea31 Add `LinkProberStateMachineActiveActive` (#47) c43cf7a Decrease link probing interval after switchover to better determine the overhead of a toggle (#43) 2239fbe Enhance clang format (#46) ``` #### How I did it * Advanced submodules pointers #### How to verify it 1. make configure PLATFORM=mellanox 2. make target/sonic-mellanox.bin --- src/linkmgrd | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/linkmgrd b/src/linkmgrd index f00efefd3099..83dfc992d1b2 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit f00efefd30995de447fd6932369cb5be250ddf90 +Subproject commit 83dfc992d1b24b01bb9b125cc86a8ce63ba060f6 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 9eac0ae78093..36e1f61691df 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 9eac0ae7809350f38650ebb29456fe41a93bbf35 +Subproject commit 36e1f61691df7aa44782a377e4082cc4380f1018 From 8edc53462977accf1190822f9e19ed2d63ea712b Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Sat, 2 Apr 2022 13:53:40 +0800 Subject: [PATCH 163/817] Advance sonic-sairedis submodule (#10417) Signed-off-by: bingwang --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 1ccda8d1d982..473c99067c81 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 1ccda8d1d9821a65f73eb5c8f88f9abea0623c0b +Subproject commit 473c99067c8132f8e5b3f8f2abd672b474b42b5a From 1bf8bc6091d6e251da57bb3a7ac59c731f255003 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 2 Apr 2022 22:37:34 +0800 Subject: [PATCH 164/817] [ci] Fix the generating version file failure issue caused by artifacts folder change (#7464) (#10451) Fix the generating version file failure issue caused by artifacts folder change. When changing to use the same template for PR build, official build and packages version upgrade, the artifacts folder adding a "target" folder, the version upgrade task should be changed accordingly. --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 6e11e3826e58..35988f71b9b4 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -80,14 +80,14 @@ stages: default_platform=broadcom artifacts=$(find $(Pipeline.Workspace) -maxdepth 1 -type d -name 'sonic-buildimage.*' | grep -v "sonic-buildimage.${default_platform}") echo "artifacts$artifacts" - cp -r $(Pipeline.Workspace)/sonic-buildimage.${default_platform}/versions target/ + cp -r $(Pipeline.Workspace)/sonic-buildimage.${default_platform}/target/versions target/ make freeze FREEZE_VERSION_OPTIONS=-r find files/build/versions ordered_artifacts=$(echo "$artifacts" | grep -v -E "arm64|armhf" && echo "$artifacts" | grep -E "arm64|armhf") for artifact in $ordered_artifacts do rm -rf target/versions - cp -r $artifact/versions target/ + cp -r $artifact/target/versions target/ OPTIONS="-a -d" [[ "$artifact" == *arm64* || "$artifact" == *armhf* ]] && OPTIONS="-d" make freeze FREEZE_VERSION_OPTIONS="$OPTIONS" From 551dbfdcd2ba45e071f2d31d7af40ae79ee5415a Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 2 Apr 2022 23:07:10 +0800 Subject: [PATCH 165/817] [Security]: Enable hardening build options (#10369) [Security]: Enable hardening build options --- slave.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/slave.mk b/slave.mk index 641b732db64e..185574e61808 100644 --- a/slave.mk +++ b/slave.mk @@ -268,6 +268,11 @@ export SONIC_ROUTING_STACK export FRR_USER_UID export FRR_USER_GID +############################################################################### +## Build Options +############################################################################### +export DEB_BUILD_OPTIONS = hardening=+all + ############################################################################### ## Dumping key config attributes associated to current building exercise ############################################################################### From a5018e73a71ecc9f98b7eacf42b7e23a3312d507 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Sat, 2 Apr 2022 10:30:21 -0700 Subject: [PATCH 166/817] [Submodule update] sonic-py-swssdk (#10440) *[Submodule update] sonic-py-swssdk 78f167e4728f939712b3f3ea550949e2ea675fec With the changes in PR:https://github.com/Azure/sonic-buildimage/pull/5289 access to redis unix socket is given to the redis group members. Many of sonic-util commands (especially in multi-asic) case use redis unix socket to connect to DB and thus those comamnd fails without providing sudo. This PR is continuation of PR: https://github.com/Azure/sonic-buildimage/pull/7002 where we default to use TCP for Redis if user is not root Signed-off-by: Abhishek Dosi --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 96c05900fc6e..653bdba51750 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 96c05900fc6e4063c51e3f6256f8a8e765605be4 +Subproject commit 653bdba51750cac95feb3dd47904bf4de2353fec From e1c36dbfc111dc9dded6453bd33e29458daa6e83 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 4 Apr 2022 07:06:44 +0800 Subject: [PATCH 167/817] [Ci]: Fix an azp template syntax error (#10446) Why I did it [Ci]: Fix an azp template syntax error See https://dev.azure.com/mssonic/build/_build/results?buildId=86535&view=results /.azure-pipelines/docker-sonic-slave.yml (Line: 62, Col: 47): Expected a mapping --- .azure-pipelines/docker-sonic-slave.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index 8af6b8b3834f..a6a9750a3808 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -60,15 +60,15 @@ stages: - ${{ each dist in parameters.dists }}: - ${{ if endswith(variables['Build.DefinitionName'], dist) }}: - ${{ each arch in parameters.arches }}: - ${{ if eq(variables['System.PullRequest.TargetBranch'], 'master') }}: - - template: docker-sonic-slave-template.yml - parameters: - pool: sonicbld - arch: ${{ arch }} - dist: ${{ dist }} - ${{ else }}: - - template: .azure-pipelines/docker-sonic-slave-template.yml@buildimage - parameters: - pool: sonicbld - arch: ${{ arch }} - dist: ${{ dist }} + - ${{ if eq(variables['System.PullRequest.TargetBranch'], 'master') }}: + - template: docker-sonic-slave-template.yml + parameters: + pool: sonicbld + arch: ${{ arch }} + dist: ${{ dist }} + - ${{ else }}: + - template: .azure-pipelines/docker-sonic-slave-template.yml@buildimage + parameters: + pool: sonicbld + arch: ${{ arch }} + dist: ${{ dist }} From 13aa2332e8ed17dd905446440818cc130612a95a Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:55:33 +0800 Subject: [PATCH 168/817] [sonic-cfggen]: Update UT to add port lanes (#10362) Why I did it Need to run yang validation for sonic-cfggen unit test, and many unit test does not provide lanes for port table. How I did it Update port config file. How to verify it Run sonic-cfggen unit test, Use below PR to verify #10228 Signed-off-by: Gang Lv ganglv@microsoft.com --- .../multi_npu_data/sample_port_config.ini | 34 +++++++ src/sonic-config-engine/tests/test_cfggen.py | 98 ++++++++++--------- .../tests/test_cfggen_platformJson.py | 2 +- src/sonic-config-engine/tests/test_j2files.py | 10 +- .../tests/test_minigraph_case.py | 12 +-- .../tests/test_multinpu_cfggen.py | 95 +++++++++++------- 6 files changed, 155 insertions(+), 96 deletions(-) create mode 100644 src/sonic-config-engine/tests/multi_npu_data/sample_port_config.ini diff --git a/src/sonic-config-engine/tests/multi_npu_data/sample_port_config.ini b/src/sonic-config-engine/tests/multi_npu_data/sample_port_config.ini new file mode 100644 index 000000000000..d2cdb5fedd27 --- /dev/null +++ b/src/sonic-config-engine/tests/multi_npu_data/sample_port_config.ini @@ -0,0 +1,34 @@ +# name lanes alias index asic_port_name role +Ethernet0 33,34,35,36 Ethernet1/1 0 Eth0-ASIC0 Ext +Ethernet4 29,30,31,32 Ethernet1/2 1 Eth1-ASIC0 Ext +Ethernet8 41,42,43,44 Ethernet1/3 2 Eth2-ASIC0 Ext +Ethernet12 37,38,39,40 Ethernet1/4 3 Eth3-ASIC0 Ext +Ethernet-BP0 13,14,15,16 Eth4-ASIC0 4 Eth4-ASIC0 Int +Ethernet-BP4 17,18,19,20 Eth5-ASIC0 5 Eth5-ASIC0 Int +Ethernet-BP8 21,22,23,24 Eth6-ASIC0 6 Eth6-ASIC0 Int +Ethernet-BP12 25,26,27,28 Eth7-ASIC0 7 Eth7-ASIC0 Int +Ethernet16 33,34,35,36 Ethernet1/5 8 Eth0-ASIC1 Ext +Ethernet20 29,30,31,32 Ethernet1/6 9 Eth1-ASIC1 Ext +Ethernet24 41,42,43,44 Ethernet1/7 10 Eth2-ASIC1 Ext +Ethernet28 37,38,39,40 Ethernet1/8 11 Eth3-ASIC1 Ext +Ethernet-BP16 13,14,15,16 Eth4-ASIC1 12 Eth4-ASIC1 Int +Ethernet-BP20 17,18,19,20 Eth5-ASIC1 13 Eth5-ASIC1 Int +Ethernet-BP24 21,22,23,24 Eth6-ASIC1 14 Eth6-ASIC1 Int +Ethernet-BP28 25,26,27,28 Eth7-ASIC1 15 Eth7-ASIC1 Int +Ethernet-BP256 61,62,63,64 Eth0-ASIC2 16 Eth0-ASIC2 Int +Ethernet-BP260 57,58,59,60 Eth1-ASIC2 17 Eth1-ASIC2 Int +Ethernet-BP264 53,54,55,56 Eth2-ASIC2 18 Eth2-ASIC2 Int +Ethernet-BP268 49,50,51,52 Eth3-ASIC2 19 Eth3-ASIC2 Int +Ethernet-BP272 45,46,47,48 Eth4-ASIC2 20 Eth4-ASIC2 Int +Ethernet-BP276 41,42,43,44 Eth5-ASIC2 21 Eth5-ASIC2 Int +Ethernet-BP280 37,38,39,40 Eth6-ASIC2 22 Eth6-ASIC2 Int +Ethernet-BP284 33,34,35,36 Eth7-ASIC2 23 Eth7-ASIC2 Int +Ethernet-BP384 29,30,31,32 Eth0-ASIC3 24 Eth0-ASIC3 Int +Ethernet-BP388 25,26,27,28 Eth1-ASIC3 25 Eth1-ASIC3 Int +Ethernet-BP392 21,22,23,24 Eth2-ASIC3 26 Eth2-ASIC3 Int +Ethernet-BP396 17,18,19,20 Eth3-ASIC3 27 Eth3-ASIC3 Int +Ethernet-BP400 13,14,15,16 Eth4-ASIC3 28 Eth4-ASIC3 Int +Ethernet-BP404 9,10,11,12 Eth5-ASIC3 29 Eth5-ASIC3 Int +Ethernet-BP408 5,6,7,8 Eth6-ASIC3 30 Eth6-ASIC3 Int +Ethernet-BP412 1,2,3,4 Eth7-ASIC3 31 Eth7-ASIC3 Int + diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index c75c53b7f626..e5ef35274db7 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -83,44 +83,46 @@ def test_device_desc_mgmt_ip(self): self.assertEqual(output.strip(), "('eth0', '10.0.1.5/28')") def test_minigraph_hostname(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'hostname\']" -m "' + self.sample_graph + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hostname\']" -m "' + self.sample_graph + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'OCPSCH01040DDLF') def test_minigraph_sku(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-Z9100') def test_minigraph_region(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'region\']" -m "' + self.sample_graph_metadata + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'region\']" -m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'usfoo') def test_minigraph_cloudtype(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'cloudtype\']" -m "' + self.sample_graph_metadata + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'cloudtype\']" -m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Public') def test_minigraph_resourcetype(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'resource_type\']" -m "' + self.sample_graph_metadata + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'resource_type\']" -m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'resource_type_x') def test_minigraph_downstream_subrole(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'downstream_subrole\']" -m "' + self.sample_graph_metadata + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'downstream_subrole\']" -m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'downstream_subrole_y') def test_print_data(self): - argument = '-m "' + self.sample_graph + '" --print-data' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" --print-data' output = self.run_script(argument) self.assertTrue(len(output.strip()) > 0) - def test_jinja_expression(self, graph=None, expected_router_type='LeafRouter'): + def test_jinja_expression(self, graph=None, port_config=None, expected_router_type='LeafRouter'): if graph is None: graph = self.sample_graph - argument = '-m "' + graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' + if port_config is None: + port_config = self.port_config + argument = '-m "' + graph + '" -p "' + port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), expected_router_type) @@ -563,44 +565,44 @@ def test_minigraph_neighbor_interfaces(self): def test_minigraph_neighbor_interfaces_config_db(self): # test to check if PORT table is retrieved from config_db - argument = '-m "' + self.sample_graph_simple_case + '" -v "PORT"' + argument = '-m "' + self.sample_graph_simple_case + '" -p "' + self.port_config + '" -v "PORT"' output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), utils.to_dict( - "{'Ethernet0': {'lanes': '29,30,31,32', 'description': 'config_db:switch-01t1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/0', 'admin_status': 'up', 'speed': '10000', 'autoneg': 'on'}, " - "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'config_db:server1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'speed': '25000', 'autoneg': 'on', 'mux_cable': 'true'}, " + "{'Ethernet0': {'lanes': '29,30,31,32', 'description': 'switch-01t1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/0', 'admin_status': 'up', 'speed': '10000', 'autoneg': 'on'}, " + "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'server1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'speed': '25000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'speed': '40000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'speed': '10000', 'autoneg': 'on'}, " - "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'config_db:fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'config_db:fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'config_db:fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'config_db:fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'config_db:fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'config_db:fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'config_db:fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'config_db:fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'config_db:fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'config_db:fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'config_db:fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'config_db:fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'config_db:fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'config_db:fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'config_db:fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'config_db:fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'config_db:fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'config_db:fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'config_db:fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'config_db:fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'config_db:fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'config_db:fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'config_db:fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'config_db:fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'config_db:fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'config_db:fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'config_db:fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'config_db:fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100'}}" + "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100'}, " + "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100'}}" ) ) @@ -719,7 +721,7 @@ def test_minigraph_sub_port_no_vlan_member(self, check_stderr=True): else: output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (LEAF_ROUTER, BACKEND_LEAF_ROUTER, self.sample_graph), shell=True) - self.test_jinja_expression(self.sample_graph, BACKEND_LEAF_ROUTER) + self.test_jinja_expression(self.sample_graph, self.port_config, BACKEND_LEAF_ROUTER) self.verify_no_vlan_member() finally: print('\n Change device type back to %s' % (LEAF_ROUTER)) @@ -728,7 +730,7 @@ def test_minigraph_sub_port_no_vlan_member(self, check_stderr=True): else: output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (BACKEND_LEAF_ROUTER, LEAF_ROUTER, self.sample_graph), shell=True) - self.test_jinja_expression(self.sample_graph, LEAF_ROUTER) + self.test_jinja_expression(self.sample_graph, self.port_config, LEAF_ROUTER) def verify_no_vlan_member(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "VLAN_MEMBER"' @@ -745,7 +747,7 @@ def verify_sub_intf(self, **kwargs): else: output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (TOR_ROUTER, BACKEND_TOR_ROUTER, graph_file), shell=True) - self.test_jinja_expression(graph_file, BACKEND_TOR_ROUTER) + self.test_jinja_expression(graph_file, self.port_config, BACKEND_TOR_ROUTER) # INTERFACE table does not exist @@ -805,7 +807,7 @@ def verify_sub_intf(self, **kwargs): else: output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (BACKEND_TOR_ROUTER, TOR_ROUTER, graph_file), shell=True) - self.test_jinja_expression(graph_file, TOR_ROUTER) + self.test_jinja_expression(graph_file, self.port_config, TOR_ROUTER) def test_show_run_acl(self): argument = '-a \'{"key1":"value"}\' --var-json ACL_RULE' @@ -818,7 +820,7 @@ def test_show_run_interfaces(self): self.assertEqual(output, '') def test_minigraph_voq_metadata(self): - argument = "-m {} --var-json DEVICE_METADATA".format(self.sample_graph_voq) + argument = "-m {} -p {} --var-json DEVICE_METADATA".format(self.sample_graph_voq, self.voq_port_config) output = json.loads(self.run_script(argument)) self.assertEqual(output['localhost']['asic_name'], 'Asic0') self.assertEqual(output['localhost']['switch_id'], '0') @@ -826,7 +828,7 @@ def test_minigraph_voq_metadata(self): self.assertEqual(output['localhost']['max_cores'], '16') def test_minigraph_voq_system_ports(self): - argument = "-m {} --var-json SYSTEM_PORT".format(self.sample_graph_voq) + argument = "-m {} -p {} --var-json SYSTEM_PORT".format(self.sample_graph_voq, self.voq_port_config) self.assertDictEqual( json.loads(self.run_script(argument)), { @@ -845,7 +847,7 @@ def test_minigraph_voq_system_ports(self): ) def test_minigraph_voq_inband_interface_vlan(self): - argument = "-m {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq) + argument = "-m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( @@ -858,7 +860,7 @@ def test_minigraph_voq_inband_interface_vlan(self): ) def test_minigraph_voq_inband_interface_port(self): - argument = "-m {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq) + argument = "-m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( diff --git a/src/sonic-config-engine/tests/test_cfggen_platformJson.py b/src/sonic-config-engine/tests/test_cfggen_platformJson.py index fcfae855d0b5..0af361718b99 100644 --- a/src/sonic-config-engine/tests/test_cfggen_platformJson.py +++ b/src/sonic-config-engine/tests/test_cfggen_platformJson.py @@ -49,7 +49,7 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_print_data(self): - argument = '-m "' + self.platform_sample_graph + '" --print-data' + argument = '-m "' + self.platform_sample_graph + '" -p "' + self.platform_json + '" --print-data' output = self.run_script(argument) self.assertTrue(len(output.strip()) > 0) diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index b922ae45dbcf..da37bf8d18c6 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -44,11 +44,11 @@ def run_diff(self, file1, file2): def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') - argument = '-m ' + self.t0_minigraph + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces'), self.output_file)) - argument = '-m ' + self.t0_mvrf_minigraph + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + argument = '-m ' + self.t0_mvrf_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) @@ -326,16 +326,18 @@ def test_swss_switch_render_template(self): test_list = { "t1": { "graph": self.t1_mlnx_minigraph, + "port_config": self.mlnx_port_config, "output": "t1-switch.json" }, "t0": { "graph": self.t0_minigraph, + "port_config": self.t0_port_config, "output": "t0-switch.json" }, } for _, v in test_list.items(): - argument = " -m {} -y {} -t {} > {}".format( - v["graph"], constants_yml, switch_template, self.output_file + argument = " -m {} -p {} -y {} -t {} > {}".format( + v["graph"], v["port_config"], constants_yml, switch_template, self.output_file ) sample_output_file = os.path.join( self.test_dir, 'sample_output', v["output"] diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 7377498c7078..d18dd0499dab 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -45,27 +45,27 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_minigraph_sku(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '" -p "' + self.port_config + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-S6000') def test_print_data(self): - argument = '-m "' + self.sample_graph + '" --print-data' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" --print-data' output = self.run_script(argument) self.assertTrue(len(output.strip()) > 0) def test_jinja_expression(self): - argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'ToRRouter') def test_minigraph_subtype(self): - argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'subtype\']"' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'subtype\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'DualToR') def test_minigraph_peer_switch_hostname(self): - argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'peer_switch\']"' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'peer_switch\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'switch2-t0') @@ -157,7 +157,7 @@ def test_minigraph_portchannels(self): ) def test_minigraph_console_mgmt_feature(self): - argument = '-m "' + self.sample_graph + '" -v CONSOLE_SWITCH' + argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v CONSOLE_SWITCH' output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 8a79be743848..f39cc9dce1b8 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -25,6 +25,7 @@ def setUp(self): self.script_file = utils.PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') self.sample_graph = os.path.join(self.test_data_dir, 'sample-minigraph.xml') self.sample_graph1 = os.path.join(self.test_data_dir, 'sample-minigraph-noportchannel.xml') + self.sample_port_config = os.path.join(self.test_data_dir, 'sample_port_config.ini') self.port_config = [] for asic in range(NUM_ASIC): self.port_config.append(os.path.join(self.test_data_dir, "sample_port_config-{}.ini".format(asic))) @@ -80,19 +81,21 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_hwsku(self): - argument = "-v \"DEVICE_METADATA[\'localhost\'][\'hwsku\']\" -m \"{}\"".format(self.sample_graph) + argument = "-v \"DEVICE_METADATA[\'localhost\'][\'hwsku\']\" -m \"{}\" -p \"{}\"".format(self.sample_graph, self.sample_port_config) output = self.run_script(argument) self.assertEqual(output.strip(), SKU) + argument = "-v \"DEVICE_METADATA[\'localhost\'][\'hwsku\']\" -m \"{}\"".format(self.sample_graph) for asic in range(NUM_ASIC): - output = self.run_script_for_asic(argument, asic) + output = self.run_script_for_asic(argument, asic, self.port_config[asic]) self.assertEqual(output.strip(), SKU) def test_print_data(self): - argument = "-m \"{}\" --print-data".format(self.sample_graph) + argument = "-m \"{}\" -p \"{}\" --print-data".format(self.sample_graph, self.sample_port_config) output = self.run_script(argument) self.assertGreater(len(output.strip()) , 0) + argument = "-m \"{}\" --print-data".format(self.sample_graph) for asic in range(NUM_ASIC): - output = self.run_script_for_asic(argument, asic) + output = self.run_script_for_asic(argument, asic, self.port_config[asic]) self.assertGreater(len(output.strip()) , 0) def test_additional_json_data(self): @@ -100,7 +103,7 @@ def test_additional_json_data(self): output = self.run_script(argument) self.assertEqual(output.strip(), 'value1') for asic in range(NUM_ASIC): - output = self.run_script_for_asic(argument, asic) + output = self.run_script_for_asic(argument, asic, self.port_config[asic]) self.assertEqual(output.strip(), 'value1') def test_read_yaml(self): @@ -108,7 +111,7 @@ def test_read_yaml(self): output = yaml.load(self.run_script(argument)) self.assertListEqual(output, ['value1', 'value2']) for asic in range(NUM_ASIC): - output = yaml.load(self.run_script_for_asic(argument, asic)) + output = yaml.load(self.run_script_for_asic(argument, asic, self.port_config[asic])) self.assertListEqual(output, ['value1', 'value2']) def test_render_template(self): @@ -116,32 +119,35 @@ def test_render_template(self): output = self.run_script(argument) self.assertEqual(output.strip(), 'value1\nvalue2') for asic in range(NUM_ASIC): - output = self.run_script_for_asic(argument, asic) + output = self.run_script_for_asic(argument, asic, self.port_config[asic]) self.assertEqual(output.strip(), 'value1\nvalue2') def test_metadata_tacacs(self): - argument = '-m "' + self.sample_graph + '" --var-json "TACPLUS_SERVER"' + argument = '-m "' + self.sample_graph + '" -p "' + self.sample_port_config + '" --var-json "TACPLUS_SERVER"' output = json.loads(self.run_script(argument)) self.assertDictEqual(output, {'123.46.98.21': {'priority': '1', 'tcp_port': '49'}}) #TACPLUS_SERVER not present in the asic configuration. + argument = '-m "' + self.sample_graph + '" --var-json "TACPLUS_SERVER"' for asic in range(NUM_ASIC): output = json.loads(self.run_script_for_asic(argument, asic, self.port_config[asic])) self.assertDictEqual(output, {}) def test_metadata_ntp(self): - argument = '-m "' + self.sample_graph + '" --var-json "NTP_SERVER"' + argument = '-m "' + self.sample_graph + '" -p "' + self.sample_port_config + '" --var-json "NTP_SERVER"' output = json.loads(self.run_script(argument)) self.assertDictEqual(output, {'17.39.1.130': {}, '17.39.1.129': {}}) #NTP data is present only in the host config + argument = '-m "' + self.sample_graph + '" --var-json "NTP_SERVER"' for asic in range(NUM_ASIC): output = json.loads(self.run_script_for_asic(argument, asic, self.port_config[asic])) print("Log:asic{} sku {}".format(asic,output)) self.assertDictEqual(output, {}) def test_mgmt_port(self): - argument = '-m "' + self.sample_graph + '" --var-json "MGMT_PORT"' + argument = '-m "' + self.sample_graph + '" -p "' + self.sample_port_config + '" --var-json "MGMT_PORT"' output = json.loads(self.run_script(argument)) self.assertDictEqual(output, {'eth0': {'alias': 'eth0', 'admin_status': 'up'}}) + argument = '-m "' + self.sample_graph + '" --var-json "MGMT_PORT"' for asic in range(NUM_ASIC): output = json.loads(self.run_script_for_asic(argument, asic, self.port_config[asic])) self.assertDictEqual(output, {'eth0': {'alias': 'eth0', 'admin_status': 'up'}}) @@ -215,17 +221,17 @@ def test_frontend_asic_ports(self): "Ethernet-BP12": { "admin_status": "up", "alias": "Eth7-ASIC0", "asic_port_name": "Eth7-ASIC0", "description": "ASIC3:Eth1-ASIC3", "index": "3", "lanes": "25,26,27,28", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }}) def test_frontend_asic_ports_config_db(self): - argument = "-m {} -n asic0 --var-json \"PORT\"".format(self.sample_graph) + argument = "-m {} -p {} -n asic0 --var-json \"PORT\"".format(self.sample_graph, self.port_config[0]) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, - {"Ethernet0": { "admin_status": "up", "alias": "Ethernet1/1", "asic_port_name": "Eth0-ASIC0", "description": "01T2:Ethernet1:config_db", "index": "0", "lanes": "33,34,35,36", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000", "autoneg": "on" }, - "Ethernet4": { "admin_status": "up", "alias": "Ethernet1/2", "asic_port_name": "Eth1-ASIC0", "description": "01T2:Ethernet2:config_db", "index": "1", "lanes": "29,30,31,32", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000", "autoneg": "on" }, - "Ethernet8": { "admin_status": "up", "alias": "Ethernet1/3", "asic_port_name": "Eth2-ASIC0", "description": "Ethernet1/3:config_db", "index": "2", "lanes": "41,42,43,44", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000" }, - "Ethernet12": { "admin_status": "up", "alias": "Ethernet1/4", "asic_port_name": "Eth3-ASIC0", "description": "Ethernet1/4:config_db", "index": "3", "lanes": "37,38,39,40", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000" }, - "Ethernet-BP0": { "admin_status": "up", "alias": "Eth4-ASIC0", "asic_port_name": "Eth4-ASIC0", "description": "ASIC2:Eth0-ASIC2:config_db", "index": "0", "lanes": "13,14,15,16", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, - "Ethernet-BP4": { "admin_status": "up", "alias": "Eth5-ASIC0", "asic_port_name": "Eth5-ASIC0", "description": "ASIC2:Eth1-ASIC2:config_db", "index": "1", "lanes": "17,18,19,20", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, - "Ethernet-BP8": { "admin_status": "up", "alias": "Eth6-ASIC0", "asic_port_name": "Eth6-ASIC0", "description": "ASIC3:Eth0-ASIC3:config_db", "index": "2", "lanes": "21,22,23,24", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, - "Ethernet-BP12": { "admin_status": "up", "alias": "Eth7-ASIC0", "asic_port_name": "Eth7-ASIC0", "description": "ASIC3:Eth1-ASIC3:config_db", "index": "3", "lanes": "25,26,27,28", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }}) + {"Ethernet0": { "admin_status": "up", "alias": "Ethernet1/1", "asic_port_name": "Eth0-ASIC0", "description": "01T2:Ethernet1", "index": "0", "lanes": "33,34,35,36", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000", "autoneg": "on" }, + "Ethernet4": { "admin_status": "up", "alias": "Ethernet1/2", "asic_port_name": "Eth1-ASIC0", "description": "01T2:Ethernet2", "index": "1", "lanes": "29,30,31,32", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000", "autoneg": "on" }, + "Ethernet8": { "alias": "Ethernet1/3", "asic_port_name": "Eth2-ASIC0", "description": "Ethernet1/3", "index": "2", "lanes": "41,42,43,44", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000" }, + "Ethernet12": { "alias": "Ethernet1/4", "asic_port_name": "Eth3-ASIC0", "description": "Ethernet1/4", "index": "3", "lanes": "37,38,39,40", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Ext", "speed": "40000" }, + "Ethernet-BP0": { "admin_status": "up", "alias": "Eth4-ASIC0", "asic_port_name": "Eth4-ASIC0", "description": "ASIC2:Eth0-ASIC2", "index": "0", "lanes": "13,14,15,16", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, + "Ethernet-BP4": { "admin_status": "up", "alias": "Eth5-ASIC0", "asic_port_name": "Eth5-ASIC0", "description": "ASIC2:Eth1-ASIC2", "index": "1", "lanes": "17,18,19,20", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, + "Ethernet-BP8": { "admin_status": "up", "alias": "Eth6-ASIC0", "asic_port_name": "Eth6-ASIC0", "description": "ASIC3:Eth0-ASIC3", "index": "2", "lanes": "21,22,23,24", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }, + "Ethernet-BP12": { "admin_status": "up", "alias": "Eth7-ASIC0", "asic_port_name": "Eth7-ASIC0", "description": "ASIC3:Eth1-ASIC3", "index": "3", "lanes": "25,26,27,28", "mtu": "9100", "tpid": "0x8100", "pfc_asym": "off", "role": "Int", "speed": "40000" }}) def test_frontend_asic_device_neigh(self): argument = "-m {} -p {} -n asic0 --var-json \"DEVICE_NEIGHBOR\"".format(self.sample_graph, self.port_config[0]) @@ -270,7 +276,7 @@ def test_frontend_bgp_neighbor(self): 'fc00::2': {'rrclient': 0, 'name': '01T2', 'local_addr': 'fc00::1', 'nhopself': 0, 'holdtime': '10', 'asn': '65200', 'keepalive': '3'}}) def test_frontend_asic_bgp_neighbor(self): - argument = "-m {} -p {} -n asic0 --var-json \"BGP_INTERNAL_NEIGHBOR\"".format(self.sample_graph, self.port_config[3]) + argument = "-m {} -p {} -n asic0 --var-json \"BGP_INTERNAL_NEIGHBOR\"".format(self.sample_graph, self.port_config[0]) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, \ {'10.1.0.0': {'rrclient': 0, 'name': 'ASIC2', 'local_addr': '10.1.0.1', 'nhopself': 0, 'admin_status': 'up', 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}, @@ -297,23 +303,38 @@ def test_device_asic_metadata(self): self.assertEqual(output['localhost']['sub_role'], 'BackEnd') def test_global_asic_acl(self): - argument = "-m {} --var-json \"ACL_TABLE\"".format(self.sample_graph) + argument = "-m {} -p {} --var-json \"ACL_TABLE\"".format(self.sample_graph, self.sample_port_config) output = json.loads(self.run_script(argument)) - self.assertDictEqual(output, {\ - 'DATAACL': {'policy_desc': 'DATAACL', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'L3'}, - 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'MIRROR'}, - 'EVERFLOWV6':{'policy_desc': 'EVERFLOWV6', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'MIRRORV6'}, - 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'services': ['SNMP'], 'stage': 'ingress', 'type': 'CTRLPLANE'}, - 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'services': ['SSH'], 'stage': 'ingress', 'type': 'CTRLPLANE'}}) + exp = {\ + 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'type': 'CTRLPLANE', 'stage': 'ingress', 'services': ['SNMP']}, + 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'stage': 'ingress', 'ports': ['PortChannel0002', 'PortChannel0008', 'Ethernet8', 'Ethernet12', 'Ethernet24', 'Ethernet28'], 'type': 'MIRROR'}, + 'EVERFLOWV6': {'policy_desc': 'EVERFLOWV6', 'stage': 'ingress', 'ports': ['PortChannel0002', 'PortChannel0008', 'Ethernet8', 'Ethernet12', 'Ethernet24', 'Ethernet28'], 'type': 'MIRRORV6'}, + 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'type': 'CTRLPLANE', 'stage': 'ingress', 'services': ['SSH']}, + 'DATAACL': {'policy_desc': 'DATAACL', 'stage': 'ingress', 'ports': ['PortChannel0002', 'PortChannel0008'], 'type': 'L3'}} + for k, v in output.items(): + if 'ports' in v: + v['ports'].sort() + for k, v in exp.items(): + if 'ports' in v: + v['ports'].sort() + self.assertDictEqual(output, exp) + def test_global_asic_acl1(self): - argument = "-m {} --var-json \"ACL_TABLE\"".format(self.sample_graph1) + argument = "-m {} -p {} --var-json \"ACL_TABLE\"".format(self.sample_graph1, self.sample_port_config) + self.maxDiff = None output = json.loads(self.run_script(argument)) - self.assertDictEqual(output, {\ - 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'ports': [], 'stage': 'ingress', 'type': 'MIRROR'}, - 'EVERFLOWV6':{'policy_desc': 'EVERFLOWV6', 'ports': [], 'stage': 'ingress', 'type': 'MIRRORV6'}, - 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'services': ['SNMP'], 'stage': 'ingress', 'type': 'CTRLPLANE'}, - 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'services': ['SSH'], 'stage': 'ingress', 'type': 'CTRLPLANE'}}) - + exp = {\ + 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'type': 'CTRLPLANE', 'stage': 'ingress', 'services': ['SNMP']}, + 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'stage': 'ingress', 'ports': ['Ethernet0', 'Ethernet4', 'Ethernet8', 'Ethernet12', 'Ethernet16', 'Ethernet20', 'Ethernet24', 'Ethernet28'], 'type': 'MIRROR'}, + 'EVERFLOWV6': {'policy_desc': 'EVERFLOWV6', 'stage': 'ingress', 'ports': ['Ethernet0', 'Ethernet4', 'Ethernet8', 'Ethernet12', 'Ethernet16', 'Ethernet20', 'Ethernet24', 'Ethernet28'], 'type': 'MIRRORV6'}, + 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'type': 'CTRLPLANE', 'stage': 'ingress', 'services': ['SSH']}} + for k, v in output.items(): + if 'ports' in v: + v['ports'].sort() + for k, v in exp.items(): + if 'ports' in v: + v['ports'].sort() + self.assertDictEqual(output, exp) def test_front_end_asic_acl(self): argument = "-m {} -p {} -n asic0 --var-json \"ACL_TABLE\"".format(self.sample_graph, self.port_config[0]) @@ -347,7 +368,7 @@ def test_back_end_asic_acl1(self): def test_loopback_intfs(self): - argument = "-m {} --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph) + argument = "-m {} -p {} --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph, self.sample_port_config) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, {\ "Loopback0": {}, @@ -355,7 +376,7 @@ def test_loopback_intfs(self): "Loopback0|FC00:1::32/128": {}}) # The asic configuration should have 2 loopback interfaces - argument = "-m {} -n asic0 --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph) + argument = "-m {} -p {} -n asic0 --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph, self.port_config[0]) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, { \ "Loopback0": {}, @@ -365,7 +386,7 @@ def test_loopback_intfs(self): "Loopback4096|8.0.0.0/32": {}, "Loopback4096|FD00:1::32/128": {}}) - argument = "-m {} -n asic3 --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph) + argument = "-m {} -p {} -n asic3 --var-json \"LOOPBACK_INTERFACE\"".format(self.sample_graph, self.port_config[3]) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, {\ "Loopback0": {}, From 470d73585a6480ebc846cca928c799ac491bda48 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Mon, 4 Apr 2022 17:10:06 +0800 Subject: [PATCH 169/817] [YANG] Update YANG model for `pfcwd_sw_enable` (#10444) * Update YANG for pfcwd_sw_enable Signed-off-by: bingwang --- src/sonic-yang-models/tests/files/sample_config_db.json | 6 ++++-- .../tests/yang_model_tests/tests_config/qosmaps.json | 9 ++++++--- .../yang-models/sonic-port-qos-map.yang | 8 ++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e40d75e8f2c5..ff99fc7335df 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1603,7 +1603,8 @@ "tc_to_pg_map": "tc_to_pg_map1", "pfc_to_queue_map": "pfc_prio_to_q_map1", "pfc_to_pg_map" : "pfc_prio_to_pg_map1", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { "dot1p_to_tc_map" : "Dot1p_to_tc_map2", @@ -1612,7 +1613,8 @@ "tc_to_pg_map": "tc_to_pg_map2", "pfc_to_queue_map": "pfc_prio_to_q_map2", "pfc_to_pg_map" : "pfc_prio_to_pg_map2", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json index fe085ee3c7f9..991675bc3979 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json @@ -621,7 +621,8 @@ "pfc_to_pg_map": "map1", "dscp_to_tc_map": "map1", "dot1p_to_tc_map": "map1", - "pfc_enable": "3,4" + "pfc_enable": "3,4", + "pfcwd_sw_enable" : "3,4" } ] } @@ -657,7 +658,8 @@ "pfc_to_pg_map": "map2", "dscp_to_tc_map": "map2", "dot1p_to_tc_map": "map2", - "pfc_enable": "3,4" + "pfc_enable": "3,4", + "pfcwd_sw_enable" : "3,4" } ] } @@ -714,7 +716,8 @@ "PORT_QOS_MAP_LIST": [ { "ifname": "Ethernet4", - "pfc_enable": "8" + "pfc_enable": "8", + "pfcwd_sw_enable" : "8" } ] } diff --git a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang index b29e2f547087..8f4c2d88f4ed 100644 --- a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang @@ -81,6 +81,14 @@ module sonic-port-qos-map { } } + leaf pfcwd_sw_enable { + type string { + pattern "[0-7](,[0-7])?"; + } + description + "Specify the queue(s) on which software pfc watchdog are enabled."; + } + leaf pfc_to_queue_map { type leafref { path "/ppqm:sonic-pfc-priority-queue-map/ppqm:MAP_PFC_PRIORITY_TO_QUEUE/ppqm:MAP_PFC_PRIORITY_TO_QUEUE_LIST/ppqm:name"; From 64dc08a3723db6846874e5ccc452ad66bb007873 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Mon, 4 Apr 2022 16:07:48 +0300 Subject: [PATCH 170/817] [submodule] Advance sonic-utilities submodule. (#10405) In order to include the following commit: c752457 [PBH] Implement Edit Flows (Azure/sonic-utilities#2093) sonic-utilities f70dc27 [techsupport] Handle minor fixes of TS Lock and update auto-TS (#2114) 51d3550 Fix issues in clear_qos (#2122) 6d3aa1e [GCU] Optimizing moves by adding generators for keys/tables (#2120) 65a5a6b Fixing get port speed when oper status is down (#2123) c752457 [PBH] Implement Edit Flows (#2093) 827358f [debug dump] dump interface module added (#2070) Signed-off-by: Nazarii Hnydyn --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 8389c8137d4f..f70dc27827a8 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 8389c8137d4fdc5a2d1c803c9c06e6dcb4f849c1 +Subproject commit f70dc27827a88d70e91e15ecdcde2ebbc446116d From b9dd1df372e74247bdb54856c92c4a9dde6f39e6 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Tue, 5 Apr 2022 22:32:25 +0800 Subject: [PATCH 171/817] Update qos config to clear queues for bounced back traffic (#10176) * Update qos config to clear queues for bounced back traffic Signed-off-by: bingwang --- .../Arista-7050CX3-32S-C32/qos.json.j2 | 2 +- .../Arista-7050CX3-32S-D48C8/qos.json.j2 | 101 + .../Arista-7260CX3-C64/qos.json.j2 | 186 + .../Arista-7260CX3-D108C8/qos.json.j2 | 2 +- .../Arista-7260CX3-Q64/qos.json.j2 | 2 +- files/build_templates/qos_config.j2 | 30 +- ...ample-arista-7050cx3-dualtor-minigraph.xml | 2369 +++++++++ .../sample-arista-7260-dualtor-minigraph.xml | 4635 +++++++++++++++++ .../tests/sample-arista-7260-t1-minigraph.xml | 2491 +++++++++ .../sample_output/py2/qos-arista7050.json | 84 +- .../py2/qos-arista7800r3-48cq2-lc.json | 135 +- .../tests/sample_output/py2/qos-dell6100.json | 132 +- .../tests/sample_output/py2/qos-dell9332.json | 96 +- .../sample_output/py3/qos-arista7050.json | 84 +- .../py3/qos-arista7050cx3-dualtor.json | 1145 ++++ .../py3/qos-arista7260-dualtor.json | 2137 ++++++++ .../sample_output/py3/qos-arista7260-t1.json | 1045 ++++ .../py3/qos-arista7800r3-48cq2-lc.json | 135 +- .../tests/sample_output/py3/qos-dell6100.json | 132 +- .../tests/sample_output/py3/qos-dell9332.json | 96 +- src/sonic-config-engine/tests/test_j2files.py | 43 + 21 files changed, 14780 insertions(+), 302 deletions(-) mode change 100644 => 120000 device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 create mode 100644 src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 deleted file mode 100644 index 3e548325ea30..000000000000 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 new file mode 120000 index 000000000000..5ea713ce7f4c --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/qos.json.j2 @@ -0,0 +1 @@ +../Arista-7050CX3-32S-D48C8/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 index 3e548325ea30..04fddf486ace 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 @@ -1 +1,102 @@ +{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_queue_map() %} + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, +{%- endmacro %} +{% endif %} + {%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 index 3e548325ea30..4178efbcb7aa 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -1 +1,187 @@ +{% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "7" + } + }, +{%- endmacro %} +{% elif ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_queue_map() %} + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, +{%- endmacro %} +{% endif %} + {%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 deleted file mode 100644 index 3e548325ea30..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 new file mode 120000 index 000000000000..f0ee02749724 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 deleted file mode 100644 index 3e548325ea30..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 new file mode 120000 index 000000000000..f0ee02749724 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/qos.json.j2 \ No newline at end of file diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 2a01e470fde8..9df061283034 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -29,6 +29,13 @@ {%- endfor %} {%- set port_names_active = port_names_list_active | join(',') -%} +{%- set port_names_list_extra_queues = [] %} +{%- for port in PORT_ACTIVE %} + {% if (generate_dscp_to_tc_map is defined) and ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'ToRRouter') or + ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'LeafRouter') %} + {%- if port_names_list_extra_queues.append(port) %}{%- endif %} + {% endif %} +{%- endfor %} {%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%} {%- set backend_device_types = ['BackEndToRRouter', 'BackEndLeafRouter'] -%} @@ -64,6 +71,9 @@ "7": "7" } }, +{% if generate_tc_to_queue_map is defined %} + {{- generate_tc_to_queue_map() }} +{% else %} "TC_TO_QUEUE_MAP": { "AZURE": { "0": "0", @@ -76,6 +86,7 @@ "7": "7" } }, +{% endif %} {% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %} "DOT1P_TO_TC_MAP": { "AZURE": { @@ -89,6 +100,8 @@ "7": "7" } }, +{% elif generate_dscp_to_tc_map is defined %} + {{- generate_dscp_to_tc_map() }} {% else %} "DSCP_TO_TC_MAP": { "AZURE": { @@ -208,7 +221,12 @@ {% if asic_type in pfc_to_pg_map_supported_asics %} "pfc_to_pg_map" : "AZURE", {% endif %} - "pfc_enable" : "3,4" +{% if port in port_names_list_extra_queues %} + "pfc_enable" : "2,3,4,6", +{% else %} + "pfc_enable" : "3,4", +{% endif %} + "pfcwd_sw_enable" : "3,4" }{% if not loop.last %},{% endif %} {% endfor %} @@ -268,7 +286,12 @@ {% endfor %} {% for port in PORT_ACTIVE %} "{{ port }}|2": { + {% if port in port_names_list_extra_queues %} + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + {% else %} "scheduler": "scheduler.0" + {% endif %} }, {% endfor %} {% for port in PORT_ACTIVE %} @@ -278,7 +301,12 @@ {% endfor %} {% for port in PORT_ACTIVE %} "{{ port }}|6": { + {% if port in port_names_list_extra_queues %} + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + {% else %} "scheduler": "scheduler.0" + {% endif %} }{% if not loop.last %},{% endif %} {% endfor %} diff --git a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml new file mode 100644 index 000000000000..9ffb8230a6bf --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml @@ -0,0 +1,2369 @@ + + + + + + false + str2-7050cx3-acs-10 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + str2-7050cx3-acs-10 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ + BGPPeer +
10.1.0.32
+ + + + BGPSLBPassive + 10.255.0.0/25 +
+ + BGPPeer +
10.1.0.32
+ + + + BGPVac + 192.168.0.0/21 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + HostIP2 + Loopback1 + + 10.1.0.34/32 + + 10.1.0.34/32 + + + HostIP3 + Loopback1 + + FC00:1::34/128 + + FC00:1::34/128 + + HostIP6 + Loopback3 + + 10.1.0.38/32 + + 10.1.0.38/32 + + + HostIP7 + Loopback3 + + FC00:1::38/128 + + FC00:1::38/128 + + HostIP4 + Loopback2 + + 10.1.0.36/32 + + 10.1.0.36/32 + + + HostIP5 + Loopback2 + + FC00:1::36/128 + + FC00:1::36/128 + + + + HostIP + eth0 + + 10.3.146.122/23 + + 10.3.146.122/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-7050cx3-acs-10 + + + PortChannel101 + Ethernet7/1;Ethernet8/1 + + + + PortChannel102 + Ethernet9/1;Ethernet10/1 + + + + PortChannel103 + Ethernet23/1;Ethernet24/1 + + + + PortChannel104 + Ethernet25/1;Ethernet26/1 + + + + + + + + + Vlan1000 + Ethernet1/1;Ethernet2/1;Ethernet3/1;Ethernet4/1;Ethernet5/1;Ethernet6/1;Ethernet11/1;Ethernet12/1;Ethernet13/1;Ethernet14/1;Ethernet15/1;Ethernet16/1;Ethernet17/1;Ethernet18/1;Ethernet19/1;Ethernet20/1;Ethernet21/1;Ethernet22/1;Ethernet27/1;Ethernet28/1;Ethernet29/1;Ethernet30/1;Ethernet31/1;Ethernet32/1 + False + 0.0.0.0/0 + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + fc02:2000::1;fc02:2000::2;fc02:2000::3;fc02:2000::4 + 1000 + 1000 + 192.168.0.0/21 + 00:aa:bb:cc:dd:ee + + + + + + PortChannel101 + 10.0.0.56/31 + + + + PortChannel101 + FC00::71/126 + + + + PortChannel102 + 10.0.0.58/31 + + + + PortChannel102 + FC00::75/126 + + + + PortChannel103 + 10.0.0.60/31 + + + + PortChannel103 + FC00::79/126 + + + + PortChannel104 + 10.0.0.62/31 + + + + PortChannel104 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/21 + + + + Vlan1000 + fc02:1000::1/64 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet7/1 + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet8/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet9/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet10/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet23/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet24/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet25/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet26/1 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet1/1 + Servers0 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet2/1 + Servers1 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet3/1 + Servers2 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet4/1 + Servers3 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet5/1 + Servers4 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet6/1 + Servers5 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet11/1 + Servers6 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet12/1 + Servers7 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet13/1 + Servers8 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet14/1 + Servers9 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet15/1 + Servers10 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet16/1 + Servers11 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet17/1 + Servers12 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet18/1 + Servers13 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet19/1 + Servers14 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet20/1 + Servers15 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet21/1 + Servers16 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet22/1 + Servers17 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet27/1 + Servers18 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet28/1 + Servers19 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet29/1 + Servers20 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet30/1 + Servers21 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet31/1 + Servers22 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet32/1 + Servers23 + eth0 + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet1/1 + str2-7050cx3-acs-10-Servers0-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet2/1 + str2-7050cx3-acs-10-Servers1-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet3/1 + str2-7050cx3-acs-10-Servers2-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet4/1 + str2-7050cx3-acs-10-Servers3-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet5/1 + str2-7050cx3-acs-10-Servers4-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet6/1 + str2-7050cx3-acs-10-Servers5-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet11/1 + str2-7050cx3-acs-10-Servers6-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet12/1 + str2-7050cx3-acs-10-Servers7-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet13/1 + str2-7050cx3-acs-10-Servers8-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet14/1 + str2-7050cx3-acs-10-Servers9-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet15/1 + str2-7050cx3-acs-10-Servers10-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet16/1 + str2-7050cx3-acs-10-Servers11-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet17/1 + str2-7050cx3-acs-10-Servers12-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet18/1 + str2-7050cx3-acs-10-Servers13-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet19/1 + str2-7050cx3-acs-10-Servers14-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet20/1 + str2-7050cx3-acs-10-Servers15-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet21/1 + str2-7050cx3-acs-10-Servers16-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet22/1 + str2-7050cx3-acs-10-Servers17-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet27/1 + str2-7050cx3-acs-10-Servers18-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet28/1 + str2-7050cx3-acs-10-Servers19-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet29/1 + str2-7050cx3-acs-10-Servers20-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet30/1 + str2-7050cx3-acs-10-Servers21-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet31/1 + str2-7050cx3-acs-10-Servers22-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet32/1 + str2-7050cx3-acs-10-Servers23-SC + U + + + + + str2-7050cx3-acs-10 + Arista-7050CX3-32S-D48C8 +
+ 10.1.0.32/32 +
+ + FC00:1::32/128 + + + 10.3.146.122 + +
+ + str2-7050cx3-acs-11 + Arista-7050CX3-32S-D48C8 +
+ 10.1.0.33/32 +
+ + FC00:1::33/128 + + + 10.3.146.127 + +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers0-SC +
+ + Server +
+ 192.168.0.2/26 +
+ + fc02:1000::2/96 + + + 0.0.0.0/0 + + Servers0 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers1-SC +
+ + Server +
+ 192.168.0.3/26 +
+ + fc02:1000::3/96 + + + 0.0.0.0/0 + + Servers1 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers2-SC +
+ + Server +
+ 192.168.0.4/26 +
+ + fc02:1000::4/96 + + + 0.0.0.0/0 + + Servers2 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers3-SC +
+ + Server +
+ 192.168.0.5/26 +
+ + fc02:1000::5/96 + + + 0.0.0.0/0 + + Servers3 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers4-SC +
+ + Server +
+ 192.168.0.6/26 +
+ + fc02:1000::6/96 + + + 0.0.0.0/0 + + Servers4 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers5-SC +
+ + Server +
+ 192.168.0.7/26 +
+ + fc02:1000::7/96 + + + 0.0.0.0/0 + + Servers5 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers6-SC +
+ + Server +
+ 192.168.0.8/26 +
+ + fc02:1000::8/96 + + + 0.0.0.0/0 + + Servers6 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers7-SC +
+ + Server +
+ 192.168.0.9/26 +
+ + fc02:1000::9/96 + + + 0.0.0.0/0 + + Servers7 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers8-SC +
+ + Server +
+ 192.168.0.10/26 +
+ + fc02:1000::a/96 + + + 0.0.0.0/0 + + Servers8 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers9-SC +
+ + Server +
+ 192.168.0.11/26 +
+ + fc02:1000::b/96 + + + 0.0.0.0/0 + + Servers9 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers10-SC +
+ + Server +
+ 192.168.0.12/26 +
+ + fc02:1000::c/96 + + + 0.0.0.0/0 + + Servers10 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers11-SC +
+ + Server +
+ 192.168.0.13/26 +
+ + fc02:1000::d/96 + + + 0.0.0.0/0 + + Servers11 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers12-SC +
+ + Server +
+ 192.168.0.14/26 +
+ + fc02:1000::e/96 + + + 0.0.0.0/0 + + Servers12 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers13-SC +
+ + Server +
+ 192.168.0.15/26 +
+ + fc02:1000::f/96 + + + 0.0.0.0/0 + + Servers13 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers14-SC +
+ + Server +
+ 192.168.0.16/26 +
+ + fc02:1000::10/96 + + + 0.0.0.0/0 + + Servers14 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers15-SC +
+ + Server +
+ 192.168.0.17/26 +
+ + fc02:1000::11/96 + + + 0.0.0.0/0 + + Servers15 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers16-SC +
+ + Server +
+ 192.168.0.18/26 +
+ + fc02:1000::12/96 + + + 0.0.0.0/0 + + Servers16 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers17-SC +
+ + Server +
+ 192.168.0.19/26 +
+ + fc02:1000::13/96 + + + 0.0.0.0/0 + + Servers17 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers18-SC +
+ + Server +
+ 192.168.0.20/26 +
+ + fc02:1000::14/96 + + + 0.0.0.0/0 + + Servers18 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers19-SC +
+ + Server +
+ 192.168.0.21/26 +
+ + fc02:1000::15/96 + + + 0.0.0.0/0 + + Servers19 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers20-SC +
+ + Server +
+ 192.168.0.22/26 +
+ + fc02:1000::16/96 + + + 0.0.0.0/0 + + Servers20 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers21-SC +
+ + Server +
+ 192.168.0.23/26 +
+ + fc02:1000::17/96 + + + 0.0.0.0/0 + + Servers21 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers22-SC +
+ + Server +
+ 192.168.0.24/26 +
+ + fc02:1000::18/96 + + + 0.0.0.0/0 + + Servers22 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers23-SC +
+ + Server +
+ 192.168.0.25/26 +
+ + fc02:1000::19/96 + + + 0.0.0.0/0 + + Servers23 +
+ + ARISTA04T1 + + 172.16.142.63 + + Arista-VM + + + ARISTA03T1 + + 172.16.142.62 + + Arista-VM + + + ARISTA02T1 + + 172.16.142.61 + + Arista-VM + + + ARISTA01T1 + + 172.16.142.60 + + Arista-VM + +
+
+ + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet1/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet14/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet15/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet16/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet17/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet18/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet19/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet20/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/3 + + false + 0 + 0 + 50000 + + + true + 0 + Arista-7050CX3-32S-D48C8 + + + + + + + str2-7050cx3-acs-10 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + GeminiEnabled + + True + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + str2-7050cx3-acs-10 + + + LowerTOR + + str2-7050cx3-acs-11 + + + str2-7050cx3-acs-11:MuxTunnel0;str2-7050cx3-acs-10:MuxTunnel0 + + + + str2-7050cx3-acs-10 + Arista-7050CX3-32S-D48C8 +
diff --git a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml new file mode 100644 index 000000000000..01a42f934726 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml @@ -0,0 +1,4635 @@ + + + + + + false + str2-7260cx3-acs-12 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + str2-7260cx3-acs-12 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ + BGPPeer +
10.1.0.32
+ + + + BGPSLBPassive + 10.255.0.0/25 +
+ + BGPPeer +
10.1.0.32
+ + + + BGPVac + 192.168.0.0/21 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + HostIP2 + Loopback1 + + 10.1.0.34/32 + + 10.1.0.34/32 + + + HostIP3 + Loopback1 + + FC00:1::34/128 + + FC00:1::34/128 + + HostIP6 + Loopback3 + + 10.1.0.38/32 + + 10.1.0.38/32 + + + HostIP7 + Loopback3 + + FC00:1::38/128 + + FC00:1::38/128 + + HostIP4 + Loopback2 + + 10.1.0.36/32 + + 10.1.0.36/32 + + + HostIP5 + Loopback2 + + FC00:1::36/128 + + FC00:1::36/128 + + + + HostIP + eth0 + + 10.3.147.165/23 + + 10.3.147.165/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-7260cx3-acs-12 + + + PortChannel101 + Ethernet13/1;Ethernet14/1 + + + + PortChannel102 + Ethernet15/1;Ethernet16/1 + + + + PortChannel103 + Ethernet17/1;Ethernet18/1 + + + + PortChannel104 + Ethernet19/1;Ethernet20/1 + + + + + + + + + Vlan1000 + Ethernet1/1;Ethernet2/1;Ethernet3/1;Ethernet4/1;Ethernet5/1;Ethernet6/1;Ethernet7/1;Ethernet8/1;Ethernet9/1;Ethernet10/1;Ethernet11/1;Ethernet12/1;Ethernet21/1;Ethernet22/1;Ethernet23/1;Ethernet24/1;Ethernet25/1;Ethernet26/1;Ethernet27/1;Ethernet28/1;Ethernet29/1;Ethernet30/1;Ethernet31/1;Ethernet32/1;Ethernet33/1;Ethernet34/1;Ethernet35/1;Ethernet36/1;Ethernet37/1;Ethernet38/1;Ethernet39/1;Ethernet40/1;Ethernet41/1;Ethernet42/1;Ethernet43/1;Ethernet44/1;Ethernet45/1;Ethernet46/1;Ethernet47/1;Ethernet48/1;Ethernet49/1;Ethernet50/1;Ethernet51/1;Ethernet52/1;Ethernet53/1;Ethernet54/1;Ethernet55/1;Ethernet56/1;Ethernet57/1;Ethernet58/1;Ethernet59/1;Ethernet60/1;Ethernet61/1;Ethernet62/1;Ethernet63/1;Ethernet64/1 + False + 0.0.0.0/0 + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + fc02:2000::1;fc02:2000::2;fc02:2000::3;fc02:2000::4 + 1000 + 1000 + 192.168.0.0/21 + 00:aa:bb:cc:dd:ee + + + + + + PortChannel101 + 10.0.0.56/31 + + + + PortChannel101 + FC00::71/126 + + + + PortChannel102 + 10.0.0.58/31 + + + + PortChannel102 + FC00::75/126 + + + + PortChannel103 + 10.0.0.60/31 + + + + PortChannel103 + FC00::79/126 + + + + PortChannel104 + 10.0.0.62/31 + + + + PortChannel104 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/21 + + + + Vlan1000 + fc02:1000::1/64 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet13/1 + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet14/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet15/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet16/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet17/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet18/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet19/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet20/1 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet1/1 + Servers0 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet2/1 + Servers1 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet3/1 + Servers2 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet4/1 + Servers3 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet5/1 + Servers4 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet6/1 + Servers5 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet7/1 + Servers6 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet8/1 + Servers7 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet9/1 + Servers8 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet10/1 + Servers9 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet11/1 + Servers10 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet12/1 + Servers11 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet21/1 + Servers12 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet22/1 + Servers13 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet23/1 + Servers14 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet24/1 + Servers15 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet25/1 + Servers16 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet26/1 + Servers17 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet27/1 + Servers18 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet28/1 + Servers19 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet29/1 + Servers20 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet30/1 + Servers21 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet31/1 + Servers22 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet32/1 + Servers23 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet33/1 + Servers24 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet34/1 + Servers25 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet35/1 + Servers26 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet36/1 + Servers27 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet37/1 + Servers28 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet38/1 + Servers29 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet39/1 + Servers30 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet40/1 + Servers31 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet41/1 + Servers32 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet42/1 + Servers33 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet43/1 + Servers34 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet44/1 + Servers35 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet45/1 + Servers36 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet46/1 + Servers37 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet47/1 + Servers38 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet48/1 + Servers39 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet49/1 + Servers40 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet50/1 + Servers41 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet51/1 + Servers42 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet52/1 + Servers43 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet53/1 + Servers44 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet54/1 + Servers45 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet55/1 + Servers46 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet56/1 + Servers47 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet57/1 + Servers48 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet58/1 + Servers49 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet59/1 + Servers50 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet60/1 + Servers51 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet61/1 + Servers52 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet62/1 + Servers53 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet63/1 + Servers54 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet64/1 + Servers55 + eth0 + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet1/1 + str2-7260cx3-acs-12-Servers0-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet2/1 + str2-7260cx3-acs-12-Servers1-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet3/1 + str2-7260cx3-acs-12-Servers2-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet4/1 + str2-7260cx3-acs-12-Servers3-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet5/1 + str2-7260cx3-acs-12-Servers4-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet6/1 + str2-7260cx3-acs-12-Servers5-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet7/1 + str2-7260cx3-acs-12-Servers6-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet8/1 + str2-7260cx3-acs-12-Servers7-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet9/1 + str2-7260cx3-acs-12-Servers8-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet10/1 + str2-7260cx3-acs-12-Servers9-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet11/1 + str2-7260cx3-acs-12-Servers10-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet12/1 + str2-7260cx3-acs-12-Servers11-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet21/1 + str2-7260cx3-acs-12-Servers12-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet22/1 + str2-7260cx3-acs-12-Servers13-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet23/1 + str2-7260cx3-acs-12-Servers14-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet24/1 + str2-7260cx3-acs-12-Servers15-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet25/1 + str2-7260cx3-acs-12-Servers16-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet26/1 + str2-7260cx3-acs-12-Servers17-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet27/1 + str2-7260cx3-acs-12-Servers18-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet28/1 + str2-7260cx3-acs-12-Servers19-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet29/1 + str2-7260cx3-acs-12-Servers20-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet30/1 + str2-7260cx3-acs-12-Servers21-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet31/1 + str2-7260cx3-acs-12-Servers22-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet32/1 + str2-7260cx3-acs-12-Servers23-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet33/1 + str2-7260cx3-acs-12-Servers24-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet34/1 + str2-7260cx3-acs-12-Servers25-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet35/1 + str2-7260cx3-acs-12-Servers26-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet36/1 + str2-7260cx3-acs-12-Servers27-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet37/1 + str2-7260cx3-acs-12-Servers28-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet38/1 + str2-7260cx3-acs-12-Servers29-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet39/1 + str2-7260cx3-acs-12-Servers30-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet40/1 + str2-7260cx3-acs-12-Servers31-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet41/1 + str2-7260cx3-acs-12-Servers32-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet42/1 + str2-7260cx3-acs-12-Servers33-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet43/1 + str2-7260cx3-acs-12-Servers34-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet44/1 + str2-7260cx3-acs-12-Servers35-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet45/1 + str2-7260cx3-acs-12-Servers36-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet46/1 + str2-7260cx3-acs-12-Servers37-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet47/1 + str2-7260cx3-acs-12-Servers38-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet48/1 + str2-7260cx3-acs-12-Servers39-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet49/1 + str2-7260cx3-acs-12-Servers40-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet50/1 + str2-7260cx3-acs-12-Servers41-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet51/1 + str2-7260cx3-acs-12-Servers42-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet52/1 + str2-7260cx3-acs-12-Servers43-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet53/1 + str2-7260cx3-acs-12-Servers44-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet54/1 + str2-7260cx3-acs-12-Servers45-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet55/1 + str2-7260cx3-acs-12-Servers46-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet56/1 + str2-7260cx3-acs-12-Servers47-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet57/1 + str2-7260cx3-acs-12-Servers48-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet58/1 + str2-7260cx3-acs-12-Servers49-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet59/1 + str2-7260cx3-acs-12-Servers50-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet60/1 + str2-7260cx3-acs-12-Servers51-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet61/1 + str2-7260cx3-acs-12-Servers52-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet62/1 + str2-7260cx3-acs-12-Servers53-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet63/1 + str2-7260cx3-acs-12-Servers54-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet64/1 + str2-7260cx3-acs-12-Servers55-SC + U + + + + + str2-7260cx3-acs-12 + Arista-7260CX3-D108C8 +
+ 10.1.0.32/32 +
+ + FC00:1::32/128 + + + 10.3.147.165 + +
+ + str2-7260cx3-acs-13 + Arista-7260CX3-D108C8 +
+ 10.1.0.33/32 +
+ + FC00:1::33/128 + + + 10.3.147.167 + +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers0-SC +
+ + Server +
+ 192.168.0.2/26 +
+ + fc02:1000::2/96 + + + 0.0.0.0/0 + + Servers0 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers1-SC +
+ + Server +
+ 192.168.0.3/26 +
+ + fc02:1000::3/96 + + + 0.0.0.0/0 + + Servers1 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers2-SC +
+ + Server +
+ 192.168.0.4/26 +
+ + fc02:1000::4/96 + + + 0.0.0.0/0 + + Servers2 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers3-SC +
+ + Server +
+ 192.168.0.5/26 +
+ + fc02:1000::5/96 + + + 0.0.0.0/0 + + Servers3 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers4-SC +
+ + Server +
+ 192.168.0.6/26 +
+ + fc02:1000::6/96 + + + 0.0.0.0/0 + + Servers4 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers5-SC +
+ + Server +
+ 192.168.0.7/26 +
+ + fc02:1000::7/96 + + + 0.0.0.0/0 + + Servers5 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers6-SC +
+ + Server +
+ 192.168.0.8/26 +
+ + fc02:1000::8/96 + + + 0.0.0.0/0 + + Servers6 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers7-SC +
+ + Server +
+ 192.168.0.9/26 +
+ + fc02:1000::9/96 + + + 0.0.0.0/0 + + Servers7 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers8-SC +
+ + Server +
+ 192.168.0.10/26 +
+ + fc02:1000::a/96 + + + 0.0.0.0/0 + + Servers8 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers9-SC +
+ + Server +
+ 192.168.0.11/26 +
+ + fc02:1000::b/96 + + + 0.0.0.0/0 + + Servers9 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers10-SC +
+ + Server +
+ 192.168.0.12/26 +
+ + fc02:1000::c/96 + + + 0.0.0.0/0 + + Servers10 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers11-SC +
+ + Server +
+ 192.168.0.13/26 +
+ + fc02:1000::d/96 + + + 0.0.0.0/0 + + Servers11 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers12-SC +
+ + Server +
+ 192.168.0.14/26 +
+ + fc02:1000::e/96 + + + 0.0.0.0/0 + + Servers12 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers13-SC +
+ + Server +
+ 192.168.0.15/26 +
+ + fc02:1000::f/96 + + + 0.0.0.0/0 + + Servers13 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers14-SC +
+ + Server +
+ 192.168.0.16/26 +
+ + fc02:1000::10/96 + + + 0.0.0.0/0 + + Servers14 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers15-SC +
+ + Server +
+ 192.168.0.17/26 +
+ + fc02:1000::11/96 + + + 0.0.0.0/0 + + Servers15 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers16-SC +
+ + Server +
+ 192.168.0.18/26 +
+ + fc02:1000::12/96 + + + 0.0.0.0/0 + + Servers16 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers17-SC +
+ + Server +
+ 192.168.0.19/26 +
+ + fc02:1000::13/96 + + + 0.0.0.0/0 + + Servers17 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers18-SC +
+ + Server +
+ 192.168.0.20/26 +
+ + fc02:1000::14/96 + + + 0.0.0.0/0 + + Servers18 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers19-SC +
+ + Server +
+ 192.168.0.21/26 +
+ + fc02:1000::15/96 + + + 0.0.0.0/0 + + Servers19 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers20-SC +
+ + Server +
+ 192.168.0.22/26 +
+ + fc02:1000::16/96 + + + 0.0.0.0/0 + + Servers20 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers21-SC +
+ + Server +
+ 192.168.0.23/26 +
+ + fc02:1000::17/96 + + + 0.0.0.0/0 + + Servers21 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers22-SC +
+ + Server +
+ 192.168.0.24/26 +
+ + fc02:1000::18/96 + + + 0.0.0.0/0 + + Servers22 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers23-SC +
+ + Server +
+ 192.168.0.25/26 +
+ + fc02:1000::19/96 + + + 0.0.0.0/0 + + Servers23 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers24-SC +
+ + Server +
+ 192.168.0.26/26 +
+ + fc02:1000::1a/96 + + + 0.0.0.0/0 + + Servers24 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers25-SC +
+ + Server +
+ 192.168.0.27/26 +
+ + fc02:1000::1b/96 + + + 0.0.0.0/0 + + Servers25 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers26-SC +
+ + Server +
+ 192.168.0.28/26 +
+ + fc02:1000::1c/96 + + + 0.0.0.0/0 + + Servers26 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers27-SC +
+ + Server +
+ 192.168.0.29/26 +
+ + fc02:1000::1d/96 + + + 0.0.0.0/0 + + Servers27 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers28-SC +
+ + Server +
+ 192.168.0.30/26 +
+ + fc02:1000::1e/96 + + + 0.0.0.0/0 + + Servers28 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers29-SC +
+ + Server +
+ 192.168.0.31/26 +
+ + fc02:1000::1f/96 + + + 0.0.0.0/0 + + Servers29 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers30-SC +
+ + Server +
+ 192.168.0.32/26 +
+ + fc02:1000::20/96 + + + 0.0.0.0/0 + + Servers30 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers31-SC +
+ + Server +
+ 192.168.0.33/26 +
+ + fc02:1000::21/96 + + + 0.0.0.0/0 + + Servers31 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers32-SC +
+ + Server +
+ 192.168.0.34/26 +
+ + fc02:1000::22/96 + + + 0.0.0.0/0 + + Servers32 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers33-SC +
+ + Server +
+ 192.168.0.35/26 +
+ + fc02:1000::23/96 + + + 0.0.0.0/0 + + Servers33 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers34-SC +
+ + Server +
+ 192.168.0.36/26 +
+ + fc02:1000::24/96 + + + 0.0.0.0/0 + + Servers34 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers35-SC +
+ + Server +
+ 192.168.0.37/26 +
+ + fc02:1000::25/96 + + + 0.0.0.0/0 + + Servers35 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers36-SC +
+ + Server +
+ 192.168.0.38/26 +
+ + fc02:1000::26/96 + + + 0.0.0.0/0 + + Servers36 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers37-SC +
+ + Server +
+ 192.168.0.39/26 +
+ + fc02:1000::27/96 + + + 0.0.0.0/0 + + Servers37 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers38-SC +
+ + Server +
+ 192.168.0.40/26 +
+ + fc02:1000::28/96 + + + 0.0.0.0/0 + + Servers38 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers39-SC +
+ + Server +
+ 192.168.0.41/26 +
+ + fc02:1000::29/96 + + + 0.0.0.0/0 + + Servers39 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers40-SC +
+ + Server +
+ 192.168.0.42/26 +
+ + fc02:1000::2a/96 + + + 0.0.0.0/0 + + Servers40 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers41-SC +
+ + Server +
+ 192.168.0.43/26 +
+ + fc02:1000::2b/96 + + + 0.0.0.0/0 + + Servers41 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers42-SC +
+ + Server +
+ 192.168.0.44/26 +
+ + fc02:1000::2c/96 + + + 0.0.0.0/0 + + Servers42 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers43-SC +
+ + Server +
+ 192.168.0.45/26 +
+ + fc02:1000::2d/96 + + + 0.0.0.0/0 + + Servers43 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers44-SC +
+ + Server +
+ 192.168.0.46/26 +
+ + fc02:1000::2e/96 + + + 0.0.0.0/0 + + Servers44 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers45-SC +
+ + Server +
+ 192.168.0.47/26 +
+ + fc02:1000::2f/96 + + + 0.0.0.0/0 + + Servers45 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers46-SC +
+ + Server +
+ 192.168.0.48/26 +
+ + fc02:1000::30/96 + + + 0.0.0.0/0 + + Servers46 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers47-SC +
+ + Server +
+ 192.168.0.49/26 +
+ + fc02:1000::31/96 + + + 0.0.0.0/0 + + Servers47 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers48-SC +
+ + Server +
+ 192.168.0.50/26 +
+ + fc02:1000::32/96 + + + 0.0.0.0/0 + + Servers48 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers49-SC +
+ + Server +
+ 192.168.0.51/26 +
+ + fc02:1000::33/96 + + + 0.0.0.0/0 + + Servers49 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers50-SC +
+ + Server +
+ 192.168.0.52/26 +
+ + fc02:1000::34/96 + + + 0.0.0.0/0 + + Servers50 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers51-SC +
+ + Server +
+ 192.168.0.53/26 +
+ + fc02:1000::35/96 + + + 0.0.0.0/0 + + Servers51 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers52-SC +
+ + Server +
+ 192.168.0.54/26 +
+ + fc02:1000::36/96 + + + 0.0.0.0/0 + + Servers52 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers53-SC +
+ + Server +
+ 192.168.0.55/26 +
+ + fc02:1000::37/96 + + + 0.0.0.0/0 + + Servers53 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers54-SC +
+ + Server +
+ 192.168.0.56/26 +
+ + fc02:1000::38/96 + + + 0.0.0.0/0 + + Servers54 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers55-SC +
+ + Server +
+ 192.168.0.57/26 +
+ + fc02:1000::39/96 + + + 0.0.0.0/0 + + Servers55 +
+ + ARISTA04T1 + + 172.16.147.75 + + Arista-VM + + + ARISTA03T1 + + 172.16.147.74 + + Arista-VM + + + ARISTA02T1 + + 172.16.147.73 + + Arista-VM + + + ARISTA01T1 + + 172.16.147.72 + + Arista-VM + +
+
+ + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet1/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet8/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet9/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet10/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet24/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet25/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet26/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet33/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet33/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet34/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet34/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet35/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet35/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet36/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet36/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet37/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet37/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet38/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet38/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet39/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet39/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet40/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet40/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet41/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet41/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet42/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet42/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet43/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet43/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet44/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet44/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet45/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet45/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet46/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet46/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet47/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet47/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet48/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet48/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet49/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet49/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet50/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet50/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet51/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet51/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet52/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet52/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet53/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet53/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet54/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet54/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet55/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet55/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet56/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet56/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet57/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet57/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet58/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet58/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet59/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet59/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet60/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet60/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet61/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet61/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet62/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet62/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet63/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet63/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet64/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet64/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet65 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + Ethernet66 + + false + 0 + 0 + 10000 + + + true + 0 + Arista-7260CX3-D108C8 + + + + + + + str2-7260cx3-acs-12 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + GeminiEnabled + + True + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + str2-7260cx3-acs-12 + + + LowerTOR + + str2-7260cx3-acs-13 + + + str2-7260cx3-acs-13:MuxTunnel0;str2-7260cx3-acs-12:MuxTunnel0 + + + + str2-7260cx3-acs-12 + Arista-7260CX3-D108C8 +
diff --git a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml new file mode 100644 index 000000000000..4367b705a11a --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml @@ -0,0 +1,2491 @@ + + + + + + false + str-7260cx3-acs-7 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::5 + ARISTA03T2 + FC00::6 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::9 + ARISTA05T2 + FC00::A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::D + ARISTA07T2 + FC00::E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.64 + ARISTA17T0 + 10.0.0.65 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::81 + ARISTA17T0 + FC00::82 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.66 + ARISTA18T0 + 10.0.0.67 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::85 + ARISTA18T0 + FC00::86 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.68 + ARISTA19T0 + 10.0.0.69 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::89 + ARISTA19T0 + FC00::8A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.70 + ARISTA20T0 + 10.0.0.71 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::8D + ARISTA20T0 + FC00::8E + 1 + 10 + 3 + + + + + 65100 + str-7260cx3-acs-7 + + +
10.0.0.33
+ + + +
+ +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.0.0.65
+ + + +
+ +
10.0.0.67
+ + + +
+ +
10.0.0.69
+ + + +
+ +
10.0.0.71
+ + + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 64016 + ARISTA16T0 + + + + 64017 + ARISTA17T0 + + + + 64018 + ARISTA18T0 + + + + 64019 + ARISTA19T0 + + + + 64020 + ARISTA20T0 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.64.246.78/23 + + 10.64.246.78/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str-7260cx3-acs-7 + + + PortChannel101 + Ethernet35/1 + + + + PortChannel102 + Ethernet1/1;Ethernet2/1 + + + + PortChannel103 + Ethernet37/1 + + + + PortChannel104 + Ethernet38/1 + + + + PortChannel105 + Ethernet5/1;Ethernet6/1 + + + + PortChannel106 + Ethernet39/1 + + + + PortChannel107 + Ethernet40/1 + + + + PortChannel108 + Ethernet17/1;Ethernet18/1 + + + + PortChannel109 + Ethernet43/1 + + + + PortChannel1010 + Ethernet45/1 + + + + PortChannel1011 + Ethernet21/1;Ethernet22/1 + + + + PortChannel1012 + Ethernet46/1 + + + + PortChannel1013 + Ethernet47/1 + + + + PortChannel1014 + Ethernet48/1 + + + + PortChannel1015 + Ethernet51/1 + + + + PortChannel1016 + Ethernet53/1 + + + + PortChannel1017 + Ethernet54/1 + + + + PortChannel1018 + Ethernet55/1 + + + + PortChannel1019 + Ethernet56/1 + + + + PortChannel1020 + Ethernet59/1 + + + + PortChannel1021 + Ethernet61/1 + + + + PortChannel1022 + Ethernet62/1 + + + + PortChannel1023 + Ethernet63/1 + + + + PortChannel1024 + Ethernet64/1 + + + + + + + + + PortChannel101 + 10.0.0.32/31 + + + + PortChannel101 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel103 + 10.0.0.34/31 + + + + PortChannel103 + FC00::45/126 + + + + PortChannel104 + 10.0.0.36/31 + + + + PortChannel104 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::5/126 + + + + PortChannel106 + 10.0.0.38/31 + + + + PortChannel106 + FC00::4D/126 + + + + PortChannel107 + 10.0.0.40/31 + + + + PortChannel107 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::9/126 + + + + PortChannel109 + 10.0.0.42/31 + + + + PortChannel109 + FC00::55/126 + + + + PortChannel1010 + 10.0.0.44/31 + + + + PortChannel1010 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::D/126 + + + + PortChannel1012 + 10.0.0.46/31 + + + + PortChannel1012 + FC00::5D/126 + + + + PortChannel1013 + 10.0.0.48/31 + + + + PortChannel1013 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.50/31 + + + + PortChannel1014 + FC00::65/126 + + + + PortChannel1015 + 10.0.0.52/31 + + + + PortChannel1015 + FC00::69/126 + + + + PortChannel1016 + 10.0.0.54/31 + + + + PortChannel1016 + FC00::6D/126 + + + + PortChannel1017 + 10.0.0.56/31 + + + + PortChannel1017 + FC00::71/126 + + + + PortChannel1018 + 10.0.0.58/31 + + + + PortChannel1018 + FC00::75/126 + + + + PortChannel1019 + 10.0.0.60/31 + + + + PortChannel1019 + FC00::79/126 + + + + PortChannel1020 + 10.0.0.62/31 + + + + PortChannel1020 + FC00::7D/126 + + + + PortChannel1021 + 10.0.0.64/31 + + + + PortChannel1021 + FC00::81/126 + + + + PortChannel1022 + 10.0.0.66/31 + + + + PortChannel1022 + FC00::85/126 + + + + PortChannel1023 + 10.0.0.68/31 + + + + PortChannel1023 + FC00::89/126 + + + + PortChannel1024 + 10.0.0.70/31 + + + + PortChannel1024 + FC00::8D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel101;PortChannel102;PortChannel103;PortChannel104;PortChannel105;PortChannel106;PortChannel107;PortChannel108;PortChannel109;PortChannel1010;PortChannel1011;PortChannel1012;PortChannel1013;PortChannel1014;PortChannel1015;PortChannel1016;PortChannel1017;PortChannel1018;PortChannel1019;PortChannel1020;PortChannel1021;PortChannel1022;PortChannel1023;PortChannel1024 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet35/1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet1/1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet2/1 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet37/1 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet38/1 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet5/1 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet6/1 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet39/1 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet40/1 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet17/1 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet18/1 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet43/1 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet45/1 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet21/1 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet22/1 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet46/1 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet47/1 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet48/1 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet51/1 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet53/1 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet54/1 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet55/1 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet56/1 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet59/1 + + + DeviceInterfaceLink + ARISTA17T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet61/1 + + + DeviceInterfaceLink + ARISTA18T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet62/1 + + + DeviceInterfaceLink + ARISTA19T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet63/1 + + + DeviceInterfaceLink + ARISTA20T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet64/1 + + + + + str-7260cx3-acs-7 + Arista-7260CX3-C64 + + 10.64.246.78 + + + + ARISTA16T0 + + 172.16.141.95 + + Arista-VM + + + ARISTA11T0 + + 172.16.141.90 + + Arista-VM + + + ARISTA10T0 + + 172.16.141.89 + + Arista-VM + + + ARISTA17T0 + + 172.16.141.96 + + Arista-VM + + + ARISTA09T0 + + 172.16.141.88 + + Arista-VM + + + ARISTA20T0 + + 172.16.141.99 + + Arista-VM + + + ARISTA08T0 + + 172.16.141.87 + + Arista-VM + + + ARISTA07T0 + + 172.16.141.86 + + Arista-VM + + + ARISTA07T2 + + 172.16.141.79 + + Arista-VM + + + ARISTA01T2 + + 172.16.141.76 + + Arista-VM + + + ARISTA01T0 + + 172.16.141.80 + + Arista-VM + + + ARISTA05T2 + + 172.16.141.78 + + Arista-VM + + + ARISTA05T0 + + 172.16.141.84 + + Arista-VM + + + ARISTA02T0 + + 172.16.141.81 + + Arista-VM + + + ARISTA03T0 + + 172.16.141.82 + + Arista-VM + + + ARISTA03T2 + + 172.16.141.77 + + Arista-VM + + + ARISTA04T0 + + 172.16.141.83 + + Arista-VM + + + ARISTA18T0 + + 172.16.141.97 + + Arista-VM + + + ARISTA15T0 + + 172.16.141.94 + + Arista-VM + + + ARISTA19T0 + + 172.16.141.98 + + Arista-VM + + + ARISTA14T0 + + 172.16.141.93 + + Arista-VM + + + ARISTA12T0 + + 172.16.141.91 + + Arista-VM + + + ARISTA13T0 + + 172.16.141.92 + + Arista-VM + + + ARISTA06T0 + + 172.16.141.85 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet33/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet34/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet35/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet36/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet37/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet38/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet39/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet40/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet41/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet42/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet43/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet44/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet45/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet46/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet47/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet48/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet49/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet50/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet51/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet52/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet53/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet54/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet55/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet56/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet57/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet58/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet59/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet60/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet61/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet62/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet63/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet64/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet65 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + Ethernet66 + + false + 0 + 0 + 10000 + + + true + 0 + Arista-7260CX3-C64 + + + + + + + str-7260cx3-acs-7 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.64.247.0/24;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + str-7260cx3-acs-7 + Arista-7260CX3-C64 +
diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json index 9a6f8a2ada78..b15fcf7a36c1 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json @@ -119,196 +119,224 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet44": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet60": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet68": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet76": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet84": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet92": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet116": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet124": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json index 3044749a2776..92ba2caf8d17 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json @@ -119,315 +119,360 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet44": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet60": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet68": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet76": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet84": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet92": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet100": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet104": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet108": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet116": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet124": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet128": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet132": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet136": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet140": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet144": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet148": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet152": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet156": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet164": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet176": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet180": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet184": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet188": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json b/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json index eecd81c99e5c..27bea8cd32d3 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json @@ -119,308 +119,352 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet1": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet5": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet6": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet7": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet9": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet10": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet11": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet13": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet14": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet15": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet17": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet21": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet22": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet23": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet25": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet26": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet27": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet29": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet30": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet31": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet37": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet38": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet39": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet41": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet42": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet53": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet54": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet55": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet57": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet58": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json index 39f4b26e8372..8130a455497a 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json @@ -123,224 +123,256 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet104": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet128": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet136": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet144": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet152": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet160": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet168": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet176": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet184": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet192": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet200": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet208": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet216": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet224": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet232": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet240": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet248": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json index 9a6f8a2ada78..b15fcf7a36c1 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json @@ -119,196 +119,224 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet44": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet60": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet68": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet76": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet84": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet92": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet116": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet124": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json new file mode 100644 index 000000000000..84a2613df90d --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -0,0 +1,1145 @@ +{ + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json new file mode 100644 index 000000000000..e8476cc0c865 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -0,0 +1,2137 @@ +{ + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet132": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet140": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet160": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet164": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet172": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet192": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet196": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet204": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet224": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet228": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet236": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet196|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet204|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet228|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet236|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet196|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet204|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet228|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet236|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "Ethernet196|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet204|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "Ethernet228|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet236|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "Ethernet196|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet204|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "Ethernet228|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet236|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "Ethernet196|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet204|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet212|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet220|2": { + "scheduler": "scheduler.0" + }, + "Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "Ethernet228|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet236|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet244|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet252|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "Ethernet196|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet204|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "Ethernet228|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet236|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet172|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "Ethernet196|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet204|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet212|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet220|6": { + "scheduler": "scheduler.0" + }, + "Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "Ethernet228|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet236|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet244|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "Ethernet252|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json new file mode 100644 index 000000000000..9db828a759e4 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json @@ -0,0 +1,1045 @@ +{ + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "7" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json index 3044749a2776..92ba2caf8d17 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json @@ -119,315 +119,360 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet44": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet60": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet68": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet76": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet84": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet92": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet100": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet104": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet108": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet116": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet124": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet128": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet132": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet136": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet140": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet144": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet148": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet152": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet156": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet164": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet176": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet180": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet184": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet188": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json b/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json index eecd81c99e5c..27bea8cd32d3 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json @@ -119,308 +119,352 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet1": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet5": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet6": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet7": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet9": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet10": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet11": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet12": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet13": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet14": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet15": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet17": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet21": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet22": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet23": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet25": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet26": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet27": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet28": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet29": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet30": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet31": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet36": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet37": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet38": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet39": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet41": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet42": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet52": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet53": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet54": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet55": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet57": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet58": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json index 39f4b26e8372..8130a455497a 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json @@ -123,224 +123,256 @@ "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet8": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet24": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet32": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet40": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet48": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet56": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet72": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet88": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet96": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet104": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet112": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet120": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet128": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet136": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet144": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet152": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet160": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet168": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet176": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet184": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet192": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet200": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet208": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet216": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet224": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet232": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet240": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" }, "Ethernet248": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", - "pfc_enable" : "3,4" + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" } }, "WRED_PROFILE": { diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index da37bf8d18c6..52d4260dba77 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -274,6 +274,49 @@ def test_qos_dell6100_render_template(self): sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell6100.json') assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) + def test_qos_dscp_remapping_render_template(self): + if utils.PYvX_DIR != 'py3': + # Skip on python2 as the change will not be backported to previous version + return + + dir_paths = [ + '../../../device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8', + '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8', + '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64' + ] + sample_outputs = [ + 'qos-arista7050cx3-dualtor.json', + 'qos-arista7260-dualtor.json', + 'qos-arista7260-t1.json' + ] + sample_minigraph_files = [ + 'sample-arista-7050cx3-dualtor-minigraph.xml', + 'sample-arista-7260-dualtor-minigraph.xml', + 'sample-arista-7260-t1-minigraph.xml' + ] + for i, path in enumerate(dir_paths): + device_template_path = os.path.join(self.test_dir, path) + sample_output = sample_outputs[i] + sample_minigraph_file = os.path.join(self.test_dir,sample_minigraph_files[i]) + qos_file = os.path.join(device_template_path, 'qos.json.j2') + port_config_ini_file = os.path.join(device_template_path, 'port_config.ini') + test_output = os.path.join(self.test_dir, 'output.json') + + # copy qos_config.j2 to the target directory to have all templates in one directory + qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') + shutil.copy2(qos_config_file, device_template_path) + + argument = '-m ' + sample_minigraph_file + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + test_output + self.run_script(argument) + + # cleanup + qos_config_file_new = os.path.join(device_template_path, 'qos_config.j2') + os.remove(qos_config_file_new) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, sample_output) + assert utils.cmp(sample_output_file, test_output) + os.remove(test_output) + def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer_template, expected): dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) buffers_file = os.path.join(dir_path, buffer_template) From 31be203af6643c0f3e621e3d57040d2195617ad7 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Tue, 5 Apr 2022 19:11:38 +0300 Subject: [PATCH 172/817] [BFN] Updated x86_64-accton_as9516_32d-r0/platform.json (#10368) Signed-off-by: Andriy Kokhan --- .../x86_64-accton_as9516_32d-r0/platform.json | 126 ++++++++++++++---- 1 file changed, 102 insertions(+), 24 deletions(-) diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json b/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json index 115dd194b725..abd2fec0a303 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/platform.json @@ -9,57 +9,135 @@ "name": "BMC" } ], + "thermal_manager": false, "fans": [ { - "name": "counter-rotating-fan-1" - }, - { - "name": "counter-rotating-fan-2" - }, - { - "name": "counter-rotating-fan-3" - }, - { - "name": "counter-rotating-fan-4" - }, - { - "name": "counter-rotating-fan-5" - }, - { - "name": "counter-rotating-fan-6" + "name": "counter-rotating-fan-1", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } + }, + { + "name": "counter-rotating-fan-2", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } + }, + { + "name": "counter-rotating-fan-3", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } + }, + { + "name": "counter-rotating-fan-4", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } + }, + { + "name": "counter-rotating-fan-5", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } + }, + { + "name": "counter-rotating-fan-6", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } } ], "fan_drawers": [ { "name": "fantray-1", + "status_led": { + "controllable": false + }, "fans": [ { - "name": "counter-rotating-fan-1" + "name": "counter-rotating-fan-1", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } }, { - "name": "counter-rotating-fan-2" + "name": "counter-rotating-fan-2", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } }, { - "name": "counter-rotating-fan-3" + "name": "counter-rotating-fan-3", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } }, { - "name": "counter-rotating-fan-4" + "name": "counter-rotating-fan-4", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } }, { - "name": "counter-rotating-fan-5" + "name": "counter-rotating-fan-5", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } }, { - "name": "counter-rotating-fan-6" + "name": "counter-rotating-fan-6", + "status_led": { + "controllable": false + }, + "speed": { + "controllable": false + } } ] } ], "psus": [ { - "name": "psu-1" + "name": "psu-1", + "temperature": false }, { - "name": "psu-2" + "name": "psu-2", + "temperature": false } ], "thermals": [ From 8e616c153b9775d2514c68a5112a583eeb334e6b Mon Sep 17 00:00:00 2001 From: Vadym Yashchenko Date: Tue, 5 Apr 2022 19:13:08 +0300 Subject: [PATCH 173/817] [BFN] Refactoring and adding some functions of Thermal class (set and get thresholds and etc.) (#10205) * Revised set_high_thershold and set_low_thershold methobs in the thermal.py Signed-off-by: Vadym Yashchenko * Revised set_low_thershold and set_high_thershold Signed-off-by: Vadym Yashchenko * Added separated files with thermal thresholds, changed platform.json and thermal.py Signed-off-by: Vadym Yashchenko * Revised on code revieww Signed-off-by: Vadym Yashchenko * Reverted thermal.py Signed-off-by: Vadym Yashchenko * Revised ther python.py Signed-off-by: Vadym Yashchenko * Revised due to code review Signed-off-by: Vadym Yashchenko * Added fucntion for fix the problem of tofino sensor high critical threshold Signed-off-by: Vadym Yashchenko * Revised due to code review Signed-off-by: Vadym Yashchenko * Revised due to code review Signed-off-by: Vadym Yashchenko * Revised due to code review Signed-off-by: Vadym Yashchenko * Revised only for cab18-4 Signed-off-by: Vadym Yashchenko * Revised default thresholds Signed-off-by: Vadym Yashchenko * Revised ther def thresholds Signed-off-by: Vadym Yashchenko * Revised on code review Signed-off-by: Vadym Yashchenko * Revised platform.json and thermal_thresholds.json Signed-off-by: Vadym Yashchenko * Code review in PR to azure (trigger CI) Signed-off-by: Vadym Yashchenko * Added handle of exception Signed-off-by: Vadym Yashchenko * Revised exception handler * Added psu-1 thermal names to platfrom.json Signed-off-by: Vadym Yashchenko * Changed platform.json and thermal_thresholds.json in x86_64-acton_as9516_32d-r0 Signed-off-by: Vadym Yashchenko * Removed indentation from json file Signed-off-by: Vadym Yashchenko --- .../thermal_thresholds.json | 61 +++++++++++++ .../platform.json | 29 +++--- .../thermal_thresholds.json | 64 +++++++++++++ .../sonic_platform/thermal.py | 89 +++++++++++++++++-- 4 files changed, 224 insertions(+), 19 deletions(-) create mode 100644 device/barefoot/x86_64-accton_as9516_32d-r0/thermal_thresholds.json create mode 100644 device/barefoot/x86_64-accton_wedge100bf_32x-r0/thermal_thresholds.json diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/thermal_thresholds.json b/device/barefoot/x86_64-accton_as9516_32d-r0/thermal_thresholds.json new file mode 100644 index 000000000000..451067eb603c --- /dev/null +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/thermal_thresholds.json @@ -0,0 +1,61 @@ +{ + "thermals": [ + { + "com_e_driver-i2c-4-33:cpu-temp" : [99.0, 89.0, 11.0, 1.0] + }, + { + "com_e_driver-i2c-4-33:memory-temp" : [85.0, 75.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-48:chip-temp" : [90.0, 80.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-49:exhaust2-temp" : [80.0, 70.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4a:exhaust-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4b:intake-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4c:tofino-temp" : [99.0, 89.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4d:intake2-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:package-id-0" : [80.0, 70.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-0" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-1" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-2" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-3" : [99.0, 89.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-59:psu2-temp1" : [60.0, 50.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-59:psu2-temp2" : [60.0, 50.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-59:psu2-temp3" : [60.0, 50.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-5a:psu1-temp1" : [60.0, 50.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-5a:psu1-temp2" : [60.0, 50.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-5a:psu1-temp3" : [60.0, 50.0, 11.0, 1.0] + } + ] +} \ No newline at end of file diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json index ea18a031344e..5fee4f0eebaf 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/platform.json @@ -57,38 +57,41 @@ } ], "thermals": [ + { + "name": "com_e_driver-i2c-4-33:cpu-temp" + }, { "name": "com_e_driver-i2c-4-33:memory-temp" }, { - "name": "com_e_driver-i2c-4-33:cpu-temp" + "name": "psu_driver-i2c-7-59:psu2-temp1" }, { - "name": "pfe1100-i2c-7-59:temp1" + "name": "psu_driver-i2c-7-59:psu2-temp2" }, { - "name": "pfe1100-i2c-7-59:temp2" + "name": "psu_driver-i2c-7-5a:psu1-temp1" }, { - "name": "pfe1100-i2c-7-5a:temp1" + "name": "psu_driver-i2c-7-5a:psu1-temp2" }, { - "name": "pfe1100-i2c-7-5a:temp2" + "name": "tmp75-i2c-3-48:chip-temp" }, { - "name": "tmp75-i2c-3-48:outlet-middle-temp" + "name": "tmp75-i2c-3-49:exhaust2-temp" }, { - "name": "tmp75-i2c-3-49:inlet-middle-temp" + "name": "tmp75-i2c-3-4a:exhaust-temp" }, { - "name": "tmp75-i2c-3-4a:inlet-left-temp" + "name": "tmp75-i2c-3-4b:intake-temp" }, { - "name": "tmp75-i2c-3-4b:switch-temp" + "name": "tmp75-i2c-3-4c:tofino-temp" }, { - "name": "tmp75-i2c-3-4c:inlet-right-temp" + "name": "tmp75-i2c-3-4d:intake2-temp" }, { "name": "tmp75-i2c-8-48:outlet-right-temp" @@ -96,6 +99,9 @@ { "name": "tmp75-i2c-8-49:outlet-left-temp" }, + { + "name": "pch_haswell-virtual-0:temp1" + }, { "name": "coretemp-isa-0000:package-id-0" }, @@ -110,9 +116,6 @@ }, { "name": "coretemp-isa-0000:core-3" - }, - { - "name": "pch_haswell-virtual-0:temp1" } ], "sfps": [ diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/thermal_thresholds.json b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/thermal_thresholds.json new file mode 100644 index 000000000000..bee961a84411 --- /dev/null +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/thermal_thresholds.json @@ -0,0 +1,64 @@ +{ + "thermals": [ + { + "com_e_driver-i2c-4-33:cpu-temp" : [99.0, 89.0, 11.0, 1.0] + }, + { + "com_e_driver-i2c-4-33:memory-temp" : [85.0, 75.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-59:psu2-temp1" : [50.0, 40.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-59:psu2-temp2" : [90.0, 80.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-5a:psu1-temp1" : [50.0, 40.0, 11.0, 1.0] + }, + { + "psu_driver-i2c-7-5a:psu1-temp2" : [90.0, 80.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-48:chip-temp" : [90.0, 80.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-49:exhaust2-temp" : [80.0, 70.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4a:exhaust-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4b:intake-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4c:tofino-temp" : [99.0, 89.0, 11.0, 1.0] + }, + { + "tmp75-i2c-3-4d:intake2-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-8-48:outlet-right-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "tmp75-i2c-8-49:outlet-left-temp" : [60.0, 50.0, 11.0, 1.0] + }, + { + "pch_haswell-virtual-0:temp1" : [60.0, 50.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:package-id-0" : [80.0, 70.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-0" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-1" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-2" : [99.0, 89.0, 11.0, 1.0] + }, + { + "coretemp-isa-0000:core-3" : [99.0, 89.0, 11.0, 1.0] + } + ] +} \ No newline at end of file diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/thermal.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/thermal.py index ef3c571ac301..e5034f09f558 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/thermal.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/thermal.py @@ -1,8 +1,11 @@ try: import subprocess - + from collections import namedtuple + import json from bfn_extensions.platform_sensors import platform_sensors_get from sonic_platform_base.thermal_base import ThermalBase + from sonic_py_common import device_info + import logging except ImportError as e: raise ImportError (str(e) + "- required module not found") @@ -18,6 +21,8 @@ temp2_input: 37.000 ... ''' +Threshold = namedtuple('Threshold', ['crit', 'max', 'min', 'alarm']) + def _sensors_chip_parsed(data: str): def kv(line): k, v, *_ = [t.strip(': ') for t in line.split(':') if t] + [''] @@ -68,27 +73,89 @@ def _value_get(d: dict, key_prefix, key_suffix=''): # Thermal -> ThermalBase -> DeviceBase class Thermal(ThermalBase): + _thresholds = dict() + _max_temperature = 100.0 + _min_temperature = 0.0 + _min_high_threshold_temperature = 35.0 + def __init__(self, chip, label, index = 0): self.__chip = chip self.__label = label self.__name = f"{chip}:{label}".lower().replace(' ', '-') self.__collect_temp = [] self.__index = index + self.__high_threshold = None + self.__low_threshold = None + f = None + try: + path = device_info.get_path_to_platform_dir() + '/' + 'thermal_thresholds.json' + f = open(path) + except FileNotFoundError: + logging.warning('can not open the file') + + if f is not None: + self.__get_thresholds(f) + + def __get_thresholds(self, f): + def_threshold_json = json.load(f) + all_data = def_threshold_json["thermals"] + for i in all_data: + for key, value in i.items(): + self._thresholds[key] = Threshold(*value) + + def check_in_range(self, temperature): + temp_f = float(temperature) + return temp_f > self._min_temperature and temp_f <= self._max_temperature + + def check_high_threshold(self, temperature, attr_suffix): + temp_f = float(temperature) + check_range = True + if attr_suffix == 'max': + if temp_f < self._min_high_threshold_temperature: + if self.__name in self._thresholds: + temp = self._thresholds[self.__name].max + self.set_high_threshold(temp) + check_range = False + return check_range def __get(self, attr_prefix, attr_suffix): sensor_data = _sensors_get().get(self.__chip, {}).get(self.__label, {}) value = _value_get(sensor_data, attr_prefix, attr_suffix) - return value if value is not None else -999.9 + if value is not None and self.check_in_range(value) and self.check_high_threshold(value, attr_suffix): + return value + elif self.__name in self._thresholds and attr_prefix == 'temp': + if attr_suffix == 'crit': + return self._thresholds[self.__name].crit + elif attr_suffix == 'max': + if self.__high_threshold is None: + return self._thresholds[self.__name].max + else: + return self.__high_threshold + elif attr_suffix == 'min': + if self.__low_threshold is None: + return self._thresholds[self.__name].min + else: + return self.__low_threshold + elif attr_suffix == 'alarm': + return self._thresholds[self.__name].alarm + else: + return 1.0 + else: + return 0.05 # ThermalBase interface methods: def get_temperature(self) -> float: temp = self.__get('temp', 'input') self.__collect_temp.append(float(temp)) self.__collect_temp.sort() + if len(self.__collect_temp) == 3: + del self.__collect_temp[1] return float(temp) def get_high_threshold(self) -> float: - return float(self.__get('temp', 'max')) + if self.__high_threshold is None: + return float(self.__get('temp', 'max')) + return float(self.__high_threshold) def get_high_critical_threshold(self) -> float: return float(self.__get('temp', 'crit')) @@ -113,28 +180,38 @@ def is_replaceable(self): return False def get_low_threshold(self) -> float: - return float(self.__get('temp', 'min')) + if self.__low_threshold is None: + return float(self.__get('temp', 'min')) + return float(self.__low_threshold) def get_serial(self): return 'N/A' def get_minimum_recorded(self) -> float: - temp = self.__collect_temp[0] if len(self.__collect_temp) > 0 else 0.1 + temp = self.__collect_temp[0] if len(self.__collect_temp) > 0 else self.get_temperature() + temp = temp if temp <= 100.0 else 100.0 temp = temp if temp > 0.0 else 0.1 return float(temp) def get_maximum_recorded(self) -> float: - temp = self.__collect_temp[-1] if len(self.__collect_temp) > 0 else 100.0 + temp = self.__collect_temp[-1] if len(self.__collect_temp) > 0 else self.get_temperature() temp = temp if temp <= 100.0 else 100.0 + temp = temp if temp > 0.0 else 0.1 return float(temp) def get_position_in_parent(self): return self.__index def set_high_threshold(self, temperature): + if self.check_in_range(temperature): + self.__high_threshold = temperature + return True return False def set_low_threshold(self, temperature): + if self.check_in_range(temperature): + self.__low_threshold = temperature + return True return False def thermal_list_get(): From 58df23e1d714e503bc6768f5ff7f51496295ddf3 Mon Sep 17 00:00:00 2001 From: byu343 Date: Tue, 5 Apr 2022 09:49:26 -0700 Subject: [PATCH 174/817] [arista] Update serdes tuning values for 7280cr3 (#9966) --- .../Arista-7280CR3-C40/gearbox_100G_PAM4.xml | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_100G_PAM4.xml b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_100G_PAM4.xml index 95e20b91787e..0ac9ff7b7846 100644 --- a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_100G_PAM4.xml +++ b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_100G_PAM4.xml @@ -4,11 +4,6 @@ 0 gearbox 2 - - 2,-8,17,0,0 - 0,-8,17,0,0 - - 0,0,1,0,0 @@ -34,4 +29,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bfe5835650873d207020fd371819d407a9f3b3e1 Mon Sep 17 00:00:00 2001 From: Taras Keryk Date: Tue, 5 Apr 2022 21:33:51 +0300 Subject: [PATCH 175/817] [BFN] Fix exception when fwutil run without sudo (#10335) * [BFN] Fix for run fwutil without sudo SONiC has a concept of "platform components" this may include - CPLD, FPGA, BIOS, BMC, etc. These changes are needed to read the version of the BIOS and BMC component. What I did The previous implementaion of component.py expect fwutil run with sudo. When fwutil run without sudo, there are an exception: ``` Traceback (most recent call last): File "/usr/local/bin/fwutil", line 5, in from fwutil.main import cli File "/usr/local/lib/python3.9/dist-packages/fwutil/__init__.py", line 3, in from . import main File "/usr/local/lib/python3.9/dist-packages/fwutil/main.py", line 40, in pdp = PlatformDataProvider() File "/usr/local/lib/python3.9/dist-packages/fwutil/lib.py", line 159, in __init__ self.__platform = Platform() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/platform.py", line 21, in __init__ self._chassis = Chassis() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 48, in __init__ self.__initialize_components() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 136, in __initialize_components component = Components(index) File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 184, in __init__ self.version = get_bios_version() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 19, in get_bios_version return subprocess.check_output(['dmidecode', '-s', 'bios-version']).strip().decode() File "/usr/lib/python3.9/subprocess.py", line 424, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "/usr/lib/python3.9/subprocess.py", line 505, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.9/subprocess.py", line 951, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'dmidecode' ``` How I did it Modification of dmidecode command How to verify it Run manually 'fwutil' (without sudo) Previous command output had exception New command output: Root privileges are required Signed-off-by: Taras Keryk * Why I did it The previous implementaion of component.py expect fwutil run with sudo. When fwutil run without sudo, there are an exception: Traceback (most recent call last): File "/usr/local/bin/fwutil", line 5, in from fwutil.main import cli File "/usr/local/lib/python3.9/dist-packages/fwutil/__init__.py", line 3, in from . import main File "/usr/local/lib/python3.9/dist-packages/fwutil/main.py", line 40, in pdp = PlatformDataProvider() File "/usr/local/lib/python3.9/dist-packages/fwutil/lib.py", line 159, in __init__ self.__platform = Platform() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/platform.py", line 21, in __init__ self._chassis = Chassis() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 48, in __init__ self.__initialize_components() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 136, in __initialize_components component = Components(index) File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 184, in __init__ self.version = get_bios_version() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 19, in get_bios_version return subprocess.check_output(['dmidecode', '-s', 'bios-version']).strip().decode() File "/usr/lib/python3.9/subprocess.py", line 424, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "/usr/lib/python3.9/subprocess.py", line 505, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.9/subprocess.py", line 951, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'dmidecode' How I did it Modification of dmidecode command How to verify it Run manually 'fwutil' (without sudo) Previous command output had exception New command output: Root privileges are required Signed-off-by: Taras Keryk tarasx.keryk@intel.com Signed-off-by: Taras Keryk * rewrite a call of dmidecode, when run without sudo Signed-off-by: Taras Keryk * Why I did it The previous implementaion of component.py expect fwutil run with sudo. When fwutil run without sudo, there are an exception: Traceback (most recent call last): File "/usr/local/bin/fwutil", line 5, in from fwutil.main import cli File "/usr/local/lib/python3.9/dist-packages/fwutil/__init__.py", line 3, in from . import main File "/usr/local/lib/python3.9/dist-packages/fwutil/main.py", line 40, in pdp = PlatformDataProvider() File "/usr/local/lib/python3.9/dist-packages/fwutil/lib.py", line 159, in __init__ self.__platform = Platform() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/platform.py", line 21, in __init__ self._chassis = Chassis() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 48, in __init__ self.__initialize_components() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 136, in __initialize_components component = Components(index) File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 184, in __init__ self.version = get_bios_version() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/component.py", line 19, in get_bios_version return subprocess.check_output(['dmidecode', '-s', 'bios-version']).strip().decode() File "/usr/lib/python3.9/subprocess.py", line 424, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "/usr/lib/python3.9/subprocess.py", line 505, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.9/subprocess.py", line 951, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'dmidecode' The previous implementaion of eeprom.py expect fwutil run with sudo. When fwutil run without sudo, there are an exception: Traceback (most recent call last): File "/usr/lib/python3.9/logging/config.py", line 564, in configure handler = self.configure_handler(handlers[name]) File "/usr/lib/python3.9/logging/config.py", line 745, in configure_handler result = factory(**kwargs) File "/usr/lib/python3.9/logging/handlers.py", line 153, in init BaseRotatingHandler.init(self, filename, mode, encoding=encoding, File "/usr/lib/python3.9/logging/handlers.py", line 58, in init logging.FileHandler.init(self, filename, mode=mode, File "/usr/lib/python3.9/logging/init.py", line 1142, in init StreamHandler.init(self, self._open()) File "/usr/lib/python3.9/logging/init.py", line 1171, in _open return open(self.baseFilename, self.mode, encoding=self.encoding, PermissionError: [Errno 13] Permission denied: '/var/log/platform.log' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/bin/fwutil", line 5, in from fwutil.main import cli File "/usr/local/lib/python3.9/dist-packages/fwutil/init.py", line 3, in from . import main File "/usr/local/lib/python3.9/dist-packages/fwutil/main.py", line 41, in pdp = PlatformDataProvider() File "/usr/local/lib/python3.9/dist-packages/fwutil/lib.py", line 162, in init self.chassis_component_map = self.__get_chassis_component_map() File "/usr/local/lib/python3.9/dist-packages/fwutil/lib.py", line 168, in __get_chassis_component_map chassis_name = self.__chassis.get_name() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 146, in get_name return self._eeprom.modelstr() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 54, in _eeprom self.__eeprom = Eeprom() File "/usr/local/lib/python3.9/dist-packages/sonic_platform/eeprom.py", line 50, in init logging.config.dictConfig(config_dict) File "/usr/lib/python3.9/logging/config.py", line 809, in dictConfig dictConfigClass(config).configure() File "/usr/lib/python3.9/logging/config.py", line 571, in configure raise ValueError('Unable to configure handler ' ValueError: Unable to configure handler 'file' How I did it Modification call of dmidecode command. Added modification of log files access attributes before file open operations. How to verify it Run manually 'fwutil' (without sudo) New command output have no exception. Signed-off-by: Taras Keryk * Added file_check for checking access to log files for eeprom.py Signed-off-by: Taras Keryk * Removed unused import * Added logfile_create to eeprom.py and chassis.py Signed-off-by: Taras Keryk * Created platform_utils.py Signed-off-by: Taras Keryk * Added interpreter string to platform_utils.py Signed-off-by: Taras Keryk --- .../sonic_platform/chassis.py | 10 +++++++++ .../sonic_platform/component.py | 8 +++++-- .../sonic_platform/eeprom.py | 20 ++++------------- .../sonic_platform/platform_utils.py | 22 +++++++++++++++++++ 4 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py index 64536abbb532..6d0e8b8c120c 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py @@ -1,8 +1,12 @@ #!/usr/bin/env python try: + import os import time import syslog + import logging + import logging.config + import yaml from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.sfp import Sfp @@ -10,6 +14,7 @@ from sonic_platform.fan_drawer import fan_drawer_list_get from sonic_platform.thermal import thermal_list_get from eeprom import Eeprom + from platform_utils import file_create from sonic_platform.platform_thrift_client import pltfm_mgr_ready from sonic_platform.platform_thrift_client import thrift_try @@ -47,6 +52,11 @@ def __init__(self): self.qsfp_interval = self.QSFP_CHECK_INTERVAL self.__initialize_components() + with open(os.path.dirname(__file__) + "/logging.conf", 'r') as f: + config_dict = yaml.load(f, yaml.SafeLoader) + file_create(config_dict['handlers']['file']['filename'], '646') + logging.config.dictConfig(config_dict) + @property def _eeprom(self): if self.__eeprom is None: diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py index 5e72bb63e343..47a0993bf3e5 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py @@ -1,4 +1,5 @@ try: + import os import subprocess from sonic_platform_base.component_base import ComponentBase from platform_thrift_client import thrift_try @@ -16,9 +17,12 @@ def get_bios_version(): A string containing the firmware version of the BIOS """ try: - return subprocess.check_output(['dmidecode', '-s', 'bios-version']).strip().decode() + cmd = ['dmidecode', '-s', 'bios-version'] + if os.geteuid() != 0: + cmd.insert(0, 'sudo') + return subprocess.check_output(cmd).strip().decode() except subprocess.CalledProcessError as e: - raise RuntimeError("Failed to getget BIOS version") + raise RuntimeError("Failed to get BIOS version") def get_bmc_version(): """ diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py index ec7112b3c093..2335c02863d9 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py @@ -1,11 +1,7 @@ try: import os import sys - import errno import datetime - import logging - import logging.config - import yaml import re sys.path.append(os.path.dirname(__file__)) @@ -17,6 +13,7 @@ from sonic_platform_base.sonic_eeprom import eeprom_base from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo + from platform_utils import file_create from platform_thrift_client import thrift_try except ImportError as e: @@ -45,18 +42,8 @@ class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self): - with open(os.path.dirname(__file__) + "/logging.conf", 'r') as f: - config_dict = yaml.load(f, yaml.SafeLoader) - logging.config.dictConfig(config_dict) - - if not os.path.exists(os.path.dirname(_EEPROM_SYMLINK)): - try: - os.makedirs(os.path.dirname(_EEPROM_SYMLINK)) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - open(_EEPROM_SYMLINK, 'a').close() + file_create(_EEPROM_SYMLINK, '646') + file_create(_EEPROM_STATUS, '646') with open(_EEPROM_STATUS, 'w') as f: f.write("initializing..") @@ -152,3 +139,4 @@ def modelstr(self): def revision_str(self): return self.__tlv_get(self._TLV_CODE_LABEL_REVISION) + diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py new file mode 100644 index 000000000000..81e78ee01041 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +try: + import os + import subprocess + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +def file_create(path, mode=None): + def run_cmd(cmd): + if os.geteuid() != 0: + cmd.insert(0, 'sudo') + subprocess.check_output(cmd) + + file_path = os.path.dirname(path) + if not os.path.exists(file_path): + run_cmd(['mkdir', '-p', file_path]) + if not os.path.isfile(path): + run_cmd(['touch', path]) + if (mode is not None): + run_cmd(['chmod', mode, path]) From 3391969d2e3560ee2c73b617bf7332470c1c2b71 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:34:02 +0800 Subject: [PATCH 176/817] [Ci]: Fix the docker slave azp template issue (#10453) Why I did it [Ci]: Fix the docker slave azp template issue --- .azure-pipelines/docker-sonic-slave-template.yml | 5 +++-- .azure-pipelines/docker-sonic-slave.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 2a9421dda338..ac5eb9a34722 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -40,7 +40,7 @@ jobs: - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - template: template-clean-sonic-slave.yml - ${{ else }}: - - template: .azure-pipelines/template-variables.yml@buildimage + - template: '/.azure-pipelines/template-clean-sonic-slave.yml@buildimage' - checkout: self clean: true submodules: recursive @@ -103,7 +103,8 @@ jobs: command: push tags: | $(VARIABLE_SLAVE_BASE_TAG) - latest + ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: + latest - ${{ if ne(parameters.arch, 'amd64') }}: - task: Docker@2 condition: ne(variables['Build.Reason'], 'PullRequest') diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index a6a9750a3808..7b812b8a4349 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -67,7 +67,7 @@ stages: arch: ${{ arch }} dist: ${{ dist }} - ${{ else }}: - - template: .azure-pipelines/docker-sonic-slave-template.yml@buildimage + - template: '/.azure-pipelines/docker-sonic-slave-template.yml@buildimage' parameters: pool: sonicbld arch: ${{ arch }} From ce26c04a099dbae6021db934d5d0e7cc43598210 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:51:41 +0800 Subject: [PATCH 177/817] [Build]: fix debian package not found issue (#10447) Why I did it [Build]: fix debian package not found issue --- sonic-slave-bullseye/Dockerfile.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index a75cef0b680e..741f708de269 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -20,7 +20,9 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bull echo "deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian bullseye-backports main" >> /etc/apt/sources.list + echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian bullseye-backports main" >> /etc/apt/sources.list && \ + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list {%- if CONFIGURED_ARCH == "armhf" %} RUN echo "deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free" > /etc/apt/sources.list && \ From b152f2a0fc180237d44c6f95c7e0c0dca77b6ae0 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Wed, 6 Apr 2022 14:33:26 +0800 Subject: [PATCH 178/817] [sonic-cfggen]: Update unit test to remove asn 0 (#10454) Why I did it ASN range is from 1 to 4294967295, need to remove invalid ASN. How I did it Update unit test and replace ASN 0. How to verify it Run unit test for sonic-config-engine. Signed-off-by: Gang Lv ganglv@microsoft.com --- src/sonic-config-engine/tests/radv-test-sample-graph.xml | 2 +- src/sonic-config-engine/tests/sample-graph-resource-type.xml | 2 +- src/sonic-config-engine/tests/sample-graph-subintf.xml | 2 +- src/sonic-config-engine/tests/simple-sample-graph.xml | 2 +- src/sonic-config-engine/tests/t0-sample-graph.xml | 2 +- src/sonic-config-engine/tests/test_cfggen.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sonic-config-engine/tests/radv-test-sample-graph.xml b/src/sonic-config-engine/tests/radv-test-sample-graph.xml index 6945c8e175d2..a45e38f64030 100644 --- a/src/sonic-config-engine/tests/radv-test-sample-graph.xml +++ b/src/sonic-config-engine/tests/radv-test-sample-graph.xml @@ -90,7 +90,7 @@ - 0 + 1 BGPMonitor diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index f09e4112d8ff..aecc1bc3249f 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -72,7 +72,7 @@ - 0 + 1 BGPMonitor diff --git a/src/sonic-config-engine/tests/sample-graph-subintf.xml b/src/sonic-config-engine/tests/sample-graph-subintf.xml index 29568be727a7..fe18baa79db1 100644 --- a/src/sonic-config-engine/tests/sample-graph-subintf.xml +++ b/src/sonic-config-engine/tests/sample-graph-subintf.xml @@ -72,7 +72,7 @@ - 0 + 1 BGPMonitor diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index 388627f8cdbf..aef72017d72b 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -72,7 +72,7 @@ - 0 + 1 BGPMonitor diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index f0da95149653..6d9e21c4f81b 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -90,7 +90,7 @@ - 0 + 1 BGPMonitor diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index e5ef35274db7..09f507f3d9f9 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -685,7 +685,7 @@ def test_minigraph_bgp_mon(self): output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), - utils.to_dict("{'10.20.30.40': {'rrclient': 0, 'name': 'BGPMonitor', 'local_addr': '10.1.0.32', 'nhopself': 0, 'holdtime': '10', 'asn': '0', 'keepalive': '3'}}") + utils.to_dict("{'10.20.30.40': {'rrclient': 0, 'name': 'BGPMonitor', 'local_addr': '10.1.0.32', 'nhopself': 0, 'holdtime': '10', 'asn': '1', 'keepalive': '3'}}") ) def test_minigraph_bgp_voq_chassis_peer(self): From ed14eb526382dffa8c414255347c70800584a907 Mon Sep 17 00:00:00 2001 From: Vivek R Date: Wed, 6 Apr 2022 06:59:47 -0700 Subject: [PATCH 179/817] [interfaces-config] "main exception: cannot find interfaces: eth0" error log avoided (#10463) - Why I did it Fixes #9628 During bootup, this error log is seen Dec 22 04:26:29 sonic interfaces-config.sh[2546]: error: main exception: cannot find interfaces: eth0 (interface was probably never up ?) This is of non-functional nature and doesn't affect the flow. - How I did it Dont take the ifdown if not needed - How to verify it Verified during reboot. Log did not appear and IP was acquired on eth0 as expected Signed-off-by: Vivek Reddy Karri --- files/image_config/interfaces/interfaces-config.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 5753bebd378d..646fd7a94e71 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,6 +1,8 @@ #!/bin/bash -ifdown --force eth0 +if [[ $(ifquery --running eth0) ]]; then + ifdown --force eth0 +fi # Check if ZTP DHCP policy has been installed if [ -e /etc/network/ifupdown2/policy.d/ztp_dhcp.json ]; then From 614d14e8a098ba9cd5ca9788a6d3e4d696075df3 Mon Sep 17 00:00:00 2001 From: Vivek R Date: Wed, 6 Apr 2022 07:05:05 -0700 Subject: [PATCH 180/817] [submodule] update sonic-snmpagent pointer (#10461) 890f32f LLDPLocalSystemDataUpdater Exception Log Handled (#249) 2151731 Handle error seen on system where vlan interface map is not present (#246) c6141c7 [build] use Azure.sonic-buildimage.official.vs pipeline as artifact source (#248) Signed-off-by: Vivek Reddy Karri --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 2654f4a66794..890f32f333df 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 2654f4a667941296d4e56a16e8e1a7d1d5fca7b6 +Subproject commit 890f32f333dfe31c36a8342ff70c0e84910bf9c8 From 8cd346d80b1cb6247a8367ec08f09072a1722e4e Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Wed, 6 Apr 2022 09:44:21 -0700 Subject: [PATCH 181/817] Update docker-router-advertiser.supervisord.conf.j2 (#10375) --- .../docker-router-advertiser.supervisord.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 index 7562444946ed..22f33e412195 100644 --- a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 +++ b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 @@ -45,7 +45,7 @@ dependent_startup_wait_for=rsyslogd:running {%- set vlan_v6 = namespace(count=0) -%} {%- if DEVICE_METADATA.localhost.deployment_id != "8" -%} {%- if DEVICE_METADATA.localhost.type -%} - {%- if "ToRRouter" in DEVICE_METADATA.localhost.type or DEVICE_METADATA.localhost.type == "EPMS" -%} + {%- if "ToRRouter" in DEVICE_METADATA.localhost.type or DEVICE_METADATA.localhost.type in ["EPMS", "MgmtTsToR"] -%} {%- if VLAN_INTERFACE -%} {%- for (name, prefix) in VLAN_INTERFACE|pfx_filter -%} {# If this VLAN has an IPv6 address... #} From d83ae1e3dce79200a89dda3926878b35b0f3f314 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Wed, 6 Apr 2022 17:46:41 -0700 Subject: [PATCH 182/817] [yang] Fix yang validation failure when table contains empty value (#10431) Why I did it Fix #9746 How I did it Split the check condition based on non-exist and zero length. How to verify it Run verification script when table contains empty value --- src/sonic-yang-mgmt/sonic_yang_ext.py | 23 +++++++++++-------- .../libyang-python-tests/test_sonic_yang.py | 15 ++++++++++++ .../tests/files/sample_config_db.json | 8 ++++++- .../tests/yang_model_tests/tests/tacacs.json | 4 ++-- .../yang-models/sonic-device_metadata.yang | 2 +- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py index aa36ee0a1951..d43e52970302 100644 --- a/src/sonic-yang-mgmt/sonic_yang_ext.py +++ b/src/sonic-yang-mgmt/sonic_yang_ext.py @@ -591,18 +591,23 @@ def _xlateListInContainer(self, model, yang, configC, table, exceptionList): """ def _xlateContainerInContainer(self, model, yang, configC, table): ccontainer = model - #print(ccontainer['@name']) - yang[ccontainer['@name']] = dict() - if not configC.get(ccontainer['@name']): + ccName = ccontainer['@name'] + yang[ccName] = dict() + if ccName not in configC: + # Inner container doesn't exist in config return - self.sysLog(msg="xlateProcessListOfContainer: {}".format(ccontainer['@name'])) - self._xlateContainer(ccontainer, yang[ccontainer['@name']], \ - configC[ccontainer['@name']], table) + if len(configC[ccName]) == 0: + # Empty container, clean config and return + del configC[ccName] + return + self.sysLog(msg="xlateProcessListOfContainer: {}".format(ccName)) + self._xlateContainer(ccontainer, yang[ccName], \ + configC[ccName], table) # clean empty container - if len(yang[ccontainer['@name']]) == 0: - del yang[ccontainer['@name']] + if len(yang[ccName]) == 0: + del yang[ccName] # remove copy after processing - del configC[ccontainer['@name']] + del configC[ccName] return diff --git a/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py b/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py index 3eb396594e80..a13d4c02e9a0 100644 --- a/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py +++ b/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py @@ -364,5 +364,20 @@ def test_table_with_no_yang(self, sonic_yang_data): return + def test_special_json_with_yang(self, sonic_yang_data): + # in this test, we validate unusual json config and check if + # loadData works successfully + test_file = sonic_yang_data['test_file'] + syc = sonic_yang_data['syc'] + + # read config + jIn = self.readIjsonInput(test_file, 'SAMPLE_CONFIG_DB_SPECIAL_CASE') + jIn = json.loads(jIn) + + # load config and create Data tree + syc.loadData(jIn) + + return + def teardown_class(self): pass diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index ff99fc7335df..6618ed8232b7 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -304,7 +304,7 @@ "switch_id": "2", "switch_type": "voq", "max_cores": "8", - "sub_role": "FrondEnd", + "sub_role": "FrontEnd", "dhcp_server": "disabled" } }, @@ -1694,5 +1694,11 @@ "UNKNOWN_TABLE": { "Error": "This Table is for testing, This Table does not have YANG models." } + }, + "SAMPLE_CONFIG_DB_SPECIAL_CASE": { + "TACPLUS": { + "global": { + } + } } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/tacacs.json b/src/sonic-yang-models/tests/yang_model_tests/tests/tacacs.json index 5236aab596fe..6888a4e3f326 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/tacacs.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/tacacs.json @@ -4,7 +4,7 @@ }, "TACPLUS_INVALID_TIMEOUT_TEST": { "desc": "Tacplus global configuration with invalid timeout value in TACPLUS table.", - "eStr": "TACACS timeout must be 1..60" + "eStr": "TACACS timeout must be 1..60" }, "TACPLUS_NOT_PRESENT_SRC_INTF_TEST": { "desc": "Tacplus global configuration with a non existent port in TACPLUS table.", @@ -15,7 +15,7 @@ }, "TACPLUS_SERVER_INVALID_PRIORITY_TEST": { "desc": "Tacplus server configuration with invalid priority value in TACPLUS_SERVER table.", - "eStr": "TACACS server priority must be 1..64" + "eStr": "TACACS server priority must be 1..64" }, "TACPLUS_SERVER_INVALID_TIMEOUT_TEST" : { "desc": "Tacplus server configuration with invalid timeout value in TACPLUS_SERVER table.", diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index 618ed19cd81f..a349a3eb9366 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -129,7 +129,7 @@ module sonic-device_metadata { leaf sub_role { type string; - description "sub_role indicates if ASIC is FrondEnd or BackEnd."; + description "sub_role indicates if ASIC is FrontEnd or BackEnd."; } leaf downstream_subrole { From 0330253fd7df69e49cb082313277c29ccb0cfe8b Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Thu, 7 Apr 2022 13:02:35 +0800 Subject: [PATCH 183/817] [ci] Fix issues in docker-slave official build. (#10477) only push latest tag on master build --- .azure-pipelines/docker-sonic-slave-template.yml | 9 ++++++--- .azure-pipelines/docker-sonic-slave.yml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index ac5eb9a34722..2cf06638a4cc 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -101,10 +101,13 @@ jobs: containerRegistry: ${{ parameters.registry_conn }} repository: $(VARIABLE_SLAVE_BASE_IMAGE) command: push - tags: | - $(VARIABLE_SLAVE_BASE_TAG) - ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: + ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: + tags: | + $(VARIABLE_SLAVE_BASE_TAG) latest + ${{ else }}: + tags: | + $(VARIABLE_SLAVE_BASE_TAG) - ${{ if ne(parameters.arch, 'amd64') }}: - task: Docker@2 condition: ne(variables['Build.Reason'], 'PullRequest') diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index 7b812b8a4349..3e1d2848277e 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -60,7 +60,7 @@ stages: - ${{ each dist in parameters.dists }}: - ${{ if endswith(variables['Build.DefinitionName'], dist) }}: - ${{ each arch in parameters.arches }}: - - ${{ if eq(variables['System.PullRequest.TargetBranch'], 'master') }}: + - ${{ if eq(variables[''Build.Reason], 'PullRequest') }}: - template: docker-sonic-slave-template.yml parameters: pool: sonicbld From 3046c798a158dd0f1bb6fb00fb0c4f951b18ec34 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Thu, 7 Apr 2022 13:50:07 +0800 Subject: [PATCH 184/817] [sonic-cfggen]: Add port speed for UT (#10483) Why I did it Need to run yang validation for sonic-cfggen unit test, and many unit test does not provide speed for port table. How I did it Update minigraph xml. How to verify it Run sonic-cfggen unit test. Signed-off-by: Gang Lv ganglv@microsoft.com --- .../sample-minigraph-noportchannel.xml | 288 ++++++++++++ .../tests/multi_npu_data/sample-minigraph.xml | 288 ++++++++++++ .../tests/pc-test-graph.xml | 394 ++++++++++++++++ .../tests/radv-test-sample-graph.xml | 368 +++++++++++++++ .../tests/sample-arista-7050-t0-minigraph.xml | 60 +++ .../tests/sample-graph-resource-type.xml | 324 ++++++++++++++ .../tests/sample-graph-subintf.xml | 324 ++++++++++++++ .../tests/sample-voq-graph.xml | 360 +++++++++++++++ .../tests/sample_graph.xml | 422 +++++++++++++++++- .../tests/sample_output/py2/ports.json | 189 ++++++++ .../tests/sample_output/py3/ports.json | 189 ++++++++ .../tests/simple-sample-graph-case.xml | 336 ++++++++++++++ .../tests/simple-sample-graph-metadata.xml | 336 ++++++++++++++ .../tests/simple-sample-graph.xml | 324 ++++++++++++++ .../tests/t0-sample-bgp-speaker.xml | 394 ++++++++++++++++ .../tests/t0-sample-deployment-id.xml | 394 ++++++++++++++++ .../tests/t0-sample-graph-mvrf.xml | 392 ++++++++++++++++ .../tests/t0-sample-graph.xml | 368 +++++++++++++++ .../tests/t2-chassis-fe-graph-pc.xml | 312 +++++++++++++ .../tests/t2-chassis-fe-graph-vni.xml | 348 +++++++++++++++ .../tests/t2-chassis-fe-graph.xml | 348 +++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 292 ++++++------ 22 files changed, 6903 insertions(+), 147 deletions(-) diff --git a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph-noportchannel.xml b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph-noportchannel.xml index 460f71e21c2a..6ec84dc4fe31 100644 --- a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph-noportchannel.xml +++ b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph-noportchannel.xml @@ -1119,6 +1119,294 @@ 0 40000 + + DeviceInterface + + true + 1 + Ethernet-BP0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP4 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP256 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP260 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP264 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP268 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP272 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP276 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP280 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP284 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP384 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP388 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP392 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP396 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP400 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP404 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP408 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP412 + + false + 0 + 0 + 40000 + true 0 diff --git a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml index 5dac8e95bf1a..935d2c0c833a 100644 --- a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml +++ b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml @@ -1105,6 +1105,294 @@ 0 40000 + + DeviceInterface + + true + 1 + Ethernet-BP0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP4 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP256 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP260 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP264 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP268 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP272 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP276 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP280 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP284 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP384 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP388 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP392 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP396 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP400 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP404 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP408 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet-BP412 + + false + 0 + 0 + 40000 + true 0 diff --git a/src/sonic-config-engine/tests/pc-test-graph.xml b/src/sonic-config-engine/tests/pc-test-graph.xml index 814686d8ff06..4a7ecabaf9f4 100644 --- a/src/sonic-config-engine/tests/pc-test-graph.xml +++ b/src/sonic-config-engine/tests/pc-test-graph.xml @@ -202,6 +202,400 @@ + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/radv-test-sample-graph.xml b/src/sonic-config-engine/tests/radv-test-sample-graph.xml index a45e38f64030..94cb73d67464 100644 --- a/src/sonic-config-engine/tests/radv-test-sample-graph.xml +++ b/src/sonic-config-engine/tests/radv-test-sample-graph.xml @@ -508,6 +508,374 @@ + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/sample-arista-7050-t0-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7050-t0-minigraph.xml index 4d216b30f203..4d79d6f2c457 100644 --- a/src/sonic-config-engine/tests/sample-arista-7050-t0-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7050-t0-minigraph.xml @@ -463,6 +463,66 @@ + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet1 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet2 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet3 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet4 + + false + 0 + 0 + 40000 + DeviceInterface diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index aecc1bc3249f..9ba4f1e70267 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -415,6 +415,330 @@ 0 100000 + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/sample-graph-subintf.xml b/src/sonic-config-engine/tests/sample-graph-subintf.xml index fe18baa79db1..d5fd2d461c8a 100644 --- a/src/sonic-config-engine/tests/sample-graph-subintf.xml +++ b/src/sonic-config-engine/tests/sample-graph-subintf.xml @@ -423,6 +423,330 @@ 0 100000 + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/sample-voq-graph.xml b/src/sonic-config-engine/tests/sample-voq-graph.xml index 5257efd4b0ae..5205265ee384 100644 --- a/src/sonic-config-engine/tests/sample-voq-graph.xml +++ b/src/sonic-config-engine/tests/sample-voq-graph.xml @@ -202,6 +202,366 @@ 100000 Interface description + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + Recycle0 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/sample_graph.xml b/src/sonic-config-engine/tests/sample_graph.xml index 7bd08ab8f7c8..478fdd5ba8d4 100644 --- a/src/sonic-config-engine/tests/sample_graph.xml +++ b/src/sonic-config-engine/tests/sample_graph.xml @@ -88,7 +88,7 @@ - Ethernet1 + Ethernet4 10.10.2.13/30 @@ -112,7 +112,7 @@ 40000 DeviceInterfaceLink OCPSCH01040DDLF - Ethernet1 + Ethernet4 OCPSCH0104002MS Ethernet12 @@ -124,6 +124,424 @@ + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet1 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet2 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + Force10-Z9100 + + + diff --git a/src/sonic-config-engine/tests/sample_output/py2/ports.json b/src/sonic-config-engine/tests/sample_output/py2/ports.json index 4b36790c7cd0..959a234eaace 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/ports.json +++ b/src/sonic-config-engine/tests/sample_output/py2/ports.json @@ -20,6 +20,104 @@ }, "OP": "SET" }, + { + "PORT_TABLE:Ethernet108": { + "speed": "100000", + "description": "fortyGigE0/108" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet100": { + "speed": "100000", + "description": "fortyGigE0/100" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet104": { + "speed": "100000", + "description": "fortyGigE0/104" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet68": { + "speed": "100000", + "description": "fortyGigE0/68" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet96": { + "speed": "100000", + "description": "fortyGigE0/96" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet124": { + "speed": "100000", + "description": "fortyGigE0/124" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet92": { + "speed": "100000", + "description": "fortyGigE0/92" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet120": { + "speed": "100000", + "description": "fortyGigE0/120" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet52": { + "speed": "100000", + "description": "fortyGigE0/52" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet56": { + "speed": "100000", + "description": "fortyGigE0/56" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet76": { + "speed": "100000", + "description": "fortyGigE0/76" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet72": { + "speed": "100000", + "description": "fortyGigE0/72" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet64": { + "speed": "100000", + "description": "fortyGigE0/64" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet32": { + "speed": "100000", + "description": "fortyGigE0/32" + }, + "OP": "SET" + }, { "PORT_TABLE:Ethernet16": { "speed": "1000", @@ -27,11 +125,102 @@ }, "OP": "SET" }, + { + "PORT_TABLE:Ethernet36": { + "speed": "100000", + "description": "fortyGigE0/36" + }, + "OP": "SET" + }, { "PORT_TABLE:Ethernet12": { "speed": "100000", "description": "Interface description" }, "OP": "SET" + }, + { + "PORT_TABLE:Ethernet88": { + "speed": "100000", + "description": "fortyGigE0/88" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet116": { + "speed": "100000", + "description": "fortyGigE0/116" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet80": { + "speed": "100000", + "description": "fortyGigE0/80" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet112": { + "speed": "100000", + "description": "fortyGigE0/112" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet84": { + "speed": "100000", + "description": "fortyGigE0/84" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet48": { + "speed": "100000", + "description": "fortyGigE0/48" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet44": { + "speed": "100000", + "description": "fortyGigE0/44" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet40": { + "speed": "100000", + "description": "fortyGigE0/40" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet28": { + "speed": "100000", + "description": "fortyGigE0/28" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet60": { + "speed": "100000", + "description": "fortyGigE0/60" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet20": { + "speed": "100000", + "description": "fortyGigE0/20" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet24": { + "speed": "100000", + "description": "fortyGigE0/24" + }, + "OP": "SET" } ] diff --git a/src/sonic-config-engine/tests/sample_output/py3/ports.json b/src/sonic-config-engine/tests/sample_output/py3/ports.json index 1fee36338bd2..de9d4e25d1f3 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/ports.json +++ b/src/sonic-config-engine/tests/sample_output/py3/ports.json @@ -33,5 +33,194 @@ "description": "fortyGigE0/16" }, "OP": "SET" + }, + { + "PORT_TABLE:Ethernet20": { + "speed": "100000", + "description": "fortyGigE0/20" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet24": { + "speed": "100000", + "description": "fortyGigE0/24" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet28": { + "speed": "100000", + "description": "fortyGigE0/28" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet32": { + "speed": "100000", + "description": "fortyGigE0/32" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet36": { + "speed": "100000", + "description": "fortyGigE0/36" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet40": { + "speed": "100000", + "description": "fortyGigE0/40" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet44": { + "speed": "100000", + "description": "fortyGigE0/44" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet48": { + "speed": "100000", + "description": "fortyGigE0/48" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet52": { + "speed": "100000", + "description": "fortyGigE0/52" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet56": { + "speed": "100000", + "description": "fortyGigE0/56" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet60": { + "speed": "100000", + "description": "fortyGigE0/60" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet64": { + "speed": "100000", + "description": "fortyGigE0/64" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet68": { + "speed": "100000", + "description": "fortyGigE0/68" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet72": { + "speed": "100000", + "description": "fortyGigE0/72" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet76": { + "speed": "100000", + "description": "fortyGigE0/76" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet80": { + "speed": "100000", + "description": "fortyGigE0/80" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet84": { + "speed": "100000", + "description": "fortyGigE0/84" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet88": { + "speed": "100000", + "description": "fortyGigE0/88" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet92": { + "speed": "100000", + "description": "fortyGigE0/92" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet96": { + "speed": "100000", + "description": "fortyGigE0/96" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet100": { + "speed": "100000", + "description": "fortyGigE0/100" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet104": { + "speed": "100000", + "description": "fortyGigE0/104" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet108": { + "speed": "100000", + "description": "fortyGigE0/108" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet112": { + "speed": "100000", + "description": "fortyGigE0/112" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet116": { + "speed": "100000", + "description": "fortyGigE0/116" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet120": { + "speed": "100000", + "description": "fortyGigE0/120" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet124": { + "speed": "100000", + "description": "fortyGigE0/124" + }, + "OP": "SET" } ] diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case.xml b/src/sonic-config-engine/tests/simple-sample-graph-case.xml index 08f750457499..d6a8c394f604 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case.xml @@ -527,6 +527,342 @@ 100000 Interface description + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/simple-sample-graph-metadata.xml b/src/sonic-config-engine/tests/simple-sample-graph-metadata.xml index 5691ff81578a..fbc33b49862a 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-metadata.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-metadata.xml @@ -321,6 +321,342 @@ 100000 Interface description + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index aef72017d72b..a8bd8b0b4685 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -415,6 +415,330 @@ 0 100000 + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + true 0 diff --git a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml index f2690985d9f3..552d219964c2 100644 --- a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml +++ b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml @@ -327,6 +327,400 @@ + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/t0-sample-deployment-id.xml b/src/sonic-config-engine/tests/t0-sample-deployment-id.xml index b6b47d979102..30517dfee19f 100644 --- a/src/sonic-config-engine/tests/t0-sample-deployment-id.xml +++ b/src/sonic-config-engine/tests/t0-sample-deployment-id.xml @@ -327,6 +327,400 @@ + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/t0-sample-graph-mvrf.xml b/src/sonic-config-engine/tests/t0-sample-graph-mvrf.xml index e7e2b5789816..3fd73f7369fe 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph-mvrf.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph-mvrf.xml @@ -387,6 +387,398 @@ + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet4 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet124 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 6d9e21c4f81b..15fb1dc79210 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -498,6 +498,374 @@ + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + diff --git a/src/sonic-config-engine/tests/t2-chassis-fe-graph-pc.xml b/src/sonic-config-engine/tests/t2-chassis-fe-graph-pc.xml index bc1a5142fc86..212d9c76a647 100644 --- a/src/sonic-config-engine/tests/t2-chassis-fe-graph-pc.xml +++ b/src/sonic-config-engine/tests/t2-chassis-fe-graph-pc.xml @@ -296,6 +296,318 @@ 0 25000 + + DeviceInterface + + false + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet124 + + false + 0 + 0 + 40000 + false 0 diff --git a/src/sonic-config-engine/tests/t2-chassis-fe-graph-vni.xml b/src/sonic-config-engine/tests/t2-chassis-fe-graph-vni.xml index 0dc534b3de88..9384446aa913 100644 --- a/src/sonic-config-engine/tests/t2-chassis-fe-graph-vni.xml +++ b/src/sonic-config-engine/tests/t2-chassis-fe-graph-vni.xml @@ -224,6 +224,354 @@ 0 40000 + + DeviceInterface + + false + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet124 + + false + 0 + 0 + 40000 + false 0 diff --git a/src/sonic-config-engine/tests/t2-chassis-fe-graph.xml b/src/sonic-config-engine/tests/t2-chassis-fe-graph.xml index 3b0c56a57a70..3fd8ed01c215 100644 --- a/src/sonic-config-engine/tests/t2-chassis-fe-graph.xml +++ b/src/sonic-config-engine/tests/t2-chassis-fe-graph.xml @@ -223,6 +223,354 @@ 0 40000 + + DeviceInterface + + false + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + false + 1 + Ethernet124 + + false + 0 + 0 + 40000 + false 0 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 09f507f3d9f9..e1f6844dd5f2 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -396,37 +396,37 @@ def test_minigraph_port_autonegotiation(self): self.assertEqual( utils.to_dict(output.strip()), utils.to_dict( - "{'Ethernet0': {'alias': 'fortyGigE0/0', 'pfc_asym': 'off', 'lanes': '29,30,31,32', 'description': 'fortyGigE0/0', 'mtu': '9100', 'tpid': '0x8100'}, " + "{'Ethernet0': {'alias': 'fortyGigE0/0', 'pfc_asym': 'off', 'lanes': '29,30,31,32', 'description': 'fortyGigE0/0', 'mtu': '9100', 'tpid': '0x8100', 'speed': '40000'}, " "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'Servers0:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'autoneg': 'on', 'speed': '100000', 'fec': 'none'}, " - "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'fortyGigE0/8', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'autoneg': 'off', 'fec': 'none'}, " - "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'fortyGigE0/12', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up'}, " - "'Ethernet16': {'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/16', 'admin_status': 'up'}, " - "'Ethernet20': {'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/20', 'admin_status': 'up'}, " - "'Ethernet24': {'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/24', 'admin_status': 'up'}, " - "'Ethernet28': {'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/28', 'admin_status': 'up'}, " - "'Ethernet32': {'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/32', 'admin_status': 'up'}, " - "'Ethernet36': {'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/36', 'admin_status': 'up'}, " - "'Ethernet40': {'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/40', 'admin_status': 'up'}, " - "'Ethernet44': {'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/44', 'admin_status': 'up'}, " - "'Ethernet48': {'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/48', 'admin_status': 'up'}, " - "'Ethernet52': {'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/52', 'admin_status': 'up'}, " - "'Ethernet56': {'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/56', 'admin_status': 'up'}, " - "'Ethernet60': {'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/60', 'admin_status': 'up'}, " - "'Ethernet64': {'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/64', 'admin_status': 'up'}, " - "'Ethernet68': {'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/68', 'admin_status': 'up'}, " - "'Ethernet72': {'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/72', 'admin_status': 'up'}, " - "'Ethernet76': {'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/76', 'admin_status': 'up'}, " - "'Ethernet80': {'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/80', 'admin_status': 'up'}, " - "'Ethernet84': {'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/84', 'admin_status': 'up'}, " - "'Ethernet88': {'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/88', 'admin_status': 'up'}, " - "'Ethernet92': {'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/92', 'admin_status': 'up'}, " - "'Ethernet96': {'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/96', 'admin_status': 'up'}, " - "'Ethernet100': {'lanes': '125,126,127,128', 'description': 'Servers100:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/100', 'admin_status': 'up'}, " - "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet112': {'lanes': '89,90,91,92', 'description': 'ARISTA01T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/112', 'admin_status': 'up'}, " - "'Ethernet116': {'lanes': '93,94,95,96', 'description': 'ARISTA02T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/116', 'admin_status': 'up'}, " - "'Ethernet120': {'lanes': '97,98,99,100', 'description': 'ARISTA03T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/120', 'admin_status': 'up'}, " + "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'fortyGigE0/8', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'autoneg': 'off', 'fec': 'none', 'speed': '40000'}, " + "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'fortyGigE0/12', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet16': {'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/16', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet20': {'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/20', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet24': {'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/24', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet28': {'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/28', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet32': {'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/32', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet36': {'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/36', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet40': {'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/40', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet44': {'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/44', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet48': {'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/48', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet52': {'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/52', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet56': {'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/56', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet60': {'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/60', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet64': {'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/64', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet68': {'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/68', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet72': {'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/72', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet76': {'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/76', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet80': {'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/80', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet84': {'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/84', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet88': {'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/88', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet92': {'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/92', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet96': {'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/96', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet100': {'lanes': '125,126,127,128', 'description': 'Servers100:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/100', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'speed': '40000'}, " + "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'speed': '40000'}, " + "'Ethernet112': {'lanes': '89,90,91,92', 'description': 'ARISTA01T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/112', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet116': {'lanes': '93,94,95,96', 'description': 'ARISTA02T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/116', 'admin_status': 'up', 'speed': '40000'}, " + "'Ethernet120': {'lanes': '97,98,99,100', 'description': 'ARISTA03T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/120', 'admin_status': 'up', 'speed': '40000'}, " "'Ethernet124': {'lanes': '101,102,103,104', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/124', 'admin_status': 'up', 'speed': '100000', 'description': 'ARISTA04T1:Ethernet1/1'}}" ) ) @@ -437,38 +437,38 @@ def test_minigraph_port_autonegotiation(self): self.assertEqual( utils.to_dict(output.strip()), utils.to_dict( - "{'Ethernet0': {'lanes': '29,30,31,32', 'description': 'fortyGigE0/0', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/0', 'pfc_asym': 'off', 'autoneg': 'off'}, " + "{'Ethernet0': {'lanes': '29,30,31,32', 'description': 'fortyGigE0/0', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/0', 'pfc_asym': 'off', 'autoneg': 'off', 'speed': '40000'}, " "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'Servers0:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'autoneg': 'on', 'speed': '100000', 'fec': 'none'}, " - "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'fortyGigE0/8', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'autoneg': 'off', 'fec': 'none'}, " - "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'fortyGigE0/12', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet16': {'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/16', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet20': {'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/20', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet24': {'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/24', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet28': {'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/28', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet32': {'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/32', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet36': {'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/36', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet40': {'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/40', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet44': {'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/44', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet48': {'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/48', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet52': {'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/52', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet56': {'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/56', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet60': {'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/60', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet64': {'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/64', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet68': {'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/68', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet72': {'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/72', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet76': {'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/76', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet80': {'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/80', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet84': {'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/84', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet88': {'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/88', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet92': {'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/92', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet96': {'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/96', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet100': {'lanes': '125,126,127,128', 'description': 'Servers100:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/100', 'admin_status': 'up', 'autoneg': 'off'}, " - "'Ethernet104': {'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'autoneg': 'off'}, " - "'Ethernet108': {'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'autoneg': 'off'}, " - "'Ethernet112': {'lanes': '89,90,91,92', 'description': 'ARISTA01T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/112', 'admin_status': 'up', 'autoneg': 'on'}, " - "'Ethernet116': {'lanes': '93,94,95,96', 'description': 'ARISTA02T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/116', 'admin_status': 'up', 'autoneg': 'on'}, " - "'Ethernet120': {'lanes': '97,98,99,100', 'description': 'ARISTA03T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/120', 'admin_status': 'up', 'autoneg': 'on'}, " - "'Ethernet124': {'lanes': '101,102,103,104', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/124', 'admin_status': 'up', 'autoneg': 'on', 'speed': '100000', 'description': 'ARISTA04T1:Ethernet1/1'}}" + "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'fortyGigE0/8', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'autoneg': 'off', 'fec': 'none', 'speed': '40000'}, " + "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'fortyGigE0/12', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet16': {'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/16', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet20': {'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/20', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet24': {'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/24', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet28': {'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/28', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet32': {'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/32', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet36': {'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/36', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet40': {'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/40', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet44': {'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/44', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet48': {'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/48', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet52': {'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/52', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet56': {'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/56', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet60': {'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/60', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet64': {'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/64', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet68': {'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/68', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet72': {'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/72', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet76': {'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/76', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet80': {'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/80', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet84': {'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/84', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet88': {'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/88', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet92': {'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/92', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet96': {'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/96', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet100': {'lanes': '125,126,127,128', 'description': 'Servers100:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/100', 'admin_status': 'up', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet104': {'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet108': {'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'autoneg': 'off', 'speed': '40000'}, " + "'Ethernet112': {'lanes': '89,90,91,92', 'description': 'ARISTA01T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/112', 'admin_status': 'up', 'autoneg': 'on', 'speed': '40000'}, " + "'Ethernet116': {'lanes': '93,94,95,96', 'description': 'ARISTA02T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/116', 'admin_status': 'up', 'autoneg': 'on', 'speed': '40000'}, " + "'Ethernet120': {'lanes': '97,98,99,100', 'description': 'ARISTA03T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/120', 'admin_status': 'up', 'autoneg': 'on', 'speed': '40000'}, " + "'Ethernet124': {'lanes': '101,102,103,104', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/124', 'admin_status': 'up', 'autoneg': 'on', 'speed': '100000', 'description': 'ARISTA04T1:Ethernet1/1', 'speed': '100000'}}" ) ) @@ -532,34 +532,34 @@ def test_minigraph_neighbor_interfaces(self): "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'server1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'speed': '25000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'speed': '40000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'speed': '10000', 'autoneg': 'on'}, " - "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100'}}" + "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}}" ) ) @@ -575,34 +575,34 @@ def test_minigraph_neighbor_interfaces_config_db(self): "'Ethernet4': {'lanes': '25,26,27,28', 'description': 'server1:port1', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'speed': '25000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'speed': '40000', 'autoneg': 'on', 'mux_cable': 'true'}, " "'Ethernet12': {'lanes': '33,34,35,36', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'speed': '10000', 'autoneg': 'on'}, " - "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100'}}" + "'Ethernet16': {'alias': 'fortyGigE0/16', 'pfc_asym': 'off', 'lanes': '41,42,43,44', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}}" ) ) @@ -619,33 +619,33 @@ def test_minigraph_extra_ethernet_interfaces(self, **kwargs): "'Ethernet8': {'lanes': '37,38,39,40', 'description': 'Interface description', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/8', 'admin_status': 'up', 'speed': '1000'}, " "'Ethernet12': {'lanes': '33,34,35,36', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/12', 'admin_status': 'up', 'speed': '100000', 'description': 'Interface description'}, " "'Ethernet16': {'lanes': '41,42,43,44', 'pfc_asym': 'off', 'description': 'fortyGigE0/16', 'mtu': '9100', 'tpid': '0x8100', 'alias': 'fortyGigE0/16', 'speed': '1000'}, " - "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100'}, " - "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100'}}" + "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet28': {'alias': 'fortyGigE0/28', 'pfc_asym': 'off', 'lanes': '1,2,3,4', 'description': 'fortyGigE0/28', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet32': {'alias': 'fortyGigE0/32', 'pfc_asym': 'off', 'lanes': '9,10,11,12', 'description': 'fortyGigE0/32', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet36': {'alias': 'fortyGigE0/36', 'pfc_asym': 'off', 'lanes': '13,14,15,16', 'description': 'fortyGigE0/36', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet40': {'alias': 'fortyGigE0/40', 'pfc_asym': 'off', 'lanes': '21,22,23,24', 'description': 'fortyGigE0/40', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet44': {'alias': 'fortyGigE0/44', 'pfc_asym': 'off', 'lanes': '17,18,19,20', 'description': 'fortyGigE0/44', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet48': {'alias': 'fortyGigE0/48', 'pfc_asym': 'off', 'lanes': '49,50,51,52', 'description': 'fortyGigE0/48', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet52': {'alias': 'fortyGigE0/52', 'pfc_asym': 'off', 'lanes': '53,54,55,56', 'description': 'fortyGigE0/52', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet56': {'alias': 'fortyGigE0/56', 'pfc_asym': 'off', 'lanes': '61,62,63,64', 'description': 'fortyGigE0/56', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet60': {'alias': 'fortyGigE0/60', 'pfc_asym': 'off', 'lanes': '57,58,59,60', 'description': 'fortyGigE0/60', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet64': {'alias': 'fortyGigE0/64', 'pfc_asym': 'off', 'lanes': '65,66,67,68', 'description': 'fortyGigE0/64', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet68': {'alias': 'fortyGigE0/68', 'pfc_asym': 'off', 'lanes': '69,70,71,72', 'description': 'fortyGigE0/68', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet72': {'alias': 'fortyGigE0/72', 'pfc_asym': 'off', 'lanes': '77,78,79,80', 'description': 'fortyGigE0/72', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet76': {'alias': 'fortyGigE0/76', 'pfc_asym': 'off', 'lanes': '73,74,75,76', 'description': 'fortyGigE0/76', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet80': {'alias': 'fortyGigE0/80', 'pfc_asym': 'off', 'lanes': '105,106,107,108', 'description': 'fortyGigE0/80', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet84': {'alias': 'fortyGigE0/84', 'pfc_asym': 'off', 'lanes': '109,110,111,112', 'description': 'fortyGigE0/84', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet88': {'alias': 'fortyGigE0/88', 'pfc_asym': 'off', 'lanes': '117,118,119,120', 'description': 'fortyGigE0/88', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet92': {'alias': 'fortyGigE0/92', 'pfc_asym': 'off', 'lanes': '113,114,115,116', 'description': 'fortyGigE0/92', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet96': {'alias': 'fortyGigE0/96', 'pfc_asym': 'off', 'lanes': '121,122,123,124', 'description': 'fortyGigE0/96', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet100': {'alias': 'fortyGigE0/100', 'pfc_asym': 'off', 'lanes': '125,126,127,128', 'description': 'fortyGigE0/100', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet104': {'alias': 'fortyGigE0/104', 'pfc_asym': 'off', 'lanes': '85,86,87,88', 'description': 'fortyGigE0/104', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet108': {'alias': 'fortyGigE0/108', 'pfc_asym': 'off', 'lanes': '81,82,83,84', 'description': 'fortyGigE0/108', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet112': {'alias': 'fortyGigE0/112', 'pfc_asym': 'off', 'lanes': '89,90,91,92', 'description': 'fortyGigE0/112', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet116': {'alias': 'fortyGigE0/116', 'pfc_asym': 'off', 'lanes': '93,94,95,96', 'description': 'fortyGigE0/116', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet120': {'alias': 'fortyGigE0/120', 'pfc_asym': 'off', 'lanes': '97,98,99,100', 'description': 'fortyGigE0/120', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}, " + "'Ethernet124': {'alias': 'fortyGigE0/124', 'pfc_asym': 'off', 'lanes': '101,102,103,104', 'description': 'fortyGigE0/124', 'mtu': '9100', 'tpid': '0x8100', 'fec': 'rs', 'speed': '100000'}}" ) ) @@ -884,7 +884,9 @@ def test_minigraph_voq_inband_port(self): 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', - 'admin_status': 'up' + 'admin_status': 'up', + 'fec': 'rs', + 'speed': '100000' } ) From 16717d2dc51f74fa711ed7b4392ce5e4f7e71c29 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Thu, 7 Apr 2022 10:41:42 +0300 Subject: [PATCH 185/817] [submodule] Advance sonic-swss submodule. (#10404) In order to include the following commit: 0f06910 [PBH] Implement Edit Flows (Azure/sonic-swss#2169) sonic-swss 50d5be2 Make changes to support compiling on Bullseye with GCC 10 (#2216) 0870cf5 [mirrororch]: Implement HW resources availability validation for SPAN/ERSPAN (#2187) f4ec565 [vlanmgrd] fix use-after-free memory issue (#2211) c2de7fc [QosOrch] The notifications cannot be drained in QosOrch in case the first one needs to retry (#2206) 5575935 [neighsyncd] increase neighsyncd timeout (#2209) 0f06910 [PBH] Implement Edit Flows (#2169) 6241bbf Remove redundant and problematic code to skip "pool" field in buffer profile handling (#2197) a55343c [azp]: Set diff coverage threshhold to 80% (#2188) 390cae1 [portsorch]: Prevent LAG member configuration when port has active ACL binding (#2165) c1d47e6 [VNET]Fixing nexthop group delete during route change (#2198) 8941cc0 [BFD]Registering BFD state change callback during session creation (#2202) 680c539 [vxlan] Remove tunnel map objects on VNET tunnel removal (#2150) 20dde0c Fix for handling broadcom DNX ASIC to have ipv4 and ipv6 ACL rules in separate tables. (#2178) 5b7c949 [FdbOrch] SAI_FDB_EVENT_MOVE generates update with empty update.entry.port_name (#2200) 7350d49 [Vxlanmgr] vnet netdev cleanup during config reload fix (#2191) 2bef62b Validate LAG has members before mirror session create (#2130) 1e4d4ce [VS test] Increase VS test time, skip dpb flaky test (#2195) 6eda965 [vstest]Migrating vs tests from using click commands to direct DB access (#2179) Signed-off-by: Nazarii Hnydyn --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index d80094b248e7..50d5be2b399e 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit d80094b248e7df5ac9df309d785ddf21e0ab92d7 +Subproject commit 50d5be2b399e9bcc43973f99d72d76e4effd8cc0 From 4426f7715fd4f5442e63e5efe759ad86006e9196 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Thu, 7 Apr 2022 14:23:35 +0300 Subject: [PATCH 186/817] [scapy] update scapy to 2.4.5 and patch it (#10457) Why I did it Running warm-reboot in a loop for 500 times leads to this error on 318-th iteration: Apr 2 15:56:27.346747 sonic INFO swss#/supervisord: restore_neighbors Traceback (most recent call last): Apr 2 15:56:27.346747 sonic INFO swss#/supervisord: restore_neighbors File "/usr/bin/restore_neighbors.py", line 24, in Apr 2 15:56:27.346747 sonic INFO swss#/supervisord: restore_neighbors from scapy.all import conf, in6_getnsma, inet_pton, inet_ntop, in6_getnsmac, get_if_hwaddr, Ether, ARP, IPv6, ICMPv6ND_NS, ICMPv6NDOptSrcLLAddr Apr 2 15:56:27.346795 sonic INFO swss#/supervisord: restore_neighbors File "/usr/local/lib/python3.7/dist-packages/scapy/all.py", line 25, in Apr 2 15:56:27.346956 sonic INFO swss#/supervisord: restore_neighbors from scapy.route import * Apr 2 15:56:27.346995 sonic INFO swss#/supervisord: restore_neighbors File "/usr/local/lib/python3.7/dist-packages/scapy/route.py", line 205, in Apr 2 15:56:27.347089 sonic INFO swss#/supervisord: restore_neighbors conf.iface = get_working_if() Apr 2 15:56:27.347129 sonic INFO swss#/supervisord: restore_neighbors File "/usr/local/lib/python3.7/dist-packages/scapy/arch/linux.py", line 128, in get_working_if Apr 2 15:56:27.347213 sonic INFO swss#/supervisord: restore_neighbors ifflags = struct.unpack("16xH14x", get_if(i, SIOCGIFFLAGS))[0] Apr 2 15:56:27.347250 sonic INFO swss#/supervisord: restore_neighbors File "/usr/local/lib/python3.7/dist-packages/scapy/arch/common.py", line 31, in get_if Apr 2 15:56:27.347345 sonic INFO swss#/supervisord: restore_neighbors return ioctl(sck, cmd, struct.pack("16s16x", iff.encode("utf8"))) Apr 2 15:56:27.347365 sonic INFO swss#/supervisord: restore_neighbors OSError: [Errno 19] No such device The issue was reported to scapy devs secdev/scapy#3369, the fix is secdev/scapy#3371, however there is no released scapy version with this fix right now, thus decided to build scapy v2.4.5 from sources and apply the fix in a form of a patch. Signed-off-by: Stepan Blyschak --- .gitmodules | 3 ++ dockers/docker-orchagent/Dockerfile.j2 | 9 +++- rules/docker-orchagent.mk | 1 + rules/scapy.dep | 10 +++++ rules/scapy.mk | 7 ++++ src/scapy | 1 + ...ng-generation-when-scapy-is-a-submod.patch | 27 ++++++++++++ ...f-the-network-interface-still-exists.patch | 42 +++++++++++++++++++ src/scapy.patch/series | 2 + 9 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 rules/scapy.dep create mode 100644 rules/scapy.mk create mode 160000 src/scapy create mode 100644 src/scapy.patch/0001-Fix-version-string-generation-when-scapy-is-a-submod.patch create mode 100644 src/scapy.patch/0002-Check-if-the-network-interface-still-exists.patch create mode 100644 src/scapy.patch/series diff --git a/.gitmodules b/.gitmodules index f79031a7d22c..b2d76bd66b20 100644 --- a/.gitmodules +++ b/.gitmodules @@ -62,6 +62,9 @@ [submodule "src/redis-dump-load"] path = src/redis-dump-load url = https://github.com/p/redis-dump-load.git +[submodule "src/scapy"] + path = src/scapy + url = https://github.com/secdev/scapy.git [submodule "platform/mellanox/mlnx-sai/SAI-Implementation"] path = platform/mellanox/mlnx-sai/SAI-Implementation url = https://github.com/Mellanox/SAI-Implementation diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index f71f31cfc0ac..ea4e0abbc2ef 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -40,7 +40,6 @@ RUN ln -s -f /usr/bin/gcc-8 /usr/bin/aarch64-linux-gnu-gcc # Dependencies of restore_neighbors.py RUN pip3 install \ - scapy==2.4.4 \ pyroute2==0.5.14 \ netifaces==0.10.9 @@ -57,6 +56,14 @@ RUN apt-get remove -y gcc-8 {{ install_debian_packages(docker_orchagent_debs.split(' ')) }} {%- endif %} +{% if docker_orchagent_whls.strip() -%} +# Copy locally-built Python wheel dependencies +{{ copy_files("python-wheels/", docker_orchagent_whls.split(' '), "/python-wheels/") }} + +# Install locally-built Python wheel dependencies +{{ install_python_wheels(docker_orchagent_whls.split(' ')) }} +{% endif %} + # Clean up RUN apt-get purge -y \ build-essential \ diff --git a/rules/docker-orchagent.mk b/rules/docker-orchagent.mk index d9453465c702..ef0c203877d8 100644 --- a/rules/docker-orchagent.mk +++ b/rules/docker-orchagent.mk @@ -10,6 +10,7 @@ $(DOCKER_ORCHAGENT)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) $(DOCKER_ORCHAGENT)_DBG_DEPENDS += $(SWSS_DBG) \ $(LIBSWSSCOMMON_DBG) \ $(LIBSAIREDIS_DBG) +$(DOCKER_ORCHAGENT)_PYTHON_WHEELS += $(SCAPY) $(DOCKER_ORCHAGENT)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) diff --git a/rules/scapy.dep b/rules/scapy.dep new file mode 100644 index 000000000000..ef09fb12223b --- /dev/null +++ b/rules/scapy.dep @@ -0,0 +1,10 @@ +SPATH := $($(SCAPY)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/scapy.mk rules/scapy.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files -- ':!:doc/*')) + +$(SCAPY)_CACHE_MODE := GIT_CONTENT_SHA +$(SCAPY)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SCAPY)_DEP_FILES := $(DEP_FILES) +$(SCAPY)_SMDEP_FILES := $(SMDEP_FILES) +$(SCAPY)_SMDEP_PATHS := $(SPATH) diff --git a/rules/scapy.mk b/rules/scapy.mk new file mode 100644 index 000000000000..6953c1ef10e2 --- /dev/null +++ b/rules/scapy.mk @@ -0,0 +1,7 @@ +# scapy python3 wheel + +SCAPY = scapy-2.4.5-py2.py3-none-any.whl +$(SCAPY)_SRC_PATH = $(SRC_PATH)/scapy +$(SCAPY)_PYTHON_VERSION = 3 +$(SCAPY)_TEST = n +SONIC_PYTHON_WHEELS += $(SCAPY) diff --git a/src/scapy b/src/scapy new file mode 160000 index 000000000000..8b63d73a1726 --- /dev/null +++ b/src/scapy @@ -0,0 +1 @@ +Subproject commit 8b63d73a17266bae2a61513ea97ded5283a7ccd3 diff --git a/src/scapy.patch/0001-Fix-version-string-generation-when-scapy-is-a-submod.patch b/src/scapy.patch/0001-Fix-version-string-generation-when-scapy-is-a-submod.patch new file mode 100644 index 000000000000..37f5253db0cc --- /dev/null +++ b/src/scapy.patch/0001-Fix-version-string-generation-when-scapy-is-a-submod.patch @@ -0,0 +1,27 @@ +From 988c808af6065b740006aef0e94496821d41fb98 Mon Sep 17 00:00:00 2001 +From: Stepan Blyschak +Date: Mon, 4 Apr 2022 09:57:39 +0000 +Subject: [PATCH] Fix version string generation when scapy is a submodule + +Signed-off-by: Stepan Blyschak +--- + scapy/__init__.py | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/scapy/__init__.py b/scapy/__init__.py +index f920151e..2adbea19 100644 +--- a/scapy/__init__.py ++++ b/scapy/__init__.py +@@ -42,9 +42,6 @@ def _version_from_git_describe(): + :raises CalledProcessError: if git is unavailable + :return: Scapy's latest tag + """ +- if not os.path.isdir(os.path.join(os.path.dirname(_SCAPY_PKG_DIR), '.git')): # noqa: E501 +- raise ValueError('not in scapy git repo') +- + def _git(cmd): + # type: (str) -> str + process = subprocess.Popen( +-- +2.14.1 + diff --git a/src/scapy.patch/0002-Check-if-the-network-interface-still-exists.patch b/src/scapy.patch/0002-Check-if-the-network-interface-still-exists.patch new file mode 100644 index 000000000000..c42c12e1a8aa --- /dev/null +++ b/src/scapy.patch/0002-Check-if-the-network-interface-still-exists.patch @@ -0,0 +1,42 @@ +From 7ffd8101c1e535f9c3225db2c319958a64412686 Mon Sep 17 00:00:00 2001 +From: Guillaume Valadon +Date: Tue, 14 Sep 2021 19:34:43 +0200 +Subject: [PATCH] Check if the network interface still exists + +Signed-off-by: Stepan Blyschak +--- + scapy/arch/linux.py | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +diff --git a/scapy/arch/linux.py b/scapy/arch/linux.py +index 94fac8f0..b86e98ab 100644 +--- a/scapy/arch/linux.py ++++ b/scapy/arch/linux.py +@@ -414,13 +414,17 @@ class LinuxInterfaceProvider(InterfaceProvider): + data = {} + ips = in6_getifaddr() + for i in _get_if_list(): +- ifflags = struct.unpack("16xH14x", get_if(i, SIOCGIFFLAGS))[0] +- index = get_if_index(i) +- mac = scapy.utils.str2mac( +- get_if_raw_hwaddr(i, siocgifhwaddr=SIOCGIFHWADDR)[1] +- ) +- ip = None # type: Optional[str] +- ip = inet_ntop(socket.AF_INET, get_if_raw_addr(i)) ++ try: ++ ifflags = struct.unpack("16xH14x", get_if(i, SIOCGIFFLAGS))[0] ++ index = get_if_index(i) ++ mac = scapy.utils.str2mac( ++ get_if_raw_hwaddr(i, siocgifhwaddr=SIOCGIFHWADDR)[1] ++ ) ++ ip = None # type: Optional[str] ++ ip = inet_ntop(socket.AF_INET, get_if_raw_addr(i)) ++ except IOError: ++ warning("Interface %s does not exist!", i) ++ continue + if ip == "0.0.0.0": + ip = None + ifflags = FlagValue(ifflags, _iff_flags) +-- +2.14.1 + diff --git a/src/scapy.patch/series b/src/scapy.patch/series new file mode 100644 index 000000000000..d64f20f136c1 --- /dev/null +++ b/src/scapy.patch/series @@ -0,0 +1,2 @@ +0001-Fix-version-string-generation-when-scapy-is-a-submod.patch +0002-Check-if-the-network-interface-still-exists.patch From baa24b3cb1e0063bc447418fe50b028a04ebc62e Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 7 Apr 2022 20:04:43 +0800 Subject: [PATCH 187/817] [Ci]: exclude innovium build and increase broadcom build timeout (#10482) Why I did it Exclude the innovium build in upgrading version build, currently, the builds are always failed, exclude the build temporarily. Increase the broadcom build timeout. --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 1 - .azure-pipelines/azure-pipelines-build.yml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 35988f71b9b4..cc6135b045ef 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -38,7 +38,6 @@ parameters: - centec - centec-arm64 - generic - - innovium - marvell-armhf - mellanox diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 7c312de85931..0b033e959300 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -50,6 +50,7 @@ jobs: swi_image: yes - name: broadcom + timeoutInMinutes: 1440 variables: dbg_image: yes swi_image: yes From 07fad261dc2d580431c3a05e7869297da53b5b55 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 7 Apr 2022 20:39:46 +0800 Subject: [PATCH 188/817] [submodule] Advance sonic-platform-common pointer (#10469) Update sonic-platform-common submodule to pickup new commits: 01512ec [SSD]Enhance ssd_generic with more error handling to avoid python crash Azure/sonic-platform-common#271 ac3e7f1 [y_cable][Broadcom] update the BRCM y_cable driver to release 2.0 Azure/sonic-platform-common#263 573717a [Credo][Ycable] Fix Credo firmware download API download_firmware flag Azure/sonic-platform-common#269 a844f18 [xcvr] Add get_module_fw_info method to XcvrApi class. Azure/sonic-platform-common#267 35bad16 [sfputil]Refactoring read_porttab_mappings Azure/sonic-platform-common#264 83c4345 [SSD Generic] Add support for parsing nvme ssd model, health and temperature Azure/sonic-platform-common#265 5da31e1 [ycable][credo] Fix the is_link_active API for Credo Ycable Azure/sonic-platform-common#260 931c6ea [Y-Cable][Credo] add theading locker to support thread-safe calling, add SKU check for download_firmware API. Azure/sonic-platform-common#222 ff3aa75 Fix SFF8472 Enhanced Options Azure/sonic-platform-common#259 a8a83e9 [ssd] Allow individual vendor parsers to handle errors Azure/sonic-platform-common#252 Signed-off-by: Kebo Liu --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index ee122155e0f6..01512ecce4d6 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit ee122155e0f6e40b483d24737c5f1b729bdbf111 +Subproject commit 01512ecce4d6ce7272c0bbb7a5d47a1c02d92221 From faabf00f829d685946b2e6d9a50eebfc5592d4dc Mon Sep 17 00:00:00 2001 From: Rajkumar-Marvell <54936542+rajkumar38@users.noreply.github.com> Date: Thu, 7 Apr 2022 20:02:31 +0530 Subject: [PATCH 189/817] [Marvell] Update armhf sai deb (#10403) 1) DHCP trap for IPV4 and IPV6 2) Interface ACL's (Ingress Everflow support) 3) 1G Autoneg support Signed-off-by: Rajkumar Pennadam Ramamoorthy --- platform/marvell-armhf/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/marvell-armhf/sai.mk b/platform/marvell-armhf/sai.mk index 4df1b2c5b6f6..4ecfdce244a1 100644 --- a/platform/marvell-armhf/sai.mk +++ b/platform/marvell-armhf/sai.mk @@ -1,6 +1,6 @@ # Marvell SAI -export MRVL_SAI_VERSION = 1.9.1-1 +export MRVL_SAI_VERSION = 1.9.1-2 export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION)_$(PLATFORM_ARCH).deb $(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai From e348dff77a7879b8fe08114cdb16f37632a7d39e Mon Sep 17 00:00:00 2001 From: dflynn-Nokia <60479697+dflynn-Nokia@users.noreply.github.com> Date: Thu, 7 Apr 2022 10:44:31 -0400 Subject: [PATCH 190/817] [Nokia ixs7215] Platform API temperature threshold value fixes (#10372) Incorrect high-threshold and critical-high-threshold values are displayed for some of the temperature sensors. This commit fixes that. --- .../7215/sonic_platform/test/test-thermal.py | 2 +- .../7215/sonic_platform/thermal.py | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-thermal.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-thermal.py index 91ef75d8f9a7..95cc8e89f0d8 100755 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-thermal.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/test/test-thermal.py @@ -30,7 +30,7 @@ def main(): high_thresh = "NA" print(" Low Threshold(C): {}, High Threshold(C): {}".format(low_thresh, - high_thresh)) + high_thresh)) try: crit_low_thresh = thermal.get_low_critical_threshold() diff --git a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py index c7e408c3f3e9..444ca5b137d7 100644 --- a/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py +++ b/platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/thermal.py @@ -44,8 +44,8 @@ def __init__(self, thermal_index): if self.index < 3: i2c_path = self.I2C_CLASS_DIR + self.I2C_DEV_MAPPING[self.index - 1][0] sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1] - sensor_max_suffix = "max" - sensor_crit_suffix = None + sensor_high_suffix = "max" + sensor_high_crit_suffix = None hwmon_node = os.listdir(i2c_path)[0] self.SENSOR_DIR = i2c_path + hwmon_node + '/' @@ -53,8 +53,8 @@ def __init__(self, thermal_index): elif self.index < 6: i2c_path = self.I2C_CLASS_DIR + self.I2C_DEV_MAPPING[self.index - 1][0] sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1] - sensor_max_suffix = "max" - sensor_crit_suffix = "crit" + sensor_high_suffix = "crit" + sensor_high_crit_suffix = None hwmon_node = os.listdir(i2c_path)[0] self.SENSOR_DIR = i2c_path + hwmon_node + '/' @@ -62,8 +62,8 @@ def __init__(self, thermal_index): else: dev_path = self.HWMON_CLASS_DIR sensor_index = 1 - sensor_max_suffix = None - sensor_crit_suffix = None + sensor_high_suffix = None + sensor_high_crit_suffix = None hwmon_node = os.listdir(dev_path)[0] self.SENSOR_DIR = dev_path + hwmon_node + '/' @@ -72,16 +72,16 @@ def __init__(self, thermal_index): + "temp{}_input".format(sensor_index) # sysfs file for high threshold value if supported for this sensor - if sensor_max_suffix: + if sensor_high_suffix: self.thermal_high_threshold_file = self.SENSOR_DIR \ - + "temp{}_{}".format(sensor_index, sensor_max_suffix) + + "temp{}_{}".format(sensor_index, sensor_high_suffix) else: self.thermal_high_threshold_file = None # sysfs file for crit high threshold value if supported for this sensor - if sensor_crit_suffix: + if sensor_high_crit_suffix: self.thermal_high_crit_threshold_file = self.SENSOR_DIR \ - + "temp{}_{}".format(sensor_index, sensor_crit_suffix) + + "temp{}_{}".format(sensor_index, sensor_high_crit_suffix) else: self.thermal_high_crit_threshold_file = None From f311947cfa5f90b77a380e37e7924b29716d5866 Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Thu, 7 Apr 2022 17:34:32 -0400 Subject: [PATCH 191/817] [Nokia][device] Updated the BCM config file to reduce the CPU usage (#10485) Signed-off-by: Sakthivadivu Saravanaraj --- .../Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm | 3 ++- .../Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index 2ede5ab6d0d0..bbafccdc377e 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -1263,8 +1263,9 @@ phy_tx_polarity_flip_phy143.BCM8885X=0 polled_irq_delay.BCM8885X=5 -polled_irq_mode.BCM8885X=1 +polled_irq_mode.BCM8885X=0 port_fec_fabric.BCM8885X=7 +bcm_stat_interval.BCM8885X=1000000 port_init_cl72_1=0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index fd96c3ac4368..ce7f77de5bb2 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -1263,8 +1263,9 @@ phy_tx_polarity_flip_phy143.BCM8885X=0 polled_irq_delay.BCM8885X=5 -polled_irq_mode.BCM8885X=1 +polled_irq_mode.BCM8885X=0 port_fec_fabric.BCM8885X=7 +bcm_stat_interval.BCM8885X=1000000 port_init_cl72_1=0 From 47db2b2993b81b491b8150bb92b2ebdd579da4c8 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Thu, 7 Apr 2022 17:56:52 -0400 Subject: [PATCH 192/817] [hostcfgd] Move hostcfgd back to ConfigDBConnector for subscribing to updates (#10168) #### Why I did it As of https://github.com/Azure/sonic-swss-common/pull/587 the blackout issue in ConfigDBConnector has been resolved. In the past hostcfgd was refactored to use SubscriberStateTable instead of ConfigDBConnector for subscribing to CONFIG_DB updates due to a "blackout" period between hostcfgd pulling the table data down and running the initialization and actually calling `listen()` on ConfigDBConnector which starts the update handler. However SusbscriberStateTable creates many file descriptors against the redis DB which is inefficient compared to ConfigDBConnector which only opens a single file descriptor. With the new fix to ConfigDBConnector I refactored hostcfgd to take advantage of these updates. #### How I did it Replaced SubscriberStateTable with ConfigDBConnector #### How to verify it The functionality of hostcfgd can be verified by booting the switch and verifying that NTP is properly configured. To check the blackout period you can add a delay in the hostcfgd `load()` function and also add a print statement before and after the load so you know when it occurs. Then restart hostcfgd and wait for the load to start, then during the load push a partial change to the FEATURE table and verify that the change is picked up and the feature is enabled after the load period finishes. #### Description for the changelog [hostcfgd] Move hostcfgd back to ConfigDBConnector for subscribing to updates --- src/sonic-host-services/scripts/hostcfgd | 175 +++++++++--------- .../tests/common/mock_configdb.py | 74 +------- .../tests/hostcfgd/hostcfgd_radius_test.py | 6 +- .../tests/hostcfgd/hostcfgd_tacacs_test.py | 5 +- .../tests/hostcfgd/hostcfgd_test.py | 16 +- 5 files changed, 100 insertions(+), 176 deletions(-) diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd index 5b6693fbcdf7..7f8f4be0b2e7 100755 --- a/src/sonic-host-services/scripts/hostcfgd +++ b/src/sonic-host-services/scripts/hostcfgd @@ -11,8 +11,7 @@ import signal import jinja2 from sonic_py_common import device_info -from swsscommon.swsscommon import SubscriberStateTable, DBConnector, Select -from swsscommon.swsscommon import ConfigDBConnector, TableConsumable, Table +from swsscommon.swsscommon import ConfigDBConnector, DBConnector, Table # FILE PAM_AUTH_CONF = "/etc/pam.d/common-auth-sonic" @@ -207,21 +206,23 @@ class FeatureHandler(object): else: self.resync_feature_state(self._cached_config[feature_name]) - def sync_state_field(self): + def sync_state_field(self, feature_table): """ Summary: Updates the state field in the FEATURE|* tables as the state field might have to be rendered based on DEVICE_METADATA table """ - feature_table = self._config_db.get_table('FEATURE') for feature_name in feature_table.keys(): if not feature_name: syslog.syslog(syslog.LOG_WARNING, "Feature is None") continue feature = Feature(feature_name, feature_table[feature_name], self._device_config) - if not feature.compare_state(feature_name, feature_table.get(feature_name, {})): - self.resync_feature_state(feature) + + self._cached_config.setdefault(feature_name, feature) + self.update_feature_auto_restart(feature, feature_name) + self.update_feature_state(feature) + self.resync_feature_state(feature) def update_feature_state(self, feature): cached_feature = self._cached_config[feature.name] @@ -406,6 +407,10 @@ class Iptables(object): ''' return (isinstance(key, tuple)) + def load(self, lpbk_table): + for row in lpbk_table: + self.iptables_handler(row, lpbk_table[row]) + def command(self, chain, ip, ver, op): cmd = 'iptables' if ver == '4' else 'ip6tables' cmd += ' -t mangle --{} {} -p tcp --tcp-flags SYN SYN'.format(op, chain) @@ -890,15 +895,13 @@ class KdumpCfg(object): memory = self.kdump_defaults["memory"] if data.get("memory") is not None: memory = data.get("memory") - if data.get("memory") is not None: - run_cmd("sonic-kdump-config --memory " + memory) + run_cmd("sonic-kdump-config --memory " + memory) # Num dumps num_dumps = self.kdump_defaults["num_dumps"] if data.get("num_dumps") is not None: num_dumps = data.get("num_dumps") - if data.get("num_dumps") is not None: - run_cmd("sonic-kdump-config --num_dumps " + num_dumps) + run_cmd("sonic-kdump-config --num_dumps " + num_dumps) class NtpCfg(object): """ @@ -912,6 +915,15 @@ class NtpCfg(object): self.ntp_global = {} self.ntp_servers = set() + def load(self, ntp_global_conf, ntp_server_conf): + syslog.syslog(syslog.LOG_INFO, "NtpCfg load ...") + + for row in ntp_global_conf: + self.ntp_global_update(row, ntp_global_conf[row], is_load=True) + + # Force reload on init + self.ntp_server_update(0, None, is_load=True) + def handle_ntp_source_intf_chg(self, intf_name): # if no ntp server configured, do nothing if not self.ntp_servers: @@ -925,7 +937,7 @@ class NtpCfg(object): cmd = 'systemctl restart ntp-config' run_cmd(cmd) - def ntp_global_update(self, key, data): + def ntp_global_update(self, key, data, is_load=False): syslog.syslog(syslog.LOG_INFO, 'NTP GLOBAL Update') orig_src = self.ntp_global.get('src_intf', '') orig_src_set = set(orig_src.split(";")) @@ -938,6 +950,9 @@ class NtpCfg(object): # Update the Local Cache self.ntp_global = data + # If initial load don't restart daemon + if is_load: return + # check if ntp server configured, if not, do nothing if not self.ntp_servers: syslog.syslog(syslog.LOG_INFO, "No ntp server when global config change, do nothing") @@ -954,16 +969,19 @@ class NtpCfg(object): cmd = 'service ntp restart' run_cmd(cmd) - def ntp_server_update(self, key, op): + def ntp_server_update(self, key, op, is_load=False): syslog.syslog(syslog.LOG_INFO, 'ntp server update key {}'.format(key)) restart_config = False - if op == "SET" and key not in self.ntp_servers: - restart_config = True - self.ntp_servers.add(key) - elif op == "DEL" and key in self.ntp_servers: + if not is_load: + if op == "SET" and key not in self.ntp_servers: + restart_config = True + self.ntp_servers.add(key) + elif op == "DEL" and key in self.ntp_servers: + restart_config = True + self.ntp_servers.remove(key) + else: restart_config = True - self.ntp_servers.remove(key) if restart_config: cmd = 'systemctl restart ntp-config' @@ -1034,31 +1052,24 @@ class HostConfigDaemon: # before moving forward self.config_db = ConfigDBConnector() self.config_db.connect(wait_for_init=True, retry_on=True) - self.dbconn = DBConnector(CFG_DB, 0) - self.state_db_conn = DBConnector(STATE_DB, 0) - self.selector = Select() syslog.syslog(syslog.LOG_INFO, 'ConfigDB connect success') - self.select = Select() - self.callbacks = dict() - self.subscriber_map = dict() - - feature_state_table = Table(self.state_db_conn, 'FEATURE') - # Load DEVICE metadata configurations self.device_config = {} self.device_config['DEVICE_METADATA'] = self.config_db.get_table('DEVICE_METADATA') + # Load feature state table + self.state_db_conn = DBConnector(STATE_DB, 0) + feature_state_table = Table(self.state_db_conn, 'FEATURE') + # Initialize KDump Config and set the config to default if nothing is provided self.kdumpCfg = KdumpCfg(self.config_db) - self.kdumpCfg.load(self.config_db.get_table('KDUMP')) # Initialize IpTables self.iptables = Iptables() # Intialize Feature Handler self.feature_handler = FeatureHandler(self.config_db, feature_state_table, self.device_config) - self.feature_handler.sync_state_field() # Initialize Ntp Config Handler self.ntpcfg = NtpCfg() @@ -1073,21 +1084,28 @@ class HostConfigDaemon: self.pamLimitsCfg = PamLimitsCfg(self.config_db) self.pamLimitsCfg.update_config_file() - def load(self): - aaa = self.config_db.get_table('AAA') - tacacs_global = self.config_db.get_table('TACPLUS') - tacacs_server = self.config_db.get_table('TACPLUS_SERVER') - radius_global = self.config_db.get_table('RADIUS') - radius_server = self.config_db.get_table('RADIUS_SERVER') + def load(self, init_data): + features = init_data['FEATURE'] + aaa = init_data['AAA'] + tacacs_global = init_data['TACPLUS'] + tacacs_server = init_data['TACPLUS_SERVER'] + radius_global = init_data['RADIUS'] + radius_server = init_data['RADIUS_SERVER'] + lpbk_table = init_data['LOOPBACK_INTERFACE'] + ntp_server = init_data['NTP_SERVER'] + ntp_global = init_data['NTP'] + kdump = init_data['KDUMP'] + + self.feature_handler.sync_state_field(features) self.aaacfg.load(aaa, tacacs_global, tacacs_server, radius_global, radius_server) + self.iptables.load(lpbk_table) + self.ntpcfg.load(ntp_global, ntp_server) + self.kdumpCfg.load(kdump) - try: - dev_meta = self.config_db.get_table('DEVICE_METADATA') - if 'localhost' in dev_meta: - if 'hostname' in dev_meta['localhost']: - self.hostname_cache = dev_meta['localhost']['hostname'] - except Exception as e: - pass + dev_meta = self.config_db.get_table('DEVICE_METADATA') + if 'localhost' in dev_meta: + if 'hostname' in dev_meta['localhost']: + self.hostname_cache = dev_meta['localhost']['hostname'] # Update AAA with the hostname self.aaacfg.hostname_update(self.hostname_cache) @@ -1181,40 +1199,38 @@ class HostConfigDaemon: systemctl_cmd = "sudo systemctl is-system-running --wait --quiet" subprocess.call(systemctl_cmd, shell=True) - def subscribe(self, table, callback, pri): - try: - if table not in self.callbacks: - self.callbacks[table] = [] - subscriber = SubscriberStateTable(self.dbconn, table, TableConsumable.DEFAULT_POP_BATCH_SIZE, pri) - self.selector.addSelectable(subscriber) # Add to the Selector - self.subscriber_map[subscriber.getFd()] = (subscriber, table) # Maintain a mapping b/w subscriber & fd + def register_callbacks(self): - self.callbacks[table].append(callback) - except Exception as err: - syslog.syslog(syslog.LOG_ERR, "Subscribe to table {} failed with error {}".format(table, err)) + def make_callback(func): + def callback(table, key, data): + if data is None: + op = "DEL" + else: + op = "SET" + return func(key, op, data) + return callback - def register_callbacks(self): - self.subscribe('KDUMP', lambda table, key, op, data: self.kdump_handler(key, op, data), HOSTCFGD_MAX_PRI) + self.config_db.subscribe('KDUMP', make_callback(self.kdump_handler)) # Handle FEATURE updates before other tables - self.subscribe('FEATURE', lambda table, key, op, data: self.feature_handler.handle(key, op, data), HOSTCFGD_MAX_PRI-1) + self.config_db.subscribe('FEATURE', make_callback(self.feature_handler.handle)) # Handle AAA, TACACS and RADIUS related tables - self.subscribe('AAA', lambda table, key, op, data: self.aaa_handler(key, op, data), HOSTCFGD_MAX_PRI-2) - self.subscribe('TACPLUS', lambda table, key, op, data: self.tacacs_global_handler(key, op, data), HOSTCFGD_MAX_PRI-2) - self.subscribe('TACPLUS_SERVER', lambda table, key, op, data: self.tacacs_server_handler(key, op, data), HOSTCFGD_MAX_PRI-2) - self.subscribe('RADIUS', lambda table, key, op, data: self.radius_global_handler(key, op, data), HOSTCFGD_MAX_PRI-2) - self.subscribe('RADIUS_SERVER', lambda table, key, op, data: self.radius_server_handler(key, op, data), HOSTCFGD_MAX_PRI-2) + self.config_db.subscribe('AAA', make_callback(self.aaa_handler)) + self.config_db.subscribe('TACPLUS', make_callback(self.tacacs_global_handler)) + self.config_db.subscribe('TACPLUS_SERVER', make_callback(self.tacacs_server_handler)) + self.config_db.subscribe('RADIUS', make_callback(self.radius_global_handler)) + self.config_db.subscribe('RADIUS_SERVER', make_callback(self.radius_server_handler)) # Handle IPTables configuration - self.subscribe('LOOPBACK_INTERFACE', lambda table, key, op, data: self.lpbk_handler(key, op, data), HOSTCFGD_MAX_PRI-3) + self.config_db.subscribe('LOOPBACK_INTERFACE', make_callback(self.lpbk_handler)) # Handle NTP & NTP_SERVER updates - self.subscribe('NTP', lambda table, key, op, data: self.ntp_global_handler(key, op, data), HOSTCFGD_MAX_PRI-4) - self.subscribe('NTP_SERVER', lambda table, key, op, data: self.ntp_server_handler(key, op, data), HOSTCFGD_MAX_PRI-4) + self.config_db.subscribe('NTP', make_callback(self.ntp_global_handler)) + self.config_db.subscribe('NTP_SERVER', make_callback(self.ntp_server_handler)) # Handle updates to src intf changes in radius - self.subscribe('MGMT_INTERFACE', lambda table, key, op, data: self.mgmt_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - self.subscribe('VLAN_INTERFACE', lambda table, key, op, data: self.vlan_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - self.subscribe('VLAN_SUB_INTERFACE', lambda table, key, op, data: self.vlan_sub_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - self.subscribe('PORTCHANNEL_INTERFACE', lambda table, key, op, data: self.portchannel_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - self.subscribe('INTERFACE', lambda table, key, op, data: self.phy_intf_handler(key, op, data), HOSTCFGD_MAX_PRI-5) - + self.config_db.subscribe('MGMT_INTERFACE', make_callback(self.mgmt_intf_handler)) + self.config_db.subscribe('VLAN_INTERFACE', make_callback(self.vlan_intf_handler)) + self.config_db.subscribe('VLAN_SUB_INTERFACE', make_callback(self.vlan_sub_intf_handler)) + self.config_db.subscribe('PORTCHANNEL_INTERFACE', make_callback(self.portchannel_intf_handler)) + self.config_db.subscribe('INTERFACE', make_callback(self.phy_intf_handler)) + syslog.syslog(syslog.LOG_INFO, "Waiting for systemctl to finish initialization") self.wait_till_system_init_done() @@ -1222,27 +1238,7 @@ class HostConfigDaemon: "systemctl has finished initialization -- proceeding ...") def start(self): - while True: - state, selectable_ = self.selector.select(DEFAULT_SELECT_TIMEOUT) - if state == self.selector.TIMEOUT: - continue - elif state == self.selector.ERROR: - syslog.syslog(syslog.LOG_ERR, - "error returned by select") - continue - - fd = selectable_.getFd() - # Get the Corresponding subscriber & table - subscriber, table = self.subscriber_map.get(fd, (None, "")) - if not subscriber: - syslog.syslog(syslog.LOG_ERR, - "No Subscriber object found for fd: {}, subscriber map: {}".format(fd, subscriber_map)) - continue - key, op, fvs = subscriber.pop() - # Get the registered callback - cbs = self.callbacks.get(table, None) - for callback in cbs: - callback(table, key, op, dict(fvs)) + self.config_db.listen(init_data_handler=self.load) def main(): @@ -1251,7 +1247,6 @@ def main(): signal.signal(signal.SIGHUP, signal_handler) daemon = HostConfigDaemon() daemon.register_callbacks() - daemon.load() daemon.start() if __name__ == "__main__": diff --git a/src/sonic-host-services/tests/common/mock_configdb.py b/src/sonic-host-services/tests/common/mock_configdb.py index 138869dc3bee..f0b12b11abf9 100644 --- a/src/sonic-host-services/tests/common/mock_configdb.py +++ b/src/sonic-host-services/tests/common/mock_configdb.py @@ -4,9 +4,10 @@ class MockConfigDb(object): """ STATE_DB = None CONFIG_DB = None + event_queue = [] def __init__(self, **kwargs): - pass + self.handlers = {} @staticmethod def set_config_db(test_config_db): @@ -44,73 +45,12 @@ def set_entry(self, key, field, data): def get_table(self, table_name): return MockConfigDb.CONFIG_DB[table_name] + def subscribe(self, table_name, callback): + self.handlers[table_name] = callback -class MockSelect(): - - event_queue = [] - - @staticmethod - def set_event_queue(Q): - MockSelect.event_queue = Q - - @staticmethod - def get_event_queue(): - return MockSelect.event_queue - - @staticmethod - def reset_event_queue(): - MockSelect.event_queue = [] - - def __init__(self): - self.sub_map = {} - self.TIMEOUT = "TIMEOUT" - self.ERROR = "ERROR" - - def addSelectable(self, subscriber): - self.sub_map[subscriber.table] = subscriber - - def select(self, TIMEOUT): - if not MockSelect.get_event_queue(): - raise TimeoutError - table, key = MockSelect.get_event_queue().pop(0) - self.sub_map[table].nextKey(key) - return "OBJECT", self.sub_map[table] - - -class MockSubscriberStateTable(): - - FD_INIT = 0 - - @staticmethod - def generate_fd(): - curr = MockSubscriberStateTable.FD_INIT - MockSubscriberStateTable.FD_INIT = curr + 1 - return curr - - @staticmethod - def reset_fd(): - MockSubscriberStateTable.FD_INIT = 0 - - def __init__(self, conn, table, pop, pri): - self.fd = MockSubscriberStateTable.generate_fd() - self.next_key = '' - self.table = table - - def getFd(self): - return self.fd - - def nextKey(self, key): - self.next_key = key - - def pop(self): - table = MockConfigDb.CONFIG_DB.get(self.table, {}) - if self.next_key not in table: - op = "DEL" - fvs = {} - else: - op = "SET" - fvs = table.get(self.next_key, {}) - return self.next_key, op, fvs + def listen(self, init_data_handler=None): + for e in MockConfigDb.event_queue: + self.handlers[e[0]](e[0], e[1], self.get_entry(e[0], e[1])) class MockDBConnector(): diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py index 9738f16852e5..c08cd1829add 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py @@ -10,8 +10,7 @@ from parameterized import parameterized from unittest import TestCase, mock from tests.hostcfgd.test_radius_vectors import HOSTCFGD_TEST_RADIUS_VECTOR -from tests.common.mock_configdb import MockConfigDb, MockSubscriberStateTable -from tests.common.mock_configdb import MockSelect, MockDBConnector +from tests.common.mock_configdb import MockConfigDb, MockDBConnector test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -33,12 +32,9 @@ # Mock swsscommon classes hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.SubscriberStateTable = MockSubscriberStateTable -hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector hostcfgd.Table = mock.Mock() - class TestHostcfgdRADIUS(TestCase): """ Test hostcfd daemon - RADIUS diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py index 18bf5c17e6c2..a6478c08dc0d 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py @@ -10,8 +10,7 @@ from parameterized import parameterized from unittest import TestCase, mock from tests.hostcfgd.test_tacacs_vectors import HOSTCFGD_TEST_TACACS_VECTOR -from tests.common.mock_configdb import MockConfigDb, MockSubscriberStateTable -from tests.common.mock_configdb import MockSelect, MockDBConnector +from tests.common.mock_configdb import MockConfigDb, MockDBConnector test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) modules_path = os.path.dirname(test_path) @@ -32,8 +31,6 @@ # Mock swsscommon classes hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.SubscriberStateTable = MockSubscriberStateTable -hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector hostcfgd.Table = mock.Mock() diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py index db9a35075a02..28d4f6f8a724 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py @@ -8,8 +8,7 @@ from unittest import TestCase, mock from .test_vectors import HOSTCFGD_TEST_VECTOR, HOSTCFG_DAEMON_CFG_DB -from tests.common.mock_configdb import MockConfigDb, MockSubscriberStateTable -from tests.common.mock_configdb import MockSelect, MockDBConnector +from tests.common.mock_configdb import MockConfigDb, MockDBConnector from pyfakefs.fake_filesystem_unittest import patchfs from deepdiff import DeepDiff @@ -24,8 +23,6 @@ hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') hostcfgd = load_module_from_source('hostcfgd', hostcfgd_path) hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.SubscriberStateTable = MockSubscriberStateTable -hostcfgd.Select = MockSelect hostcfgd.DBConnector = MockDBConnector hostcfgd.Table = mock.Mock() @@ -122,8 +119,8 @@ def test_hostcfgd_feature_handler(self, test_name, test_data, fs): feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) # sync the state field and Handle Feature Updates - feature_handler.sync_state_field() features = MockConfigDb.CONFIG_DB['FEATURE'] + feature_handler.sync_state_field(features) for key, fvs in features.items(): feature_handler.handle(key, 'SET', fvs) @@ -227,7 +224,7 @@ def tearDown(self): @patchfs def test_feature_events(self, fs): fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - MockSelect.event_queue = [('FEATURE', 'dhcp_relay'), + MockConfigDb.event_queue = [('FEATURE', 'dhcp_relay'), ('FEATURE', 'mux'), ('FEATURE', 'telemetry')] daemon = hostcfgd.HostConfigDaemon() @@ -258,7 +255,7 @@ def test_feature_events(self, fs): # Change the state to disabled MockConfigDb.CONFIG_DB['FEATURE']['telemetry']['state'] = 'disabled' - MockSelect.event_queue = [('FEATURE', 'telemetry')] + MockConfigDb.event_queue = [('FEATURE', 'telemetry')] try: daemon.start() except TimeoutError: @@ -273,7 +270,7 @@ def test_feature_events(self, fs): def test_loopback_events(self): MockConfigDb.set_config_db(HOSTCFG_DAEMON_CFG_DB) - MockSelect.event_queue = [('NTP', 'global'), + MockConfigDb.event_queue = [('NTP', 'global'), ('NTP_SERVER', '0.debian.pool.ntp.org'), ('LOOPBACK_INTERFACE', 'Loopback0|10.184.8.233/32')] daemon = hostcfgd.HostConfigDaemon() @@ -296,8 +293,7 @@ def test_kdump_event(self): MockConfigDb.set_config_db(HOSTCFG_DAEMON_CFG_DB) daemon = hostcfgd.HostConfigDaemon() daemon.register_callbacks() - assert MockConfigDb.CONFIG_DB['KDUMP']['config'] - MockSelect.event_queue = [('KDUMP', 'config')] + MockConfigDb.event_queue = [('KDUMP', 'config')] with mock.patch('hostcfgd.subprocess') as mocked_subprocess: popen_mock = mock.Mock() attrs = {'communicate.return_value': ('output', 'error')} From 39e1e92c08ea43c374040bba8b83b7292101ba7e Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Fri, 8 Apr 2022 07:48:01 +0800 Subject: [PATCH 193/817] [yang]: Add support for BmcMgmtToRRouter (#10488) Why I did it minigraph parser has introduced new type. How I did it Update yang models to support BmcMgmtToRRouter. How to verify it Run unit test for sonic-yang-models Signed-off-by: Gang Lv ganglv@microsoft.com --- .../tests/yang_model_tests/tests/device_metadata.json | 3 +++ .../yang_model_tests/tests_config/device_metadata.json | 10 ++++++++++ .../yang-models/sonic-device_metadata.yang | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json index 7f0ddd38496f..1c39661d056e 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json @@ -36,6 +36,9 @@ "DEVICE_METADATA_TYPE_CORRECT_PATTERN": { "desc": "DEVICE_METADATA correct value for Type field" }, + "DEVICE_METADATA_TYPE_BMC_MGMT_TOR_PATTERN": { + "desc": "DEVICE_METADATA value as BmcMgmtToRRouter for Type field" + }, "DEVICE_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { "desc": "DEVICE_METADATA value as not-provisioned for Type field" }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json index a921e9ef41b2..687a745a24c6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json @@ -54,6 +54,16 @@ } } }, + "DEVICE_METADATA_TYPE_BMC_MGMT_TOR_PATTERN": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "bgp_asn": "65002", + "type": "BmcMgmtToRRouter" + } + } + } + }, "DEVICE_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { "sonic-device_metadata:sonic-device_metadata": { "sonic-device_metadata:DEVICE_METADATA": { diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index a349a3eb9366..17241005861e 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -88,7 +88,7 @@ module sonic-device_metadata { leaf type { type string { length 1..255; - pattern "ToRRouter|LeafRouter|SpineChassisFrontendRouter|ChassisBackendRouter|ASIC|MgmtToRRouter|SpineRouter|BackEndToRRouter|BackEndLeafRouter|EPMS|MgmtTsToR|not-provisioned"; + pattern "ToRRouter|LeafRouter|SpineChassisFrontendRouter|ChassisBackendRouter|ASIC|MgmtToRRouter|SpineRouter|BackEndToRRouter|BackEndLeafRouter|EPMS|MgmtTsToR|BmcMgmtToRRouter|not-provisioned"; } } From 51e4e8068e369e74c5535de5db20d8eaaa176b74 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Fri, 8 Apr 2022 10:46:59 +0800 Subject: [PATCH 194/817] [ci] Fix a docker-sonic-slave pipeline format in variable reference. (#10494) this issue affect official amd64 docker-sonic-slave build. --- .azure-pipelines/docker-sonic-slave.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index 3e1d2848277e..3ae3f88f0154 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -60,7 +60,7 @@ stages: - ${{ each dist in parameters.dists }}: - ${{ if endswith(variables['Build.DefinitionName'], dist) }}: - ${{ each arch in parameters.arches }}: - - ${{ if eq(variables[''Build.Reason], 'PullRequest') }}: + - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - template: docker-sonic-slave-template.yml parameters: pool: sonicbld From f24a04fa3d2f2ba9993d53a4cb93fc1de87df431 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 8 Apr 2022 10:49:21 +0800 Subject: [PATCH 195/817] [Ci]: check if there is a sonic dirty version issue (#10445) Why I did it [Ci]: check if there is a sonic dirty version issue If there is a dirty version issue in PR build, the build will be failed. --- .azure-pipelines/azure-pipelines-build.yml | 1 + .azure-pipelines/check-dirty-version.yml | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .azure-pipelines/check-dirty-version.yml diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 0b033e959300..c84c91441806 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -132,3 +132,4 @@ jobs: make $BUILD_OPTIONS target/sonic-$(GROUP_NAME).bin fi displayName: "Build sonic image" + - template: check-dirty-version.yml diff --git a/.azure-pipelines/check-dirty-version.yml b/.azure-pipelines/check-dirty-version.yml new file mode 100644 index 000000000000..5d3909bd280e --- /dev/null +++ b/.azure-pipelines/check-dirty-version.yml @@ -0,0 +1,16 @@ +steps: +- script: | + . functions.sh + SONIC_VERSION=$(sonic_get_version) + echo "SONIC_VERSION=$SONIC_VERSION" + if [[ "$SONIC_VERSION" == *dirty* ]]; then + # Print the detail dirty info + git status --untracked-files=no -s --ignore-submodules + + # Exit with error, if it is a PR build + if [ "$(Build.Reason)" == "PullRequest" ]; then + echo "Build failed for the dirty version: $SONIC_VERSION" 1>&2 + exit 1 + fi + fi + displayName: "Check the dirty version" From 330d11a128b02a6e80810c5920d790b9390d06e0 Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Thu, 7 Apr 2022 21:49:42 -0700 Subject: [PATCH 196/817] Add EPMS and MgmtTsToR (#10478) --- dockers/docker-orchagent/switch.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/switch.json.j2 b/dockers/docker-orchagent/switch.json.j2 index fa0ef4b44ed7..30ad703bc2cf 100644 --- a/dockers/docker-orchagent/switch.json.j2 +++ b/dockers/docker-orchagent/switch.json.j2 @@ -3,7 +3,7 @@ {% set hash_seed = 0 %} {% set hash_seed_offset = 0 %} {% if DEVICE_METADATA.localhost.type %} -{% if "ToRRouter" in DEVICE_METADATA.localhost.type %} +{% if "ToRRouter" in DEVICE_METADATA.localhost.type or DEVICE_METADATA.localhost.type in ["EPMS", "MgmtTsToR"] %} {% set hash_seed = 0 %} {% elif "LeafRouter" in DEVICE_METADATA.localhost.type %} {% set hash_seed = 10 %} From 487a29a43b37c8975b67c22b77b1dc9f50c2edff Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Fri, 8 Apr 2022 13:33:02 -0400 Subject: [PATCH 197/817] Update Nokia sonic-platform submodule (#10437) b67d479 Fixed the sfp refactor issue 827c5a6 Added nokia_cmd command nokia_common grpc support for power down/up SFM module aeb7f56 Added the nokia cli commands for midplane c57d083 Fix the get_my_module issue and the thermal_infos exception issue. 0536293 Change the output of "show chassis module status" 63212d7 Enhance the help display for nokia_cmd command e8d2599 Fix the sonic_install_ndk_service script issue d52bdcf Add command nokia_cmd show sfm-eeprom support Signed-off-by: mlok --- platform/broadcom/sonic-platform-modules-nokia | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-nokia b/platform/broadcom/sonic-platform-modules-nokia index ded0344a6819..b67d4795e691 160000 --- a/platform/broadcom/sonic-platform-modules-nokia +++ b/platform/broadcom/sonic-platform-modules-nokia @@ -1 +1 @@ -Subproject commit ded0344a68197363c8c0eefff87b1be0a4591f87 +Subproject commit b67d4795e691cccd4321b196ba92942f5e8fe395 From 92efc01270675a3524a29a8e909fa1fdaeebed75 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 9 Apr 2022 13:26:40 +0800 Subject: [PATCH 198/817] [docker-ptf]: Upgrade scapy to 2.4.5 in docker-ptf (#10507) Why I did it Existing dataplane tests cannot be tested under MACsec environment due to the traffic under MACsec link is encrypted. So, I will override the dp_poll of ptf to MACsec dp_poll to decrypt the MACsec packets on injected ports (PR: Azure/sonic-mgmt#5490). MACsec decryption library depends on scapy 2.4.5. How I did it Upgrade scapy library to 2.4.5 by pip. How to verify it Check the scapy version in docker-ptf by python -c "import scapy; print(scapy.__version__)" 2.4.5 Signed-off-by: Ze Gan --- dockers/docker-ptf/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index d999d01e0026..21a96288a62f 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -119,7 +119,8 @@ RUN rm -rf /debs \ && pip install pyrasite \ && mkdir -p /opt \ && cd /opt \ - && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && pip install --upgrade --ignore-installed scapy==2.4.5 ## Adjust sshd settings RUN mkdir /var/run/sshd \ From 6581decf38377bbcb7eaaad7ebbf62a9c9c6b7c7 Mon Sep 17 00:00:00 2001 From: byu343 Date: Sat, 9 Apr 2022 10:46:09 -0700 Subject: [PATCH 199/817] [saibcm-modules]: Add linux_ngknet for trident4/tomahawk4 chips (#10517) Why I did it For trident4/tomahawk4, linux_ngknet.ko and linux_ngknetcb.ko have to be installed. Also, the kernel modules to load on such chips are different from existing ones, so we add an option is_ltsw_chip to determine the kernel modules to load. The option is_ltsw_chip is controlled by adding 'is_ltsw_chip=1' to platform_env.conf or not. How to verify it We verified that existing platforms still work after this change; and for platforms with trident4/tomahawk4, we can load the different kernel modules as expected after adding 'is_ltsw_chip=1' to platform_env.conf --- .../debian/opennsl-modules.init | 94 ++++++++++++------- .../debian/opennsl-modules.install | 2 + 2 files changed, 64 insertions(+), 32 deletions(-) diff --git a/platform/broadcom/saibcm-modules/debian/opennsl-modules.init b/platform/broadcom/saibcm-modules/debian/opennsl-modules.init index 09112f5331ce..62274eaa36aa 100755 --- a/platform/broadcom/saibcm-modules/debian/opennsl-modules.init +++ b/platform/broadcom/saibcm-modules/debian/opennsl-modules.init @@ -14,17 +14,27 @@ function create_devices() { - rm -f /dev/linux-knet-cb - rm -f /dev/linux-bcm-knet - rm -f /dev/linux-bcm-bde - rm -f /dev/linux-kernel-bde - rm -f /dev/linux_ngbde - - mknod /dev/linux_ngbde c 120 0 - mknod /dev/linux-knet-cb c 121 0 - mknod /dev/linux-bcm-knet c 122 0 - mknod /dev/linux-bcm-bde c 126 0 - mknod /dev/linux-kernel-bde c 127 0 + if [[ $is_ltsw_chip -eq 1 ]]; then + rm -f /dev/linux_ngbde + rm -f /dev/linux_ngknet + rm -f /dev/linux_ngknetcb + + mknod /dev/linux_ngbde c 120 0 + mknod /dev/linux_ngknet c 121 0 + mknod /dev/linux_ngknetcb c 122 0 + else + rm -f /dev/linux-knet-cb + rm -f /dev/linux-bcm-knet + rm -f /dev/linux-bcm-bde + rm -f /dev/linux-kernel-bde + rm -f /dev/linux_ngbde + + mknod /dev/linux_ngbde c 120 0 + mknod /dev/linux-knet-cb c 121 0 + mknod /dev/linux-bcm-knet c 122 0 + mknod /dev/linux-bcm-bde c 126 0 + mknod /dev/linux-kernel-bde c 127 0 + fi } # linux-kernel-bde debug=4 ==> Verbose level debug @@ -33,6 +43,44 @@ function create_devices() # Events(0x20) and Instance(0x4000) # level logs function load_kernel_modules() +{ + if [[ $is_ltsw_chip -eq 1 ]]; then + insmod /lib/modules/$(uname -r)/extra/psample.ko + modprobe linux_ngbde + modprobe linux_ngknet + modprobe linux_ngknetcb + else + modprobe linux-kernel-bde dmasize=$dmasize maxpayload=128 debug=4 dma_debug=1 usemsi=$usemsi + modprobe linux-user-bde + + # Using insmod with absolute path for psample to make sure bcm psample is loaded. + # There is a different psample.ko module getting created at net/psample/psample.ko + insmod /lib/modules/$(uname -r)/extra/psample.ko + + modprobe linux-bcm-knet use_rx_skb=1 rx_buffer_size=9238 debug=0x5020 default_mtu=9100 + modprobe linux-knet-cb + modprobe linux_ngbde + fi +} + +function remove_kernel_modules() +{ + if [[ $is_ltsw_chip -eq 1 ]]; then + rmmod linux_ngknetcb + rmmod linux_ngknet + rmmod linux_ngbde + rmmod psample.ko + else + rmmod psample.ko + rmmod linux-knet-cb + rmmod linux-bcm-knet + rmmod linux-user-bde + rmmod linux-kernel-bde + rmmod linux_ngbde + fi +} + +function load_platform_env() { . /host/machine.conf @@ -47,37 +95,18 @@ function load_kernel_modules() # Set the default configuration for dmasize and usemsi parameters dmasize=32M usemsi=0 + is_ltsw_chip=0 # Source the platform env file env_file="/usr/share/sonic/device/$platform/platform_env.conf" source $env_file - - modprobe linux-kernel-bde dmasize=$dmasize maxpayload=128 debug=4 dma_debug=1 usemsi=$usemsi - modprobe linux-user-bde - - # Using insmod with absolute path for psample to make sure bcm psample is loaded. - # There is a different psample.ko module getting created at net/psample/psample.ko - insmod /lib/modules/$(uname -r)/extra/psample.ko - - modprobe linux-bcm-knet use_rx_skb=1 rx_buffer_size=9238 debug=0x5020 default_mtu=9100 - modprobe linux-knet-cb - modprobe linux_ngbde -} - -function remove_kernel_modules() -{ - rmmod psample.ko - rmmod linux-knet-cb - rmmod linux-bcm-knet - rmmod linux-user-bde - rmmod linux-kernel-bde - rmmod linux_ngbde } case "$1" in start) echo -n "Load OpenNSL kernel modules... " + load_platform_env create_devices load_kernel_modules @@ -87,6 +116,7 @@ start) stop) echo -n "Unload OpenNSL kernel modules... " + load_platform_env remove_kernel_modules echo "done." diff --git a/platform/broadcom/saibcm-modules/debian/opennsl-modules.install b/platform/broadcom/saibcm-modules/debian/opennsl-modules.install index 59bf020cb22c..c739b6a5fc40 100644 --- a/platform/broadcom/saibcm-modules/debian/opennsl-modules.install +++ b/platform/broadcom/saibcm-modules/debian/opennsl-modules.install @@ -4,3 +4,5 @@ systems/linux/user/x86-smp_generic_64-2_6/linux-user-bde.ko lib/modules/5.10.0-8 systems/linux/user/x86-smp_generic_64-2_6/linux-knet-cb.ko lib/modules/5.10.0-8-2-amd64/extra systemd/opennsl-modules.service lib/systemd/system sdklt/linux/bde/linux_ngbde.ko lib/modules/5.10.0-8-2-amd64/extra +sdklt/linux/knet/linux_ngknet.ko lib/modules/5.10.0-8-2-amd64/extra +sdklt/linux/knetcb/linux_ngknetcb.ko lib/modules/5.10.0-8-2-amd64/extra From 7d9a346e1033e1b262fe6e785b78c67277cb4903 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Sat, 9 Apr 2022 19:46:25 +0200 Subject: [PATCH 200/817] [submodule] Update sonic-sairedis (#10515) To add new acl priority attribute CL improvement --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 473c99067c81..2ddf41935696 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 473c99067c8132f8e5b3f8f2abd672b474b42b5a +Subproject commit 2ddf419356964e4e745d5851cd76b8818cbb149f From f7a6553933e1cb8b33c5ab8b4e340c587d6859b0 Mon Sep 17 00:00:00 2001 From: byu343 Date: Sat, 9 Apr 2022 10:47:18 -0700 Subject: [PATCH 201/817] [docker-syncd]: Add optional shm-size to syncd container (#10516) Why I did it In the bringup of tomahawk4/trident4, we realized that such chips need a larger size of /dev/shm in syncd container, so we added the option --shm-size to the docker create for syncd. The default value for shm-size is 64m; after this change, people can add SYNCD_SHM_SIZE=128m to platform_env.conf to change it to 128m. How to verify it We verified that after this change, 1) on existing platforms without platform_env.conf, the size of /dev/shm in syncd container (df -h | grep shm) is still the default 64M; 2) after we add SYNCD_SHM_SIZE=128m to platform_env.conf, /dev/shm in syncd becomes 128M. --- files/build_templates/docker_image_ctl.j2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index b139eb570b3a..6d5024b716eb 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -233,6 +233,11 @@ start() { source $ASIC_CONF fi + PLATFORM_ENV_CONF=/usr/share/sonic/device/$PLATFORM/platform_env.conf + if [ -f "$PLATFORM_ENV_CONF" ]; then + source $PLATFORM_ENV_CONF + fi + {%- if docker_container_name == "database" %} # Don't mount HWSKU in {{docker_container_name}} container. HWSKU="" @@ -421,6 +426,7 @@ start() { {%- endif %} {%- if sonic_asic_platform == "broadcom" %} {%- if docker_container_name == "syncd" %} + --shm-size=${SYNCD_SHM_SIZE:-64m} \ -v /var/run/docker-syncd$DEV:/var/run/sswsyncd \ {%- endif %} {%- endif %} From 81ac482e5a58f627b1ff1c36b7cde50861c6f255 Mon Sep 17 00:00:00 2001 From: roman_savchuk Date: Sat, 9 Apr 2022 20:47:55 +0300 Subject: [PATCH 202/817] [BFN] updated SDE packages for BFN platforms (#10512) Updated SDE packages for bfn platform - introduced X6 profile - fixes for drop counters - fixes for platform part --- platform/barefoot/bfn-platform.mk | 2 +- platform/barefoot/bfn-sai.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/bfn-platform.mk b/platform/barefoot/bfn-platform.mk index 7ea4cbcd5cb8..f12bbaa8a966 100644 --- a/platform/barefoot/bfn-platform.mk +++ b/platform/barefoot/bfn-platform.mk @@ -1,4 +1,4 @@ -BFN_PLATFORM = bfnplatform_20220127_sai_1.9.1_deb10.deb +BFN_PLATFORM = bfnplatform_20220408_sai_1.9.1_deb10.deb $(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_PLATFORM)" SONIC_ONLINE_DEBS += $(BFN_PLATFORM) diff --git a/platform/barefoot/bfn-sai.mk b/platform/barefoot/bfn-sai.mk index c61abeb0ae5d..a0a1d2348dea 100644 --- a/platform/barefoot/bfn-sai.mk +++ b/platform/barefoot/bfn-sai.mk @@ -1,4 +1,4 @@ -BFN_SAI = bfnsdk_20220127_sai_1.9.1_deb10.deb +BFN_SAI = bfnsdk_20220408_sai_1.9.1_deb10.deb $(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_SAI)" $(BFN_SAI)_DEPENDS += $(LIBNL_GENL3_DEV) From 2116f62978cdf7e6fdbcde4875407aecc9d0024a Mon Sep 17 00:00:00 2001 From: brandonchuang Date: Sun, 10 Apr 2022 01:51:49 +0800 Subject: [PATCH 203/817] [AS9716-32D] Support i2c mux reset (#10492) Why I did it Prevent from i2c bus to get locked. How I did it Add sysfs driver to access ioport. Command to reset i2c mux: echo 1 > /sys/devices/platform/as9716_32d_ioport/i2c_mux_rst Command to bring i2c mux out of reset: echo 0 > /sys/devices/platform/as9716_32d_ioport/i2c_mux_rst Signed-off-by: Brandon Chuang --- .../pddf/pddf-device.json | 3 +- .../as9716-32d/modules/Makefile | 2 +- .../modules/accton_as9716_32d_ioport.c | 180 ++++++++++++++++++ 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/accton_as9716_32d_ioport.c diff --git a/device/accton/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json index ce592286078c..6bde8eab7648 100644 --- a/device/accton/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as9716_32d-r0/pddf/pddf-device.json @@ -53,7 +53,8 @@ ], "custom_kos": [ - "pddf_custom_psu" + "pddf_custom_psu", + "accton_as9716_32d_ioport" ] }, diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile index 6ac9d418a3d2..d3811d459f04 100755 --- a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/Makefile @@ -1,7 +1,7 @@ ifneq ($(KERNELRELEASE),) obj-m:= accton_as9716_32d_cpld.o accton_as9716_32d_fan.o \ accton_as9716_32d_leds.o accton_as9716_32d_psu.o accton_i2c_psu.o \ - pddf_custom_psu.o + pddf_custom_psu.o accton_as9716_32d_ioport.o CFLAGS_pddf_custom_psu.o := -I$(M)/../../../../pddf/i2c/modules/include KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF diff --git a/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/accton_as9716_32d_ioport.c b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/accton_as9716_32d_ioport.c new file mode 100644 index 000000000000..e6d9e8adf373 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as9716-32d/modules/accton_as9716_32d_ioport.c @@ -0,0 +1,180 @@ +/* + * A hwmon driver for the Accton as9926 24d fan + * + * Copyright (C) 2016 Accton Technology Corporation. + * Brandon Chuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "as9716_32d_ioport" +#define IOPORT_I2C_MUX_RST 0x50D + +static ssize_t show_i2c_mux_rst(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t set_i2c_mux_rst(struct device *dev, struct device_attribute *da, + const char *buf, size_t count); + +static struct as9716_ioport_data *data = NULL; + +/* ioport data */ +struct as9716_ioport_data { + struct platform_device *pdev; + struct device *hwmon_dev; + struct mutex update_lock; +}; + +/* sysfs attributes for hwmon + */ +static SENSOR_DEVICE_ATTR(i2c_mux_rst, S_IRUGO | S_IWUSR, show_i2c_mux_rst, + set_i2c_mux_rst, 0); + +static struct attribute *sys_attributes[] = { + &sensor_dev_attr_i2c_mux_rst.dev_attr.attr, + NULL +}; + +static struct attribute_group sys_group = { + .attrs = sys_attributes, +}; + +static ssize_t show_i2c_mux_rst(struct device *dev, struct device_attribute *da, + char *buf) +{ + u8 val = 0; + mutex_lock(&data->update_lock); + val = inb(IOPORT_I2C_MUX_RST); + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d\n", !(val & 0xEF)); +} + +static ssize_t set_i2c_mux_rst(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + u8 val = 0; + long value = 0; + int status = 0; + + status = kstrtol(buf, 10, &value); + if (status) + return status; + + mutex_lock(&data->update_lock); + + val = inb(IOPORT_I2C_MUX_RST); + if (value) + outb(val & 0xEF, IOPORT_I2C_MUX_RST); + else + outb(val | 0x10, IOPORT_I2C_MUX_RST); + + mutex_unlock(&data->update_lock); + return count; +} + +static int as9716_32d_ioport_probe(struct platform_device *pdev) +{ + int status = -1; + + request_region(IOPORT_I2C_MUX_RST, 1, "mux_rst"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&pdev->dev.kobj, &sys_group); + if (status) { + goto exit; + } + + dev_info(&pdev->dev, "device created\n"); + return 0; + +exit: + sysfs_remove_group(&pdev->dev.kobj, &sys_group); + return status; +} + +static int as9716_32d_ioport_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &sys_group); + release_region(IOPORT_I2C_MUX_RST, 1); + return 0; +} + +static struct platform_driver as9716_32d_ioport_driver = { + .probe = as9716_32d_ioport_probe, + .remove = as9716_32d_ioport_remove, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init as9716_32d_ioport_init(void) +{ + int ret; + + data = kzalloc(sizeof(struct as9716_ioport_data), GFP_KERNEL); + if (!data) { + ret = -ENOMEM; + goto alloc_err; + } + + mutex_init(&data->update_lock); + + ret = platform_driver_register(&as9716_32d_ioport_driver); + if (ret < 0) + goto dri_reg_err; + + data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(data->pdev)) { + ret = PTR_ERR(data->pdev); + goto dev_reg_err; + } + + return 0; + +dev_reg_err: + platform_driver_unregister(&as9716_32d_ioport_driver); +dri_reg_err: + kfree(data); +alloc_err: + return ret; +} + +static void __exit as9716_32d_ioport_exit(void) +{ + platform_device_unregister(data->pdev); + platform_driver_unregister(&as9716_32d_ioport_driver); + kfree(data); +} + +module_init(as9716_32d_ioport_init); +module_exit(as9716_32d_ioport_exit); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("as9716_32d_ioport driver"); +MODULE_LICENSE("GPL"); From b4f8f1dd225e66deb884c5ff563f9d39dd08f53d Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan <93744978+assrinivasan@users.noreply.github.com> Date: Sat, 9 Apr 2022 13:16:50 -0700 Subject: [PATCH 204/817] Removed python2 dependency for sonic-pcied in sonic-platform-daemons (#10421) Removed python2 support for sonic-platform-daemons that was causing unit test errors in sonic_pcied. * Removed config from docker supervisord jinja templates per VD review comment * Removed space and python3 per QL comments --- .../docker-pmon.supervisord.conf.j2 | 2 +- rules/sonic-pcied.dep | 6 ------ rules/sonic-pcied.mk | 10 +--------- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 index b93f0cef3cee..4a13d76edb0a 100644 --- a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 +++ b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 @@ -171,7 +171,7 @@ dependent_startup_wait_for=rsyslogd:running {% if not skip_pcied %} [program:pcied] -command={% if API_VERSION == 3 and 'pcied' not in python2_daemons %}python3 {% else %} python2 {% endif %}/usr/local/bin/pcied +command=/usr/local/bin/pcied priority=11 autostart=false autorestart=unexpected diff --git a/rules/sonic-pcied.dep b/rules/sonic-pcied.dep index ddb07f722f6d..05cd1fe5cf42 100644 --- a/rules/sonic-pcied.dep +++ b/rules/sonic-pcied.dep @@ -3,12 +3,6 @@ DEP_FILES:= $(SONIC_COMMON_FILES_LIST) rules/sonic-pcied.mk rules/sonic-pcied.de DEP_FILES+= $(SONIC_COMMON_BASE_FILES_LIST) SMDEP_FILES:= $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) -$(SONIC_PCIED_PY2)_CACHE_MODE:= GIT_CONTENT_SHA -$(SONIC_PCIED_PY2)_DEP_FLAGS:= $(SONIC_COMMON_FLAGS_LIST) -$(SONIC_PCIED_PY2)_DEP_FILES:= $(DEP_FILES) -$(SONIC_PCIED_PY2)_SMDEP_FILES:= $(SMDEP_FILES) -$(SONIC_PCIED_PY2)_SMDEP_PATHS:= $(SPATH) - $(SONIC_PCIED_PY3)_CACHE_MODE:= GIT_CONTENT_SHA $(SONIC_PCIED_PY3)_DEP_FLAGS:= $(SONIC_COMMON_FLAGS_LIST) $(SONIC_PCIED_PY3)_DEP_FILES:= $(DEP_FILES) diff --git a/rules/sonic-pcied.mk b/rules/sonic-pcied.mk index 5c80ae276860..a5d0c8d5054c 100644 --- a/rules/sonic-pcied.mk +++ b/rules/sonic-pcied.mk @@ -1,17 +1,9 @@ # sonic-pcied (SONiC PCIe Monitor daemon) Debian package -# SONIC_PCIED_PY2 package - -SONIC_PCIED_PY2 = sonic_pcied-1.0-py2-none-any.whl -$(SONIC_PCIED_PY2)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-pcied -$(SONIC_PCIED_PY2)_DEPENDS = $(SONIC_PY_COMMON_PY2) -$(SONIC_PCIED_PY2)_PYTHON_VERSION = 2 -SONIC_PYTHON_WHEELS += $(SONIC_PCIED_PY2) - # SONIC_PCIED_PY3 package SONIC_PCIED_PY3 = sonic_pcied-1.0-py3-none-any.whl $(SONIC_PCIED_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-pcied -$(SONIC_PCIED_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PCIED_PY2) +$(SONIC_PCIED_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PCIED_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_PCIED_PY3) From 011c21d8f5c6da62d652f813de190f95bb22ec33 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Sun, 10 Apr 2022 12:55:40 +0800 Subject: [PATCH 205/817] [submodule] Advance sonic-swss-common pointer (#10505) a7118f2 Add a ctor for IpPrefix to accept ip structure and mask (#593) 34f3f61 Add MACSEC_SA_PLUGIN_FIELD (#597) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 36e1f61691df..a7118f259a8b 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 36e1f61691df7aa44782a377e4082cc4380f1018 +Subproject commit a7118f259a8be93ec802c77ecf3018cd403ad8dc From cd330f0e70e646c2ff6fc88c6c8fb9f75e8b40e7 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Sun, 10 Apr 2022 18:56:58 -0700 Subject: [PATCH 206/817] [sonic-cfggen] make minigraph parser fail when speed and lanes are not in PORT table (#10228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it Config db schema generated by minigraph can’t pass yang validation, PORT table does not have 'lanes' and 'speed' field. How I did it Make cfggen command fail when 'lanes' and 'speed' are not provided How to verify it Run 'sonic-cfggen -m xxx.xml --print-data' to make sure command fail when 'lanes' and 'speed' not in PORT table --- src/sonic-config-engine/sonic-cfggen | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index bf93ad849fcb..aebd4d0544f5 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -247,6 +247,19 @@ def _get_jinja2_env(paths): return env +def _must_field_by_yang(data, table, must_fields): + """ + Check if table contains must field based on yang definition + """ + if table not in data: + return + + for must_field in must_fields: + for _, fields in data[table].items(): + if must_field not in fields: + print(must_field, 'is a must field in', table, file=sys.stderr) + sys.exit(1) + def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") group = parser.add_mutually_exclusive_group() @@ -335,6 +348,8 @@ def main(): deep_update(data, parse_xml(minigraph, platform, asic_name=asic_name)) else: deep_update(data, parse_xml(minigraph, port_config_file=args.port_config, asic_name=asic_name, hwsku_config_file=args.hwsku_config)) + # check if minigraph parser has speed and lanes in PORT table + _must_field_by_yang(data, 'PORT', ['speed', 'lanes']) if args.device_description is not None: deep_update(data, parse_device_desc_xml(args.device_description)) From 5242a4bc7aab745ce3fbae97efe0b156a5a48f54 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:52:44 +0800 Subject: [PATCH 207/817] Upgrade pip3 package docker to 5.0.3 (#10523) Why I did it In sonic-utilities repo, it is required to install docker>=4.4.4 https://github.com/Azure/sonic-utilities/blob/f70dc27827a88d70e91e15ecdcde2ebbc446116d/setup.py#L187 --- build_debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index c509b7097151..6dbbaa8cf770 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -447,7 +447,7 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'setup sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'wheel==0.35.1' # docker Python API package is needed by Ansible docker module as well as some SONiC applications -sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'docker==4.3.1' +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'docker==5.0.3' # Install scapy sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install 'scapy==2.4.4' From 396a92cb2e3e5c1e87b361484a9f3a8ec7ac1c5a Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Tue, 12 Apr 2022 10:44:17 -0700 Subject: [PATCH 208/817] [dhcp_relay] Remove dhcp6mon (#10467) --- dockers/docker-dhcp-relay/Dockerfile.j2 | 2 +- ...lay.monitors.j2 => dhcp-relay.monitors.j2} | 2 - .../docker-dhcp-relay.supervisord.conf.j2 | 2 +- src/dhcpmon/src/dhcp_device.c | 593 ++++-------------- src/dhcpmon/src/dhcp_device.h | 123 +--- src/dhcpmon/src/dhcp_devman.c | 37 +- src/dhcpmon/src/dhcp_devman.h | 17 +- src/dhcpmon/src/dhcp_mon.c | 106 +--- src/dhcpmon/src/dhcp_mon.h | 4 +- src/dhcpmon/src/main.c | 20 +- .../py2/docker-dhcp-relay.supervisord.conf | 2 +- .../py3/docker-dhcp-relay.supervisord.conf | 2 +- 12 files changed, 187 insertions(+), 723 deletions(-) rename dockers/docker-dhcp-relay/{dhcpv6-relay.monitors.j2 => dhcp-relay.monitors.j2} (97%) diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index 2d2afd922471..f214edc8516c 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -30,7 +30,7 @@ RUN apt-get clean -y && \ COPY ["docker_init.sh", "start.sh", "/usr/bin/"] COPY ["docker-dhcp-relay.supervisord.conf.j2", "port-name-alias-map.txt.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] -COPY ["dhcp-relay.programs.j2", "dhcpv4-relay.agents.j2", "dhcpv6-relay.agents.j2", "dhcpv6-relay.monitors.j2", "/usr/share/sonic/templates/"] +COPY ["dhcp-relay.programs.j2", "dhcpv4-relay.agents.j2", "dhcpv6-relay.agents.j2", "dhcp-relay.monitors.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] COPY ["cli", "/cli/"] diff --git a/dockers/docker-dhcp-relay/dhcpv6-relay.monitors.j2 b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 similarity index 97% rename from dockers/docker-dhcp-relay/dhcpv6-relay.monitors.j2 rename to dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 index 9f2d0f01b59f..ae11105ae3ba 100644 --- a/dockers/docker-dhcp-relay/dhcpv6-relay.monitors.j2 +++ b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 @@ -59,8 +59,6 @@ command=/usr/sbin/dhcpmon -id {{ vlan_name }} {% if prefix | ipv4 %} -im {{ name }}{% endif -%} {% endfor %} {% endif %} -{% if relay_for_ipv4.flag %} -4{% endif %} -{% if relay_for_ipv6.flag %} -6{% endif %} priority=4 autostart=false diff --git a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 index 664e1f36c05e..41a13dd496ad 100644 --- a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 +++ b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 @@ -65,6 +65,6 @@ dependent_startup_wait_for=rsyslogd:running {% include 'dhcpv6-relay.agents.j2' %} {% endfor %} -{% include 'dhcpv6-relay.monitors.j2' %} +{% include 'dhcp-relay.monitors.j2' %} {% endif %} {% endif %} diff --git a/src/dhcpmon/src/dhcp_device.c b/src/dhcpmon/src/dhcp_device.c index e4fbc7f56909..f45483f8504c 100644 --- a/src/dhcpmon/src/dhcp_device.c +++ b/src/dhcpmon/src/dhcp_device.c @@ -21,51 +21,25 @@ #include #include #include -#include -#include -#include #include "dhcp_device.h" -/** DHCP versions flags */ -static bool dhcpv4_enabled; -static bool dhcpv6_enabled; - /** Counter print width */ #define DHCP_COUNTER_WIDTH 9 /** Start of Ether header of a captured frame */ #define ETHER_START_OFFSET 0 -/** EtherType field offset from Ether header of a captured frame */ -#define ETHER_TYPE_OFFSET (ETHER_START_OFFSET + 12) /** Start of IP header of a captured frame */ #define IP_START_OFFSET (ETHER_START_OFFSET + ETHER_HDR_LEN) -/** Start of UDP header on IPv4 packet of a captured frame */ -#define UDPv4_START_OFFSET (IP_START_OFFSET + sizeof(struct ip)) -/** Start of DHCPv4 header of a captured frame */ -#define DHCPv4_START_OFFSET (UDPv4_START_OFFSET + sizeof(struct udphdr)) -/** Start of DHCPv4 Options segment of a captured frame */ -#define DHCPv4_OPTIONS_HEADER_SIZE 240 +/** Start of UDP header of a captured frame */ +#define UDP_START_OFFSET (IP_START_OFFSET + sizeof(struct ip)) +/** Start of DHCP header of a captured frame */ +#define DHCP_START_OFFSET (UDP_START_OFFSET + sizeof(struct udphdr)) +/** Start of DHCP Options segment of a captured frame */ +#define DHCP_OPTIONS_HEADER_SIZE 240 /** Offset of DHCP GIADDR */ #define DHCP_GIADDR_OFFSET 24 -/** IPv6 link-local prefix */ -#define IPV6_LINK_LOCAL_PREFIX 0x80fe -/** Start of UDP header on IPv6 packet of a captured frame */ -#define UDPv6_START_OFFSET (IP_START_OFFSET + sizeof(struct ip6_hdr)) -/** Start of DHCPv6 header of a captured frame */ -#define DHCPv6_START_OFFSET (UDPv6_START_OFFSET + sizeof(struct udphdr)) -/** Size of 'type' field on DHCPv6 header */ -#define DHCPv6_TYPE_LENGTH 1 -/** Size of DHCPv6 relay message header to first option */ -#define DHCPv6_RELAY_MSG_OPTIONS_OFFSET 34 -/** Size of 'option' field on DHCPv6 header */ -#define DHCPv6_OPTION_LENGTH 2 -/** Size of 'option length' field on DHCPv6 header */ -#define DHCPv6_OPTION_LEN_LENGTH 2 -/** DHCPv6 OPTION_RELAY_MSG */ -#define DHCPv6_OPTION_RELAY_MSG 9 - #define OP_LDHA (BPF_LD | BPF_H | BPF_ABS) /** bpf ldh Abs */ #define OP_LDHI (BPF_LD | BPF_H | BPF_IND) /** bpf ldh Ind */ #define OP_LDB (BPF_LD | BPF_B | BPF_ABS) /** bpf ldb Abs*/ @@ -75,40 +49,34 @@ static bool dhcpv6_enabled; #define OP_JSET (BPF_JMP | BPF_JSET | BPF_K) /** bpf jset */ #define OP_LDXB (BPF_LDX | BPF_B | BPF_MSH) /** bpf ldxb */ -/** Berkeley Packet Filter program for "udp and (port 546 or port 547 or port 67 or port 68)". +/** Berkeley Packet Filter program for "udp and (port 67 or port 68)". * This program is obtained using the following command tcpdump: - * `tcpdump -dd "udp and (port 546 or port 547 or port 67 or port 68)"` + * `tcpdump -dd "udp and (port 67 or port 68)"` */ static struct sock_filter dhcp_bpf_code[] = { - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x0000000c}, // (000) ldh [12] - {.code = OP_JEQ, .jt = 0, .jf = 9, .k = 0x000086dd}, // (001) jeq #0x86dd jt 2 jf 11 - {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000014}, // (002) ldb [20] - {.code = OP_JEQ, .jt = 0, .jf = 24, .k = 0x00000011}, // (003) jeq #0x11 jt 4 jf 28 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000036}, // (004) ldh [54] - {.code = OP_JEQ, .jt = 21, .jf = 0, .k = 0x00000222}, // (005) jeq #0x222 jt 27 jf 6 - {.code = OP_JEQ, .jt = 20, .jf = 0, .k = 0x00000223}, // (006) jeq #0x223 jt 27 jf 7 - {.code = OP_JEQ, .jt = 19, .jf = 0, .k = 0x00000043}, // (007) jeq #0x43 jt 27 jf 8 - {.code = OP_JEQ, .jt = 18, .jf = 0, .k = 0x00000044}, // (008) jeq #0x44 jt 27 jf 9 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000038}, // (009) ldh [56] - {.code = OP_JEQ, .jt = 16, .jf = 13, .k = 0x00000222}, // (010) jeq #0x222 jt 27 jf 24 - {.code = OP_JEQ, .jt = 0, .jf = 16, .k = 0x00000800}, // (011) jeq #0x800 jt 12 jf 28 - {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000017}, // (012) ldb [23] - {.code = OP_JEQ, .jt = 0, .jf = 14, .k = 0x00000011}, // (013) jeq #0x11 jt 14 jf 28 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000014}, // (014) ldh [20] - {.code = OP_JSET, .jt = 12, .jf = 0, .k = 0x00001fff}, // (015) jset #0x1fff jt 28 jf 16 - {.code = OP_LDXB, .jt = 0, .jf = 0, .k = 0x0000000e}, // (016) ldxb 4*([14]&0xf) - {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x0000000e}, // (017) ldh [x + 14] - {.code = OP_JEQ, .jt = 8, .jf = 0, .k = 0x00000222}, // (018) jeq #0x222 jt 27 jf 19 - {.code = OP_JEQ, .jt = 7, .jf = 0, .k = 0x00000223}, // (019) jeq #0x223 jt 27 jf 20 - {.code = OP_JEQ, .jt = 6, .jf = 0, .k = 0x00000043}, // (020) jeq #0x43 jt 27 jf 21 - {.code = OP_JEQ, .jt = 5, .jf = 0, .k = 0x00000044}, // (021) jeq #0x44 jt 27 jf 22 - {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x00000010}, // (022) ldh [x + 16] - {.code = OP_JEQ, .jt = 3, .jf = 0, .k = 0x00000222}, // (023) jeq #0x222 jt 27 jf 24 - {.code = OP_JEQ, .jt = 2, .jf = 0, .k = 0x00000223}, // (024) jeq #0x223 jt 27 jf 25 - {.code = OP_JEQ, .jt = 1, .jf = 0, .k = 0x00000043}, // (025) jeq #0x43 jt 27 jf 26 - {.code = OP_JEQ, .jt = 0, .jf = 1, .k = 0x00000044}, // (026) jeq #0x44 jt 27 jf 28 - {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00040000}, // (027) ret #262144 - {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00000000}, // (028) ret + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x0000000c}, // (000) ldh [12] + {.code = OP_JEQ, .jt = 0, .jf = 7, .k = 0x000086dd}, // (001) jeq #0x86dd jt 2 jf 9 + {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000014}, // (002) ldb [20] + {.code = OP_JEQ, .jt = 0, .jf = 18, .k = 0x00000011}, // (003) jeq #0x11 jt 4 jf 22 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000036}, // (004) ldh [54] + {.code = OP_JEQ, .jt = 15, .jf = 0, .k = 0x00000043}, // (005) jeq #0x43 jt 21 jf 6 + {.code = OP_JEQ, .jt = 14, .jf = 0, .k = 0x00000044}, // (006) jeq #0x44 jt 21 jf 7 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000038}, // (007) ldh [56] + {.code = OP_JEQ, .jt = 12, .jf = 11, .k = 0x00000043}, // (008) jeq #0x43 jt 21 jf 20 + {.code = OP_JEQ, .jt = 0, .jf = 12, .k = 0x00000800}, // (009) jeq #0x800 jt 10 jf 22 + {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000017}, // (010) ldb [23] + {.code = OP_JEQ, .jt = 0, .jf = 10, .k = 0x00000011}, // (011) jeq #0x11 jt 12 jf 22 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000014}, // (012) ldh [20] + {.code = OP_JSET, .jt = 8, .jf = 0, .k = 0x00001fff}, // (013) jset #0x1fff jt 22 jf 14 + {.code = OP_LDXB, .jt = 0, .jf = 0, .k = 0x0000000e}, // (014) ldxb 4*([14]&0xf) + {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x0000000e}, // (015) ldh [x + 14] + {.code = OP_JEQ, .jt = 4, .jf = 0, .k = 0x00000043}, // (016) jeq #0x43 jt 21 jf 17 + {.code = OP_JEQ, .jt = 3, .jf = 0, .k = 0x00000044}, // (017) jeq #0x44 jt 21 jf 18 + {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x00000010}, // (018) ldh [x + 16] + {.code = OP_JEQ, .jt = 1, .jf = 0, .k = 0x00000043}, // (019) jeq #0x43 jt 21 jf 20 + {.code = OP_JEQ, .jt = 0, .jf = 1, .k = 0x00000044}, // (020) jeq #0x44 jt 21 jf 22 + {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00040000}, // (021) ret #262144 + {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00000000}, // (022) ret #0 }; /** Filter program socket struct */ @@ -121,29 +89,16 @@ static struct sock_fprog dhcp_sock_bfp = { */ static dhcp_device_context_t aggregate_dev = {0}; -static dhcp_device_context_t *mgmt_intf = NULL; - -/** Monitored DHCPv4 message type */ -static dhcpv4_message_type_t v4_monitored_msgs[] = { - DHCPv4_MESSAGE_TYPE_DISCOVER, - DHCPv4_MESSAGE_TYPE_OFFER, - DHCPv4_MESSAGE_TYPE_REQUEST, - DHCPv4_MESSAGE_TYPE_ACK -}; - -/** Monitored DHCPv6 message type */ -static dhcpv6_message_type_t v6_monitored_msgs[] = { - DHCPv6_MESSAGE_TYPE_SOLICIT, - DHCPv6_MESSAGE_TYPE_ADVERTISE, - DHCPv6_MESSAGE_TYPE_REQUEST, - DHCPv6_MESSAGE_TYPE_REPLY +/** Monitored DHCP message type */ +static dhcp_message_type_t monitored_msgs[] = { + DHCP_MESSAGE_TYPE_DISCOVER, + DHCP_MESSAGE_TYPE_OFFER, + DHCP_MESSAGE_TYPE_REQUEST, + DHCP_MESSAGE_TYPE_ACK }; -/** Number of monitored DHCPv4 message type */ -static uint8_t v4_monitored_msg_sz = sizeof(v4_monitored_msgs) / sizeof(*v4_monitored_msgs); - -/** Number of monitored DHCPv6 message type */ -static uint8_t v6_monitored_msg_sz = sizeof(v6_monitored_msgs) / sizeof(*v6_monitored_msgs); +/** Number of monitored DHCP message type */ +static uint8_t monitored_msg_sz = sizeof(monitored_msgs) / sizeof(*monitored_msgs); /** * @code handle_dhcp_option_53(context, dhcp_option, dir, iphdr, dhcphdr); @@ -168,37 +123,27 @@ static void handle_dhcp_option_53(dhcp_device_context_t *context, switch (dhcp_option[2]) { // DHCP messages send by client - case DHCPv4_MESSAGE_TYPE_DISCOVER: - case DHCPv4_MESSAGE_TYPE_REQUEST: - case DHCPv4_MESSAGE_TYPE_DECLINE: - case DHCPv4_MESSAGE_TYPE_RELEASE: - case DHCPv4_MESSAGE_TYPE_INFORM: + case DHCP_MESSAGE_TYPE_DISCOVER: + case DHCP_MESSAGE_TYPE_REQUEST: + case DHCP_MESSAGE_TYPE_DECLINE: + case DHCP_MESSAGE_TYPE_RELEASE: + case DHCP_MESSAGE_TYPE_INFORM: giaddr = ntohl(dhcphdr[DHCP_GIADDR_OFFSET] << 24 | dhcphdr[DHCP_GIADDR_OFFSET + 1] << 16 | dhcphdr[DHCP_GIADDR_OFFSET + 2] << 8 | dhcphdr[DHCP_GIADDR_OFFSET + 3]); if ((context->giaddr_ip == giaddr && context->is_uplink && dir == DHCP_TX) || (!context->is_uplink && dir == DHCP_RX && iphdr->ip_dst.s_addr == INADDR_BROADCAST)) { - context->counters.v4counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; - // If the packet recieved on the mgmt interface, we don't want to increment the aggregate device - if (context == mgmt_intf) - { - break; - } - aggregate_dev.counters.v4counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; + context->counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; + aggregate_dev.counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; } break; // DHCP messages send by server - case DHCPv4_MESSAGE_TYPE_OFFER: - case DHCPv4_MESSAGE_TYPE_ACK: - case DHCPv4_MESSAGE_TYPE_NAK: + case DHCP_MESSAGE_TYPE_OFFER: + case DHCP_MESSAGE_TYPE_ACK: + case DHCP_MESSAGE_TYPE_NAK: if ((context->giaddr_ip == iphdr->ip_dst.s_addr && context->is_uplink && dir == DHCP_RX) || (!context->is_uplink && dir == DHCP_TX)) { - context->counters.v4counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; - // If the packet recieved on the mgmt interface, we don't want to increment the aggregate device - if (context == mgmt_intf) - { - break; - } - aggregate_dev.counters.v4counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; + context->counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; + aggregate_dev.counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option[2]]++; } break; default: @@ -207,48 +152,6 @@ static void handle_dhcp_option_53(dhcp_device_context_t *context, } } -/** - * @code handle_dhcpv6_option(context, dhcp_option, dir); - * - * @brief handle the logic related to DHCPv6 option - * - * @param context Device (interface) context - * @param dhcp_option pointer to DHCP option buffer space - * @param dir packet direction - * - * @return none - */ -static void handle_dhcpv6_option(dhcp_device_context_t *context, - const u_char dhcp_option, - dhcp_packet_direction_t dir) -{ - switch (dhcp_option) - { - case DHCPv6_MESSAGE_TYPE_SOLICIT: - case DHCPv6_MESSAGE_TYPE_REQUEST: - case DHCPv6_MESSAGE_TYPE_CONFIRM: - case DHCPv6_MESSAGE_TYPE_RENEW: - case DHCPv6_MESSAGE_TYPE_REBIND: - case DHCPv6_MESSAGE_TYPE_RELEASE: - case DHCPv6_MESSAGE_TYPE_DECLINE: - case DHCPv6_MESSAGE_TYPE_ADVERTISE: - case DHCPv6_MESSAGE_TYPE_REPLY: - case DHCPv6_MESSAGE_TYPE_RECONFIGURE: - case DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST: - context->counters.v6counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option]++; - // If the packet recieved on the mgmt interface, we don't want to increment the aggregate device - if (context == mgmt_intf) - { - break; - } - aggregate_dev.counters.v6counters[DHCP_COUNTERS_CURRENT][dir][dhcp_option]++; - break; - default: - syslog(LOG_WARNING, "handle_dhcpv6_option(%s): Unknown DHCPv6 option type %d", context->intf, dhcp_option); - break; - } -} - /** * @code read_callback(fd, event, arg); * @@ -268,29 +171,16 @@ static void read_callback(int fd, short event, void *arg) while ((event == EV_READ) && ((buffer_sz = recv(fd, context->buffer, context->snaplen, MSG_DONTWAIT)) > 0)) { struct ether_header *ethhdr = (struct ether_header*) context->buffer; - struct ip *iphdr; - struct ip6_hdr *ipv6hdr; - struct udphdr *udp; - uint8_t *dhcphdr; - int dhcp_option_offset; - - bool is_ipv4 = (ntohs(ethhdr->ether_type) == ETHERTYPE_IP); - if (is_ipv4) { - iphdr = (struct ip*) (context->buffer + IP_START_OFFSET); - udp = (struct udphdr*) (context->buffer + UDPv4_START_OFFSET); - dhcphdr = context->buffer + DHCPv4_START_OFFSET; - dhcp_option_offset = DHCPv4_START_OFFSET + DHCPv4_OPTIONS_HEADER_SIZE; - } else { - ipv6hdr = (struct ip6_hdr*) (context->buffer + IP_START_OFFSET); - udp = (struct udphdr*) (context->buffer + UDPv6_START_OFFSET); - dhcphdr = context->buffer + DHCPv6_START_OFFSET; - dhcp_option_offset = DHCPv6_START_OFFSET; - } - if (is_ipv4 && dhcpv4_enabled && (buffer_sz > UDPv4_START_OFFSET + sizeof(struct udphdr) + DHCPv4_OPTIONS_HEADER_SIZE) && - (ntohs(udp->len) > DHCPv4_OPTIONS_HEADER_SIZE)) { - int dhcp_sz = ntohs(udp->len) < buffer_sz - UDPv4_START_OFFSET - sizeof(struct udphdr) ? - ntohs(udp->len) : buffer_sz - UDPv4_START_OFFSET - sizeof(struct udphdr); - int dhcp_option_sz = dhcp_sz - DHCPv4_OPTIONS_HEADER_SIZE; + struct ip *iphdr = (struct ip*) (context->buffer + IP_START_OFFSET); + struct udphdr *udp = (struct udphdr*) (context->buffer + UDP_START_OFFSET); + uint8_t *dhcphdr = context->buffer + DHCP_START_OFFSET; + int dhcp_option_offset = DHCP_START_OFFSET + DHCP_OPTIONS_HEADER_SIZE; + + if ((buffer_sz > UDP_START_OFFSET + sizeof(struct udphdr) + DHCP_OPTIONS_HEADER_SIZE) && + (ntohs(udp->len) > DHCP_OPTIONS_HEADER_SIZE)) { + int dhcp_sz = ntohs(udp->len) < buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr) ? + ntohs(udp->len) : buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr); + int dhcp_option_sz = dhcp_sz - DHCP_OPTIONS_HEADER_SIZE; const u_char *dhcp_option = context->buffer + dhcp_option_offset; dhcp_packet_direction_t dir = (ethhdr->ether_shost[0] == context->mac[0] && ethhdr->ether_shost[1] == context->mac[1] && @@ -324,37 +214,6 @@ static void read_callback(int fd, short event, void *arg) offset += dhcp_option[offset + 1] + 2; } } - } - else if (!is_ipv4 && dhcpv6_enabled && (buffer_sz > UDPv6_START_OFFSET + sizeof(struct udphdr) + DHCPv6_TYPE_LENGTH)) { - const u_char* dhcp_header = context->buffer + dhcp_option_offset; - dhcp_packet_direction_t dir = (ethhdr->ether_shost[0] == context->mac[0] && - ethhdr->ether_shost[1] == context->mac[1] && - ethhdr->ether_shost[2] == context->mac[2] && - ethhdr->ether_shost[3] == context->mac[3] && - ethhdr->ether_shost[4] == context->mac[4] && - ethhdr->ether_shost[5] == context->mac[5]) ? - DHCP_TX : DHCP_RX; - int offset = 0; - uint16_t option = 0; - uint16_t current_option_len = 0; - // Get to inner DHCP header from encapsulated RELAY_FORWARD or RELAY_REPLY header - while (dhcp_header[offset] == DHCPv6_MESSAGE_TYPE_RELAY_FORWARD || dhcp_header[offset] == DHCPv6_MESSAGE_TYPE_RELAY_REPLY) - { - // Get to DHCPv6_OPTION_RELAY_MSG from all options - offset += DHCPv6_RELAY_MSG_OPTIONS_OFFSET; - option = htons(*((uint16_t*)(&(dhcp_header[offset])))); - - while (option != DHCPv6_OPTION_RELAY_MSG) - { - // Add to offset the option length and get the next option ID - current_option_len = htons(*((uint16_t*)(&(dhcp_header[offset + DHCPv6_OPTION_LENGTH])))); - offset += DHCPv6_OPTION_LENGTH + DHCPv6_OPTION_LEN_LENGTH + current_option_len; - option = htons(*((uint16_t*)(&(dhcp_header[offset])))); - } - // Set the offset to DHCP-relay-message data - offset += DHCPv6_OPTION_LENGTH + DHCPv6_OPTION_LEN_LENGTH; - } - handle_dhcpv6_option(context, dhcp_header[offset], dir); } else { syslog(LOG_WARNING, "read_callback(%s): read length (%ld) is too small to capture DHCP options", context->intf, buffer_sz); @@ -363,73 +222,29 @@ static void read_callback(int fd, short event, void *arg) } /** - * @code dhcp_device_is_dhcp_inactive(v4counters, v6counters, type); + * @code dhcp_device_is_dhcp_inactive(counters); * * @brief Check if there were no DHCP activity * - * @param v4counters current/snapshot v4counter - * - * @param v6counters current/snapshot v6counter - * - * @param type DHCP type + * @param counters current/snapshot counter * * @return true if there were no DHCP activity, false otherwise */ -static bool dhcp_device_is_dhcp_inactive(uint64_t v4counters[][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT], - uint64_t v6counters[][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT], - dhcp_type_t type) +static bool dhcp_device_is_dhcp_inactive(uint64_t counters[][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]) { - bool rv = true; - uint64_t *rx_counters; - uint64_t *rx_counter_snapshot; - - switch (type) - { - case DHCPv4_TYPE: - rx_counters = v4counters[DHCP_COUNTERS_CURRENT][DHCP_RX]; - rx_counter_snapshot = v4counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX]; - for (uint8_t i = 0; (i < v4_monitored_msg_sz) && rv; i++) { - rv = rx_counters[v4_monitored_msgs[i]] == rx_counter_snapshot[v4_monitored_msgs[i]]; - } - break; - - case DHCPv6_TYPE: - rx_counters = v6counters[DHCP_COUNTERS_CURRENT][DHCP_RX]; - rx_counter_snapshot = v6counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX]; - for (uint8_t i = 0; (i < v6_monitored_msg_sz) && rv; i++) { - rv = rx_counters[v6_monitored_msgs[i]] == rx_counter_snapshot[v6_monitored_msgs[i]]; - } - break; + uint64_t *rx_counters = counters[DHCP_COUNTERS_CURRENT][DHCP_RX]; + uint64_t *rx_counter_snapshot = counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX]; - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; + bool rv = true; + for (uint8_t i = 0; (i < monitored_msg_sz) && rv; i++) { + rv = rx_counters[monitored_msgs[i]] == rx_counter_snapshot[monitored_msgs[i]]; } return rv; } /** - * @code dhcp_device_is_dhcpv4_msg_unhealthy(type, counters); - * - * @brief Check if DHCP relay is functioning properly for message of type 'type'. - * For every rx of message 'type', there should be increment of the same message type. - * - * @param type DHCP message type - * @param counters current/snapshot counter - * - * @return true if DHCP message 'type' is transmitted,false otherwise - */ -static bool dhcp_device_is_dhcpv4_msg_unhealthy(dhcpv4_message_type_t type, - uint64_t v4counters[][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT]) -{ - // check if DHCP message 'type' is being relayed - return ((v4counters[DHCP_COUNTERS_CURRENT][DHCP_RX][type] > v4counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX][type]) && - (v4counters[DHCP_COUNTERS_CURRENT][DHCP_TX][type] <= v4counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX][type]) ); -} - -/** - * @code dhcp_device_is_dhcpv6_msg_unhealthy(type, counters); + * @code dhcp_device_is_dhcp_msg_unhealthy(type, counters); * * @brief Check if DHCP relay is functioning properly for message of type 'type'. * For every rx of message 'type', there should be increment of the same message type. @@ -439,57 +254,34 @@ static bool dhcp_device_is_dhcpv4_msg_unhealthy(dhcpv4_message_type_t type, * * @return true if DHCP message 'type' is transmitted,false otherwise */ -static bool dhcp_device_is_dhcpv6_msg_unhealthy(dhcpv6_message_type_t type, - uint64_t v6counters[][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT]) +static bool dhcp_device_is_dhcp_msg_unhealthy(dhcp_message_type_t type, + uint64_t counters[][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]) { // check if DHCP message 'type' is being relayed - return ((v6counters[DHCP_COUNTERS_CURRENT][DHCP_RX][type] > v6counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX][type]) && - (v6counters[DHCP_COUNTERS_CURRENT][DHCP_TX][type] <= v6counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX][type]) ); + return ((counters[DHCP_COUNTERS_CURRENT][DHCP_RX][type] > counters[DHCP_COUNTERS_SNAPSHOT][DHCP_RX][type]) && + (counters[DHCP_COUNTERS_CURRENT][DHCP_TX][type] <= counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX][type]) ); } /** - * @code dhcp_device_check_positive_health(v4counters, v6counters, type); + * @code dhcp_device_check_positive_health(counters, counters_snapshot); * - * @brief Check if DHCPv4/6 relay is functioning properly for monitored messages. - * DHCPv4 (Discover, Offer, Request, ACK.) and DHCPv6 (Solicit, Advertise, Request, Reply). + * @brief Check if DHCP relay is functioning properly for monitored messages (Discover, Offer, Request, ACK.) * For every rx of monitored messages, there should be increment of the same message type. * - * @param v4counters current/snapshot counter - * - * @param v6counters current/snapshot counter - * - * @param type DHCP type + * @param counters current/snapshot counter * * @return DHCP_MON_STATUS_HEALTHY, DHCP_MON_STATUS_UNHEALTHY, or DHCP_MON_STATUS_INDETERMINATE */ -static dhcp_mon_status_t dhcp_device_check_positive_health(uint64_t v4counters[][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT], - uint64_t v6counters[][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT], - dhcp_type_t type) +static dhcp_mon_status_t dhcp_device_check_positive_health(uint64_t counters[][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]) { dhcp_mon_status_t rv = DHCP_MON_STATUS_HEALTHY; bool is_dhcp_unhealthy = false; - - switch (type) - { - case DHCPv4_TYPE: - for (uint8_t i = 0; (i < v4_monitored_msg_sz) && !is_dhcp_unhealthy; i++) { - is_dhcp_unhealthy = dhcp_device_is_dhcpv4_msg_unhealthy(v4_monitored_msgs[i], v4counters); - } - break; - - case DHCPv6_TYPE: - for (uint8_t i = 0; (i < v6_monitored_msg_sz) && !is_dhcp_unhealthy; i++) { - is_dhcp_unhealthy = dhcp_device_is_dhcpv6_msg_unhealthy(v6_monitored_msgs[i], v6counters); - } - break; - - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; + for (uint8_t i = 0; (i < monitored_msg_sz) && !is_dhcp_unhealthy; i++) { + is_dhcp_unhealthy = dhcp_device_is_dhcp_msg_unhealthy(monitored_msgs[i], counters); } - // if we have rx DORA/SARR then we should have corresponding tx DORA/SARR (DORA/SARR being relayed) + // if we have rx DORA then we should have corresponding tx DORA (DORA being relayed) if (is_dhcp_unhealthy) { rv = DHCP_MON_STATUS_UNHEALTHY; } @@ -498,47 +290,27 @@ static dhcp_mon_status_t dhcp_device_check_positive_health(uint64_t v4counters[] } /** - * @code dhcp_device_check_negative_health(v4counters, v6counters, type); + * @code dhcp_device_check_negative_health(counters); * * @brief Check that DHCP relayed messages are not being transmitted out of this interface/dev * using its counters. The interface is negatively healthy if there are not DHCP message * travelling through it. * - * @param v4counters current/snapshot counter - * @param v6counters current/snapshot counter - * @param type DHCP type + * @param counters recent interface counter + * @param counters_snapshot snapshot counters * * @return DHCP_MON_STATUS_HEALTHY, DHCP_MON_STATUS_UNHEALTHY, or DHCP_MON_STATUS_INDETERMINATE */ -static dhcp_mon_status_t dhcp_device_check_negative_health(uint64_t v4counters[][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT], - uint64_t v6counters[][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT], - dhcp_type_t type) +static dhcp_mon_status_t dhcp_device_check_negative_health(uint64_t counters[][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]) { dhcp_mon_status_t rv = DHCP_MON_STATUS_HEALTHY; - bool is_dhcp_unhealthy = false; - uint64_t *tx_counters; - uint64_t *tx_counter_snapshot; + uint64_t *tx_counters = counters[DHCP_COUNTERS_CURRENT][DHCP_TX]; + uint64_t *tx_counter_snapshot = counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX]; - switch (type) - { - case DHCPv4_TYPE: - tx_counters = v4counters[DHCP_COUNTERS_CURRENT][DHCP_TX]; - tx_counter_snapshot = v4counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX]; - for (uint8_t i = 0; (i < v4_monitored_msg_sz) && !is_dhcp_unhealthy; i++) { - is_dhcp_unhealthy = tx_counters[v4_monitored_msgs[i]] > tx_counter_snapshot[v4_monitored_msgs[i]]; - } - break; - case DHCPv6_TYPE: - tx_counters = v6counters[DHCP_COUNTERS_CURRENT][DHCP_TX]; - tx_counter_snapshot = v6counters[DHCP_COUNTERS_SNAPSHOT][DHCP_TX]; - for (uint8_t i = 0; (i < v6_monitored_msg_sz) && !is_dhcp_unhealthy; i++) { - is_dhcp_unhealthy = tx_counters[v6_monitored_msgs[i]] > tx_counter_snapshot[v6_monitored_msgs[i]]; - } - break; - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; + bool is_dhcp_unhealthy = false; + for (uint8_t i = 0; (i < monitored_msg_sz) && !is_dhcp_unhealthy; i++) { + is_dhcp_unhealthy = tx_counters[monitored_msgs[i]] > tx_counter_snapshot[monitored_msgs[i]]; } // for negative validation, return unhealthy if DHCP packet are being @@ -551,7 +323,7 @@ static dhcp_mon_status_t dhcp_device_check_negative_health(uint64_t v4counters[] } /** - * @code dhcp_device_check_health(check_type, v4counters, v6counters, type); + * @code dhcp_device_check_health(check_type, counters, counters_snapshot); * * @brief Check that DHCP relay is functioning properly given a check type. Positive check * indicates for every rx of DHCP message of type 'type', there would increment of @@ -560,80 +332,59 @@ static dhcp_mon_status_t dhcp_device_check_negative_health(uint64_t v4counters[] * considered unhealthy. * * @param check_type type of health check - * @param v4counters current/snapshot counters - * @param v6counters current/snapshot counters - * @param type DHCP type + * @param counters current/snapshot counter * * @return DHCP_MON_STATUS_HEALTHY, DHCP_MON_STATUS_UNHEALTHY, or DHCP_MON_STATUS_INDETERMINATE */ static dhcp_mon_status_t dhcp_device_check_health(dhcp_mon_check_t check_type, - uint64_t v4counters[][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT], - uint64_t v6counters[][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT], - dhcp_type_t type) + uint64_t counters[][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]) { dhcp_mon_status_t rv = DHCP_MON_STATUS_HEALTHY; - if (dhcp_device_is_dhcp_inactive(v4counters, v6counters, type)) { + if (dhcp_device_is_dhcp_inactive(aggregate_dev.counters)) { rv = DHCP_MON_STATUS_INDETERMINATE; } else if (check_type == DHCP_MON_CHECK_POSITIVE) { - rv = dhcp_device_check_positive_health(v4counters, v6counters, type); + rv = dhcp_device_check_positive_health(counters); } else if (check_type == DHCP_MON_CHECK_NEGATIVE) { - rv = dhcp_device_check_negative_health(v4counters, v6counters, type); + rv = dhcp_device_check_negative_health(counters); } return rv; } /** - * @code dhcp_print_counters(vlan_intf, type, v4counters, v6counters); + * @code dhcp_print_counters(vlan_intf, type, counters); * * @brief prints DHCP counters to sylsog. * - * @param vlan_intf vlan interface name - * @param type counter type - * @param v4counters interface counter - * @param v6counters interface counter + * @param vlan_intf vlan interface name + * @param type counter type + * @param counters interface counter * * @return none */ static void dhcp_print_counters(const char *vlan_intf, dhcp_counters_type_t type, - uint64_t v4counters[][DHCPv4_MESSAGE_TYPE_COUNT], - uint64_t v6counters[][DHCPv6_MESSAGE_TYPE_COUNT]) + uint64_t counters[][DHCP_MESSAGE_TYPE_COUNT]) { - static const char *v4_counter_desc[DHCP_COUNTERS_COUNT] = { - [DHCP_COUNTERS_CURRENT] = " Current", - [DHCP_COUNTERS_SNAPSHOT] = "Snapshot" - }; - static const char *v6_counter_desc[DHCP_COUNTERS_COUNT] = { + static const char *counter_desc[DHCP_COUNTERS_COUNT] = { [DHCP_COUNTERS_CURRENT] = " Current", [DHCP_COUNTERS_SNAPSHOT] = "Snapshot" }; syslog( LOG_NOTICE, - "DHCPv4 [%*s-%*s rx/tx] Discover: %*lu/%*lu, Offer: %*lu/%*lu, Request: %*lu/%*lu, ACK: %*lu/%*lu\n\ - DHCPv6 [%*s-%*s rx/tx] Solicit: %*lu/%*lu, Advertise: %*lu/%*lu, Request: %*lu/%*lu, Reply: %*lu/%*lu\n", + "[%*s-%*s rx/tx] Discover: %*lu/%*lu, Offer: %*lu/%*lu, Request: %*lu/%*lu, ACK: %*lu/%*lu\n", IF_NAMESIZE, vlan_intf, - (int) strlen(v4_counter_desc[type]), v4_counter_desc[type], - DHCP_COUNTER_WIDTH, v4counters[DHCP_RX][DHCPv4_MESSAGE_TYPE_DISCOVER], - DHCP_COUNTER_WIDTH, v4counters[DHCP_TX][DHCPv4_MESSAGE_TYPE_DISCOVER], - DHCP_COUNTER_WIDTH, v4counters[DHCP_RX][DHCPv4_MESSAGE_TYPE_OFFER], - DHCP_COUNTER_WIDTH, v4counters[DHCP_TX][DHCPv4_MESSAGE_TYPE_OFFER], - DHCP_COUNTER_WIDTH, v4counters[DHCP_RX][DHCPv4_MESSAGE_TYPE_REQUEST], - DHCP_COUNTER_WIDTH, v4counters[DHCP_TX][DHCPv4_MESSAGE_TYPE_REQUEST], - DHCP_COUNTER_WIDTH, v4counters[DHCP_RX][DHCPv4_MESSAGE_TYPE_ACK], - DHCP_COUNTER_WIDTH, v4counters[DHCP_TX][DHCPv4_MESSAGE_TYPE_ACK], - IF_NAMESIZE, vlan_intf, - (int) strlen(v6_counter_desc[type]), v6_counter_desc[type], - DHCP_COUNTER_WIDTH, v6counters[DHCP_RX][DHCPv6_MESSAGE_TYPE_SOLICIT], - DHCP_COUNTER_WIDTH, v6counters[DHCP_TX][DHCPv6_MESSAGE_TYPE_SOLICIT], - DHCP_COUNTER_WIDTH, v6counters[DHCP_RX][DHCPv6_MESSAGE_TYPE_ADVERTISE], - DHCP_COUNTER_WIDTH, v6counters[DHCP_TX][DHCPv6_MESSAGE_TYPE_ADVERTISE], - DHCP_COUNTER_WIDTH, v6counters[DHCP_RX][DHCPv6_MESSAGE_TYPE_REQUEST], - DHCP_COUNTER_WIDTH, v6counters[DHCP_TX][DHCPv6_MESSAGE_TYPE_REQUEST], - DHCP_COUNTER_WIDTH, v6counters[DHCP_RX][DHCPv6_MESSAGE_TYPE_REPLY], - DHCP_COUNTER_WIDTH, v6counters[DHCP_TX][DHCPv6_MESSAGE_TYPE_REPLY] + (int) strlen(counter_desc[type]), counter_desc[type], + DHCP_COUNTER_WIDTH, counters[DHCP_RX][DHCP_MESSAGE_TYPE_DISCOVER], + DHCP_COUNTER_WIDTH, counters[DHCP_TX][DHCP_MESSAGE_TYPE_DISCOVER], + DHCP_COUNTER_WIDTH, counters[DHCP_RX][DHCP_MESSAGE_TYPE_OFFER], + DHCP_COUNTER_WIDTH, counters[DHCP_TX][DHCP_MESSAGE_TYPE_OFFER], + DHCP_COUNTER_WIDTH, counters[DHCP_RX][DHCP_MESSAGE_TYPE_REQUEST], + DHCP_COUNTER_WIDTH, counters[DHCP_TX][DHCP_MESSAGE_TYPE_REQUEST], + DHCP_COUNTER_WIDTH, counters[DHCP_RX][DHCP_MESSAGE_TYPE_ACK], + DHCP_COUNTER_WIDTH, counters[DHCP_TX][DHCP_MESSAGE_TYPE_ACK] ); } @@ -703,12 +454,12 @@ int initialize_intf_mac_and_ip_addr(dhcp_device_context_t *context) strncpy(ifr.ifr_name, context->intf, sizeof(ifr.ifr_name) - 1); ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; - // Get v4 network address + // Get network address if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) { syslog(LOG_ALERT, "ioctl: %s", explain_ioctl(fd, SIOCGIFADDR, &ifr)); break; } - context->ipv4 = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr; + context->ip = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr; // Get mac address if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) { @@ -719,30 +470,6 @@ int initialize_intf_mac_and_ip_addr(dhcp_device_context_t *context) close(fd); - // Get v6 network address - memset(&context->ipv6, 0, sizeof(context->ipv6)); - struct ifaddrs *ifa, *ifa_tmp; - - if (getifaddrs(&ifa) == -1) { - syslog(LOG_ALERT, "getifaddrs failed"); - break; - } - - ifa_tmp = ifa; - while (ifa_tmp) { - // Check if current interface has a valid IPv6 address (not link local address) - if ((strncmp(ifa_tmp->ifa_name, context->intf, sizeof(context->intf)) == 0) && - (ifa_tmp->ifa_addr) && - (ifa_tmp->ifa_addr->sa_family == AF_INET6) && - (((struct sockaddr_in6*)(ifa_tmp->ifa_addr))->sin6_addr.__in6_u.__u6_addr16[0] != IPV6_LINK_LOCAL_PREFIX)) { - - struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; - memcpy(&context->ipv6, &in6->sin6_addr, sizeof(context->ipv6)); - } - ifa_tmp = ifa_tmp->ifa_next; - } - freeifaddrs(ifa); - rv = 0; } while (0); @@ -750,41 +477,20 @@ int initialize_intf_mac_and_ip_addr(dhcp_device_context_t *context) } /** - * @code dhcp_device_get_ipv4(context); + * @code dhcp_device_get_ip(context); * * @brief Accessor method * * @param context pointer to device (interface) context * - * @return interface IPv4 + * @return interface IP */ -int dhcp_device_get_ipv4(dhcp_device_context_t *context, in_addr_t *ip) +int dhcp_device_get_ip(dhcp_device_context_t *context, in_addr_t *ip) { int rv = -1; if (context != NULL && ip != NULL) { - *ip = context->ipv4; - rv = 0; - } - - return rv; -} - -/** - * @code dhcp_device_get_ipv6(context); - * - * @brief Accessor method - * - * @param context pointer to device (interface) context - * - * @return interface IPv6 - */ -int dhcp_device_get_ipv6(dhcp_device_context_t *context, struct in6_addr *ip) -{ - int rv = -1; - - if (context != NULL && ip != NULL) { - *ip = context->ipv6; + *ip = context->ip; rv = 0; } @@ -822,8 +528,7 @@ int dhcp_device_init(dhcp_device_context_t **context, const char *intf, uint8_t dev_context->is_uplink = is_uplink; - memset(dev_context->counters.v4counters, 0, sizeof(dev_context->counters.v4counters)); - memset(dev_context->counters.v6counters, 0, sizeof(dev_context->counters.v6counters)); + memset(dev_context->counters, 0, sizeof(dev_context->counters)); *context = dev_context; rv = 0; @@ -838,15 +543,14 @@ int dhcp_device_init(dhcp_device_context_t **context, const char *intf, uint8_t } /** - * @code dhcp_device_start_capture(context, snaplen, base, giaddr_ip, v6_vlan_ip); + * @code dhcp_device_start_capture(context, snaplen, base, giaddr_ip); * * @brief starts packet capture on this interface */ int dhcp_device_start_capture(dhcp_device_context_t *context, size_t snaplen, struct event_base *base, - in_addr_t giaddr_ip, - struct in6_addr v6_vlan_ip) + in_addr_t giaddr_ip) { int rv = -1; @@ -856,20 +560,12 @@ int dhcp_device_start_capture(dhcp_device_context_t *context, break; } - // snaplen check for DHCPv4 size - if (dhcpv4_enabled && snaplen < UDPv4_START_OFFSET + sizeof(struct udphdr) + DHCPv4_OPTIONS_HEADER_SIZE) { - syslog(LOG_ALERT, "dhcp_device_start_capture(%s): snap length is too low to capture DHCPv4 options", context->intf); - break; - } - - // snaplen check for DHCPv6 size - DHCPv6 message type is the first byte of the udp payload - if (dhcpv6_enabled && snaplen < DHCPv6_START_OFFSET + 1) { - syslog(LOG_ALERT, "dhcp_device_start_capture(%s): snap length is too low to capture DHCPv6 option", context->intf); + if (snaplen < UDP_START_OFFSET + sizeof(struct udphdr) + DHCP_OPTIONS_HEADER_SIZE) { + syslog(LOG_ALERT, "dhcp_device_start_capture(%s): snap length is too low to capture DHCP options", context->intf); break; } context->giaddr_ip = giaddr_ip; - context->v6_vlan_ip = v6_vlan_ip; context->buffer = (uint8_t *) malloc(snaplen); if (context->buffer == NULL) { @@ -907,17 +603,17 @@ void dhcp_device_shutdown(dhcp_device_context_t *context) } /** - * @code dhcp_device_get_status(check_type, context, type); + * @code dhcp_device_get_status(check_type, context); * * @brief collects DHCP relay status info for a given interface. If context is null, it will report aggregate * status */ -dhcp_mon_status_t dhcp_device_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context, dhcp_type_t type) +dhcp_mon_status_t dhcp_device_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context) { dhcp_mon_status_t rv = DHCP_MON_STATUS_HEALTHY; if (context != NULL) { - rv = dhcp_device_check_health(check_type, context->counters.v4counters, context->counters.v6counters, type); + rv = dhcp_device_check_health(check_type, context->counters); } return rv; @@ -931,17 +627,9 @@ dhcp_mon_status_t dhcp_device_get_status(dhcp_mon_check_t check_type, dhcp_devic void dhcp_device_update_snapshot(dhcp_device_context_t *context) { if (context != NULL) { - if (dhcpv4_enabled) { - memcpy(context->counters.v4counters[DHCP_COUNTERS_SNAPSHOT], - context->counters.v4counters[DHCP_COUNTERS_CURRENT], - sizeof(context->counters.v4counters[DHCP_COUNTERS_SNAPSHOT])); - } - - if (dhcpv6_enabled) { - memcpy(context->counters.v6counters[DHCP_COUNTERS_SNAPSHOT], - context->counters.v6counters[DHCP_COUNTERS_CURRENT], - sizeof(context->counters.v6counters[DHCP_COUNTERS_SNAPSHOT])); - } + memcpy(context->counters[DHCP_COUNTERS_SNAPSHOT], + context->counters[DHCP_COUNTERS_CURRENT], + sizeof(context->counters[DHCP_COUNTERS_SNAPSHOT])); } } @@ -953,27 +641,6 @@ void dhcp_device_update_snapshot(dhcp_device_context_t *context) void dhcp_device_print_status(dhcp_device_context_t *context, dhcp_counters_type_t type) { if (context != NULL) { - dhcp_print_counters(context->intf, type, context->counters.v4counters[type], context->counters.v6counters[type]); + dhcp_print_counters(context->intf, type, context->counters[type]); } } - -/** - * @code dhcp_device_active_types(dhcpv4, dhcpv6); - * - * @brief update local variables with active protocols - */ -void dhcp_device_active_types(bool dhcpv4, bool dhcpv6) -{ - dhcpv4_enabled = dhcpv4; - dhcpv6_enabled = dhcpv6; -} - -/** - * @code dhcp_device_init_mgmt_intf(mgmt_intf_context); - * - * @brief assign context address of mgmt interface - */ -void dhcp_device_init_mgmt_intf(dhcp_device_context_t *mgmt_intf_context) -{ - mgmt_intf = mgmt_intf_context; -} diff --git a/src/dhcpmon/src/dhcp_device.h b/src/dhcpmon/src/dhcp_device.h index 433eb0907626..aa686f4e2718 100644 --- a/src/dhcpmon/src/dhcp_device.h +++ b/src/dhcpmon/src/dhcp_device.h @@ -18,43 +18,21 @@ /** - * DHCPv4 message types + * DHCP message types **/ typedef enum { - DHCPv4_MESSAGE_TYPE_DISCOVER = 1, - DHCPv4_MESSAGE_TYPE_OFFER = 2, - DHCPv4_MESSAGE_TYPE_REQUEST = 3, - DHCPv4_MESSAGE_TYPE_DECLINE = 4, - DHCPv4_MESSAGE_TYPE_ACK = 5, - DHCPv4_MESSAGE_TYPE_NAK = 6, - DHCPv4_MESSAGE_TYPE_RELEASE = 7, - DHCPv4_MESSAGE_TYPE_INFORM = 8, - - DHCPv4_MESSAGE_TYPE_COUNT -} dhcpv4_message_type_t; - -/** - * DHCPv6 message types - **/ -typedef enum -{ - DHCPv6_MESSAGE_TYPE_SOLICIT = 1, - DHCPv6_MESSAGE_TYPE_ADVERTISE = 2, - DHCPv6_MESSAGE_TYPE_REQUEST = 3, - DHCPv6_MESSAGE_TYPE_CONFIRM = 4, - DHCPv6_MESSAGE_TYPE_RENEW = 5, - DHCPv6_MESSAGE_TYPE_REBIND = 6, - DHCPv6_MESSAGE_TYPE_REPLY = 7, - DHCPv6_MESSAGE_TYPE_RELEASE = 8, - DHCPv6_MESSAGE_TYPE_DECLINE = 9, - DHCPv6_MESSAGE_TYPE_RECONFIGURE = 10, - DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST = 11, - DHCPv6_MESSAGE_TYPE_RELAY_FORWARD = 12, - DHCPv6_MESSAGE_TYPE_RELAY_REPLY = 13, - - DHCPv6_MESSAGE_TYPE_COUNT -} dhcpv6_message_type_t; + DHCP_MESSAGE_TYPE_DISCOVER = 1, + DHCP_MESSAGE_TYPE_OFFER = 2, + DHCP_MESSAGE_TYPE_REQUEST = 3, + DHCP_MESSAGE_TYPE_DECLINE = 4, + DHCP_MESSAGE_TYPE_ACK = 5, + DHCP_MESSAGE_TYPE_NAK = 6, + DHCP_MESSAGE_TYPE_RELEASE = 7, + DHCP_MESSAGE_TYPE_INFORM = 8, + + DHCP_MESSAGE_TYPE_COUNT +} dhcp_message_type_t; /** packet direction */ typedef enum @@ -82,13 +60,6 @@ typedef enum DHCP_MON_STATUS_INDETERMINATE, /** DHCP relay health could not be determined */ } dhcp_mon_status_t; -/** dhcp type */ -typedef enum -{ - DHCPv4_TYPE, - DHCPv6_TYPE, -} dhcp_type_t; - /** dhcp check type */ typedef enum { @@ -96,28 +67,19 @@ typedef enum DHCP_MON_CHECK_POSITIVE, /** Validate that received DORA packets are relayed */ } dhcp_mon_check_t; -typedef struct -{ - uint64_t v4counters[DHCP_COUNTERS_COUNT][DHCP_DIR_COUNT][DHCPv4_MESSAGE_TYPE_COUNT]; - /** current/snapshot counters of DHCPv4 packets */ - uint64_t v6counters[DHCP_COUNTERS_COUNT][DHCP_DIR_COUNT][DHCPv6_MESSAGE_TYPE_COUNT]; - /** current/snapshot counters of DHCPv6 packets */ -} counters_t; - /** DHCP device (interface) context */ typedef struct { int sock; /** Raw socket associated with this device/interface */ - in_addr_t ipv4; /** ipv4 network address of this device (interface) */ - struct in6_addr ipv6; /** ipv6 network address of this device (interface) */ + in_addr_t ip; /** network address of this device (interface) */ uint8_t mac[ETHER_ADDR_LEN]; /** hardware address of this device (interface) */ - in_addr_t giaddr_ip; /** Gateway IPv4 address */ - struct in6_addr v6_vlan_ip; /** Vlan IPv6 address */ + in_addr_t giaddr_ip; /** Gateway IP address */ uint8_t is_uplink; /** north interface? */ char intf[IF_NAMESIZE]; /** device (interface) name */ uint8_t *buffer; /** buffer used to read socket data */ size_t snaplen; /** snap length or buffer size */ - counters_t counters; /** counters for DHCPv4/6 packets */ + uint64_t counters[DHCP_COUNTERS_COUNT][DHCP_DIR_COUNT][DHCP_MESSAGE_TYPE_COUNT]; + /** current/snapshot counters of DHCP packets */ } dhcp_device_context_t; /** @@ -132,28 +94,16 @@ typedef struct int initialize_intf_mac_and_ip_addr(dhcp_device_context_t *context); /** - * @code dhcp_device_get_ipv4(context, ip); + * @code dhcp_device_get_ip(context, ip); * * @brief Accessor method * * @param context pointer to device (interface) context - * @param ip(out) pointer to device IPv4 + * @param ip(out) pointer to device IP * * @return 0 on success, otherwise for failure */ -int dhcp_device_get_ipv4(dhcp_device_context_t *context, in_addr_t *ip); - -/** - * @code dhcp_device_get_ipv6(context, ip); - * - * @brief Accessor method - * - * @param context pointer to device (interface) context - * @param ip(out) pointer to device IPv6 - * - * @return 0 on success, otherwise for failure - */ -int dhcp_device_get_ipv6(dhcp_device_context_t *context, struct in6_addr *ip); +int dhcp_device_get_ip(dhcp_device_context_t *context, in_addr_t *ip); /** * @code dhcp_device_get_aggregate_context(); @@ -180,7 +130,7 @@ int dhcp_device_init(dhcp_device_context_t **context, uint8_t is_uplink); /** - * @code dhcp_device_start_capture(context, snaplen, base, giaddr_ip, v6_vlan_ip); + * @code dhcp_device_start_capture(context, snaplen, base, giaddr_ip); * * @brief starts packet capture on this interface * @@ -188,15 +138,13 @@ int dhcp_device_init(dhcp_device_context_t **context, * @param snaplen length of packet capture * @param base pointer to libevent base * @param giaddr_ip gateway IP address - * @param v6_vlan_ip vlan IPv6 address * * @return 0 on success, otherwise for failure */ int dhcp_device_start_capture(dhcp_device_context_t *context, size_t snaplen, struct event_base *base, - in_addr_t giaddr_ip, - struct in6_addr v6_vlan_ip); + in_addr_t giaddr_ip); /** * @code dhcp_device_shutdown(context); @@ -210,18 +158,17 @@ int dhcp_device_start_capture(dhcp_device_context_t *context, void dhcp_device_shutdown(dhcp_device_context_t *context); /** - * @code dhcp_device_get_status(check_type, context, type); + * @code dhcp_device_get_status(check_type, context); * * @brief collects DHCP relay status info for a given interface. If context is null, it will report aggregate * status * * @param check_type Type of validation * @param context Device (interface) context - * @param type DHCP type * * @return DHCP_MON_STATUS_HEALTHY, DHCP_MON_STATUS_UNHEALTHY, or DHCP_MON_STATUS_INDETERMINATE */ -dhcp_mon_status_t dhcp_device_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context, dhcp_type_t type); +dhcp_mon_status_t dhcp_device_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context); /** * @code dhcp_device_update_snapshot(context); @@ -238,32 +185,10 @@ void dhcp_device_update_snapshot(dhcp_device_context_t *context); * @brief prints status counters to syslog. If context is null, it will print aggregate status * * @param context Device (interface) context - * @param type Counter type to be printed + * @param counters_type Counter type to be printed * * @return none */ void dhcp_device_print_status(dhcp_device_context_t *context, dhcp_counters_type_t type); -/** - * @code dhcp_device_active_types(dhcpv4, dhcpv6); - * - * @brief update local variables with active protocols - * - * @param dhcpv4 DHCPv4 enable flag - * @param dhcpv6 DHCPv6 enable flag - * - * @return none - */ -void dhcp_device_active_types(bool dhcpv4, bool dhcpv6); - -/** - * @code dhcp_device_init_mgmt_intf(mgmt_intf_context); - * - * @brief assign context address of mgmt interface - * - * @param mgmt_intf_context MGMT interface context struct address - * - * @return none - */ -void dhcp_device_init_mgmt_intf(dhcp_device_context_t *mgmt_intf_context); #endif /* DHCP_DEVICE_H_ */ diff --git a/src/dhcpmon/src/dhcp_devman.c b/src/dhcpmon/src/dhcp_devman.c index b36d926c1d5b..65484798dbd6 100644 --- a/src/dhcpmon/src/dhcp_devman.c +++ b/src/dhcpmon/src/dhcp_devman.c @@ -9,8 +9,6 @@ #include #include #include -#include -#include #include "dhcp_devman.h" @@ -37,8 +35,7 @@ static uint32_t dhcp_num_mgmt_intf = 0; /** On Device vlan interface IP address corresponding vlan downlink IP * This IP is used to filter Offer/Ack packet coming from DHCP server */ -static in_addr_t v4_vlan_ip = 0; -static struct in6_addr v6_vlan_ip = {0}; +static in_addr_t vlan_ip = 0; /* Device loopback interface ip, which will be used as the giaddr in dual tor setup. */ static in_addr_t loopback_ip = 0; @@ -139,8 +136,7 @@ int dhcp_devman_add_intf(const char *name, char intf_type) rv = dhcp_device_init(&dev->dev_context, dev->name, dev->is_uplink); if (rv == 0 && intf_type == 'd') { - rv = dhcp_device_get_ipv4(dev->dev_context, &v4_vlan_ip); - rv = dhcp_device_get_ipv6(dev->dev_context, &v6_vlan_ip); + rv = dhcp_device_get_ip(dev->dev_context, &vlan_ip); dhcp_device_context_t *agg_dev = dhcp_device_get_aggregate_context(); @@ -148,9 +144,6 @@ int dhcp_devman_add_intf(const char *name, char intf_type) strncpy(agg_dev->intf + sizeof(AGG_DEV_PREFIX) - 1, name, sizeof(agg_dev->intf) - sizeof(AGG_DEV_PREFIX)); agg_dev->intf[sizeof(agg_dev->intf) - 1] = '\0'; } - else if (rv == 0 && intf_type == 'm') { - dhcp_device_init_mgmt_intf(dev->dev_context); - } LIST_INSERT_HEAD(&intfs, dev, entry); } @@ -181,7 +174,7 @@ int dhcp_devman_setup_dual_tor_mode(const char *name) } if (initialize_intf_mac_and_ip_addr(&loopback_intf_context) == 0 && - dhcp_device_get_ipv4(&loopback_intf_context, &loopback_ip) == 0) { + dhcp_device_get_ip(&loopback_intf_context, &loopback_ip) == 0) { dual_tor_mode = 1; } else { syslog(LOG_ALERT, "failed to retrieve ip addr for loopback interface (%s)", name); @@ -204,13 +197,11 @@ int dhcp_devman_start_capture(size_t snaplen, struct event_base *base) if ((dhcp_num_south_intf == 1) && (dhcp_num_north_intf >= 1)) { LIST_FOREACH(int_ptr, &intfs, entry) { - rv = dhcp_device_start_capture(int_ptr->dev_context, snaplen, base, dual_tor_mode ? loopback_ip : v4_vlan_ip, v6_vlan_ip); + rv = dhcp_device_start_capture(int_ptr->dev_context, snaplen, base, dual_tor_mode ? loopback_ip : vlan_ip); if (rv == 0) { - char ipv6_addr[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &int_ptr->dev_context->ipv6, ipv6_addr, sizeof(ipv6_addr)); syslog(LOG_INFO, - "Capturing DHCP packets on interface %s, ipv4: 0x%08x, ipv6: %s, mac [%02x:%02x:%02x:%02x:%02x:%02x] \n", - int_ptr->name, int_ptr->dev_context->ipv4, ipv6_addr, int_ptr->dev_context->mac[0], + "Capturing DHCP packets on interface %s, ip: 0x%08x, mac [%02x:%02x:%02x:%02x:%02x:%02x] \n", + int_ptr->name, int_ptr->dev_context->ip, int_ptr->dev_context->mac[0], int_ptr->dev_context->mac[1], int_ptr->dev_context->mac[2], int_ptr->dev_context->mac[3], int_ptr->dev_context->mac[4], int_ptr->dev_context->mac[5]); } @@ -228,13 +219,13 @@ int dhcp_devman_start_capture(size_t snaplen, struct event_base *base) } /** - * @code dhcp_devman_get_status(check_type, context, type); + * @code dhcp_devman_get_status(check_type, context); * * @brief collects DHCP relay status info. */ -dhcp_mon_status_t dhcp_devman_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context, dhcp_type_t type) +dhcp_mon_status_t dhcp_devman_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context) { - return dhcp_device_get_status(check_type, context, type); + return dhcp_device_get_status(check_type, context); } /** @@ -276,13 +267,3 @@ void dhcp_devman_print_status(dhcp_device_context_t *context, dhcp_counters_type dhcp_device_print_status(context, type); } } - -/** - * @code dhcp_devman_active_types(dhcpv4, dhcpv6); - * - * @brief update local variables with active protocols - */ -void dhcp_devman_active_types(bool dhcpv4, bool dhcpv6) -{ - dhcp_device_active_types(dhcpv4, dhcpv6); -} diff --git a/src/dhcpmon/src/dhcp_devman.h b/src/dhcpmon/src/dhcp_devman.h index 6e30c654f69e..948e79cde4f4 100644 --- a/src/dhcpmon/src/dhcp_devman.h +++ b/src/dhcpmon/src/dhcp_devman.h @@ -87,17 +87,16 @@ int dhcp_devman_setup_dual_tor_mode(const char *name); int dhcp_devman_start_capture(size_t snaplen, struct event_base *base); /** - * @code dhcp_devman_get_status(check_type, context, type); + * @code dhcp_devman_get_status(check_type, context); * * @brief collects DHCP relay status info. * * @param check_type Type of validation * @param context pointer to device (interface) context - * @param type DHCP type * * @return DHCP_MON_STATUS_HEALTHY, DHCP_MON_STATUS_UNHEALTHY, or DHCP_MON_STATUS_INDETERMINATE */ -dhcp_mon_status_t dhcp_devman_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context, dhcp_type_t type); +dhcp_mon_status_t dhcp_devman_get_status(dhcp_mon_check_t check_type, dhcp_device_context_t *context); /** * @code dhcp_devman_update_snapshot(context); @@ -120,16 +119,4 @@ void dhcp_devman_update_snapshot(dhcp_device_context_t *context); */ void dhcp_devman_print_status(dhcp_device_context_t *context, dhcp_counters_type_t type); -/** - * @code dhcp_devman_active_types(dhcpv4, dhcpv6); - * - * @brief update local variables with active protocols - * - * @param dhcpv4 flag indicating dhcpv4 is enabled - * @param dhcpv6 flag indicating dhcpv6 is enabled - * - * @return none - */ -void dhcp_devman_active_types(bool dhcpv4, bool dhcpv6); - #endif /* DHCP_DEVMAN_H_ */ diff --git a/src/dhcpmon/src/dhcp_mon.c b/src/dhcpmon/src/dhcp_mon.c index 2777b6484082..74d9869741d1 100644 --- a/src/dhcpmon/src/dhcp_mon.c +++ b/src/dhcpmon/src/dhcp_mon.c @@ -12,24 +12,16 @@ #include #include #include -#include #include "dhcp_mon.h" #include "dhcp_devman.h" -/** DHCP device/interface state counters */ -typedef struct -{ - int v4_count; /** count in the number of DHCPv4 unhealthy checks */ - int v6_count; /** count in the number of DHCPv6 unhealthy checks */ -} dhcp_mon_count_t; - /** DHCP device/interface state */ typedef struct { dhcp_mon_check_t check_type; /** check type */ dhcp_device_context_t* (*get_context)(); /** functor to a device context accessor function */ - dhcp_mon_count_t counters; /** count in the number of unhealthy checks */ + int count; /** count in the number of unhealthy checks */ const char *msg; /** message to be printed if unhealthy state is determined */ } dhcp_mon_state_t; @@ -37,10 +29,6 @@ typedef struct static int window_interval_sec = 18; /** dhcp_unhealthy_max_count max count of consecutive unhealthy statuses before reporting to syslog */ static int dhcp_unhealthy_max_count = 10; -/** DHCP versions flags */ -static bool dhcpv4_enabled; -static bool dhcpv6_enabled; - /** libevent base struct */ static struct event_base *base; /** libevent timeout event struct */ @@ -57,15 +45,13 @@ static dhcp_mon_state_t state_data[] = { [0] = { .check_type = DHCP_MON_CHECK_POSITIVE, .get_context = dhcp_devman_get_agg_dev, - .counters.v4_count = 0, - .counters.v6_count = 0, + .count = 0, .msg = "dhcpmon detected disparity in DHCP Relay behavior. Duration: %d (sec) for vlan: '%s'\n" }, [1] = { .check_type = DHCP_MON_CHECK_NEGATIVE, .get_context = dhcp_devman_get_mgmt_dev, - .counters.v4_count = 0, - .counters.v6_count = 0, + .count = 0, .msg = "dhcpmon detected DHCP packets traveling through mgmt interface (please check BGP routes.)" " Duration: %d (sec) for intf: '%s'\n" } @@ -92,89 +78,36 @@ static void signal_callback(evutil_socket_t fd, short event, void *arg) } /** - * @code check_dhcp_relay_health(state_data, dhcp_type); + * @code check_dhcp_relay_health(state_data); * * @brief check DHCP relay overall health * * @param state_data pointer to dhcpmon state data * - * @param type DHCP type - * * @return none */ -static void check_dhcp_relay_health(dhcp_mon_state_t *state_data, dhcp_type_t type) +static void check_dhcp_relay_health(dhcp_mon_state_t *state_data) { dhcp_device_context_t *context = state_data->get_context(); - dhcp_mon_status_t dhcp_mon_status = dhcp_devman_get_status(state_data->check_type, context, type); + dhcp_mon_status_t dhcp_mon_status = dhcp_devman_get_status(state_data->check_type, context); switch (dhcp_mon_status) { case DHCP_MON_STATUS_UNHEALTHY: - switch (type) - { - case DHCPv4_TYPE: - if (++state_data->counters.v4_count > dhcp_unhealthy_max_count) { - syslog(LOG_ALERT, state_data->msg, state_data->counters.v4_count * window_interval_sec, context->intf); - dhcp_devman_print_status(context, DHCP_COUNTERS_SNAPSHOT); - dhcp_devman_print_status(context, DHCP_COUNTERS_CURRENT); - } - break; - case DHCPv6_TYPE: - if (++state_data->counters.v6_count > dhcp_unhealthy_max_count) { - syslog(LOG_ALERT, state_data->msg, state_data->counters.v6_count * window_interval_sec, context->intf); - dhcp_devman_print_status(context, DHCP_COUNTERS_SNAPSHOT); - dhcp_devman_print_status(context, DHCP_COUNTERS_CURRENT); - } - break; - - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; + if (++state_data->count > dhcp_unhealthy_max_count) { + syslog(LOG_ALERT, state_data->msg, state_data->count * window_interval_sec, context->intf); + dhcp_devman_print_status(context, DHCP_COUNTERS_SNAPSHOT); + dhcp_devman_print_status(context, DHCP_COUNTERS_CURRENT); } break; - case DHCP_MON_STATUS_HEALTHY: - switch (type) - { - case DHCPv4_TYPE: - state_data->counters.v4_count = 0; - break; - case DHCPv6_TYPE: - state_data->counters.v6_count = 0; - break; - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; - } + state_data->count = 0; break; - case DHCP_MON_STATUS_INDETERMINATE: - switch (type) - { - case DHCPv4_TYPE: - if (state_data->counters.v4_count) { - if (++state_data->counters.v4_count > dhcp_unhealthy_max_count) { - syslog(LOG_ALERT, state_data->msg, state_data->counters.v4_count * window_interval_sec, context->intf); - dhcp_devman_print_status(context, DHCP_COUNTERS_SNAPSHOT); - dhcp_devman_print_status(context, DHCP_COUNTERS_CURRENT); - } - } - break; - case DHCPv6_TYPE: - if (state_data->counters.v6_count) { - if (++state_data->counters.v6_count > dhcp_unhealthy_max_count) { - syslog(LOG_ALERT, state_data->msg, state_data->counters.v6_count * window_interval_sec, context->intf); - dhcp_devman_print_status(context, DHCP_COUNTERS_SNAPSHOT); - dhcp_devman_print_status(context, DHCP_COUNTERS_CURRENT); - } - } - break; - default: - syslog(LOG_ERR, "Unknown DHCP type %d\n", type); - break; + if (state_data->count) { + state_data->count++; } break; - default: syslog(LOG_ERR, "DHCP Relay returned unknown status %d\n", dhcp_mon_status); break; @@ -195,12 +128,7 @@ static void check_dhcp_relay_health(dhcp_mon_state_t *state_data, dhcp_type_t ty static void timeout_callback(evutil_socket_t fd, short event, void *arg) { for (uint8_t i = 0; i < sizeof(state_data) / sizeof(*state_data); i++) { - if (dhcpv4_enabled) { - check_dhcp_relay_health(&state_data[i], DHCPv4_TYPE); - } - if (dhcpv6_enabled) { - check_dhcp_relay_health(&state_data[i], DHCPv6_TYPE); - } + check_dhcp_relay_health(&state_data[i]); } dhcp_devman_update_snapshot(NULL); @@ -213,17 +141,13 @@ static void timeout_callback(evutil_socket_t fd, short event, void *arg) * seconds. It also writes to syslog when dhcp relay has been unhealthy for consecutive max_count checks. * */ -int dhcp_mon_init(int window_sec, int max_count, bool dhcpv4, bool dhcpv6) +int dhcp_mon_init(int window_sec, int max_count) { int rv = -1; do { window_interval_sec = window_sec; dhcp_unhealthy_max_count = max_count; - dhcpv4_enabled = dhcpv4; - dhcpv6_enabled = dhcpv6; - - dhcp_devman_active_types(dhcpv4, dhcpv6); base = event_base_new(); if (base == NULL) { diff --git a/src/dhcpmon/src/dhcp_mon.h b/src/dhcpmon/src/dhcp_mon.h index facd46da6860..ae8911ab51fc 100644 --- a/src/dhcpmon/src/dhcp_mon.h +++ b/src/dhcpmon/src/dhcp_mon.h @@ -17,12 +17,10 @@ * * @param window_sec time interval between health checks * @param max_count max count of consecutive unhealthy statuses before reporting to syslog - * @param dhcpv4 flag indicating dhcpv4 is enabled - * @param dhcpv6 flag indicating dhcpv6 is enabled * * @return 0 upon success, otherwise upon failure */ -int dhcp_mon_init(int window_sec, int max_count, bool dhcpv4, bool dhcpv6); +int dhcp_mon_init(int window_sec, int max_count); /** * @code dhcp_mon_shutdown(); diff --git a/src/dhcpmon/src/main.c b/src/dhcpmon/src/main.c index 1cf931821495..29bc534accf0 100644 --- a/src/dhcpmon/src/main.c +++ b/src/dhcpmon/src/main.c @@ -16,7 +16,6 @@ #include #include #include -#include #include "dhcp_mon.h" #include "dhcp_devman.h" @@ -42,8 +41,7 @@ static const uint32_t dhcpmon_default_unhealthy_max_count = 10; static void usage(const char *prog) { printf("Usage: %s -id {-iu }+ -im [-u ]" - "[-w ] [-c ] [-s ]" - "[-4 ] [-6 ] [-d]\n", prog); + "[-w ] [-c ] [-s ] [-d]\n", prog); printf("where\n"); printf("\tsouth interface: is a vlan interface,\n"); printf("\tnorth interface: is a TOR-T1 interface,\n"); @@ -114,8 +112,6 @@ int main(int argc, char **argv) int max_unhealthy_count = dhcpmon_default_unhealthy_max_count; size_t snaplen = dhcpmon_default_snaplen; int make_daemon = 0; - bool dhcpv4_enabled = false; - bool dhcpv6_enabled = false; setlogmask(LOG_UPTO(LOG_INFO)); openlog(basename(argv[0]), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON); @@ -159,14 +155,6 @@ int main(int argc, char **argv) max_unhealthy_count = atoi(argv[i + 1]); i += 2; break; - case '4': - dhcpv4_enabled = true; - i++; - break; - case '6': - dhcpv6_enabled = true; - i++; - break; default: fprintf(stderr, "%s: %c: Unknown option\n", basename(argv[0]), argv[i][1]); usage(basename(argv[0])); @@ -177,11 +165,7 @@ int main(int argc, char **argv) dhcpmon_daemonize(); } - if (!dhcpv4_enabled && !dhcpv6_enabled) { - dhcpv4_enabled = true; - } - - if ((dhcp_mon_init(window_interval, max_unhealthy_count, dhcpv4_enabled, dhcpv6_enabled) == 0) && + if ((dhcp_mon_init(window_interval, max_unhealthy_count) == 0) && (dhcp_mon_start(snaplen) == 0)) { rv = EXIT_SUCCESS; diff --git a/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf index a9004e2b00f5..407ac2c80bc9 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf +++ b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf @@ -68,7 +68,7 @@ dependent_startup_wait_for=start:exited programs=dhcpmon-Vlan1000 [program:dhcpmon-Vlan1000] -command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 -im eth0 -4 -6 +command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 -im eth0 priority=4 autostart=false autorestart=false diff --git a/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf index 521899b939f4..5456409738e6 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf +++ b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf @@ -68,7 +68,7 @@ dependent_startup_wait_for=start:exited programs=dhcpmon-Vlan1000 [program:dhcpmon-Vlan1000] -command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -im eth0 -4 -6 +command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -im eth0 priority=4 autostart=false autorestart=false From f2acf952fba098d7356e70ae16fae3e579e40ba3 Mon Sep 17 00:00:00 2001 From: Nikola Dancejic <26731235+Ndancejic@users.noreply.github.com> Date: Tue, 12 Apr 2022 14:43:03 -0700 Subject: [PATCH 209/817] [device config] Adding configuration for default route fallback (#10465) * [device config] Adding configuration for default route fallback * Set sai_tunnel_underlay_route_mode attribute to fallback to default route if more specific route is unavailable. --- .../Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm | 1 + .../td3-a7050cx3-32s-48x50G+8x100G.config.bcm | 1 + .../x86_64-arista_7050cx3_32s/td3-a7050cx3-32s-flex.config.bcm | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 | 1 + src/sonic-device-data/tests/permitted_list | 1 + 7 files changed, 7 insertions(+) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm index a575049dc06b..22088621cef1 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm @@ -5,6 +5,7 @@ host_as_route_disable=1 use_all_splithorizon_groups=1 riot_enable=1 sai_tunnel_support=1 +sai_tunnel_underlay_route_mode=1 riot_overlay_l3_intf_mem_size=4096 riot_overlay_l3_egress_mem_size=32768 l3_ecmp_levels=2 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm index 68ae982800c8..aaad28895942 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm @@ -5,6 +5,7 @@ host_as_route_disable=1 use_all_splithorizon_groups=1 riot_enable=1 sai_tunnel_support=1 +sai_tunnel_underlay_route_mode=1 riot_overlay_l3_intf_mem_size=4096 riot_overlay_l3_egress_mem_size=32768 l3_ecmp_levels=2 diff --git a/device/arista/x86_64-arista_7050cx3_32s/td3-a7050cx3-32s-flex.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/td3-a7050cx3-32s-flex.config.bcm index fef962c852b7..70a579e01eeb 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/td3-a7050cx3-32s-flex.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/td3-a7050cx3-32s-flex.config.bcm @@ -397,6 +397,7 @@ robust_hash_disable_mpls=1 robust_hash_disable_vlan=1 sai_load_hw_config=/etc/bcm/flex/bcm56870_a0_premium_issu/b870.6.4.1/ sai_tunnel_support=1 +sai_tunnel_underlay_route_mode=1 serdes_core_rx_polarity_flip_physical{1}=0x8 serdes_core_rx_polarity_flip_physical{5}=0x2 serdes_core_rx_polarity_flip_physical{9}=0xc diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 index 9410a83b6716..db5b2562cca2 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 @@ -12,6 +12,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = 'sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 index d9d8347b50ae..70512203f206 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 @@ -4,6 +4,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = 'sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 index de65d73d40a1..ce8efa8572b5 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 @@ -12,6 +12,7 @@ {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = 'sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} {%- endif %} diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index c1f70dc7be65..e1a651569b84 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -2,6 +2,7 @@ sai_trap_group_priority use_all_splithorizon_groups riot_enable sai_tunnel_support +sai_tunnel_underlay_route_mode riot_overlay_l3_intf_mem_size riot_overlay_l3_egress_mem_size l3_ecmp_levels From da43edcf3e50a7177b9610b01b6c65574f7d52a1 Mon Sep 17 00:00:00 2001 From: byu343 Date: Tue, 12 Apr 2022 15:53:35 -0700 Subject: [PATCH 210/817] [arista] Update serdes tuning values for 7800r3_48cqm2 (#9967) This update the serdes tuning values for Arista 7800r3_48cqm2. The values are for the optical transceivers. --- .../jr2-a7280cr3-32d4-40x100G.config.bcm | 49 +++++++++++++++++++ .../gearbox_100G_PAM4.xml | 34 +++++++++++-- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm index 61026aad524e..f6f1774d8ee2 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm @@ -362,6 +362,55 @@ ucode_port_46=CGE2_25:core_1.46 ucode_port_47=CGE2_26:core_1.47 ucode_port_48=CGE2_24:core_1.48 +serdes_tx_taps_1=pam4:-18:86:0:4:0:0 +serdes_tx_taps_2=pam4:-18:86:0:4:0:0 +serdes_tx_taps_3=pam4:-18:86:0:4:0:0 +serdes_tx_taps_4=pam4:-18:86:0:4:0:0 +serdes_tx_taps_5=pam4:-18:86:0:4:0:0 +serdes_tx_taps_6=pam4:-18:86:0:4:0:0 +serdes_tx_taps_7=pam4:-18:86:0:4:0:0 +serdes_tx_taps_8=pam4:-18:86:0:4:0:0 +serdes_tx_taps_9=pam4:-18:86:0:4:0:0 +serdes_tx_taps_10=pam4:-18:86:0:4:0:0 +serdes_tx_taps_11=pam4:-18:86:0:4:0:0 +serdes_tx_taps_12=pam4:-18:86:0:4:0:0 +serdes_tx_taps_13=pam4:-18:86:0:4:0:0 +serdes_tx_taps_14=pam4:-18:86:0:4:0:0 +serdes_tx_taps_15=pam4:-18:86:0:4:0:0 +serdes_tx_taps_16=pam4:-18:86:0:4:0:0 +serdes_tx_taps_17=pam4:-18:86:0:4:0:0 +serdes_tx_taps_18=pam4:-18:86:0:4:0:0 +serdes_tx_taps_19=pam4:-18:86:0:4:0:0 +serdes_tx_taps_20=pam4:-18:86:0:4:0:0 +serdes_tx_taps_21=pam4:-18:86:0:4:0:0 +serdes_tx_taps_22=pam4:-18:86:0:4:0:0 +serdes_tx_taps_23=pam4:-18:86:0:4:0:0 +serdes_tx_taps_24=pam4:-18:86:0:4:0:0 +serdes_tx_taps_25=pam4:-18:86:0:4:0:0 +serdes_tx_taps_26=pam4:-18:86:0:4:0:0 +serdes_tx_taps_27=pam4:-18:86:0:4:0:0 +serdes_tx_taps_28=pam4:-18:86:0:4:0:0 +serdes_tx_taps_29=pam4:-18:86:0:4:0:0 +serdes_tx_taps_30=pam4:-18:86:0:4:0:0 +serdes_tx_taps_31=pam4:-18:86:0:4:0:0 +serdes_tx_taps_32=pam4:-18:86:0:4:0:0 +serdes_tx_taps_33=pam4:-18:86:0:4:0:0 +serdes_tx_taps_34=pam4:-18:86:0:4:0:0 +serdes_tx_taps_35=pam4:-18:86:0:4:0:0 +serdes_tx_taps_36=pam4:-18:86:0:4:0:0 +serdes_tx_taps_37=pam4:-18:86:0:4:0:0 +serdes_tx_taps_38=pam4:-18:86:0:4:0:0 +serdes_tx_taps_39=pam4:-18:86:0:4:0:0 +serdes_tx_taps_40=pam4:-18:86:0:4:0:0 +serdes_tx_taps_41=pam4:-18:86:0:4:0:0 +serdes_tx_taps_42=pam4:-18:86:0:4:0:0 +serdes_tx_taps_43=pam4:-18:86:0:4:0:0 +serdes_tx_taps_44=pam4:-18:86:0:4:0:0 +serdes_tx_taps_45=pam4:-18:86:0:4:0:0 +serdes_tx_taps_46=pam4:-18:86:0:4:0:0 +serdes_tx_taps_47=pam4:-18:86:0:4:0:0 +serdes_tx_taps_48=pam4:-18:86:0:4:0:0 + ucode_port_0.BCM8869X=CPU.0:core_0.0 ucode_port_200.BCM8869X=CPU.8:core_1.200 ucode_port_201.BCM8869X=CPU.16:core_0.201 diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_100G_PAM4.xml b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_100G_PAM4.xml index 95e20b91787e..044ef034a52d 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_100G_PAM4.xml +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_100G_PAM4.xml @@ -4,11 +4,6 @@ 0 gearbox 2 - - 2,-8,17,0,0 - 0,-8,17,0,0 - - 0,0,1,0,0 @@ -34,4 +29,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 12ebe3ffa0a25e7cb541cfa03664da0ba47030f7 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 12 Apr 2022 16:24:13 -0700 Subject: [PATCH 211/817] Run tune2fs during initramfs instead of image install (#10536) If it is run during image install, it's not guaranteed that the installation environment will have tune2fs available. Therefore, run it during initramfs instead. Signed-off-by: Saikrishna Arcot --- files/Aboot/boot0.j2 | 3 --- files/initramfs-tools/mke2fs | 1 + files/initramfs-tools/union-mount.j2 | 1 + installer/arm64/install.sh | 5 ----- installer/armhf/install.sh | 5 ----- installer/x86_64/install.sh | 11 ----------- 6 files changed, 2 insertions(+), 24 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 7306c36cfc0c..2510695d1363 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -355,9 +355,6 @@ extract_image() { local rootdev="$(echo $mountstr | cut -f1 -d' ')" rootfs_type="$(echo $mountstr | cut -d' ' -f3)" - ## Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $rootdev - info "Extracting $dockerfs from swi" ## Unpacking dockerfs delayed ## 1. when disk is vfat as it does not support symbolic link diff --git a/files/initramfs-tools/mke2fs b/files/initramfs-tools/mke2fs index 1f98f20c23c4..2c6d45ea5bc9 100644 --- a/files/initramfs-tools/mke2fs +++ b/files/initramfs-tools/mke2fs @@ -21,6 +21,7 @@ copy_exec /usr/sbin/mke2fs /usr/local/sbin/ copy_exec /sbin/sfdisk copy_exec /sbin/fdisk copy_exec /sbin/resize2fs +copy_exec /sbin/tune2fs copy_exec /sbin/findfs fstypes="ext4 ext3" diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index 7a64f71d70bb..c9dd19204406 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -133,6 +133,7 @@ case "${ROOT}" in *) ## Mount the raw partition again mount -t ext4 ${ROOT} ${rootmnt}/host + tune2fs -m 0 -r 0 ${ROOT} ;; esac diff --git a/installer/arm64/install.sh b/installer/arm64/install.sh index 249c5b521700..dee3ceec9038 100755 --- a/installer/arm64/install.sh +++ b/installer/arm64/install.sh @@ -139,11 +139,6 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done - - demo_dev=$(findmnt -n -o SOURCE --target /host) - - # Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $demo_dev fi # Create target directory or clean it up if exists diff --git a/installer/armhf/install.sh b/installer/armhf/install.sh index 8cffa755734f..9ade40d5149e 100755 --- a/installer/armhf/install.sh +++ b/installer/armhf/install.sh @@ -139,11 +139,6 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done - - demo_dev=$(findmnt -n -o SOURCE --target /host) - - # Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $demo_dev fi # Create target directory or clean it up if exists diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 950d765d2418..dbab4d54ab72 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -477,9 +477,6 @@ if [ "$install_env" = "onie" ]; then # Make filesystem mkfs.ext4 -L $demo_volume_label $demo_dev - # Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $demo_dev - # Mount demo filesystem demo_mnt=$(${onie_bin} mktemp -d) || { echo "Error: Unable to create file system mount point" @@ -512,20 +509,12 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done - - demo_dev=$(findmnt -n -o SOURCE --target /host) - - # Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $demo_dev else demo_mnt="build_raw_image_mnt" demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" mkfs.ext4 -L $demo_volume_label $demo_dev - # Don't reserve any blocks just for root - tune2fs -m 0 -r 0 $demo_dev - echo "Mounting $demo_dev on $demo_mnt..." mkdir $demo_mnt mount -t auto -o loop $demo_dev $demo_mnt From 44cf773a96f6fa03354208bf384c019683155881 Mon Sep 17 00:00:00 2001 From: Zhaohui Sun <94606222+ZhaohuiS@users.noreply.github.com> Date: Wed, 13 Apr 2022 08:57:10 +0800 Subject: [PATCH 212/817] Revert "[docker-ptf]: Upgrade scapy to 2.4.5 in docker-ptf (#10507)" (#10537) It upgraded scapy to 2.4.5 in docker-ptf container, after this upgrade, all scripts under ansible/roles/test/files/ptftests will import scapy 2.4.5, some test cases will fail because they are not upgraded accordingly. Reverts #10507 to avoid breaking regression test. This reverts commit 92efc01270675a3524a29a8e909fa1fdaeebed75. --- dockers/docker-ptf/Dockerfile.j2 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 21a96288a62f..d999d01e0026 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -119,8 +119,7 @@ RUN rm -rf /debs \ && pip install pyrasite \ && mkdir -p /opt \ && cd /opt \ - && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ - && pip install --upgrade --ignore-installed scapy==2.4.5 + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py ## Adjust sshd settings RUN mkdir /var/run/sshd \ From e6aa3b875136a26235f81b740976b26a85399f13 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 13 Apr 2022 11:40:06 +0800 Subject: [PATCH 213/817] [Build]: Fix pip version constraint conflict issue (#10525) Why I did it [Build]: Fix pip version constraint conflict issue When a version is specified in the constraint file, if upgrading the version in build script, it will have conflict issue. How I did it If a specified version has specified in pip command line, then the version constraint will be skipped. --- src/sonic-build-hooks/scripts/buildinfo_base.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index 3873d1362926..e1ef80b01162 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -169,6 +169,10 @@ run_pip_command() elif [[ "$para" == *.whl ]]; then package_name=$(echo $para | cut -d- -f1 | tr _ .) $SUDO sed "/^${package_name}==/d" -i $tmp_version_file + elif [[ "$para" == *==* ]]; then + # fix pip package constraint conflict issue + package_name=$(echo $para | cut -d= -f1) + $SUDO sed "/^${package_name}==/d" -i $tmp_version_file fi done From fb25f13ee8955311d0ed23c270c8da9d399b9b64 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Wed, 13 Apr 2022 12:18:29 +0800 Subject: [PATCH 214/817] [submodule] Advance sonic-platform-common pointer (#10538) b70e759 support new reboot-cause #277 Signed-off-by: Kebo Liu --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 01512ecce4d6..b70e75979f70 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 01512ecce4d6ce7272c0bbb7a5d47a1c02d92221 +Subproject commit b70e75979f704e980a3fb20732642ec99f32b0ee From 8c10c01bd8720fa7023107dd636e60361c1e9293 Mon Sep 17 00:00:00 2001 From: Oleksandr Kozodoi Date: Wed, 13 Apr 2022 19:11:01 +0300 Subject: [PATCH 215/817] Updated format of generating BUFFER_QUEUE in buffers_defaults templates (#9850) This PR includes necessary changes for correct generating BUFFER_QUEUE values in DB. Changes are based on the schema.md Why I did it Change format of generating BUFFER_QUEUE in DB according to schema.md and yang-model. Old format: "BUFFER_QUEUE": { "Ethernet0,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet12,Ethernet120,Ethernet124,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet4,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet8,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96|queue": { "profile": "profile" }, "Ethernet0,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet12,Ethernet120,Ethernet124,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet4,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet8,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96|queue": { "profile": "profile" } }, New format: "BUFFER_QUEUE": { "Ethernet0|queue": { "profile": "profile" }, "Ethernet0|queue": { "profile": "profile" }, "Ethernet4|queue": { "profile": "profile" }, "Ethernet4|queue": { "profile": "profile" }, "Ethernet8|queue": { "profile": "profile" }, "Ethernet8|queue": { "profile": "profile" }, ... } How I did it Updated structure of buffers_defaults jinja templates. Signed-off-by: Oleksandr Kozodoi --- .../Arista-7170-64C/buffers_defaults_t0.j2 | 14 +++++++----- .../Arista-7170-64C/buffers_defaults_t1.j2 | 14 +++++++----- .../newport/buffers_defaults_t0.j2 | 17 ++++++++------ .../newport/buffers_defaults_t1.j2 | 17 ++++++++------ .../montara/buffers_defaults_t0.j2 | 22 ++++++++----------- .../montara/buffers_defaults_t1.j2 | 22 ++++++++----------- 6 files changed, 56 insertions(+), 50 deletions(-) diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t0.j2 index 568b74b34a41..a6eefe8d36b0 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t0.j2 @@ -61,11 +61,15 @@ {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t1.j2 index 161afd10cea3..563137d90b90 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/buffers_defaults_t1.j2 @@ -61,11 +61,15 @@ {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 index 34c5db2ef708..a06f62f733ae 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 @@ -16,8 +16,7 @@ "ingress_lossless_pool": { "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", - "mode": "dynamic", - "xoff": "36222208" + "mode": "dynamic" }, "ingress_lossy_pool": { "size": "{{ ingress_lossy_pool_size }}", @@ -61,11 +60,15 @@ {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 index 34c5db2ef708..a06f62f733ae 100644 --- a/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 @@ -16,8 +16,7 @@ "ingress_lossless_pool": { "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", - "mode": "dynamic", - "xoff": "36222208" + "mode": "dynamic" }, "ingress_lossy_pool": { "size": "{{ ingress_lossy_pool_size }}", @@ -61,11 +60,15 @@ {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t0.j2 b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t0.j2 index 3e18b6dbad08..0e096c39d4dd 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t0.j2 +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t0.j2 @@ -63,21 +63,17 @@ }, {%- endmacro %} -{%- macro generate_pg_profils(port_names) %} - "BUFFER_PG": { - "{{ port_names }}|3-4": { - "profile" : "ingress_lossless_profile" - } - }, -{%- endmacro %} - {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t1.j2 b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t1.j2 index 923e5a102836..0067d92c926c 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t1.j2 +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/buffers_defaults_t1.j2 @@ -63,21 +63,17 @@ }, {%- endmacro %} -{%- macro generate_pg_profils(port_names) %} - "BUFFER_PG": { - "{{ port_names }}|3-4": { - "profile" : "ingress_lossless_profile" - } - }, -{%- endmacro %} - {%- macro generate_queue_buffers(port_names) %} "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "egress_lossless_profile" - }, - "{{ port_names }}|0-1": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { "profile" : "q_lossy_profile" - } + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } {%- endmacro %} From 812f17d6f1bf21c5d3a711f59e2a81b217cd42b2 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Thu, 14 Apr 2022 08:59:54 +0800 Subject: [PATCH 216/817] Add `libgmock` package for `linkmgrd` (#10294) Why I did it Add libgmock-dev to the package list required by linkmgrd unittests. Required by PR: Azure/sonic-linkmgrd#45 How I did it Add the package to the package list. How to verify it Build docker-mux with KEEP_SLAVE_ON=yes and verify libgmock-dev is present. Signed-off-by: Longxiang Lyu --- sonic-slave-bullseye/Dockerfile.j2 | 1 + sonic-slave-buster/Dockerfile.j2 | 1 + 2 files changed, 2 insertions(+) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 741f708de269..9a47b48ab93f 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -341,6 +341,7 @@ RUN apt-get update && apt-get install -y \ libboost-regex-dev \ googletest \ libgtest-dev \ + libgmock-dev \ libgcc-10-dev \ # For sonic-host-services build libcairo2-dev \ diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index fa8ac44f1b9e..269501fb2e47 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -353,6 +353,7 @@ RUN apt-get update && apt-get install -y \ libboost-regex1.71-dev \ googletest \ libgtest-dev \ + libgmock-dev \ libgcc-8-dev \ # For sonic-host-services build libcairo2-dev \ From 0191300b96465e3124733a1ab91b9510c9e0393c Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 14 Apr 2022 13:14:40 +0800 Subject: [PATCH 217/817] [Mellanox] Auto correct PSU voltage threshold (WA) (#10394) - Why I did it There is a hardware bug that PSU voltage threshold sysfs returns incorrect value. The workaround is to call "sensor -s" to refresh it. - How I did it Call "sensor -s" when the threshold value is not incorrect and PSU is "DELTA 1100" - How to verify it Unit test and Manual test --- .../x86_64-mlnx_msn3700-r0/sensors.conf | 6 ++ .../x86_64-mlnx_msn3700c-r0/sensors.conf | 6 ++ .../x86_64-mlnx_msn3800-r0/sensors.conf | 6 ++ .../x86_64-mlnx_msn4600c-r0/sensors.conf | 6 ++ .../x86_64-mlnx_msn4600c-r0/sensors.conf.a1 | 6 ++ .../mlnx-platform-api/sonic_platform/psu.py | 70 +++++++++++++++++++ .../mlnx-platform-api/sonic_platform/utils.py | 13 ++++ .../sonic_platform/vpd_parser.py | 15 ++++ .../mlnx-platform-api/tests/test_psu.py | 37 ++++++++++ .../mlnx-platform-api/tests/test_utils.py | 4 ++ 10 files changed, 169 insertions(+) diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf index 281f0a54dfa3..59c99ac98e39 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf @@ -85,6 +85,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 chip "dps460-i2c-*-59" label in1 "PSU-1 220V Rail (in)" ignore in2 @@ -99,6 +102,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-1 12V Rail Pwr (out)" label curr1 "PSU-1 220V Rail Curr (in)" label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf index 094cd78cde57..343385fcd4de 100644 --- a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf @@ -85,6 +85,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 chip "dps460-i2c-*-59" label in1 "PSU-1 220V Rail (in)" ignore in2 @@ -99,6 +102,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-1 12V Rail Pwr (out)" label curr1 "PSU-1 220V Rail Curr (in)" label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf index 7ba5f9c8c050..0b1cfc75548a 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf @@ -106,6 +106,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 chip "dps460-i2c-*-59" label in1 "PSU-1 220V Rail (in)" ignore in2 @@ -120,6 +123,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-1 12V Rail Pwr (out)" label curr1 "PSU-1 220V Rail Curr (in)" label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf index 9c80350e19ad..3ff78f15023f 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf @@ -167,6 +167,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-1(L) 12V Rail Pwr (out)" label curr1 "PSU-1(L) 220V Rail Curr (in)" label curr2 "PSU-1(L) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 chip "dps460-i2c-*-59" label in1 "PSU-2(R) 220V Rail (in)" ignore in2 @@ -181,6 +184,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2(R) 12V Rail Pwr (out)" label curr1 "PSU-2(R) 220V Rail Curr (in)" label curr2 "PSU-2(R) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf.a1 b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf.a1 index 44fff272e544..a0ebc677ad56 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf.a1 +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf.a1 @@ -123,6 +123,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-1(L) 12V Rail Pwr (out)" label curr1 "PSU-1(L) 220V Rail Curr (in)" label curr2 "PSU-1(L) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 chip "dps460-i2c-*-59" label in1 "PSU-2(R) 220V Rail (in)" ignore in2 @@ -137,6 +140,9 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2(R) 12V Rail Pwr (out)" label curr1 "PSU-2(R) 220V Rail Curr (in)" label curr2 "PSU-2(R) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index 39494a124ed4..a2dcfcd55b4e 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -24,8 +24,10 @@ try: import os + import time from sonic_platform_base.psu_base import PsuBase from sonic_py_common.logger import Logger + from .device_data import DeviceDataManager from .led import PsuLed, SharedLed, ComponentFaultyIndicator from . import utils from .vpd_parser import VpdParser @@ -411,6 +413,7 @@ def get_voltage_high_threshold(self): capability = utils.read_str_from_file(self.psu_voltage_capability) if 'max' in capability: max_voltage = utils.read_int_from_file(self.psu_voltage_max, log_func=logger.log_info) + max_voltage = InvalidPsuVolWA.run(self, max_voltage, self.psu_voltage_max) return float(max_voltage) / 1000 return None @@ -431,6 +434,7 @@ def get_voltage_low_threshold(self): capability = utils.read_str_from_file(self.psu_voltage_capability) if 'min' in capability: min_voltage = utils.read_int_from_file(self.psu_voltage_min, log_func=logger.log_info) + min_voltage = InvalidPsuVolWA.run(self, min_voltage, self.psu_voltage_min) return float(min_voltage) / 1000 return None @@ -448,3 +452,69 @@ def get_maximum_supplied_power(self): return float(power_max) / 1000000 else: return None + + +class InvalidPsuVolWA: + """This class is created as a workaround for a known hardware issue that the PSU voltage threshold could be a + invalid value 127998. Once we read a voltage threshold value equal to 127998, we should do following: + 1. Check the PSU vendor, it should be Delta + 2. Generate a temp sensor configuration file which contains a few set commands. Those set commands are the WA provided by low level team. + 3. Call "sensors -s -c " + 4. Wait for it to take effect + + This issue is found on 3700, 3700c, 3800, 4600c + """ + + INVALID_VOLTAGE_VALUE = 127998 + EXPECT_VENDOR_NAME = 'DELTA' + EXPECT_CAPACITY = '1100' + EXPECT_PLATFORMS = ['x86_64-mlnx_msn3700-r0', 'x86_64-mlnx_msn3700c-r0', 'x86_64-mlnx_msn3800-r0', 'x86_64-mlnx_msn4600c-r0'] + MFR_FIELD = 'MFR_NAME' + CAPACITY_FIELD = 'CAPACITY' + WAIT_TIME = 5 + + @classmethod + def run(cls, psu, threshold_value, threshold_file): + if threshold_value != cls.INVALID_VOLTAGE_VALUE: + # If the threshold value is not an invalid value, just return + return threshold_value + + platform_name = DeviceDataManager.get_platform_name() + # Apply the WA to specified platforms + if platform_name not in cls.EXPECT_PLATFORMS: + # It is unlikely to go to this branch, so we log a warning here + logger.log_warning('PSU {} threshold file {} value {}, but platform is {}'.format(psu.index, threshold_file, threshold_value, platform_name)) + return threshold_value + + # Check PSU vendor, make sure it is DELTA + vendor_name = psu.vpd_parser.get_entry_value(cls.MFR_FIELD) + if vendor_name != 'N/A' and vendor_name != cls.EXPECT_VENDOR_NAME: + # It is unlikely to go to this branch, so we log a warning here + logger.log_warning('PSU {} threshold file {} value {}, but its vendor is {}'.format(psu.index, threshold_file, threshold_value, vendor_name)) + return threshold_value + + # Check PSU version, make sure it is 1100 + capacity = psu.vpd_parser.get_entry_value(cls.CAPACITY_FIELD) + if capacity != 'N/A' and capacity != cls.EXPECT_CAPACITY: + logger.log_warning('PSU {} threshold file {} value {}, but its capacity is {}'.format(psu.index, threshold_file, threshold_value, capacity)) + return threshold_value + + # Run a sensor -s command to triger hardware to get the real threashold value + utils.run_command('sensor -s') + + # Wait for the threshold value change + return cls.wait_set_done(threshold_file) + + @classmethod + def wait_set_done(cls, threshold_file): + wait_time = cls.WAIT_TIME + while wait_time > 0: + value = utils.read_int_from_file(threshold_file, log_func=logger.log_info) + if value != cls.INVALID_VOLTAGE_VALUE: + return value + + wait_time -= 1 + time.sleep(1) + + logger.log_error('sensor -s does not recover PSU threshold sensor after {} seconds'.format(cls.WAIT_TIME)) + return None diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py index 0650d9af1a1c..22ef4bb1f27d 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py @@ -194,3 +194,16 @@ def _impl(*args, **kwargs): return return_value return _impl return wrapper + + +def run_command(command): + """ + Utility function to run an shell command and return the output. + :param command: Shell command string. + :return: Output of the shell command. + """ + try: + process = subprocess.Popen(command, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return process.communicate()[0].strip() + except Exception: + return None \ No newline at end of file diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/vpd_parser.py b/platform/mellanox/mlnx-platform-api/sonic_platform/vpd_parser.py index ea66234e4bff..e53d825adfd6 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/vpd_parser.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/vpd_parser.py @@ -24,6 +24,7 @@ SN_VPD_FIELD = "SN_VPD_FIELD" PN_VPD_FIELD = "PN_VPD_FIELD" REV_VPD_FIELD = "REV_VPD_FIELD" +MFR_VPD_FIELD = "MFR_NAME" class VpdParser: @@ -82,3 +83,17 @@ def get_revision(self): logger.log_error("Fail to read revision: No key {} in VPD {}".format(REV_VPD_FIELD, self.vpd_file)) return 'N/A' return self.vpd_data.get(REV_VPD_FIELD, 'N/A') + + def get_entry_value(self, key): + """ + Retrieves an vpd entry of the device + + Returns: + string: Vpd entry value of device + """ + if self._get_data() and key not in self.vpd_data: + logger.log_warning("Fail to read vpd info: No key {} in VPD {}".format(key, self.vpd_file)) + return 'N/A' + return self.vpd_data.get(key, 'N/A') + + diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index c53a9d44797d..5a5f13ff05f3 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -116,3 +116,40 @@ def test_psu_vpd(self): assert psu.get_model() == 'MTEF-PSF-AC-C' assert psu.get_serial() == 'MT1946X07684' assert psu.get_revision() == 'A3' + + assert psu.vpd_parser.get_entry_value('MFR_NAME') == 'DELTA' + + @mock.patch('sonic_platform.utils.read_int_from_file', mock.MagicMock(return_value=9999)) + @mock.patch('sonic_platform.utils.run_command') + @mock.patch('sonic_platform.device_data.DeviceDataManager.get_platform_name') + @mock.patch('sonic_platform.vpd_parser.VpdParser.get_entry_value') + def test_psu_workaround(self, mock_get_entry_value, mock_get_platform_name, mock_run_command): + from sonic_platform.psu import InvalidPsuVolWA + psu = Psu(0) + # Threshold value is not InvalidPsuVolWA.INVALID_VOLTAGE_VALUE + assert InvalidPsuVolWA.run(psu, 9999, '') == 9999 + + # Platform name is not in InvalidPsuVolWA.EXPECT_PLATFORMS + mock_get_platform_name.return_value = 'some platform' + assert InvalidPsuVolWA.run(psu, InvalidPsuVolWA.INVALID_VOLTAGE_VALUE, '') == InvalidPsuVolWA.INVALID_VOLTAGE_VALUE + + # PSU vendor is not InvalidPsuVolWA.EXPECT_VENDOR_NAME + vpd_info = { + InvalidPsuVolWA.MFR_FIELD: 'some psu', + InvalidPsuVolWA.CAPACITY_FIELD: 'some capacity' + } + def get_entry_value(key): + return vpd_info[key] + + mock_get_entry_value.side_effect = get_entry_value + mock_get_platform_name.return_value = 'x86_64-mlnx_msn3700-r0' + assert InvalidPsuVolWA.run(psu, InvalidPsuVolWA.INVALID_VOLTAGE_VALUE, '') == InvalidPsuVolWA.INVALID_VOLTAGE_VALUE + + # PSU capacity is not InvalidPsuVolWA.EXPECT_CAPACITY + vpd_info[InvalidPsuVolWA.MFR_FIELD] = InvalidPsuVolWA.EXPECT_VENDOR_NAME + assert InvalidPsuVolWA.run(psu, InvalidPsuVolWA.INVALID_VOLTAGE_VALUE, '') == InvalidPsuVolWA.INVALID_VOLTAGE_VALUE + + # Normal + vpd_info[InvalidPsuVolWA.CAPACITY_FIELD] = InvalidPsuVolWA.EXPECT_CAPACITY + assert InvalidPsuVolWA.run(psu, InvalidPsuVolWA.INVALID_VOLTAGE_VALUE, '') == 9999 + mock_run_command.assert_called_with('sensor -s') diff --git a/platform/mellanox/mlnx-platform-api/tests/test_utils.py b/platform/mellanox/mlnx-platform-api/tests/test_utils.py index 7da17dc5e7bc..bbc3ab28e58c 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_utils.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_utils.py @@ -116,3 +116,7 @@ def func(): assert func() == 100 assert mock_log.call_count == 1 + + def test_run_command(self): + output = utils.run_command('ls') + assert output From d9117d94118e9aea7a64d27747ceb9c1bf638156 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Fri, 15 Apr 2022 01:00:32 +0300 Subject: [PATCH 218/817] [Mellanox][asan] add address sanitizer support for syncd (#10266) Why I did it To support address sanitizer for Mellanox syncd How I did it /var/log/asan is mapped for syncd container (the same as for swss) container stop() has a timeout (60s) for syncd (the same as for swss) This is so libasan has enough time to generate a report. added ASAN's log path to Mellanox syncd supervisord.conf added "asan: yes" to sonic_version.yml How to verify it Added artificial memory leaks Compiled with ENABLE_ASAN=y Installed the image on DUT Rebooted the DUT Verified that /var/log/asan/syncd-asan.log contains the leaks Signed-off-by: Yakiv Huryk --- files/build_templates/docker_image_ctl.j2 | 6 +++--- files/build_templates/sonic_version.yml.j2 | 4 +++- platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 | 9 ++++++++- .../{supervisord.conf => supervisord.conf.j2} | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) rename platform/mellanox/docker-syncd-mlnx/{supervisord.conf => supervisord.conf.j2} (89%) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 6d5024b716eb..81efc39231e9 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -435,9 +435,9 @@ start() { {%- endif %} {%- if docker_container_name == "swss" %} -e ASIC_VENDOR={{ sonic_asic_platform }} \ -{%- if enable_asan == "y" %} - -v /var/log/asan/:/var/log/asan \ {%- endif -%} +{%- if docker_container_name in ["swss", "syncd"] and enable_asan == "y" %} + -v /var/log/asan/:/var/log/asan \ {%- endif -%} {%- if docker_container_name == "bgp" %} -v /etc/sonic/frr/$DEV:/etc/frr:rw \ @@ -499,7 +499,7 @@ stop() { {%- elif docker_container_name == "teamd" %} # Longer timeout of 60 sec to wait for Portchannels to be cleaned. /usr/local/bin/container stop -t 60 $DOCKERNAME - {%- elif docker_container_name == "swss" and enable_asan == "y" %} + {%- elif docker_container_name in ["swss", "syncd"] and enable_asan == "y" %} /usr/local/bin/container stop -t 60 $DOCKERNAME {%- else %} /usr/local/bin/container stop $DOCKERNAME diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 index 6e3f3acac95a..bc6fb54189d4 100644 --- a/files/build_templates/sonic_version.yml.j2 +++ b/files/build_templates/sonic_version.yml.j2 @@ -26,4 +26,6 @@ built_by: {{ built_by }} {{ name }}: {{ version }} {% endfor -%} {% endif -%} - +{% if ENABLE_ASAN == "y" -%} +asan: 'yes' +{% endif -%} diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 404db43c70aa..386f00e3fe31 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -31,6 +31,9 @@ RUN apt-get update && \ libxml2 \ python-pip \ python-dev \ +{%- if ENABLE_ASAN == "y" %} + libasan5 \ +{%- endif %} python-setuptools RUN pip2 install --upgrade pip @@ -58,8 +61,12 @@ RUN apt-get clean -y && \ apt-get autoremove -y && \ rm -rf /debs -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] +RUN mkdir -p /etc/supervisor/conf.d/ +RUN sonic-cfggen -a "{\"ENABLE_ASAN\":\"{{ENABLE_ASAN}}\"}" -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf +RUN rm -f /usr/share/sonic/templates/supervisord.conf.j2 + ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf b/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 similarity index 89% rename from platform/mellanox/docker-syncd-mlnx/supervisord.conf rename to platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 index 6fd59606062d..cc07096b20c6 100644 --- a/platform/mellanox/docker-syncd-mlnx/supervisord.conf +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 @@ -37,3 +37,6 @@ stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=rsyslogd:running +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log" +{% endif %} From 3068c5101ee03557e66230754d56746f4acafae1 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 15 Apr 2022 23:02:30 +0800 Subject: [PATCH 219/817] Update submodule sonic-platform-daemons (#10572) Updating sonic-utilities sub module with the following commits f09bd31 Fix UT failed cause by change pycommon to use swsscommon c092300 Increased pcied unit test coverage to > 80% 7d7c85e Modular chassis: Psud set master led on first run 7195dcc Remove py2 from pipeline c2e7393 [ycabled] increase UT coverage of ycabled daemon #### Why I did it When change pycommon to use swsscommon UT failed in sonic-platform-daemon, need submodule update with UT issue fix. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog Fix UT failed cause by change pycommon to use swsscommon Increased pcied unit test coverage to > 80% Modular chassis: Psud set master led on first run Remove py2 from pipeline [ycabled] increase UT coverage of ycabled daemon #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 94fa239a7bcf..f09bd311a1c5 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 94fa239a7bcfcab008e94fb5c118b628e4256561 +Subproject commit f09bd311a1c51d487c6588a4e5039a2f7e4059e3 From 04f810a346ef357309e523ade17285622315768c Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Sat, 16 Apr 2022 01:41:43 +0800 Subject: [PATCH 220/817] [gearbox] use credo sai v0.7.5 (#10578) The v0.7.5 has bug fix for the support of gearbox port and macsec counters. It also includes a owl firmware update with owl.lz4.fw.1.94.0.bin. How I did it Update credo sai url for v0.7.5 Update gearbox_config.json with using firmware owl.lz4.fw.1.94.0.bin instead of owl.lz4.fw.1.92.1.bin How to verify it Test gearbox port and macsec counter successfully on A7280. --- .../Arista-7280CR3-C40/gearbox_config.json | 16 ++++++------- .../gearbox_config.json | 24 +++++++++---------- platform/components/docker-gbsyncd-credo.mk | 8 +++---- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json index e05ee11290ac..5a1fd88d49ad 100644 --- a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json +++ b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json @@ -5,7 +5,7 @@ "name": "phy1", "address": "1", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy1_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -19,7 +19,7 @@ "name": "phy2", "address": "2", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy2_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -33,7 +33,7 @@ "name": "phy3", "address": "3", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy3_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -47,7 +47,7 @@ "name": "phy4", "address": "4", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy4_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -61,7 +61,7 @@ "name": "phy5", "address": "5", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy5_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -75,7 +75,7 @@ "name": "phy6", "address": "6", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy6_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -89,7 +89,7 @@ "name": "phy7", "address": "7", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy7_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -103,7 +103,7 @@ "name": "phy8", "address": "8", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy8_config.json", "sai_init_config_file": "", "phy_access": "mdio", diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_config.json b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_config.json index d72df085bb88..b082868e95be 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_config.json +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/gearbox_config.json @@ -5,7 +5,7 @@ "name": "phy1", "address": "1", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy1_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -19,7 +19,7 @@ "name": "phy2", "address": "2", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy2_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -33,7 +33,7 @@ "name": "phy3", "address": "3", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy3_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -47,7 +47,7 @@ "name": "phy4", "address": "4", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy4_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -61,7 +61,7 @@ "name": "phy5", "address": "5", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy5_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -75,7 +75,7 @@ "name": "phy6", "address": "6", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy6_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -89,7 +89,7 @@ "name": "phy7", "address": "7", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy7_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -103,7 +103,7 @@ "name": "phy8", "address": "8", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy8_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -117,7 +117,7 @@ "name": "phy9", "address": "9", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy9_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -131,7 +131,7 @@ "name": "phy10", "address": "10", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy10_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -145,7 +145,7 @@ "name": "phy11", "address": "11", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy11_config.json", "sai_init_config_file": "", "phy_access": "mdio", @@ -159,7 +159,7 @@ "name": "phy12", "address": "12", "lib_name": "", - "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.92.1.bin", + "firmware_path": "/usr/etc/credo/firmware/owl.lz4.fw.1.94.0.bin", "config_file": "/usr/share/sonic/hwsku/phy12_config.json", "sai_init_config_file": "", "phy_access": "mdio", diff --git a/platform/components/docker-gbsyncd-credo.mk b/platform/components/docker-gbsyncd-credo.mk index 4f7c37980dee..6f5c69b506e6 100644 --- a/platform/components/docker-gbsyncd-credo.mk +++ b/platform/components/docker-gbsyncd-credo.mk @@ -1,9 +1,9 @@ DOCKER_GBSYNCD_PLATFORM_CODE = credo -LIBSAI_CREDO = libsaicredo_0.7.2_amd64.deb -$(LIBSAI_CREDO)_URL = "https://sonicstorage.blob.core.windows.net/packages/credosai/libsaicredo_0.7.2_amd64.deb?sv=2020-08-04&st=2021-11-23T03%3A17%3A40Z&se=2100-11-24T03%3A17%3A00Z&sr=b&sp=r&sig=q1hj3YHdkSnaKkN%2Bv0SYw01keE4ottLffuxSGre9mu0%3D" -LIBSAI_CREDO_OWL = libsaicredo-owl_0.7.2_amd64.deb -$(LIBSAI_CREDO_OWL)_URL = "https://sonicstorage.blob.core.windows.net/packages/credosai/libsaicredo-owl_0.7.2_amd64.deb?sv=2020-08-04&st=2021-11-23T03%3A50%3A31Z&se=2100-11-24T03%3A50%3A00Z&sr=b&sp=r&sig=mhiqfhHsBwa5AZOuNSj0U8uLsr46Tet6OGC41Mx5B6I%3D" +LIBSAI_CREDO = libsaicredo_0.7.5_amd64.deb +$(LIBSAI_CREDO)_URL = "https://sonicstorage.blob.core.windows.net/packages/credosai/libsaicredo_0.7.5_amd64.deb?sv=2020-10-02&st=2022-04-14T02%3A21%3A31Z&se=2100-04-15T02%3A21%3A00Z&sr=b&sp=r&sig=iDv9Fprntpw9iVBFYVjW8iygy4qcSWT8O90nAXdXR0A%3D" +LIBSAI_CREDO_OWL = libsaicredo-owl_0.7.5_amd64.deb +$(LIBSAI_CREDO_OWL)_URL = "https://sonicstorage.blob.core.windows.net/packages/credosai/libsaicredo-owl_0.7.5_amd64.deb?sv=2020-10-02&st=2022-04-14T02%3A23%3A22Z&se=2100-04-15T02%3A23%3A00Z&sr=b&sp=r&sig=58z6E2nPcLIGjqAoxRAo7du%2FzjIBZkFdoXfSzw96Kxc%3D" ifneq ($($(LIBSAI_CREDO)_URL),) include $(PLATFORM_PATH)/../template/docker-gbsyncd-base.mk From 2a516a776397dac9d058186b31ef355b727283b6 Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Fri, 15 Apr 2022 18:01:24 -0700 Subject: [PATCH 221/817] [dhcp_relay] Enable dhcp_relay on EPMS, MgmtTsTor, MgmtToRRouter and BackEndToRRouter (#10474) --- files/build_templates/init_cfg.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index e1320214e02c..a7f1e54a4e15 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -36,7 +36,7 @@ ("swss", "enabled", false, "enabled"), ("syncd", "enabled", false, "enabled"), ("teamd", "enabled", false, "enabled")] %} -{% do features.append(("dhcp_relay", "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}", false, "enabled")) %} +{% do features.append(("dhcp_relay", "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] is not in ['ToRRouter', 'EPMS', 'MgmtTsToR', 'MgmtToRRouter']) %}enabled{% else %}disabled{% endif %}", false, "enabled")) %} {%- if sonic_asic_platform == "vs" %}{% do features.append(("gbsyncd", "enabled", false, "enabled")) %}{% endif %} {%- if include_iccpd == "y" %}{% do features.append(("iccpd", "disabled", false, "enabled")) %}{% endif %} {%- if include_mgmt_framework == "y" %}{% do features.append(("mgmt-framework", "enabled", true, "enabled")) %}{% endif %} From c1f2221ae3e4fdde656c6dc1f0e1d38bb0193907 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Sat, 16 Apr 2022 14:59:05 -0700 Subject: [PATCH 222/817] Update sonic-platform-daemons (#10514) 9ac12bf (HEAD -> master, origin/master, origin/HEAD) Fix platform daemon chassisd to handle auto restart on fail (#247) 24fba04 [ycable] fix the logic to update cable_info values when ycable is not present; fix read side logic for ycable (#249) --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index f09bd311a1c5..9ac12bfb4064 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit f09bd311a1c51d487c6588a4e5039a2f7e4059e3 +Subproject commit 9ac12bfb406416b0fb3b03a084d8179bdc53f3a6 From 593ab45bded9658df1ff1cf7f1b0a347f7f7bc7f Mon Sep 17 00:00:00 2001 From: Taras Keryk Date: Sun, 17 Apr 2022 01:11:59 +0300 Subject: [PATCH 223/817] [BFN] Added the latest version of FPGA driver and modules (#10458) Signed-off-by: Taras Keryk --- .../barefoot/bfn-modules/modules/bf_ioctl.h | 3 +- .../barefoot/bfn-modules/modules/bf_kdrv.c | 355 ++++++++++++++---- .../barefoot/bfn-modules/modules/bf_kdrv.h | 29 +- .../modules/bf_fpga_ioctl.c | 7 +- .../modules/bf_fpga_ioctl.h | 2 +- .../modules/bf_fpga_main.c | 19 +- .../modules/bf_fpga_priv.h | 5 +- .../modules/bf_fpga_sysfs.c | 4 +- .../modules/i2c/bf_fpga_i2c.c | 14 +- 9 files changed, 344 insertions(+), 94 deletions(-) diff --git a/platform/barefoot/bfn-modules/modules/bf_ioctl.h b/platform/barefoot/bfn-modules/modules/bf_ioctl.h index 0644feb7c8c1..fcb8f86ae7e5 100644 --- a/platform/barefoot/bfn-modules/modules/bf_ioctl.h +++ b/platform/barefoot/bfn-modules/modules/bf_ioctl.h @@ -1,7 +1,7 @@ /******************************************************************************* Barefoot Networks Switch ASIC Linux driver Copyright(c) 2015 - 2019 Barefoot Networks, Inc. - + This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation. @@ -39,6 +39,7 @@ typedef uint64_t phys_addr_t; #define BF_IOC_MAGIC 'b' #define BF_TBUS_MSIX_INDICES_MAX 3 +#define BF_TBUS_MSIX_INDICES_MIN 1 typedef struct bf_dma_bus_map_s { diff --git a/platform/barefoot/bfn-modules/modules/bf_kdrv.c b/platform/barefoot/bfn-modules/modules/bf_kdrv.c index 2bddc72cbbf7..4f48de9ba99b 100644 --- a/platform/barefoot/bfn-modules/modules/bf_kdrv.c +++ b/platform/barefoot/bfn-modules/modules/bf_kdrv.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "bf_ioctl.h" #include "bf_kdrv.h" @@ -60,6 +61,7 @@ extern int bf_kpkt_init(struct pci_dev *pdev, u8 *bar0_vaddr, void **adapter_ptr, int dev_id, + int subdev_id, int pci_use_highmem, unsigned long head_room, int kpkt_dr_int_en, @@ -72,14 +74,15 @@ extern void bf_kpkt_set_pci_error(void *adapter_ptr, u8 pci_error); /* Keep any global information here that must survive even after the * bf_pci_dev is free-ed up. */ -struct bf_global { +struct bf_global_s { struct bf_pci_dev *bfdev; struct cdev *bf_cdev; struct fasync_struct *async_queue; + /* Pending user space error signal. */ + bool pending_signal; }; -static int bf_major; -static int bf_minor[BF_MAX_DEVICE_CNT] = {0}; +static int bf_minor[BF_MAX_DEV_SUBDEV_CNT] = {0}; static struct class *bf_class = NULL; static char *intr_mode = NULL; static int kpkt_mode = 0; @@ -91,7 +94,10 @@ static enum bf_intr_mode bf_intr_mode_default = BF_INTR_MODE_MSI; static spinlock_t bf_nonisr_lock; /* dev->minor should index into this array */ -static struct bf_global bf_global[BF_MAX_DEVICE_CNT]; +static struct bf_global_s bf_global[BF_MAX_DEV_SUBDEV_CNT]; + +/* global tofino3 info to group subdevices to a parent device */ +static struct bf_tof3_info_s bf_tof3_info[BF_MAX_DEVICE_CNT]; static void bf_add_listener(struct bf_pci_dev *bfdev, struct bf_listener *listener) { @@ -145,7 +151,7 @@ static int bf_get_next_minor_no(int *minor) { int i; spin_lock(&bf_nonisr_lock); - for (i = 0; i < BF_MAX_DEVICE_CNT; i++) { + for (i = 0; i < BF_MAX_DEV_SUBDEV_CNT; i++) { if (bf_minor[i] == 0) { *minor = i; bf_minor[i] = 1; /* mark it as taken */ @@ -276,7 +282,7 @@ static irqreturn_t bf_pci_irqhandler(int irq, struct bf_pci_dev *bfdev) { bf_kpkt_irqhandler(irq, bfdev->adapter_ptr); } } else if (bfdev->mode == BF_INTR_MODE_MSIX) { - if (bfdev->info.tof_type == BF_TOFINO_2 && bf_irq_is_tbus_msix(bfdev,irq)) { + if ((bfdev->info.tof_type == BF_TOFINO_2 || bfdev->info.tof_type == BF_TOFINO_3) && bf_irq_is_tbus_msix(bfdev, irq)) { bf_kpkt_irqhandler(irq, bfdev->adapter_ptr); } } @@ -470,6 +476,7 @@ static int bf_mmap(struct file *filep, struct vm_area_struct *vma) { static int bf_fasync(int fd, struct file *filep, int mode) { int minor; + int res; if (!filep->private_data) { return (-EINVAL); @@ -479,17 +486,32 @@ static int bf_fasync(int fd, struct file *filep, int mode) { return (-EINVAL); } if (mode == 0 && &bf_global[minor].async_queue == NULL) { + bf_global[minor].pending_signal = false; return 0; /* nothing to do */ } - return (fasync_helper(fd, filep, mode, &bf_global[minor].async_queue)); + res = fasync_helper(fd, filep, mode, &bf_global[minor].async_queue); + if (bf_global[minor].pending_signal && bf_global[minor].async_queue) { + kill_fasync(&bf_global[minor].async_queue, SIGIO, POLL_ERR); + } + bf_global[minor].pending_signal = false; + return res; } static int bf_open(struct inode *inode, struct file *filep) { + unsigned id; struct bf_pci_dev *bfdev; struct bf_listener *listener; int i; - bfdev = bf_global[iminor(inode)].bfdev; + id = iminor(inode); + if (id >= BF_MAX_DEVICE_CNT) { + return (-EINVAL); + } + + bfdev = bf_global[id].bfdev; + if (bfdev->in_use) { + return (-EBUSY); + } listener = kmalloc(sizeof(*listener), GFP_KERNEL); if (listener) { listener->bfdev = bfdev; @@ -500,6 +522,7 @@ static int bf_open(struct inode *inode, struct file *filep) { listener->event_count[i] = atomic_read(&bfdev->info.event[i]); } filep->private_data = listener; + bfdev->in_use = 1; return 0; } else { return (-ENOMEM); @@ -512,6 +535,7 @@ static int bf_release(struct inode *inode, struct file *filep) { bf_fasync(-1, filep, 0); /* empty any process id in the notification list */ if (listener->bfdev) { bf_remove_listener(listener->bfdev, listener); + listener->bfdev->in_use = 0; } kfree(listener); return 0; @@ -645,7 +669,15 @@ static long bf_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) } switch(cmd) { case BF_IOCMAPDMAADDR: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) +#if defined(RHEL_RELEASE_CODE) +#if defined(RHEL_RELEASE_VERSION) +#if RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7, 9) + if (access_ok(addr, sizeof(bf_dma_bus_map_t))) { +#else + if (access_ok(VERIFY_WRITE, addr, sizeof(bf_dma_bus_map_t))) { +#endif +#endif /* RHEL_RELEASE_CODE && RHEL_RELEASE_VERSION */ +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) if (access_ok(addr, sizeof(bf_dma_bus_map_t))) { #else if (access_ok(VERIFY_WRITE, addr, sizeof(bf_dma_bus_map_t))) { @@ -669,7 +701,15 @@ static long bf_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) } break; case BF_IOCUNMAPDMAADDR: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) +#if defined(RHEL_RELEASE_CODE) +#if defined(RHEL_RELEASE_VERSION) +#if RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7, 9) + if (access_ok(addr, sizeof(bf_dma_bus_map_t))) { +#else + if (access_ok(VERIFY_WRITE, addr, sizeof(bf_dma_bus_map_t))) { +#endif +#endif /* RHEL_RELEASE_CODE && RHEL_RELEASE_VERSION */ +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) if (access_ok(addr, sizeof(bf_dma_bus_map_t))) { #else if (access_ok(VERIFY_READ, addr, sizeof(bf_dma_bus_map_t))) { @@ -692,21 +732,39 @@ static long bf_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) } else { int i; bf_tbus_msix_indices_t msix_ind; - if (copy_from_user(&msix_ind, addr, sizeof(bf_tbus_msix_indices_t))) { - return EFAULT; - } - if (msix_ind.cnt > BF_TBUS_MSIX_INDICES_MAX) { - return EINVAL; - } - for (i = 0; i < msix_ind.cnt; i++) { - if (msix_ind.indices[i] >= BF_MSIX_ENTRY_CNT) { +#if defined(RHEL_RELEASE_CODE) +#if defined(RHEL_RELEASE_VERSION) +#if RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7, 9) + if (access_ok(addr, sizeof(bf_tbus_msix_indices_t))) { +#else + if (access_ok(VERIFY_WRITE, addr, sizeof(bf_tbus_msix_indices_t))) { +#endif +#endif /* RHEL_RELEASE_CODE && RHEL_RELEASE_VERSION */ +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) + if (access_ok(addr, sizeof(bf_tbus_msix_indices_t))) { +#else + if (access_ok(VERIFY_READ, addr, sizeof(bf_tbus_msix_indices_t))) { +#endif + if (copy_from_user(&msix_ind, addr, sizeof(bf_tbus_msix_indices_t))) { + return EFAULT; + } + if (msix_ind.cnt < BF_TBUS_MSIX_INDICES_MIN || + msix_ind.cnt > BF_TBUS_MSIX_INDICES_MAX) { return EINVAL; } + for (i = 0; i < msix_ind.cnt; i++) { + if (msix_ind.indices[i] < 0 || + msix_ind.indices[i] >= BF_MSIX_ENTRY_CNT) { + return EINVAL; + } + } + for (i = 0; i < msix_ind.cnt; i++) { + bfdev->info.tbus_msix_ind[i] = msix_ind.indices[i]; + } + bfdev->info.tbus_msix_map_enable = 1; + } else { + return EFAULT; } - for (i = 0; i < msix_ind.cnt; i++) { - bfdev->info.tbus_msix_ind[i] = msix_ind.indices[i]; - } - bfdev->info.tbus_msix_map_enable = 1; } break; case BF_GET_INTR_MODE: @@ -761,7 +819,7 @@ static int bf_major_init(struct bf_pci_dev *bfdev, int minor) { goto fail_dev_add; } - bf_major = MAJOR(bf_dev); + bfdev->info.major = MAJOR(bf_dev); bf_global[minor].bf_cdev = cdev; return 0; @@ -771,33 +829,93 @@ static int bf_major_init(struct bf_pci_dev *bfdev, int minor) { } static void bf_major_cleanup(struct bf_pci_dev *bfdev, int minor) { - unregister_chrdev_region(MKDEV(bf_major, 0), BF_MAX_DEVICE_CNT); + unregister_chrdev_region(MKDEV(bfdev->info.major, 0), BF_MAX_DEVICE_CNT); cdev_del(bf_global[minor].bf_cdev); } static int bf_init_cdev(struct bf_pci_dev *bfdev, int minor) { int ret; ret = bf_major_init(bfdev, minor); - if (ret) return ret; - - bf_class = class_create(THIS_MODULE, BF_CLASS_NAME); - if (!bf_class) { - printk(KERN_ERR "create_class failed for bf_dev\n"); - ret = -ENODEV; - goto err_class_register; - } - return 0; - -err_class_register: - bf_major_cleanup(bfdev, minor); return ret; } static void bf_remove_cdev(struct bf_pci_dev *bfdev) { - class_destroy(bf_class); bf_major_cleanup(bfdev, bfdev->info.minor); } +/* return the first unused dev_id based on invalid chip_id */ +static int bf_multisub_tof_unused_devid_get(void) { + int i; + for (i = 0; i < BF_MAX_DEVICE_CNT; i++) { + if ((bf_tof3_info[i]).minor[0] == -1 && + (bf_tof3_info[i]).minor[1] == -1) { + return i; + } + } + return -1; +} + +/* special case handling for TOF3. each subdevice creates its own device node + * device node is named as /dev/bfs +*/ +static int bf_tof3_register_device(struct device *parent, + struct bf_pci_dev *bfdev) { + struct bf_dev_info *info = &bfdev->info; + int minor = 0; + u8 *bf_base_addr; + volatile u32 *bf_addr; + int dev_id = 0, subdev_id = 0, ret = 0; + + if (!info || !info->version) { + return -EINVAL; + } + bf_base_addr = (info->mem[0].internal_addr); + if (!bf_base_addr) { + return -ENODEV; + } + /* *** TBD for multi Tofino(with 2 subdevices) systems *** */ + /* We must be able to identify multiple sub devices as belonging to one + physical Tofino(3) device. We have not figured that out yet. + until then, we support only one CB device per host CPU */ + bf_addr = (u32 *)((u8 *)bf_base_addr + TOFINO3_MISC_PAD_STATUS_OFFSET); +#if 1 /* USING EMULATOR where subdevice info is not possible to have */ + bf_multisub_tof_unused_devid_get(); /* keep compiler happy */ + subdev_id = 0; + if (bf_get_next_minor_no(&minor)) { + return -EINVAL; + } + dev_id = minor; +#else + subdev_id = (int)(*bf_addr & TOFINO3_MISC_PAD_STATUS_DIEID0); + if (bf_get_next_minor_no(&minor)) { + return -EINVAL; + } + /* we cannot assume the order in which sub devices are probed */ + if (subdev_id == 0) { + dev_id = bf_multisub_tof_unused_devid_get(); + bf_tof3_info[dev_id].dev_id = dev_id; /* back reference */ + (bf_tof3_info[dev_id].minor)[subdev_id] = minor; + } else { + dev_id = 0; /* TBD : for Tofino with multi sub devices */ + (bf_tof3_info[dev_id].minor)[subdev_id] = minor; + } +#endif + ret = bf_init_cdev(bfdev, minor); + if (ret) { + printk(KERN_ERR "BF: device cdev creation failed dev_id %d\n", dev_id); + return ret; + } + info->tof3_info = &(bf_tof3_info[dev_id]); + info->dev_id = dev_id; + info->subdev_id = subdev_id; + printk(KERN_NOTICE "BF: registering dev_id %d subdev_id %d\n", + dev_id, subdev_id); + info->dev = device_create(bf_class, parent, MKDEV(bfdev->info.major, minor), + bfdev, "bf%ds%1d", dev_id, subdev_id); + info->minor = minor; + return 0; +} + /** * bf_register_device - register a new userspace mem device * @parent: parent device @@ -808,7 +926,7 @@ static void bf_remove_cdev(struct bf_pci_dev *bfdev) { int bf_register_device(struct device *parent, struct bf_pci_dev *bfdev) { struct bf_dev_info *info = &bfdev->info; int i, j, ret = 0; - int minor; + int minor = 0; if (!parent || !info || !info->version) { return -EINVAL; @@ -820,25 +938,33 @@ int bf_register_device(struct device *parent, struct bf_pci_dev *bfdev) { atomic_set(&info->event[i], 0); } - if (bf_get_next_minor_no(&minor)) { - return -EINVAL; - } + if (info->tof_type == BF_TOFINO_3) { + if ((ret = bf_tof3_register_device(parent, bfdev)) != 0) { + printk(KERN_ERR "BF: TOF3 device cdev creation failed %d\n", ret); + return ret; + } + } else { + if (bf_get_next_minor_no(&minor)) { + return -EINVAL; + } - ret = bf_init_cdev(bfdev, minor); - if (ret) { - printk(KERN_ERR "BF: device cdev creation failed\n"); - return ret; - } + ret = bf_init_cdev(bfdev, minor); + if (ret) { + printk(KERN_ERR "BF: device cdev creation failed\n"); + return ret; + } - info->dev = device_create( - bf_class, parent, MKDEV(bf_major, minor), bfdev, "bf%d", minor); + info->dev = device_create( + bf_class, parent, MKDEV(bfdev->info.major, minor), bfdev, "bf%d", minor); + info->minor = minor; + info->dev_id = minor; + info->subdev_id = 0; + } if (!info->dev) { printk(KERN_ERR "BF: device creation failed\n"); return -ENODEV; } - info->minor = minor; - /* bind ISRs and request interrupts */ if (info->irq && (bfdev->mode != BF_INTR_MODE_NONE)) { /* @@ -906,6 +1032,33 @@ int bf_register_device(struct device *parent, struct bf_pci_dev *bfdev) { return 0; } +/* special case handling for TOF3. return minor number only after all + * sub devices using the minor number are unregistered */ +static int bf_tof3_unregister_device(struct bf_pci_dev *bfdev) { + struct bf_dev_info *info = &bfdev->info; +#if 1 //HACK until emulator implements efuse + bf_return_minor_no(info->minor); +#else + int j, dev_id, subdev_id, found; + + if (!info->tof3_info) { + printk(KERN_ERR "BF TOF3 bad info in tof3_unregister_device\n"); + return -1; + } + dev_id = info->tof3_info->dev_id; + subdev_id = info->subdev_id; + if (dev_id >= BF_MAX_DEVICE_CNT || subdev_id >= BF_MAX_SUBDEV_CNT) { + return -1; + } + /* update bf_tof3_info structure for the device being unregistered */ + (bf_tof3_info[dev_id].minor)[subdev_id] = -1; + /* return the minor number */ + bf_return_minor_no(info->minor); + info->subdev_id = -1; +#endif + return 0; +} + /** * bf_unregister_device - register a new userspace mem device * @bfdev: bf pci device @@ -914,8 +1067,12 @@ int bf_register_device(struct device *parent, struct bf_pci_dev *bfdev) { */ void bf_unregister_device(struct bf_pci_dev *bfdev) { struct bf_dev_info *info = &bfdev->info; - int i; + int i, ret; + if (!info) { + printk(KERN_ERR "BF: bad data in device unregister\n"); + return; + } if (info->irq) { if (bfdev->mode == BF_INTR_MODE_LEGACY) { free_irq(info->irq, (void *)&(bfdev->bf_int_vec[0])); @@ -929,9 +1086,16 @@ void bf_unregister_device(struct bf_pci_dev *bfdev) { } } } - device_destroy(bf_class, MKDEV(bf_major, info->minor)); + device_destroy(bf_class, MKDEV(info->major, info->minor)); bf_remove_cdev(bfdev); - bf_return_minor_no(info->minor); + if (bfdev->info.tof_type == BF_TOFINO_3) { + if ((ret = bf_tof3_unregister_device(bfdev)) != 0) { + printk(KERN_ERR "BF: TOF3 device cdev unregister failed %d\n", ret); + return; + } + } else { + bf_return_minor_no(info->minor); + } return; } @@ -944,13 +1108,13 @@ static void bf_disable_int_dma(struct bf_pci_dev *bfdev) { u32 *bf_addr; volatile u32 val; - /* maskinterrupts and DMA */ + /* mask interrupts and DMA */ bf_base_addr = (bfdev->info.mem[0].internal_addr); /* return if called before mmap */ if (!bf_base_addr) { return; } - /* mask interrupt at shadow level */ + /* mask interrupts at shadow level */ bf_addr = (u32 *)((u8 *)bf_base_addr + 0xc0); for (i = 0; i < 16; i++) { *bf_addr = 0xffffffffUL; @@ -968,8 +1132,6 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int err, pci_use_highmem; int i, num_irq; - memset(bf_global, 0, sizeof(bf_global)); - bfdev = kzalloc(sizeof(struct bf_pci_dev), GFP_KERNEL); if (!bfdev) { return -ENOMEM; @@ -995,6 +1157,9 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { case TOFINO2_DEV_ID_B0: bfdev->info.tof_type = BF_TOFINO_2; break; + case TOFINO3_DEV_ID_A0: + bfdev->info.tof_type = BF_TOFINO_3; + break; default: bfdev->info.tof_type = BF_TOFINO_1; break; @@ -1005,6 +1170,8 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { bfdev->info.tbus_msix_ind[i] = BF_TBUS_MSIX_BASE_INDEX_TOF1 + i; } else if (bfdev->info.tof_type == BF_TOFINO_2) { bfdev->info.tbus_msix_ind[i] = BF_TBUS_MSIX_INDEX_INVALID; + } else if (bfdev->info.tof_type == BF_TOFINO_3) { + bfdev->info.tbus_msix_ind[i] = BF_TBUS_MSIX_INDEX_INVALID; } } /* @@ -1068,7 +1235,6 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { bfdev->info.version = "0.2"; bfdev->info.owner = THIS_MODULE; bfdev->pdev = pdev; - switch (bf_intr_mode_default) { #ifdef CONFIG_PCI_MSI case BF_INTR_MODE_MSIX: @@ -1113,6 +1279,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { } #endif /* LINUX_VERSION_CODE */ /* ** intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_MSI: #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0) num_irq = pci_enable_msi_block(pdev, BF_MSI_ENTRY_CNT); @@ -1150,6 +1317,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { #endif /* LINUX_VERSION_CODE */ #endif /* CONFIG_PCI_MSI */ /* fall back to Legacy Interrupt, intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_LEGACY: if (pci_intx_mask_supported(pdev)) { @@ -1161,6 +1329,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { } printk(KERN_NOTICE " bf PCI INTx mask not supported\n"); /* fall back to no Interrupt, intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_NONE: bfdev->info.irq = 0; bfdev->info.num_irq = 0; @@ -1183,6 +1352,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { bf_global[bfdev->info.minor].async_queue = NULL; bf_global[bfdev->info.minor].bfdev = bfdev; + bf_global[bfdev->info.minor].pending_signal = false; dev_info(&pdev->dev, "bf device %d registered with irq %ld\n", @@ -1194,15 +1364,18 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { err = bf_kpkt_init(pdev, bfdev->info.mem[0].internal_addr, &bfdev->adapter_ptr, - bfdev->info.minor, + bfdev->info.dev_id, + bfdev->info.subdev_id, pci_use_highmem, kpkt_hd_room, kpkt_dr_int_en, kpkt_rx_count); if (err == 0) { - printk(KERN_ALERT "bf_kpkt kernel processing enabled\n"); + printk(KERN_ALERT "bf_kpkt kernel processing enabled for dev %d subdev_id %d\n", + bfdev->info.dev_id, bfdev->info.subdev_id); } else { - printk(KERN_ALERT "error starting bf_kpkt kernel processing\n"); + printk(KERN_ERR "error starting bf_kpkt kernel processing for dev %d subdev_id %d\n", + bfdev->info.dev_id, bfdev->info.subdev_id); bfdev->adapter_ptr = NULL; } } @@ -1316,16 +1489,29 @@ static pci_ers_result_t bf_pci_mmio_enabled(struct pci_dev *dev) { struct bf_pci_dev *bfdev = pci_get_drvdata(dev); printk(KERN_ERR "BF pci_mmio_enabled invoked after pci error\n"); - #if KERNEL_VERSION(5, 8, 0) <= LINUX_VERSION_CODE - pci_aer_clear_nonfatal_status(dev); - #else - pci_cleanup_aer_uncorrect_error_status(dev); - #endif +#if defined(RHEL_RELEASE_CODE) +#if defined(RHEL_RELEASE_VERSION) +#if RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7, 9) + pci_aer_clear_nonfatal_status(dev); +#else + pci_cleanup_aer_uncorrect_error_status(dev); +#endif +#endif /* RHEL_RELEASE_CODE && RHEL_RELEASE_VERSION */ +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) + pci_aer_clear_nonfatal_status(dev); +#else + pci_cleanup_aer_uncorrect_error_status(dev); +#endif + if (bfdev) { /* send a signal to the user space program of the error */ int minor = bfdev->info.minor; - if (minor < BF_MAX_DEVICE_CNT && bf_global[minor].async_queue) { - kill_fasync(&bf_global[minor].async_queue, SIGIO, POLL_ERR); + if (minor < BF_MAX_DEVICE_CNT) { + if (bf_global[minor].async_queue) { + kill_fasync(&bf_global[minor].async_queue, SIGIO, POLL_ERR); + } else { + bf_global[minor].pending_signal = true; + } } } return PCI_ERS_RESULT_RECOVERED; @@ -1389,6 +1575,7 @@ static const struct pci_device_id bf_pci_tbl[] = { {PCI_VDEVICE(BF, TOFINO2_DEV_ID_A0), 0}, {PCI_VDEVICE(BF, TOFINO2_DEV_ID_A00), 0}, {PCI_VDEVICE(BF, TOFINO2_DEV_ID_B0), 0}, + {PCI_VDEVICE(INTEL, TOFINO3_DEV_ID_A0), 0}, /* required last entry */ {.device = 0}}; @@ -1409,12 +1596,36 @@ static struct pci_driver bf_pci_driver = {.name = "bf", static int __init bfdrv_init(void) { int ret; + pr_info("%s: %s - version %s\n", DRV_NAME(kpkt_mode), + DRV_DESCRIPTION(kpkt_mode),DRV_VERSION); + pr_info("%s: %s\n", DRV_NAME(kpkt_mode),DRV_COPYRIGHT); + memset(bf_global, 0, sizeof(bf_global)); + memset(bf_tof3_info, 0xff, sizeof(bf_tof3_info)); + bf_class = class_create(THIS_MODULE, BF_CLASS_NAME); + if (!bf_class) { + printk(KERN_ERR "create_class failed for bf device\n"); + return -ENODEV; + } else { + printk(KERN_NOTICE "bf device class created\n"); + } + ret = bf_config_intr_mode(intr_mode); + + if (ret < 0) { + printk(KERN_ERR "config interrupt mode failed for bf device\n"); + if (bf_class) { + class_destroy(bf_class); + bf_class = NULL; + } + return ret; + } + /* do not enable DR interrupt if not using MSI or not in kpkt mode */ if ((bf_intr_mode_default != BF_INTR_MODE_MSI && bf_intr_mode_default != BF_INTR_MODE_LEGACY) || kpkt_mode == 0) { kpkt_dr_int_en = 0; } + if (kpkt_mode) { printk(KERN_NOTICE "kpkt_mode %d hd_room %d dr_int_en %d rx_count %d\n", kpkt_mode, @@ -1422,15 +1633,17 @@ static int __init bfdrv_init(void) { kpkt_dr_int_en, kpkt_rx_count); } - if (ret < 0) { - return ret; - } + spin_lock_init(&bf_nonisr_lock); return pci_register_driver(&bf_pci_driver); } static void __exit bfdrv_exit(void) { + pr_info("%s: module unloading ...\n", DRV_NAME(kpkt_mode)); pci_unregister_driver(&bf_pci_driver); + class_destroy(bf_class); + pr_info("%s: module unloaded successfully\n", DRV_NAME(kpkt_mode)); + bf_class = NULL; intr_mode = NULL; kpkt_mode = 0; } diff --git a/platform/barefoot/bfn-modules/modules/bf_kdrv.h b/platform/barefoot/bfn-modules/modules/bf_kdrv.h index de5ca4bbc71c..d2fb6e7dce06 100644 --- a/platform/barefoot/bfn-modules/modules/bf_kdrv.h +++ b/platform/barefoot/bfn-modules/modules/bf_kdrv.h @@ -1,7 +1,7 @@ /******************************************************************************* Barefoot Networks Switch ASIC Linux driver Copyright(c) 2015 - 2019 Barefoot Networks, Inc. - + This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation. @@ -35,11 +35,13 @@ typedef uint64_t phys_addr_t; #endif #define PCI_VENDOR_ID_BF 0x1d1c +#define PCI_VENDOR_ID_INTEL 0x8086 #define TOFINO_DEV_ID_A0 0x01 #define TOFINO_DEV_ID_B0 0x10 #define TOFINO2_DEV_ID_A0 0x0100 #define TOFINO2_DEV_ID_A00 0x0000 #define TOFINO2_DEV_ID_B0 0x0110 +#define TOFINO3_DEV_ID_A0 0x0DA2 #ifndef PCI_MSIX_ENTRY_SIZE #define PCI_MSIX_ENTRY_SIZE 16 @@ -51,7 +53,9 @@ typedef uint64_t phys_addr_t; #endif #define BF_CLASS_NAME "bf" -#define BF_MAX_DEVICE_CNT 256 +#define BF_MAX_DEVICE_CNT 8 +#define BF_MAX_SUBDEV_CNT 2 +#define BF_MAX_DEV_SUBDEV_CNT (BF_MAX_DEVICE_CNT * BF_MAX_SUBDEV_CNT) #define BF_INTR_MODE_NONE_NAME "none" #define BF_INTR_MODE_LEGACY_NAME "legacy" #define BF_INTR_MODE_MSI_NAME "msi" @@ -64,11 +68,22 @@ typedef uint64_t phys_addr_t; #define BF_TBUS_MSIX_INDEX_INVALID (0) #define BF_TBUS_MSIX_BASE_INDEX_TOF1 (32) +#define TOFINO3_MISC_PAD_STATUS_OFFSET 0x80238UL +#define TOFINO3_MISC_PAD_STATUS_DIEID0 (1 << 3) + +#define DRV_NAME(kpkt_mode) (kpkt_mode ? "bf_kpkt" : "bf_kdrv") +#define DRV_DESCRIPTION(kpkt_mode) (kpkt_mode ? \ + "Intel(R) Switch ASIC Linux Packet Driver" : \ + "Intel(R) Switch ASIC Linux Driver" ) +#define DRV_COPYRIGHT "Copyright (c) 2015-2022 Intel Corporation." +#define DRV_VERSION "1.0" + /* Tofino generation type */ typedef enum { BF_TOFINO_NONE = 0, BF_TOFINO_1, BF_TOFINO_2, + BF_TOFINO_3, } bf_tof_type; /* device memory */ @@ -86,10 +101,16 @@ struct bf_listener { struct bf_listener *next; }; +struct bf_tof3_info_s { + int dev_id; + int minor[BF_MAX_SUBDEV_CNT]; +}; + /* device information */ struct bf_dev_info { struct module *owner; struct device *dev; + int major; int minor; atomic_t event[BF_MSIX_ENTRY_CNT]; wait_queue_head_t wait; @@ -104,6 +125,9 @@ struct bf_dev_info { /* msix index assigned to tbus MSIX for Tofino-2 only */ int tbus_msix_ind[BF_TBUS_MSIX_INDICES_MAX]; int tbus_msix_map_enable; + struct bf_tof3_info_s *tof3_info; + int dev_id; /* same as minor number for T1 and T2 */ + int subdev_id; int pci_error_state; /* was there a pci bus error */ }; @@ -126,6 +150,7 @@ struct bf_pci_dev { struct bf_listener * listener_head; /* head of a singly linked list of listeners */ void *adapter_ptr; /* pkt processing adapter */ + int in_use; /* indicates a user space process is using the device */ }; /* TBD: Need to build with CONFIG_PCI_MSI */ diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.c b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.c index b0792556caf6..8f4a5ca7fc6a 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.c +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.c @@ -110,9 +110,10 @@ int bf_fpga_ioctl(struct bf_pci_dev *bfdev, /* copy read data to user area */ for (i = 0; i < i2c_op.num_i2c; i++) { if (i2c_op.i2c_inst[i].rd_cnt) { - if (copy_to_user(&(((bf_fpga_i2c_t *)addr)->i2c_inst[i].rd_buf), - &i2c_op.i2c_inst[i].rd_buf, - i2c_op.i2c_inst[i].rd_cnt)) { + if (copy_to_user( + &(((bf_fpga_i2c_t *)addr)->i2c_inst[i].fpga_i2c_buf.rd_buf), + &i2c_op.i2c_inst[i].fpga_i2c_buf.rd_buf, + i2c_op.i2c_inst[i].rd_cnt)) { return -EFAULT; } } diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.h b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.h index 4c5eb7bf0386..f7035647af50 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.h +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_ioctl.h @@ -93,7 +93,7 @@ typedef struct bf_fpga_i2c_inst_s { unsigned char wr_buf[BF_FPGA_MAX_I2C_WR_DATA]; /* write data source buffer */ unsigned char rd_buf[BF_FPGA_MAX_I2C_RD_DATA]; /* read data dest buffer */ - }; + } fpga_i2c_buf; unsigned char status; unsigned char retry_cnt; /* if fpga maintains retry count */ unsigned char mux; /* if fpga maintains internal MUX */ diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_main.c b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_main.c index 563cc5120df1..9910117b72cb 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_main.c +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_main.c @@ -120,7 +120,7 @@ static void bf_remove_listener(struct bf_pci_dev *bfdev, /* in case of certain error conditions, this function might be called after * bf_pci_remove() - */ + */ if (!bfdev || !listener) { return; } @@ -294,7 +294,12 @@ static int bf_setup_bars(struct pci_dev *dev, struct bf_dev_info *info) { int i, iom, ret; unsigned long flags; static const char *bar_names[BF_MAX_BAR_MAPS] = { - "BAR0", "BAR1", "BAR2", "BAR3", "BAR4", "BAR5", + "BAR0", + "BAR1", + "BAR2", + "BAR3", + "BAR4", + "BAR5", }; iom = 0; @@ -849,7 +854,7 @@ static void fpga_print_build_date(u32 build_date) { month = (char)(build_date & 0x0f); build_date >>= 4; day = (char)(build_date & 0x1f); - printk(KERN_ALERT "fpga version %02d/%02d/%2d %02d:%02d:%02d", + printk(KERN_ALERT "fpga build %02d/%02d/%2d %02d:%02d:%02d", month, day, year, @@ -991,6 +996,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { } #endif /* LINUX_VERSION_CODE */ /* ** intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_MSI: #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0) num_irq = pci_enable_msi_block(pdev, BF_MSI_ENTRY_CNT); @@ -1032,7 +1038,8 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { } #endif /* LINUX_VERSION_CODE */ #endif /* CONFIG_PCI_MSI */ - /* fall back to Legacy Interrupt, intentional no-break */ + /* fall back to Legacy Interrupt, intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_LEGACY: if (pci_intx_mask_supported(pdev)) { @@ -1044,6 +1051,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { } printk(KERN_NOTICE "bf_fpga PCI INTx mask not supported\n"); /* fall back to no Interrupt, intentional no-break */ + /* FALLTHRU */ case BF_INTR_MODE_NONE: bfdev->info.irq = 0; bfdev->info.num_irq = 0; @@ -1084,7 +1092,7 @@ static int bf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { build_date = *((u32 *)(bfdev->info.mem[0].internal_addr) + (BF_FPGA_BUILD_DATE / 4)); fpga_print_build_date(build_date); - printk(KERN_ALERT "bf_fpga version %hu:%hu probe ok\n", + printk(KERN_ALERT "bf_fpga version %hu.%hu probe ok\n", (u16)(build_ver >> 16), (u16)(build_ver)); return 0; @@ -1239,6 +1247,7 @@ static int bf_config_intr_mode(char *intr_str) { static const struct pci_device_id bf_pci_tbl[] = { {PCI_VDEVICE(BF, BF_FPGA_DEV_ID_JBAY_0), 0}, + {PCI_VDEVICE(BF, BF_FPGA_DEV_ID_CB_0), 0}, /* required last entry */ {.device = 0}}; diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_priv.h b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_priv.h index 7515bde7458d..5d259fb8a9f7 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_priv.h +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_priv.h @@ -28,6 +28,7 @@ #define PCI_VENDOR_ID_BF 0x1d1c #define BF_FPGA_DEV_ID_JBAY_0 0x01F0 +#define BF_FPGA_DEV_ID_CB_0 0x01F1 #ifndef PCI_MSIX_ENTRY_SIZE #define PCI_MSIX_ENTRY_SIZE 16 @@ -123,8 +124,8 @@ struct bf_pci_dev { u8 instance; char name[16]; struct bf_int_vector bf_int_vec[BF_MSIX_ENTRY_CNT]; - struct bf_listener * - listener_head; /* head of a singly linked list of listeners */ + struct bf_listener + *listener_head; /* head of a singly linked list of listeners */ struct bf_fpga_sysfs_buff fpga_sysfs_buff[BF_FPGA_SYSFS_CNT]; struct bf_fpga_sysfs_buff fpga_sysfs_new_device; struct bf_fpga_sysfs_buff fpga_sysfs_rm_device; diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_sysfs.c b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_sysfs.c index 6970a7a95985..6d5259e6a46e 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_sysfs.c +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/bf_fpga_sysfs.c @@ -76,7 +76,7 @@ static ssize_t bf_fpga_sysfs_i2c_get(struct device *dev, i2c_op.i2c_inst[0].status); return -EIO; } - memcpy(buf, i2c_op.i2c_inst[0].rd_buf, cur_cnt); + memcpy(buf, i2c_op.i2c_inst[0].fpga_i2c_buf.rd_buf, cur_cnt); buf += cur_cnt; size += cur_cnt; cur_size -= cur_cnt; @@ -108,7 +108,7 @@ static ssize_t bf_fpga_sysfs_i2c_set(struct device *dev, } i2c_op.i2c_inst[0].wr_cnt = cur_cnt; i2c_op.i2c_inst[0].rd_cnt = 0; - memcpy(i2c_op.i2c_inst[0].wr_buf, buf, cur_cnt); + memcpy(i2c_op.i2c_inst[0].fpga_i2c_buf.wr_buf, buf, cur_cnt); i2c_op.num_i2c = 1; i2c_op.one_time = 1; i2c_op.inst_hndl.bus_id = sysfs_buf->bus_id; diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/i2c/bf_fpga_i2c.c b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/i2c/bf_fpga_i2c.c index c8ebd3e63c6f..1f0520990188 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/modules/i2c/bf_fpga_i2c.c +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/modules/i2c/bf_fpga_i2c.c @@ -146,11 +146,11 @@ static int fpga_i2c_enqueue(int bus_id, wd0 |= (I2C_WR_ADDR_DATA | (delay << I2C_DELAY_SHF)); wd1 |= (i2c_inst->i2c_addr << I2C_DEV_ADDR_SHF); /* copy the first byte into register address */ - wd1 |= ((i2c_inst->wr_buf[0]) << I2C_CMD_OFFSET); + wd1 |= ((i2c_inst->fpga_i2c_buf.wr_buf[0]) << I2C_CMD_OFFSET); wd1 |= ((num_wr - 1) << I2C_WR_CNT_SHF); if (num_wr <= 9) { /* copy data into instruction area */ - memcpy(i2c_data, &i2c_inst->wr_buf[1], (num_wr - 1)); + memcpy(i2c_data, &i2c_inst->fpga_i2c_buf.wr_buf[1], (num_wr - 1)); bf_fpga_i2c_reg_write32( i2c_ctrl, Bf_FPGA_I2C_INST_DATA_LO(inst_id), i2c_data[0]); bf_fpga_i2c_reg_write32( @@ -159,7 +159,7 @@ static int fpga_i2c_enqueue(int bus_id, /* copy the data in data area */ int len = num_wr - 1; uint32_t addr; - uint8_t *val = (uint8_t *)(&i2c_inst->wr_buf[1]); + uint8_t *val = (uint8_t *)(&i2c_inst->fpga_i2c_buf.wr_buf[1]); /* store the data pointer Note the indexing required by FPGA specs */ i2c_data[0] = BF_FPGA_I2C_DATA_AREA(inst_id); addr = i2c_data[0]; @@ -195,11 +195,11 @@ static int fpga_i2c_enqueue(int bus_id, wd1 |= (i2c_inst->i2c_addr << I2C_DEV_ADDR_SHF); /* 1st byte of the write buf goes into "register address" field */ wd1 |= ((num_wr - 1) << I2C_WR_CNT_SHF); - wd1 |= ((i2c_inst->wr_buf[0]) << I2C_CMD_OFFSET); + wd1 |= ((i2c_inst->fpga_i2c_buf.wr_buf[0]) << I2C_CMD_OFFSET); wd1 |= ((num_rd) << I2C_RD_CNT_SHF); /* less than 8 bytes data goes to the instruction area */ if ((num_wr - 1 + num_rd) <= 8) { - memcpy(i2c_data, &i2c_inst->wr_buf[1], (num_wr - 1)); + memcpy(i2c_data, &i2c_inst->fpga_i2c_buf.wr_buf[1], (num_wr - 1)); bf_fpga_i2c_reg_write32( i2c_ctrl, Bf_FPGA_I2C_INST_DATA_LO(inst_id), i2c_data[0]); bf_fpga_i2c_reg_write32( @@ -207,7 +207,7 @@ static int fpga_i2c_enqueue(int bus_id, } else { int len = num_wr - 1; uint32_t addr; - uint8_t *val = (uint8_t *)(&i2c_inst->wr_buf[1]); + uint8_t *val = (uint8_t *)(&i2c_inst->fpga_i2c_buf.wr_buf[1]); /* store the data area pointer */ i2c_data[0] = BF_FPGA_I2C_DATA_AREA(inst_id); addr = i2c_data[0]; @@ -419,7 +419,7 @@ int fpga_i2c_oneshot(bf_fpga_i2c_t *i2c_op) { i, offset, i2c_op->i2c_inst[i].rd_cnt, - i2c_op->i2c_inst[i].rd_buf)) { + i2c_op->i2c_inst[i].fpga_i2c_buf.rd_buf)) { ret = BF_FPGA_EIO; goto oneshot_error_exit; } From 87036c34ec1bef4d42767e7f25d3e23fb95167df Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sun, 17 Apr 2022 20:32:51 +0800 Subject: [PATCH 224/817] [macsec]: Upgrade docker-macsec to bullseye (#10574) Following the patch from : https://packages.debian.org/bullseye/wpasupplicant, to upgrade sonic-wpa-supplicant for supporting bullseye and upgrade docker-macsec.mk as a bullseye component. --- dockers/docker-macsec/Dockerfile.j2 | 2 +- rules/docker-macsec.mk | 15 +++++++-------- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dockers/docker-macsec/Dockerfile.j2 b/dockers/docker-macsec/Dockerfile.j2 index 0239d6529096..586983533e77 100644 --- a/dockers/docker-macsec/Dockerfile.j2 +++ b/dockers/docker-macsec/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster +FROM docker-config-engine-bullseye ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/rules/docker-macsec.mk b/rules/docker-macsec.mk index 1cb14246e86a..7250f79f90cd 100644 --- a/rules/docker-macsec.mk +++ b/rules/docker-macsec.mk @@ -6,14 +6,13 @@ DOCKER_MACSEC_DBG = $(DOCKER_MACSEC_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_MACSEC)_PATH = $(DOCKERS_PATH)/$(DOCKER_MACSEC_STEM) -$(DOCKER_MACSEC)_DEPENDS += $(SWSS) $(WPASUPPLICANT) $(REDIS_TOOLS) $(LIBNL3) $(LIBNL_GENL3) $(LIBNL_ROUTE3) -$(DOCKER_MACSEC)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) -$(DOCKER_MACSEC)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) -$(DOCKER_MACSEC)_DBG_DEPENDS += $(WPASUPPLICANT_DBG) +$(DOCKER_MACSEC)_DEPENDS += $(WPASUPPLICANT) $(LIBSWSSCOMMON) $(LIBNL3) $(LIBNL_GENL3) $(LIBNL_ROUTE3) +$(DOCKER_MACSEC)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_MACSEC)_DBG_DEPENDS += $(WPASUPPLICANT_DBG) $(LIBSWSSCOMMON_DBG) -$(DOCKER_MACSEC)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_MACSEC)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_MACSEC)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BUSTER) +$(DOCKER_MACSEC)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) SONIC_DOCKER_IMAGES += $(DOCKER_MACSEC) ifeq ($(INCLUDE_MACSEC), y) @@ -34,5 +33,5 @@ $(DOCKER_MACSEC)_RUN_OPT += -v /host/warmboot:/var/warmboot $(DOCKER_MACSEC)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -SONIC_BUSTER_DOCKERS += $(DOCKER_MACSEC) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_MACSEC_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_MACSEC) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_MACSEC_DBG) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 43611ef88ea5..f36c8c87702f 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 43611ef88ea5c87f675cab55e3208c9f16bdd583 +Subproject commit f36c8c87702fa1bc6d1f9b7193872285a41bd630 From 16f6860e9455b2388794f86be9d8d587a914e8ce Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Sun, 17 Apr 2022 15:14:37 -0700 Subject: [PATCH 225/817] [master][sonic-linkmgrd] submodule updates (#10532) [master][sonic-linkmgrd] submodule updates 41f5fb9 Jing Zhang Mon Apr 11 08:33:39 2022 -0700 Upgrade linkmgrd to `BULLSEYE` (https://github.com/Azure/sonic-linkmgrd/pull/60) 2fc890e Jing Zhang Mon Apr 4 10:25:22 2022 -0700 Lower unsolicited MUX state change notification log level to WARNING (https://github.com/Azure/sonic-linkmgrd/pull/57) 13f4879 Jing Zhang Sun Apr 3 21:56:33 2022 -0700 Keep incrementing sequence number when link prober is suspended and shutdown (https://github.com/Azure/sonic-linkmgrd/pull/55) 62482e1 Jing Zhang Sun Apr 3 20:54:40 2022 -0700 Reset link prober state when default route is back (https://github.com/Azure/sonic-linkmgrd/pull/56) 34a68d1 Jing Zhang Thu Mar 31 18:33:46 2022 -0700 disable switchover measuring based on link prober (https://github.com/Azure/sonic-linkmgrd/pull/49) 898a655 Jing Zhang Thu Mar 31 15:42:15 2022 -0700 Update link prober metrics posting logics (https://github.com/Azure/sonic-linkmgrd/pull/50) sign-off: Jing Zhang zhangjing@microsoft.com --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 83dfc992d1b2..41f5fb9d44f2 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 83dfc992d1b24b01bb9b125cc86a8ce63ba060f6 +Subproject commit 41f5fb9d44f2fd789dea372f2b647d40ec71ed75 From a1494577d9cc55dac99f55dc7031bcac37d7d9e5 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Mon, 18 Apr 2022 10:34:52 +0800 Subject: [PATCH 226/817] [yang]: Add yang model for MACsec (#10559) Add Yang model to constrain the configuration of MACsec --- src/sonic-yang-models/setup.py | 6 +- .../tests/files/sample_config_db.json | 21 ++- .../tests/yang_model_tests/tests/macsec.json | 29 ++++ .../yang_model_tests/tests_config/macsec.json | 141 ++++++++++++++++++ .../yang-models/sonic-macsec.yang | 116 ++++++++++++++ .../yang-models/sonic-port.yang | 10 ++ 6 files changed, 319 insertions(+), 4 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/macsec.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/macsec.json create mode 100644 src/sonic-yang-models/yang-models/sonic-macsec.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 429549255824..4ca8d065c6ec 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -143,7 +143,8 @@ def run(self): './yang-models/sonic-tc-queue-map.yang', './yang-models/sonic-pfc-priority-queue-map.yang', './yang-models/sonic-pfc-priority-priority-group-map.yang', - './yang-models/sonic-port-qos-map.yang']), + './yang-models/sonic-port-qos-map.yang', + './yang-models/sonic-macsec.yang']), ('cvlyang-models', ['./cvlyang-models/sonic-acl.yang', './cvlyang-models/sonic-bgp-common.yang', './cvlyang-models/sonic-bgp-global.yang', @@ -194,7 +195,8 @@ def run(self): './cvlyang-models/sonic-tc-queue-map.yang', './cvlyang-models/sonic-pfc-priority-queue-map.yang', './cvlyang-models/sonic-pfc-priority-priority-group-map.yang', - './cvlyang-models/sonic-port-qos-map.yang']), + './cvlyang-models/sonic-port-qos-map.yang', + './cvlyang-models/sonic-macsec.yang']), ], zip_safe=False, ) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 6618ed8232b7..8c5a8c0af909 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -426,7 +426,8 @@ "admin_status": "up", "index": "0", "asic_port_name": "Eth0-ASIC1", - "role": "Ext" + "role": "Ext", + "macsec": "test" }, "Ethernet1": { "alias": "Eth1/2", @@ -1686,8 +1687,24 @@ "vlan_id": "111", "vsid": "5000" } - } + }, + + "MACSEC_PROFILE": { + "test": { + "priority": "64", + "cipher_suite": "GCM-AES-128", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70", + "fallback_cak": "00000000000000000000000000000000", + "fallback_ckn": "11111111111111111111111111111111", + "policy": "security", + "enable_replay_protect": "true", + "replay_window": "64", + "send_sci": "true", + "rekey_period": "3600" + } + } }, "SAMPLE_CONFIG_DB_UNKNOWN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/macsec.json b/src/sonic-yang-models/tests/yang_model_tests/tests/macsec.json new file mode 100644 index 000000000000..9d4329e8d7f2 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/macsec.json @@ -0,0 +1,29 @@ +{ + "VALID_PROFILE": { + "desc": "Valid MACsec profile test" + }, + "DUPLICATE_CKN": { + "desc": "Primary CKN equals than fallback CKN", + "eStrKey": "Must" + }, + "INVALID_CAK_LENGTH": { + "desc": "Invalid CAK length", + "eStrKey": "Pattern" + }, + "INVALID_CAK_CHARACTER": { + "desc": "Invalid CAK character", + "eStrKey": "Pattern" + }, + "INVALID_CIPHER_LOWERCASE": { + "desc": "Invalid cipher with lowercase", + "eStrKey": "Pattern" + }, + "MISMATCH_LENGTH_PRIMARY_FALLBACK": { + "desc": "Mismatch length of primary and fallback", + "eStrKey": "Must" + }, + "SET_REPLAY_WINDOW_WHEN_DISABLE_REPLAY_PROTECT": { + "desc": "Set replay window when disable replay protect", + "eStrKey": "When" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/macsec.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/macsec.json new file mode 100644 index 000000000000..cfd7c512a67a --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/macsec.json @@ -0,0 +1,141 @@ +{ + "VALID_PROFILE": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test32", + "priority": 64, + "cipher_suite": "GCM-AES-128", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70", + "fallback_cak": "00000000000000000000000000000000", + "fallback_ckn": "11111111111111111111111111111111", + "policy": "security", + "enable_replay_protect": "true", + "replay_window": 64, + "send_sci": "true", + "rekey_period": 3600 + }, + { + "name": "test64", + "priority": 64, + "cipher_suite": "GCM-AES-XPN-256", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F706162636465666768696A6B6C6D6E6F70", + "fallback_cak": "0000000000000000000000000000000000000000000000000000000000000000", + "fallback_ckn": "1111111111111111111111111111111111111111111111111111111111111111", + "policy": "security", + "enable_replay_protect": "true", + "replay_window": 64, + "send_sci": "true", + "rekey_period": 3600 + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "pfc_asym": "on", + "name": "Ethernet8", + "tpid": "0x8100", + "speed": 25000, + "macsec": "test32" + } + ] + } + } + }, + "INVALID_CIPHER_LOWERCASE": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "cipher_suite": "gcm-aes-128", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70" + } + ] + } + } + }, + "DUPLICATE_CKN": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70", + "fallback_cak": "0123456789ABCDEF0123456789ABCDEF", + "fallback_ckn": "6162636465666768696A6B6C6D6E6F70" + } + ] + } + } + }, + "INVALID_CAK_LENGTH": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "primary_cak": "0123456789ABCDEF0123456789ABCDEFA", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70A" + } + ] + } + } + }, + "INVALID_CAK_CHARACTER": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "primary_cak": "X123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "X162636465666768696A6B6C6D6E6F70" + } + ] + } + } + }, + "MISMATCH_LENGTH_PRIMARY_FALLBACK": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70", + "fallback_cak": "0000000000000000000000000000000000000000000000000000000000000000", + "fallback_ckn": "1111111111111111111111111111111111111111111111111111111111111111" + } + ] + } + } + }, + "SET_REPLAY_WINDOW_WHEN_DISABLE_REPLAY_PROTECT": { + "sonic-macsec:sonic-macsec": { + "sonic-macsec:MACSEC_PROFILE": { + "MACSEC_PROFILE_LIST": [ + { + "name": "test", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F70", + "replay_window": 64 + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-macsec.yang b/src/sonic-yang-models/yang-models/sonic-macsec.yang new file mode 100644 index 000000000000..4e3412f86a3d --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-macsec.yang @@ -0,0 +1,116 @@ +module sonic-macsec { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-macsec"; + + prefix macsec; + + import sonic-types { + prefix stypes; + } + + description "MACsec yang Module for SONiC OS"; + + revision 2022-04-12 { + description "First Revision"; + } + + container sonic-macsec { + + container MACSEC_PROFILE { + + description "MACsec profile of config_db.json"; + + list MACSEC_PROFILE_LIST { + + key "name"; + + leaf name { + type string { + length 1..128; + } + } + + leaf priority { + type uint8; + default 255; + } + + leaf cipher_suite { + type string { + pattern "GCM-AES-128|GCM-AES-256|GCM-AES-XPN-128|GCM-AES-XPN-256"; + } + default "GCM-AES-128"; + } + + leaf primary_cak { + type string { + pattern "[0-9a-fA-F]{32}|[0-9a-fA-F]{64}"; + } + mandatory true; + } + + leaf primary_ckn { + type string { + pattern "[0-9a-fA-F]{32}|[0-9a-fA-F]{64}"; + } + mandatory true; + } + + leaf fallback_cak { + type string { + pattern "[0-9a-fA-F]{32}|[0-9a-fA-F]{64}"; + } + } + + leaf fallback_ckn { + type string { + pattern "[0-9a-fA-F]{32}|[0-9a-fA-F]{64}"; + } + } + + must "string-length(primary_cak) = string-length(primary_ckn)"; + + must "string-length(fallback_cak) = string-length(fallback_ckn)"; + + must "string-length(fallback_cak) = string-length(primary_cak)"; + + must "primary_ckn != fallback_ckn"; + + leaf policy { + type string { + pattern "integrity_only|security"; + } + default "security"; + } + + leaf enable_replay_protect { + type stypes:boolean_type; + default "false"; + } + + leaf replay_window { + when "current()/../enable_replay_protect = 'true'"; + type uint32; + } + + leaf send_sci { + type stypes:boolean_type; + default "true"; + } + + leaf rekey_period { + description "The period of proactively refresh (Unit second). + If the value is 0, which means never proactive refresh SAK."; + type uint32; + default 0; + } + + } /* end of list MACSEC_PROFILE_LIST */ + + } /* end of container MACSEC_PROFILE */ + + } /* end of container sonic-macsec */ + +} /* end of module sonic-macsec */ diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index d296eaa05c39..add4de25ce0a 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -13,6 +13,10 @@ module sonic-port{ prefix ext; } + import sonic-macsec { + prefix macsec; + } + description "PORT yang Module for SONiC OS"; revision 2019-07-01 { @@ -153,6 +157,12 @@ module sonic-port{ type boolean; } + leaf macsec { + type leafref { + path "/macsec:sonic-macsec/macsec:MACSEC_PROFILE/macsec:MACSEC_PROFILE_LIST/macsec:name"; + } + } + } /* end of list PORT_LIST */ } /* end of container PORT */ From a0c76b1bc9fb93ed1975fe73b75eb8c54e9df469 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Mon, 18 Apr 2022 15:55:56 +0800 Subject: [PATCH 227/817] [Mellanox] support newly added reboot cause (#10531) - Why I did it Implement newly added reboot causes in PR Azure/sonic-platform-common#277 - How I did it Map the reboot cause sysfs to the newly added reboot causes. - How to verify it manual test, check whether the reboot cause is correct after rebooting the switch in various ways. run the community reboot test to see whether the reboot cause checker is passing. Signed-off-by: Kebo Liu --- .../sonic_platform/chassis.py | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index 1cc3d0f75660..c7bafc0d8921 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -657,24 +657,23 @@ def initialize_reboot_cause(self): self.reboot_major_cause_dict = { 'reset_main_pwr_fail' : self.REBOOT_CAUSE_POWER_LOSS, 'reset_aux_pwr_or_ref' : self.REBOOT_CAUSE_POWER_LOSS, + 'reset_comex_pwr_fail' : self.REBOOT_CAUSE_POWER_LOSS, 'reset_asic_thermal' : self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC, + 'reset_comex_thermal' : self.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU, 'reset_hotswap_or_wd' : self.REBOOT_CAUSE_WATCHDOG, + 'reset_comex_wd' : self.REBOOT_CAUSE_WATCHDOG, 'reset_swb_wd' : self.REBOOT_CAUSE_WATCHDOG, - 'reset_sff_wd' : self.REBOOT_CAUSE_WATCHDOG - } - self.reboot_minor_cause_dict = { - 'reset_fw_reset' : "Reset by ASIC firmware", - 'reset_long_pb' : "Reset by long press on power button", - 'reset_short_pb' : "Reset by short press on power button", - 'reset_comex_thermal' : "ComEx thermal shutdown", - 'reset_comex_pwr_fail' : "ComEx power fail", - 'reset_comex_wd' : "Reset requested from ComEx", - 'reset_from_asic' : "Reset requested from ASIC", - 'reset_reload_bios' : "Reset caused by BIOS reload", - 'reset_hotswap_or_halt' : "Reset caused by hotswap or halt", - 'reset_from_comex' : "Reset from ComEx", - 'reset_voltmon_upgrade_fail': "Reset due to voltage monitor devices upgrade failure" + 'reset_sff_wd' : self.REBOOT_CAUSE_WATCHDOG, + 'reset_hotswap_or_halt' : self.REBOOT_CAUSE_HARDWARE_OTHER, + 'reset_voltmon_upgrade_fail': self.REBOOT_CAUSE_HARDWARE_OTHER, + 'reset_reload_bios' : self.REBOOT_CAUSE_HARDWARE_BIOS, + 'reset_from_comex' : self.REBOOT_CAUSE_HARDWARE_CPU, + 'reset_fw_reset' : self.REBOOT_CAUSE_HARDWARE_RESET_FROM_ASIC, + 'reset_from_asic' : self.REBOOT_CAUSE_HARDWARE_RESET_FROM_ASIC, + 'reset_long_pb' : self.REBOOT_CAUSE_HARDWARE_BUTTON, + 'reset_short_pb' : self.REBOOT_CAUSE_HARDWARE_BUTTON } + self.reboot_minor_cause_dict = {} self.reboot_by_software = 'reset_sw_reset' self.reboot_cause_initialized = True From dd243c1024d99277e5484000d8019ded4e7b8570 Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Mon, 18 Apr 2022 15:19:22 -0700 Subject: [PATCH 228/817] Changes to support topology and port speed agnostic switch init for TD3 based platforms (#10587) --- .../Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm | 2 +- .../td3-a7050cx3-32s-48x50G+8x100G.config.bcm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm index 22088621cef1..3b37d661f403 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm @@ -52,7 +52,7 @@ stable_size=0x5500000 tdma_timeout_usec=15000000 tslam_timeout_usec=15000000 sai_optimized_mmu=1 -mmu_init_config="TD3-MSFT-T0-100G" +mmu_init_config="TD3-MSFT-CUSTOM" buf.map.egress_pool0.ingress_pool=0 buf.map.egress_pool1.ingress_pool=0 buf.map.egress_pool2.ingress_pool=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm index aaad28895942..267b3bb81a9a 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm @@ -52,7 +52,7 @@ stable_size=0x5500000 tdma_timeout_usec=15000000 tslam_timeout_usec=15000000 sai_optimized_mmu=1 -mmu_init_config="TD3-MSFT-T0-50G" +mmu_init_config="TD3-MSFT-CUSTOM" buf.map.egress_pool0.ingress_pool=0 buf.map.egress_pool1.ingress_pool=0 buf.map.egress_pool2.ingress_pool=1 From 0a99f87becc0d1ab2a0454c4d8a678a601c86a20 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Tue, 19 Apr 2022 10:32:01 +0800 Subject: [PATCH 229/817] [ci] Update common lib pipeline to build more distribute packages. (#10576) --- .azure-pipelines/template-commonlib.yml | 40 ++++++++++++++----------- .azure-pipelines/template-variables.yml | 1 + 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.azure-pipelines/template-commonlib.yml b/.azure-pipelines/template-commonlib.yml index 0e42cb4e17ac..61a801e3f526 100644 --- a/.azure-pipelines/template-commonlib.yml +++ b/.azure-pipelines/template-commonlib.yml @@ -2,33 +2,39 @@ jobs: - job: Build timeoutInMinutes: 120 pool: sonicbld + variables: + - template: template-variables.yml steps: - checkout: self clean: true submodules: recursive - script: | set -ex - case $(Build.SourceBranchName) in - 202012 | 202106) - bldenv=buster - ;; - *) - bldenv=bullseye - ;; - esac - BLDENV=$bldenv make -f Makefile.work configure PLATFORM=vs ENABLE_DOCKER_BASE_PULL=y - echo "##vso[task.setvariable variable=bldenv;]$bldenv" + branch=$(Build.SourceBranchName) + # DIST_MASTER is set in variable. + BRANCH=DIST_${branch^^} + bldenvs=${!BRANCH} + [ "$bldenvs" == "" ] && bldenvs="$(COMMON_LIB_BUILD_ENVS)" + for bldenv in $bldenvs + do + BLDENV=$bldenv make -f Makefile.work configure PLATFORM=vs ENABLE_DOCKER_BASE_PULL=y + done + set +x + echo "##vso[task.setvariable variable=bldenvs;]$bldenvs" displayName: Make configure - script: | set -ex - LIBNL3_VERSION_BASE=$(grep "LIBNL3_VERSION_BASE =" rules/libnl3.mk | awk '{print$3}') - LIBNL3_VERSION=$(grep "LIBNL3_VERSION =" rules/libnl3.mk | awk '{print$3}' | sed -e "s/(//" -e "s/)//" -e "s/\\$//" -e "s/LIBNL3_VERSION_BASE/$LIBNL3_VERSION_BASE/") - BLDENV=$(bldenv) make -f Makefile.work target/debs/$(bldenv)/libnl-3-200_${LIBNL3_VERSION}_amd64.deb ENABLE_DOCKER_BASE_PULL=y + for bldenv in $(bldenvs) + do + LIBNL3_VERSION_BASE=$(grep "LIBNL3_VERSION_BASE =" rules/libnl3.mk | awk '{print$3}') + LIBNL3_VERSION=$(grep "LIBNL3_VERSION =" rules/libnl3.mk | awk '{print$3}' | sed -e "s/(//" -e "s/)//" -e "s/\\$//" -e "s/LIBNL3_VERSION_BASE/$LIBNL3_VERSION_BASE/") + SONIC_BUILD_JOBS=$(nproc) BLDENV=$bldenv make -f Makefile.work target/debs/$bldenv/libnl-3-200_${LIBNL3_VERSION}_amd64.deb ENABLE_DOCKER_BASE_PULL=y - LIBYANG_VERSION_BASE=$(grep "LIBYANG_VERSION_BASE =" rules/libyang.mk | awk '{print$3}') - LIBYANG_VERSION=$(grep "LIBYANG_VERSION =" rules/libyang.mk | awk '{print$3}' | sed -e "s/\\$//" -e "s/(//" -e "s/)//" -e "s/LIBYANG_VERSION_BASE/$LIBYANG_VERSION_BASE/") - BLDENV=$(bldenv) make -f Makefile.work target/debs/$(bldenv)/libyang_${LIBYANG_VERSION}_amd64.deb - find target -name *.deb | xargs -i cp {} $(Build.ArtifactStagingDirectory) + LIBYANG_VERSION_BASE=$(grep "LIBYANG_VERSION_BASE =" rules/libyang.mk | awk '{print$3}') + LIBYANG_VERSION=$(grep "LIBYANG_VERSION =" rules/libyang.mk | awk '{print$3}' | sed -e "s/\\$//" -e "s/(//" -e "s/)//" -e "s/LIBYANG_VERSION_BASE/$LIBYANG_VERSION_BASE/") + SONIC_BUILD_JOBS=$(nproc) BLDENV=$bldenv make -f Makefile.work target/debs/$bldenv/libyang_${LIBYANG_VERSION}_amd64.deb + done + mv target $(Build.ArtifactStagingDirectory) displayName: Make common lib packages - publish: $(Build.ArtifactStagingDirectory) artifact: common-lib diff --git a/.azure-pipelines/template-variables.yml b/.azure-pipelines/template-variables.yml index f28768e39efe..9f192d35bd5e 100644 --- a/.azure-pipelines/template-variables.yml +++ b/.azure-pipelines/template-variables.yml @@ -1,2 +1,3 @@ variables: DEFAULT_CONTAINER_REGISTRY: 'publicmirror.azurecr.io' + COMMON_LIB_BUILD_ENVS: 'bullseye' From 598ab994693886c33ce5fbba3f459c8f5dd998f5 Mon Sep 17 00:00:00 2001 From: Sachin Naik Date: Mon, 18 Apr 2022 22:23:15 -0700 Subject: [PATCH 230/817] secureboot: Enable signing SONiC kernel (#10557) Why I did it To sign SONiC kernel image and allow secure boot based system to verify SONiC image before loading into the system. How I did it Pass following parameter to rules/config.user Ex: SONIC_ENABLE_SECUREBOOT_SIGNATURE := y SIGNING_KEY := /path/to/key/private.key SIGNING_CERT := /path/to/public/public.cert How to verify it Secure boot enabled system enrolled with right public key of the, image in the platform UEFI database will able to verify image before load. Alternatively one can verify with offline sbsign tool as below. export SBSIGN_KEY=/abc/bcd/xyz/ sbverify --cert $SBSIGN_KEY/public_cert.cert fsroot-platform-XYZ/boot/vmlinuz-5.10.0-8-2-amd64 mage O/P: Signature verification OK --- Makefile.work | 12 ++++++++++++ build_debian.sh | 17 +++++++++++++++++ rules/config | 7 +++++++ slave.mk | 3 +++ sonic-slave-bullseye/Dockerfile.j2 | 1 + sonic-slave-buster/Dockerfile.j2 | 1 + 6 files changed, 41 insertions(+) diff --git a/Makefile.work b/Makefile.work index 8042de7d198b..a5ecab1ab58b 100644 --- a/Makefile.work +++ b/Makefile.work @@ -188,6 +188,17 @@ ifneq ($(SONIC_DPKG_CACHE_SOURCE),) DOCKER_RUN += -v "$(SONIC_DPKG_CACHE_SOURCE):/dpkg_cache:rw" endif +ifeq ($(SONIC_ENABLE_SECUREBOOT_SIGNATURE), y) +ifneq ($(SIGNING_KEY),) + DOCKER_SIGNING_SOURCE := $(shell dirname $(SIGNING_KEY)) + DOCKER_RUN += -v "$(DOCKER_SIGNING_SOURCE):$(DOCKER_SIGNING_SOURCE):ro" +endif +ifneq ($(SIGNING_CERT),) + DOCKER_SIGNING_SOURCE := $(shell dirname $(SIGNING_CERT)) + DOCKER_RUN += -v "$(DOCKER_SIGNING_SOURCE):$(DOCKER_SIGNING_SOURCE):ro" +endif +endif + ifeq ($(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD), y) ifneq ($(MULTIARCH_QEMU_ENVIRON), y) DOCKER_RUN += -v /var/run/docker.sock:/var/run/docker.sock @@ -295,6 +306,7 @@ SONIC_BUILD_INSTRUCTION := make \ EXTRA_DOCKER_TARGETS=$(EXTRA_DOCKER_TARGETS) \ BUILD_LOG_TIMESTAMP=$(BUILD_LOG_TIMESTAMP) \ SONIC_ENABLE_IMAGE_SIGNATURE=$(ENABLE_IMAGE_SIGNATURE) \ + SONIC_ENABLE_SECUREBOOT_SIGNATURE=$(SONIC_ENABLE_SECUREBOOT_SIGNATURE) \ SONIC_DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ ENABLE_HOST_SERVICE_ON_START=$(ENABLE_HOST_SERVICE_ON_START) \ SLAVE_DIR=$(SLAVE_DIR) \ diff --git a/build_debian.sh b/build_debian.sh index 6dbbaa8cf770..f2f7db2b97f2 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -143,6 +143,23 @@ if [[ $CONFIGURED_ARCH == amd64 ]]; then sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install dmidecode hdparm fi +## Sign the Linux kernel +if [ "$SONIC_ENABLE_SECUREBOOT_SIGNATURE" = "y" ]; then + if [ ! -f $SIGNING_KEY ]; then + echo "Error: SONiC linux kernel signing key missing" + exit 1 + fi + if [ ! -f $SIGNING_CERT ]; then + echo "Error: SONiC linux kernel signing certificate missing" + exit 1 + fi + + echo '[INFO] Signing SONiC linux kernel image' + K=$FILESYSTEM_ROOT/boot/vmlinuz-${LINUX_KERNEL_VERSION}-amd64 + sbsign --key $SIGNING_KEY --cert $SIGNING_CERT --output /tmp/${K##*/} ${K} + sudo cp -f /tmp/${K##*/} ${K} +fi + ## Update initramfs for booting with squashfs+overlay cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null diff --git a/rules/config b/rules/config index fe5d7ac3e991..c51fcd84832c 100644 --- a/rules/config +++ b/rules/config @@ -180,6 +180,13 @@ K8s_GCR_IO_PAUSE_VERSION = 3.4.1 # The relative path is build root folder. SONIC_ENABLE_IMAGE_SIGNATURE ?= n +# SONIC_ENABLE_SECUREBOOT_SIGNATURE - enable SONiC kernel signing to support UEFI secureboot +# To support UEFI secureboot chain of trust requires EFI kernel to be signed as a PE binary +# SIGNING_KEY = +# SIGNING_CERT = +# The absolute path should be provided. +SONIC_ENABLE_SECUREBOOT_SIGNATURE ?= n + # PACKAGE_URL_PREFIX - the package url prefix PACKAGE_URL_PREFIX ?= https://packages.trafficmanager.net/public/packages diff --git a/slave.mk b/slave.mk index 185574e61808..17ee8d8ac8de 100644 --- a/slave.mk +++ b/slave.mk @@ -1176,6 +1176,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ TARGET_PATH=$(TARGET_PATH) \ SONIC_ENFORCE_VERSIONS=$(SONIC_ENFORCE_VERSIONS) \ TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) \ + SONIC_ENABLE_SECUREBOOT_SIGNATURE="$(SONIC_ENABLE_SECUREBOOT_SIGNATURE)" \ + SIGNING_KEY="$(SIGNING_KEY)" \ + SIGNING_CERT="$(SIGNING_CERT)" \ PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ ./build_debian.sh $(LOG) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 9a47b48ab93f..2c3224999a19 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -117,6 +117,7 @@ RUN apt-get update && apt-get install -y \ devscripts \ quilt \ stgit \ + sbsigntool \ # For platform-modules build module-assistant \ # For thrift build\ diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 269501fb2e47..401f032725cf 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -125,6 +125,7 @@ RUN apt-get update && apt-get install -y \ devscripts \ quilt \ stgit \ + sbsigntool \ # For platform-modules build module-assistant \ # For thrift build\ From 330777e795ea481c2350e42a2befb25904d157de Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 19 Apr 2022 12:22:16 -0400 Subject: [PATCH 231/817] Image build time improvements (#10104) * [build]: Patch debootstrap to not unmount the host's /proc filesystem Currently, when the final image is being built (sonic-vs.img.gz, sonic-broadcom.bin, or similar), each invocation of sudo in the build_debian.sh script takes 0.8 seconds to run and execute the actual command. This is because the /proc filesystem in the slave container has been unmounted somehow. This is happening when debootstrap is running, and it incorrectly unmounts the host's (in our case, the slave container's) /proc filesystem because in the new image being built, /proc is a symlink to the host's (the slave container's) /proc. Because of that, /proc is gone, and each invocation of sudo adds 0.8 seconds overhead. As a side effect, docker exec into the slave container during this time will fail, because /proc/self/fd doesn't exist anymore, and docker exec assumes that that exists. Debootstrap has fixed this in 1.0.124 and newer, so backport the patch that fixes this into the version that Bullseye has. Signed-off-by: Saikrishna Arcot * [build_debian.sh]: Use eatmydata to speed up deb package installations During package installations, dpkg calls fsync multiples times (for each package) to ensure that tht efiles are written to disk, so that if there's some system crash during package installation, then it is in at least a somewhat recoverable state. For our use case though, we're installing packages in a chroot in fsroot-* from a slave container and then packaging it into an image. If there were a system crash (or even if docker crashed), the fsroot-* directory would first be removed, and the process would get restarted. This means that the fsync calls aren't really needed for our use case. The eatmydata package includes a library that will block/suppress the use of fsync (and similar) system calls from applications and will instead just return success, so that the application is not blocked on disk writes, which can instead happen in the background instead as necessary. If dpkg is run with this library, then the fsync calls that it does will have no effect. Therefore, install the eatmydata package at the beginning of build_debian.sh and have dpkg be run under eatmydata for almost all package installations/removals. At the end of the installation, remove it, so that the final image uses dpkg as normal. In my testing, this saves about 2-3 minutes from the image build time. Signed-off-by: Saikrishna Arcot * Change ln syntax to use chroot Signed-off-by: Saikrishna Arcot --- build_debian.sh | 10 ++++++++++ rules/debootstrap.dep | 10 ++++++++++ rules/debootstrap.mk | 9 +++++++++ slave.mk | 1 + src/debootstrap/.gitignore | 3 +++ src/debootstrap/Makefile | 24 ++++++++++++++++++++++ src/debootstrap/proc-mount.patch | 34 ++++++++++++++++++++++++++++++++ 7 files changed, 91 insertions(+) create mode 100644 rules/debootstrap.dep create mode 100644 rules/debootstrap.mk create mode 100644 src/debootstrap/.gitignore create mode 100644 src/debootstrap/Makefile create mode 100644 src/debootstrap/proc-mount.patch diff --git a/build_debian.sh b/build_debian.sh index f2f7db2b97f2..b3d692cdb28c 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -113,6 +113,12 @@ sudo cp files/apt/apt.conf.d/{81norecommends,apt-{clean,gzip-indexes,no-language ## Note: set lang to prevent locale warnings in your chroot sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y update sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y upgrade + +echo '[INFO] Install and setup eatmydata' +sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install eatmydata +sudo LANG=C chroot $FILESYSTEM_ROOT ln -s /usr/bin/eatmydata /usr/local/bin/dpkg +echo 'Dir::Bin::dpkg "/usr/local/bin/dpkg";' | sudo tee $FILESYSTEM_ROOT/etc/apt/apt.conf.d/00image-install-eatmydata > /dev/null + echo '[INFO] Install packages for building image' sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install makedev psmisc @@ -586,6 +592,10 @@ scripts/collect_host_image_version_files.sh $TARGET_PATH $FILESYSTEM_ROOT # Remove GCC sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y remove gcc +# Remove eatmydata +sudo rm $FILESYSTEM_ROOT/etc/apt/apt.conf.d/00image-install-eatmydata $FILESYSTEM_ROOT/usr/local/bin/dpkg +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y remove eatmydata + ## Clean up apt sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y autoremove sudo LANG=C chroot $FILESYSTEM_ROOT apt-get autoclean diff --git a/rules/debootstrap.dep b/rules/debootstrap.dep new file mode 100644 index 000000000000..82ca11d7e4df --- /dev/null +++ b/rules/debootstrap.dep @@ -0,0 +1,10 @@ + +SPATH := $($(DEBOOTSTRAP)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/debootstrap.mk rules/debootstrap.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(SPATH)) + +$(DEBOOTSTRAP)_CACHE_MODE := GIT_CONTENT_SHA +$(DEBOOTSTRAP)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DEBOOTSTRAP)_DEP_FILES := $(DEP_FILES) + diff --git a/rules/debootstrap.mk b/rules/debootstrap.mk new file mode 100644 index 000000000000..dc60599d5f3f --- /dev/null +++ b/rules/debootstrap.mk @@ -0,0 +1,9 @@ +# debootstrap package + +DEBOOTSTRAP_VERSION = 1.0.123 + +export DEBOOTSTRAP_VERSION + +DEBOOTSTRAP = debootstrap_$(DEBOOTSTRAP_VERSION)_all.deb +$(DEBOOTSTRAP)_SRC_PATH = $(SRC_PATH)/debootstrap +SONIC_MAKE_DEBS += $(DEBOOTSTRAP) diff --git a/slave.mk b/slave.mk index 17ee8d8ac8de..a68a08fcd56a 100644 --- a/slave.mk +++ b/slave.mk @@ -992,6 +992,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) \ $$(addprefix $(TARGET_PATH)/,$$(SONIC_PACKAGES_LOCAL)) \ $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) \ + $(addsuffix -install,$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(DEBOOTSTRAP))) \ $(if $(findstring y,$(ENABLE_ZTP)),$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(SONIC_ZTP))) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES_PY3)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY2)) \ diff --git a/src/debootstrap/.gitignore b/src/debootstrap/.gitignore new file mode 100644 index 000000000000..2aa8324ad667 --- /dev/null +++ b/src/debootstrap/.gitignore @@ -0,0 +1,3 @@ +debootstrap*.udeb +debootstrap*.dsc +debootstrap-*/ diff --git a/src/debootstrap/Makefile b/src/debootstrap/Makefile new file mode 100644 index 000000000000..04e8646a1b2e --- /dev/null +++ b/src/debootstrap/Makefile @@ -0,0 +1,24 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = debootstrap_$(DEBOOTSTRAP_VERSION)_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Remove any stale files + rm -rf ./debootstrap-$(DEBOOTSTRAP_VERSION) ./debootstrap*.{deb,udeb,dsc} + + # Get source package + dget https://deb.debian.org/debian/pool/main/d/debootstrap/debootstrap_$(DEBOOTSTRAP_VERSION).dsc + + # Build source and Debian packages + pushd debootstrap-$(DEBOOTSTRAP_VERSION) + patch -p1 -i ../proc-mount.patch + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) + popd + + # Move the newly-built .deb packages to the destination directory + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) + diff --git a/src/debootstrap/proc-mount.patch b/src/debootstrap/proc-mount.patch new file mode 100644 index 000000000000..93084576490a --- /dev/null +++ b/src/debootstrap/proc-mount.patch @@ -0,0 +1,34 @@ +From 87cdebbcad6f4e16ba711227cbbbd70039f88752 Mon Sep 17 00:00:00 2001 +From: YunQiang Su +Date: Mon, 7 Sep 2020 09:29:37 +0800 +Subject: [PATCH] stage1: re-mkdir /proc instead of umount if it is a symlink + +In docker, the TARGET/proc will be a symlink to /proc. +And if the docker instance is called with --privileged, it will umount +the /proc of the whole instance in setup_proc. +--- + debian/changelog | 3 +++ + functions | 7 ++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/functions b/functions +index 1ac63f7..065320d 100644 +--- a/functions ++++ b/functions +@@ -1183,7 +1183,12 @@ setup_proc () { + umount_on_exit /dev/shm + umount_on_exit /proc + umount_on_exit /proc/bus/usb +- umount "$TARGET/proc" 2>/dev/null || true ++ if [ -L "$TARGET/proc" ];then ++ rm -f $TARGET/proc ++ mkdir $TARGET/proc ++ else ++ umount "$TARGET/proc" 2>/dev/null || true ++ fi + + # some container environment are used at second-stage, it already treats /proc and so on + if [ -z "$(ls -A "$TARGET/proc")" ]; then +-- +GitLab + From 8b5d908c928d45ffa406343e16aaab71f45a81b2 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Tue, 19 Apr 2022 09:27:45 -0700 Subject: [PATCH 232/817] Upgrade mux container to Bullseye (#10498) sign-off: Jing Zhang zhangjing@microsoft.com #### Why I did it As part of the process moving containers from buster to bullseye. #### How I did it 1. change base image from buster to bullseye. 2. remove unused addition to orchagent run options #### How to verify it Tested building locally. --- dockers/docker-mux/Dockerfile.j2 | 2 +- rules/docker-mux.mk | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/dockers/docker-mux/Dockerfile.j2 b/dockers/docker-mux/Dockerfile.j2 index 66ec315f0809..f7e1ee3b4454 100755 --- a/dockers/docker-mux/Dockerfile.j2 +++ b/dockers/docker-mux/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-bullseye ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/rules/docker-mux.mk b/rules/docker-mux.mk index 31c3212ea11f..cbdc1c06510d 100644 --- a/rules/docker-mux.mk +++ b/rules/docker-mux.mk @@ -7,12 +7,12 @@ DOCKER_MUX_DBG = $(DOCKER_MUX_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_MUX)_PATH = $(DOCKERS_PATH)/$(DOCKER_MUX_STEM) $(DOCKER_MUX)_DEPENDS = $(SONIC_LINKMGRD) $(LIBSWSSCOMMON) $(LIBHIREDIS) -$(DOCKER_MUX)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_MUX)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_MUX)_DBG_DEPENDS += $(SONIC_LINKMGRD_DBG) $(LIBSWSSCOMMON_DBG) $(LIBHIREDIS_DBG) -$(DOCKER_MUX)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_MUX)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_MUX)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_MUX)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_MUX)_VERSION = 1.0.0 $(DOCKER_MUX)_PACKAGE_NAME = mux @@ -32,8 +32,4 @@ endif $(DOCKER_MUX)_CONTAINER_NAME = mux $(DOCKER_MUX)_RUN_OPT += --privileged -t $(DOCKER_MUX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro -$(DOCKER_ORCHAGENT)_RUN_OPT += -v /var/log/mux:/var/log/mux:rw $(DOCKER_MUX)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) - -SONIC_BUSTER_DOCKERS += $(DOCKER_MUX) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_MUX_DBG) From 936d93cbcd25b3997f38f4278eae8d0db012c258 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 19 Apr 2022 15:47:07 -0700 Subject: [PATCH 233/817] Fix tagged VlanInterface if attached to multiple vlan as untagged member (#8927) #### Why I did it Fix several bugs: 1. If one vlan member belongs to multiple vlans, and if any of the vlans is "Tagged" type, we respect the tagged type 2. If one vlan member belongs to multiple vlans, and all of the vlans have no "Tagged" type, we override it to be a tagged member 3. make sure `vlantype_name` is assigned correctly in each iteration #### How to verify it 1. Test the command line to parse a minigraph and make sure the output does not change. ``` ./sonic-cfggen -m minigraph.mlnx20.xml ``` The minigraph is for HwSKU Mellanox-SN2700-D40C8S8. 2. Test on a DUT with HwSKU Mellanox-SN2700-D40C8S8 ``` sudo config load_minigraph show vlan brief ``` Checked the "Port Tagging" column in the output. --- src/sonic-config-engine/minigraph.py | 22 +++++++++++------ .../tests/sample-graph-resource-type.xml | 9 +++++++ .../tests/sample-graph-subintf.xml | 8 +++++++ .../tests/simple-sample-graph.xml | 9 +++++++ src/sonic-config-engine/tests/test_cfggen.py | 24 +++++++++++++++---- 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index b4f1f3acbd7a..35a6f564568f 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -536,28 +536,36 @@ def parse_dpg(dpg, hname): vlan_members = {} vlan_member_list = {} dhcp_relay_table = {} - vlantype_name = "" - intf_vlan_mbr = defaultdict(list) + # Dict: vlan member (port/PortChannel) -> set of VlanID, in which the member if an untagged vlan member + untagged_vlan_mbr = defaultdict(set) for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): vlanid = vintf.find(str(QName(ns, "VlanID"))).text + vlantype = vintf.find(str(QName(ns, "Type"))) + if vlantype is None: + vlantype_name = "" + else: + vlantype_name = vlantype.text vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text vmbr_list = vintfmbr.split(';') - for i, member in enumerate(vmbr_list): - intf_vlan_mbr[member].append(vlanid) + if vlantype_name != "Tagged": + for member in vmbr_list: + untagged_vlan_mbr[member].add(vlanid) for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): vintfname = vintf.find(str(QName(ns, "Name"))).text vlanid = vintf.find(str(QName(ns, "VlanID"))).text vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text vlantype = vintf.find(str(QName(ns, "Type"))) - if vlantype != None: - vlantype_name = vintf.find(str(QName(ns, "Type"))).text + if vlantype is None: + vlantype_name = "" + else: + vlantype_name = vlantype.text vmbr_list = vintfmbr.split(';') for i, member in enumerate(vmbr_list): vmbr_list[i] = port_alias_map.get(member, member) sonic_vlan_member_name = "Vlan%s" % (vlanid) if vlantype_name == "Tagged": vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'tagged'} - elif len(intf_vlan_mbr[member]) > 1: + elif len(untagged_vlan_mbr[member]) > 1: vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'tagged'} else: vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'untagged'} diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index 9ba4f1e70267..62c2dfd64f3b 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -190,6 +190,14 @@ 1000 192.168.0.0/27 + + ab4 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1001 + 1001 + 192.168.0.32/27 + kk1 fortyGigE0/12 @@ -205,6 +213,7 @@ 192.0.0.1;192.0.0.2 2000 2000 + Tagged 192.168.0.240/27 diff --git a/src/sonic-config-engine/tests/sample-graph-subintf.xml b/src/sonic-config-engine/tests/sample-graph-subintf.xml index d5fd2d461c8a..a23b668c2c2f 100644 --- a/src/sonic-config-engine/tests/sample-graph-subintf.xml +++ b/src/sonic-config-engine/tests/sample-graph-subintf.xml @@ -208,6 +208,14 @@ 1000 192.168.0.0/27 + + ab4 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1001 + 1001 + 192.168.0.32/27 + kk1 fortyGigE0/12 diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index a8bd8b0b4685..8d7800686c7a 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -190,6 +190,14 @@ 1000 192.168.0.0/27 + + ab4 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1001 + 1001 + 192.168.0.32/27 + kk1 fortyGigE0/12 @@ -205,6 +213,7 @@ 192.0.0.1;192.0.0.2 2000 2000 + Tagged 192.168.0.240/27 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index e1f6844dd5f2..29773dffc628 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -151,6 +151,7 @@ def test_var_json_data(self, **kwargs): utils.to_dict(output.strip()), utils.to_dict( '{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "tagged"\n },' + ' \n "Vlan1001|Ethernet8": {\n "tagging_mode": "tagged"\n },' ' \n "Vlan2000|Ethernet12": {\n "tagging_mode": "tagged"\n },' ' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "tagged"\n },' ' \n "Vlan2020|Ethernet12": {\n "tagging_mode": "tagged"\n }\n}' @@ -160,9 +161,10 @@ def test_var_json_data(self, **kwargs): self.assertEqual( utils.to_dict(output.strip()), utils.to_dict( - '{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "untagged"\n },' + '{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "tagged"\n },' + ' \n "Vlan1001|Ethernet8": {\n "tagging_mode": "tagged"\n },' ' \n "Vlan2000|Ethernet12": {\n "tagging_mode": "tagged"\n },' - ' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "tagged"\n },' + ' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "untagged"\n },' ' \n "Vlan2020|Ethernet12": {\n "tagging_mode": "tagged"\n }\n}' ) ) @@ -249,6 +251,7 @@ def test_minigraph_vlans(self, **kwargs): utils.to_dict(output.strip()), utils.to_dict( "{'Vlan1000': {'alias': 'ab1', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '1000'}, " + "'Vlan1001': {'alias': 'ab4', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '1001'}," "'Vlan2001': {'alias': 'ab3', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2001'}," "'Vlan2000': {'alias': 'ab2', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2000'}," "'Vlan2020': {'alias': 'kk1', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2020'}}" @@ -265,6 +268,7 @@ def test_minigraph_vlan_members(self, **kwargs): utils.to_dict(output.strip()), utils.to_dict( "{('Vlan2000', 'Ethernet12'): {'tagging_mode': 'tagged'}, " + "('Vlan1001', 'Ethernet8'): {'tagging_mode': 'tagged'}, " "('Vlan1000', 'Ethernet8'): {'tagging_mode': 'tagged'}, " "('Vlan2020', 'Ethernet12'): {'tagging_mode': 'tagged'}, " "('Vlan2001', 'Ethernet12'): {'tagging_mode': 'tagged'}}" @@ -275,9 +279,10 @@ def test_minigraph_vlan_members(self, **kwargs): utils.to_dict(output.strip()), utils.to_dict( "{('Vlan2000', 'Ethernet12'): {'tagging_mode': 'tagged'}, " - "('Vlan1000', 'Ethernet8'): {'tagging_mode': 'untagged'}, " + "('Vlan1000', 'Ethernet8'): {'tagging_mode': 'tagged'}, " + "('Vlan1001', 'Ethernet8'): {'tagging_mode': 'tagged'}, " "('Vlan2020', 'Ethernet12'): {'tagging_mode': 'tagged'}, " - "('Vlan2001', 'Ethernet12'): {'tagging_mode': 'tagged'}}" + "('Vlan2001', 'Ethernet12'): {'tagging_mode': 'untagged'}}" ) ) @@ -704,6 +709,9 @@ def test_minigraph_bgp_voq_chassis_peer(self): def test_minigraph_sub_port_interfaces(self, check_stderr=True): self.verify_sub_intf(check_stderr=check_stderr) + def test_minigraph_sub_port_intf_resource_type_non_backend_tor(self, check_stderr=True): + self.verify_sub_intf_non_backend_tor(graph_file=self.sample_resource_graph, check_stderr=check_stderr) + def test_minigraph_sub_port_intf_resource_type(self, check_stderr=True): self.verify_sub_intf(graph_file=self.sample_resource_graph, check_stderr=check_stderr) @@ -737,6 +745,14 @@ def verify_no_vlan_member(self): output = self.run_script(argument) self.assertEqual(output.strip(), "{}") + def verify_sub_intf_non_backend_tor(self, **kwargs): + graph_file = kwargs.get('graph_file', self.sample_graph_simple) + + # All the other tables stay unchanged + self.test_var_json_data(graph_file=graph_file) + self.test_minigraph_vlans(graph_file=graph_file) + self.test_minigraph_vlan_members(graph_file=graph_file) + def verify_sub_intf(self, **kwargs): graph_file = kwargs.get('graph_file', self.sample_graph_simple) check_stderr = kwargs.get('check_stderr', True) From d853c9c747f92db81d2eea806d8e6fe5a4a466a1 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Wed, 20 Apr 2022 08:25:35 +0800 Subject: [PATCH 234/817] Update submodule sonic-swss-common (#10611) Signed-off-by: bingwang --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index a7118f259a8b..c34a4e1cc733 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit a7118f259a8be93ec802c77ecf3018cd403ad8dc +Subproject commit c34a4e1cc7332fd7368239206a097478fa1dcc90 From 128d762af36f4f5b7e42915aea2ffdc81739cb58 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Wed, 20 Apr 2022 19:02:49 +0800 Subject: [PATCH 235/817] [gearbox] Add peer gbsyncd for swss if gearbox exists (#10504) Fix the issues #10501 and #9733 If having gearbox, we need: * add gbsyncd as a peer since swss also has dependency on gbsyncd * add service gbsyncd to FEATURE table if it is missing --- files/scripts/gbsyncd.sh | 6 +- files/scripts/swss.sh | 57 +++++++++++++------ .../docker-gbsyncd-credo/supervisord.conf.j2 | 8 +++ 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/files/scripts/gbsyncd.sh b/files/scripts/gbsyncd.sh index 512ceed2d747..0990de5d8257 100755 --- a/files/scripts/gbsyncd.sh +++ b/files/scripts/gbsyncd.sh @@ -3,7 +3,11 @@ . /usr/local/bin/syncd_common.sh function startplatform() { - : + # Add gbsyncd to FEATURE table, if not in. It did have same config as syncd. + if [ -z $($SONIC_DB_CLI CONFIG_DB HGET 'FEATURE|gbsyncd' state) ]; then + local CMD="local r=redis.call('DUMP', KEYS[1]); redis.call('RESTORE', KEYS[2], 0, r)" + $SONIC_DB_CLI CONFIG_DB EVAL "$CMD" 2 'FEATURE|syncd' 'FEATURE|gbsyncd' + fi } function waitplatform() { diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 4f8f1b1af054..40acaa33c573 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -112,11 +112,13 @@ start_peer_and_dependent_services() { check_warm_boot if [[ x"$WARM_BOOT" != x"true" ]]; then - if [[ ! -z $DEV ]]; then - /bin/systemctl start ${PEER}@$DEV - else - /bin/systemctl start ${PEER} - fi + for peer in ${PEER}; do + if [[ ! -z $DEV ]]; then + /bin/systemctl start ${peer}@$DEV + else + /bin/systemctl start ${peer} + fi + done for dep in ${DEPENDENT}; do /bin/systemctl start ${dep} done @@ -143,11 +145,13 @@ stop_peer_and_dependent_services() { for dep in ${DEPENDENT}; do /bin/systemctl stop ${dep} done - if [[ ! -z $DEV ]]; then - /bin/systemctl stop ${PEER}@$DEV - else - /bin/systemctl stop ${PEER} - fi + for peer in ${PEER}; do + if [[ ! -z $DEV ]]; then + /bin/systemctl stop ${peer}@$DEV + else + /bin/systemctl stop ${peer} + fi + done fi } @@ -207,11 +211,18 @@ wait() { # NOTE: This assumes Docker containers share the same names as their # corresponding services for SECS in {1..60}; do - if [[ ! -z $DEV ]]; then - RUNNING=$(docker inspect -f '{{.State.Running}}' ${PEER}$DEV) - else - RUNNING=$(docker inspect -f '{{.State.Running}}' ${PEER}) - fi + ALL_PEERS_RUNNING=true + for peer in ${PEER}; do + if [[ ! -z $DEV ]]; then + RUNNING=$(docker inspect -f '{{.State.Running}}' ${peer}$DEV) + else + RUNNING=$(docker inspect -f '{{.State.Running}}' ${peer}) + fi + if [[ x"$RUNNING" != x"true" ]]; then + ALL_PEERS_RUNNING=false + break + fi + done ALL_DEPS_RUNNING=true for dep in ${MULTI_INST_DEPENDENT}; do if [[ ! -z $DEV ]]; then @@ -225,7 +236,7 @@ wait() { fi done - if [[ x"$RUNNING" == x"true" && x"$ALL_DEPS_RUNNING" == x"true" ]]; then + if [[ x"$ALL_PEERS_RUNNING" == x"true" && x"$ALL_DEPS_RUNNING" == x"true" ]]; then break else sleep 1 @@ -243,7 +254,7 @@ wait() { done if [[ ! -z $DEV ]]; then - /usr/bin/docker-wait-any -s ${SERVICE}$DEV -d ${PEER}$DEV ${ALL_DEPS} + /usr/bin/docker-wait-any -s ${SERVICE}$DEV -d `printf "%s$DEV " ${PEER}` ${ALL_DEPS} else /usr/bin/docker-wait-any -s ${SERVICE} -d ${PEER} ${ALL_DEPS} fi @@ -283,6 +294,17 @@ stop() { stop_peer_and_dependent_services } +function check_peer_gbsyncd() +{ + PLATFORM=`$SONIC_DB_CLI CONFIG_DB hget 'DEVICE_METADATA|localhost' platform` + HWSKU=`$SONIC_DB_CLI CONFIG_DB hget 'DEVICE_METADATA|localhost' hwsku` + GEARBOX_CONFIG=/usr/share/sonic/device/$PLATFORM/$HWSKU/$DEV/gearbox_config.json + + if [ -f $GEARBOX_CONFIG ]; then + PEER="$PEER gbsyncd" + fi +} + if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace SONIC_DB_CLI="sonic-db-cli -n $NET_NS" @@ -291,6 +313,7 @@ else SONIC_DB_CLI="sonic-db-cli" fi +check_peer_gbsyncd read_dependent_services case "$1" in diff --git a/platform/components/docker-gbsyncd-credo/supervisord.conf.j2 b/platform/components/docker-gbsyncd-credo/supervisord.conf.j2 index 6f12053ce236..01ef324450a9 100644 --- a/platform/components/docker-gbsyncd-credo/supervisord.conf.j2 +++ b/platform/components/docker-gbsyncd-credo/supervisord.conf.j2 @@ -10,6 +10,14 @@ autorestart=unexpected startretries=0 exitcodes=0,3 events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name gbsyncd +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 [program:rsyslogd] command=/usr/sbin/rsyslogd -n -iNONE From fb147764b5f7170532229577c29a20a10f3fec8f Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 20 Apr 2022 10:03:05 -0700 Subject: [PATCH 236/817] [Arista] Fix arista-net initramfs hook (#10624) The interface renaming logic fails if one interface is missing. Because of the `set -e` the whole initramfs hook would abort early on error. This change fixes the current behavior to make sure missing interfaces are properly skipped and ensure existing interface are renamed. --- files/initramfs-tools/arista-net | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/initramfs-tools/arista-net b/files/initramfs-tools/arista-net index 64308630098c..bfa4f8a6507c 100644 --- a/files/initramfs-tools/arista-net +++ b/files/initramfs-tools/arista-net @@ -47,7 +47,9 @@ arista_net_rename() { local new_name="$2" local from_name="$3" devname=$(arista_net_devname "$device_path" "$from_name") - [ -n "$devname" ] && ip link set "$devname" name "$new_name" + if [ -n "$devname" ]; then + ip link set "$devname" name "$new_name" + fi } # Sets the MAC address to the value passed by Aboot through /proc/cmdline From 122cb9069598e0798883538af923381c40f3ba8a Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Thu, 21 Apr 2022 01:36:22 +0530 Subject: [PATCH 237/817] Fix AS7726 not showing serial number in 'show platform summary' (#10489) (#10509) --- .../sonic_platform_pddf_base/pddf_chassis.py | 8 ++++---- .../sonic_platform_pddf_base/pddf_fan.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py index d90949184d5b..ef211b9933c4 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_chassis.py @@ -96,11 +96,11 @@ def get_model(self): """ return self._eeprom.part_number_str() - def get_serial(self): + def get_service_tag(self): """ - Retrieves the serial number of the chassis (Service tag) + Retrieves the service tag of the chassis Returns: - string: Serial number of chassis + string: Sevice tag of chassis """ return self._eeprom.serial_str() @@ -123,7 +123,7 @@ def get_base_mac(self): """ return self._eeprom.base_mac_addr() - def get_serial_number(self): + def get_serial(self): """ Retrieves the hardware serial number for the chassis diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py index 2a8ef46085c5..c0e95c896910 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_fan.py @@ -150,7 +150,7 @@ def get_speed(self): if output['status'].isalpha(): return 0 else: - speed = int(output['status']) + speed = int(float(output['status'])) max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED']) speed_percentage = round((speed*100)/max_speed) From 651ac2c840a224d100d1d0b58ad72d52e83ca01c Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 21 Apr 2022 08:12:28 +0800 Subject: [PATCH 238/817] [submodule] Update submodule for sonic-swss (#10623) Swss Commit update: 1fd1dbf Add support for route flow counter (https://github.com/Azure/sonic-buildimage/pull/2094) d8fadc6 [QoS] Resolve an issue in the sequence where a referenced object removed and then the referencing object deleting and then re-adding (https://github.com/Azure/sonic-buildimage/pull/2210) eaf7264 [macsecorch]: MACsec with pfc (https://github.com/Azure/sonic-buildimage/pull/2095) a32b611 [azp]: Reduce diff coverage to 50% threshhold (https://github.com/Azure/sonic-buildimage/issues/2227) 6301db7 [Code owner] Set owners for auto reviews (https://github.com/Azure/sonic-buildimage/issues/2229) d1fb3dd [BFD]Retry create BFD with different source UDP port on failure (https://github.com/Azure/sonic-buildimage/pull/2225) 53620f3 [orchagent] add & remove port counters dynamically each time port was added or removed (https://github.com/Azure/sonic-buildimage/pull/2019) cf216be Change ERR to Notice for tunnel term create fail (https://github.com/Azure/sonic-buildimage/pull/2219) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 50d5be2b399e..1fd1dbfe7eaa 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 50d5be2b399e9bcc43973f99d72d76e4effd8cc0 +Subproject commit 1fd1dbfe7eaaa52f1d7edbdd2bb88483f031fd5e From 926e698f0acd72b77c71fe378672e758bc4c8cc8 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 21 Apr 2022 09:00:53 +0800 Subject: [PATCH 239/817] [docker-macsec]: Fix the missing dependency of macsecmgrd in swss (#10618) Why I did it Missing the dependency of macsecmgrd in swss so that the MACsec feature cannot be enabled. How I did it Add SWSS dependency in docker-macsec.mk How to verify it Check the Azp of sonic-mgmt --- rules/docker-macsec.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/docker-macsec.mk b/rules/docker-macsec.mk index 7250f79f90cd..7bea7ef321b8 100644 --- a/rules/docker-macsec.mk +++ b/rules/docker-macsec.mk @@ -6,9 +6,9 @@ DOCKER_MACSEC_DBG = $(DOCKER_MACSEC_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_MACSEC)_PATH = $(DOCKERS_PATH)/$(DOCKER_MACSEC_STEM) -$(DOCKER_MACSEC)_DEPENDS += $(WPASUPPLICANT) $(LIBSWSSCOMMON) $(LIBNL3) $(LIBNL_GENL3) $(LIBNL_ROUTE3) +$(DOCKER_MACSEC)_DEPENDS += $(SWSS) $(WPASUPPLICANT) $(LIBSWSSCOMMON) $(LIBNL3) $(LIBNL_GENL3) $(LIBNL_ROUTE3) $(DOCKER_MACSEC)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) -$(DOCKER_MACSEC)_DBG_DEPENDS += $(WPASUPPLICANT_DBG) $(LIBSWSSCOMMON_DBG) +$(DOCKER_MACSEC)_DBG_DEPENDS += $(SWSS_DBG) $(WPASUPPLICANT_DBG) $(LIBSWSSCOMMON_DBG) $(DOCKER_MACSEC)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) From e24fe9bc60cfca4f60b1114c99f4b6eb7b453a05 Mon Sep 17 00:00:00 2001 From: yozhao101 <56170650+yozhao101@users.noreply.github.com> Date: Wed, 20 Apr 2022 18:08:06 -0700 Subject: [PATCH 240/817] [Monit] Fix the issue which shows Monit can not reset its counter. (#10288) Signed-off-by: Yong Zhao Why I did it This PR aims to fix the Monit issue which shows Monit can't reset its counter when monitoring memory usage of telemetry container. Specifically the Monit configuration file related to monitoring memory usage of telemetry container is as following: check program container_memory_telemetry with path "/usr/bin/memory_checker telemetry 419430400" if status == 3 for 10 times within 20 cycles then exec "/usr/bin/restart_service telemetry" If memory usage of telemetry container is larger than 400MB for 10 times within 20 cycles (minutes), then it will be restarted. Recently we observed, after telemetry container was restarted, its memory usage continuously increased from 400MB to 11GB within 1 hour, but it was not restarted anymore during this 1 hour sliding window. The reason is Monit can't reset its counter to count again and Monit can reset its counter if and only if the status of monitored service was changed from Status failed to Status ok. However, during this 1 hour sliding window, the status of monitored service was not changed from Status failed to Status ok. Currently for each service monitored by Monit, there will be an entry showing the monitoring status, monitoring mode etc. For example, the following output from command sudo monit status shows the status of monitored service to monitor memory usage of telemetry: Program 'container_memory_telemetry' status Status ok monitoring status Monitored monitoring mode active on reboot start last exit value 0 last output - data collected Sat, 19 Mar 2022 19:56:26 Every 1 minute, Monit will run the script to check the memory usage of telemetry and update the counter if memory usage is larger than 400MB. If Monit checked the counter and found memory usage of telemetry is larger than 400MB for 10 times within 20 minutes, then telemetry container was restarted. Following is an example status of monitored service: Program 'container_memory_telemetry' status Status failed monitoring status Monitored monitoring mode active on reboot start last exit value 0 last output - data collected Tue, 01 Feb 2022 22:52:55 After telemetry container was restarted. we found memory usage of telemetry increased rapidly from around 100MB to more than 400MB during 1 minute and status of monitored service did not have a chance to be changed from Status failed to Status ok. How I did it In order to provide a workaround for this issue, Monit recently introduced another syntax format repeat every cycles related to exec. This new syntax format will enable Monit repeat executing the background script if the error persists for a given number of cycles. How to verify it I verified this change on lab device str-s6000-acs-12. Another pytest PR (Azure/sonic-mgmt#5492) is submitted in sonic-mgmt repo for review. --- dockers/docker-sonic-telemetry/base_image_files/monit_telemetry | 2 +- files/image_config/monit/memory_checker | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dockers/docker-sonic-telemetry/base_image_files/monit_telemetry b/dockers/docker-sonic-telemetry/base_image_files/monit_telemetry index b3ba8b25fe1a..3941aecd4b0c 100644 --- a/dockers/docker-sonic-telemetry/base_image_files/monit_telemetry +++ b/dockers/docker-sonic-telemetry/base_image_files/monit_telemetry @@ -2,4 +2,4 @@ ## Monit configuration for telemetry container ############################################################################### check program container_memory_telemetry with path "/usr/bin/memory_checker telemetry 419430400" - if status == 3 for 10 times within 20 cycles then exec "/usr/bin/restart_service telemetry" + if status == 3 for 10 times within 20 cycles then exec "/usr/bin/restart_service telemetry" repeat every 2 cycles diff --git a/files/image_config/monit/memory_checker b/files/image_config/monit/memory_checker index 4f7912c1e56c..3cd0f2d80225 100755 --- a/files/image_config/monit/memory_checker +++ b/files/image_config/monit/memory_checker @@ -85,6 +85,8 @@ def check_memory_usage(container_name, threshold_value): if mem_usage_bytes > threshold_value: print("[{}]: Memory usage ({} Bytes) is larger than the threshold ({} Bytes)!" .format(container_name, mem_usage_bytes, threshold_value)) + syslog.syslog(syslog.LOG_INFO, "[{}]: Memory usage ({} Bytes) is larger than the threshold ({} Bytes)!" + .format(container_name, mem_usage_bytes, threshold_value)) sys.exit(3) else: syslog.syslog(syslog.LOG_ERR, "[memory_checker] Failed to retrieve memory value from '{}'" From 37e2848b3fab602e6ed94dca9c8d90a73925fd0a Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Wed, 20 Apr 2022 22:45:02 -0400 Subject: [PATCH 241/817] Update sonic-sairedis submodule (#10607) [sairedis submodule] commits: c7cbfe8 Update SAI submodule to support python 3.7 (#1035) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 2ddf41935696..c7cbfe80dfcb 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 2ddf419356964e4e745d5851cd76b8818cbb149f +Subproject commit c7cbfe80dfcb61deef483f6c99b1c21763134ab1 From 508dda6ad331b90cc679b0b3f59ac8068cd5c34c Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 21 Apr 2022 12:13:09 +0800 Subject: [PATCH 242/817] [Ci]: Support to sign image for cisco-8000 uefi secure boot (#10616) Why I did it [Ci]: Support to sign image for cisco-8000 uefi secure boot --- .../azure-pipelines-download-certificate.yml | 33 +++++++++++++++++++ .../official-build-cisco-8000.yml | 13 ++++++++ 2 files changed, 46 insertions(+) create mode 100644 .azure-pipelines/azure-pipelines-download-certificate.yml diff --git a/.azure-pipelines/azure-pipelines-download-certificate.yml b/.azure-pipelines/azure-pipelines-download-certificate.yml new file mode 100644 index 000000000000..3e1a58582f61 --- /dev/null +++ b/.azure-pipelines/azure-pipelines-download-certificate.yml @@ -0,0 +1,33 @@ +parameters: +- name: connectionName + type: string + default: sonic-dev-connection +- name: kevaultName + type: string + default: sonic-kv +- name: certificateName + type: string + default: sonic-secure-boot + +steps: +- task: AzureKeyVault@2 + inputs: + connectedServiceName: ${{ parameters.connectionName }} + keyVaultName: ${{ parameters.kevaultName }} + secretsFilter: ${{ parameters.certificateName }} + +- script: | + set -e + TMP_FILE=$(mktemp) + echo "$CERTIFICATE" | base64 -d > $TMP_FILE + sudo mkdir -p /etc/certificates + mkdir -p $(Build.StagingDirectory)/target + # Save the public key + openssl pkcs12 -in $TMP_FILE -clcerts --nokeys -nodes -passin pass: | sed -z -e "s/.*\(-----BEGIN CERTIFICATE\)/\1/" > $(SIGNING_CERT) + # Save the private key + openssl pkcs12 -in $TMP_FILE -nocerts -nodes -passin pass: | sed -z -e "s/.*\(-----BEGIN PRIVATE KEY\)/\1/" | sudo tee $(SIGNING_KEY) 1>/dev/null + ls -lt $(SIGNING_CERT) $(SIGNING_KEY) + rm $TMP_FILE + env: + CERTIFICATE: $(${{ parameters.certificateName }}) + displayName: "Save certificate" diff --git a/.azure-pipelines/official-build-cisco-8000.yml b/.azure-pipelines/official-build-cisco-8000.yml index 61b6b03171e3..474d3e743ff7 100644 --- a/.azure-pipelines/official-build-cisco-8000.yml +++ b/.azure-pipelines/official-build-cisco-8000.yml @@ -22,10 +22,17 @@ resources: name: Cisco-8000-sonic/platform-cisco-8000 endpoint: cisco-connection + variables: - group: SONIC-AKV-STROAGE-1 - name: StorageSASKey value: $(sonicstorage-SasToken) +- name: SONIC_ENABLE_SECUREBOOT_SIGNATURE + value: y +- name: SIGNING_KEY + value: /etc/certificates/sonic-secure-boot-private.pem +- name: SIGNING_CERT + value: $(Build.StagingDirectory)/target/sonic-secure-boot-public.pem stages: - stage: Build @@ -41,6 +48,7 @@ stages: parameters: buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' preSteps: + - template: azure-pipelines-download-certificate.yml - checkout: self submodules: recursive path: s @@ -90,5 +98,10 @@ stages: StorageSASKey: $(StorageSASKey) condition: ne(variables['Build.Reason'], 'PullRequest') displayName: "Override cisco sai packages" + - script: | + echo "SONIC_ENABLE_SECUREBOOT_SIGNATURE := y" >> rules/config.user + echo "SIGNING_KEY := $(SIGNING_KEY)" >> rules/config.user + echo "SIGNING_CERT := $(SIGNING_CERT)" >> rules/config.user + displayName: "Enable secure boot signature" jobGroups: - name: cisco-8000 From ea38864235d3492e90910e5326c99990335c2580 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 21 Apr 2022 13:14:59 -0700 Subject: [PATCH 243/817] [Arista] Update platform submodules (#10561) Update PikeZ platform definition Improve powercycle behavior on chassis --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index da8370423b07..9b61f8bdbe65 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit da8370423b07c9271fad515c9ef1fd6149abbeed +Subproject commit 9b61f8bdbe657e8798bc40c09039a6e0a7f5d150 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index da8370423b07..9b61f8bdbe65 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit da8370423b07c9271fad515c9ef1fd6149abbeed +Subproject commit 9b61f8bdbe657e8798bc40c09039a6e0a7f5d150 From 37debbeb382d64f6f7e59ea8c9f32816b9a69762 Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Thu, 21 Apr 2022 18:43:16 -0700 Subject: [PATCH 244/817] [CG-Fix-CVE-2021-44906] Patching on thrift.0.14.1 for package minimist (#10555) * [CG-Fix-CVE-2021-44906] Patching on thrift.0.14.1 for package minimist Signed-off-by: richardyu-ms * add more information in patch Signed-off-by: richardyu-ms * Update 0003-Remove-minimist-packages.patch * change the thrift 0.14.1 to package download Signed-off-by: richardyu-ms * use the series file for patching * fix a code defect --- .gitmodules | 3 - rules/thrift_0_14_1.mk | 4 +- src/thrift_0_14_1/Makefile | 28 ++ src/thrift_0_14_1/thrift | 1 - .../0003-Remove-minimist-packages.patch | 268 ++++++++++++++++++ src/thrift_0_14_1/thrift.patch/series | 1 + 6 files changed, 299 insertions(+), 6 deletions(-) create mode 100644 src/thrift_0_14_1/Makefile delete mode 160000 src/thrift_0_14_1/thrift create mode 100644 src/thrift_0_14_1/thrift.patch/0003-Remove-minimist-packages.patch diff --git a/.gitmodules b/.gitmodules index b2d76bd66b20..9194c8f4b7a2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -103,6 +103,3 @@ [submodule "src/sonic-p4rt/sonic-pins"] path = src/sonic-p4rt/sonic-pins url = https://github.com/Azure/sonic-pins.git -[submodule "src/thrift_0_14_1/thrift"] - path = src/thrift_0_14_1/thrift - url = https://github.com/apache/thrift.git diff --git a/rules/thrift_0_14_1.mk b/rules/thrift_0_14_1.mk index b986e0a4dceb..6fc0d05c14bc 100644 --- a/rules/thrift_0_14_1.mk +++ b/rules/thrift_0_14_1.mk @@ -4,8 +4,8 @@ THRIFT_0_14_1_VERSION = 0.14.1 THRIFT_0_14_1_VERSION_FULL = $(THRIFT_0_14_1_VERSION) LIBTHRIFT_0_14_1 = libthrift0_$(THRIFT_0_14_1_VERSION)_$(CONFIGURED_ARCH).deb -$(LIBTHRIFT_0_14_1)_SRC_PATH = $(SRC_PATH)/thrift_0_14_1/thrift -SONIC_DPKG_DEBS += $(LIBTHRIFT_0_14_1) +$(LIBTHRIFT_0_14_1)_SRC_PATH = $(SRC_PATH)/thrift_0_14_1 +SONIC_MAKE_DEBS += $(LIBTHRIFT_0_14_1) LIBTHRIFT_0_14_1_DEV = libthrift-dev_$(THRIFT_0_14_1_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBTHRIFT_0_14_1),$(LIBTHRIFT_0_14_1_DEV))) diff --git a/src/thrift_0_14_1/Makefile b/src/thrift_0_14_1/Makefile new file mode 100644 index 000000000000..081aff3f34bd --- /dev/null +++ b/src/thrift_0_14_1/Makefile @@ -0,0 +1,28 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e -x + +THRIFT_VERSION = 0.14.1 + +MAIN_TARGET = libthrift0_$(THRIFT_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = libthrift-dev_$(THRIFT_VERSION)_$(CONFIGURED_ARCH).deb \ + python3-thrift_$(THRIFT_VERSION)_$(CONFIGURED_ARCH).deb \ + thrift-compiler_$(THRIFT_VERSION)_$(CONFIGURED_ARCH).deb + +THRIFT_LINK_PRE = https://archive.apache.org/dist/thrift + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf thrift-$(THRIFT_VERSION) + + wget -O "thrift_$(THRIFT_VERSION).tar.gz" "$(THRIFT_LINK_PRE)/$(THRIFT_VERSION)/thrift-$(THRIFT_VERSION).tar.gz" + + tar -xvzf ./thrift_$(THRIFT_VERSION).tar.gz + if [ -f thrift.patch/series ]; then pushd thrift-$(THRIFT_VERSION) && QUILT_PATCHES=../thrift.patch quilt push -a; [ -d .pc ] && rm -rf .pc; popd; fi + + pushd thrift-$(THRIFT_VERSION) + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/thrift_0_14_1/thrift b/src/thrift_0_14_1/thrift deleted file mode 160000 index f6fa1794539e..000000000000 --- a/src/thrift_0_14_1/thrift +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f6fa1794539e68ac294038ac388d6bde40a6c237 diff --git a/src/thrift_0_14_1/thrift.patch/0003-Remove-minimist-packages.patch b/src/thrift_0_14_1/thrift.patch/0003-Remove-minimist-packages.patch new file mode 100644 index 000000000000..e94b1dfdd38a --- /dev/null +++ b/src/thrift_0_14_1/thrift.patch/0003-Remove-minimist-packages.patch @@ -0,0 +1,268 @@ +From f6fa1794539e68ac294038ac388d6bde40a6c237 Mar 2, 2021 00:00:00 +From: richardyu-ms +Date: Tue, 12 Apr 2022 15:46:16 +0000 +Subject: [PATCH] Fix security issue for package minimist + +--- +3 files changed, 9 insertions(+), 120 deletions(-) + +Index: thrift-0.14.1/lib/js/package-lock.json +=================================================================== +--- thrift-0.14.1.orig/lib/js/package-lock.json ++++ thrift-0.14.1/lib/js/package-lock.json +@@ -1037,16 +1037,7 @@ + "dev": true, + "requires": { + "acorn-node": "^1.6.1", +- "defined": "^1.0.0", +- "minimist": "^1.1.1" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } ++ "defined": "^1.0.0" + } + }, + "diffie-hellman": { +@@ -2616,20 +2607,11 @@ + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", +- "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } + } + }, + "micromatch": { +@@ -2690,12 +2672,6 @@ + "brace-expansion": "^1.1.7" + } + }, +- "minimist": { +- "version": "0.0.8", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", +- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", +- "dev": true +- }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", +@@ -2721,10 +2697,7 @@ + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", +- "dev": true, +- "requires": { +- "minimist": "0.0.8" +- } ++ "dev": true + }, + "module-deps": { + "version": "6.2.2", +@@ -3971,18 +3944,7 @@ + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", +- "dev": true, +- "requires": { +- "minimist": "^1.1.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } +- } ++ "dev": true + }, + "supports-color": { + "version": "5.5.0", +Index: thrift-0.14.1/lib/ts/package-lock.json +=================================================================== +--- thrift-0.14.1.orig/lib/ts/package-lock.json ++++ thrift-0.14.1/lib/ts/package-lock.json +@@ -1139,16 +1139,7 @@ + "dev": true, + "requires": { + "acorn-node": "^1.3.0", +- "defined": "^1.0.0", +- "minimist": "^1.1.1" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } ++ "defined": "^1.0.0" + } + }, + "diagnostics": { +@@ -3032,20 +3023,11 @@ + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", +- "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } + } + }, + "micromatch": { +@@ -3121,11 +3103,6 @@ + "brace-expansion": "^1.1.7" + } + }, +- "minimist": { +- "version": "0.0.8", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", +- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" +- }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", +@@ -3150,10 +3127,7 @@ + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", +- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", +- "requires": { +- "minimist": "0.0.8" +- } ++ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" + }, + "module-deps": { + "version": "6.2.0", +@@ -4396,18 +4370,7 @@ + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", +- "dev": true, +- "requires": { +- "minimist": "^1.1.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } +- } ++ "dev": true + }, + "supports-color": { + "version": "5.5.0", +Index: thrift-0.14.1/package-lock.json +=================================================================== +--- thrift-0.14.1.orig/package-lock.json ++++ thrift-0.14.1/package-lock.json +@@ -1427,16 +1427,7 @@ + "integrity": "sha512-4vGP107UDhhNHeWA5N8j/nUPlQbtB/W/K2x/P7aElbWMWrOkJA0MRSVFsMFrTPSAAjZWCG9uki2+1cQDzFtVcQ==", + "dev": true, + "requires": { +- "html-validator": "3.1.3", +- "minimist": "1.2.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } ++ "html-validator": "3.1.3" + } + }, + "http-signature": { +@@ -1920,18 +1911,7 @@ + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", +- "dev": true, +- "requires": { +- "minimist": "^1.2.0" +- }, +- "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- } +- } ++ "dev": true + }, + "jsprim": { + "version": "1.4.1", +@@ -2072,20 +2052,11 @@ + "brace-expansion": "^1.1.7" + } + }, +- "minimist": { +- "version": "0.0.8", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", +- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", +- "dev": true +- }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", +- "dev": true, +- "requires": { +- "minimist": "0.0.8" +- } ++ "dev": true + }, + "ms": { + "version": "2.0.0", +@@ -2790,7 +2761,6 @@ + "glob": "~7.1.2", + "has": "~1.0.3", + "inherits": "~2.0.3", +- "minimist": "~1.2.0", + "object-inspect": "~1.6.0", + "resolve": "~1.7.1", + "resumer": "~0.0.0", +@@ -2798,12 +2768,6 @@ + "through": "~2.3.8" + }, + "dependencies": { +- "minimist": { +- "version": "1.2.0", +- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", +- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", +- "dev": true +- }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", diff --git a/src/thrift_0_14_1/thrift.patch/series b/src/thrift_0_14_1/thrift.patch/series index b95ae481e048..9fe00d007f63 100644 --- a/src/thrift_0_14_1/thrift.patch/series +++ b/src/thrift_0_14_1/thrift.patch/series @@ -1,2 +1,3 @@ 0001-Remove-unneeded-packages.patch 0002-Fix-build-rules.patch +0003-Remove-minimist-packages.patch From af5e5c4c94399520d3c78821408aae3831334d47 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 22 Apr 2022 16:02:30 +0800 Subject: [PATCH 245/817] [Mellanox] Adjust PSU voltage WA (#10619) - Why I did it InvalidPsuVolWA.run might raise exception if user power off PSU when it is running. This exception is not caught and will be raised to psud which causes psud failed to update PSU data to DB. - How I did it 1. Change the log level when WA does not work. This could happen when user power off PSU, hence changing the log level from error to warning is better 2. Change the wait time from 5 to 1 to avoid introduce too much delay in psud. 1 second is usually enough per my test 3. Give a default return value for function get_voltage_low_threshold and get_voltage_high_threshold to avoid exception reach to psud - How to verify it Manual test. Run sonic-mgmt regression --- .../mlnx-platform-api/sonic_platform/psu.py | 18 ++++++++++++------ .../mlnx-platform-api/tests/test_psu.py | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index a2dcfcd55b4e..69f2f8930cc4 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -397,6 +397,7 @@ def get_temperature_high_threshold(self): return None + @utils.default_return(None) def get_voltage_high_threshold(self): """ Retrieves the high threshold PSU voltage output @@ -414,10 +415,12 @@ def get_voltage_high_threshold(self): if 'max' in capability: max_voltage = utils.read_int_from_file(self.psu_voltage_max, log_func=logger.log_info) max_voltage = InvalidPsuVolWA.run(self, max_voltage, self.psu_voltage_max) - return float(max_voltage) / 1000 + if max_voltage: + return float(max_voltage) / 1000 return None + @utils.default_return(None) def get_voltage_low_threshold(self): """ Retrieves the low threshold PSU voltage output @@ -435,7 +438,8 @@ def get_voltage_low_threshold(self): if 'min' in capability: min_voltage = utils.read_int_from_file(self.psu_voltage_min, log_func=logger.log_info) min_voltage = InvalidPsuVolWA.run(self, min_voltage, self.psu_voltage_min) - return float(min_voltage) / 1000 + if min_voltage: + return float(min_voltage) / 1000 return None @@ -471,7 +475,7 @@ class InvalidPsuVolWA: EXPECT_PLATFORMS = ['x86_64-mlnx_msn3700-r0', 'x86_64-mlnx_msn3700c-r0', 'x86_64-mlnx_msn3800-r0', 'x86_64-mlnx_msn4600c-r0'] MFR_FIELD = 'MFR_NAME' CAPACITY_FIELD = 'CAPACITY' - WAIT_TIME = 5 + WAIT_TIME = 1 @classmethod def run(cls, psu, threshold_value, threshold_file): @@ -499,8 +503,8 @@ def run(cls, psu, threshold_value, threshold_file): logger.log_warning('PSU {} threshold file {} value {}, but its capacity is {}'.format(psu.index, threshold_file, threshold_value, capacity)) return threshold_value - # Run a sensor -s command to triger hardware to get the real threashold value - utils.run_command('sensor -s') + # Run a sensors -s command to triger hardware to get the real threashold value + utils.run_command('sensors -s') # Wait for the threshold value change return cls.wait_set_done(threshold_file) @@ -516,5 +520,7 @@ def wait_set_done(cls, threshold_file): wait_time -= 1 time.sleep(1) - logger.log_error('sensor -s does not recover PSU threshold sensor after {} seconds'.format(cls.WAIT_TIME)) + # It is enough to use warning here because user might power off/on the PSU which may cause threshold_file + # does not exist + logger.log_warning('sensors -s does not recover PSU threshold sensor after {} seconds'.format(cls.WAIT_TIME)) return None diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 5a5f13ff05f3..68260ef630f7 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -152,4 +152,4 @@ def get_entry_value(key): # Normal vpd_info[InvalidPsuVolWA.CAPACITY_FIELD] = InvalidPsuVolWA.EXPECT_CAPACITY assert InvalidPsuVolWA.run(psu, InvalidPsuVolWA.INVALID_VOLTAGE_VALUE, '') == 9999 - mock_run_command.assert_called_with('sensor -s') + mock_run_command.assert_called_with('sensors -s') From 3abf383d3d3751ce001dd2cb63af7620a0530c23 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:07:07 +0300 Subject: [PATCH 246/817] [asan] add address sanitizer support to docker-sonic-vs (#10470) - Why I did it To support docker-sonic-vs image with ASAN. - How I did it 1. Made the supervisord.conf a template 2. Added the 'log_path' environment variable for ASAN-enabled daemons 3. Added supervisord.conf.j2 generation and ASAN lib to the docker-sonic-vs/Dockerfile.j2 - How to verify it 1. Made a build with ENABLE_ASAN=y 2. Run the tests, checked ASAN reports Signed-off-by: Yakiv Huryk --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 9 ++- .../{supervisord.conf => supervisord.conf.j2} | 60 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) rename platform/vs/docker-sonic-vs/{supervisord.conf => supervisord.conf.j2} (69%) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 21c607e28c9e..cc867e3d0eeb 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -66,6 +66,9 @@ RUN apt-get install -y net-tools \ gir1.2-glib-2.0 \ libdbus-1-3 \ libgirepository-1.0-1 \ + {%- if ENABLE_ASAN == "y" %} + libasan5 \ + {%- endif %} libsystemd0 # Install redis-server @@ -160,7 +163,7 @@ RUN sed -ri 's/^(save .*$)/# \1/g; COPY ["50-default.conf", "/etc/rsyslog.d/"] COPY ["start.sh", "orchagent.sh", "files/update_chassisdb_config", "/usr/bin/"] -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["files/configdb-load.sh", "/usr/bin/"] COPY ["files/arp_update", "/usr/bin/"] COPY ["files/buffers_config.j2", "files/qos_config.j2", "files/arp_update_vars.j2", "files/copp_cfg.j2", "/usr/share/sonic/templates/"] @@ -179,6 +182,10 @@ COPY ["hwsku.json", "/usr/share/sonic/device/x86_64-kvm_x86_64-r0/Force10-S6000/ COPY ["hwsku.json", "/usr/share/sonic/device/x86_64-kvm_x86_64-r0/brcm_gearbox_vs/"] COPY ["hwsku.json", "/usr/share/sonic/device/x86_64-kvm_x86_64-r0/Mellanox-SN2700/"] +RUN mkdir -p /etc/supervisor/conf.d/ +RUN sonic-cfggen -a "{\"ENABLE_ASAN\":\"{{ENABLE_ASAN}}\"}" -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf +RUN rm -f /usr/share/sonic/templates/supervisord.conf.j2 + # Workaround the tcpdump issue RUN mv /usr/sbin/tcpdump /usr/bin/tcpdump diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf.j2 similarity index 69% rename from platform/vs/docker-sonic-vs/supervisord.conf rename to platform/vs/docker-sonic-vs/supervisord.conf.j2 index 96f027131520..a49f33866edf 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf +++ b/platform/vs/docker-sonic-vs/supervisord.conf.j2 @@ -42,6 +42,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log" +{% endif %} [program:gbsyncd] command=/usr/bin/syncd -s -p /usr/share/sonic/hwsku/pai.profile -x /usr/share/sonic/hwsku/context_config.json -g 1 @@ -67,6 +70,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/portsyncd-asan.log" +{% endif %} [program:orchagent] command=/usr/bin/orchagent.sh @@ -75,6 +81,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/orchagent-asan.log" +{% endif %} [program:coppmgrd] command=/usr/bin/coppmgrd @@ -83,6 +92,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/coppmgrd-asan.log" +{% endif %} [program:neighsyncd] command=/usr/bin/neighsyncd @@ -91,6 +103,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/neighsyncd-asan.log" +{% endif %} [program:teamsyncd] command=/usr/bin/teamsyncd @@ -99,6 +114,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/teamsyncd-asan.log" +{% endif %} [program:vlanmgrd] command=/usr/bin/vlanmgrd @@ -107,6 +125,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/vlanmgrd-asan.log" +{% endif %} [program:intfmgrd] command=/usr/bin/intfmgrd @@ -115,6 +136,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/intfmgrd-asan.log" +{% endif %} [program:portmgrd] command=/usr/bin/portmgrd @@ -123,6 +147,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/portmgrd-asan.log" +{% endif %} [program:teammgrd] command=/usr/bin/teammgrd @@ -131,6 +158,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/teammgrd-asan.log" +{% endif %} [program:zebra] command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm @@ -163,6 +193,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/fpmsyncd-asan.log" +{% endif %} [program:arp_update] command=/usr/bin/arp_update @@ -179,6 +212,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/buffermgrd-asan.log" +{% endif %} [program:vrfmgrd] command=/usr/bin/vrfmgrd @@ -187,6 +223,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/vrfmgrd-asan.log" +{% endif %} [program:restore_neighbors] command=/usr/bin/restore_neighbors.py @@ -205,6 +244,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/nbrmgrd-asan.log" +{% endif %} [program:vxlanmgrd] command=/usr/bin/vxlanmgrd @@ -213,6 +255,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/vxlanmgrd-asan.log" +{% endif %} [program:sflowmgrd] command=/usr/bin/sflowmgrd @@ -221,6 +266,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/sflowmgrd-asan.log" +{% endif %} [program:natmgrd] command=/usr/bin/natmgrd @@ -229,6 +277,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/natmgrd-asan.log" +{% endif %} [program:natsyncd] command=/usr/bin/natsyncd @@ -237,6 +288,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/natsyncd-asan.log" +{% endif %} [program:fdbsyncd] command=/usr/bin/fdbsyncd @@ -245,6 +299,9 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log" +{% endif %} [program:tunnelmgrd] command=/usr/bin/tunnelmgrd @@ -253,3 +310,6 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +{% if ENABLE_ASAN == "y" %} +environment=ASAN_OPTIONS="log_path=/var/log/asan/tunnelmgrd-asan.log" +{% endif %} From 988a6871826f603358a65c273f52b14a5d88ab24 Mon Sep 17 00:00:00 2001 From: Taylor Cai <103631396+cel-taylor@users.noreply.github.com> Date: Fri, 22 Apr 2022 20:35:52 +0800 Subject: [PATCH 247/817] Fix issue test_crm and test_fib (#10585) Why I did it Fix issue (https://github.com/Azure/sonic-buildimage/issues/9171) and (https://github.com/Azure/sonic-buildimage/issues/9236) How I did it Add flag in config file for get correct count of IPv6 entry. Add init config file to set IPv4 ECMP hash on L4. How to verify it Compile the sonic_platform wheel for e1031, then upload to device and install the wheel, verify using testbed. --- .../Celestica-E1031-T48S4/helix4-e1031-48x1G+4x10G.config.bcm | 4 ++++ .../Celestica-E1031-T48S4/sai_postinit_cmd.soc | 1 + 2 files changed, 5 insertions(+) create mode 100644 device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai_postinit_cmd.soc diff --git a/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/helix4-e1031-48x1G+4x10G.config.bcm b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/helix4-e1031-48x1G+4x10G.config.bcm index 02d785aa4cb0..3da3ff365e21 100644 --- a/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/helix4-e1031-48x1G+4x10G.config.bcm +++ b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/helix4-e1031-48x1G+4x10G.config.bcm @@ -1,3 +1,7 @@ +sai_postinit_cmd_file=/usr/share/sonic/hwsku/sai_postinit_cmd.soc + +ipv6_lpm_128b_enable=1 + # disables bcmALPMDH (ALPM distributed hitbit) thread. This thread is purely for debug purpose l3_alpm_hit_skip=1 diff --git a/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai_postinit_cmd.soc b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai_postinit_cmd.soc new file mode 100644 index 000000000000..573706e302bd --- /dev/null +++ b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai_postinit_cmd.soc @@ -0,0 +1 @@ +setreg RTAG7_IPV4_TCP_UDP_HASH_FIELD_BMAP_2 IPV4_TCP_UDP_FIELD_BITMAP_A=0xf70 From 869ac1d1f20e1a20c07d4d6a7e36006ab3d546e7 Mon Sep 17 00:00:00 2001 From: Eric Zhu <79439153+cel-eric@users.noreply.github.com> Date: Fri, 22 Apr 2022 20:36:17 +0800 Subject: [PATCH 248/817] sonic-platform-modules-cel dx010: speed up dx010 platform init script (#10313) * Optimize dx010 sonic platform init script to speed up init process * Merge issue #10152: [warm-upgrade][202012] Slow Celestica platform init in rc.local causes lacp-teardown fix into master branch Signed-off-by: Eric Zhu --- .../debian/platform-modules-dx010.init | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init index 21587bfbd3fd..12f8fc61f2ea 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init @@ -61,19 +61,19 @@ start) [ $found -eq 0 ] && echo "cannot find iSMT" && exit 1 i2cset -y ${devnum} 0x70 0x10 0x00 0x01 i - sleep 1 + sleep 0.1 # Attach PCA9548 0x71 Channel Extender for Main Board echo pca9548 0x71 > /sys/bus/i2c/devices/i2c-${devnum}/new_device - sleep 1 + sleep 0.1 # Attach PCA9548 0x73 Channel Extender for CPU Board echo pca9548 0x73 > /sys/bus/i2c/devices/i2c-${devnum}/new_device - sleep 1 + sleep 0.1 # Attach PCA9548 0x77 Channel Extender for Fan's EEPROMs echo pca9548 0x77 > /sys/bus/i2c/devices/i2c-${devnum}/new_device - sleep 1 + sleep 0.1 # Attach syseeprom echo 24lc64t 0x50 > /sys/bus/i2c/devices/i2c-12/new_device @@ -106,7 +106,7 @@ start) echo pca9505 0x20 > /sys/bus/i2c/devices/i2c-17/new_device modprobe dx010_cpld - sleep 2 + sleep 1 # Export platform gpio sysfs export_gpio 10 "in" # Fan 1 present @@ -148,15 +148,14 @@ start) done bus_en=8 - sleep 1 cfg_r=`i2cget -y -f 8 0x60 0xD1` ((cfg_w=$cfg_r+$bus_en)) i2cset -y -f 8 0x60 0xD1 $cfg_w - sleep 1 + sleep 0.1 cfg_r=`i2cget -y -f 9 0x20 0xD1` ((cfg_w=$cfg_r+$bus_en)) i2cset -y -f 9 0x20 0xD1 $cfg_w - sleep 1 + sleep 0.1 /bin/sh /usr/local/bin/platform_api_mgnt.sh init From 5cd6bc4ce2a32bd7b1b71dbcc85e7390799da7d0 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Fri, 22 Apr 2022 16:25:29 -0700 Subject: [PATCH 249/817] [portconfig]: Remove try block for db config initialization (#10581) Why I did it Provide fix for comment: https://github.com/Azure/sonic-buildimage/pull/10475/files#r847753187; How I did it Try exception is not required in this scenario, so remove and modify to initial db config according to single or multi-asic platforms. How to verify it Verified on multi-asic device. --- src/sonic-config-engine/portconfig.py | 7 +------ src/sonic-config-engine/sonic-cfggen | 8 +++++++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/sonic-config-engine/portconfig.py b/src/sonic-config-engine/portconfig.py index 0c056d1cdab7..ea9985a3beb0 100644 --- a/src/sonic-config-engine/portconfig.py +++ b/src/sonic-config-engine/portconfig.py @@ -72,12 +72,7 @@ def db_connect_configdb(namespace=None): """ Connect to configdb """ - try: - if namespace is not None: - swsscommon.SonicDBConfig.load_sonic_global_db_config(namespace=namespace) - config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) - except Exception as e: - return None + config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) if config_db is None: return None try: diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index aebd4d0544f5..b10002c40809 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -32,7 +32,7 @@ from functools import partial from minigraph import minigraph_encoder, parse_xml, parse_device_desc_xml, parse_asic_sub_role, parse_asic_switch_type from portconfig import get_port_config, get_breakout_mode from redis_bcc import RedisBytecodeCache -from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id +from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id, is_multi_asic from sonic_py_common import device_info from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector, SonicDBConfig, ConfigDBPipeConnector @@ -309,6 +309,12 @@ def main(): 'localhost': {'namespace_id': namespace_id} } }) + # load db config + if not SonicDBConfig.isInit(): + if is_multi_asic(): + SonicDBConfig.load_sonic_global_db_config(namespace=asic_name) + else: + SonicDBConfig.load_sonic_db_config() if hwsku is not None: hardware_data = {'DEVICE_METADATA': {'localhost': { 'hwsku': hwsku From d8c27b6ed2b669932b529c35312800c6754e8d9f Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Mon, 25 Apr 2022 14:44:40 +0800 Subject: [PATCH 250/817] [YANG][vlan-sub-intf] Enforce Linux interface name length (#10646) Why I did it Allow portchannel vlan sub intf long name format as long as it follows Linux interface name length limit(<16). How I did it Modify the leaf name check. How to verify it Test case passes. --- .../tests/vlan_sub_interface.json | 7 ++ .../tests_config/vlan_sub_interface.json | 82 +++++++++++++++++++ .../yang-models/sonic-vlan-sub-interface.yang | 10 +-- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json index e3ffa9dc44b6..d112587307e4 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json @@ -9,6 +9,10 @@ "desc": "Configure vlan sub interface must condition false.", "eStrKey": "Must" }, + "VLAN_SUB_INTERFACE_NAME_LENGTH_LIMIT_MUST_CONDITION_FALSE_TEST": { + "desc": "Configure vlan sub interface name length must condition false.", + "eStrKey": "Must" + }, "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { "desc": "Configure short name format vlan sub interface must condition false.", "eStrKey": "Must" @@ -16,6 +20,9 @@ "VLAN_SUB_INTERFACE_PO_SHORT_NAME_FORMAT_MUST_CONDITION_TRUE_TEST": { "desc": "Configure valid portchannel short name format vlan sub interface must condition true." }, + "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_TRUE_TEST": { + "desc": "Configure portchannel long name format vlan sub interface must condition true." + }, "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_FALSE_TEST": { "desc": "Configure portchannel long name format vlan sub interface must condition false.", "eStrKey": "Must" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json index 8adff73e497c..860de64ba663 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json @@ -95,6 +95,38 @@ } } }, + "VLAN_SUB_INTERFACE_NAME_LENGTH_LIMIT_MUST_CONDITION_FALSE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Ethernet12000.10" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "Ethernet12000.10", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet12000", + "admin_status": "up", + "alias": "Ethernet12000/1", + "description": "Ethernet12000", + "lanes": "49,50,51,52", + "mtu": 9000, + "speed": 100000 + } + ] + } + } + }, "VLAN_SUB_INTERFACE_SHORT_NAME_FORMAT_MUST_CONDITION_FALSE_TEST": { "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { @@ -177,6 +209,56 @@ } } }, + "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_TRUE_TEST": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "PortChannel01.8" + } + ], + "VLAN_SUB_INTERFACE_IPPREFIX_LIST": [ + { + "name": "PortChannel01.8", + "ip-prefix": "10.0.0.1/30" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "tpid": "0x8100", + "speed": 25000 + } + ] + } + }, + "sonic-portchannel:sonic-portchannel": { + "sonic-portchannel:PORTCHANNEL": { + "PORTCHANNEL_LIST": [ + { + "admin_status": "up", + "members": [ + "Ethernet0" + ], + "min_links": "1", + "mtu": "9100", + "tpid": "0x8100", + "lacp_key": "auto", + "name": "PortChannel01" + } + ] + } + } + }, "VLAN_SUB_INTERFACE_PO_MUST_CONDITION_FALSE_TEST": { "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { diff --git a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang index 953aa7e14c80..212fb5533c3b 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang @@ -40,11 +40,11 @@ module sonic-vlan-sub-interface { key "name"; leaf name { - must "(substring-before(current(), '.') = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + - "(starts-with(substring-before(current(), '.'), 'Eth') and " + - "concat('Ethernet', substring-after(substring-before(current(), '.'), 'Eth')) = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + - "(starts-with(substring-before(current(), '.'), 'Po') and " + - "concat('PortChannel', substring-after(substring-before(current(), '.'), 'Po')) = /lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name)" + must "(string-length(current()) <= 15) and " + + "((substring-before(current(), '.') = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + + "(starts-with(substring-before(current(), '.'), 'Eth') and concat('Ethernet', substring-after(substring-before(current(), '.'), 'Eth')) = /port:sonic-port/port:PORT/port:PORT_LIST/port:name) or " + + "(substring-before(current(), '.') = /lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name) or " + + "(starts-with(substring-before(current(), '.'), 'Po') and concat('PortChannel', substring-after(substring-before(current(), '.'), 'Po')) = /lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name))" { error-message "Must condition not satisfied, please follow vlan sub interface naming convention"; } From 3fc3259a35a372e1fad75235742c03120839a4d6 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:06:10 +0800 Subject: [PATCH 251/817] Define qos map `AZURE_TUNNEL` for QoS remapping of tunnel traffic (#10565) * Add AZURE_TUNNEL map Signed-off-by: bingwang --- .../Arista-7050CX3-32S-D48C8/qos.json.j2 | 100 +++++++++++++++++ .../Arista-7260CX3-C64/qos.json.j2 | 102 +++++++++++++++++- files/build_templates/qos_config.j2 | 3 + .../py3/qos-arista7050cx3-dualtor.json | 98 +++++++++++++++++ .../py3/qos-arista7260-dualtor.json | 98 +++++++++++++++++ 5 files changed, 400 insertions(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 index 04fddf486ace..413bd575413c 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 @@ -66,6 +66,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, {%- endmacro %} @@ -80,6 +146,16 @@ "5": "0", "6": "0", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0" } }, {%- endmacro %} @@ -94,6 +170,30 @@ "5": "5", "6": "6", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_dscp_map() %} + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "33", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48" } }, {%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 index 4178efbcb7aa..27f6b531cb08 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -151,6 +151,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, {%- endmacro %} @@ -165,6 +231,16 @@ "5": "0", "6": "0", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0" } }, {%- endmacro %} @@ -173,12 +249,36 @@ "AZURE": { "0": "0", "1": "1", - "2": "1", + "2": "1", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_dscp_map() %} + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "33", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48" } }, {%- endmacro %} diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 9df061283034..4062755827ab 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -172,6 +172,9 @@ } }, {% endif %} +{% if generate_tc_to_dscp_map is defined %} + {{- generate_tc_to_dscp_map() }} +{% endif %} {% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %} "SCHEDULER": { "scheduler.0": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json index 84a2613df90d..dbab298bb76a 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -21,6 +21,16 @@ "5": "5", "6": "6", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7" } }, "DSCP_TO_TC_MAP": { @@ -89,6 +99,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "TC_TO_PRIORITY_GROUP_MAP": { @@ -101,6 +177,28 @@ "5": "0", "6": "0", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0" + } + }, + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "33", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48" } }, "SCHEDULER": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index e8476cc0c865..41f36a273d06 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -21,6 +21,16 @@ "5": "5", "6": "6", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7" } }, "DSCP_TO_TC_MAP": { @@ -89,6 +99,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "2", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "TC_TO_PRIORITY_GROUP_MAP": { @@ -101,6 +177,28 @@ "5": "0", "6": "0", "7": "7" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0" + } + }, + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "33", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48" } }, "SCHEDULER": { From d19a953e133a0893496cd6257aba7df1299fc4a0 Mon Sep 17 00:00:00 2001 From: zzhiyuan Date: Mon, 25 Apr 2022 08:11:32 -0700 Subject: [PATCH 252/817] [Arista] Add 1x100G over 4 lanes configuration for 7060DX4 (#10655) Co-authored-by: Zhi Yuan (Carl) Zhao --- .../x86_64-arista_7060dx4_32/platform.json | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/device/arista/x86_64-arista_7060dx4_32/platform.json b/device/arista/x86_64-arista_7060dx4_32/platform.json index 7a38cbe3d9f3..425d9c87d6ce 100644 --- a/device/arista/x86_64-arista_7060dx4_32/platform.json +++ b/device/arista/x86_64-arista_7060dx4_32/platform.json @@ -236,6 +236,9 @@ "Ethernet1/3", "Ethernet1/5", "Ethernet1/7" + ], + "1x100G(4)": [ + "Ethernet1/1" ] } }, @@ -255,6 +258,9 @@ "Ethernet2/3", "Ethernet2/5", "Ethernet2/7" + ], + "1x100G(4)": [ + "Ethernet2/1" ] } }, @@ -274,6 +280,9 @@ "Ethernet3/3", "Ethernet3/5", "Ethernet3/7" + ], + "1x100G(4)": [ + "Ethernet3/1" ] } }, @@ -293,6 +302,9 @@ "Ethernet4/3", "Ethernet4/5", "Ethernet4/7" + ], + "1x100G(4)": [ + "Ethernet4/1" ] } }, @@ -312,6 +324,9 @@ "Ethernet5/3", "Ethernet5/5", "Ethernet5/7" + ], + "1x100G(4)": [ + "Ethernet5/1" ] } }, @@ -331,6 +346,9 @@ "Ethernet6/3", "Ethernet6/5", "Ethernet6/7" + ], + "1x100G(4)": [ + "Ethernet6/1" ] } }, @@ -350,6 +368,9 @@ "Ethernet7/3", "Ethernet7/5", "Ethernet7/7" + ], + "1x100G(4)": [ + "Ethernet7/1" ] } }, @@ -369,6 +390,9 @@ "Ethernet8/3", "Ethernet8/5", "Ethernet8/7" + ], + "1x100G(4)": [ + "Ethernet8/1" ] } }, @@ -388,6 +412,9 @@ "Ethernet9/3", "Ethernet9/5", "Ethernet9/7" + ], + "1x100G(4)": [ + "Ethernet9/1" ] } }, @@ -407,6 +434,9 @@ "Ethernet10/3", "Ethernet10/5", "Ethernet10/7" + ], + "1x100G(4)": [ + "Ethernet10/1" ] } }, @@ -426,6 +456,9 @@ "Ethernet11/3", "Ethernet11/5", "Ethernet11/7" + ], + "1x100G(4)": [ + "Ethernet11/1" ] } }, @@ -445,6 +478,9 @@ "Ethernet12/3", "Ethernet12/5", "Ethernet12/7" + ], + "1x100G(4)": [ + "Ethernet12/1" ] } }, @@ -464,6 +500,9 @@ "Ethernet13/3", "Ethernet13/5", "Ethernet13/7" + ], + "1x100G(4)": [ + "Ethernet13/1" ] } }, @@ -483,6 +522,9 @@ "Ethernet14/3", "Ethernet14/5", "Ethernet14/7" + ], + "1x100G(4)": [ + "Ethernet14/1" ] } }, @@ -502,6 +544,9 @@ "Ethernet15/3", "Ethernet15/5", "Ethernet15/7" + ], + "1x100G(4)": [ + "Ethernet15/1" ] } }, @@ -521,6 +566,9 @@ "Ethernet16/3", "Ethernet16/5", "Ethernet16/7" + ], + "1x100G(4)": [ + "Ethernet16/1" ] } }, @@ -540,6 +588,9 @@ "Ethernet17/3", "Ethernet17/5", "Ethernet17/7" + ], + "1x100G(4)": [ + "Ethernet17/1" ] } }, @@ -559,6 +610,9 @@ "Ethernet18/3", "Ethernet18/5", "Ethernet18/7" + ], + "1x100G(4)": [ + "Ethernet18/1" ] } }, @@ -578,6 +632,9 @@ "Ethernet19/3", "Ethernet19/5", "Ethernet19/7" + ], + "1x100G(4)": [ + "Ethernet19/1" ] } }, @@ -597,6 +654,9 @@ "Ethernet20/3", "Ethernet20/5", "Ethernet20/7" + ], + "1x100G(4)": [ + "Ethernet20/1" ] } }, @@ -616,6 +676,9 @@ "Ethernet21/3", "Ethernet21/5", "Ethernet21/7" + ], + "1x100G(4)": [ + "Ethernet21/1" ] } }, @@ -635,6 +698,9 @@ "Ethernet22/3", "Ethernet22/5", "Ethernet22/7" + ], + "1x100G(4)": [ + "Ethernet22/1" ] } }, @@ -654,6 +720,9 @@ "Ethernet23/3", "Ethernet23/5", "Ethernet23/7" + ], + "1x100G(4)": [ + "Ethernet23/1" ] } }, @@ -673,6 +742,9 @@ "Ethernet24/3", "Ethernet24/5", "Ethernet24/7" + ], + "1x100G(4)": [ + "Ethernet24/1" ] } }, @@ -692,6 +764,9 @@ "Ethernet25/3", "Ethernet25/5", "Ethernet25/7" + ], + "1x100G(4)": [ + "Ethernet25/1" ] } }, @@ -711,6 +786,9 @@ "Ethernet26/3", "Ethernet26/5", "Ethernet26/7" + ], + "1x100G(4)": [ + "Ethernet26/1" ] } }, @@ -730,6 +808,9 @@ "Ethernet27/3", "Ethernet27/5", "Ethernet27/7" + ], + "1x100G(4)": [ + "Ethernet27/1" ] } }, @@ -749,6 +830,9 @@ "Ethernet28/3", "Ethernet28/5", "Ethernet28/7" + ], + "1x100G(4)": [ + "Ethernet28/1" ] } }, @@ -768,6 +852,9 @@ "Ethernet29/3", "Ethernet29/5", "Ethernet29/7" + ], + "1x100G(4)": [ + "Ethernet29/1" ] } }, @@ -787,6 +874,9 @@ "Ethernet30/3", "Ethernet30/5", "Ethernet30/7" + ], + "1x100G(4)": [ + "Ethernet30/1" ] } }, @@ -806,6 +896,9 @@ "Ethernet31/3", "Ethernet31/5", "Ethernet31/7" + ], + "1x100G(4)": [ + "Ethernet31/1" ] } }, @@ -825,6 +918,9 @@ "Ethernet32/3", "Ethernet32/5", "Ethernet32/7" + ], + "1x100G(4)": [ + "Ethernet32/1" ] } }, From 672db8d416798b6d418e98f5bb7693d2ff42214f Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 25 Apr 2022 23:16:29 +0800 Subject: [PATCH 253/817] [submodule] Update submodule for sonic-mgmt-common (#10664) submodule update, includes: ec32690 CVE-2020-25614: Update xmlquery, jsonquery and xpath packages. (#58) 5156527 Showtech sonic mgmt framework: Add Management Framework functionality for "show tech-support" (#49) --- src/sonic-mgmt-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-mgmt-common b/src/sonic-mgmt-common index d43a607d759d..ec326905356c 160000 --- a/src/sonic-mgmt-common +++ b/src/sonic-mgmt-common @@ -1 +1 @@ -Subproject commit d43a607d759d23f64d681e38d015ce0be886d440 +Subproject commit ec326905356c59aed51c6f6516db5a1b5d8516d6 From 64187a1b1500c1c8a0cab4b5ab97d4de6135de52 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 25 Apr 2022 13:38:52 -0400 Subject: [PATCH 254/817] Remove SSH host keys after installing the custom version of sshd (#10633) * Remove SSH host keys after installing the custom version of sshd Signed-off-by: Saikrishna Arcot * Use an override for for sshd instead of overwriting the service file Don't overwrite upstream's .service file, and instead use an override file for making sure the host key(s) are generated. Signed-off-by: Saikrishna Arcot --- build_debian.sh | 3 ++- .../build_templates/sonic_debian_extension.j2 | 5 +++++ files/sshd/override.conf | 4 ++++ files/sshd/sshd.service | 18 ------------------ 4 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 files/sshd/override.conf delete mode 100644 files/sshd/sshd.service diff --git a/build_debian.sh b/build_debian.sh index b3d692cdb28c..43f509b374c2 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -407,7 +407,8 @@ sudo sed -i 's/LOAD_KEXEC=true/LOAD_KEXEC=false/' $FILESYSTEM_ROOT/etc/default/k ## Remove sshd host keys, and will regenerate on first sshd start sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* sudo cp files/sshd/host-ssh-keygen.sh $FILESYSTEM_ROOT/usr/local/bin/ -sudo cp -f files/sshd/sshd.service $FILESYSTEM_ROOT/lib/systemd/system/ssh.service +sudo mkdir $FILESYSTEM_ROOT/etc/systemd/system/ssh.service.d +sudo cp files/sshd/override.conf $FILESYSTEM_ROOT/etc/systemd/system/ssh.service.d/override.conf # Config sshd # 1. Set 'UseDNS' to 'no' # 2. Configure sshd to close all SSH connetions after 15 minutes of inactivity diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index a49e29406eeb..924641393c02 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -329,6 +329,11 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in # Install custom-built openssh sshd sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/openssh-server_*.deb +# Remove sshd host keys, and will regenerate on first sshd start. This needs to be +# done again here because our custom version of sshd is being installed, which +# will regenerate the sshd host keys. +sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* + {% if sonic_asic_platform == 'broadcom' %} # Install custom-built flashrom sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/flashrom_*.deb diff --git a/files/sshd/override.conf b/files/sshd/override.conf new file mode 100644 index 000000000000..a1e63ce22b5d --- /dev/null +++ b/files/sshd/override.conf @@ -0,0 +1,4 @@ +[Service] +ExecStartPre= +ExecStartPre=/usr/local/bin/host-ssh-keygen.sh +ExecStartPre=/usr/sbin/sshd -t diff --git a/files/sshd/sshd.service b/files/sshd/sshd.service deleted file mode 100644 index 25d524171c6f..000000000000 --- a/files/sshd/sshd.service +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -Description=OpenBSD Secure Shell server -After=network.target auditd.service -ConditionPathExists=!/etc/ssh/sshd_not_to_be_run - -[Service] -EnvironmentFile=-/etc/default/ssh -ExecStartPre=-/usr/local/bin/host-ssh-keygen.sh -ExecStart=/usr/sbin/sshd -D $SSHD_OPTS -ExecReload=/bin/kill -HUP $MAINPID -KillMode=process -Restart=on-failure -RuntimeDirectory=sshd -RuntimeDirectoryMode=0755 - -[Install] -WantedBy=multi-user.target -Alias=sshd.service From 9237950a0c8389b360878712db83553c3c910e78 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Tue, 26 Apr 2022 02:56:05 +0800 Subject: [PATCH 255/817] Align threshold mode of zero buffer profile of egress_lossless_pool (#10627) On vs platform, egress_lossless_pool's mode is static. So the corresponding profile should be of static_th as well. Signed-off-by: Stephen Sun --- platform/vs/docker-sonic-vs/zero_profiles.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vs/docker-sonic-vs/zero_profiles.json b/platform/vs/docker-sonic-vs/zero_profiles.json index fbd42bf7ec3e..7648fec56b15 100644 --- a/platform/vs/docker-sonic-vs/zero_profiles.json +++ b/platform/vs/docker-sonic-vs/zero_profiles.json @@ -43,7 +43,7 @@ "BUFFER_PROFILE_TABLE:egress_lossless_zero_profile" : { "pool":"egress_lossless_pool", "size":"0", - "dynamic_th":"-8" + "static_th":"0" }, "OP": "SET" }, From 0606add0177e0f7880c5cf7e09c2e0442320a4b5 Mon Sep 17 00:00:00 2001 From: Maxime Lorrillere Date: Mon, 25 Apr 2022 13:09:42 -0700 Subject: [PATCH 256/817] [chassis] Get asic PCI ID from CHASSIS_STATE_DB and update asic_id in CONFIG_DB (#9681) Asic PCI ID (PCI address) is collected by chassisd (inside pmon - Azure/sonic-platform-daemons#175) and saved in CHASSIS_STATE_DB (in redis_chassis). CHASSIS_STATE_DB is accessible by swss containers. At docker-init.sh (script is called after swss container is created and before anything that could run in swss like orchagent...), we wait until asic PCI ID of the corresponding asic is populated by chassisd. We then update asic_id in CONFIG_DB of asic's database. A system supporting dynamic asic PCI ID identification requires to have a file (empty) use_pci_id_chassis in its platform dir. When orchagent runs, it has correct asic PCI ID in its CONFIG_DB. Together with this PR: Azure/sonic-platform-daemons#175 Azure/sonic-platform-common#185 Signed-off-by: Maxime Lorrillere Co-authored-by: Maxime Lorrillere --- dockers/docker-orchagent/docker-init.j2 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index 5b3850613dac..d0a3ef9e2d36 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -40,4 +40,21 @@ if [ "$VLAN" != "" ]; then cp /usr/share/sonic/templates/ndppd.conf /etc/supervisor/conf.d/ fi +USE_PCI_ID_IN_CHASSIS_STATE_DB=/usr/share/sonic/platform/use_pci_id_chassis +ASIC_ID="asic$NAMESPACE_ID" +if [ -f "$USE_PCI_ID_IN_CHASSIS_STATE_DB" ]; then + while true; do + PCI_ID=$(sonic-db-cli -s CHASSIS_STATE_DB HGET "CHASSIS_ASIC_TABLE|$ASIC_ID" asic_pci_address) + if [ -z "$PCI_ID" ]; then + sleep 3 + else + # Update asic_id in CONFIG_DB, which is used by orchagent and fed to syncd + if [[ $PCI_ID == ????:??:??.? ]]; then + sonic-db-cli CONFIG_DB HSET 'DEVICE_METADATA|localhost' 'asic_id' ${PCI_ID#*:} + break + fi + fi + done +fi + exec /usr/local/bin/supervisord From aa62e3333906a79f10e5bdc80f6b9427a128fea2 Mon Sep 17 00:00:00 2001 From: Song Yuan <64041228+ysmanman@users.noreply.github.com> Date: Mon, 25 Apr 2022 13:14:17 -0700 Subject: [PATCH 257/817] [chassis] Do not configure LLDP on recirc ports (#7909) Why I did it Recirc port is used to only forward traffic from one asic to another asic. So it's not required to configure LLDP on it. How I did it Add interface prefix helper for recirc port. Similar to skip configuring LLDP on inband port, add check in lldpmgrd to skip recirc port by checking interface prefix. --- dockers/docker-lldp/lldpmgrd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dockers/docker-lldp/lldpmgrd b/dockers/docker-lldp/lldpmgrd index 9e85406d4510..93461a42837e 100755 --- a/dockers/docker-lldp/lldpmgrd +++ b/dockers/docker-lldp/lldpmgrd @@ -22,7 +22,7 @@ try: from sonic_py_common import daemon_base from swsscommon import swsscommon - from sonic_py_common.interface import inband_prefix + from sonic_py_common.interface import inband_prefix, recirc_prefix except ImportError as err: raise ImportError("%s - required module not found" % str(err)) @@ -133,9 +133,9 @@ class LldpManager(daemon_base.DaemonBase): """ port_desc = None - # Skip inband interface prefixes. These are recycle ports exposed in PORT_TABLE for + # Skip recirc and inband interface prefixes. These are recycle ports exposed in PORT_TABLE for # asic-to-asic communication in VOQ based chassis system. We do not configure LLDP on these. - if port_name.startswith(inband_prefix()): + if port_name.startswith(inband_prefix()) or port_name.startswith(recirc_prefix()): return # Get the port alias. If None or empty string, use port name instead From cc30771f6b97234a6dd19d8f97d5dfd44551cf20 Mon Sep 17 00:00:00 2001 From: Zhaohui Sun <94606222+ZhaohuiS@users.noreply.github.com> Date: Tue, 26 Apr 2022 09:13:26 +0800 Subject: [PATCH 258/817] Add python3 virtual environment for docker-ptf (#10599) Why I did it Migrate ptftests script to python3, in order to do an incremental migration, add python virtual environment firstly, install all required python packages in virtual env as well. Then migrate ptftests scripts from python2 to python3 one by one avoid impacting non-changed scripts. Signed-off-by: Zhaohui Sun zhaohuisun@microsoft.com How I did it Add python3 virtual environment for docker-ptf. Add submodule ptf-py3 and install patched ptf 0.9.3 into virtual environment as well, two ptf issues were reported here: p4lang/ptf#173 p4lang/ptf#174 Signed-off-by: Zhaohui Sun --- .gitmodules | 3 + dockers/docker-ptf/Dockerfile.j2 | 67 ++++++++++++++++++- platform/vs/docker-ptf.mk | 1 + rules/ptf-py3.dep | 11 +++ rules/ptf-py3.mk | 7 ++ src/ptf-py3 | 1 + ...ve-ord-in-get_mac-to-avoid-TypeError.patch | 26 +++++++ ...ted-client-mac-address-in-DHCP-Disco.patch | 36 ++++++++++ src/ptf-py3.patch/series | 2 + 9 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 rules/ptf-py3.dep create mode 100644 rules/ptf-py3.mk create mode 160000 src/ptf-py3 create mode 100644 src/ptf-py3.patch/0001-Remove-ord-in-get_mac-to-avoid-TypeError.patch create mode 100644 src/ptf-py3.patch/0002-Fill-byte-formatted-client-mac-address-in-DHCP-Disco.patch create mode 100644 src/ptf-py3.patch/series diff --git a/.gitmodules b/.gitmodules index 9194c8f4b7a2..59cddea4a8f2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -103,3 +103,6 @@ [submodule "src/sonic-p4rt/sonic-pins"] path = src/sonic-p4rt/sonic-pins url = https://github.com/Azure/sonic-pins.git +[submodule "src/ptf-py3"] + path = src/ptf-py3 + url = https://github.com/p4lang/ptf.git diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index d999d01e0026..bf22ba97ea06 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -7,6 +7,11 @@ FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch FROM {{ prefix }}debian:buster {% endif %} +{% from "dockers/dockerfile-macros.j2" import install_python_wheels, copy_files %} + +USER root +WORKDIR /root + MAINTAINER Pavel Shirshov RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian buster-backports main" >> /etc/apt/sources.list @@ -51,6 +56,13 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / python-libpcap \ python-scapy \ python-six \ + python3 \ + python3-venv \ + python3-pip \ + python3-dev \ + python3-scapy \ + python3-six \ + libpcap-dev \ tacacs+ \ rsyslog \ ntp \ @@ -59,7 +71,9 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / arping \ bridge-utils \ libteam-utils \ - gdb + gdb \ + automake \ + iproute2 # Install all python modules from pypi. python-scapy is exception, ptf debian package requires python-scapy # TODO: Clean up this step @@ -117,10 +131,61 @@ RUN rm -rf /debs \ && pip install pybrctl pyro4 rpyc yabgp \ && pip install unittest-xml-reporting \ && pip install pyrasite \ + && pip install retrying \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py +RUN python3 -m venv env-python3 + +# Activating a virtualenv. The virtualenv automatically works for RUN, ENV and CMD. +ENV VIRTUAL_ENV=/root/env-python3 +ARG BACKUP_OF_PATH="$PATH" +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 PYTHONIOENCODING=UTF-8 + +RUN python3 -m pip install --upgrade --ignore-installed pip + +# Install all python modules from pypi. python3-scapy is exception, ptf debian package requires python3-scapy +RUN python3 -m pip install setuptools \ + && pip3 install supervisor \ + && pip3 install ipython==5.4.1 \ + && pip3 install Cython \ + && pip3 install cffi \ + && pip3 install nnpy \ + && pip3 install dpkt \ + && pip3 install ipaddress \ + && pip3 install pysubnettree \ + && pip3 install paramiko \ + && pip3 install Flask \ + && pip3 install exabgp \ + && pip3 install pyaml \ + && pip3 install pybrctl pyro4 rpyc yabgp \ + && pip3 install unittest-xml-reporting \ + && pip3 install pyrasite \ + && pip3 install python-libpcap \ + && pip3 install enum34 \ + && pip3 install grpcio \ + && pip3 install grpcio-tools \ + && pip3 install protobuf \ + && pip3 install six==1.16.0 \ + && pip3 install itsdangerous \ + && pip3 install retrying \ + && pip3 install jinja2 \ + && pip3 install scapy==2.4.5 + +{% if docker_ptf_whls.strip() -%} +# Copy locally-built Python wheel dependencies +{{ copy_files("python-wheels/", docker_ptf_whls.split(' '), "/python-wheels/") }} + +# Install locally-built Python wheel dependencies +{{ install_python_wheels(docker_ptf_whls.split(' ')) }} +{% endif %} + +# Deactivating a virtualenv. +ENV PATH="$BACKUP_OF_PATH" + ## Adjust sshd settings RUN mkdir /var/run/sshd \ && echo 'root:root' | chpasswd \ diff --git a/platform/vs/docker-ptf.mk b/platform/vs/docker-ptf.mk index 445fc8daf4d3..ef102be967f4 100644 --- a/platform/vs/docker-ptf.mk +++ b/platform/vs/docker-ptf.mk @@ -1,6 +1,7 @@ # docker image for docker-ptf DOCKER_PTF = docker-ptf.gz +$(DOCKER_PTF)_PYTHON_WHEELS += $(PTF_PY3) $(DOCKER_PTF)_PATH = $(DOCKERS_PATH)/docker-ptf $(DOCKER_PTF)_DEPENDS += $(LIBTHRIFT) $(PYTHON_THRIFT) $(PTF) $(PYTHON_SAITHRIFT) SONIC_DOCKER_IMAGES += $(DOCKER_PTF) diff --git a/rules/ptf-py3.dep b/rules/ptf-py3.dep new file mode 100644 index 000000000000..eadb32aabdf4 --- /dev/null +++ b/rules/ptf-py3.dep @@ -0,0 +1,11 @@ + +SPATH := $($(PTF_PY3)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/ptf-py3.mk rules/ptf-py3.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + +$(PTF_PY3)_CACHE_MODE := GIT_CONTENT_SHA +$(PTF_PY3)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(PTF_PY3)_DEP_FILES := $(DEP_FILES) +$(PTF_PY3)_SMDEP_FILES := $(SMDEP_FILES) +$(PTF_PY3)_SMDEP_PATHS := $(SPATH) diff --git a/rules/ptf-py3.mk b/rules/ptf-py3.mk new file mode 100644 index 000000000000..bf583b57b622 --- /dev/null +++ b/rules/ptf-py3.mk @@ -0,0 +1,7 @@ +# ptf package + +PTF_PY3 = ptf-0.9.3-py3-none-any.whl +$(PTF_PY3)_SRC_PATH = $(SRC_PATH)/ptf-py3 +$(PTF_PY3)_PYTHON_VERSION = 3 +$(PTF_PY3)_TEST = n +SONIC_PYTHON_WHEELS += $(PTF_PY3) diff --git a/src/ptf-py3 b/src/ptf-py3 new file mode 160000 index 000000000000..405513bcad2e --- /dev/null +++ b/src/ptf-py3 @@ -0,0 +1 @@ +Subproject commit 405513bcad2eae3092b0ac4ceb31e8dec5e32311 diff --git a/src/ptf-py3.patch/0001-Remove-ord-in-get_mac-to-avoid-TypeError.patch b/src/ptf-py3.patch/0001-Remove-ord-in-get_mac-to-avoid-TypeError.patch new file mode 100644 index 000000000000..cb2b992548a7 --- /dev/null +++ b/src/ptf-py3.patch/0001-Remove-ord-in-get_mac-to-avoid-TypeError.patch @@ -0,0 +1,26 @@ +From a8b13b9fbaa16ddd305ba2df2238ef606ef222a7 Mon Sep 17 00:00:00 2001 +From: Zhaohui Sun +Date: Wed, 13 Apr 2022 09:24:46 +0000 +Subject: [PATCH 1/2] Remove ord in get_mac() to avoid TypeError + +Signed-off-by: Zhaohui Sun +--- + src/ptf/netutils.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ptf/netutils.py b/src/ptf/netutils.py +index 752e76c..6aabe79 100644 +--- a/src/ptf/netutils.py ++++ b/src/ptf/netutils.py +@@ -54,7 +54,7 @@ def get_if_index(iff): + + + def get_mac(iff): +- return ":".join(["%02x" % ord(char) for char in get_if(iff, SIOCGIFHWADDR)[18:24]]) ++ return ":".join(["%02x" % char for char in get_if(iff, SIOCGIFHWADDR)[18:24]]) + + + def set_promisc(s, iff, val=1): +-- +2.25.1 + diff --git a/src/ptf-py3.patch/0002-Fill-byte-formatted-client-mac-address-in-DHCP-Disco.patch b/src/ptf-py3.patch/0002-Fill-byte-formatted-client-mac-address-in-DHCP-Disco.patch new file mode 100644 index 000000000000..a0582994539e --- /dev/null +++ b/src/ptf-py3.patch/0002-Fill-byte-formatted-client-mac-address-in-DHCP-Disco.patch @@ -0,0 +1,36 @@ +From 6e570e00ea05882d2db1e480ed041ea631bf37da Mon Sep 17 00:00:00 2001 +From: Zhaohui Sun +Date: Wed, 13 Apr 2022 09:25:28 +0000 +Subject: [PATCH 2/2] Fill byte formatted client mac address in DHCP Discover + packet + +Signed-off-by: Zhaohui Sun +--- + src/ptf/testutils.py | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/ptf/testutils.py b/src/ptf/testutils.py +index ab67cea..83a9075 100755 +--- a/src/ptf/testutils.py ++++ b/src/ptf/testutils.py +@@ -2712,12 +2712,13 @@ def __dhcp_mac_to_chaddr(mac_addr="00:01:02:03:04:05"): + """ + Private helper function to convert a 6-byte MAC address of form: + '00:01:02:03:04:05' +- into a 16-byte chaddr byte string of form: +- '\x00\x01\x02\x03\x04\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ++ into a 16-byte chaddr byte of form: ++ b'\x00\x01\x02\x03\x04\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + + """ +- chaddr = "".join([chr(int(octet, 16)) for octet in mac_addr.split(":")]) +- chaddr += "\x00" * 10 ++ import binascii ++ chaddr = binascii.unhexlify(mac_addr.replace(':', '')) ++ chaddr += b'\x00\x00\x00\x00\x00\x00' + return chaddr + + +-- +2.25.1 + diff --git a/src/ptf-py3.patch/series b/src/ptf-py3.patch/series new file mode 100644 index 000000000000..d18987dd5913 --- /dev/null +++ b/src/ptf-py3.patch/series @@ -0,0 +1,2 @@ +0001-Remove-ord-in-get_mac-to-avoid-TypeError.patch +0002-Fill-byte-formatted-client-mac-address-in-DHCP-Disco.patch \ No newline at end of file From a06f5493b2daa5d35dd5c7d22f342929bb1c72b4 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 26 Apr 2022 21:12:36 +0800 Subject: [PATCH 259/817] [Submodule]: update submodule for sonic-restapi (#10680) Why I did it Update submodule sonic-restapi e83e0e8 Fix Ctype_char larger than address space issue in 32-bit armhf (#107) --- src/sonic-restapi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-restapi b/src/sonic-restapi index bd97dfeb4b45..e83e0e862cc4 160000 --- a/src/sonic-restapi +++ b/src/sonic-restapi @@ -1 +1 @@ -Subproject commit bd97dfeb4b4564defbc10e521ee05bbfe0638315 +Subproject commit e83e0e862cc4e8a2627eaf79f1461e7d7d9a4e75 From 9d7387a18e15427ed11103fc8d1724b01fbdc324 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Wed, 27 Apr 2022 07:14:51 +0800 Subject: [PATCH 260/817] [sonic-host-services]: Fix import and invalid path (#10660) Why I did it Can not start sonic-hostservice How I did it Install python3-dbus and systemd-python, and replace invalid path How to verify it Start the service with below commands: sudo systemctl start sonic-hostservice sudo systemctl status sonic-hostservice Signed-off-by: Gang Lv ganglv@microsoft.com --- files/build_templates/sonic_debian_extension.j2 | 5 ++++- src/sonic-host-services/scripts/sonic-host-server | 15 ++++++++++++--- src/sonic-host-services/setup.py | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 924641393c02..c51d6d4543e8 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -233,7 +233,10 @@ sudo cp -f $IMAGE_CONFIGS/bash/bash.bashrc $FILESYSTEM_ROOT/etc/ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install libcairo2-dev libdbus-1-dev libgirepository1.0-dev libsystemd-dev pkg-config # Mark runtime dependencies as manually installed to avoid them being auto-removed while uninstalling build dependencies -sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-mark manual gir1.2-glib-2.0 libdbus-1-3 libgirepository-1.0-1 libsystemd0 +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-mark manual gir1.2-glib-2.0 libdbus-1-3 libgirepository-1.0-1 libsystemd0 python3-dbus + +# Install systemd-python for SONiC host services +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install systemd-python # Install SONiC host services package SONIC_HOST_SERVICES_PY3_WHEEL_NAME=$(basename {{sonic_host_services_py3_wheel_path}}) diff --git a/src/sonic-host-services/scripts/sonic-host-server b/src/sonic-host-services/scripts/sonic-host-server index a9fdc2eb25fd..bf4449e34eda 100755 --- a/src/sonic-host-services/scripts/sonic-host-server +++ b/src/sonic-host-services/scripts/sonic-host-server @@ -13,9 +13,16 @@ import dbus.mainloop.glib from gi.repository import GObject -def register_modules(): +def find_module_path(): + """Find path for host_moduels""" + try: + from host_modules import host_service + return os.path.dirname(host_service.__file__) + except ImportError as e: + return None + +def register_modules(mod_path): """Register all host modules""" - mod_path = '/usr/local/lib/python3.7/dist-packages/host_modules' sys.path.append(mod_path) for mod_file in glob.glob(os.path.join(mod_path, '*.py')): if os.path.isfile(mod_file) and not mod_file.endswith('__init__.py'): @@ -62,7 +69,9 @@ class SignalManager(object): loop.quit() sigmgr = SignalManager() -register_modules() +mod_path = find_module_path() +if mod_path is not None: + register_modules(mod_path) # Only run if we actually have some handlers if handlers: diff --git a/src/sonic-host-services/setup.py b/src/sonic-host-services/setup.py index 8926e960e311..9ed9e1082a0c 100644 --- a/src/sonic-host-services/setup.py +++ b/src/sonic-host-services/setup.py @@ -24,6 +24,7 @@ ], install_requires = [ 'dbus-python', + 'systemd-python', 'Jinja2>=2.10', 'PyGObject', 'sonic-py-common' From 850e45601bc7672462418dea194cee36b04cf811 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Tue, 26 Apr 2022 17:26:44 -0700 Subject: [PATCH 261/817] Revert "[sonic-cfggen] make minigraph parser fail when speed and lanes are not in PORT table (#10228)" (#10683) This reverts commit cd330f0e70e646c2ff6fc88c6c8fb9f75e8b40e7. --- src/sonic-config-engine/sonic-cfggen | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index b10002c40809..3f0e047f76fa 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -247,19 +247,6 @@ def _get_jinja2_env(paths): return env -def _must_field_by_yang(data, table, must_fields): - """ - Check if table contains must field based on yang definition - """ - if table not in data: - return - - for must_field in must_fields: - for _, fields in data[table].items(): - if must_field not in fields: - print(must_field, 'is a must field in', table, file=sys.stderr) - sys.exit(1) - def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") group = parser.add_mutually_exclusive_group() @@ -354,8 +341,6 @@ def main(): deep_update(data, parse_xml(minigraph, platform, asic_name=asic_name)) else: deep_update(data, parse_xml(minigraph, port_config_file=args.port_config, asic_name=asic_name, hwsku_config_file=args.hwsku_config)) - # check if minigraph parser has speed and lanes in PORT table - _must_field_by_yang(data, 'PORT', ['speed', 'lanes']) if args.device_description is not None: deep_update(data, parse_device_desc_xml(args.device_description)) From 313cced32b713290cbcdcc1645ea41c4474eca50 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Wed, 27 Apr 2022 13:20:42 -0400 Subject: [PATCH 262/817] Update Docker to 20.10.14 (#10677) * Upgrade docker version from 20.10.7 to 20.10.14, and pin containerd.io Update the Docker engine version from 20.10.7 to 20.10.14. This brings in some CVE and bug fixes. Additionally, pin the version of containerd.io to a specific version, mainly for consistency/reproducibility. Signed-off-by: Saikrishna Arcot * Remove the containerd ordering change to docker.service This appears to be already present in the current docker.service. Signed-off-by: Saikrishna Arcot * Remove use of apt-key apt-key is considered deprecated, and the current practice is to just add the key into /etc/apt/trusted.gpg.d/. Signed-off-by: Saikrishna Arcot * Upgrade docker container in Bullseye slave to 20.10.14 Signed-off-by: Saikrishna Arcot --- build_debian.sh | 16 +++++----------- sonic-slave-bullseye/Dockerfile.j2 | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 43f509b374c2..b8216c629b8d 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -31,7 +31,8 @@ set -x -e CONFIGURED_ARCH=$([ -f .arch ] && cat .arch || echo amd64) ## docker engine version (with platform) -DOCKER_VERSION=5:20.10.7~3-0~debian-$IMAGE_DISTRO +DOCKER_VERSION=5:20.10.14~3-0~debian-$IMAGE_DISTRO +CONTAINERD_IO_VERSION=1.5.11-1 LINUX_KERNEL_VERSION=5.10.0-8-2 ## Working directory to prepare the file system @@ -233,17 +234,12 @@ if [[ $CONFIGURED_ARCH == armhf ]]; then # update ssl ca certificates for secure pem sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT c_rehash fi -sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -o /tmp/docker.gpg -fsSL https://download.docker.com/linux/debian/gpg -sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add /tmp/docker.gpg -sudo LANG=C chroot $FILESYSTEM_ROOT rm /tmp/docker.gpg +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -o /tmp/docker.asc -fsSL https://download.docker.com/linux/debian/gpg +sudo LANG=C chroot $FILESYSTEM_ROOT mv /tmp/docker.asc /etc/apt/trusted.gpg.d/ sudo LANG=C chroot $FILESYSTEM_ROOT add-apt-repository \ "deb [arch=$CONFIGURED_ARCH] https://download.docker.com/linux/debian $IMAGE_DISTRO stable" sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update -if dpkg --compare-versions ${DOCKER_VERSION} ge "18.09"; then - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION} -else - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION} -fi +sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION} containerd.io=${CONTAINERD_IO_VERSION} # Uninstall 'python3-gi' installed as part of 'software-properties-common' to remove debian version of 'PyGObject' # pip version of 'PyGObject' will be installed during installation of 'sonic-host-services' @@ -271,8 +267,6 @@ fi sudo mkdir -p $FILESYSTEM_ROOT/etc/systemd/system/docker.service.d/ ## Note: $_ means last argument of last command sudo cp files/docker/docker.service.conf $_ -## Fix systemd race between docker and containerd -sudo sed -i '/After=/s/$/ containerd.service/' $FILESYSTEM_ROOT/lib/systemd/system/docker.service ## Create default user ## Note: user should be in the group with the same name, and also in sudo/docker/redis groups diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 2c3224999a19..3e69075a0d05 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -504,7 +504,7 @@ RUN add-apt-repository \ $(lsb_release -cs) \ stable" RUN apt-get update -RUN apt-get install -y docker-ce=5:20.10.7~3-0~debian-bullseye docker-ce-cli=5:20.10.7~3-0~debian-bullseye +RUN apt-get install -y docker-ce=5:20.10.14~3-0~debian-bullseye docker-ce-cli=5:20.10.14~3-0~debian-bullseye containerd.io=1.5.11-1 RUN echo "DOCKER_OPTS=\"--experimental --storage-driver=vfs {{ DOCKER_EXTRA_OPTS }}\"" >> /etc/default/docker RUN update-alternatives --set iptables /usr/sbin/iptables-legacy From bc305283417a1c305bce4035547191e1d480c1d5 Mon Sep 17 00:00:00 2001 From: Kalimuthu-Velappan <53821802+Kalimuthu-Velappan@users.noreply.github.com> Date: Thu, 28 Apr 2022 06:09:37 +0530 Subject: [PATCH 263/817] Parallel building of sonic dockers using native dockerd(dood). (#10352) Currently, the build dockers are created as a user dockers(docker-base-stretch-, etc) that are specific to each user. But the sonic dockers (docker-database, docker-swss, etc) are created with a fixed docker name and common to all the users. docker-database:latest docker-swss:latest When multiple builds are triggered on the same build server that creates parallel building issue because all the build jobs are trying to create the same docker with latest tag. This happens only when sonic dockers are built using native host dockerd for sonic docker image creation. This patch creates all sonic dockers as user sonic dockers and then, while saving and loading the user sonic dockers, it rename the user sonic dockers into correct sonic dockers with tag as latest. docker-database:latest <== SAVE/LOAD ==> docker-database-:tag The user sonic docker names are derived from 'DOCKER_USERNAME and DOCKER_USERTAG' make env variable and using Jinja template, it replaces the FROM docker name with correct user sonic docker name for loading and saving the docker image. --- Makefile | 3 +- Makefile.work | 47 ++++++++++- .../Dockerfile.j2 | 2 +- .../docker-config-engine-buster/Dockerfile.j2 | 2 +- .../Dockerfile.j2 | 2 +- dockers/docker-config-engine/Dockerfile.j2 | 2 +- dockers/docker-database/Dockerfile.j2 | 2 +- dockers/docker-dhcp-relay/Dockerfile.j2 | 2 +- dockers/docker-fpm-frr/Dockerfile.j2 | 2 +- dockers/docker-fpm-gobgp/Dockerfile.j2 | 2 +- dockers/docker-iccpd/Dockerfile.j2 | 2 +- dockers/docker-lldp/Dockerfile.j2 | 2 +- dockers/docker-macsec/Dockerfile.j2 | 2 +- dockers/docker-mux/Dockerfile.j2 | 2 +- dockers/docker-nat/Dockerfile.j2 | 2 +- dockers/docker-orchagent/Dockerfile.j2 | 2 +- dockers/docker-pde/Dockerfile.j2 | 2 +- dockers/docker-platform-monitor/Dockerfile.j2 | 2 +- dockers/docker-ptf-sai/Dockerfile.j2 | 2 +- .../docker-router-advertiser/Dockerfile.j2 | 2 +- dockers/docker-sflow/Dockerfile.j2 | 2 +- dockers/docker-snmp/Dockerfile.j2 | 2 +- .../docker-sonic-mgmt-framework/Dockerfile.j2 | 2 +- dockers/docker-sonic-p4rt/Dockerfile.j2 | 2 +- dockers/docker-sonic-restapi/Dockerfile.j2 | 2 +- .../docker-sonic-sdk-buildenv/Dockerfile.j2 | 2 +- dockers/docker-sonic-sdk/Dockerfile.j2 | 2 +- dockers/docker-sonic-telemetry/Dockerfile.j2 | 2 +- .../docker-swss-layer-buster/Dockerfile.j2 | 2 +- dockers/docker-teamd/Dockerfile.j2 | 2 +- .../docker-syncd-bfn-rpc/Dockerfile.j2 | 2 +- .../barefoot/docker-syncd-bfn/Dockerfile.j2 | 2 +- .../docker-saiserver-brcm/Dockerfile.j2 | 2 +- .../docker-syncd-brcm-dnx-rpc/Dockerfile.j2 | 2 +- .../docker-syncd-brcm-dnx/Dockerfile.j2 | 2 +- .../docker-syncd-brcm-rpc/Dockerfile.j2 | 2 +- .../broadcom/docker-syncd-brcm/Dockerfile.j2 | 2 +- .../docker-syncd-cavm-rpc/Dockerfile.j2 | 2 +- .../cavium/docker-syncd-cavm/Dockerfile.j2 | 2 +- .../docker-saiserver-centec/Dockerfile.j2 | 2 +- .../docker-syncd-centec-rpc/Dockerfile.j2 | 2 +- .../docker-syncd-centec/Dockerfile.j2 | 2 +- .../docker-saiserver-centec/Dockerfile.j2 | 2 +- .../docker-syncd-centec-rpc/Dockerfile.j2 | 2 +- .../centec/docker-syncd-centec/Dockerfile.j2 | 2 +- .../docker-gbsyncd-credo/Dockerfile.j2 | 2 +- .../docker-syncd-invm-rpc/Dockerfile.j2 | 2 +- .../innovium/docker-syncd-invm/Dockerfile.j2 | 2 +- .../docker-syncd-mrvl-rpc/Dockerfile.j2 | 2 +- .../docker-syncd-mrvl/Dockerfile.j2 | 2 +- .../docker-syncd-mrvl-rpc/Dockerfile.j2 | 2 +- .../docker-syncd-mrvl/Dockerfile.j2 | 2 +- .../docker-syncd-mrvl-rpc/Dockerfile.j2 | 2 +- .../marvell/docker-syncd-mrvl/Dockerfile.j2 | 2 +- .../docker-saiserver-mlnx/Dockerfile.j2 | 2 +- .../docker-syncd-mlnx-rpc/Dockerfile.j2 | 2 +- .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 2 +- .../docker-syncd-nephos-rpc/Dockerfile.j2 | 2 +- .../nephos/docker-syncd-nephos/Dockerfile.j2 | 2 +- platform/p4/docker-sonic-p4/Dockerfile.j2 | 2 +- platform/vs/docker-gbsyncd-vs/Dockerfile.j2 | 2 +- platform/vs/docker-sonic-vs/Dockerfile.j2 | 2 +- platform/vs/docker-syncd-vs/Dockerfile.j2 | 2 +- rules/config | 5 +- slave.mk | 84 ++++++++++++++++--- 65 files changed, 185 insertions(+), 76 deletions(-) diff --git a/Makefile b/Makefile index ace13582cbef..af3d7086ec8e 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ endif ifeq ($(NOBULLSEYE), 0) BLDENV=bullseye make -f Makefile.work $@ endif + BLDENV=bullseye make -f Makefile.work docker-cleanup jessie: @echo "+++ Making $@ +++" @@ -83,7 +84,7 @@ $(PLATFORM_PATH): configure : $(PLATFORM_PATH) $(call make_work, $@) -clean reset showtag sonic-slave-build sonic-slave-bash : +clean reset showtag docker-cleanup sonic-slave-build sonic-slave-bash : $(call make_work, $@) # Freeze the versions, see more detail options: scripts/versions_manager.py freeze -h diff --git a/Makefile.work b/Makefile.work index a5ecab1ab58b..cc404b9d7184 100644 --- a/Makefile.work +++ b/Makefile.work @@ -90,6 +90,7 @@ $(shell rm -f .screen) MAKEFLAGS += -B CONFIGURED_ARCH := $(shell [ -f .arch ] && cat .arch || echo $(PLATFORM_ARCH)) +CONFIGURED_PLATFORM = $(if $(PLATFORM),$(PLATFORM),$(shell cat .platform 2>/dev/null)) ifeq ($(CONFIGURED_ARCH),) override CONFIGURED_ARCH = amd64 endif @@ -149,7 +150,9 @@ $(shell BUILD_SLAVE=y DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) s # Add the versions in the tag, if the version change, need to rebuild the slave SLAVE_BASE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* src/sonic-build-hooks/hooks/* | sha1sum | awk '{print substr($$1,0,11);}') -SLAVE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* | sha1sum | awk '{print substr($$1,0,11);}') +# Calculate the slave TAG based on $(USER)/$(PWD)/$(CONFIGURED_PLATFORM) to get unique SHA ID +SLAVE_TAG = $(shell (cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* .git/HEAD && echo $(USER)/$(PWD)/$(CONFIGURED_PLATFORM)) \ + | sha1sum | awk '{print substr($$1,0,11);}') OVERLAY_MODULE_CHECK := \ lsmod | grep -q "^overlay " &>/dev/null || \ @@ -159,6 +162,14 @@ OVERLAY_MODULE_CHECK := \ BUILD_TIMESTAMP := $(shell date +%Y%m%d\.%H%M%S) +# Create separate Docker lockfiles for saving vs. loading an image. +ifeq ($(DOCKER_LOCKDIR),) +override DOCKER_LOCKDIR := /tmp/docklock +endif +DOCKER_LOCKFILE_SAVE := $(DOCKER_LOCKDIR)/docker_save.lock +$(shell mkdir -m 0777 -p $(DOCKER_LOCKDIR)) +$(shell [ -f $(DOCKER_LOCKFILE_SAVE) ] || (touch $(DOCKER_LOCKFILE_SAVE) && chmod 0777 $(DOCKER_LOCKFILE_SAVE))) + ifeq ($(DOCKER_BUILDER_MOUNT),) override DOCKER_BUILDER_MOUNT := "$(PWD):/sonic" endif @@ -169,6 +180,7 @@ endif DOCKER_RUN := docker run --rm=true --privileged --init \ -v $(DOCKER_BUILDER_MOUNT) \ + -v "$(DOCKER_LOCKDIR):$(DOCKER_LOCKDIR)" \ -w $(DOCKER_BUILDER_WORKDIR) \ -e "http_proxy=$(http_proxy)" \ -e "https_proxy=$(https_proxy)" \ @@ -199,6 +211,30 @@ ifneq ($(SIGNING_CERT),) endif endif +# User name and tag for "docker-*" images created by native dockerd mode. +ifeq ($(strip $(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD)),y) +DOCKER_USERNAME = $(USER_LC) +DOCKER_USERTAG = $(SLAVE_TAG) +else +DOCKER_USERNAME = sonic +DOCKER_USERTAG = latest +endif + +# Define canned sequence to clean up Docker image cache. +# - These are the remnants from building the runtime Docker images using native (host) Docker daemon. +# - Image naming convention differs on a shared build system vs. non-shared. +# $(docker-image-cleanup) +ifeq ($(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD),y) +define docker-image-cleanup + @for i in $(shell docker images --quiet --filter 'dangling=true') ; do (docker rmi -f $$i &> /dev/null || true) ; done + @for i in $(shell docker images --quiet docker-*$(DOCKER_USERNAME):$(DOCKER_USERTAG)) ; do (docker rmi -f $$i &> /dev/null || true) ; done +endef +else +define docker-image-cleanup + @: +endef +endif + ifeq ($(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD), y) ifneq ($(MULTIARCH_QEMU_ENVIRON), y) DOCKER_RUN += -v /var/run/docker.sock:/var/run/docker.sock @@ -274,6 +310,7 @@ SONIC_BUILD_INSTRUCTION := make \ BUILD_NUMBER=$(BUILD_NUMBER) \ BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \ SONIC_IMAGE_VERSION=$(SONIC_IMAGE_VERSION) \ + SLAVE_TAG=$(SLAVE_TAG) \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ ENABLE_ZTP=$(ENABLE_ZTP) \ INCLUDE_PDE=$(INCLUDE_PDE) \ @@ -298,6 +335,11 @@ SONIC_BUILD_INSTRUCTION := make \ HTTP_PROXY=$(http_proxy) \ HTTPS_PROXY=$(https_proxy) \ NO_PROXY=$(no_proxy) \ + DOCKER_USERNAME=$(DOCKER_USERNAME) \ + DOCKER_USERTAG=$(DOCKER_USERTAG) \ + DOCKER_LOCKDIR=$(DOCKER_LOCKDIR) \ + DOCKER_LOCKFILE_SAVE=$(DOCKER_LOCKFILE_SAVE) \ + SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD=$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) \ SONIC_INCLUDE_SYSTEM_TELEMETRY=$(INCLUDE_SYSTEM_TELEMETRY) \ INCLUDE_DHCP_RELAY=$(INCLUDE_DHCP_RELAY) \ SONIC_INCLUDE_RESTAPI=$(INCLUDE_RESTAPI) \ @@ -352,6 +394,9 @@ else @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh \$$?" endif +docker-cleanup: + $(docker-image-cleanup) + sonic-build-hooks: @pushd src/sonic-build-hooks; TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) make all; popd @cp src/sonic-build-hooks/buildinfo/sonic-build-hooks* $(SLAVE_DIR)/buildinfo diff --git a/dockers/docker-config-engine-bullseye/Dockerfile.j2 b/dockers/docker-config-engine-bullseye/Dockerfile.j2 index 9d0ca97c7604..f7e0de09b9f6 100644 --- a/dockers/docker-config-engine-bullseye/Dockerfile.j2 +++ b/dockers/docker-config-engine-bullseye/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-base-bullseye +FROM docker-base-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-config-engine-buster/Dockerfile.j2 b/dockers/docker-config-engine-buster/Dockerfile.j2 index 1e7a64bfcd36..77ea27e00ee3 100644 --- a/dockers/docker-config-engine-buster/Dockerfile.j2 +++ b/dockers/docker-config-engine-buster/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-base-buster +FROM docker-base-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-config-engine-stretch/Dockerfile.j2 b/dockers/docker-config-engine-stretch/Dockerfile.j2 index 813f41bc296b..a0d5eaedde49 100644 --- a/dockers/docker-config-engine-stretch/Dockerfile.j2 +++ b/dockers/docker-config-engine-stretch/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-base-stretch +FROM docker-base-stretch:-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 index 8790ba67d7f9..ccc4290b951b 100644 --- a/dockers/docker-config-engine/Dockerfile.j2 +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-base-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index f75d258222a0..e1aa3c4bcd7f 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index f214edc8516c..9a5eb23c38a4 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index f392d4d3a7a6..f885180c37d4 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster +FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG frr_user_uid diff --git a/dockers/docker-fpm-gobgp/Dockerfile.j2 b/dockers/docker-fpm-gobgp/Dockerfile.j2 index 65b104e43b26..89f7e9a92a9e 100644 --- a/dockers/docker-fpm-gobgp/Dockerfile.j2 +++ b/dockers/docker-fpm-gobgp/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-fpm-quagga +FROM docker-fpm-quagga-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-iccpd/Dockerfile.j2 b/dockers/docker-iccpd/Dockerfile.j2 index 51cc306bdd55..95a55159e496 100644 --- a/dockers/docker-iccpd/Dockerfile.j2 +++ b/dockers/docker-iccpd/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-lldp/Dockerfile.j2 b/dockers/docker-lldp/Dockerfile.j2 index a1c7a1c1bee2..496af3e11601 100644 --- a/dockers/docker-lldp/Dockerfile.j2 +++ b/dockers/docker-lldp/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-macsec/Dockerfile.j2 b/dockers/docker-macsec/Dockerfile.j2 index 586983533e77..481e79aa02d0 100644 --- a/dockers/docker-macsec/Dockerfile.j2 +++ b/dockers/docker-macsec/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-mux/Dockerfile.j2 b/dockers/docker-mux/Dockerfile.j2 index f7e1ee3b4454..06e89c3ecf2d 100755 --- a/dockers/docker-mux/Dockerfile.j2 +++ b/dockers/docker-mux/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-nat/Dockerfile.j2 b/dockers/docker-nat/Dockerfile.j2 index 066de0a70ed0..04b2883551c3 100644 --- a/dockers/docker-nat/Dockerfile.j2 +++ b/dockers/docker-nat/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, copy_files %} -FROM docker-swss-layer-buster +FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index ea4e0abbc2ef..adb084cf2271 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster +FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-pde/Dockerfile.j2 b/dockers/docker-pde/Dockerfile.j2 index 0711e563c259..a6e7e62c8647 100644 --- a/dockers/docker-pde/Dockerfile.j2 +++ b/dockers/docker-pde/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM {{ docker_pde_load_image }} +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ENV PYTHONPATH=/usr/share/sonic/platform diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 4f5e941dd92a..739933aaf1e5 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-ptf-sai/Dockerfile.j2 b/dockers/docker-ptf-sai/Dockerfile.j2 index 1e284bd368ea..d68b39abb01e 100644 --- a/dockers/docker-ptf-sai/Dockerfile.j2 +++ b/dockers/docker-ptf-sai/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-ptf +FROM docker-ptf-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 index 44e2430077cb..d36eb7efe8b1 100644 --- a/dockers/docker-router-advertiser/Dockerfile.j2 +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-sflow/Dockerfile.j2 b/dockers/docker-sflow/Dockerfile.j2 index c8d0757d5fc5..eb97f5708bf7 100644 --- a/dockers/docker-sflow/Dockerfile.j2 +++ b/dockers/docker-sflow/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster +FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-snmp/Dockerfile.j2 b/dockers/docker-snmp/Dockerfile.j2 index 528189c2014f..944a8ed41385 100644 --- a/dockers/docker-snmp/Dockerfile.j2 +++ b/dockers/docker-snmp/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python3_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 index 937c5368483a..823a2c7ff4bf 100644 --- a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-sonic-p4rt/Dockerfile.j2 b/dockers/docker-sonic-p4rt/Dockerfile.j2 index 8708518340c8..13713980e1e7 100644 --- a/dockers/docker-sonic-p4rt/Dockerfile.j2 +++ b/dockers/docker-sonic-p4rt/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG git_commit diff --git a/dockers/docker-sonic-restapi/Dockerfile.j2 b/dockers/docker-sonic-restapi/Dockerfile.j2 index 43bc86ee6b68..029f5ec813d7 100644 --- a/dockers/docker-sonic-restapi/Dockerfile.j2 +++ b/dockers/docker-sonic-restapi/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/dockers/docker-sonic-sdk-buildenv/Dockerfile.j2 b/dockers/docker-sonic-sdk-buildenv/Dockerfile.j2 index 27fa08ec5b7a..ce18bb54f37f 100755 --- a/dockers/docker-sonic-sdk-buildenv/Dockerfile.j2 +++ b/dockers/docker-sonic-sdk-buildenv/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM sonic-sdk +FROM sonic-sdk-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG base_os_version ARG docker_database_version diff --git a/dockers/docker-sonic-sdk/Dockerfile.j2 b/dockers/docker-sonic-sdk/Dockerfile.j2 index 4218a9b702a9..dc28822cfd26 100755 --- a/dockers/docker-sonic-sdk/Dockerfile.j2 +++ b/dockers/docker-sonic-sdk/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-sonic-telemetry/Dockerfile.j2 b/dockers/docker-sonic-telemetry/Dockerfile.j2 index a7a45ab48c22..e9b01f751b85 100644 --- a/dockers/docker-sonic-telemetry/Dockerfile.j2 +++ b/dockers/docker-sonic-telemetry/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/dockers/docker-swss-layer-buster/Dockerfile.j2 b/dockers/docker-swss-layer-buster/Dockerfile.j2 index e8dcb9472a26..36f085936dcf 100644 --- a/dockers/docker-swss-layer-buster/Dockerfile.j2 +++ b/dockers/docker-swss-layer-buster/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index e02000abb1c6..7bcafb60cff0 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster +FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 b/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 index 5e5f5f166e5e..e520c55f9c39 100644 --- a/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 +++ b/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-bfn +FROM docker-syncd-bfn-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 b/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 index e085ef130aed..8fa30bc29874 100755 --- a/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 +++ b/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 index 2fe765febcf3..d77eb46b6aa3 100644 --- a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 index b2af1d98a33d..c476f2823211 100644 --- a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-brcm-dnx +FROM docker-syncd-brcm-dnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 index e0085b42f4de..95d3db54b11e 100755 --- a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index b832fd58864f..6e5a3d6dadc5 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-brcm +FROM docker-syncd-brcm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index a70e91bb60b8..e8f9c8c86a97 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 index e9e9facef5ee..3c962f5da984 100644 --- a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-cavm +FROM docker-syncd-cavm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index 8ac883e6293d..f60fa0fe5797 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine +FROM docker-config-engine-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/centec-arm64/docker-saiserver-centec/Dockerfile.j2 b/platform/centec-arm64/docker-saiserver-centec/Dockerfile.j2 index 264c8437973d..33941235bf90 100644 --- a/platform/centec-arm64/docker-saiserver-centec/Dockerfile.j2 +++ b/platform/centec-arm64/docker-saiserver-centec/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/centec-arm64/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec-arm64/docker-syncd-centec-rpc/Dockerfile.j2 index a760c278396a..cfb888b9e5c4 100755 --- a/platform/centec-arm64/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec-arm64/docker-syncd-centec-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-centec +FROM docker-syncd-centec-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/centec-arm64/docker-syncd-centec/Dockerfile.j2 b/platform/centec-arm64/docker-syncd-centec/Dockerfile.j2 index 7f89c0c98698..046de960cd20 100755 --- a/platform/centec-arm64/docker-syncd-centec/Dockerfile.j2 +++ b/platform/centec-arm64/docker-syncd-centec/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/centec/docker-saiserver-centec/Dockerfile.j2 b/platform/centec/docker-saiserver-centec/Dockerfile.j2 index 264c8437973d..33941235bf90 100644 --- a/platform/centec/docker-saiserver-centec/Dockerfile.j2 +++ b/platform/centec/docker-saiserver-centec/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 index a760c278396a..cfb888b9e5c4 100644 --- a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-centec +FROM docker-syncd-centec-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/centec/docker-syncd-centec/Dockerfile.j2 b/platform/centec/docker-syncd-centec/Dockerfile.j2 index 001e944bb85a..c1d122eeb9a0 100755 --- a/platform/centec/docker-syncd-centec/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 index 1b9631707cb6..98717c31e057 100644 --- a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 +++ b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 index eea52e3398b8..33726548d008 100755 --- a/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 +++ b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-invm +FROM docker-syncd-invm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/innovium/docker-syncd-invm/Dockerfile.j2 b/platform/innovium/docker-syncd-invm/Dockerfile.j2 index 4bdc7a6ebef1..a3fd750d86da 100755 --- a/platform/innovium/docker-syncd-invm/Dockerfile.j2 +++ b/platform/innovium/docker-syncd-invm/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-stretch +FROM docker-config-engine-stretch-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/marvell-arm64/docker-syncd-mrvl-rpc/Dockerfile.j2 b/platform/marvell-arm64/docker-syncd-mrvl-rpc/Dockerfile.j2 index 118be5e1c5f2..68670343bf37 100644 --- a/platform/marvell-arm64/docker-syncd-mrvl-rpc/Dockerfile.j2 +++ b/platform/marvell-arm64/docker-syncd-mrvl-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-mrvl +FROM docker-syncd-mrvl-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/marvell-arm64/docker-syncd-mrvl/Dockerfile.j2 b/platform/marvell-arm64/docker-syncd-mrvl/Dockerfile.j2 index b13346cd70c6..7ec04c49fc4b 100755 --- a/platform/marvell-arm64/docker-syncd-mrvl/Dockerfile.j2 +++ b/platform/marvell-arm64/docker-syncd-mrvl/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/marvell-armhf/docker-syncd-mrvl-rpc/Dockerfile.j2 b/platform/marvell-armhf/docker-syncd-mrvl-rpc/Dockerfile.j2 index 118be5e1c5f2..68670343bf37 100644 --- a/platform/marvell-armhf/docker-syncd-mrvl-rpc/Dockerfile.j2 +++ b/platform/marvell-armhf/docker-syncd-mrvl-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-mrvl +FROM docker-syncd-mrvl-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/marvell-armhf/docker-syncd-mrvl/Dockerfile.j2 b/platform/marvell-armhf/docker-syncd-mrvl/Dockerfile.j2 index b13346cd70c6..7ec04c49fc4b 100755 --- a/platform/marvell-armhf/docker-syncd-mrvl/Dockerfile.j2 +++ b/platform/marvell-armhf/docker-syncd-mrvl/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 b/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 index 118be5e1c5f2..68670343bf37 100644 --- a/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 +++ b/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-mrvl +FROM docker-syncd-mrvl-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 b/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 index cd9019febe4a..cb2f7eadb911 100755 --- a/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 +++ b/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index b356f145c9a4..7ad0355886e3 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -15,7 +15,7 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 50850039c01d..0c93e327d3c5 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -15,7 +15,7 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-syncd-mlnx +FROM docker-syncd-mlnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 386f00e3fe31..e3487c058b58 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -15,7 +15,7 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 index 6c63efb69bb6..3f09bd7524f5 100644 --- a/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 +++ b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-syncd-nephos +FROM docker-syncd-nephos-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/platform/nephos/docker-syncd-nephos/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos/Dockerfile.j2 index 3c7ffa1e49c5..5077db796628 100755 --- a/platform/nephos/docker-syncd-nephos/Dockerfile.j2 +++ b/platform/nephos/docker-syncd-nephos/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-stretch +FROM docker-config-engine-stretch-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index 90ff15472248..e77781223dc1 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine +FROM docker-config-engine-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 index a9e7f6f53d2c..08956a44ce77 100644 --- a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 +++ b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index cc867e3d0eeb..e0edc4b4bac2 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/vs/docker-syncd-vs/Dockerfile.j2 b/platform/vs/docker-syncd-vs/Dockerfile.j2 index 78b01690ec10..dd6bc2d0f71e 100644 --- a/platform/vs/docker-syncd-vs/Dockerfile.j2 +++ b/platform/vs/docker-syncd-vs/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster +FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/rules/config b/rules/config index c51fcd84832c..348c23b17cb3 100644 --- a/rules/config +++ b/rules/config @@ -29,7 +29,10 @@ DEFAULT_BUILD_LOG_TIMESTAMP = none # SONIC_USE_DOCKER_BUILDKIT = y # SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD - use native dockerd for build. -# If set to y SONiC build container will use native dockerd instead of dind for faster build +# If set to y SONiC build container will use native dockerd instead of dind for faster build. +# Special handling of the docker image file names is needed to avoid conflicts with +# other SONiC build jobs on the same server. This requires changes to the Dockerfile.j2 FROM statement +# in the dockers/ and platform/ subdirs to use a variable reference instead of an explicit image name. # SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD = y # SONIC_CONFIG_ENABLE_COLORS - enable colored output in build system. diff --git a/slave.mk b/slave.mk index a68a08fcd56a..e43fe9d5b3fe 100644 --- a/slave.mk +++ b/slave.mk @@ -241,6 +241,10 @@ ifeq ($(SONIC_BUILD_JOBS),) override SONIC_BUILD_JOBS := $(SONIC_CONFIG_BUILD_JOBS) endif +DOCKER_IMAGE_REF = $*-$(DOCKER_USERNAME):$(DOCKER_USERTAG) +DOCKER_DBG_IMAGE_REF = $*-$(DBG_IMAGE_MARK)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) +export DOCKER_USERNAME DOCKER_USERTAG + ifeq ($(VS_PREPARE_MEM),) override VS_PREPARE_MEM := $(DEFAULT_VS_PREPARE_MEM) endif @@ -286,6 +290,7 @@ $(info "CONFIGURED_ARCH" : "$(if $(PLATFORM_ARCH),$(PLATFORM_ARC $(info "SONIC_CONFIG_PRINT_DEPENDENCIES" : "$(SONIC_CONFIG_PRINT_DEPENDENCIES)") $(info "SONIC_BUILD_JOBS" : "$(SONIC_BUILD_JOBS)") $(info "SONIC_CONFIG_MAKE_JOBS" : "$(SONIC_CONFIG_MAKE_JOBS)") +$(info "USE_NATIVE_DOCKERD_FOR_BUILD" : "$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD)") $(info "SONIC_USE_DOCKER_BUILDKIT" : "$(SONIC_USE_DOCKER_BUILDKIT)") $(info "USERNAME" : "$(USERNAME)") $(info "PASSWORD" : "$(PASSWORD)") @@ -361,6 +366,60 @@ endif export kernel_procure_method=$(KERNEL_PROCURE_METHOD) export vs_build_prepare_mem=$(VS_PREPARE_MEM) +############################################################################### +## Canned sequences +############################################################################### +## When multiple builds are triggered on the same build server that causes the docker image naming problem because +## all the build jobs are trying to create the same docker image with latest as tag. +## This happens only when sonic docker images are built using native host dockerd. +## +## docker-swss:latest <=SAVE/LOAD=> docker-swss-: + +# $(call docker-image-save,from,to) +# Sonic docker images are always created with username as extension. During the save operation, +# it removes the username extension from docker image and saved them as compressed tar file for SONiC image generation. +# The save operation is protected with lock for parallel build. +# +# $(1) => Docker name +# $(2) => Docker target name + +define docker-image-save + @echo "Attempting docker image lock for $(1) save" $(LOG) + $(call MOD_LOCK,$(1),$(DOCKER_LOCKDIR),$(DOCKER_LOCKFILE_SUFFIX),$(DOCKER_LOCKFILE_TIMEOUT)) + @echo "Obtained docker image lock for $(1) save" $(LOG) + @echo "Tagging docker image $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) as $(1):latest" $(LOG) + docker tag $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) $(1):latest $(LOG) + @echo "Saving docker image $(1):latest" $(LOG) + docker save $(1):latest | gzip -c > $(2) + @echo "Removing docker image $(1):latest" $(LOG) + docker rmi -f $(1):latest $(LOG) + $(call MOD_UNLOCK,$(1)) + @echo "Released docker image lock for $(1) save" $(LOG) + @echo "Removing docker image $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG)" $(LOG) + docker rmi -f $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) $(LOG) +endef + +# $(call docker-image-load,from) +# Sonic docker images are always created with username as extension. During the load operation, +# it loads the docker image from compressed tar file and tag them with username as extension. +# The load operation is protected with lock for parallel build. +# +# $(1) => Docker name +# $(2) => Docker target name +define docker-image-load + @echo "Attempting docker image lock for $(1) load" $(LOG) + $(call MOD_LOCK,$(1),$(DOCKER_LOCKDIR),$(DOCKER_LOCKFILE_SUFFIX),$(DOCKER_LOCKFILE_TIMEOUT)) + @echo "Obtained docker image lock for $(1) load" $(LOG) + @echo "Loading docker image $(TARGET_PATH)/$(1).gz" $(LOG) + docker load -i $(TARGET_PATH)/$(1).gz $(LOG) + @echo "Tagging docker image $(1):latest as $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG)" $(LOG) + docker tag $(1):latest $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) $(LOG) + @echo "Removing docker image $(1):latest" $(LOG) + docker rmi -f $(1):latest $(LOG) + $(call MOD_UNLOCK,$(1)) + @echo "Released docker image lock for $(1) load" $(LOG) +endef + ############################################################################### ## Local targets ############################################################################### @@ -752,9 +811,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.g --build-arg docker_container_name=$($*.gz_CONTAINER_NAME) \ --label Tag=$(SONIC_IMAGE_VERSION) \ -f $(TARGET_DOCKERFILE)/Dockerfile.buildinfo \ - -t $* $($*.gz_PATH) $(LOG) - scripts/collect_docker_version_files.sh $* $(TARGET_PATH) - docker save $* | gzip -c > $@ + -t $(DOCKER_IMAGE_REF) $($*.gz_PATH) $(LOG) + scripts/collect_docker_version_files.sh $(DOCKER_IMAGE_REF) $(TARGET_PATH) + $(call docker-image-save,$*,$@) # Clean up if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && quilt pop -a -f; [ -d .pc ] && rm -rf .pc; popd; fi $(FOOTER) @@ -871,9 +930,9 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform --label com.azure.sonic.manifest="$$(cat $($*.gz_PATH)/manifest.json)" \ --label Tag=$(SONIC_IMAGE_VERSION) \ $($(subst -,_,$(notdir $($*.gz_PATH)))_labels) \ - -t $* $($*.gz_PATH) $(LOG) - scripts/collect_docker_version_files.sh $* $(TARGET_PATH) - docker save $* | gzip -c > $@ + -t $(DOCKER_IMAGE_REF) $($*.gz_PATH) $(LOG) + scripts/collect_docker_version_files.sh $(DOCKER_IMAGE_REF) $(TARGET_PATH) + $(call docker-image-save,$*,$@) # Clean up if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && quilt pop -a -f; [ -d .pc ] && rm -rf .pc; popd; fi @@ -885,7 +944,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform SONIC_TARGET_LIST += $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) -# Targets for building docker images +# Targets for building docker debug images $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAGE_MARK).gz : .platform docker-start \ $$(addprefix $(TARGET_PATH)/,$$($$*.gz_AFTER)) \ $$(addprefix $$($$*.gz_DEBS_PATH)/,$$($$*.gz_DBG_DEPENDS)) \ @@ -905,7 +964,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAG $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbg_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_image_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_IMAGE_PACKAGES)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbg_pkgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_APT_PACKAGES),RDEPENDS))\n" | awk '!a[$$0]++')) - ./build_debug_docker_j2.sh $* $(subst -,_,$(notdir $($*.gz_PATH)))_dbg_debs $(subst -,_,$(notdir $($*.gz_PATH)))_image_dbgs > $($*.gz_PATH)/Dockerfile-dbg.j2 + ./build_debug_docker_j2.sh $(DOCKER_IMAGE_REF) $(subst -,_,$(notdir $($*.gz_PATH)))_dbg_debs $(subst -,_,$(notdir $($*.gz_PATH)))_image_dbgs > $($*.gz_PATH)/Dockerfile-dbg.j2 j2 $($*.gz_PATH)/Dockerfile-dbg.j2 > $($*.gz_PATH)/Dockerfile-dbg $(call generate_manifest,$*,dbg) # Prepare docker build info @@ -923,10 +982,11 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAG --label com.azure.sonic.manifest="$$(cat $($*.gz_PATH)/manifest.json)" \ --label Tag=$(SONIC_IMAGE_VERSION) \ --file $($*.gz_PATH)/Dockerfile-dbg \ - -t $*-dbg $($*.gz_PATH) $(LOG) - scripts/collect_docker_version_files.sh $*-dbg $(TARGET_PATH) - docker save $*-dbg | gzip -c > $@ + -t $(DOCKER_DBG_IMAGE_REF) $($*.gz_PATH) $(LOG) + scripts/collect_docker_version_files.sh $(DOCKER_DBG_IMAGE_REF) $(TARGET_PATH) + $(call docker-image-save,$*-$(DBG_IMAGE_MARK),$@) # Clean up + docker rmi -f $(DOCKER_IMAGE_REF) &> /dev/null || true if [ -f $($*.gz_PATH).patch/series ]; then pushd $($*.gz_PATH) && quilt pop -a -f; [ -d .pc ] && rm -rf .pc; popd; fi # Save the target deb into DPKG cache @@ -952,7 +1012,7 @@ endif $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TARGET_PATH)/$$*.gz $(HEADER) - docker load -i $(TARGET_PATH)/$*.gz $(LOG) + $(call docker-image-load,$*) $(FOOTER) ############################################################################### From 1d84e0d7df0054b80c9958289bd97897d8c869c0 Mon Sep 17 00:00:00 2001 From: shlomibitton <60430976+shlomibitton@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:35:14 +0300 Subject: [PATCH 264/817] [Fastboot] Delay LLDP service for better fastboot performance (#10568) - Why I did it Profiling the system state on init after fast-reboot during create_switch function execution, it is possible to see few python scripts running at the same time. This parallel execution consume CPU time and the duration of create_switch is longer than it should be. Following this finding, and the motivation to ensure these services will not interfere in the future, LLDP is delayed in 90 seconds until the system finish the init flow after fastboot. - How I did it Add a timer for LLDP service. Copy the timer file to the host bin image. - How to verify it Run fast-reboot on MLNX platform and observe faster create_switch execution time. This PR is dependent on PR: #10567 --- files/build_templates/init_cfg.json.j2 | 4 +-- files/build_templates/lldp.timer.j2 | 1 + .../per_namespace/lldp.service.j2 | 3 -- .../per_namespace/lldp.timer.j2 | 12 +++++++ .../build_templates/sonic_debian_extension.j2 | 15 ++++++++- files/scripts/syncd.sh | 13 ++++++-- slave.mk | 31 +++++++++++++++++++ 7 files changed, 70 insertions(+), 9 deletions(-) create mode 120000 files/build_templates/lldp.timer.j2 create mode 100644 files/build_templates/per_namespace/lldp.timer.j2 diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index a7f1e54a4e15..31249abd5823 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -29,7 +29,7 @@ }, {%- set features = [("bgp", "enabled", false, "enabled"), ("database", "always_enabled", false, "always_enabled"), - ("lldp", "enabled", false, "enabled"), + ("lldp", "enabled", true, "enabled"), ("pmon", "enabled", false, "enabled"), ("radv", "enabled", false, "enabled"), ("snmp", "enabled", true, "enabled"), @@ -83,6 +83,6 @@ "state" : "disabled", {% endif %} "rate_limit_interval" : "600" }{%if not loop.last %},{% endif -%} -{% endfor %} +{% endfor %} } } diff --git a/files/build_templates/lldp.timer.j2 b/files/build_templates/lldp.timer.j2 new file mode 120000 index 000000000000..8e6950d6f3bc --- /dev/null +++ b/files/build_templates/lldp.timer.j2 @@ -0,0 +1 @@ +per_namespace/lldp.timer.j2 \ No newline at end of file diff --git a/files/build_templates/per_namespace/lldp.service.j2 b/files/build_templates/per_namespace/lldp.service.j2 index 02ab99dca463..d23abc0a127a 100644 --- a/files/build_templates/per_namespace/lldp.service.j2 +++ b/files/build_templates/per_namespace/lldp.service.j2 @@ -20,6 +20,3 @@ ExecStartPre=/usr/local/bin/{{docker_container_name}}.sh start{% if multi_instan ExecStart=/usr/local/bin/{{docker_container_name}}.sh wait{% if multi_instance == 'true' %} %i{% endif %} ExecStop=/usr/local/bin/{{docker_container_name}}.sh stop{% if multi_instance == 'true' %} %i{% endif %} RestartSec=30 - -[Install] -WantedBy=sonic.target diff --git a/files/build_templates/per_namespace/lldp.timer.j2 b/files/build_templates/per_namespace/lldp.timer.j2 new file mode 100644 index 000000000000..67622a32851b --- /dev/null +++ b/files/build_templates/per_namespace/lldp.timer.j2 @@ -0,0 +1,12 @@ +[Unit] +# This delay is for fast/warm reboot performance +Description=Delays LLDP docker until SONiC has started +PartOf=lldp{% if multi_instance == 'true' %}@%i{% endif %}.service + +[Timer] +OnUnitActiveSec=0 sec +OnBootSec=1min 30 sec +Unit=lldp{% if multi_instance == 'true' %}@%i{% endif %}.service + +[Install] +WantedBy=timers.target sonic.target sonic-delayed.target diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index c51d6d4543e8..0cdabf7cfaaa 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -655,7 +655,7 @@ fi ## ensure proc is mounted sudo mount proc /proc -t proc || true if [[ $CONFIGURED_ARCH == armhf ]]; then - # A workaround to fix the armhf build hung issue, caused by sonic-platform-nokia-7215_1.0_armhf.deb post installation script + # A workaround to fix the armhf build hung issue, caused by sonic-platform-nokia-7215_1.0_armhf.deb post installation script ps -eo pid,cmd | grep python | grep "/etc/entropy.py" | awk '{print $1}' | xargs sudo kill -9 2>/dev/null || true fi @@ -774,6 +774,19 @@ if [ -f {{service}} ]; then echo "{{service}}" | sudo tee -a $GENERATED_SERVICE_FILE fi {% endfor %} +{% for timer in installer_timers.split(' ') -%} +if [ -f {{timer}} ]; then + sudo cp {{timer}} $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM + + {% if "@" in timer %} + MULTI_INSTANCE="{{timer}}" + SINGLE_INSTANCE=${MULTI_INSTANCE/"@"} + sudo cp $SINGLE_INSTANCE $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM + {% endif %} + + echo "{{timer}}" | sudo tee -a $GENERATED_SERVICE_FILE +fi +{% endfor %} if [ -f iccpd.service ]; then sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable iccpd.service fi diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 889495e8c50a..83f99d70d7e8 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -44,12 +44,19 @@ function startplatform() { } function waitplatform() { - + if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then debug "Starting pmon service..." /bin/systemctl start pmon debug "Started pmon service" fi + if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then + debug "LLDP service is delayed by a timer for better fast/warm boot performance" + else + debug "Starting lldp service..." + /bin/systemctl start lldp + debug "Started lldp service" + fi } function stopplatform1() { @@ -64,7 +71,7 @@ function stopplatform1() { debug "${TYPE} shutdown syncd process ..." /usr/bin/docker exec -i syncd$DEV /usr/bin/syncd_request_shutdown --${TYPE} - # wait until syncd quits gracefully or force syncd to exit after + # wait until syncd quits gracefully or force syncd to exit after # waiting for 20 seconds start_in_secs=${SECONDS} end_in_secs=${SECONDS} @@ -76,7 +83,7 @@ function stopplatform1() { done if [[ $((end_in_secs - start_in_secs)) -gt $timer_threshold ]]; then - debug "syncd process in container syncd$DEV did not exit gracefully" + debug "syncd process in container syncd$DEV did not exit gracefully" fi /usr/bin/docker exec -i syncd$DEV /bin/sync diff --git a/slave.mk b/slave.mk index e43fe9d5b3fe..7342870ac2a7 100644 --- a/slave.mk +++ b/slave.mk @@ -1162,6 +1162,14 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(eval $(docker:-dbg.gz=.gz)_GLOBAL = yes) ) fi + if [ -f files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 ]; then + j2 files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer + + # Set the flag GLOBAL_TIMER for all the global system-wide dockers timers. + $(if $(shell ls files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 2>/dev/null),\ + $(eval $(docker:-dbg.gz=.gz)_GLOBAL_TIMER = yes) + ) + fi # Any service template, inside instance directory, will be used to generate .service and @.service file. if [ -f files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then export multi_instance="true" @@ -1172,6 +1180,16 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export multi_instance="false" j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service fi + # Any timer template, inside instance directory, will be used to generate .timer and @.timer file. + if [ -f files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 ]; then + export multi_instance="true" + j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME)@.timer + $(if $(shell ls files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 2>/dev/null),\ + $(eval $(docker:-dbg.gz=.gz)_TEMPLATE_TIMER = yes) + ) + export multi_instance="false" + j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer + fi # Any service template, inside share_image directory, will be used to generate -chassis.service file. # TODO: need better way to name the image-shared service if [ -f files/build_templates/share_image/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then @@ -1209,7 +1227,20 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(eval SERVICES += "$(addsuffix -chassis.service, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))") ) ) + # Marks template timers with an "@" according to systemd convention + # If the $($docker)_TEMPLATE_TIMER) variable is set, the timer will be treated as a template + # If the $($docker)_GLOBAL_TIMER) and $($docker)_TEMPLATE_TIMER) variables are set the timer will be added both as a global and template timer. + $(foreach docker, $($*_DOCKERS),\ + $(if $($(docker:-dbg.gz=.gz)_TEMPLATE_TIMER),\ + $(if $($(docker:-dbg.gz=.gz)_GLOBAL_TIMER),\ + $(eval TIMERS += "$(addsuffix .timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))")\ + )\ + $(eval TIMERS += "$(addsuffix @.timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))"),\ + $(eval TIMERS += "$(addsuffix .timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))") + ) + ) export installer_services="$(SERVICES)" + export installer_timers="$(TIMERS)" export installer_extra_files="$(foreach docker, $($*_DOCKERS), $(foreach file, $($(docker:-dbg.gz=.gz)_BASE_IMAGE_FILES), $($(docker:-dbg.gz=.gz)_PATH)/base_image_files/$(file)))" From 6e88f05a45f24bed1d3d46431705aebef63b318f Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 29 Apr 2022 07:17:52 +0800 Subject: [PATCH 265/817] Fix the build target error when building sonic-rest-api (#10693) Why I did it Fix target target/debs/bullseye/sonic-rest-api_1.0.1_arm64.deb not existing issue, the correct target is target/debs/bullseye/sonic-rest-api_1.0.1_armhf.deb. Fix issue: #9896 [ FAIL LOG START ] [ target/debs/stretch/sonic-rest-api_1.0.1_amd64.deb ] [ REASON ] : target/debs/stretch/sonic-rest-api_1.0.1_amd64.deb does not exist NON-EXISTENT PREREQUISITES: [ FLAGS FILE ] : [] --- rules/restapi.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/restapi.mk b/rules/restapi.mk index e66b4a1d976a..21eed4cfbb51 100644 --- a/rules/restapi.mk +++ b/rules/restapi.mk @@ -1,6 +1,6 @@ # sonic-rest-api package -RESTAPI = sonic-rest-api_1.0.1_amd64.deb +RESTAPI = sonic-rest-api_1.0.1_$(CONFIGURED_ARCH).deb $(RESTAPI)_SRC_PATH = $(SRC_PATH)/sonic-restapi $(RESTAPI)_DEPENDS += $(LIBHIREDIS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) \ $(LIBNL_ROUTE3_DEV) $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) From e0f5333d9ceb908cbfc5e25b88197de224c1cfe8 Mon Sep 17 00:00:00 2001 From: Mohamed Ghoneim Date: Thu, 28 Apr 2022 17:29:56 -0700 Subject: [PATCH 266/817] [SY] Adding exceptlionList to validation exception (#10699) #### Why I did it Adding exceptlionList to validation exception #### How I did it Check code. #### How to verify it Ran manually. - Run full config validation from a KVM - Print the thrown exception **Before** ``` Error: Data Loading Failed All Keys are not parsed in FEATURE dict_keys(['telemetry']) ``` **After** ``` Error: Data Loading Failed All Keys are not parsed in FEATURE dict_keys(['telemetry']) exceptionList:["'status'"] ``` #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-yang-mgmt/sonic_yang_ext.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py index d43e52970302..424e567f79d3 100644 --- a/src/sonic-yang-mgmt/sonic_yang_ext.py +++ b/src/sonic-yang-mgmt/sonic_yang_ext.py @@ -661,8 +661,8 @@ def _xlateContainer(self, model, yang, config, table): configC.keys()), debug=syslog.LOG_ERR, doPrint=True) self.sysLog(msg="exceptionList:{}".format(exceptionList), \ debug=syslog.LOG_ERR, doPrint=True) - raise(Exception("All Keys are not parsed in {}\n{}".format(table, \ - configC.keys()))) + raise(Exception("All Keys are not parsed in {}\n{}\nexceptionList:{}".format(table, \ + configC.keys(), exceptionList))) return From ede1e0e88963a4d3646b61341130806d90880760 Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Thu, 28 Apr 2022 20:39:56 -0700 Subject: [PATCH 267/817] Adjustment to ingress pool size to accomodate brcm sai (#10694) --- .../Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 index 6a524f980697..a7441471e0cc 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 @@ -11,7 +11,7 @@ {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "32669440", + "size": "32689152", "type": "ingress", "mode": "dynamic", "xoff": "2058240" From d258db8aa282b3f0a7a5b00321bc49065c8f3c1d Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Fri, 29 Apr 2022 13:40:33 +0800 Subject: [PATCH 268/817] [CG] Fix CG alert about underscore version. (#10705) --- .../0004-Remove-underscore-packages.patch | 60 +++++++++++++++++++ src/thrift_0_14_1/thrift.patch/series | 1 + 2 files changed, 61 insertions(+) create mode 100644 src/thrift_0_14_1/thrift.patch/0004-Remove-underscore-packages.patch diff --git a/src/thrift_0_14_1/thrift.patch/0004-Remove-underscore-packages.patch b/src/thrift_0_14_1/thrift.patch/0004-Remove-underscore-packages.patch new file mode 100644 index 000000000000..fd49e9d5655a --- /dev/null +++ b/src/thrift_0_14_1/thrift.patch/0004-Remove-underscore-packages.patch @@ -0,0 +1,60 @@ +diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json +index fddef4426..93a3cbb8f 100644 +--- a/lib/ts/package-lock.json ++++ b/lib/ts/package-lock.json +@@ -2639,8 +2639,7 @@ + "mkdirp": "~0.5.1", + "requizzle": "~0.2.1", + "strip-json-comments": "~2.0.1", +- "taffydb": "2.6.2", +- "underscore": "~1.8.3" ++ "taffydb": "2.6.2" + } + }, + "jshint": { +@@ -3873,17 +3872,7 @@ + "requizzle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", +- "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", +- "requires": { +- "underscore": "~1.6.0" +- }, +- "dependencies": { +- "underscore": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", +- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" +- } +- } ++ "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=" + }, + "resolve": { + "version": "1.9.0", +@@ -4622,25 +4611,10 @@ + "xtend": "^4.0.1" + } + }, +- "underscore": { +- "version": "1.8.3", +- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", +- "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" +- }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", +- "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", +- "requires": { +- "underscore": "1.6.0" +- }, +- "dependencies": { +- "underscore": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", +- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" +- } +- } ++ "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=" + }, + "underscore.string": { + "version": "3.3.5", diff --git a/src/thrift_0_14_1/thrift.patch/series b/src/thrift_0_14_1/thrift.patch/series index 9fe00d007f63..19ba4dba26f3 100644 --- a/src/thrift_0_14_1/thrift.patch/series +++ b/src/thrift_0_14_1/thrift.patch/series @@ -1,3 +1,4 @@ 0001-Remove-unneeded-packages.patch 0002-Fix-build-rules.patch 0003-Remove-minimist-packages.patch +0004-Remove-underscore-packages.patch From 53e5fe6a93b051c8319d51e109d317beb5166e77 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Fri, 29 Apr 2022 13:50:59 -0400 Subject: [PATCH 269/817] [Mellanox] Upgrade mellanox SDK to 4.5.1500 and mlnx-sai to 1.21.1.1 (#10675) Update SDK/FW to 4.5.1500/2010.1500 and SAI version to 1.21.1.1 SDK/FW features: 1. Added support for Finisar DR4 (FTCD4523E2PCM) on Spectrum-2 and Spectrum-3 systems. SAI Features: 1. ECMP overlay support for IPv6 2. BFD offloading / 4K scale 3. Host interface user traps + improved trap registration (table entry) 4. gcc11 compilation fixes 5. Read support for ACL redirect action 6. Optimize ECMP DB size 7. Buffer descriptors new defaults 8. Updated port mapping for SN2201 SAI Fixes: 1. Debug counter removal when configured with all drop reasons - Why I did it Upgrade Mellanox SDK and SAI versions to latest - How I did it Updated submodule pointers - How to verify it Regression tested --- platform/mellanox/fw.mk | 6 +++--- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/mlnx-sai/SAI-Implementation | 2 +- platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers | 2 +- platform/mellanox/sdk.mk | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 8293b38cd5fe..e2ccc2ad7dc8 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -27,17 +27,17 @@ else FW_FROM_URL = n endif -MLNX_SPC_FW_VERSION = 13.2010.1218 +MLNX_SPC_FW_VERSION = 13.2010.1500 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2010.1218 +MLNX_SPC2_FW_VERSION = 29.2010.1500 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) -MLNX_SPC3_FW_VERSION = 30.2010.1218 +MLNX_SPC3_FW_VERSION = 30.2010.1500 MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index c8a394e1f355..d49a832aff9e 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,6 +1,6 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIRel1.20.2.5 +MLNX_SAI_VERSION = SAIRel1.21.1.1 export MLNX_SAI_VERSION diff --git a/platform/mellanox/mlnx-sai/SAI-Implementation b/platform/mellanox/mlnx-sai/SAI-Implementation index 0f9cf1d39107..a01442acd95e 160000 --- a/platform/mellanox/mlnx-sai/SAI-Implementation +++ b/platform/mellanox/mlnx-sai/SAI-Implementation @@ -1 +1 @@ -Subproject commit 0f9cf1d39107f2d8f78c4b2807aa4e32862cca68 +Subproject commit a01442acd95e3a4f78a8e4b04b227fcbe905771e diff --git a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers index 37475d91930e..a0416e20a2b9 160000 --- a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers +++ b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers @@ -1 +1 @@ -Subproject commit 37475d91930e3aae3490a4423da280a5cae72407 +Subproject commit a0416e20a2b9b304cb2c9b629c071f76db0ca2aa diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 08051e5ca0c7..ba152c953808 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -16,7 +16,7 @@ # MLNX_SDK_BASE_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel/Switch-SDK-drivers/bin/ MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/ -MLNX_SDK_VERSION = 4.5.1208 +MLNX_SDK_VERSION = 4.5.1500 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DEB_VERSION = $(subst -,.,$(subst _,.,$(MLNX_SDK_VERSION))) From 80f5d36a5b70ba2ae3049938e29b5f1dc619f73d Mon Sep 17 00:00:00 2001 From: Sumukha Tumkur Vani Date: Sat, 30 Apr 2022 10:39:13 -0700 Subject: [PATCH 270/817] [SWSS] Update submodule (#10719) Add the following commits: - [orchagent, crm]: Reset crm threshold exceed count when threshold type changed 5ba6a54786c0fd9b155bb9ea2a7ed724a58aab74 - [pbh] [aclorch] Fixed a bug causes by updating the flow-counter value for the PBH rule 841f00389b338e91ddc4de460ace4ff96adfa796 - [ACL]Avoid incrementing crm count when ACL rule create fails 3d3364f9715fa05fbdf2d09b08676c3055903b84 - set remote vtep the netdev down before delete 7f53db782aed2973f4ff6807911b5a549461f3c7 - Removing Vnet with scope default 2ea8581da4ba6f97bebde4845a234d7c810e5515 --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 1fd1dbfe7eaa..2ea8581da4ba 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 1fd1dbfe7eaaa52f1d7edbdd2bb88483f031fd5e +Subproject commit 2ea8581da4ba6f97bebde4845a234d7c810e5515 From 4ec3af86af5c9ed2da21df33111fa84181069a3e Mon Sep 17 00:00:00 2001 From: shlomibitton <60430976+shlomibitton@users.noreply.github.com> Date: Mon, 2 May 2022 10:44:17 +0300 Subject: [PATCH 271/817] [Fastboot] Delay PMON service for better fastboot performance (#10567) - Why I did it Profiling the system state on init after fast-reboot during create_switch function execution, it is possible to see few python scripts running at the same time. This parallel execution consume CPU time and the duration of create_switch is longer than it should be. Following this finding, and the motivation to ensure these services will not interfere in the future, PMON is delayed in 90 seconds until the system finish the init flow after fastboot. - How I did it Add a timer for PMON service. Exclude for MLNX platform the start trigger of PMON when SYNCD starts in case of fastboot. Copy the timer file to the host bin image. - How to verify it Run fast-reboot on MLNX platform and observe faster create_switch execution time. --- files/build_templates/init_cfg.json.j2 | 1 + files/build_templates/pmon.service.j2 | 3 --- files/build_templates/pmon.timer | 12 ++++++++++++ files/build_templates/sonic_debian_extension.j2 | 3 +++ files/scripts/syncd.sh | 11 ++++++++--- 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 files/build_templates/pmon.timer diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index 31249abd5823..b51aaf2f0c14 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -30,6 +30,7 @@ {%- set features = [("bgp", "enabled", false, "enabled"), ("database", "always_enabled", false, "always_enabled"), ("lldp", "enabled", true, "enabled"), + ("pmon", "enabled", true, "enabled"), ("pmon", "enabled", false, "enabled"), ("radv", "enabled", false, "enabled"), ("snmp", "enabled", true, "enabled"), diff --git a/files/build_templates/pmon.service.j2 b/files/build_templates/pmon.service.j2 index 2cc28b1fc13e..2e7ebca1c72a 100644 --- a/files/build_templates/pmon.service.j2 +++ b/files/build_templates/pmon.service.j2 @@ -17,6 +17,3 @@ ExecStartPre=/usr/bin/{{docker_container_name}}.sh start ExecStart=/usr/bin/{{docker_container_name}}.sh wait ExecStop=/usr/bin/{{docker_container_name}}.sh stop RestartSec=30 - -[Install] -WantedBy=sonic.target diff --git a/files/build_templates/pmon.timer b/files/build_templates/pmon.timer new file mode 100644 index 000000000000..2993051607ef --- /dev/null +++ b/files/build_templates/pmon.timer @@ -0,0 +1,12 @@ +[Unit] +# This delay is for fast/warm reboot performance +Description=Delays pmon docker until SONiC has started +PartOf=pmon.service + +[Timer] +OnUnitActiveSec=0 sec +OnBootSec=1min 30 sec +Unit=pmon.service + +[Install] +WantedBy=timers.target sonic.target sonic-delayed.target diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 0cdabf7cfaaa..516df5fd224f 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -831,6 +831,9 @@ sudo cp $BUILD_TEMPLATES/mgmt-framework.timer $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_S echo "mgmt-framework.timer" | sudo tee -a $GENERATED_SERVICE_FILE {% endif %} +sudo cp $BUILD_TEMPLATES/pmon.timer $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM +echo "pmon.timer" | sudo tee -a $GENERATED_SERVICE_FILE + sudo cp $BUILD_TEMPLATES/sonic.target $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable sonic.target diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 83f99d70d7e8..628609e0a5f0 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -45,10 +45,15 @@ function startplatform() { function waitplatform() { + BOOT_TYPE=`getBootType` if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then - debug "Starting pmon service..." - /bin/systemctl start pmon - debug "Started pmon service" + if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then + debug "PMON service is delayed by a timer for better fast/warm boot performance" + else + debug "Starting pmon service..." + /bin/systemctl start pmon + debug "Started pmon service" + fi fi if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then debug "LLDP service is delayed by a timer for better fast/warm boot performance" From a9d5858da14d7980adacd4e00561e362a4253156 Mon Sep 17 00:00:00 2001 From: Song Yuan <64041228+ysmanman@users.noreply.github.com> Date: Mon, 2 May 2022 09:49:42 -0700 Subject: [PATCH 272/817] Fix buffer template for Arista SKU. (#10663) Why I did it The buffer pool & profile setting in buffer template was not correct and caused the errors like the following: ERR swss#orchagent: :- parseReference: malformed reference:[BUFFER_PROFILE|ingress_lossless_profile]. Must not be surrounded by [ ] How I did it Fix the buffer pool & profile setting by removing "[]". How to verify it Loaded image with this fix in a switch and made sure the error was not seen anymore. --- .../buffers_defaults_t2.j2 | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 index b5931bd37268..b292a354b55a 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 @@ -1,4 +1,3 @@ - {%- set default_cable = '5m' %} {%- macro generate_port_lists(PORT_ALL) %} @@ -19,7 +18,7 @@ }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"1280", "dynamic_th":"-2", "xon_offset":"2560", @@ -27,18 +26,18 @@ "xoff":"66048" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "xon_offset":"0", "static_th":"30535680" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"33030144" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "dynamic_th":"-1" } @@ -49,18 +48,18 @@ "BUFFER_QUEUE": { {% for port in port_names.split(',') %} "{{ port }}|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, {% endfor %} {% for port in port_names.split(',') %} "{{ port }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, {% endfor %} {% for port in port_names.split(',') %} "{{ port }}|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }{% if not loop.last %},{% endif %} {% endfor %} } -{%- endmacro %} \ No newline at end of file +{%- endmacro %} From 0a6bb3f6f0c6ce70d0643a9adc2d8276c7f80e11 Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Mon, 2 May 2022 19:51:30 +0300 Subject: [PATCH 273/817] [yang] add yang options for Context object (#10359) #### Why I did it Need to pass LY_CTX_DISABLE_SEARCHDIR_CWD to Context in order to disable automatically searching for schemas in current working directory (which is by default searched automatically) #### How I did it add additional attribute into YANG context #### How to verify it Create some invalid link on switch : 1) **ln -s /usr/abc xxx** 2) run **spm list** --> There should not be these messages: ``` libyang[1]: Unable to get information about "xxx" file in "/tmp" when searching for (sub)modules (No such file or directory) libyang[1]: Unable to get information about "xxx" file in "/tmp" when searching for (sub)modules (No such file or directory) libyang[1]: Unable to get information about "xxx" file in "/tmp" when searching for (sub)modules (No such file or directory) libyang[1]: Unable to get information about "xxx" file in "/tmp" when searching for (sub)modules (No such file or directory) ``` --- src/sonic-yang-mgmt/sonic_yang.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-mgmt/sonic_yang.py b/src/sonic-yang-mgmt/sonic_yang.py index 16aeb8a9ff8a..6bf590fced38 100644 --- a/src/sonic-yang-mgmt/sonic_yang.py +++ b/src/sonic-yang-mgmt/sonic_yang.py @@ -12,7 +12,7 @@ """ class SonicYang(SonicYangExtMixin): - def __init__(self, yang_dir, debug=False, print_log_enabled=True): + def __init__(self, yang_dir, debug=False, print_log_enabled=True, sonic_yang_options=0): self.yang_dir = yang_dir self.ctx = None self.module = None @@ -46,7 +46,7 @@ def __init__(self, yang_dir, debug=False, print_log_enabled=True): self.preProcessedYang = dict() try: - self.ctx = ly.Context(yang_dir) + self.ctx = ly.Context(yang_dir, sonic_yang_options) except Exception as e: self.fail(e) From a1e76d25b727da8f8493dfa9eb1a1433564d790c Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Tue, 3 May 2022 02:09:16 +0800 Subject: [PATCH 274/817] [as7816-64x] Update installer.conf (#10418) Co-authored-by: ecsonic Why I did it The customer report of the PCIe Bus Errors upon the SDK initialization of as7816-64x. How I did it Based on the internal info and discussion, update "pcie_aspm=off" into ONIE_PLATFORM_EXTRA_CMDLINE_LINUX of installer.conf to resolve it. --- device/accton/x86_64-accton_as7816_64x-r0/installer.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/accton/x86_64-accton_as7816_64x-r0/installer.conf b/device/accton/x86_64-accton_as7816_64x-r0/installer.conf index 9fa12f888545..ca2e5039b362 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/installer.conf +++ b/device/accton/x86_64-accton_as7816_64x-r0/installer.conf @@ -1,2 +1,2 @@ CONSOLE_SPEED=115200 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="tg3.short_preamble=1 tg3.bcm5718s_reset=1" +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="tg3.short_preamble=1 tg3.bcm5718s_reset=1 pcie_aspm=off" From 243d0c73f96991ec0efbde76c7ea1358c833cd48 Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Mon, 2 May 2022 17:14:13 -0700 Subject: [PATCH 275/817] [dhcp6relay] Add retry mechanism for binding socket to interface ipv6 addresses (#10712) --- src/dhcp6relay/src/relay.cpp | 71 +++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index 234646c1fb74..951b31f90a0c 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -378,44 +378,57 @@ void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int memset(&ll_addr, 0, sizeof(ll_addr)); if ((*local_sock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket: Failed to create socket\n"); + syslog(LOG_ERR, "socket: Failed to create socket on interface %s\n", config->interface.c_str()); } if ((*server_sock= socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket: Failed to create socket\n"); + syslog(LOG_ERR, "socket: Failed to create socket on interface %s\n", config->interface.c_str()); } - - if (getifaddrs(&ifa) == -1) { - syslog(LOG_WARNING, "getifaddrs: Unable to get network interfaces\n"); - exit(1); - } - - ifa_tmp = ifa; - while (ifa_tmp) { - if (ifa_tmp->ifa_addr->sa_family == AF_INET6) { - struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; - if((strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0) && !IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - in6->sin6_family = AF_INET6; - in6->sin6_port = htons(RELAY_PORT); - addr = *in6; - } - if((strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0) && IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - in6->sin6_family = AF_INET6; - in6->sin6_port = htons(RELAY_PORT); - ll_addr = *in6; + int retry = 0; + bool bind_addr = false; + bool bind_ll_addr = false; + do { + if (getifaddrs(&ifa) == -1) { + syslog(LOG_WARNING, "getifaddrs: Unable to get network interfaces with %s\n", strerror(errno)); + } + else { + ifa_tmp = ifa; + while (ifa_tmp) { + if ((ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { + struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; + if(!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { + bind_addr = true; + in6->sin6_family = AF_INET6; + in6->sin6_port = htons(RELAY_PORT); + addr = *in6; + } + if(IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { + bind_ll_addr = true; + in6->sin6_family = AF_INET6; + in6->sin6_port = htons(RELAY_PORT); + ll_addr = *in6; + } + } + ifa_tmp = ifa_tmp->ifa_next; } + freeifaddrs(ifa); } - ifa_tmp = ifa_tmp->ifa_next; - } - freeifaddrs(ifa); - - if (bind(*local_sock, (sockaddr *)&addr, sizeof(addr)) == -1) { - syslog(LOG_ERR, "bind: Failed to bind to socket\n"); + + if (bind_addr && bind_ll_addr) { + break; + } + + syslog(LOG_WARNING, "Retry #%d to bind to sockets on interface %s\n", ++retry, config->interface.c_str()); + sleep(5); + } while (retry < 6); + + if ((!bind_addr) || (bind(*local_sock, (sockaddr *)&addr, sizeof(addr)) == -1)) { + syslog(LOG_ERR, "bind: Failed to bind socket to global ipv6 address on interface %s after %d retries with %s\n", config->interface.c_str(), retry, strerror(errno)); } - if (bind(*server_sock, (sockaddr *)&ll_addr, sizeof(addr)) == -1) { - syslog(LOG_ERR, "bind: Failed to bind to socket\n"); + if ((!bind_ll_addr) || (bind(*server_sock, (sockaddr *)&ll_addr, sizeof(addr)) == -1)) { + syslog(LOG_ERR, "bind: Failed to bind socket to link local ipv6 address on interface %s after %d retries with %s\n", config->interface.c_str(), retry, strerror(errno)); } } From 799d0c0313a5ea812919dca497290fc4ea884078 Mon Sep 17 00:00:00 2001 From: DavidZagury <32644413+DavidZagury@users.noreply.github.com> Date: Wed, 4 May 2022 16:56:21 +0300 Subject: [PATCH 276/817] [YANG] Update range of supported port speeds to support 800G ports (#10687) - Why I did it To add support for 800G speed for port in the yang. - How I did it Change limitation from 400G to 800G. - How to verify it Set a port speed to 800G and run the yang DB validation. e.g. by using dynamic port breakout. --- .../tests/yang_model_tests/tests/port.json | 7 +++ .../yang_model_tests/tests_config/port.json | 51 +++++++++++++++++++ .../yang-models/sonic-port.yang | 4 +- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json index b3aa253c2e72..db9b432714eb 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json @@ -24,6 +24,13 @@ "eStrKey" : "Pattern", "eStr": ["on|off"] }, + "PORT_VALID_SPEEDS_TEST_1": { + "desc": "PORT_VALID_SPEEDS_TEST_1 no failure." + }, + "PORT_INVALID_SPEEDS_TEST_1": { + "desc": "PORT_INVALID_SPEEDS_TEST_1 InvalidValue condition failure.", + "eStr": ["pattern", "does not satisfy"] + }, "PORT_VALID_ADVSPEEDS_TEST_1": { "desc": "PORT_VALID_ADVSPEEDS_TEST_1 no failure." }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json index e1549261cb92..db3334e80d2b 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json @@ -90,6 +90,40 @@ } }, + "PORT_VALID_SPEEDS_TEST_1": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 800000, + "autoneg": "on", + "adv_speeds": [400000, 800000] + } + ] + } + } + }, + + "PORT_INVALID_SPEEDS_TEST_1": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 900000, + "autoneg": "on", + "adv_speeds": [25000,40000] + } + ] + } + } + }, + "PORT_VALID_ADVSPEEDS_TEST_1": { "sonic-port:sonic-port": { "sonic-port:PORT": { @@ -124,6 +158,23 @@ } }, + "PORT_VALID_ADVSPEEDS_TEST_3": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "autoneg": "on", + "adv_speeds": [25000,800000] + } + ] + } + } + }, + "PORT_INVALID_ADVSPEEDS_TEST_1": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index add4de25ce0a..eab52996fb00 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -61,7 +61,7 @@ module sonic-port{ leaf speed { mandatory true; type uint32 { - range 1..400000; + range 1..800000; } } @@ -78,7 +78,7 @@ module sonic-port{ type union { type uint32 { - range 1..400000; + range 1..800000; } type string { pattern "all"; From 6284d136ec964e12f9c05df6b0507ab2dd939294 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Wed, 4 May 2022 18:21:02 +0300 Subject: [PATCH 277/817] [LLDP] Enhance lldmgrd Redis events handling (#10593) Why I did it When lldpmgrd handled events of other tables besides PORT_TABLE, error message was printed to log. How I did it Handle event according to its file descriptor instead of looping all registered selectables for each coming event. How to verify it I verified same events are being handled by printing events key and operation, before and after the change. Also, before the change, in init flow after config reload, when lldpmgrd handled events of other tables besides PORT_TABLE, error messages were printed to log, this issue is solved now. --- dockers/docker-lldp/lldpmgrd | 62 +++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/dockers/docker-lldp/lldpmgrd b/dockers/docker-lldp/lldpmgrd index 93461a42837e..753aa678eaee 100755 --- a/dockers/docker-lldp/lldpmgrd +++ b/dockers/docker-lldp/lldpmgrd @@ -76,6 +76,9 @@ class LldpManager(daemon_base.DaemonBase): self.app_port_table = swsscommon.Table(self.appl_db, swsscommon.APP_PORT_TABLE_NAME) self.state_port_table = swsscommon.Table(self.state_db, swsscommon.STATE_PORT_TABLE_NAME) + self.port_config_done = False + self.port_init_done = False + def update_hostname(self, hostname): cmd = "lldpcli configure system hostname {0}".format(hostname) self.log_debug("Running command: '{}'".format(cmd)) @@ -247,6 +250,23 @@ class LldpManager(daemon_base.DaemonBase): self.log_info("Hostname changed old {0}, new {1}".format(self.hostname, hostname)) self.update_hostname(hostname) + def lldp_process_port_table_event(self, key, op, fvp): + if (key != "PortInitDone") and (key != "PortConfigDone"): + if op == "SET": + if fvp: + if "up" in dict(fvp).get("oper_status",""): + self.generate_pending_lldp_config_cmd_for_port(key, dict(fvp)) + else: + self.pending_cmds.pop(key, None) + elif op == "DEL": + self.pending_cmds.pop(key, None) + else: + self.log_error("unknown operation '{}'".format(op)) + elif key == "PortInitDone": + self.port_init_done = True + elif key == "PortConfigDone": + self.port_config_done = True + def run(self): """ Subscribes to notifications of changes in the PORT table @@ -267,8 +287,6 @@ class LldpManager(daemon_base.DaemonBase): # Daemon is paused on the configuration file to avoid lldp packets with wrong information # until all interfaces are well configured on lldpd - port_init_done = False - port_config_done = False resume_lldp_sent = False start_time = time.time() @@ -288,34 +306,20 @@ class LldpManager(daemon_base.DaemonBase): # Listen for changes to the PORT table in the CONFIG_DB and APP_DB while True: - (state, c) = sel.select(SELECT_TIMEOUT_MS) + (state, selectableObj) = sel.select(SELECT_TIMEOUT_MS) if state == swsscommon.Select.OBJECT: - (key, op, fvp) = sst_mgmt_ip_confdb.pop() - if key: + if selectableObj.getFd() == sst_mgmt_ip_confdb.getFd(): + (key, op, fvp) = sst_mgmt_ip_confdb.pop() self.lldp_process_mgmt_info_change(op, dict(fvp), key) - - (key, op, fvp) = sst_device_confdb.pop() - if key: + elif selectableObj.getFd() == sst_device_confdb.getFd(): + (key, op, fvp) = sst_device_confdb.pop() self.lldp_process_device_table_event(op, dict(fvp), key) - - (key, op, fvp) = sst_appdb.pop() - if (key != "PortInitDone") and (key != "PortConfigDone"): - if op == "SET": - if fvp: - if "up" in dict(fvp).get("oper_status",""): - self.generate_pending_lldp_config_cmd_for_port(key, dict(fvp)) - else: - self.pending_cmds.pop(key, None) - elif op == "DEL": - self.pending_cmds.pop(key, None) - else: - self.log_error("unknown operation") - - elif key == "PortInitDone": - port_init_done = True - elif key == "PortConfigDone": - port_config_done = True + elif selectableObj.getFd() == sst_appdb.getFd(): + (key, op, fvp) = sst_appdb.pop() + self.lldp_process_port_table_event(key, op, fvp) + else: + self.log_error("Got unexpected selectable object") # Process all pending commands self.process_pending_cmds() @@ -323,9 +327,9 @@ class LldpManager(daemon_base.DaemonBase): # Resume the daemon since all interfaces data updated and configured to the lldpd so no miss leading packets will be sent if not resume_lldp_sent: if check_timeout(self, start_time): - port_init_done = port_config_done = True - if port_init_done and port_config_done: - port_init_done = port_config_done = False + self.port_init_done = self.port_config_done = True + if self.port_init_done and self.port_config_done: + self.port_init_done = self.port_config_done = False rc, stderr = run_cmd(self, "lldpcli resume") if rc != 0: self.log_error("Failed to resume lldpd with command: 'lldpcli resume': {}".format(stderr)) From 288d667c66ddf98defea9ea8e41066e24f2b8dbb Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Wed, 4 May 2022 15:05:44 -0700 Subject: [PATCH 278/817] [yang][multi-asic]bgp internal neighbor yang model (#10632) closes #10157 Why I did it Add yang model for the bgp_internal_neighbor table in config_db How I did it Add new yang model file and unit tests How to verify it UT and compile sonic_yang_models-1.0-py3-none-any.whl and sonic_yang_mgmt-1.0-py3-none-any.whl Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 70 +++++++++- .../yang_model_tests/tests/bgp_internal.json | 17 +++ .../tests_config/bgp_internal.json | 128 ++++++++++++++++++ .../sonic-bgp-internal-neighbor.yang | 58 ++++++++ 5 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/bgp_internal.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_internal.json create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-internal-neighbor.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 4ca8d065c6ec..1928643c28ed 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -82,6 +82,7 @@ def run(self): './yang-models/sonic-bgp-common.yang', './yang-models/sonic-bgp-global.yang', './yang-models/sonic-bgp-monitor.yang', + './yang-models/sonic-bgp-internal-neighbor.yang', './yang-models/sonic-bgp-neighbor.yang', './yang-models/sonic-bgp-peergroup.yang', './yang-models/sonic-bgp-peerrange.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 8c5a8c0af909..505c92ba96dd 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -103,18 +103,32 @@ "tpid": "0x9200", "mtu": "9100", "lacp_key": "auto" + }, + "PortChannel42": { + "admin_status": "up", + "members": [ + "Ethernet-BP0", + "Ethernet-BP4" + ], + "min_links": "2", + "mtu": "9100", + "tpid": "0x8100" } }, "PORTCHANNEL_INTERFACE": { "PortChannel0003": { "nat_zone": "1" }, - "PortChannel0004": {"vrf_name": "Vrf_blue"} + "PortChannel0004": {"vrf_name": "Vrf_blue"}, + "PortChannel42|10.1.0.1/31": {}, + "PortChannel42|2603:10e2:400:1::2/126": {} }, "PORTCHANNEL_MEMBER": { "PortChannel0003|Ethernet1": {}, "PortChannel0004|Ethernet2": {}, - "PortChannel2|Ethernet12": {} + "PortChannel2|Ethernet12": {}, + "PortChannel42|Ethernet-BP0": {}, + "PortChannel42|Ethernet-BP4": {} }, "VLAN_INTERFACE": { "Vlan111": { @@ -734,7 +748,33 @@ "speed": "11100", "tpid": "0x8100", "admin_status": "up" - } + }, + "Ethernet-BP0": { + "admin_status": "up", + "alias": "Eth4-ASIC0", + "asic_port_name": "Eth4-ASIC0", + "description": "ASIC2:Eth0-ASIC2", + "index": "0", + "lanes": "17,18,19,20", + "mtu": "9100", + "pfc_asym": "off", + "role": "Int", + "speed": "40000", + "tpid": "0x8100" + }, + "Ethernet-BP4": { + "admin_status": "up", + "alias": "Eth5-ASIC0", + "asic_port_name": "Eth5-ASIC0", + "description": "ASIC2:Eth1-ASIC2", + "index": "1", + "lanes": "21,22,23,24", + "mtu": "9100", + "pfc_asym": "off", + "role": "Int", + "speed": "40000", + "tpid": "0x8100" + } }, "ACL_TABLE": { "V4-ACL-TABLE": { @@ -1704,8 +1744,30 @@ "send_sci": "true", "rekey_period": "3600" } - } + }, + "BGP_INTERNAL_NEIGHBOR": { + "10.1.0.0": { + "asn": "64850", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.1.0.1", + "name": "ASIC1", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + "2603:10e2:400:1::1": { + "asn": "64850", + "holdtime": "180", + "keepalive": "60", + "local_addr": "2603:10e2:400:1::2", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + } }, "SAMPLE_CONFIG_DB_UNKNOWN": { "UNKNOWN_TABLE": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_internal.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_internal.json new file mode 100644 index 000000000000..3438b70c8c5e --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_internal.json @@ -0,0 +1,17 @@ +{ + "BGP_INTERNAL_TEST": { + "desc": "Load bgp internal neighbor table with ipv4 and ipv6 neighbors." + }, + "BGP_INTERNAL_INVALID_ASN_TEST": { + "desc": "Load bgp internal neighbor table with ipv4 neighbor having incorrect asn.", + "eStr": ["Internal iBGP neighbors should have same ASN as defined in device metadata"] + }, + "BGP_INVALID_LOCAL_ADDRESS_FAMILY_TEST": { + "desc": "Load bgp internal ipv4 neighboripv6 local address.", + "eStr": ["local address and neighbor address family doesnt match"] + }, + "BGP_LOCAL_ADDRESS_ABSENT_TEST": { + "desc":"Load bgp internal neighbor table no local address.", + "eStrKey" : "Mandatory" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_internal.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_internal.json new file mode 100644 index 000000000000..07a26ab34556 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_internal.json @@ -0,0 +1,128 @@ +{ + "BGP_INTERNAL_TEST": { + "sonic-bgp-internal-neighbor:sonic-bgp-internal-neighbor": { + "sonic-bgp-internal-neighbor:BGP_INTERNAL_NEIGHBOR": { + "BGP_INTERNAL_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "2603:10e2:400:1::1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "2603:10e2:400:1::2", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "MASIC", + "platform": "multi-asic" + } + } + } + }, + "BGP_INTERNAL_INVALID_ASN_TEST": { + "sonic-bgp-internal-neighbor:sonic-bgp-internal-neighbor": { + "sonic-bgp-internal-neighbor:BGP_INTERNAL_NEIGHBOR": { + "BGP_INTERNAL_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65002", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "MASIC", + "platform": "multi-asic" + } + } + } + }, + "BGP_INVALID_LOCAL_ADDRESS_FAMILY_TEST": { + "sonic-bgp-internal-neighbor:sonic-bgp-internal-neighbor": { + "sonic-bgp-internal-neighbor:BGP_INTERNAL_NEIGHBOR": { + "BGP_INTERNAL_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "2603:10e2:400:1::5", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "MASIC", + "platform": "multi-asic" + } + } + } + }, + "BGP_LOCAL_ADDRESS_ABSENT_TEST": { + "sonic-bgp-internal-neighbor:sonic-bgp-internal-neighbor": { + "sonic-bgp-internal-neighbor:BGP_INTERNAL_NEIGHBOR": { + "BGP_INTERNAL_NEIGHBOR_LIST": [ + { + "neighbor": "2603:10e2:400:1::1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "name": "ASIC0", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "MASIC", + "platform": "multi-asic" + } + } + } + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-internal-neighbor.yang b/src/sonic-yang-models/yang-models/sonic-bgp-internal-neighbor.yang new file mode 100644 index 000000000000..69a089f7cab8 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-internal-neighbor.yang @@ -0,0 +1,58 @@ +module sonic-bgp-internal-neighbor { + namespace "http://github.com/Azure/sonic-bgp-internal-neighbor"; + prefix bgpintnbr; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-device_metadata { + prefix dm; + } + + import sonic-bgp-common { + prefix bgpcmn; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP Internal Neighbor for multi asic platforms"; + + revision 2021-04-10 { + description + "Initial revision."; + } + + container sonic-bgp-internal-neighbor { + container BGP_INTERNAL_NEIGHBOR { + list BGP_INTERNAL_NEIGHBOR_LIST { + description "List for internal neighbors in multi asic platforms"; + key "neighbor"; + leaf neighbor { + type inet:ip-address; + description "BGP Neighbor address"; + } + uses bgpcmn:sonic-bgp-cmn-neigh { + refine asn { + must "(current() = /dm:sonic-device_metadata/dm:DEVICE_METADATA/dm:localhost/dm:bgp_asn)" { + error-message "Internal iBGP neighbors should have same ASN as defined in device metadata"; + } + } + refine local_addr { + mandatory true; + must "((contains(../neighbor, '.') and contains(current(), '.')) or + (contains(../neighbor, ':') and contains(current(), ':')))" { + error-message "local address and neighbor address family doesnt match"; + } + } + } + } + } + } +} \ No newline at end of file From 0dcbfa3a9729c814f9e8d7a8f28fbe65ab8a24dd Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Wed, 4 May 2022 15:07:59 -0700 Subject: [PATCH 279/817] [chassis][yang]yang model for bgp voq chassis neighbor (#10642) Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan arlakshm@microsoft.com Why I did it Fixes #10158 How I did it Add yang model for config_db table BGP_VOQ_CHASSIS_NEIGHBOR and UT --- src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 22 ++ .../tests/bgp_voq_chassis_neighbor.json | 21 ++ .../bgp_voq_chassis_neighbor.json | 206 ++++++++++++++++++ .../sonic-bgp-voq-chassis-neighbor.yang | 63 ++++++ 5 files changed, 313 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 1928643c28ed..2b55946cc144 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -87,6 +87,7 @@ def run(self): './yang-models/sonic-bgp-peergroup.yang', './yang-models/sonic-bgp-peerrange.yang', './yang-models/sonic-bgp-allowed-prefix.yang', + './yang-models/sonic-bgp-voq-chassis-neighbor.yang', './yang-models/sonic-breakout_cfg.yang', './yang-models/sonic-buffer-pg.yang', './yang-models/sonic-buffer-pool.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 505c92ba96dd..e44e74b531dc 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1729,6 +1729,28 @@ } }, + "BGP_VOQ_CHASSIS_NEIGHBOR": { + "10.0.0.1": { + "asn": "64850", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + "3333::3:6": { + "asn": "64850", + "holdtime": "180", + "keepalive": "60", + "local_addr": "3333::3:3", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + }, "MACSEC_PROFILE": { "test": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json new file mode 100644 index 000000000000..3d575bb9759a --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json @@ -0,0 +1,21 @@ +{ + "BGP_VOQ_CHASSIS_NEIGHBOR_TEST" : { + "desc": "Load bgp voq chassis neighbor" + }, + "BGP_VOQ_CHASSIS_WITH_INVALID_SWITCH_TYPE_TEST" : { + "desc": "Load bgp voq chassis on non voq chassis switch", + "eStr": ["Bgp voq neighbor are applicable only when switch_type is voq"] + }, + "BGP_VOQ_CHASSIS_ABSENT_LOCAL_ADDRESS_TEST" : { + "desc": "Load bgp voq chassis with no local address", + "eStrKey" : "Mandatory" + }, + "BGP_VOQ_CHASSIS_INVALID_LOCAL_ADDRESS_ADDRESS_FAMILY_TEST": { + "desc": "Load ipv6 bgp voq chassis with ipv4 local address", + "eStr": ["local address and neighbor address family doesnt match"] + }, + "BGP_VOQ_CHASSIS_INVALID_ASN_TEST": { + "desc" :"Load bgp voq chassis neighbor with asn number different than local asn", + "eStr": ["Voq chassis BGP neighbors should have same ASN as defined in device metadata"] + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json new file mode 100644 index 000000000000..877903912383 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json @@ -0,0 +1,206 @@ +{ + "BGP_VOQ_CHASSIS_NEIGHBOR_TEST": { + "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { + "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { + "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "3333::3:6", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "3333::3:3", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "sonic-chassis", + "platform": "voq-chassis", + "switch_type": "voq" + } + } + } + }, + "BGP_VOQ_CHASSIS_WITH_INVALID_SWITCH_TYPE_TEST": { + "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { + "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { + "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "3333::3:6", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "3333::3:3", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "sonic-chassis", + "platform": "voq-chassis", + "switch_type": "chassis-packet" + } + } + } + }, + "BGP_VOQ_CHASSIS_ABSENT_LOCAL_ADDRESS_TEST": { + "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { + "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { + "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "3333::3:6", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "sonic-chassis", + "platform": "voq-chassis", + "switch_type": "voq" + } + } + } + }, + "BGP_VOQ_CHASSIS_INVALID_LOCAL_ADDRESS_ADDRESS_FAMILY_TEST": { + "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { + "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { + "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "3333::3:6", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "3.3.3.3", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "sonic-chassis", + "platform": "voq-chassis", + "switch_type": "voq" + } + } + } + }, + "BGP_VOQ_CHASSIS_INVALID_ASN_TEST": { + "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { + "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { + "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ + { + "neighbor": "10.0.0.1", + "asn": "65000", + "holdtime": "180", + "keepalive": "60", + "local_addr": "10.0.0.2", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + }, + { + "neighbor": "3333::3:6", + "asn": "65001", + "holdtime": "180", + "keepalive": "60", + "local_addr": "3333::3:3", + "name": "sonic-chassis-lc3", + "nhopself": "0", + "rrclient": "0", + "admin_status": "up" + } + ] + } + }, + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "default_bgp_status": "up", + "hostname": "sonic-chassis", + "platform": "voq-chassis", + "switch_type": "voq" + } + } + } + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang b/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang new file mode 100644 index 000000000000..0a7c6c9f1929 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang @@ -0,0 +1,63 @@ +module sonic-bgp-voq-chassis-neighbor { + namespace "http://github.com/Azure/sonic-bgp-voq-chassis-neighbor"; + prefix bgpintnbr; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-device_metadata { + prefix dm; + } + + import sonic-bgp-common { + prefix bgpcmn; + } + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC BGP Internal Neighbor for voq chassis platforms"; + + revision 2021-04-10 { + description + "Initial revision."; + } + + container sonic-bgp-voq-chassis-neighbor { + container BGP_VOQ_CHASSIS_NEIGHBOR { + list BGP_VOQ_CHASSIS_NEIGHBOR_LIST { + description "List for internal neighbors in voq chassis platforms"; + key "neighbor"; + + leaf neighbor { + type inet:ip-address; + description "BGP Neighbor address"; + } + + uses bgpcmn:sonic-bgp-cmn-neigh { + + refine asn { + must "(current() = /dm:sonic-device_metadata/dm:DEVICE_METADATA/dm:localhost/dm:bgp_asn)" { + error-message "Voq chassis BGP neighbors should have same ASN as defined in device metadata"; + } + } + refine local_addr { + mandatory true; + must "((contains(../neighbor, '.') and contains(current(), '.')) or + (contains(../neighbor, ':') and contains(current(), ':')))" { + error-message "local address and neighbor address family doesnt match"; + } + } + } + must "(/dm:sonic-device_metadata/dm:DEVICE_METADATA/dm:localhost/dm:switch_type = 'voq')" { + error-message "Bgp voq neighbor are applicable only when switch_type is voq"; + } + } + } + } +} \ No newline at end of file From 7c4ee4396e80c965bee05997fcb3a1ba49a11863 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Wed, 4 May 2022 15:39:47 -0700 Subject: [PATCH 280/817] Remove referencing in unit test for arista7800 (#10738) Signed-off-by: Neetha John nejo@microsoft.com Why I did it Address build failures due to sonic config engine unit tests failing. Failures are due to referencing format used in Arista 7800 sample output for buffer template How I did it Remove referencing format How to verify it Sonic config engine wheel should be built successfully --- .../py2/buffer-arista7800r3-48cq2-lc.json | 278 +++++++++--------- .../py3/buffer-arista7800r3-48cq2-lc.json | 278 +++++++++--------- 2 files changed, 278 insertions(+), 278 deletions(-) diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json index c05eca81eaaa..8ec9e0747110 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json @@ -62,7 +62,7 @@ }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"1280", "dynamic_th":"-2", "xon_offset":"2560", @@ -70,18 +70,18 @@ "xoff":"66048" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "xon_offset":"0", "static_th":"30535680" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"33030144" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "dynamic_th":"-1" } @@ -226,365 +226,365 @@ "BUFFER_QUEUE": { "Ethernet180|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet8|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet184|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet188|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet0|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet4|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet108|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet100|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet128|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet104|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet68|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet96|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet124|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet148|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet92|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet120|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet144|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet52|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet140|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet56|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet164|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet76|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet72|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet64|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet32|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet16|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet36|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet12|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet88|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet116|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet80|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet112|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet84|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet152|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet136|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet156|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet132|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet48|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet44|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet176|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet40|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet28|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet60|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet20|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet24|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet180|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet8|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet184|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet188|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet0|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet4|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet108|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet100|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet128|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet104|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet68|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet96|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet124|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet148|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet92|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet120|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet144|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet52|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet140|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet56|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet164|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet76|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet72|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet64|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet32|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet16|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet36|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet12|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet88|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet116|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet80|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet112|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet84|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet152|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet136|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet156|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet132|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet48|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet44|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet176|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet40|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet28|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet60|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet20|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet24|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet180|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet8|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet184|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet188|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet0|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet4|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet108|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet100|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet128|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet104|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet68|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet96|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet124|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet148|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet92|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet120|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet144|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet52|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet140|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet56|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet164|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet76|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet72|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet64|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet32|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet16|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet36|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet12|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet88|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet116|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet80|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet112|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet84|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet152|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet136|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet156|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet132|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet48|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet44|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet176|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet40|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet28|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet60|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet20|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet24|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" } } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json index 56538fd0935b..5301516178b2 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json @@ -62,7 +62,7 @@ }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"1280", "dynamic_th":"-2", "xon_offset":"2560", @@ -70,18 +70,18 @@ "xoff":"66048" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "xon_offset":"0", "static_th":"30535680" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"33030144" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "dynamic_th":"-1" } @@ -226,365 +226,365 @@ "BUFFER_QUEUE": { "Ethernet0|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet36|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet40|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet44|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet48|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet52|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet56|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet60|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet64|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet68|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet72|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet4|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet76|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet80|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet84|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet88|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet92|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet96|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet100|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet104|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet108|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet112|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet8|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet116|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet120|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet124|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet128|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet132|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet136|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet140|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet144|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet148|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet152|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet12|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet156|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet164|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet176|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet180|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet184|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet188|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet16|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet20|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet24|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet28|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet32|3-4": { - "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + "profile" : "ingress_lossless_profile" }, "Ethernet0|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet36|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet40|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet44|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet48|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet52|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet56|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet60|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet64|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet68|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet72|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet4|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet76|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet80|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet84|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet88|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet92|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet96|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet100|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet104|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet108|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet112|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet8|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet116|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet120|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet124|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet128|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet132|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet136|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet140|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet144|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet148|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet152|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet12|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet156|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet164|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet176|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet180|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet184|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet188|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet16|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet20|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet24|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet28|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet32|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet0|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet36|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet40|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet44|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet48|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet52|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet56|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet60|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet64|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet68|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet72|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet4|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet76|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet80|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet84|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet88|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet92|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet96|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet100|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet104|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet108|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet112|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet8|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet116|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet120|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet124|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet128|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet132|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet136|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet140|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet144|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet148|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet152|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet12|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet156|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet164|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet176|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet180|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet184|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet188|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet16|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet20|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet24|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet28|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" }, "Ethernet32|5-6": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + "profile" : "egress_lossy_profile" } } } From f8501224b4c9becc0b41b1fc032df4fc80b3dbfa Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 6 May 2022 01:11:35 +0800 Subject: [PATCH 281/817] [YANG] Fix issue: Non compliant leaf list in config_db schema (#10291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### Why I did it Fix issue: Non compliant leaf list in config_db schema: https://github.com/Azure/sonic-buildimage/issues/9801 #### How I did it The basic flow of DPB is like: 1. Transfer config db json value to YANG json value, name it “yangIn” 2. Validate “yangIn” by libyang 3. Generate a YANG json value to represent the target configuration, name it “yangTarget” 4. Do diff between “yangIn” and “yangTarget” 5. Apply the diff to CONFIG DB json and save it back to DB The fix: • For step #1, If value of a leaf-list field string type, transfer it to a list by splitting it with “,” the purpose here is to make step#2 happy. We also need to save .. to a set named “leaf_list_with_string_value_set”. • For step#5, loop “leaf_list_with_string_value_set” and change those fields back to a string. #### How to verify it 1. Manual test 2. Changed sample config DB and unit test passed --- src/sonic-yang-mgmt/sonic_yang.py | 4 +- src/sonic-yang-mgmt/sonic_yang_ext.py | 58 +++++++++++++++++-- .../tests/files/sample_config_db.json | 19 +++--- 3 files changed, 67 insertions(+), 14 deletions(-) diff --git a/src/sonic-yang-mgmt/sonic_yang.py b/src/sonic-yang-mgmt/sonic_yang.py index 6bf590fced38..9af9217ad34b 100644 --- a/src/sonic-yang-mgmt/sonic_yang.py +++ b/src/sonic-yang-mgmt/sonic_yang.py @@ -44,7 +44,9 @@ def __init__(self, yang_dir, debug=False, print_log_enabled=True, sonic_yang_opt # below dict will store preProcessed yang objects, which may be needed by # all yang modules, such as grouping. self.preProcessedYang = dict() - + # element path for CONFIG DB. An example for this list could be: + # ['PORT', 'Ethernet0', 'speed'] + self.elementPath = [] try: self.ctx = ly.Context(yang_dir, sonic_yang_options) except Exception as e: diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py index 424e567f79d3..8f4279091882 100644 --- a/src/sonic-yang-mgmt/sonic_yang_ext.py +++ b/src/sonic-yang-mgmt/sonic_yang_ext.py @@ -20,6 +20,19 @@ 'CABLE_LENGTH_LIST' ] +# Workaround for those fields who is defined as leaf-list in YANG model but have string value in config DB. +# Dictinary structure key = (, ), value = seperator +LEAF_LIST_WITH_STRING_VALUE_DICT = { + ('MIRROR_SESSION', 'src_ip'): ',', + ('NTP', 'src_intf'): ';', + ('BGP_ALLOWED_PREFIXES', 'prefixes_v4'): ',', + ('BGP_ALLOWED_PREFIXES', 'prefixes_v6'): ',', + ('BUFFER_PORT_EGRESS_PROFILE_LIST', 'profile_list'): ',', + ('BUFFER_PORT_INGRESS_PROFILE_LIST', 'profile_list'): ',', + ('PORT', 'adv_speeds'): ',', + ('PORT', 'adv_interface_types'): ',', +} + """ This is the Exception thrown out of all public function of this class. """ @@ -407,6 +420,11 @@ def _yangConvert(val): # if it is a leaf-list do it for each element if leafDict[key]['__isleafList']: vValue = list() + if isinstance(value, str) and (self.elementPath[0], self.elementPath[-1]) in LEAF_LIST_WITH_STRING_VALUE_DICT: + # For field defined as leaf-list but has string value in CONFIG DB, need do special handling here. For exampe: + # port.adv_speeds in CONFIG DB has value "100,1000,10000", it shall be transferred to [100,1000,10000] as YANG value here to + # make it align with its YANG definition. + value = (x.strip() for x in value.split(LEAF_LIST_WITH_STRING_VALUE_DICT[(self.elementPath[0], self.elementPath[-1])])) for v in value: vValue.append(_yangConvert(v)) else: @@ -545,6 +563,7 @@ def _xlateList(self, model, yang, config, table, exceptionList): primaryKeys = list(config.keys()) for pkey in primaryKeys: try: + self.elementPath.append(pkey) vKey = None self.sysLog(syslog.LOG_DEBUG, "xlateList Extract pkey:{}".\ format(pkey)) @@ -552,9 +571,13 @@ def _xlateList(self, model, yang, config, table, exceptionList): keyDict = self._extractKey(pkey, listKeys) # fill rest of the values in keyDict for vKey in config[pkey]: + self.elementPath.append(vKey) self.sysLog(syslog.LOG_DEBUG, "xlateList vkey {}".format(vKey)) - keyDict[vKey] = self._findYangTypedValue(vKey, \ - config[pkey][vKey], leafDict) + try: + keyDict[vKey] = self._findYangTypedValue(vKey, \ + config[pkey][vKey], leafDict) + finally: + self.elementPath.pop() yang.append(keyDict) # delete pkey from config, done to match one key with one list del config[pkey] @@ -566,6 +589,8 @@ def _xlateList(self, model, yang, config, table, exceptionList): exceptionList.append(str(e)) # with multilist, we continue matching other keys. continue + finally: + self.elementPath.pop() return @@ -596,13 +621,17 @@ def _xlateContainerInContainer(self, model, yang, configC, table): if ccName not in configC: # Inner container doesn't exist in config return + if len(configC[ccName]) == 0: # Empty container, clean config and return del configC[ccName] return self.sysLog(msg="xlateProcessListOfContainer: {}".format(ccName)) + self.elementPath.append(ccName) self._xlateContainer(ccontainer, yang[ccName], \ configC[ccName], table) + self.elementPath.pop() + # clean empty container if len(yang[ccName]) == 0: del yang[ccName] @@ -650,8 +679,10 @@ def _xlateContainer(self, model, yang, config, table): for vKey in vKeys: #vkey must be a leaf\leaf-list\choice in container if leafDict.get(vKey): + self.elementPath.append(vKey) self.sysLog(syslog.LOG_DEBUG, "xlateContainer vkey {}".format(vKey)) yang[vKey] = self._findYangTypedValue(vKey, configC[vKey], leafDict) + self.elementPath.pop() # delete entry from copy of config del configC[vKey] @@ -681,8 +712,10 @@ def _xlateConfigDBtoYang(self, jIn, yangJ): yangJ[key] = dict() if yangJ.get(key) is None else yangJ[key] yangJ[key][subkey] = dict() self.sysLog(msg="xlateConfigDBtoYang {}:{}".format(key, subkey)) + self.elementPath.append(table) self._xlateContainer(cmap['container'], yangJ[key][subkey], \ jIn[table], table) + self.elementPath = [] return @@ -739,9 +772,14 @@ def _revYangConvert(val): # if it is a leaf-list do it for each element if leafDict[key]['__isleafList']: - vValue = list() - for v in value: - vValue.append(_revYangConvert(v)) + if isinstance(value, list) and (self.elementPath[0], self.elementPath[-1]) in LEAF_LIST_WITH_STRING_VALUE_DICT: + # For field defined as leaf-list but has string value in CONFIG DB, we need do special handling here: + # e.g. port.adv_speeds is [10,100,1000] in YANG, need to convert it into a string for CONFIG DB: "10,100,1000" + vValue = LEAF_LIST_WITH_STRING_VALUE_DICT[(self.elementPath[0], self.elementPath[-1])].join((_revYangConvert(x) for x in value)) + else: + vValue = list() + for v in value: + vValue.append(_revYangConvert(v)) elif leafDict[key]['type']['@name'] == 'boolean': vValue = 'true' if value else 'false' else: @@ -850,12 +888,16 @@ def _revXlateList(self, model, yang, config, table): # create key of config DB table pkey, pkeydict = self._createKey(entry, listKeys) self.sysLog(syslog.LOG_DEBUG, "revXlateList pkey:{}".format(pkey)) + self.elementPath.append(pkey) config[pkey]= dict() # fill rest of the entries for key in entry: if key not in pkeydict: + self.elementPath.append(key) config[pkey][key] = self._revFindYangTypedValue(key, \ entry[key], leafDict) + self.elementPath.pop() + self.elementPath.pop() return @@ -879,8 +921,10 @@ def _revXlateContainerInContainer(self, model, yang, config, table): if yang.get(modelContainer['@name']): config[modelContainer['@name']] = dict() self.sysLog(msg="revXlateContainerInContainer {}".format(modelContainer['@name'])) + self.elementPath.append(modelContainer['@name']) self._revXlateContainer(modelContainer, yang[modelContainer['@name']], \ config[modelContainer['@name']], table) + self.elementPath.pop() return """ @@ -912,7 +956,9 @@ def _revXlateContainer(self, model, yang, config, table): #vkey must be a leaf\leaf-list\choice in container if leafDict.get(vKey): self.sysLog(syslog.LOG_DEBUG, "revXlateContainer vkey {}".format(vKey)) + self.elementPath.append(vKey) config[vKey] = self._revFindYangTypedValue(vKey, yang[vKey], leafDict) + self.elementPath.pop() return @@ -940,8 +986,10 @@ def _revXlateYangtoConfigDB(self, yangJ, cDbJson): cDbJson[table] = dict() #print(key + "--" + subkey) self.sysLog(msg="revXlateYangtoConfigDB {}".format(table)) + self.elementPath.append(table) self._revXlateContainer(cmap['container'], yangJ[module_top][container], \ cDbJson[table], table) + self.elementPath = [] return diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e44e74b531dc..a214560de759 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -65,12 +65,12 @@ }, "BUFFER_PORT_INGRESS_PROFILE_LIST": { "Ethernet9": { - "profile_list": ["ingress_lossy_profile"] + "profile_list": "ingress_lossy_profile" } }, "BUFFER_PORT_EGRESS_PROFILE_LIST": { "Ethernet9": { - "profile_list": ["egress_lossless_profile", "egress_lossy_profile"] + "profile_list": "egress_lossless_profile,egress_lossy_profile" } }, "PORTCHANNEL": { @@ -408,10 +408,7 @@ "NTP": { "global": { "vrf": "mgmt", - "src_intf": [ - "eth0", - "Loopback0" - ] + "src_intf": "eth0;Loopback0" } }, "NTP_SERVER": { @@ -449,7 +446,10 @@ "description": "", "speed": "11100", "tpid": "0x8100", - "admin_status": "up" + "admin_status": "up", + "autoneg": "on", + "adv_speeds": "100000,50000", + "adv_interface_types": "CR,CR4" }, "Ethernet2": { "alias": "Eth1/3", @@ -457,7 +457,10 @@ "description": "", "speed": "11100", "tpid": "0x8100", - "admin_status": "up" + "admin_status": "up", + "autoneg": "on", + "adv_speeds": "all", + "adv_interface_types": "all" }, "Ethernet3": { "alias": "Eth1/4", From db94886ac9d650f47587dacdb16fc5115efda94c Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 5 May 2022 10:24:00 -0700 Subject: [PATCH 282/817] [sonic-snmpagent] Update submodule (#10736) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes below commits ``` 1477c36 2022-05-04 | Fix: if routestr does not exist, skip (#257) [Qi Luo] 5c08435 2022-05-04 | Add VoQ Recirc interface (i.e., Ethernet-Rec) to interface maps for S… (#244) [Song Yuan] 57f1af6 2022-05-02 | Fix: not to use blocking get_all() after keys() (#255) [Qi Luo] 33fdf9d 2022-04-06 | [RFC2737, RFC3433] Exclude RJ45 port from Entity MIB and Entity sensor MIB (#247) [Kebo Liu] ``` --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 890f32f333df..1477c368369d 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 890f32f333dfe31c36a8342ff70c0e84910bf9c8 +Subproject commit 1477c368369db44f9a2f9deac0356bbd5fad6364 From 681c24878b9e2ccca9fb4f6549cfca0002d7d05f Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 6 May 2022 06:21:44 +0800 Subject: [PATCH 283/817] Fix race condition between networking service and interface-config service (#10573) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it The PR is aimed to fix a bug that mgmt port eth0 may loss IP even if user configured static IP of eth0. This is not a always reproduceable issue, the reproducing flow is like: Systemd starts networking service, which runs a dhcp based configuration and assigned an ip from dhcp. Systemd starts interface-config service who depends on networking service Interface-config service runs command “ifdown –force eth0”, check line. but networking service is still running so that this line failed with error: “error: Another instance of this program is already running.”. This error is printed by ifupdown2 lib who is the main process of networking service. So, ifdown actually does not work here, the ip of eth0 is not down. Interface-config service updates /etc/networking/interface to static configuration. Interface-config service runs command “systemctl restart networking”. This command kills the previous networking related processes (log: networking.service: Main process exited, code=killed, status=15/TERM), and try to reconfigure the ip address with static configuration. But it detects that the configured IP and the existing IP are the same, and it does not really configure the ip to kernel. Hence, the ip is still getting from dhcp. (this could be a bug of ifupdown2: previous ip is from dhcp, new ip is a static ip, it treats them as same instead of re-configuring the IP) When the lease of the ip expires, the ip of eth0 is removed by kernel and the issue reproduces. The issue is not always reproduceable because networking service usually runs fast so that it won't hit step#3. How I did it Check networking service state before running "ifdown –force eth0", wait for it done if it is activating. How to verify it Manual test. --- .../interfaces/interfaces-config.sh | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 646fd7a94e71..8c8a4e205875 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,15 +1,39 @@ #!/bin/bash +function wait_networking_service_done() { + local -i _WDOG_CNT="1" + local -ir _WDOG_MAX="30" + + local -r _TIMEOUT="1s" + + while [[ "${_WDOG_CNT}" -le "${_WDOG_MAX}" ]]; do + networking_status="$(systemctl is-active networking 2>&1)" + + if [[ "${networking_status}" == active || "${networking_status}" == inactive || "${networking_status}" == failed ]] ; then + return + fi + + echo "interfaces-config: networking service is running, wait for it done" + + let "_WDOG_CNT++" + sleep "${_TIMEOUT}" + done + + echo "interfaces-config: networking service is still running after 30 seconds, killing it" + systemctl kill networking 2>&1 +} + if [[ $(ifquery --running eth0) ]]; then + wait_networking_service_done ifdown --force eth0 fi # Check if ZTP DHCP policy has been installed -if [ -e /etc/network/ifupdown2/policy.d/ztp_dhcp.json ]; then +if [[ -e /etc/network/ifupdown2/policy.d/ztp_dhcp.json ]]; then # Obtain port operational state information redis-dump -d 0 -k "PORT_TABLE:Ethernet*" -y > /tmp/ztp_port_data.json - if [ $? -ne 0 ] || [ ! -e /tmp/ztp_port_data.json ] || [ "$(cat /tmp/ztp_port_data.json)" = "" ]; then + if [[ $? -ne 0 || ! -e /tmp/ztp_port_data.json || "$(cat /tmp/ztp_port_data.json)" = "" ]]; then echo "{}" > /tmp/ztp_port_data.json fi @@ -29,28 +53,28 @@ CFGGEN_PARAMS=" \ " sonic-cfggen $CFGGEN_PARAMS -[ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid -[ -f /var/run/dhclient6.eth0.pid ] && kill `cat /var/run/dhclient6.eth0.pid` && rm -f /var/run/dhclient6.eth0.pid +[[ -f /var/run/dhclient.eth0.pid ]] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid +[[ -f /var/run/dhclient6.eth0.pid ]] && kill `cat /var/run/dhclient6.eth0.pid` && rm -f /var/run/dhclient6.eth0.pid for intf_pid in $(ls -1 /var/run/dhclient*.Ethernet*.pid 2> /dev/null); do - [ -f ${intf_pid} ] && kill `cat ${intf_pid}` && rm -f ${intf_pid} + [[ -f ${intf_pid} ]] && kill `cat ${intf_pid}` && rm -f ${intf_pid} done # Setup eth1 if we connect to a remote chassis DB. PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} CHASSISDB_CONF="/usr/share/sonic/device/$PLATFORM/chassisdb.conf" -[ -f $CHASSISDB_CONF ] && source $CHASSISDB_CONF +[[ -f $CHASSISDB_CONF ]] && source $CHASSISDB_CONF ASIC_CONF="/usr/share/sonic/device/$PLATFORM/asic.conf" -[ -f $ASIC_CONF ] && source $ASIC_CONF +[[ -f $ASIC_CONF ]] && source $ASIC_CONF if [[ -n "$midplane_subnet" && ($NUM_ASIC -gt 1) ]]; then for asic_id in `seq 0 $((NUM_ASIC - 1))`; do NET_NS="asic$asic_id" PIDS=`ip netns pids "$NET_NS" 2>/dev/null` - if [ "$?" -ne "0" ]; then # namespace doesn't exist + if [[ "$?" -ne "0" ]]; then # namespace doesn't exist continue fi From 8ec8900d31806d4f641c91b2b62ec5880b504687 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 6 May 2022 07:21:30 +0800 Subject: [PATCH 284/817] Support SONiC OpenSSL FIPS 140-3 based on SymCrypt engine (#9573) Why I did it Support OpenSSL FIPS 140-3, see design doc: https://github.com/Azure/SONiC/blob/master/doc/fips/SONiC-OpenSSL-FIPS-140-3.md. How I did it Install the fips packages. To build the fips packages, see https://github.com/Azure/sonic-fips Azure pipelines: https://dev.azure.com/mssonic/build/_build?definitionId=412 How to verify it Validate the SymCrypt engine: admin@sonic:~$ dpkg-query -W | grep openssl openssl 1.1.1k-1+deb11u1+fips symcrypt-openssl 0.1 admin@sonic:~$ openssl engine -v | grep -i symcrypt (symcrypt) SCOSSL (SymCrypt engine for OpenSSL) admin@sonic:~$ --- Makefile.work | 16 +++++- azure-pipelines.yml | 4 +- dockers/docker-base-bullseye/Dockerfile.j2 | 3 +- .../build_templates/sonic_debian_extension.j2 | 12 ++--- installer/x86_64/install.sh | 5 ++ onie-mk-demo.sh | 5 ++ rules/config | 5 ++ rules/docker-base-bullseye.mk | 5 ++ rules/sonic-fips.dep | 10 ++++ rules/sonic-fips.mk | 53 +++++++++++++++++++ slave.mk | 8 ++- sonic-slave-bullseye/Dockerfile.j2 | 20 +++---- src/sonic-fips/.gitignore | 1 + src/sonic-fips/Makefile | 29 ++++++++++ 14 files changed, 152 insertions(+), 24 deletions(-) create mode 100644 rules/sonic-fips.dep create mode 100644 rules/sonic-fips.mk create mode 100644 src/sonic-fips/.gitignore create mode 100644 src/sonic-fips/Makefile diff --git a/Makefile.work b/Makefile.work index cc404b9d7184..9ecd611e92c6 100644 --- a/Makefile.work +++ b/Makefile.work @@ -138,13 +138,25 @@ endif endif SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER_LC) +# Support FIPS feature, armhf not supported yet +ifeq ($(PLATFORM_ARCH),armhf) +ENABLE_FIPS_FEATURE := n +ENABLE_FIPS := n +endif + +ifeq ($(ENABLE_FIPS_FEATURE), n) +ifeq ($(ENABLE_FIPS), y) + $(error Cannot set fips config ENABLE_FIPS=y when ENABLE_FIPS_FEATURE=n) +endif +endif + # Generate the version control build info $(shell SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \ TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ scripts/generate_buildinfo_config.sh) # Generate the slave Dockerfile, and prepare build info for it -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) $(shell BUILD_SLAVE=y DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV)) @@ -355,6 +367,8 @@ SONIC_BUILD_INSTRUCTION := make \ ENABLE_AUTO_TECH_SUPPORT=$(ENABLE_AUTO_TECH_SUPPORT) \ BUILD_MULTIASIC_KVM=$(BUILD_MULTIASIC_KVM) \ ENABLE_ASAN=$(ENABLE_ASAN) \ + ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) \ + ENABLE_FIPS=$(ENABLE_FIPS) \ $(SONIC_OVERRIDE_BUILD_VARS) .PHONY: sonic-slave-build sonic-slave-bash init reset diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 27836a49b1ab..f44704592c9b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -43,7 +43,9 @@ variables: - ${{ else }}: - template: .azure-pipelines/template-variables.yml@buildimage - name: CACHE_MODE - value: rcache + value: rcache +- name: ENABLE_FIPS + value: y stages: - stage: BuildVS diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index cae555174174..f47d56468102 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -62,7 +62,8 @@ RUN apt-get update && \ # for processing/handling json files in bash environment jq \ # for sairedis zmq rpc channel - libzmq5 + libzmq5 \ + libwrap0 # Upgrade pip via PyPI and uninstall the Debian version RUN pip3 install --upgrade pip diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 516df5fd224f..419ddf139100 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -330,12 +330,7 @@ sudo chmod 755 $FILESYSTEM_ROOT/usr/bin/restart_service sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install smartmontools=7.2-1 # Install custom-built openssh sshd -sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/openssh-server_*.deb - -# Remove sshd host keys, and will regenerate on first sshd start. This needs to be -# done again here because our custom version of sshd is being installed, which -# will regenerate the sshd host keys. -sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* +sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/openssh-server_${OPENSSH_VERSION}_*.deb {% if sonic_asic_platform == 'broadcom' %} # Install custom-built flashrom @@ -625,6 +620,11 @@ sudo dpkg --root=$FILESYSTEM_ROOT -P {{ debname }} {% endfor %} {% endif %} +# Remove sshd host keys, and will regenerate on first sshd start. This needs to be +# done again here because our custom version of sshd is being installed, which +# will regenerate the sshd host keys. +sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* + sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d # Copy fstrim service and timer file, enable fstrim timer diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index dbab4d54ab72..4411e74edab0 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -666,6 +666,11 @@ else # install_env = "onie" fi fi +# Add extra linux command line +extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% +echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" +GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX $extra_cmdline_linux" + cat <> $grub_cfg menuentry '$demo_grub_entry' { search --no-floppy --label --set=root $demo_volume_label diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index fcfe500e9249..55d0404a1468 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -79,6 +79,11 @@ cp -r $installer_dir/$arch/* $tmp_installdir || clean_up 1 cp onie-image.conf $tmp_installdir cp onie-image-*.conf $tmp_installdir +# Set sonic fips config for the installer script +if [ "$ENABLE_FIPS" = "y" ]; then + EXTRA_CMDLINE_LINUX="$EXTRA_CMDLINE_LINUX sonic_fips=1" +fi + # Escape special chars in the user provide kernel cmdline string for use in # sed. Special chars are: \ / & EXTRA_CMDLINE_LINUX=`echo $EXTRA_CMDLINE_LINUX | sed -e 's/[\/&]/\\\&/g'` diff --git a/rules/config b/rules/config index 348c23b17cb3..415aa795e767 100644 --- a/rules/config +++ b/rules/config @@ -224,3 +224,8 @@ ENABLE_ASAN ?= n # reset default container registry from dockerhub to other DEFAULT_CONTAINER_REGISTRY ?= + +# ENABLE_FIPS_FEATURE - support FIPS feature, only for amd64 or arm64, armhf not supported yet +# ENABLE_FIPS - support FIPS flag, if enabled, no additional config requred for the image to support FIPS +ENABLE_FIPS_FEATURE ?= y +ENABLE_FIPS ?= n diff --git a/rules/docker-base-bullseye.mk b/rules/docker-base-bullseye.mk index fcebb554c777..9d9345bea490 100644 --- a/rules/docker-base-bullseye.mk +++ b/rules/docker-base-bullseye.mk @@ -11,6 +11,11 @@ VIM = vim OPENSSH = openssh-client SSHPASS = sshpass STRACE = strace + +ifeq ($(ENABLE_FIPS_FEATURE), y) +$(DOCKER_BASE_BULLSEYE)_DEPENDS += $(FIPS_OPENSSL_LIBSSL) $(FIPS_OPENSSL_LIBSSL_DEV) $(FIPS_OPENSSL) $(SYMCRYPT_OPENSSL) $(FIPS_KRB5) +endif + $(DOCKER_BASE_BULLSEYE)_DBG_IMAGE_PACKAGES += $(GDB) $(GDBSERVER) $(VIM) $(OPENSSH) $(SSHPASS) $(STRACE) SONIC_DOCKER_IMAGES += $(DOCKER_BASE_BULLSEYE) diff --git a/rules/sonic-fips.dep b/rules/sonic-fips.dep new file mode 100644 index 000000000000..ab2cd62dc2c8 --- /dev/null +++ b/rules/sonic-fips.dep @@ -0,0 +1,10 @@ +SPATH := $($(SYMCRYPT_OPENSSL)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-fips.mk rules/sonic-fips.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + +$(SYMCRYPT_OPENSSL)_CACHE_MODE := GIT_CONTENT_SHA +$(SYMCRYPT_OPENSSL)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SYMCRYPT_OPENSSL)_DEP_FILES := $(DEP_FILES) +$(SYMCRYPT_OPENSSL)_SMDEP_FILES := $(SMDEP_FILES) +$(SYMCRYPT_OPENSSL)_SMDEP_PATHS := $(SPATH) diff --git a/rules/sonic-fips.mk b/rules/sonic-fips.mk new file mode 100644 index 000000000000..471f69e9ff4b --- /dev/null +++ b/rules/sonic-fips.mk @@ -0,0 +1,53 @@ +# fips packages + +FIPS_VERSION = 0.1 +FIPS_OPENSSL_VERSION = 1.1.1k-1+deb11u1+fips +FIPS_OPENSSH_VERSION = 8.4p1-5+fips +FIPS_PYTHON_MAIN_VERSION = 3.9 +FIPS_PYTHON_VERSION = 3.9.2-1+fips +FIPS_GOLANG_MAIN_VERSION = 1.15 +FIPS_GOLANG_VERSION = 1.15.15-1~deb11u4+fips +FIPS_KRB5_VERSION = 1.18.3-6+deb11u1+fips +FIPS_URL_PREFIX = https://sonicstorage.blob.core.windows.net/public/fips/$(BLDENV)/$(FIPS_VERSION)/$(CONFIGURED_ARCH) + +SYMCRYPT_OPENSSL_NAME = symcrypt-openssl +SYMCRYPT_OPENSSL = $(SYMCRYPT_OPENSSL_NAME)_$(FIPS_VERSION)_$(CONFIGURED_ARCH).deb +$(SYMCRYPT_OPENSSL)_SRC_PATH = $(SRC_PATH)/sonic-fips + +FIPS_OPENSSL = openssl_$(FIPS_OPENSSL_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSL_LIBSSL = libssl1.1_$(FIPS_OPENSSL_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSL_LIBSSL_DEV = libssl-dev_$(FIPS_OPENSSL_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSL_LIBSSL_DOC = libssl-doc_$(FIPS_OPENSSL_VERSION)_all.deb +FIPS_OPENSSL_ALL = $(FIPS_OPENSSL) $(FIPS_OPENSSL_LIBSSL) $(FIPS_OPENSSL_LIBSSL_DEV) $(FIPS_OPENSSL_LIBSSL_DOC) + +FIPS_OPENSSH = ssh_$(FIPS_OPENSSH_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSH_CLIENT = openssh-client_$(FIPS_OPENSSH_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSH_SFTP_SERVER = openssh-sftp-server_$(FIPS_OPENSSH_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSH_SERVER = openssh-server_$(FIPS_OPENSSH_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_OPENSSH_ALL = $(FIPS_SSH) $(FIPS_OPENSSH_CLIENT) $(FIPS_OPENSSH_SFTP_SERVER) $(FIPS_OPENSSH_SERVER) + +FIPS_PYTHON = python$(FIPS_PYTHON_MAIN_VERSION)_$(FIPS_PYTHON_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_PYTHON_MINIMAL = python$(FIPS_PYTHON_MAIN_VERSION)-minimal_$(FIPS_PYTHON_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_LIBPYTHON = libpython$(FIPS_PYTHON_MAIN_VERSION)_$(FIPS_PYTHON_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_LIBPYTHON_MINIMAL = libpython$(FIPS_PYTHON_MAIN_VERSION)-minimal_$(FIPS_PYTHON_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_LIBPYTHON_STDLIB = libpython$(FIPS_PYTHON_MAIN_VERSION)-stdlib_$(FIPS_PYTHON_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_PYTHON_ALL = $(FIPS_PYTHON) $(FIPS_PYTHON_MINIMAL) $(FIPS_LIBPYTHON) $(FIPS_LIBPYTHON_MINIMAL) $(FIPS_LIBPYTHON_STDLIB) + +FIPS_GOLANG = golang-$(FIPS_GOLANG_MAIN_VERSION)_$(FIPS_GOLANG_VERSION)_all.deb +FIPS_GOLANG_GO = golang-$(FIPS_GOLANG_MAIN_VERSION)-go_$(FIPS_GOLANG_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_GOLANG_SRC = golang-$(FIPS_GOLANG_MAIN_VERSION)-src_$(FIPS_GOLANG_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_GOLANG_DOC = golang-$(FIPS_GOLANG_MAIN_VERSION)-doc_$(FIPS_GOLANG_VERSION)_all.deb +FIPS_GOLANG_ALL = $(FIPS_GOLANG) $(FIPS_GOLANG_GO) $(FIPS_GOLANG_SRC) $(FIPS_GOLANG_DOC) + +FIPS_KRB5 = libk5crypto3_$(FIPS_KRB5_VERSION)_$(CONFIGURED_ARCH).deb +FIPS_KRB5_ALL = $(FIPS_KRB5) + +FIPS_DERIVED_TARGET = $(FIPS_OPENSSL_ALL) $(FIPS_OPENSSH_ALL) $(FIPS_GOLANG_ALL) $(FIPS_PYTHON_ALL) $(FIPS_KRB5_ALL) +FIPS_PACKAGE_ALL = $(SYMCRYPT_OPENSSL) $(FIPS_DERIVED_TARGET) + +$(foreach package,$(FIPS_DERIVED_TARGET),$(eval $(call add_extra_package,$(SYMCRYPT_OPENSSL),$(package)))) + +ifeq ($(ENABLE_FIPS_FEATURE), y) + FIPS_BASEIMAGE_INSTALLERS = $(FIPS_OPENSSL_LIBSSL) $(FIPS_OPENSSL_LIBSSL_DEV) $(FIPS_OPENSSL) $(SYMCRYPT_OPENSSL) $(FIPS_OPENSSH) $(FIPS_OPENSSH_CLIENT) $(FIPS_OPENSSH_SFTP_SERVER) $(FIPS_OPENSSH_SERVER) $(FIPS_KRB5) + SONIC_MAKE_DEBS += $(SYMCRYPT_OPENSSL) +endif diff --git a/slave.mk b/slave.mk index 7342870ac2a7..1a008640b4b9 100644 --- a/slave.mk +++ b/slave.mk @@ -80,6 +80,7 @@ export IMAGE_DISTRO export IMAGE_DISTRO_DEBS_PATH export MULTIARCH_QEMU_ENVIRON export DOCKER_BASE_ARCH +export BLDENV ############################################################################### ## Utility rules @@ -93,7 +94,6 @@ ifneq ($(CONFIGURED_PLATFORM),generic) endif configure : - @mkdir -p $(DEBS_PATH) @mkdir -p $(JESSIE_DEBS_PATH) @mkdir -p $(STRETCH_DEBS_PATH) @mkdir -p $(BUSTER_DEBS_PATH) @@ -271,6 +271,8 @@ endif export SONIC_ROUTING_STACK export FRR_USER_UID export FRR_USER_GID +export ENABLE_FIPS_FEATURE +export ENABLE_FIPS ############################################################################### ## Build Options @@ -332,6 +334,7 @@ $(info "INCLUDE_P4RT" : "$(INCLUDE_P4RT)") $(info "INCLUDE_KUBERNETES" : "$(INCLUDE_KUBERNETES)") $(info "INCLUDE_MACSEC" : "$(INCLUDE_MACSEC)") $(info "INCLUDE_MUX" : "$(INCLUDE_MUX)") +$(info "ENABLE_FIPS_FEATURE" : "$(ENABLE_FIPS_FEATURE)") $(info "TELEMETRY_WRITABLE" : "$(TELEMETRY_WRITABLE)") $(info "ENABLE_AUTO_TECH_SUPPORT" : "$(ENABLE_AUTO_TECH_SUPPORT)") $(info "PDDF_SUPPORT" : "$(PDDF_SUPPORT)") @@ -1054,6 +1057,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) \ $(addsuffix -install,$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(DEBOOTSTRAP))) \ $(if $(findstring y,$(ENABLE_ZTP)),$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(SONIC_ZTP))) \ + $(if $(findstring y,$(ENABLE_FIPS_FEATURE)),$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(SYMCRYPT_OPENSSL))) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES_PY3)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY2)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY3)) \ @@ -1106,7 +1110,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export include_kubernetes="$(INCLUDE_KUBERNETES)" export kube_docker_proxy="$(KUBE_DOCKER_PROXY)" export enable_pfcwd_on_start="$(ENABLE_PFCWD_ON_START)" - export installer_debs="$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$($*_INSTALLS))" + export installer_debs="$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$($*_INSTALLS) $(FIPS_BASEIMAGE_INSTALLERS))" export lazy_installer_debs="$(foreach deb, $($*_LAZY_INSTALLS),$(foreach device, $($(deb)_PLATFORM),$(addprefix $(device)@, $(IMAGE_DISTRO_DEBS_PATH)/$(deb))))" export lazy_build_installer_debs="$(foreach deb, $($*_LAZY_BUILD_INSTALLS), $(addprefix $($(deb)_MACHINE)|,$(deb)))" export installer_images="$(foreach docker, $($*_DOCKERS),\ diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 3e69075a0d05..2d91a3f836c9 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -397,20 +397,14 @@ RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confold" RUN apt-get -y build-dep linux # For gobgp and telemetry build -RUN export VERSION=1.14.2 \ -{%- if CONFIGURED_ARCH == "armhf" %} - && wget https://storage.googleapis.com/golang/go$VERSION.linux-armv6l.tar.gz \ - && tar -C /usr/local -xzf go$VERSION.linux-armv6l.tar.gz \ -{%- elif CONFIGURED_ARCH == "arm64" %} - && wget https://storage.googleapis.com/golang/go$VERSION.linux-arm64.tar.gz \ - && tar -C /usr/local -xzf go$VERSION.linux-arm64.tar.gz \ -{%- else %} - && wget https://storage.googleapis.com/golang/go$VERSION.linux-amd64.tar.gz \ - && tar -C /usr/local -xzf go$VERSION.linux-amd64.tar.gz \ +RUN apt-get install -y golang-1.15 && ln -s /usr/lib/go-1.15 /usr/local/go +{%- if ENABLE_FIPS_FEATURE == "y" %} +RUN wget -O golang-go.deb 'https://sonicstorage.blob.core.windows.net/public/fips/bullseye/0.1/{{ CONFIGURED_ARCH }}/golang-1.15-go_1.15.15-1~deb11u4%2Bfips_{{ CONFIGURED_ARCH }}.deb' \ + && wget -O golang-src.deb 'https://sonicstorage.blob.core.windows.net/public/fips/bullseye/0.1/{{ CONFIGURED_ARCH }}/golang-1.15-src_1.15.15-1~deb11u4%2Bfips_{{ CONFIGURED_ARCH }}.deb' \ + && dpkg -i golang-go.deb golang-src.deb \ + && ln -sf /usr/lib/go-1.15 /usr/local/go \ + && rm golang-go.deb golang-src.deb {%- endif %} - && echo 'export GOROOT=/usr/local/go' >> /etc/bash.bashrc \ - && echo 'export PATH=$PATH:$GOROOT/bin' >> /etc/bash.bashrc \ - && rm go$VERSION.linux-*.tar.gz RUN pip3 install --upgrade pip RUN apt-get purge -y python3-pip python3-yaml diff --git a/src/sonic-fips/.gitignore b/src/sonic-fips/.gitignore new file mode 100644 index 000000000000..f6c56847b1e6 --- /dev/null +++ b/src/sonic-fips/.gitignore @@ -0,0 +1 @@ +sonic-fips diff --git a/src/sonic-fips/Makefile b/src/sonic-fips/Makefile new file mode 100644 index 000000000000..f38583e2f6c8 --- /dev/null +++ b/src/sonic-fips/Makefile @@ -0,0 +1,29 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +SONIC_FIPS_BUILD_FROM_SOURCE =? n + +include ../../rules/sonic-fips.mk + +MAIN_TARGET = $(SYMCRYPT_OPENSSL) + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + if [ "$(SONIC_FIPS_BUILD_FROM_SOURCE)" == "y" ]; then + git clone -b "$(FIPS_VERSION)" https://github.com/Azure/sonic-fips + push sonic-fips + git submodule update --init + push src/SymCrypt; git submodule update --init -- jitterentropy-library; pop + make all + pop + cp sonic-fips/target/*.deb $(DEST)/ + exit 0 + fi + for target in $(FIPS_PACKAGE_ALL); do + filename=$$(basename $$target) + url=$(FIPS_URL_PREFIX)/$$filename + mkdir -p "$$(dirname $(DEST)/$$target)" + wget -O "$(DEST)/$$target" "$$url" + done + +$(addprefix $(DEST)/, $(FIPS_DERIVED_TARGET)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) From cfdb8431df86105698eabe9e5e1ee112c06fd7db Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Thu, 5 May 2022 18:04:14 -0700 Subject: [PATCH 285/817] [dhcp6relay] Add dhcpv6 option check (#10486) --- .../test_show_dhcp6relay_counters.py | 1 + .../cli/show/plugins/show_dhcp_relay.py | 2 +- src/dhcp6relay/src/relay.cpp | 50 ++++++++++++++----- src/dhcp6relay/src/relay.h | 2 + 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py b/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py index 501309ddd4d7..d818fa9c69a3 100644 --- a/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py +++ b/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py @@ -32,6 +32,7 @@ Decline Relay-Forward Relay-Reply + Malformed """ diff --git a/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py b/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py index 2e641c4c4233..91d5082e8f0c 100644 --- a/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py +++ b/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py @@ -12,7 +12,7 @@ DHCPv6_COUNTER_TABLE = 'DHCPv6_COUNTER_TABLE' # DHCPv6 Counter Messages -messages = ["Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline", "Relay-Forward", "Relay-Reply"] +messages = ["Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline", "Relay-Forward", "Relay-Reply", "Malformed"] # DHCP_RELAY Config Table DHCP_RELAY = 'DHCP_RELAY' diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index 951b31f90a0c..f9c7900c2690 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -49,18 +49,19 @@ const struct sock_fprog ether_relay_fprog = { /* DHCPv6 Counter */ uint64_t counters[DHCPv6_MESSAGE_TYPE_COUNT]; -std::map counterMap = {{0, "Unknown"}, - {1, "Solicit"}, - {2, "Advertise"}, - {3, "Request"}, - {4, "Confirm"}, - {5, "Renew"}, - {6, "Rebind"}, - {7, "Reply"}, - {8, "Release"}, - {9, "Decline"}, - {12, "Relay-Forward"}, - {13, "Relay-Reply"}}; +std::map counterMap = {{DHCPv6_MESSAGE_TYPE_UNKNOWN, "Unknown"}, + {DHCPv6_MESSAGE_TYPE_SOLICIT, "Solicit"}, + {DHCPv6_MESSAGE_TYPE_ADVERTISE, "Advertise"}, + {DHCPv6_MESSAGE_TYPE_REQUEST, "Request"}, + {DHCPv6_MESSAGE_TYPE_CONFIRM, "Confirm"}, + {DHCPv6_MESSAGE_TYPE_RENEW, "Renew"}, + {DHCPv6_MESSAGE_TYPE_REBIND, "Rebind"}, + {DHCPv6_MESSAGE_TYPE_REPLY, "Reply"}, + {DHCPv6_MESSAGE_TYPE_RELEASE, "Release"}, + {DHCPv6_MESSAGE_TYPE_DECLINE, "Decline"}, + {DHCPv6_MESSAGE_TYPE_RELAY_FORW, "Relay-Forward"}, + {DHCPv6_MESSAGE_TYPE_RELAY_REPL, "Relay-Reply"}, + {DHCPv6_MESSAGE_TYPE_MALFORMED, "Malformed"}}; /** * @code void initialize_counter(swss::DBConnector *db, std::string counterVlan); @@ -85,6 +86,7 @@ void initialize_counter(swss::DBConnector *db, std::string counterVlan) { db->hset(counterVlan, "Decline", toString(counters[DHCPv6_MESSAGE_TYPE_DECLINE])); db->hset(counterVlan, "Relay-Forward", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_FORW])); db->hset(counterVlan, "Relay-Reply", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_REPL])); + db->hset(counterVlan, "Malformed", toString(counters[DHCPv6_MESSAGE_TYPE_MALFORMED])); } /** @@ -622,6 +624,8 @@ void callback(evutil_socket_t fd, short event, void *arg) { current_position = tmp; auto msg = parse_dhcpv6_hdr(current_position); + auto option_position = current_position + sizeof(struct dhcpv6_msg); + counters[msg->msg_type]++; std::string counterVlan = counter_table; update_counter(config->db, counterVlan.append(config->interface), msg->msg_type); @@ -632,11 +636,31 @@ void callback(evutil_socket_t fd, short event, void *arg) { relay_relay_forw(config->local_sock, current_position, ntohs(udp_header->len) - sizeof(udphdr), ip_header, config); break; } - default: + case DHCPv6_MESSAGE_TYPE_SOLICIT: + case DHCPv6_MESSAGE_TYPE_REQUEST: + case DHCPv6_MESSAGE_TYPE_RENEW: + case DHCPv6_MESSAGE_TYPE_REBIND: + case DHCPv6_MESSAGE_TYPE_RELEASE: + case DHCPv6_MESSAGE_TYPE_DECLINE: { + while (option_position - message_buffer < len) { + auto option = parse_dhcpv6_opt(option_position, &tmp); + option_position = tmp; + if(ntohs(option->option_code) > DHCPv6_OPTION_LIMIT) { + counters[DHCPv6_MESSAGE_TYPE_MALFORMED]++; + update_counter(config->db, counterVlan.append(config->interface), DHCPv6_MESSAGE_TYPE_MALFORMED); + syslog(LOG_WARNING, "DHCPv6 option is invalid or contains malformed payload\n"); + return; + } + } relay_client(config->local_sock, current_position, ntohs(udp_header->len) - sizeof(udphdr), ip_header, ether_header, config); break; } + default: + { + syslog(LOG_WARNING, "DHCPv6 client message received was not relayed\n"); + break; + } } } diff --git a/src/dhcp6relay/src/relay.h b/src/dhcp6relay/src/relay.h index c224a9b28630..29e365bb5d83 100644 --- a/src/dhcp6relay/src/relay.h +++ b/src/dhcp6relay/src/relay.h @@ -16,6 +16,7 @@ #define RELAY_PORT 547 #define CLIENT_PORT 546 #define HOP_LIMIT 8 //HOP_LIMIT reduced from 32 to 8 as stated in RFC8415 +#define DHCPv6_OPTION_LIMIT 56 // DHCPv6 option code greater than 56 are currently unassigned #define lengthof(A) (sizeof (A) / sizeof (A)[0]) @@ -37,6 +38,7 @@ typedef enum DHCPv6_MESSAGE_TYPE_DECLINE = 9, DHCPv6_MESSAGE_TYPE_RELAY_FORW = 12, DHCPv6_MESSAGE_TYPE_RELAY_REPL = 13, + DHCPv6_MESSAGE_TYPE_MALFORMED = 14, DHCPv6_MESSAGE_TYPE_COUNT } dhcp_message_type_t; From 9ae17e66a392429899d8b371eca2361ced303150 Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Thu, 5 May 2022 20:27:29 -0700 Subject: [PATCH 286/817] [sonic-sairedis update] Support for SAI header v1.10.2 with BRCM SAI v7.1.0.0 and MLNX SAI v1.21.1.0 (#10583) --- platform/broadcom/sai-modules.mk | 4 +- platform/broadcom/sai.mk | 4 +- platform/broadcom/saibcm-modules-dnx | 2 +- .../broadcom/saibcm-modules/debian/changelog | 6 + .../saibcm-modules/include/soc/cmic.h | 37 - .../make/Makefile.linux-bmw-2_6 | 122 - .../saibcm-modules/make/Makefile.linux-gto | 127 -- .../make/Makefile.linux-gto-2_6 | 270 --- .../make/Makefile.linux-jag-2_6 | 166 -- .../make/Makefile.linux-nsx-2_6 | 56 - .../saibcm-modules/make/Makefile.linux-nsx64 | 54 - .../make/Makefile.linux-nsx_wrl-2_6 | 127 -- .../saibcm-modules/make/Makefile.linux-raptor | 53 - .../make/Makefile.linux-raptor-2_6 | 172 -- .../kernel/modules/bcm-ptp-clock/Makefile | 65 - .../modules/bcm-ptp-clock/bcm-ptp-clock.c | 1999 ----------------- .../linux/kernel/modules/knet-cb/psample-cb.c | 2 +- .../linux/kernel/modules/psample/psample.c | 2 + .../linux/kernel/modules/shared/ksal.c | 6 + .../systems/linux/user/bmw-2_6/Makefile | 63 - .../systems/linux/user/gto-2_6/Makefile | 84 - .../systems/linux/user/gto/Makefile | 60 - .../systems/linux/user/jag-2_6/Makefile | 79 - .../systems/linux/user/nsx-2_6/Makefile | 58 - .../systems/linux/user/nsx64/Makefile | 57 - .../systems/linux/user/nsx_wrl-2_6/Makefile | 65 - .../systems/linux/user/raptor-2_6/Makefile | 79 - .../systems/linux/user/raptor/Makefile | 58 - platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/mlnx-sai/SAI-Implementation | 2 +- slave.mk | 2 +- src/sonic-sairedis | 2 +- 32 files changed, 24 insertions(+), 3861 deletions(-) delete mode 100644 platform/broadcom/saibcm-modules/include/soc/cmic.h delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-bmw-2_6 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-gto delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-gto-2_6 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-jag-2_6 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-nsx-2_6 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-nsx64 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-nsx_wrl-2_6 delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-raptor delete mode 100644 platform/broadcom/saibcm-modules/make/Makefile.linux-raptor-2_6 delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/bcm-ptp-clock.c delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/bmw-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/gto-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/gto/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/jag-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/nsx-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/nsx64/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/nsx_wrl-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/raptor-2_6/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/user/raptor/Makefile diff --git a/platform/broadcom/sai-modules.mk b/platform/broadcom/sai-modules.mk index 1236e06d6240..5aa7792064cb 100644 --- a/platform/broadcom/sai-modules.mk +++ b/platform/broadcom/sai-modules.mk @@ -1,6 +1,6 @@ # Broadcom SAI modules -BRCM_OPENNSL_KERNEL_VERSION = 6.1.0.3 +BRCM_OPENNSL_KERNEL_VERSION = 7.1.0.0 BRCM_OPENNSL_KERNEL = opennsl-modules_$(BRCM_OPENNSL_KERNEL_VERSION)_amd64.deb $(BRCM_OPENNSL_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/saibcm-modules @@ -10,7 +10,7 @@ $(BRCM_OPENNSL_KERNEL)_MACHINE = broadcom SONIC_DPKG_DEBS += $(BRCM_OPENNSL_KERNEL) # SAI bcm modules for DNX family ASIC -BRCM_DNX_OPENNSL_KERNEL_VERSION = 6.1.0.3 +BRCM_DNX_OPENNSL_KERNEL_VERSION = 7.1.0.0 BRCM_DNX_OPENNSL_KERNEL = opennsl-modules-dnx_$(BRCM_DNX_OPENNSL_KERNEL_VERSION)_amd64.deb $(BRCM_DNX_OPENNSL_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/saibcm-modules-dnx diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 1ec8d915e5bd..872c51276fe5 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ -LIBSAIBCM_VERSION = 6.1.0.3 -LIBSAIBCM_BRANCH_NAME = REL_6.1 +LIBSAIBCM_VERSION = 7.1.0.0 +LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_VERSION)" BRCM_SAI = libsaibcm_$(LIBSAIBCM_VERSION)_amd64.deb diff --git a/platform/broadcom/saibcm-modules-dnx b/platform/broadcom/saibcm-modules-dnx index 6bf58f8310bc..fb4cf12529bc 160000 --- a/platform/broadcom/saibcm-modules-dnx +++ b/platform/broadcom/saibcm-modules-dnx @@ -1 +1 @@ -Subproject commit 6bf58f8310bcb29168ae5b2dabed84fc942429fc +Subproject commit fb4cf12529bc27fffc1c988029f4db100138f133 diff --git a/platform/broadcom/saibcm-modules/debian/changelog b/platform/broadcom/saibcm-modules/debian/changelog index 0ff357c57279..daa78471c6b2 100644 --- a/platform/broadcom/saibcm-modules/debian/changelog +++ b/platform/broadcom/saibcm-modules/debian/changelog @@ -1,3 +1,9 @@ +opennsl (7.1.0.0) unstable; urgency=medium + + * Update to Broadcom SAI 7.1.0.0. + + -- Vineet Mittal Tue, 19 APR 2022 12:30:00 +0000 + opennsl (6.1.0.3) unstable; urgency=medium * Update to Broadcom SAI 6.1.0.3 diff --git a/platform/broadcom/saibcm-modules/include/soc/cmic.h b/platform/broadcom/saibcm-modules/include/soc/cmic.h deleted file mode 100644 index 5bf6130237a2..000000000000 --- a/platform/broadcom/saibcm-modules/include/soc/cmic.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2017 Broadcom - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, as - * published by the Free Software Foundation (the "GPL"). - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License version 2 (GPLv2) for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 (GPLv2) along with this source code. - */ -/* - * $Id: cmic.h,v 1.1 Broadcom SDK $ - * $Copyright: (c) 2005 Broadcom Corp. - * All Rights Reserved.$ - * - * File: cmic.h - * Purpose: Maps out structures used for CMIC operations and - * exports routines and constants. - */ - -#ifndef _SOC_CMIC_H -#define _SOC_CMIC_H - -/* IRQ Register (RO) */ -#define CMIC_IRQ_STAT 0x00000144 - -/* IRQ Mask Registers (R/W) */ -#define CMIC_IRQ_MASK 0x00000148 -#define CMIC_IRQ_MASK_1 0x0000006C -#define CMIC_IRQ_MASK_2 0x00000070 - -#endif /* !_SOC_CMIC_H */ diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-bmw-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-bmw-2_6 deleted file mode 100644 index 6fa170fb75e6..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-bmw-2_6 +++ /dev/null @@ -1,122 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-bmw-2_6,v 1.20 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# Look for custom tools -ifneq (,$(PPC_TOOLS_DIR)) -ifneq (,$(PPC_CROSS_COMPILE)) -override PATH := $(PPC_TOOLS_DIR):$(PATH) -override CROSS_COMPILE := $(PPC_CROSS_COMPILE) -endif -endif - -# Default tools -ifeq (,$(WRS_LINUX_VERSION)) -WRS_LINUX_VERSION=2.0 -endif - -# Default Linux Kernel directory -ifeq (,$(KERNDIR)) - -ifeq (1.4,$(WRS_LINUX_VERSION)) - -KERNDIR := /projects/ntsw-tools/linux/wrslinux_1.4/bcm98245cpci/build/linux-2.6.14-cgl - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE = powerpc-wrs-linux-gnu-603e-glibc_std- -endif - -WRLINUX_BASE=/tools/windriver/linux_ed/1.4/Linux -export WIND_LIC_PROXY = $(WRLINUX_BASE)/setup/x86-linux2/bin -override PATH := $(WRLINUX_BASE)/gnu/3.4.4-wrlinux-1.4/x86-linux2/bin:$(PATH) - -WRS_SYSROOT_PATH := $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/3.4.4/include -else - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE = powerpc-wrs-linux-gnu-ppc_603e-glibc_std- -endif - -KERNDIR:= /projects/ntsw-tools/linux/wrslinux_2.0/bmw/glibc_std/build/linux-2.6.21-standard - -WRLINUX_BASE=/tools/windriver/linux_ed/2.0_GA/Linux - -TOOLCHAIN_EXEC_PREFIX=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2 -TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_EXEC_PREFIX) -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin - -WRLINUX_GNU_PATH = $(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin - -override PATH := $(TOOLCHAIN_EXEC_PREFIX):$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/powerpc-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) - -export TOOLCHAIN_EXEC_PREFIX TOOLCHAIN_BIN_DIR WIND_LIC_PROXY - -WRS_SYSROOT_PATH := $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/4.1.2/include - -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") -endif -endif -endif - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"BMW_MPC8245/PPC603e\" - -ARCH = ppc -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - -ifeq (1.4,$(WRS_LINUX_VERSION)) -# From linux/arch/ppc/Makefile - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -fsigned-char -msoft-float -pipe -ffixed-r2 -Wno-uninitialized -mmultiple -mstring -endif - -else -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -m32 -nostdinc -isystem $(WRS_SYSROOT_PATH) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -I$(KERNDIR)/arch/ppc -I$(KERNDIR)/arch/ppc/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -msoft-float -pipe -ffixed-r2 -mmultiple -mno-altivec -mstring -fomit-frame-pointer -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -endif - -endif -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-gto b/platform/broadcom/saibcm-modules/make/Makefile.linux-gto deleted file mode 100644 index 4a20a99dac69..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-gto +++ /dev/null @@ -1,127 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-gto-4_4,v 1.42 Broadcom SDK $ -# $Copyright: (c) 2015 Broadcom Corp. -# All Rights Reserved.$ - -# User must select one platform from below. -ifeq (,$(BUILD_PLATFORM)) -BUILD_PLATFORM=POWERPC_LINUX -endif - -# TOOLCHAIN_BASE_DIR Toolchain base directory for GTO devices -# TARGET_ARCHITECTURE Compiler for target architecture -# KERNDIR Kernel directory for iPROC-CMICd devices -TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/gto -TARGET_ARCHITECTURE := powerpc-broadcom-linux-gnuspe -KERNDIR ?= $(TOOLCHAIN_BASE_DIR)/kernel/current - - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := $(TARGET_ARCHITECTURE)- -endif - - -# GTO toolchain -TOOLCHAIN_BIN_DIR := $(TOOLCHAIN_BASE_DIR)/toolchain/host/usr/bin -override PATH := $(TOOLCHAIN_BIN_DIR)/../$(TARGET_ARCHITECTURE)/bin:$(TOOLCHAIN_BIN_DIR):$(PATH) -export TOOLCHAIN_BIN_DIR - - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"GTO_MPC8548\" -CFGFLAGS += -DSAL_BDE_DMA_MEM_DEFAULT=32 - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -ARCH = powerpc -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - - -# From linux/arch/ppc/Makefile -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") - -KFLAG_INCLD = $(TOOLCHAIN_BIN_DIR)/../lib/gcc/$(TARGET_ARCHITECTURE)/4.6.4/include - -ifdef BROADCOM_SVK -ifeq ($PLX_PCI2LBUS, 1) -CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -endif -endif - -ifdef DPP_CHIPS -CFLAGS += -DDUNE_BCM -D__DUNE_LINUX_BCM_CPU_PCP_DMA__ -CFGFLAGS += -DSOC_CM_FUNCTION -endif - -ifdef DFE_CHIPS -CFLAGS += -DDUNE_BCM -CFGFLAGS += -DSOC_CM_FUNCTION -endif - -ifdef SAND_CHIPS -CFLAGS += -D__DUNE_GTO_BCM_CPU__ -D__DUNE_LINUX_BCM_CPU_PCIE__ -endif - -ifdef SHADOW_PLX -CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -DSHADOW_SVK -endif - -ifdef LTSW_CHIPS -# Default open source target build -OPENSRC_BUILD ?= uclibc_201402_ppc - -# Hardware interface (see $SDKLT/bcma/sys/probe directory) -SYSTEM_INTERFACE ?= ngbde - -# Turn on direct register access if running on real hardware. -ifeq (ngbde,$(SYSTEM_INTERFACE)) -LTSW_ADD_CPPFLAGS += -DBCMDRD_CONFIG_MEMMAP_DIRECT=1 -endif - -export SYSTEM_INTERFACE -endif - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -m32 -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/generated/uapi/linux/version.h -include $(LINUX_INCLUDE)/generated/autoconf.h -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc/include -I$(KERNDIR)/include/asm-powerpc -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -msoft-float -pipe -ffixed-r2 -mmultiple -mno-altivec -funit-at-a-time -Wa,-me500 -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign -endif - -ifneq (,$(findstring TCL,$(FEATURE_LIST))) -#LINK_STATIC = 0 -#export LINK_STATIC -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-4_4 -endif - diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-gto-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-gto-2_6 deleted file mode 100644 index 56085c7a3cdd..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-gto-2_6 +++ /dev/null @@ -1,270 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-gto-2_6,v 1.42 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# User must select one platform from below.By default WR_LINUX is selected. . -ifeq (,$(BUILD_PLATFORM)) -#BUILD_PLATFORM=ELDK -BUILD_PLATFORM=WR_LINUX -endif - -# Specify the ELDK version you want to use for building SDK. -ifeq (,$(ELDK_VERSION)) -ifeq (ELDK,$(BUILD_PLATFORM)) -ELDK_VERSION=4.0 -endif -endif - -# Specify the KERNEL VERSION you want to use for building SDK. -ifeq (,$(KERN_VER)) -ifeq (ELDK,$(BUILD_PLATFORM)) -KERN_VER=2.6.21.7 -endif -endif - - -# Specify the Windriver Linux version here.For example '2.0' as shown below. -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (,$(WRS_LINUX_VERSION)) -WRS_LINUX_VERSION=2.0 -endif -endif - - -#glibc_small and glibc_std have their own cross-compilation tools and and path for these tools are different as implemented below. To enable glibc_small build, line given below should be uncommented. - -#WRL_GLIBC_SMALL=TRUE - -ifeq (2.0,$(WRS_LINUX_VERSION)) -ifeq ($(WRL_GLIBC_SMALL),TRUE) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_small- -endif - -KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_2.0/gto/glibc_small/build/linux-2.6.21-standard - -else - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_std- -endif - -KERNDIR ?= /projects/ntsw-tools/linux/wrslinux_2.0/gto/glibc_std/build/linux-2.6.21-standard - -endif - -export WRL_GLIBC_SMALL - -# After this point glibc_std and glibc_small share these flags - -WRLINUX_BASE ?=/tools/windriver/linux_ed/2.0_GA/Linux -TOOLCHAIN_EXEC_PREFIX=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2 -TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_EXEC_PREFIX) -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin -WRLINUX_GNU_PATH = $(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin -override PATH := $(TOOLCHAIN_EXEC_PREFIX):$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/powerpc-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) -export TOOLCHAIN_EXEC_PREFIX TOOLCHAIN_BIN_DIR WIND_LIC_PROXY -endif - - -ifeq (3.0,$(WRS_LINUX_VERSION)) -ifeq ($(WRL_GLIBC_SMALL),TRUE) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_small- -endif - -KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_small/build/linux-broadcom_bcm98548xmc-standard-build -KERNDIR_STD ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_small/build/linux - -else - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_std- -endif - -KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_std_debug/build/linux-broadcom_bcm98548xmc-standard-build -KERNDIR_STD ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_std_debug/build/linux - -endif - -export WRL_GLIBC_SMALL - -# After this point glibc_std and glibc_small share these flags - -WRLINUX_BASE ?=/tools/windriver/linux_ed/3.0/Linux -TOOLCHAIN_EXEC_PREFIX=$(WRLINUX_BASE)/wrlinux-3.0/layers/wrll-toolchain-4.3-85/powerpc/toolchain/x86-linux2 -TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_EXEC_PREFIX) -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin -WRLINUX_GNU_PATH = $(WRLINUX_BASE)/wrlinux-3.0/layers/wrll-toolchain-4.3-85/powerpc/toolchain/x86-linux2/bin -override PATH := $(TOOLCHAIN_EXEC_PREFIX):$(KERNDIR_STD)/../../host-cross/bin:$(KERNDIR_STD)/../../host-cross/powerpc-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) -export TOOLCHAIN_EXEC_PREFIX TOOLCHAIN_BIN_DIR WIND_LIC_PROXY - -LINUX_INCLUDE_STD := $(KERNDIR_STD)/include - -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (2.6.21.7, $(KERN_VER)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := ppc_85xx- -endif - -ifeq (4.0, $(ELDK_VERSION)) -override PATH := /tools/eldk/4.0/usr/bin:$(PATH) -else -override PATH := /tools/eldk/4.1/usr/bin:$(PATH) -endif -KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.21.7 -endif -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (2.6.24.4, $(KERN_VER)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := ppc_85xx- -endif - -ifeq (4.0, $(ELDK_VERSION)) -override PATH := /tools/eldk/4.0/usr/bin:$(PATH) -else -override PATH := /tools/eldk/4.1/usr/bin:$(PATH) -endif -KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.24.4 -endif -endif - - -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (2.6.25, $(KERN_VER)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := ppc_85xx- -endif - -ifeq (4.0, $(ELDK_VERSION)) -override PATH := /tools/eldk/4.0/usr/bin:$(PATH) -else -override PATH := /tools/eldk/4.1/usr/bin:$(PATH) -endif -KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.25 -endif -endif - - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"GTO_MPC8548\" -CFGFLAGS += -DSAL_BDE_DMA_MEM_DEFAULT=32 - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -ARCH = powerpc -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - - -# From linux/arch/ppc/Makefile -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") - - -ifeq (,$(KFLAG_INCLD)) -ifeq (4.0,$(ELDK_VERSION)) -ifeq (ELDK,$(BUILD_PLATFORM)) -KFLAG_INCLD = /tools/eldk/4.0/usr/lib/gcc/powerpc-linux/4.0.0/include -endif -endif - -ifeq (4.1,$(ELDK_VERSION)) -ifeq (ELDK,$(BUILD_PLATFORM)) -KFLAG_INCLD = /tools/eldk/4.1/usr/lib/gcc/powerpc-linux/4.0.0/include -endif -endif - -ifeq (2.0,$(WRS_LINUX_VERSION)) -KFLAG_INCLD = $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/4.1.2/include -endif - -ifeq (3.0,$(WRS_LINUX_VERSION)) -KFLAG_INCLD = $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/4.3.2/include -endif -endif - -ifdef BROADCOM_SVK -ifeq ($PLX_PCI2LBUS, 1) -CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -endif -endif - -ifdef DPP_CHIPS -CFLAGS += -DDUNE_BCM -D__DUNE_LINUX_BCM_CPU_PCP_DMA__ -CFGFLAGS += -DSOC_CM_FUNCTION -endif - -ifdef DFE_CHIPS -CFLAGS += -DDUNE_BCM -CFGFLAGS += -DSOC_CM_FUNCTION -endif - -ifdef SAND_CHIPS -CFLAGS += -D__DUNE_GTO_BCM_CPU__ -D__DUNE_LINUX_BCM_CPU_PCIE__ -endif - -ifdef SHADOW_PLX -CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -DSHADOW_SVK -endif - -ifeq (,$(KFLAGS)) -#autoconf.h was moved in later kernels -LINUX_AUTOCONF = $(LINUX_INCLUDE)/generated/autoconf.h -ifeq (,$(shell ls $(LINUX_AUTOCONF) 2>/dev/null)) -LINUX_AUTOCONF = $(LINUX_INCLUDE)/linux/autoconf.h -endif - -KFLAGS := -D__KERNEL__ -m32 -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/version.h -include $(LINUX_AUTOCONF) -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc/include -I$(KERNDIR)/include/asm-powerpc -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -msoft-float -pipe -ffixed-r2 -mmultiple -mno-altivec -funit-at-a-time -Wa,-me500 -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign -endif - -#Wind river Linux 3.0 needs addtional flags -ifeq (3.0,$(WRS_LINUX_VERSION)) - -# Use MSI interrupts if kernel is compiled with MSI support. -#CFLAGS += -DBDE_LINUX_USE_MSI_INTERRUPT -KFLAGS += -I$(LINUX_INCLUDE_STD) -I$(KERNDIR_STD)/arch/powerpc -I$(KERNDIR_STD)/arch/powerpc/include -I$(KERNDIR_STD)/include.asm-powerpc -mno-spe -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-jag-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-jag-2_6 deleted file mode 100644 index 1e89cdab2434..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-jag-2_6 +++ /dev/null @@ -1,166 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-jag-2_6,v 1.20 Broadcom SDK $ -# $Copyright: (c) 2007 Broadcom Corp. -# All Rights Reserved.$ - - -# User must select one platform from below.By default WR_LINUX is selected. . -ifeq (,$(BUILD_PLATFORM)) -#BUILD_PLATFORM=ELDK -BUILD_PLATFORM=WR_LINUX -endif - - -# Specify the KERNEL VERSION you want to use for building SDK. -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (,$(KERN_VER)) -KERN_VER=2.6.21.7 -endif -endif - -# Specify the Windriver Linux version here.For example '2.0' as shown below. -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (,$(WRS_LINUX_VERSION)) -WRS_LINUX_VERSION=2.0 -endif -endif - -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (1.4,$(WRS_LINUX_VERSION)) - -KERNDIR := /projects/ntsw-tools/linux/wrslinux_1.4/broadcom_bcm95836cpci_be/build/linux-2.6.14-small - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu- -endif - -export WIND_LIC_PROXY = /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/setup/x86-linux2/bin - -override PATH := /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/gnu/3.4.4-wrlinux-1.4/x86-linux2/bin:$(PATH) -endif - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -#CROSS_COMPILE = mips-wrs-linux-gnu- - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu-mips_softfp-glibc_std- -endif - -KERNDIR:= /projects/ntsw-tools/linux/wrslinux_2.0/jag/glibc_std/build/linux-2.6.21-standard - -endif - -WRLINUX_BASE=/tools/windriver/linux_ed/2.0_GA/Linux - -TOOLCHAIN_BIN_DIR=$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin - -WRLINUX_GNU_PATH=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin - -override PATH:=$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) - -WRS_SYSROOT_PATH := $(WRLINUX_GNU_PATH)/../lib/gcc/mips-wrs-linux-gnu/4.1.2/include - -export TOOLCHAIN_BIN_DIR WIND_LIC_PROXY -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (2.6.21.7, $(KERN_VER)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips_4KC- -endif - -override PATH := /tools/eldk/4.1/usr/bin:$(PATH) -KERNDIR ?= /projects/ntsw-tools/linux/eldk/jag-ntswics-eldk/linux-2.6.21.7 -endif -endif - - - -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") - - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=1 -DSYS_BE_OTHER=0 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"JAG_BCM4704\" - -ARCH = mips -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - -ifeq (ELDK,$(BUILD_PLATFORM)) -KFLAG_INCLD = /tools/eldk/4.1/usr/lib/gcc/mips-linux/4.0.0/include/ -endif - -ifeq (1.4,$(WRS_LINUX_VERSION)) -# From linux/arch/mips/Makefile - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -Wall -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -g -G 0 -mno-abicalls -fno-pic -pipe -march=mips32 -Wa,-mips32 -Wa,--trap -funit-at-a-time -mlong-calls -Wundef -finline-limit=100000 -mabi=32 -endif - -#-Wdeclaration-after-statement -Wstrict-prototypes -else - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -nostdinc -isystem $(WRS_SYSROOT_PATH) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -I$(KERNDIR)/arch/mips -I$(KERNDIR)/arch/mips -I$(KERNDIR)/arch/mips/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -ffreestanding -march=mips32 -Wa,-mips32 -Wa,--trap -Iinclude/asm-mips/mach-bcm947xx -Iinclude/asm-mips/mach-generic -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -mlong-calls -endif - -endif -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -I$(KERNDIR)/arch/mips -I$(KERNDIR)/arch/mips -I$(KERNDIR)/arch/mips/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -ffreestanding -march=mips32 -Wa,-mips32 -Wa,--trap -Iinclude/asm-mips/mach-bcm947xx -Iinclude/asm-mips/mach-generic -fomit-frame-pointer -g -Wdeclaration-after-statement -mlong-calls -endif - -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif - -ifneq (,$(findstring TCL,$(FEATURE_LIST))) -LINK_STATIC=0 -export LINK_STATIC -endif - - - - diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx-2_6 deleted file mode 100644 index 785619f31fd4..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx-2_6 +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-nsx-2_6,v 1.9 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# Look for custom tools -ifneq (,$(MIPS_TOOLS_DIR)) -override PATH := $(MIPS_TOOLS_DIR):$(PATH) -endif -ifneq (,$(MIPS_CROSS_COMPILE)) -override CROSS_COMPILE := $(MIPS_CROSS_COMPILE) -endif - -# Default tools -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips2_fp_be- -override PATH := $(PATH):/projects/ntsw-tools/linux/mvista/mvista-4.0/pro/devkit/mips/mips2_fp_be/bin -endif - -# Default Linux Kernel directory -ifeq (,$(KERNDIR)) -KERNDIR := /projects/ntsw-tools/linux/mvista/mvista-4.0-nsx/linux-2.6.10_dev -endif -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"NSX_BCM1125\" - -# From linux/arch/mips/Makefile - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -O2 -fomit-frame-pointer -fno-strict-aliasing -G 0 -mno-abicalls -fno-pic -mips64 -mtune=sb1 -Wa,--trap -pipe -mlong-calls -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx64 b/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx64 deleted file mode 100644 index c4f71995be52..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx64 +++ /dev/null @@ -1,54 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-nsx64,v 1.9 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# Look for custom tools -ifneq (,$(MIPS_TOOLS_DIR)) -override PATH := $(MIPS_TOOLS_DIR):$(PATH) -endif -ifneq (,$(MIPS_CROSS_COMPILE)) -override CROSS_COMPILE := $(MIPS_CROSS_COMPILE) -endif - -# Default tools -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips64_fp_be- -override PATH := $(PATH):/projects/ntsw-tools/linux/mvista/mips64_be_tools-3.1/bin -endif - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE = /projects/ntsw-tools/linux/headers/mvl-3.1-nsx64/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -Wa,-xgot -mips64 -mabi=64 -fno-strict-aliasing -DPTRS_ARE_64BITS -DLONGS_ARE_64BITS -CFGFLAGS += -DBCM_PLATFORM_STRING=\"NSX_BCM1125\" - -# From linux/arch/mips/Makefile - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -O2 -fomit-frame-pointer -fno-strict-aliasing -G 0 -mno-abicalls -fno-pic -mips64 -mabi=64 -mtune=sb1 -Wa,--trap -pipe -mlong-calls -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel -endif - -MODULE_LDFLAGS += -m elf64btsmip diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx_wrl-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx_wrl-2_6 deleted file mode 100644 index 7b549038fd24..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-nsx_wrl-2_6 +++ /dev/null @@ -1,127 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-nsx_wrl-2_6,v 1.15 Broadcom SDK $ -# $Copyright: (c) 2007 Broadcom Corp. -# All Rights Reserved.$ - -ifeq (,$(WRS_LINUX_VERSION)) -WRS_LINUX_VERSION=2.0 -endif - -# Look for custom tools -ifneq (,$(MIPS_TOOLS_DIR)) -ifneq (,$(MIPS_CROSS_COMPILE)) -override PATH := $(MIPS_TOOLS_DIR):$(PATH) -override CROSS_COMPILE := $(MIPS_CROSS_COMPILE) -endif -endif - -# Default Linux Kernel directory -ifeq (,$(KERNDIR)) - -ifeq (1.4,$(WRS_LINUX_VERSION)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu- -endif - -KERNDIR := /projects/ntsw-tools/linux/wrslinux_1.4/broadcom_bcm91125cpci_32_be_glibc_std/build/linux-2.6.14-cgl - -export WIND_LIC_PROXY = /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/setup/x86-linux2/bin -override PATH := /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/gnu/3.4.4-wrlinux-1.4/x86-linux2/bin:$(PATH) -else - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu-mips-glibc_std- -endif - -KERNDIR:= /projects/ntsw-tools/linux/wrslinux_2.0/nsx/glibc_std/build/linux-2.6.21-standard - -WRLINUX_BASE=/tools/windriver/linux_ed/2.0_GA/Linux - -TOOLCHAIN_BIN_DIR=$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin - -WRLINUX_GNU_PATH=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin -override PATH:=$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) - -WRS_SYSROOT_PATH := $(WRLINUX_GNU_PATH)/../lib/gcc/mips-wrs-linux-gnu/4.1.2/include - -export TOOLCHAIN_BIN_DIR WIND_LIC_PROXY - -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") - -endif -endif -endif - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1 -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"NSX_BCM1125\" - -ARCH = mips -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - -ifeq (1.4,$(WRS_LINUX_VERSION)) -# From Linux Kbuild output - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -Iinclude -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -g -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=sb1 -Wa,-32 -Wa,-march=sb1 -Wa,-mips64 -Wa,--trap -DSIBYTE_HDR_FEATURES=SIBYTE_HDR_FMASK_1250_112x_ALL -mlong-calls -#-Wdeclaration-after-statement -endif - -else - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -nostdinc -isystem $(WRS_SYSROOT_PATH) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -ffreestanding -march=sb1 -Wa,--trap -Iinclude/asm-mips/mach-sibyte -Iinclude/asm-mips/mach-generic -DSIBYTE_HDR_FEATURES=SIBYTE_HDR_FMASK_1250_112x_ALL -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -mlong-calls -endif - -endif -endif - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif - - -ifneq (,$(findstring TCL,$(FEATURE_LIST))) -LINK_STATIC=0 -export LINK_STATIC -endif - - diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor b/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor deleted file mode 100644 index 80c51e782bea..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor +++ /dev/null @@ -1,53 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-raptor,v 1.6 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# Look for custom tools -ifneq (,$(MIPS_TOOLS_DIR)) -override PATH := $(MIPS_TOOLS_DIR):$(PATH) -endif -ifneq (,$(MIPS_CROSS_COMPILE)) -override CROSS_COMPILE := $(MIPS_CROSS_COMPILE) -endif - -# Default tools -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips_fp_be- -override PATH := $(PATH):/projects/ntsw-tools/linux/mvista/mvista-3.1/pro/devkit/mips/fp_be/bin -endif - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE = /projects/ntsw-tools/linux/headers/mvl-3.1-raptor/include -endif - -CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=1 -DSYS_BE_OTHER=0 -DBCM_ICS -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -CFGFLAGS += -DBCM_PLATFORM_STRING=\"Raptor_BCM56218\" - - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel -endif - -# From linux/arch/mips/Makefile - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -m$(gcc-tune-flag)=r4600 -mips2 -Wa,--trap -mlong-calls -endif diff --git a/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor-2_6 b/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor-2_6 deleted file mode 100644 index 0bebdf9564c6..000000000000 --- a/platform/broadcom/saibcm-modules/make/Makefile.linux-raptor-2_6 +++ /dev/null @@ -1,172 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# $Id: Makefile.linux-raptor-2_6,v 1.21 Broadcom SDK $ -# $Copyright: (c) 2007 Broadcom Corp. -# All Rights Reserved.$ - - -# User must select one platform from below.By default WR_LINUX is selected. . -ifeq (,$(BUILD_PLATFORM)) -#BUILD_PLATFORM=ELDK -BUILD_PLATFORM=WR_LINUX -endif - - -# Specify the KERNEL VERSION you want to use for building SDK. -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (,$(KERN_VER)) -KERN_VER=2.6.21.7 -endif -endif - -# Specify the Windriver Linux version here.For example '2.0' as shown below. -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (,$(WRS_LINUX_VERSION)) -WRS_LINUX_VERSION=2.0 -endif -endif - - -# Default Linux Kernel directory -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (1.4,$(WRS_LINUX_VERSION)) - -KERNDIR ?= /projects/ntsw-tools/linux/wrslinux_1.4/broadcom_bcm95621x_be/build/linux-2.6.14-small - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu- -endif - -export WIND_LIC_PROXY = /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/setup/x86-linux2/bin - -override PATH := /projects/ntsw-tools/wrs/wrs_linux/GPP_LE_1.4_PPR/gnu/3.4.4-wrlinux-1.4/x86-linux2/bin:$(PATH) -endif - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips-wrs-linux-gnu-mips_softfp-glibc_std- -endif - -KERNDIR ?= /projects/ntsw-tools/linux/wrslinux_2.0/ntswics/glibc_std/build/linux-2.6.21-standard -override PATH:=$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) - -endif - -WRLINUX_BASE=/tools/windriver/linux_ed/2.0_GA/Linux - -TOOLCHAIN_BIN_DIR=$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin -WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin - -WRLINUX_GNU_PATH=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin - -override PATH:=$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/mips-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH) - -WRS_SYSROOT_PATH := $(WRLINUX_GNU_PATH)/../lib/gcc/mips-wrs-linux-gnu/4.1.2/include - -export TOOLCHAIN_BIN_DIR WIND_LIC_PROXY - -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) -ifeq (2.6.21.7, $(KERN_VER)) -ifeq (,$(CROSS_COMPILE)) -CROSS_COMPILE := mips_4KC- -endif -override PATH := /tools/eldk/4.1/usr/bin:$(PATH) -KERNDIR ?= /projects/ntsw-tools/linux/eldk/raptor_eldk/linux-2.6.21.7 -endif -endif - - - -comma = , -basetarget = $(basename $(notdir $@)) -modname = $(basetarget) - -# Extra variables. -EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) - -name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" -modname_flags = $(if $(filter 1,$(words $(modname))),\ - -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") - -# Default Linux include directory -ifeq (,$(LINUX_INCLUDE)) -LINUX_INCLUDE := $(KERNDIR)/include -endif - -CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=1 -DSYS_BE_OTHER=0 -DBCM_ICS -ENDIAN = BE_HOST=1 -CFGFLAGS += -D$(ENDIAN) -DRAPTOR -CFGFLAGS += -DBCM_PLATFORM_STRING=\"Raptor_BCM56218\" - - -ARCH = mips -KBUILD_VERBOSE = 1 - -export ARCH KBUILD_VERBOSE - - -ifeq (ELDK,$(BUILD_PLATFORM)) -KFLAG_INCLD = /tools/eldk/4.1/usr/lib/gcc/mips-linux/4.0.0/include -endif - - -# From linux/arch/mips/Makefile -ifeq (WR_LINUX,$(BUILD_PLATFORM)) -ifeq (1.4,$(WRS_LINUX_VERSION)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -Wall -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -g -G 0 -mno-abicalls -fno-pic -pipe -march=mips32 -Wa,-mips32 -Wa,--trap -funit-at-a-time -mlong-calls -Wundef -finline-limit=100000 -mabi=32 -endif - -endif - -ifeq (2.0,$(WRS_LINUX_VERSION)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -nostdinc -isystem $(WRS_SYSROOT_PATH) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -I$(KERNDIR)/arch/mips/mach-bcm56218 -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -ffreestanding -march=mips32 -Wa,-mips32 -Wa,--trap -Iinclude/asm-mips/mach-bcm56218 -Iinclude/asm-mips/mach-generic -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -mlong-calls -endif - -endif -endif - -ifeq (ELDK,$(BUILD_PLATFORM)) - -ifeq (,$(KFLAGS)) -KFLAGS := -D__KERNEL__ -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/autoconf.h -I$(KERNDIR)/arch/mips/mach-bcm56218 -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -ffreestanding -march=mips32 -Wa,-mips32 -Wa,--trap -Iinclude/asm-mips/mach-bcm56218 -Iinclude/asm-mips/mach-generic -fomit-frame-pointer -g -Wdeclaration-after-statement -mlong-calls -endif - - -endif - - - -ifneq ($(targetplat),user) -include ${SDK}/make/Makefile.linux-kernel-2_6 -endif - -ifneq (,$(findstring TCL,$(FEATURE_LIST))) -LINK_STATIC=0 -export LINK_STATIC -endif - - - - - diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/Makefile b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/Makefile deleted file mode 100644 index 743eb741732b..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.3 2012/07/17 07:39:51 mlarsen Exp $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ -# -LOCALDIR = systems/linux/kernel/modules/bcm-ptp-clock - -include ${SDK}/make/Make.config - -LIBS = $(LIBDIR)/libkern.a - -ifeq ($(kernel_version),2_4) -MODULE = $(LIBDIR)/linux-bcm-ptp-clock.o -else -KERNEL_MODULE_DIR = kernel_module - -THIS_MOD_NAME := linux-bcm-ptp-clock -MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o -KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko - -build: $(MODULE) $(KMODULE) -endif - -KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../../../../bde/linux/kernel/kernel_module/Module.symvers -KBUILD_EXTRA_SYMBOLS += ${BLDDIR}/../bcm-knet/kernel_module/Module.symvers - -# BCM PTP Clock Device - -$(MODULE): $(BLDDIR)/.tree $(BOBJS) $(LIBS) - $(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@ -ifneq ($(kernel_version),2_4) -$(KMODULE): $(MODULE) - rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR) - mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR) - cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile - cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers - MOD_NAME=$(THIS_MOD_NAME) KBUILD_EXTRA_SYMBOLS="${KBUILD_EXTRA_SYMBOLS}" $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko -endif - -# Make.depend is before clean:: so that Make.depend's clean:: runs first. - -include ${SDK}/make/Make.depend - -clean:: - $(RM) $(BLDDIR)/version.c $(BLDDIR)/version.o - $(RM) $(BOBJS) $(MODULE) - -ifneq ($(kernel_version),2_4) -.PHONY: build -endif diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/bcm-ptp-clock.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/bcm-ptp-clock.c deleted file mode 100644 index 7c88fae97d62..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/bcm-ptp-clock/bcm-ptp-clock.c +++ /dev/null @@ -1,1999 +0,0 @@ -/* - * Copyright 2017 Broadcom - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2, as - * published by the Free Software Foundation (the "GPL"). - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License version 2 (GPLv2) for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 (GPLv2) along with this source code. - */ - -/* - * This module implements a Linux PTP Clock driver for Broadcom - * XGS switch devices. - * - * For a list of supported module parameters, please see below. - * debug: Debug level (default 0) - * network_transport : Transport Type (default 0 - Raw) - * base_dev_name: Base device name (default ptp0, ptp1, etc.) - * - * - All the data structures and functions work on the physical port. - * For array indexing purposes, we use (phy_port - 1). - */ - -#include /* Must be included first */ -/* Module Information */ -#define MODULE_MAJOR 125 -#define MODULE_NAME "linux-bcm-ptp-clock" - -MODULE_AUTHOR("Broadcom Corporation"); -MODULE_DESCRIPTION("PTP Clock Driver for Broadcom XGS Switch"); -MODULE_LICENSE("GPL"); - -#if LINUX_VERSION_CODE > KERNEL_VERSION(3,17,0) -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* Configuration Parameters */ -static int debug; -LKM_MOD_PARAM(debug, "i", int, 0); -MODULE_PARM_DESC(debug, - "Debug level (default 0)"); - -static int pci_cos; - -static int network_transport; -LKM_MOD_PARAM(network_transport, "i", int, 0); -MODULE_PARM_DESC(network_transport, - "Transport Type (default - Detect from packet)"); - -static char *base_dev_name = "ptp0"; -LKM_MOD_PARAM(base_dev_name, "s", charp, 0); -MODULE_PARM_DESC(base_dev_name, - "Base device name (default ptp0, ptp1, etc.)"); - -static int fw_core; -LKM_MOD_PARAM(fw_core, "i", int, 0); -MODULE_PARM_DESC(fw_core, - "Firmware core (default 0)"); - -/* Debug levels */ -#define DBG_LVL_VERB 0x1 -#define DBG_LVL_WARN 0x2 -#define DBG_LVL_TXTS 0x4 -#define DBG_LVL_CMDS 0x8 - -#define DBG_VERB(_s) do { if (debug & DBG_LVL_VERB) gprintk _s; } while (0) -#define DBG_WARN(_s) do { if (debug & DBG_LVL_WARN) gprintk _s; } while (0) -#define DBG_TXTS(_s) do { if (debug & DBG_LVL_TXTS) gprintk _s; } while (0) -#define DBG_CMDS(_s) do { if (debug & DBG_LVL_CMDS) gprintk _s; } while (0) -#define DBG_ERR(_s) do { if (1) gprintk _s; } while (0) - - -#ifdef LINUX_BDE_DMA_DEVICE_SUPPORT -#define DMA_DEV device -#define DMA_ALLOC_COHERENT(d,s,h) dma_alloc_coherent(d,s,h,GFP_ATOMIC|GFP_DMA32) -#define DMA_FREE_COHERENT(d,s,a,h) dma_free_coherent(d,s,a,h) -#else -#define DMA_DEV pci_dev -#define DMA_ALLOC_COHERENT(d,s,h) pci_alloc_consistent(d,s,h) -#define DMA_FREE_COHERENT(d,s,a,h) pci_free_consistent(d,s,a,h) -#endif - -/* Type length in bytes */ -#define BKSYNC_PACKLEN_U8 1 -#define BKSYNC_PACKLEN_U16 2 -#define BKSYNC_PACKLEN_U24 3 -#define BKSYNC_PACKLEN_U32 4 - -#define BKSYNC_UNPACK_U8(_buf, _var) \ - _var = *_buf++ - -#define BKSYNC_UNPACK_U16(_buf, _var) \ - do { \ - (_var) = (((_buf)[0] << 8) | \ - (_buf)[1]); \ - (_buf) += BKSYNC_PACKLEN_U16; \ - } while (0) - -#define BKSYNC_UNPACK_U24(_buf, _var) \ - do { \ - (_var) = (((_buf)[0] << 16) | \ - ((_buf)[1] << 8) | \ - (_buf)[2]); \ - (_buf) += BKSYNC_PACKLEN_U24; \ - } while (0) - -#define BKSYNC_UNPACK_U32(_buf, _var) \ - do { \ - (_var) = (((_buf)[0] << 24) | \ - ((_buf)[1] << 16) | \ - ((_buf)[2] << 8) | \ - (_buf)[3]); \ - (_buf) += BKSYNC_PACKLEN_U32; \ - } while (0) - - -#define CMICX_DEV_TYPE ((ptp_priv->dcb_type == 38) || \ - (ptp_priv->dcb_type == 36)) - -/* CMIC MCS-0 SCHAN Messaging registers */ -/* Core0:CMC1 Core1:CMC2 */ -#define CMIC_CMC_BASE \ - (CMICX_DEV_TYPE ? (fw_core ? 0x10400 : 0x10300) : \ - (fw_core ? 0x33000 : 0x32000)) - -#define CMIC_CMC_SCHAN_MESSAGE_10r(BASE) (BASE + 0x00000034) -#define CMIC_CMC_SCHAN_MESSAGE_11r(BASE) (BASE + 0x00000038) -#define CMIC_CMC_SCHAN_MESSAGE_12r(BASE) (BASE + 0x0000003c) -#define CMIC_CMC_SCHAN_MESSAGE_13r(BASE) (BASE + 0x00000040) -#define CMIC_CMC_SCHAN_MESSAGE_14r(BASE) (BASE + 0x00000044) -#define CMIC_CMC_SCHAN_MESSAGE_15r(BASE) (BASE + 0x00000048) -#define CMIC_CMC_SCHAN_MESSAGE_16r(BASE) (BASE + 0x0000004c) -#define CMIC_CMC_SCHAN_MESSAGE_17r(BASE) (BASE + 0x00000050) -#define CMIC_CMC_SCHAN_MESSAGE_18r(BASE) (BASE + 0x00000054) -#define CMIC_CMC_SCHAN_MESSAGE_19r(BASE) (BASE + 0x00000058) -#define CMIC_CMC_SCHAN_MESSAGE_20r(BASE) (BASE + 0x0000005c) -#define CMIC_CMC_SCHAN_MESSAGE_21r(BASE) (BASE + 0x00000060) - -u32 hostcmd_regs[5] = { 0 }; - -#define BCMKSYNC_NUM_PORTS 128 /* NUM_PORTS where 2-step is supported. */ -#define BCMKSYNC_MAX_NUM_PORTS 256 /* Max ever NUM_PORTS in the system */ -#define BCMKSYNC_MAX_MTP_IDX 8 /* Max number of mtps in the system */ - -/* Service request commands to Firmware. */ -enum { - BKSYNC_DONE = (0x0), - BKSYNC_INIT = (0x1), - BKSYNC_DEINIT = (0x2), - BKSYNC_GETTIME = (0x3), - BKSYNC_SETTIME = (0x4), - BKSYNC_FREQCOR = (0x5), - BKSYNC_PBM_UPDATE = (0x6), - BKSYNC_ADJTIME = (0x7), - BKSYNC_GET_TSTIME = (0x8), - BKSYNC_MTP_TS_UPDATE_ENABLE = (0x9), - BKSYNC_MTP_TS_UPDATE_DISABLE = (0xa), - BKSYNC_ACK_TSTIME = (0xb), -}; - - -/* 1588 message types. */ -enum -{ - IEEE1588_MSGTYPE_SYNC = (0x0), - IEEE1588_MSGTYPE_DELREQ = (0x1), - IEEE1588_MSGTYPE_PDELREQ = (0x2), - IEEE1588_MSGTYPE_PDELRESP = (0x3), - /* reserved (0x4) */ - /* reserved (0x5) */ - /* reserved (0x6) */ - /* reserved (0x7) */ - IEEE1588_MSGTYPE_GENERALMASK = (0x8), /* all non-event messages have this bit set */ - IEEE1588_MSGTYPE_FLWUP = (0x8), - IEEE1588_MSGTYPE_DELRESP = (0x9), - IEEE1588_MSGTYPE_PDELRES_FLWUP = (0xA), - IEEE1588_MSGTYPE_ANNOUNCE = (0xB), - IEEE1588_MSGTYPE_SGNLNG = (0xC), - IEEE1588_MSGTYPE_MNGMNT = (0xD) - /* reserved (0xE) */ - /* reserved (0xF) */ -}; - -/* Usage macros */ -#define ONE_BILLION (1000000000) - -#define SKB_U16_GET(_skb, _pkt_offset) \ - ((_skb->data[_pkt_offset] << 8) | _skb->data[_pkt_offset + 1]) - -#define BKSYNC_PTP_EVENT_MSG(_ptp_msg_type) \ - ((_ptp_msg_type == IEEE1588_MSGTYPE_DELREQ) || \ - (_ptp_msg_type == IEEE1588_MSGTYPE_SYNC)) - - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) -#define HWTSTAMP_TX_ONESTEP_SYNC 2 -#else -#include -#endif - - -/* - * Hardware specific information. - * 4 words of information used from this data set. - * 0 - 3: 2-step untagged. - * 4 - 7: 2-step tagged. - * 8 - 11: 1-step untagged. - * 12 - 15: 1-step tagged. - * 16 - 19: 1-step untagged with ITS-set. - * 20 - 23: 1-step tagged with ITS-set. - */ -uint32_t sobmhrawpkts_dcb26[24] = {0x00000000, 0x00020E00, 0x00000000, 0x00000000, 0x00000000, 0x00021200, 0x00000000, 0x00000000, - 0x00000000, 0x00100E00, 0x00000000, 0x00000000, 0x00000000, 0x00101200, 0x00000000, 0x00000000, - 0x00000000, 0x00140E00, 0x00000000, 0x00000000, 0x00000000, 0x00141200, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv4_dcb26[24] = {0x00000000, 0x00022A00, 0x00000000, 0x00000000, 0x00000000, 0x00022E00, 0x00000000, 0x00000000, - 0x00000000, 0x00102A00, 0x00000000, 0x00000000, 0x00000000, 0x00102E00, 0x00000000, 0x00000000, - 0x00000000, 0x00142A00, 0x00000000, 0x00000000, 0x00000000, 0x00142E00, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv6_dcb26[24] = {0x00000000, 0x00023E00, 0x00000000, 0x00000000, 0x00000000, 0x00024200, 0x00000000, 0x00000000, - 0x00000000, 0x00103E00, 0x00000000, 0x00000000, 0x00000000, 0x00104200, 0x00000000, 0x00000000, - 0x00000000, 0x00143E00, 0x00000000, 0x00000000, 0x00000000, 0x00144200, 0x00000000, 0x00000000}; - -uint32_t sobmhrawpkts_dcb32[24] = {0x00000000, 0x00010E00, 0x00000000, 0x00000000, 0x00000000, 0x00011200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv4_dcb32[24] = {0x00000000, 0x00012A00, 0x00000000, 0x00000000, 0x00000000, 0x00012E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv6_dcb32[24] = {0x00000000, 0x00013E00, 0x00000000, 0x00000000, 0x00000000, 0x00014200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000}; - -uint32_t sobmhrawpkts_dcb35[24] = {0x00000000, 0x0020E000, 0x00000000, 0x00000000, 0x00000000, 0x00212000, 0x00000000, 0x00000000, - 0x00000000, 0x0100E000, 0x00000000, 0x00000000, 0x00000000, 0x01012000, 0x00000000, 0x00000000, - 0x00000000, 0x0140E000, 0x00000000, 0x00000000, 0x00000000, 0x01412000, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv4_dcb35[24] = {0x00000000, 0x0022A000, 0x00000000, 0x00000000, 0x00000000, 0x0022E000, 0x00000000, 0x00000000, - 0x00000000, 0x0102A000, 0x00000000, 0x00000000, 0x00000000, 0x0102E000, 0x00000000, 0x00000000, - 0x00000000, 0x0142A000, 0x00000000, 0x00000000, 0x00000000, 0x0142E000, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv6_dcb35[24] = {0x00000000, 0x0023E000, 0x00000000, 0x00000000, 0x00000000, 0x00242000, 0x00000000, 0x00000000, - 0x00000000, 0x0103E000, 0x00000000, 0x00000000, 0x00000000, 0x01042000, 0x00000000, 0x00000000, - 0x00000000, 0x0143E000, 0x00000000, 0x00000000, 0x00000000, 0x01442000, 0x00000000, 0x00000000}; - - -uint32_t sobmhrawpkts_dcb36[24] = {0x00000000, 0x00010E00, 0x00000000, 0x00000000, 0x00000000, 0x00011200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv4_dcb36[24] = {0x00000000, 0x00012A00, 0x00000000, 0x00000000, 0x00000000, 0x00012E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv6_dcb36[24] = {0x00000000, 0x00013E00, 0x00000000, 0x00000000, 0x00000000, 0x00014200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000}; -/* th3: onestep only */ -uint32_t sobmhrawpkts_dcb38[24] = {0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000, - 0x00000000, 0x00080E00, 0x00000000, 0x00000000, 0x00000000, 0x00081200, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv4_dcb38[24] = {0x00000000, 0x00082A00, 0x00000000, 0x00000000, 0x00000000, 0x00082E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000, - 0x00000000, 0x000C2A00, 0x00000000, 0x00000000, 0x00000000, 0x000C2E00, 0x00000000, 0x00000000}; - -uint32_t sobmhudpipv6_dcb38[24] = {0x00000000, 0x00083E00, 0x00000000, 0x00000000, 0x00000000, 0x00084200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000, - 0x00000000, 0x000C3E00, 0x00000000, 0x00000000, 0x00000000, 0x000C4200, 0x00000000, 0x00000000}; - -/* Driver Proc Entry root */ -static struct proc_dir_entry *bksync_proc_root = NULL; - -/* Shared data structures with R5 */ -typedef struct _bksync_tx_ts_data_s -{ - u32 ts_valid; /* Timestamp valid indication */ - u32 port_id; /* Port number */ - u32 ts_seq_id; /* Sequency Id */ - u32 ts_cnt; - u64 timestamp; /* Timestamp */ -} bksync_tx_ts_data_t; - -typedef struct _bksync_uc_linux_ipc_s -{ - u32 ksyncinit; - u32 dev_id; - s64 freqcorr; - u64 portmap[BCMKSYNC_NUM_PORTS/64]; /* Two-step enabled ports */ - u64 ptptime; - u64 reftime; - s64 phase_offset; - bksync_tx_ts_data_t port_ts_data[BCMKSYNC_NUM_PORTS]; -} bksync_uc_linux_ipc_t; - -typedef struct bksync_port_stats_s { - u32 pkt_rxctr; /* All ingress packets */ - u32 pkt_txctr; /* All egress packets */ - u32 pkt_txonestep; /* 1-step Tx packet counter */ - u32 tsts_match; /* 2-Step tstamp req match */ - u32 tsts_timeout; /* 2-Step tstamp req timeouts */ - u32 tsts_discard; /* 2-Step tstamp req discards */ - u32 osts_event_pkts; /* 1-step event packet counter */ - u32 osts_tstamp_reqs; /* 1-step events with tstamp request */ - u32 fifo_rxctr; /* 2-Step tstamp req match */ - u64 tsts_best_fetch_time; /* 1-step events with tstamp request */ - u64 tsts_worst_fetch_time; /* 1-step events with tstamp request */ - u32 tsts_avg_fetch_time; /* 1-step events with tstamp request */ -} bksync_port_stats_t; - -/* Clock Private Data */ -struct bksync_ptp_priv { - struct device dev; - int dcb_type; - struct ptp_clock *ptp_clock; - struct ptp_clock_info ptp_caps; - struct mutex ptp_lock; - struct mutex ptp_pair_lock; - volatile void *base_addr; /* address for PCI register access */ - volatile bksync_uc_linux_ipc_t *shared_addr; /* address for shared memory access */ - uint64_t dma_mem; - int dma_mem_size; - struct DMA_DEV *dma_dev; /* Required for DMA memory control */ - int num_pports; - int timekeep_status; - u32 mirror_encap_bmp; - struct delayed_work time_keep; - bksync_port_stats_t *port_stats; -}; - -static struct bksync_ptp_priv *ptp_priv; -volatile bksync_uc_linux_ipc_t *linuxPTPMemory = (bksync_uc_linux_ipc_t*)(0); -static volatile int module_initialized; -static int num_retries = 10; /* Retry count */ - -static void bksync_ptp_time_keep_init(void); -static void bksync_ptp_time_keep_deinit(void); - -#if defined(CMIC_SOFT_BYTE_SWAP) - -#define CMIC_SWAP32(_x) ((((_x) & 0xff000000) >> 24) \ - | (((_x) & 0x00ff0000) >> 8) \ - | (((_x) & 0x0000ff00) << 8) \ - | (((_x) & 0x000000ff) << 24)) - -#define DEV_READ32(_d, _a, _p) \ - do { \ - uint32_t _data; \ - _data = (((volatile uint32_t *)(_d)->base_addr)[(_a)/4]); \ - *(_p) = CMIC_SWAP32(_data); \ - } while(0) - -#define DEV_WRITE32(_d, _a, _v) \ - do { \ - uint32_t _data = CMIC_SWAP32(_v); \ - ((volatile uint32_t *)(_d)->base_addr)[(_a)/4] = (_data); \ - } while(0) - -#else - -#define DEV_READ32(_d, _a, _p) \ - do { \ - *(_p) = (((volatile uint32_t *)(_d)->base_addr)[(_a)/4]); \ - } while(0) - -#define DEV_WRITE32(_d, _a, _v) \ - do { \ - ((volatile uint32_t *)(_d)->base_addr)[(_a)/4] = (_v); \ - } while(0) -#endif /* defined(CMIC_SOFT_BYTE_SWAP) */ - -static void -ptp_usleep(int usec) -{ - usleep_range(usec,usec+1); -} - -static void -ptp_sleep(int jiffies) -{ - wait_queue_head_t wq; - init_waitqueue_head(&wq); - - wait_event_timeout(wq, 0, jiffies); - -} - - -static void bksync_hostcmd_data_op(int setget, u64 *d1, u64 *d2) -{ - u32 w0, w1; - u64 data; - - if (!d1) { - return; - } - - if (setget) { - data = *d1; - w0 = (data & 0xFFFFFFFF); - w1 = (data >> 32); - DEV_WRITE32(ptp_priv, hostcmd_regs[1], w0); - DEV_WRITE32(ptp_priv, hostcmd_regs[2], w1); - } else { - DEV_READ32(ptp_priv, hostcmd_regs[1], &w0); - DEV_READ32(ptp_priv, hostcmd_regs[2], &w1); - data = (((u64)w1 << 32) | (w0)); - *d1 = data; - - if (d2) { - DEV_READ32(ptp_priv, hostcmd_regs[3], &w0); - DEV_READ32(ptp_priv, hostcmd_regs[4], &w1); - data = (((u64)w1 << 32) | (w0)); - *d2 = data; - } - } -} - - -static int bksync_cmd_go(u32 cmd, void *data0, void *data1) -{ - int ret = -1; - int retry_cnt = (1000); /* 1ms default timeout for hostcmd response */ - u32 cmd_status; - char cmd_str[20]; - int port; - uint32_t seq_id; - ktime_t start, now; - - if (ptp_priv == NULL || ptp_priv->shared_addr == NULL) { - return ret; - } - - mutex_lock(&ptp_priv->ptp_lock); - - if (cmd == BKSYNC_GET_TSTIME || cmd == BKSYNC_ACK_TSTIME) { - port = *((uint64_t *)data0) & 0xFFF; - seq_id = *((uint64_t*)data0) >> 16; - } - start = ktime_get(); - - ptp_priv->shared_addr->ksyncinit = cmd; - - /* init data */ - DEV_WRITE32(ptp_priv, hostcmd_regs[1], 0x0); - DEV_WRITE32(ptp_priv, hostcmd_regs[2], 0x0); - DEV_WRITE32(ptp_priv, hostcmd_regs[3], 0x0); - DEV_WRITE32(ptp_priv, hostcmd_regs[4], 0x0); - - switch (cmd) { - case BKSYNC_INIT: - sprintf(cmd_str, "KSYNC_INIT"); - ptp_priv->shared_addr->phase_offset = 0; - bksync_hostcmd_data_op(1, (u64 *)&(ptp_priv->shared_addr->phase_offset), 0); - break; - case BKSYNC_FREQCOR: - sprintf(cmd_str, "KSYNC_FREQCORR"); - ptp_priv->shared_addr->freqcorr = *((s32 *)data0); - bksync_hostcmd_data_op(1, (u64 *)&(ptp_priv->shared_addr->freqcorr), 0); - break; - case BKSYNC_ADJTIME: - sprintf(cmd_str, "KSYNC_ADJTIME"); - ptp_priv->shared_addr->phase_offset = *((s64 *)data0); - bksync_hostcmd_data_op(1, (u64 *)&(ptp_priv->shared_addr->phase_offset), 0); - break; - case BKSYNC_GETTIME: - retry_cnt = (retry_cnt * 2); - sprintf(cmd_str, "KSYNC_GETTIME"); - break; - case BKSYNC_GET_TSTIME: - retry_cnt = (retry_cnt * 2); - sprintf(cmd_str, "KSYNC_GET_TSTIME"); - bksync_hostcmd_data_op(1, data0, data1); - break; - case BKSYNC_ACK_TSTIME: - retry_cnt = (retry_cnt * 2); - sprintf(cmd_str, "KSYNC_ACK_TSTIME"); - bksync_hostcmd_data_op(1, data0, data1); - break; - case BKSYNC_SETTIME: - sprintf(cmd_str, "KSYNC_SETTIME"); - ptp_priv->shared_addr->ptptime = *((s64 *)data0); - ptp_priv->shared_addr->phase_offset = 0; - bksync_hostcmd_data_op(1, (u64 *)&(ptp_priv->shared_addr->ptptime), (u64 *)&(ptp_priv->shared_addr->phase_offset)); - break; - case BKSYNC_MTP_TS_UPDATE_ENABLE: - retry_cnt = (retry_cnt * 6); - sprintf(cmd_str, "KSYNC_MTP_TS_UPDATE_ENABLE"); - bksync_hostcmd_data_op(1, (u64 *)data0, 0); - break; - case BKSYNC_MTP_TS_UPDATE_DISABLE: - retry_cnt = (retry_cnt * 6); - sprintf(cmd_str, "KSYNC_MTP_TS_UPDATE_DISABLE"); - bksync_hostcmd_data_op(1, (u64 *)data0, 0); - break; - case BKSYNC_DEINIT: - retry_cnt = (retry_cnt * 4); - sprintf(cmd_str, "KSYNC_DEINIT"); - break; - default: - sprintf(cmd_str, "KSYNC_XXX"); - break; - } - DEV_WRITE32(ptp_priv, hostcmd_regs[0], ptp_priv->shared_addr->ksyncinit); - - do { - DEV_READ32(ptp_priv, hostcmd_regs[0], &cmd_status); - ptp_priv->shared_addr->ksyncinit = cmd_status; - - if (cmd_status == BKSYNC_DONE) { - ret = 0; - switch (cmd) { - case BKSYNC_GET_TSTIME: - case BKSYNC_GETTIME: - bksync_hostcmd_data_op(0, (u64 *)data0, (u64 *)data1); - break; - default: - break; - } - break; - } - ptp_usleep(100); - retry_cnt--; - } while (retry_cnt); - - now = ktime_get(); - mutex_unlock(&ptp_priv->ptp_lock); - - if (retry_cnt == 0) { - DBG_ERR(("Timeout on response from R5 to cmd %s time taken %lld us\n", cmd_str, ktime_us_delta(now, start))); - if (cmd == BKSYNC_GET_TSTIME) { - DBG_TXTS(("Timeout Port %d SeqId %d\n", port, seq_id)); - } - } - if (debug & DBG_LVL_CMDS) { - if (ktime_us_delta(now, start) > 5000) - DBG_CMDS(("R5 Command %s exceeded time expected (%lld us)\n", cmd_str, ktime_us_delta(now, start))); - } - - - return ret; -} - - -/** - * bksync_ptp_adjfreq - * - * @ptp: pointer to ptp_clock_info structure - * @ppb: frequency correction value - * - * Description: this function will set the frequency correction - */ -static int bksync_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) -{ - int ret = -1; - u32 cmd_status = BKSYNC_FREQCOR; - - ret = bksync_cmd_go(cmd_status, &ppb, NULL); - DBG_VERB(("applying freq correction: %x\n", ppb)); - - return ret; -} - -/** - * bksync_ptp_adjtime - * - * @ptp: pointer to ptp_clock_info structure - * @delta: desired change in nanoseconds - * - * Description: this function will shift/adjust the hardware clock time. - */ -static int bksync_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) -{ - u32 cmd_status = BKSYNC_ADJTIME; - int ret = -1; - - ret = bksync_cmd_go(cmd_status, (void *)&delta, NULL); - DBG_VERB(("ptp adjtime: 0x%llx \n", delta)); - - return ret; -} - -/** - * bksync_ptp_gettime - * - * @ptp: pointer to ptp_clock_info structure - * @ts: pointer to hold time/result - * - * Description: this function will read the current time from the - * hardware clock and store it in @ts. - */ -static int bksync_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) -{ - int ret = -1; - u32 cmd_status = BKSYNC_GETTIME; - s64 reftime = 0; - s64 refctr = 0; - - ret = bksync_cmd_go(cmd_status, (void *)&reftime, (void *)&refctr); - if (ret == 0) { - DBG_VERB(("ptp gettime: 0x%llx refctr:0x%llx\n", reftime, refctr)); - mutex_lock(&ptp_priv->ptp_pair_lock); - ptp_priv->shared_addr->ptptime = reftime; - ptp_priv->shared_addr->reftime = refctr; - mutex_unlock(&ptp_priv->ptp_pair_lock); - - *ts = ns_to_timespec64(reftime); - } - return ret; -} - - -/** - * bksync_ptp_settime - * - * @ptp: pointer to ptp_clock_info structure - * @ts: time value to set - * - * Description: this function will set the current time on the - * hardware clock. - */ -static int bksync_ptp_settime(struct ptp_clock_info *ptp, - const struct timespec64 *ts) -{ - s64 reftime, phaseadj; - int ret = -1; - u32 cmd_status = BKSYNC_SETTIME; - - phaseadj = 0; - reftime = timespec64_to_ns(ts); - - ret = bksync_cmd_go(cmd_status, (void *)&reftime, (void *)&phaseadj); - DBG_VERB(("ptp settime: 0x%llx \n", reftime)); - - return ret; -} - -static int bksync_ptp_enable(struct ptp_clock_info *ptp, - struct ptp_clock_request *rq, int on) -{ - return 0; -} - - -static int bksync_ptp_mirror_encap_update(struct ptp_clock_info *ptp, - int mtp_idx, int start) -{ - int ret = -1; - u64 mirror_encap_idx; - u32 cmd_status; - - if (mtp_idx > BCMKSYNC_MAX_MTP_IDX) { - return ret; - } - - mirror_encap_idx = mtp_idx; - if (start) { - cmd_status = BKSYNC_MTP_TS_UPDATE_ENABLE; - ptp_priv->mirror_encap_bmp |= (1 << mtp_idx); - } else { - if (!(ptp_priv->mirror_encap_bmp & mtp_idx)) { - /* Not running */ - return ret; - } - cmd_status = BKSYNC_MTP_TS_UPDATE_DISABLE; - ptp_priv->mirror_encap_bmp &= ~mtp_idx; - } - - ret = bksync_cmd_go(cmd_status, &mirror_encap_idx, NULL); - DBG_VERB(("ptp mmirror_encap_update: %d, mpt_index: %d, ret:%d \n", start, mtp_idx, ret)); - - return ret; - -} - -/* structure describing a PTP hardware clock */ -static struct ptp_clock_info bksync_ptp_caps = { - .owner = THIS_MODULE, - .name = "bksync_ptp_clock", - .max_adj = 200000, - .n_alarm = 0, - .n_ext_ts = 0, - .n_per_out = 0, /* will be overwritten in bksync_ptp_register */ - .n_pins = 0, - .pps = 0, - .adjfreq = bksync_ptp_adjfreq, - .adjtime = bksync_ptp_adjtime, - .gettime64 = bksync_ptp_gettime, - .settime64 = bksync_ptp_settime, - .enable = bksync_ptp_enable, -}; - -/** - * bksync_ptp_hw_tstamp_enable - * - * @dev_no: device number - * @port: port number - * - * Description: this is a callback function to enable the timestamping on - * a given port - */ -int bksync_ptp_hw_tstamp_enable(int dev_no, int port, int tx_type) -{ - uint64_t portmap = 0; - int map = 0; - int ret = 0; - - if (!module_initialized) { - ret = -1; - goto exit; - } - - if (tx_type == HWTSTAMP_TX_ONESTEP_SYNC) { - bksync_ptp_time_keep_init(); - goto exit; - } - - DBG_VERB(("Enable timestamp on a given port:%d\n", port)); - if (port <= 0) { - DBG_ERR(("Error enabling timestamp on port:%d\n", port)); - ret = -1; - goto exit; - } - - port -= 1; - map = port/64; port = port%64; - - /* Update the shared structure member */ - if (ptp_priv->shared_addr) { - portmap = ptp_priv->shared_addr->portmap[map]; - portmap |= (uint64_t)0x1 << port; - ptp_priv->shared_addr->portmap[map] = portmap; - /* Command to R5 for the update */ - ptp_priv->shared_addr->ksyncinit=BKSYNC_PBM_UPDATE; - } - -exit: - return ret; -} - -/** - * bksync_ptp_hw_tstamp_disable - * - * @dev_no: device number - * @port: port number - * - * Description: this is a callback function to disable the timestamping on - * a given port - */ -int bksync_ptp_hw_tstamp_disable(int dev_no, int port, int tx_type) -{ - uint64_t portmap = 0; - int map = 0; - int ret = 0; - - if (!module_initialized) { - ret = -1; - goto exit; - } - - if (tx_type == HWTSTAMP_TX_ONESTEP_SYNC) { - goto exit; - } - - DBG_VERB(("Disable timestamp on a given port:%d\n", port)); - if (port <= 0) { - DBG_ERR(("Error disabling timestamp on port:%d\n", port)); - ret = -1; - goto exit; - } - - port -= 1; - map = port/64; port = port%64; - - /* Update the shared structure member */ - if (ptp_priv->shared_addr) { - portmap = ptp_priv->shared_addr->portmap[map]; - portmap &= ~((uint64_t)0x1 << port); - ptp_priv->shared_addr->portmap[map]= portmap; - - /* Command to R5 for the update */ - ptp_priv->shared_addr->ksyncinit = BKSYNC_PBM_UPDATE; - } -exit: - return ret; -} - -int bksync_ptp_transport_get(uint8_t *pkt) -{ - int transport = 0; - uint16_t ethertype; - uint16_t tpid; - int tpid_offset, ethype_offset; - - /* Need to check VLAN tag if packet is tagged */ - tpid_offset = 12; - tpid = pkt[tpid_offset] << 8 | pkt[tpid_offset + 1]; - if (tpid == 0x8100) { - ethype_offset = tpid_offset + 4; - } else { - ethype_offset = tpid_offset; - } - - ethertype = pkt[ethype_offset] << 8 | pkt[ethype_offset+1]; - - switch (ethertype) { - case 0x88f7: /* ETHERTYPE_PTPV2 */ - transport = 2; - break; - - case 0x0800: /* ETHERTYPE_IPV4 */ - transport = 4; - break; - - case 0x86DD: /* ETHERTYPE_IPV6 */ - transport = 6; - break; - - default: - transport = 0; - } - - return transport; -} - -static int -bksync_txpkt_tsts_tsamp_get(int port, uint32_t pkt_seq_id, uint32_t *ts_valid, uint32_t *seq_id, uint64_t *timestamp) -{ - int ret = 0; - uint64_t tmp; - u32 fifo_rxctr = 0; - - tmp = (port & 0xFFFF) | (pkt_seq_id << 16); - - ret = bksync_cmd_go(BKSYNC_GET_TSTIME, &tmp, timestamp); - - if (ret >= 0) { - fifo_rxctr = (tmp >> 32) & 0xFFFF; - *seq_id = ((tmp >> 16) & 0xFFFF); - *ts_valid = (tmp & 0x1); - if (*ts_valid) { - tmp = (port & 0xFFFF) | (pkt_seq_id << 16); - bksync_cmd_go(BKSYNC_ACK_TSTIME, &tmp, 0); - if (fifo_rxctr != 0) { - if (fifo_rxctr != ptp_priv->port_stats[port].fifo_rxctr + 1) { - DBG_ERR(("FW Reset or Lost Timestamp RxSeq:(Prev %d : Current %d)\n", ptp_priv->port_stats[port].fifo_rxctr, fifo_rxctr)); - } - ptp_priv->port_stats[port].fifo_rxctr = fifo_rxctr; - } - } - } - - - return ret; -} - - -/** - * bksync_ptp_hw_tstamp_tx_time_get - * - * @dev_no: device number - * @port: port number - * @pkt: packet address - * @ts: timestamp to be retrieved - * - * Description: this is a callback function to retrieve the timestamp on - * a given port - */ -int bksync_ptp_hw_tstamp_tx_time_get(int dev_no, int port, uint8_t *pkt, uint64_t *ts) -{ - /* Get Timestamp from R5 or CLMAC */ - uint32_t ts_valid = 0; - uint32_t seq_id = 0; - uint32_t pktseq_id = 0; - uint64_t timestamp = 0; - uint16_t tpid = 0; - ktime_t start; - u64 delta; - int retry_cnt = num_retries; - int seq_id_offset, tpid_offset; - int transport = network_transport; - start = ktime_get(); - - if (!ptp_priv || !pkt || !ts || port < 1 || port > 255 || ptp_priv->shared_addr == NULL) { - return -1; - } - - *ts = 0; - - tpid_offset = 12; - - /* Parse for nw transport */ - if (transport == 0) { - transport = bksync_ptp_transport_get(pkt); - } - - switch(transport) - { - case 2: - seq_id_offset = 0x2c; - break; - case 4: - seq_id_offset = 0x48; - break; - case 6: - seq_id_offset = 0x5c; - break; - default: - seq_id_offset = 0x2c; - break; - } - - /* Need to check VLAN tag if packet is tagged */ - tpid = pkt[tpid_offset] << 8 | pkt[tpid_offset + 1]; - if (tpid == 0x8100) { - seq_id_offset += 4; - } - - - pktseq_id = pkt[seq_id_offset] << 8 | pkt[seq_id_offset + 1]; - - port -= 1; - - /* Fetch the TX timestamp from shadow memory */ - do { - bksync_txpkt_tsts_tsamp_get(port, pktseq_id, &ts_valid, &seq_id, ×tamp); - if (ts_valid) { - - /* Clear the shadow memory to get next entry */ - ptp_priv->shared_addr->port_ts_data[port].timestamp = 0; - ptp_priv->shared_addr->port_ts_data[port].port_id = 0; - ptp_priv->shared_addr->port_ts_data[port].ts_seq_id = 0; - ptp_priv->shared_addr->port_ts_data[port].ts_valid = 0; - - if (seq_id == pktseq_id) { - *ts = timestamp; - ptp_priv->port_stats[port].tsts_match += 1; - - delta = ktime_us_delta(ktime_get(), start); - DBG_VERB(("Port: %d Skb_SeqID %d FW_SeqId %d and TS:%llx FetchTime %lld\n", - port, pktseq_id, seq_id, timestamp, delta)); - - if (delta < ptp_priv->port_stats[port].tsts_best_fetch_time || ptp_priv->port_stats[port].tsts_best_fetch_time == 0) { - ptp_priv->port_stats[port].tsts_best_fetch_time = delta; - } - if (delta > ptp_priv->port_stats[port].tsts_worst_fetch_time || ptp_priv->port_stats[port].tsts_worst_fetch_time == 0) { - ptp_priv->port_stats[port].tsts_worst_fetch_time = delta; - } - /* Calculate Moving Average*/ - ptp_priv->port_stats[port].tsts_avg_fetch_time = ((u32)delta + ((ptp_priv->port_stats[port].tsts_match - 1) * ptp_priv->port_stats[port].tsts_avg_fetch_time)) / ptp_priv->port_stats[port].tsts_match; - break; - } else { - DBG_TXTS(("Discard timestamp on port %d Skb_SeqID %d FW_SeqId %d RetryCnt %d TimeLapsed (%lld us)\n", - port, pktseq_id, seq_id, (num_retries - retry_cnt), ktime_us_delta(ktime_get(),start))); - - ptp_priv->port_stats[port].tsts_discard += 1; - continue; - } - } - ptp_sleep(1); - retry_cnt--; - } while(retry_cnt); - - - ptp_priv->port_stats[port].pkt_txctr += 1; - - if (retry_cnt == 0) { - ptp_priv->port_stats[port].tsts_timeout += 1; - DBG_ERR(("FW Response timeout: Tx TS on phy port:%d Skb_SeqID: %d TimeLapsed (%lld us)\n", - port, pktseq_id, ktime_us_delta(ktime_get(), start))); - } - - - return 0; -} - - -enum { - bxconCustomEncapVersionInvalid = 0, - bxconCustomEncapVersionOne = 1, - - bxconCustomEncapVersionCurrent = bxconCustomEncapVersionOne, - bxconCustomEncapVersionReserved = 255 /* last */ -} bxconCustomEncapVersion; - -enum { - bxconCustomEncapOpcodeInvalid = 0, - bxconCustomEncapOpcodePtpRx = 1, - bxconCustomEncapOpcodeReserved = 255 /* last */ -} bxconCustomEncapOpcode; - -enum { - bxconCustomEncapPtpRxTlvInvalid = 0, - bxconCustomEncapPtpRxTlvPtpRxTime = 1, - bxconCustomEncapPtpRxTlvReserved = 255 /* last */ -} bxconCustomEncapPtpRxTlvType; - -void -bksync_dump_pkt(uint8_t *data, int size) -{ - int idx; - char str[128]; - - for (idx = 0; idx < size; idx++) { - if ((idx & 0xf) == 0) { - sprintf(str, "%04x: ", idx); - } - sprintf(&str[strlen(str)], "%02x ", data[idx]); - if ((idx & 0xf) == 0xf) { - sprintf(&str[strlen(str)], "\n"); - gprintk(str); - } - } - if ((idx & 0xf) != 0) { - sprintf(&str[strlen(str)], "\n"); - gprintk(str); - } -} - - -static inline int -bksync_pkt_custom_encap_ptprx_get(uint8_t *pkt, uint64_t *ing_ptptime) -{ - uint8_t *custom_hdr; - uint8_t id[4]; - uint8_t ver, opc; - uint8_t nh_type, nh_rsvd; - uint16_t len, tot_len; - uint16_t nh_len; - uint32_t seq_id = 0; - uint32_t ptp_rx_time[2]; - uint64_t u64_ptp_rx_time = 0; - - custom_hdr = pkt; - - BKSYNC_UNPACK_U8(custom_hdr, id[0]); - BKSYNC_UNPACK_U8(custom_hdr, id[1]); - BKSYNC_UNPACK_U8(custom_hdr, id[2]); - BKSYNC_UNPACK_U8(custom_hdr, id[3]); - if (!((id[0] == 'B') && (id[1] == 'C') && (id[2] == 'M') && (id[3] == 'C'))) { - /* invalid signature */ - return -1; - } - - BKSYNC_UNPACK_U8(custom_hdr, ver); - switch (ver) { - case bxconCustomEncapVersionCurrent: - break; - default: - gprintk("invalid ver\n"); - return -1; - } - - BKSYNC_UNPACK_U8(custom_hdr, opc); - switch (opc) { - case bxconCustomEncapOpcodePtpRx: - break; - default: - gprintk("invalid opcode\n"); - return -1; - } - - - BKSYNC_UNPACK_U16(custom_hdr, len); - BKSYNC_UNPACK_U32(custom_hdr, seq_id); - tot_len = len; - - /* remaining length of custom encap */ - len = len - (custom_hdr - pkt); - - - /* process tlv */ - while (len > 0) { - BKSYNC_UNPACK_U8(custom_hdr, nh_type); - BKSYNC_UNPACK_U8(custom_hdr, nh_rsvd); - BKSYNC_UNPACK_U16(custom_hdr, nh_len); - len = len - (nh_len); - if (nh_rsvd != 0x0) { - continue; /* invalid tlv */ - } - - switch (nh_type) { - case bxconCustomEncapPtpRxTlvPtpRxTime: - BKSYNC_UNPACK_U32(custom_hdr, ptp_rx_time[0]); - BKSYNC_UNPACK_U32(custom_hdr, ptp_rx_time[1]); - u64_ptp_rx_time = ((uint64_t)ptp_rx_time[1] << 32) | (uint64_t)ptp_rx_time[0]; - *ing_ptptime = u64_ptp_rx_time; - break; - default: - custom_hdr += nh_len; - break; - } - } - -#if 0 -if (!(seq_id % 100)) { - gprintk("****** seq_id = %d ptp time = 0x%llx\n", seq_id, u64_ptp_rx_time); - bksync_dump_pkt(pkt, tot_len); -} -#endif - - DBG_VERB(("Custom encap header: ver=%d opcode=%d seq_id=0x%x\n", ver, opc, seq_id)); - - return (tot_len); -} - - - -/** - * bksync_ptp_hw_tstamp_rx_time_upscale - * - * @dev_no: device number - * @ts: timestamp to be retrieved - * - * Description: this is a callback function to retrieve 64b equivalent of - * rx timestamp - */ -int bksync_ptp_hw_tstamp_rx_time_upscale(int dev_no, int port, struct sk_buff *skb, uint32_t *meta, uint64_t *ts) -{ - int ret = 0; - int custom_encap_len = 0; - - switch (KNET_SKB_CB(skb)->dcb_type) { - case 26: - case 32: - case 35: - if (pci_cos != (meta[4] & 0x3F)) { - return -1; - } - break; - case 38: - if (pci_cos != ((meta[12] >> 22) & 0x2F)) { - return -1; - } - break; - case 36: - if (pci_cos != ((meta[6] >> 22) & 0x2F)) { - return -1; - } - break; - default: - return -1; - } - - /* parse custom encap header in pkt for ptp rxtime */ - custom_encap_len = bksync_pkt_custom_encap_ptprx_get((skb->data), ts); - - /* Remove the custom encap header from pkt */ - if (custom_encap_len > 0) { - skb_pull(skb, custom_encap_len); - - DBG_VERB(("###### ptp message type: %d\n", skb->data[42])); - } - - if (port > 0){ - port -= 1; - ptp_priv->port_stats[port].pkt_rxctr += 1; - } - - return ret; -} - - -void bksync_hton64(u8 *buf, const uint64_t *data) -{ -#ifdef __LITTLE_ENDIAN - /* LITTLE ENDIAN */ - buf[0] = (*(((uint8_t*)(data)) + 7u)); - buf[1] = (*(((uint8_t*)(data)) + 6u)); - buf[2] = (*(((uint8_t*)(data)) + 5u)); - buf[3] = (*(((uint8_t*)(data)) + 4u)); - buf[4] = (*(((uint8_t*)(data)) + 3u)); - buf[5] = (*(((uint8_t*)(data)) + 2u)); - buf[6] = (*(((uint8_t*)(data)) + 1u)); - buf[7] = (*(((uint8_t*)(data)) + 0u)); -#else - memcpy(buf, data, 8); -#endif -} - - - -int bksync_ptp_hw_tstamp_tx_meta_get(int dev_no, - int hwts, int hdrlen, - struct sk_buff *skb, - uint64_t *tstamp, - u32 **md) -{ - uint16_t tpid = 0; - int md_offset = 0; - int pkt_offset = 0; - int ptp_hdr_offset = 0; - int transport = network_transport; - s64 ptptime = 0; - s64 ptpcounter = 0; - int64_t corrField; - int32_t negCurTS32; - int64_t negCurTS64; - - if(!ptp_priv || ptp_priv->shared_addr == NULL) { - return 0; - } - - mutex_lock(&ptp_priv->ptp_pair_lock); - ptptime = ptp_priv->shared_addr->ptptime; - ptpcounter = ptp_priv->shared_addr->reftime; - mutex_unlock(&ptp_priv->ptp_pair_lock); - - negCurTS32 = - (int32_t) ptpcounter; - negCurTS64 = - (int64_t)(ptpcounter); - - if (CMICX_DEV_TYPE) { - pkt_offset = ptp_hdr_offset = hdrlen; - } - - /* Need to check VLAN tag if packet is tagged */ - tpid = SKB_U16_GET(skb, (pkt_offset + 12)); - if (tpid == 0x8100) { - md_offset = 4; - ptp_hdr_offset += 4; - } - - /* One Step Meta Data */ - if (hwts == HWTSTAMP_TX_ONESTEP_SYNC) { - md_offset += 8; - if (KNET_SKB_CB(skb)->dcb_type == 26) { - corrField = (((int64_t)negCurTS32) << 16); - if (negCurTS32 >= 0) { - md_offset += 8; - } - } else { - corrField = (((int64_t)negCurTS64) << 16); - } - } - - - /* Parse for nw transport */ - if (transport == 0) { - transport = bksync_ptp_transport_get(skb->data + pkt_offset); - } - - switch(transport) - { - case 2: /* IEEE 802.3 */ - ptp_hdr_offset += 14; - if (KNET_SKB_CB(skb)->dcb_type == 32) { - if (md) *md = &sobmhrawpkts_dcb32[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 26) { - if (md) *md = &sobmhrawpkts_dcb26[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 35) { - if (md) *md = &sobmhrawpkts_dcb35[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 36) { - if (md) *md = &sobmhrawpkts_dcb36[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 38) { - if (md) *md = &sobmhrawpkts_dcb38[md_offset]; - } - break; - case 4: /* UDP IPv4 */ - ptp_hdr_offset += 42; - if (KNET_SKB_CB(skb)->dcb_type == 32) { - if (md) *md = &sobmhudpipv4_dcb32[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 26) { - if (md) *md = &sobmhudpipv4_dcb26[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 35) { - if (md) *md = &sobmhudpipv4_dcb35[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 36) { - if (md) *md = &sobmhudpipv4_dcb36[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 38) { - if (md) *md = &sobmhudpipv4_dcb38[md_offset]; - } - break; - case 6: /* UDP IPv6 */ - ptp_hdr_offset += 62; - if (KNET_SKB_CB(skb)->dcb_type == 32) { - if (md) *md = &sobmhudpipv6_dcb32[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 26) { - if (md) *md = &sobmhudpipv6_dcb26[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 35) { - if (md) *md = &sobmhudpipv6_dcb35[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 36) { - if (md) *md = &sobmhudpipv6_dcb36[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 38) { - if (md) *md = &sobmhudpipv6_dcb38[md_offset]; - } - break; - default: - ptp_hdr_offset += 42; - if (KNET_SKB_CB(skb)->dcb_type == 32) { - if (md) *md = &sobmhudpipv4_dcb32[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 26) { - if (md) *md = &sobmhudpipv4_dcb26[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 35) { - if (md) *md = &sobmhudpipv4_dcb35[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 36) { - if (md) *md = &sobmhudpipv4_dcb36[md_offset]; - } else if(KNET_SKB_CB(skb)->dcb_type == 38) { - if (md) *md = &sobmhudpipv4_dcb38[md_offset]; - } - break; - } - - - if ((hwts == HWTSTAMP_TX_ONESTEP_SYNC) && - BKSYNC_PTP_EVENT_MSG(skb->data[ptp_hdr_offset])) { - /* One Step Timestamp Field updation */ - int corr_offset = ptp_hdr_offset + 8; - int origin_ts_offset = ptp_hdr_offset + 34; - u32 tmp; - struct timespec64 ts; - int udp_csum_regen; - u32 udp_csum20; - u16 udp_csum; - int port; - - udp_csum = SKB_U16_GET(skb, (ptp_hdr_offset - 2)); - - switch (transport) { - case 2: - udp_csum_regen = 0; - break; - case 6: - udp_csum_regen = 1; - break; - default: - udp_csum_regen = (udp_csum != 0x0); - break; - } - - /* Fill the correction field */ - bksync_hton64(&(skb->data[corr_offset]), (const u64 *)&corrField); - - /* Fill the Origin Timestamp Field */ - ts = ns_to_timespec64(ptptime); - - tmp = (ts.tv_sec >> 32); - skb->data[origin_ts_offset + 0] = ((tmp >> 8) & 0xFF); - skb->data[origin_ts_offset + 1] = ((tmp ) & 0xFF); - - tmp = (ts.tv_sec & 0xFFFFFFFFLL); - skb->data[origin_ts_offset + 2] = ((tmp >> 24) & 0xFF); - skb->data[origin_ts_offset + 3] = ((tmp >> 16) & 0xFF); - skb->data[origin_ts_offset + 4] = ((tmp >> 8) & 0xFF); - skb->data[origin_ts_offset + 5] = ((tmp ) & 0xFF); - - tmp = (ts.tv_nsec & 0xFFFFFFFFLL); - skb->data[origin_ts_offset + 6] = ((tmp >> 24) & 0xFF); - skb->data[origin_ts_offset + 7] = ((tmp >> 16) & 0xFF); - skb->data[origin_ts_offset + 8] = ((tmp >> 8) & 0xFF); - skb->data[origin_ts_offset + 9] = ((tmp ) & 0xFF); - - if (udp_csum_regen) { - udp_csum20 = (~udp_csum) & 0xFFFF; - - udp_csum20 += SKB_U16_GET(skb, (corr_offset + 0)); - udp_csum20 += SKB_U16_GET(skb, (corr_offset + 2)); - udp_csum20 += SKB_U16_GET(skb, (corr_offset + 4)); - udp_csum20 += SKB_U16_GET(skb, (corr_offset + 6)); - - udp_csum20 += SKB_U16_GET(skb, (origin_ts_offset + 0)); - udp_csum20 += SKB_U16_GET(skb, (origin_ts_offset + 2)); - udp_csum20 += SKB_U16_GET(skb, (origin_ts_offset + 4)); - udp_csum20 += SKB_U16_GET(skb, (origin_ts_offset + 6)); - udp_csum20 += SKB_U16_GET(skb, (origin_ts_offset + 8)); - - /* Fold 20bit checksum into 16bit udp checksum */ - udp_csum20 = ((udp_csum20 & 0xFFFF) + (udp_csum20 >> 16)); - udp_csum = ((udp_csum20 & 0xFFFF) + (udp_csum20 >> 16)); - - /* invert again to get final checksum. */ - udp_csum = ~udp_csum; - if (udp_csum == 0) { - udp_csum = 0xFFFF; - } - - skb->data[ptp_hdr_offset - 2] = ((udp_csum >> 8) & 0xFF); - skb->data[ptp_hdr_offset - 1] = ((udp_csum ) & 0xFF); - } - - if (skb->data[ptp_hdr_offset] == IEEE1588_MSGTYPE_DELREQ) { - *tstamp = ptptime; - - DBG_VERB(("ptp delay req packet tstamp : 0x%llx corrField: 0x%llx\n", ptptime, corrField)); - } - - port = KNET_SKB_CB(skb)->port; - port -= 1; - ptp_priv->port_stats[port].pkt_txonestep += 1; - } - - return 0; -} - - -int bksync_ptp_hw_tstamp_ptp_clock_index_get(int dev_no) -{ - int phc_index = -1; - if (ptp_priv && ptp_priv->ptp_clock) - phc_index = ptp_clock_index(ptp_priv->ptp_clock); - return phc_index; -} - - -/** -* bcm_ptp_time_keep - call timecounter_read every second to avoid timer overrun -* because a 32bit counter, will timeout in 4s -*/ -static void bksync_ptp_time_keep(struct work_struct *work) -{ - struct delayed_work *dwork = to_delayed_work(work); - struct bksync_ptp_priv *priv = - container_of(dwork, struct bksync_ptp_priv, time_keep); - struct timespec64 ts; - - /* Call bcm_ptp_gettime function to keep the ref_time_64 and ref_counter_48 in sync */ - bksync_ptp_gettime(&(priv->ptp_caps), &ts); - schedule_delayed_work(&priv->time_keep, HZ); -} - -static void bksync_ptp_time_keep_init(void) -{ - if (!ptp_priv->timekeep_status) { - INIT_DELAYED_WORK(&(ptp_priv->time_keep), bksync_ptp_time_keep); - schedule_delayed_work(&ptp_priv->time_keep, HZ); - - ptp_priv->timekeep_status = 1; - } - - return; -} - -static void bksync_ptp_time_keep_deinit(void) -{ - if (ptp_priv->timekeep_status) { - /* Cancel delayed work */ - cancel_delayed_work_sync(&(ptp_priv->time_keep)); - - ptp_priv->timekeep_status = 0; - } - - return; -} - - - -static int bksync_ptp_init(struct ptp_clock_info *ptp) -{ - return bksync_cmd_go(BKSYNC_INIT, NULL, NULL); -} - -static int bksync_ptp_deinit(struct ptp_clock_info *ptp) -{ - bksync_ptp_time_keep_deinit(); - - return bksync_cmd_go(BKSYNC_DEINIT, NULL, NULL); -} - -/* - * Device Debug Statistics Proc Entry - */ -/** -* This function is called at the beginning of a sequence. -* ie, when: -* - the /proc/bcm/ksync/stats file is read (first time) -* - after the function stop (end of sequence) -* -*/ -static void *bksync_proc_seq_start(struct seq_file *s, loff_t *pos) -{ - /* beginning a new sequence ? */ - if ( (int)*pos == 0 && ptp_priv->shared_addr != NULL) - { - seq_printf(s, "TwoStep Port Bitmap : %08llx%08llx\n", - (uint64_t)(ptp_priv->shared_addr->portmap[1]), - (uint64_t)(ptp_priv->shared_addr->portmap[0])); - seq_printf(s,"%4s| %9s| %9s| %9s| %9s| %9s| %9s| %9s| %9s| %9s| %9s| %9s\n", - "Port", "RxCounter", "TxCounter", "TxOneStep", "TSTimeout", "TSRead", "TSMatch", "TSDiscard", - "TimeHi" , "TimeLo", "TimeAvg", "FIFORx"); - } - - if ((int)*pos < (ptp_priv->num_pports)) - return (void *)(unsigned long)(*pos + 1); - /* End of the sequence, return NULL */ - return NULL; -} - -/** -* This function is called after the beginning of a sequence. -* It's called untill the return is NULL (this ends the sequence). -* -*/ -static void *bksync_proc_seq_next(struct seq_file *s, void *v, loff_t *pos) -{ - (*pos)++; - return bksync_proc_seq_start(s, pos); -} -/** -* This function is called at the end of a sequence -* -*/ -static void bksync_proc_seq_stop(struct seq_file *s, void *v) -{ - /* nothing to do, we use a static value in bksync_proc_seq_start() */ -} - -/** -* This function is called for each "step" of a sequence -* -*/ -static int bksync_proc_seq_show(struct seq_file *s, void *v) -{ - unsigned long port = (unsigned long)v; - port = port - 1; - if (ptp_priv->port_stats[port].pkt_rxctr || ptp_priv->port_stats[port].pkt_txctr || - ptp_priv->port_stats[port].pkt_txonestep|| - ptp_priv->port_stats[port].tsts_discard || ptp_priv->port_stats[port].tsts_timeout || - ptp_priv->shared_addr->port_ts_data[port].ts_cnt || ptp_priv->port_stats[port].tsts_match) { - seq_printf(s, "%4lu | %9d| %9d| %9d| %9d| %9d| %9d| %9d| %9lld| %9lld | %9d|%9d | %s\n", (port + 1), - ptp_priv->port_stats[port].pkt_rxctr, - ptp_priv->port_stats[port].pkt_txctr, - ptp_priv->port_stats[port].pkt_txonestep, - ptp_priv->port_stats[port].tsts_timeout, - ptp_priv->shared_addr->port_ts_data[port].ts_cnt, - ptp_priv->port_stats[port].tsts_match, - ptp_priv->port_stats[port].tsts_discard, - ptp_priv->port_stats[port].tsts_worst_fetch_time, - ptp_priv->port_stats[port].tsts_best_fetch_time, - ptp_priv->port_stats[port].tsts_avg_fetch_time, - ptp_priv->port_stats[port].fifo_rxctr, - ptp_priv->port_stats[port].pkt_txctr != ptp_priv->port_stats[port].tsts_match ? "***":""); - } - return 0; -} - -/** -* seq_operations for bsync_proc_*** entries -* -*/ -static struct seq_operations bksync_proc_seq_ops = { - .start = bksync_proc_seq_start, - .next = bksync_proc_seq_next, - .stop = bksync_proc_seq_stop, - .show = bksync_proc_seq_show -}; -static int bksync_proc_txts_open(struct inode * inode, struct file * file) -{ - return seq_open(file, &bksync_proc_seq_ops); -} - -static ssize_t -bksync_proc_txts_write(struct file *file, const char *buf, - size_t count, loff_t *loff) -{ - char debug_str[40]; - char *ptr; - int port; - - if (copy_from_user(debug_str, buf, count)) { - return -EFAULT; - } - - if ((ptr = strstr(debug_str, "clear")) != NULL) { - for (port = 0; port < ptp_priv->num_pports; port++) { - ptp_priv->port_stats[port].pkt_rxctr = 0; - ptp_priv->port_stats[port].pkt_txctr = 0; - ptp_priv->port_stats[port].pkt_txonestep = 0; - ptp_priv->port_stats[port].tsts_timeout = 0; - ptp_priv->port_stats[port].tsts_match = 0; - ptp_priv->port_stats[port].tsts_discard = 0; - if (ptp_priv->shared_addr) - ptp_priv->shared_addr->port_ts_data[port].ts_cnt = 0; - } - } else { - gprintk("Warning: unknown input\n"); - } - - return count; -} - -struct proc_ops bksync_proc_txts_file_ops = { - proc_open: bksync_proc_txts_open, - proc_read: seq_read, - proc_lseek: seq_lseek, - proc_write: bksync_proc_txts_write, - proc_release: seq_release, -}; - -/* - * Driver Debug Proc Entry - */ -static int -bksync_proc_debug_show(struct seq_file *m, void *v) -{ - seq_printf(m, "Configuration:\n"); - seq_printf(m, " debug: 0x%x\n", debug); - return 0; -} - -static ssize_t -bksync_proc_debug_write(struct file *file, const char *buf, - size_t count, loff_t *loff) -{ - char debug_str[40]; - char *ptr; - - if (copy_from_user(debug_str, buf, count)) { - return -EFAULT; - } - - if ((ptr = strstr(debug_str, "debug=")) != NULL) { - ptr += 6; - debug = simple_strtol(ptr, NULL, 0); - } else { - gprintk("Warning: unknown configuration\n"); - } - - return count; -} - -static int bksync_proc_debug_open(struct inode * inode, struct file * file) -{ - return single_open(file, bksync_proc_debug_show, NULL); -} - - -struct proc_ops bksync_proc_debug_file_ops = { - proc_open: bksync_proc_debug_open, - proc_read: seq_read, - proc_lseek: seq_lseek, - proc_write: bksync_proc_debug_write, - proc_release: single_release, -}; - - -static int -bksync_proc_init(void) -{ - struct proc_dir_entry *entry; - - PROC_CREATE(entry, "stats", 0666, bksync_proc_root, &bksync_proc_txts_file_ops); - if (entry == NULL) { - return -1; - } - PROC_CREATE(entry, "debug", 0666, bksync_proc_root, &bksync_proc_debug_file_ops); - if (entry == NULL) { - return -1; - } - return 0; -} - -static int -bksync_proc_cleanup(void) -{ - remove_proc_entry("stats", bksync_proc_root); - remove_proc_entry("debug", bksync_proc_root); - return 0; -} - -static void bksync_ptp_dma_init(int dcb_type) -{ - int endianess; - int num_pports = 256; - - - ptp_priv->num_pports = num_pports; - ptp_priv->dcb_type = dcb_type; - ptp_priv->dma_mem_size = 16384;/*sizeof(bksync_uc_linux_ipc_t);*/ - - if (ptp_priv->shared_addr == NULL) { - ptp_priv->shared_addr = kzalloc(16384, GFP_KERNEL); - ptp_priv->port_stats = kzalloc((sizeof(bksync_port_stats_t) * num_pports), GFP_KERNEL); - } - - if (ptp_priv->shared_addr != NULL) { - /* Reset memory. */ - memset((void *)ptp_priv->shared_addr, 0, ptp_priv->dma_mem_size); - -#ifdef __LITTLE_ENDIAN - endianess = 0; -#else - endianess = 1; -#endif - DEV_WRITE32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_14r(CMIC_CMC_BASE), ((pci_cos << 16) | endianess)); - - DEV_WRITE32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_15r(CMIC_CMC_BASE), 1); - DEV_WRITE32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_16r(CMIC_CMC_BASE), 1); - - } - - if (debug & DBG_LVL_VERB) { - printk(KERN_EMERG"%s %p:%p\n",__FUNCTION__, - ptp_priv->base_addr,(void *)ptp_priv->shared_addr); - } - - ptp_priv->mirror_encap_bmp = 0x0; - - hostcmd_regs[0] = CMIC_CMC_SCHAN_MESSAGE_21r(CMIC_CMC_BASE); - hostcmd_regs[1] = CMIC_CMC_SCHAN_MESSAGE_20r(CMIC_CMC_BASE); - hostcmd_regs[2] = CMIC_CMC_SCHAN_MESSAGE_19r(CMIC_CMC_BASE); - hostcmd_regs[3] = CMIC_CMC_SCHAN_MESSAGE_18r(CMIC_CMC_BASE); - hostcmd_regs[4] = CMIC_CMC_SCHAN_MESSAGE_17r(CMIC_CMC_BASE); - - return; -} - - -/** - * bksync_ioctl_cmd_handler - * @kmsg: kcom message - ptp clock ioctl command. - * Description: This function will handle ioctl commands - * from user mode. - */ -static int -bksync_ioctl_cmd_handler(kcom_msg_clock_cmd_t *kmsg, int len, int dcb_type) -{ - u32 fw_status; - kmsg->hdr.type = KCOM_MSG_TYPE_RSP; - - if (!module_initialized && kmsg->clock_info.cmd != KSYNC_M_HW_INIT) { - kmsg->hdr.status = KCOM_E_NOT_FOUND; - return sizeof(kcom_msg_hdr_t); - } - - switch(kmsg->clock_info.cmd) { - case KSYNC_M_HW_INIT: - pci_cos = kmsg->clock_info.data[0]; - if (kmsg->clock_info.data[1] == 0 || kmsg->clock_info.data[1] == 1) { - fw_core = kmsg->clock_info.data[1]; - DEV_READ32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_21r(CMIC_CMC_BASE), &fw_status); - - /* Return success if the app is already initialized. */ - if (module_initialized) { - kmsg->hdr.status = KCOM_E_NONE; - return sizeof(kcom_msg_hdr_t); - } - - /* Return error if the app is not ready yet. */ - if (fw_status != 0xBADC0DE1) { - kmsg->hdr.status = KCOM_E_RESOURCE; - return sizeof(kcom_msg_hdr_t); - } - - bksync_ptp_dma_init(dcb_type); - if (bksync_ptp_init(&(ptp_priv->ptp_caps)) >= 0) { - module_initialized = 1; - } - } - break; - case KSYNC_M_HW_DEINIT: - bksync_ptp_deinit(&(ptp_priv->ptp_caps)); - module_initialized = 0; - break; - case KSYNC_M_HW_TS_DISABLE: - bksync_ptp_hw_tstamp_disable(0, kmsg->clock_info.data[0], 0); - break; - case KSYNC_M_MTP_TS_UPDATE_ENABLE: - bksync_ptp_mirror_encap_update(0, kmsg->clock_info.data[0], TRUE); - break; - case KSYNC_M_MTP_TS_UPDATE_DISABLE: - bksync_ptp_mirror_encap_update(0, kmsg->clock_info.data[0], FALSE); - break; - case KSYNC_M_VERSION: - break; - default: - kmsg->hdr.status = KCOM_E_NOT_FOUND; - return sizeof(kcom_msg_hdr_t); - } - - return sizeof(*kmsg); -} - - - -/** - * bksync_ptp_register - * @priv: driver private structure - * Description: this function will register the ptp clock driver - * to kernel. It also does some house keeping work. - */ -static int bksync_ptp_register(void) -{ - int err = -ENODEV; - - /* Support on core-0 or core-1 */ - if (fw_core < 0 || fw_core > 1) { - goto exit; - } - - /* default transport is raw, ieee 802.3 */ - switch (network_transport) { - case 2: /* IEEE 802.3 */ - case 4: /* UDP IPv4 */ - case 6: /* UDP IPv6 */ - break; - default: - network_transport = 0; - } - - ptp_priv = kzalloc(sizeof(*ptp_priv), GFP_KERNEL); - if (!ptp_priv) { - err = -ENOMEM; - goto exit; - } - - /* Reset memory */ - memset(ptp_priv, 0, sizeof(*ptp_priv)); - - err = -ENODEV; - - ptp_priv->ptp_caps = bksync_ptp_caps; - - mutex_init(&(ptp_priv->ptp_lock)); - mutex_init(&(ptp_priv->ptp_pair_lock)); - - /* Register ptp clock driver with bksync_ptp_caps */ - ptp_priv->ptp_clock = ptp_clock_register(&ptp_priv->ptp_caps, NULL); - - /* Initialize the Base address for CMIC and shared Memory access */ - ptp_priv->base_addr = lkbde_get_dev_virt(0); - ptp_priv->dma_dev = lkbde_get_dma_dev(0); - - if (IS_ERR(ptp_priv->ptp_clock)) { - ptp_priv->ptp_clock = NULL; - } else if (ptp_priv->ptp_clock) { - err = 0; - - /* Register BCM-KNET HW Timestamp Callback Functions */ - bkn_hw_tstamp_enable_cb_register(bksync_ptp_hw_tstamp_enable); - bkn_hw_tstamp_disable_cb_register(bksync_ptp_hw_tstamp_disable); - bkn_hw_tstamp_tx_time_get_cb_register(bksync_ptp_hw_tstamp_tx_time_get); - bkn_hw_tstamp_tx_meta_get_cb_register(bksync_ptp_hw_tstamp_tx_meta_get); - bkn_hw_tstamp_rx_time_upscale_cb_register(bksync_ptp_hw_tstamp_rx_time_upscale); - bkn_hw_tstamp_ptp_clock_index_cb_register(bksync_ptp_hw_tstamp_ptp_clock_index_get); - bkn_hw_tstamp_ioctl_cmd_cb_register(bksync_ioctl_cmd_handler); - - } - - /* Initialize proc files */ - bksync_proc_root = proc_mkdir("bcm/ksync", NULL); - bksync_proc_init(); - ptp_priv->shared_addr = NULL; - ptp_priv->port_stats = NULL; -exit: - return err; -} - -static int bksync_ptp_remove(void) -{ - if (!ptp_priv) - return 0; - - bksync_ptp_time_keep_deinit(); - - bksync_proc_cleanup(); - remove_proc_entry("bcm/ksync", NULL); - - /* UnRegister BCM-KNET HW Timestamp Callback Functions */ - bkn_hw_tstamp_enable_cb_unregister(bksync_ptp_hw_tstamp_enable); - bkn_hw_tstamp_disable_cb_unregister(bksync_ptp_hw_tstamp_disable); - bkn_hw_tstamp_tx_time_get_cb_unregister(bksync_ptp_hw_tstamp_tx_time_get); - bkn_hw_tstamp_tx_meta_get_cb_unregister(bksync_ptp_hw_tstamp_tx_meta_get); - bkn_hw_tstamp_rx_time_upscale_cb_unregister(bksync_ptp_hw_tstamp_rx_time_upscale); - bkn_hw_tstamp_ptp_clock_index_cb_unregister(bksync_ptp_hw_tstamp_ptp_clock_index_get); - bkn_hw_tstamp_ioctl_cmd_cb_unregister(bksync_ioctl_cmd_handler); - - if (module_initialized) { - DEV_WRITE32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_15r(CMIC_CMC_BASE), 0); - DEV_WRITE32(ptp_priv, CMIC_CMC_SCHAN_MESSAGE_16r(CMIC_CMC_BASE), 0); - } - /* Deinitialize the PTP */ - bksync_ptp_deinit(&(ptp_priv->ptp_caps)); - module_initialized = 0; - - if (ptp_priv->port_stats != NULL) { - kfree((void *)ptp_priv->port_stats); - ptp_priv->port_stats = NULL; - } - if (ptp_priv->shared_addr != NULL) { - kfree((void *)ptp_priv->shared_addr); - ptp_priv->shared_addr = NULL; - DBG_ERR(("Free R5 memory\n")); - } - - /* Unregister the bcm ptp clock driver */ - ptp_clock_unregister(ptp_priv->ptp_clock); - - /* Free Memory */ - kfree(ptp_priv); - - return 0; -} -#endif - - -/* - * Generic module functions - */ - -/* - * Function: _pprint - * - * Purpose: - * Print proc filesystem information. - * Parameters: - * None - * Returns: - * Always 0 - */ - static int -_pprint(struct seq_file *m) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(3,17,0) - /* put some goodies here */ - pprintf(m, "Broadcom BCM PTP Hardware Clock Module\n"); -#else - pprintf(m, "Broadcom BCM PTP Hardware Clock Module not supported\n"); -#endif - return 0; -} - -/* - * Function: _init - * - * Purpose: - * Module initialization. - * Attached SOC all devices and optionally initializes these. - * Parameters: - * None - * Returns: - * 0 on success, otherwise -1 - */ - static int -_init(void) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(3,17,0) - bksync_ptp_register(); - return 0; -#else - return -1; -#endif -} - -/* - * Function: _cleanup - * - * Purpose: - * Module cleanup function - * Parameters: - * None - * Returns: - * Always 0 - */ - static int -_cleanup(void) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(3,17,0) - mutex_destroy(&(ptp_priv->ptp_lock)); - mutex_destroy(&(ptp_priv->ptp_pair_lock)); - bksync_ptp_remove(); - return 0; -#else - return -1; -#endif -} - -static gmodule_t _gmodule = { -name: MODULE_NAME, - major: MODULE_MAJOR, - init: _init, - cleanup: _cleanup, - pprint: _pprint, - ioctl: NULL, - open: NULL, - close: NULL, -}; - - gmodule_t* -gmodule_get(void) -{ - EXPORT_NO_SYMBOLS; - return &_gmodule; -} diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c index e67f9191d45e..628ee1780c09 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c +++ b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c @@ -509,7 +509,7 @@ psample_filter_cb(uint8_t * pkt, int size, int dev_no, void *pkt_meta, /* setup skb to point to pkt */ memcpy(skb->data, pkt, meta.trunc_size); skb_put(skb, meta.trunc_size); - skb->len = meta.trunc_size; + skb->len = size; /* SONIC-55684 */ psample_pkt->skb = skb; spin_lock_irqsave(&g_psample_work.lock, flags); diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c index 99317cbf30cc..46a84c7f7c4a 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c +++ b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c @@ -202,6 +202,7 @@ void psample_group_put(struct psample_group *group) } EXPORT_SYMBOL_GPL(psample_group_put); +#if IS_ENABLED(CONFIG_PSAMPLE) /* FIXUP:- Remove after GTS kernel is recompiled with change in CONFIG_PSAMPLE flag */ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, u32 trunc_size, int in_ifindex, int out_ifindex, u32 sample_rate) @@ -283,6 +284,7 @@ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, nlmsg_free(nl_skb); } EXPORT_SYMBOL_GPL(psample_sample_packet); +#endif static int __init psample_module_init(void) { diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/shared/ksal.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/shared/ksal.c index 2161b287f687..9c093e0eacdf 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/shared/ksal.c +++ b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/shared/ksal.c @@ -196,9 +196,15 @@ sal_time_usecs(void) do_gettimeofday(<v); return (ltv.tv_sec * SECOND_USEC + ltv.tv_usec); #else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) /* ktime_to_us and ktime_get_real_ns return 64-bit integets, but this */ /* function is returning a 32-bit integer. This should be fine until 2038. */ return ktime_to_us(ktime_get_real_ns()); +#else + struct timeval ltv; + do_gettimeofday(<v); + return (ltv.tv_sec * SECOND_USEC + ltv.tv_usec); +#endif #endif } diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/bmw-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/bmw-2_6/Makefile deleted file mode 100644 index 899c7b405374..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/bmw-2_6/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.4 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# PPC_TOOLS_DIR - path to build tools (if not in PATH already) -# PPC_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=bmw-$(kernel_version) - -# Windriver linux version -#WRS_LINUX_VERSION=1.4 -#WRS_LINUX_VERSION=2.0 - -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/gto-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/gto-2_6/Makefile deleted file mode 100644 index c157f9ff35fc..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/gto-2_6/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.9 Broadcom SDK $ -# $Copyright: (c) 2007 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# PPC_TOOLS_DIR - path to build tools (if not in PATH already) -# PPC_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=gto-$(kernel_version) -LINUX_MAKE_USER=1 -export LINKER_RELAX=1 - -# Select the build environment -#BUILD_PLATFORM=ELDK -#BUILD_PLATFORM=WR_LINUX - -#Select the LINUX KERNEL VERSION -#KERN_VER = 2.6.21.7 -#KERN_VER = 2.6.24.4 -#KERN_VER = 2.6.25 - - -# Select the ELDK version -#ELDK_VERSION=4.1 -#ELDK_VERSION=4.0 - -#Select WRS Linux version -#WRS_LINUX_VERSION=2.0 -#WRS_LINUX_VERSION=3.0 - - -export KERN_VER -export ELDK_VERSION -export BUILD_PLATFORM -export WRS_LINUX_VERSION - -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/gto/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/gto/Makefile deleted file mode 100644 index fd98f6d2f963..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/gto/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.9 Broadcom SDK $ -# $Copyright: (c) 2015 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# PPC_TOOLS_DIR - path to build tools (if not in PATH already) -# PPC_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=4_4 -platform=gto -LINUX_MAKE_USER=1 -export LINKER_RELAX=1 - -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/jag-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/jag-2_6/Makefile deleted file mode 100644 index 26a7f520f2d2..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/jag-2_6/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.4 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=jag-$(kernel_version) - -# Select the build environment -#BUILD_PLATFORM=ELDK -#BUILD_PLATFORM=WR_LINUX - -#Select the LINUX KERNEL VERSION -#KERN_VER = 2.6.21.7 - - -# Select the ELDK version -#ELDK_VERSION=4.1 - -# Windriver linux version -#WRS_LINUX_VERSION=1.4 -#WRS_LINUX_VERSION=2.0 - -export KERN_VER -export ELDK_VERSION -export BUILD_PLATFORM -export WRS_LINUX_VERSION - -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/nsx-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/nsx-2_6/Makefile deleted file mode 100644 index 881ec34c2d36..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/nsx-2_6/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.4 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=nsx-$(kernel_version) -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/nsx64/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/nsx64/Makefile deleted file mode 100644 index 9e79d90fa992..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/nsx64/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.3 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -platform=nsx64 -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/nsx_wrl-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/nsx_wrl-2_6/Makefile deleted file mode 100644 index 4e86843cdc7c..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/nsx_wrl-2_6/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.3 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=nsx_wrl-$(kernel_version) - -# Windriver linux version -#WRS_LINUX_VERSION=1.4 -#WRS_LINUX_VERSION=2.0 - -export WRS_LINUX_VERSION - -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/raptor-2_6/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/raptor-2_6/Makefile deleted file mode 100644 index 10ab1a1cc259..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/raptor-2_6/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.5 Broadcom SDK $ -# $Copyright: (c) 2007 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -override kernel_version=2_6 -platform=raptor-$(kernel_version) - -# Select the build environment -#BUILD_PLATFORM=ELDK -#BUILD_PLATFORM=WR_LINUX - -#Select the LINUX KERNEL VERSION -#KERN_VER = 2.6.21.7 - - -# Select the ELDK version -#ELDK_VERSION=4.1 - -# Windriver linux version -#WRS_LINUX_VERSION=1.4 -#WRS_LINUX_VERSION=2.0 - -export KERN_VER -export ELDK_VERSION -export BUILD_PLATFORM -export WRS_LINUX_VERSION - -LINUX_MAKE_USER=1 -include ${SDK}/make/Make.linux - diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/raptor/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/raptor/Makefile deleted file mode 100644 index df8800a1a786..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/user/raptor/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.1 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ - -# -# This make job requires the following environment variables to be set: -# -# SDK - path to StrataXGS SDK root directory -# -# Optionally the following environment variables can be set to -# override the default build server configuration: -# -# MIPS_TOOLS_DIR - path to build tools (if not in PATH already) -# MIPS_CROSS_COMPILE - cross compile tools prefix -# LINUX_INCLUDE - path to Linux kernel include directory -# - -SDK :=$(shell if [ -n "$$SDK" ] ; then\ - echo $$SDK;\ - else\ - cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \ - dir=`cd ../;pwd`; \ - if [ "$$dir" = "/" ] ; then \ - echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \ - exit 1; \ - fi ; \ - cd $$dir; \ - done ; \ - pwd; \ - fi) - -ifeq ($(SDK),) -$(error Please run this in a tree) -endif - -export SDK - -platform=raptor -LINUX_MAKE_USER=1 -CFGFLAGS += -DBCM_ICS -include ${SDK}/make/Make.linux - diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index d49a832aff9e..69279d0844d5 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,6 +1,6 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIRel1.21.1.1 +MLNX_SAI_VERSION = SAIRel1.21.1.0 export MLNX_SAI_VERSION diff --git a/platform/mellanox/mlnx-sai/SAI-Implementation b/platform/mellanox/mlnx-sai/SAI-Implementation index a01442acd95e..d6eb22a12cc0 160000 --- a/platform/mellanox/mlnx-sai/SAI-Implementation +++ b/platform/mellanox/mlnx-sai/SAI-Implementation @@ -1 +1 @@ -Subproject commit a01442acd95e3a4f78a8e4b04b227fcbe905771e +Subproject commit d6eb22a12cc0f01e84a71d367f7c4ebe19f58a40 diff --git a/slave.mk b/slave.mk index 1a008640b4b9..72049cebf0bf 100644 --- a/slave.mk +++ b/slave.mk @@ -1370,7 +1370,7 @@ jessie : $$(addprefix $(TARGET_PATH)/,$$(JESSIE_DOCKER_IMAGES)) \ $$(addprefix $(TARGET_PATH)/,$$(JESSIE_DBG_DOCKER_IMAGES)) ############################################################################### -## Standard targets +## Standard targets ############################################################################### .PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_FILES) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_STDEB_DEBS) $(SONIC_CLEAN_WHEELS) $(SONIC_PHONY_TARGETS) clean distclean configure diff --git a/src/sonic-sairedis b/src/sonic-sairedis index c7cbfe80dfcb..f67bcddf15d3 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit c7cbfe80dfcb61deef483f6c99b1c21763134ab1 +Subproject commit f67bcddf15d315a01ac4f3fafe14e9db2231c195 From 05c6488029eea267dbca45fba32e5b0f0a987b97 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Thu, 5 May 2022 22:48:58 -0700 Subject: [PATCH 287/817] Fix setting the HTTPS proxy (#10739) Some places were not correctly setting the HTTPS proxy, and were only setting the HTTP proxy. This was fine until Docker 20.10.10, which then started using `https_proxy` for HTTPS connections. Signed-off-by: Saikrishna Arcot --- slave.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index 72049cebf0bf..4858e290cd3a 100644 --- a/slave.mk +++ b/slave.mk @@ -791,8 +791,9 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # start docker daemon docker-start : - @sudo sed -i '/http_proxy/d' /etc/default/docker + @sudo sed -i -e '/http_proxy/d' -e '/https_proxy/d' /etc/default/docker @sudo bash -c "{ echo \"export http_proxy=$$http_proxy\"; \ + echo \"export https_proxy=$$https_proxy\"; \ echo \"export no_proxy=$$no_proxy\"; } >> /etc/default/docker" @test x$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) != x"y" && sudo service docker status &> /dev/null || ( sudo service docker start &> /dev/null && ./scripts/wait_for_docker.sh 60 ) @@ -979,7 +980,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAG docker build \ $(if $($*.gz_DBG_DEPENDS), --squash --no-cache, --no-cache) \ --build-arg http_proxy=$(HTTP_PROXY) \ - --build-arg http_proxy=$(HTTP_PROXY) \ + --build-arg https_proxy=$(HTTPS_PROXY) \ --build-arg no_proxy=$(NO_PROXY) \ --build-arg docker_container_name=$($*.gz_CONTAINER_NAME) \ --label com.azure.sonic.manifest="$$(cat $($*.gz_PATH)/manifest.json)" \ From 7104664c0522f77496d1e53ac3dfff6ea81b56c3 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 6 May 2022 09:56:08 -0700 Subject: [PATCH 288/817] Change source path for sonic-pcied to use Python 3 variable (#10676) Python 2 support for sonic-pcied was removed, and the Python 2 version of the variable no longer exists. Signed-off-by: Saikrishna Arcot --- rules/sonic-pcied.dep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/sonic-pcied.dep b/rules/sonic-pcied.dep index 05cd1fe5cf42..60b1d85a5617 100644 --- a/rules/sonic-pcied.dep +++ b/rules/sonic-pcied.dep @@ -1,4 +1,4 @@ -SPATH:= $($(SONIC_PCIED_PY2)_SRC_PATH) +SPATH:= $($(SONIC_PCIED_PY3)_SRC_PATH) DEP_FILES:= $(SONIC_COMMON_FILES_LIST) rules/sonic-pcied.mk rules/sonic-pcied.dep DEP_FILES+= $(SONIC_COMMON_BASE_FILES_LIST) SMDEP_FILES:= $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) From 66c96eaf4c7c8d8649ca7d00db58b9b998048d09 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Fri, 6 May 2022 11:12:56 -0700 Subject: [PATCH 289/817] Revert "[portconfig]: Remove try block for db config initialization (#10581)" (#10756) This reverts commit 5cd6bc4ce2a32bd7b1b71dbcc85e7390799da7d0. --- src/sonic-config-engine/portconfig.py | 7 ++++++- src/sonic-config-engine/sonic-cfggen | 8 +------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sonic-config-engine/portconfig.py b/src/sonic-config-engine/portconfig.py index ea9985a3beb0..0c056d1cdab7 100644 --- a/src/sonic-config-engine/portconfig.py +++ b/src/sonic-config-engine/portconfig.py @@ -72,7 +72,12 @@ def db_connect_configdb(namespace=None): """ Connect to configdb """ - config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) + try: + if namespace is not None: + swsscommon.SonicDBConfig.load_sonic_global_db_config(namespace=namespace) + config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) + except Exception as e: + return None if config_db is None: return None try: diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 3f0e047f76fa..bf93ad849fcb 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -32,7 +32,7 @@ from functools import partial from minigraph import minigraph_encoder, parse_xml, parse_device_desc_xml, parse_asic_sub_role, parse_asic_switch_type from portconfig import get_port_config, get_breakout_mode from redis_bcc import RedisBytecodeCache -from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id, is_multi_asic +from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id from sonic_py_common import device_info from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector, SonicDBConfig, ConfigDBPipeConnector @@ -296,12 +296,6 @@ def main(): 'localhost': {'namespace_id': namespace_id} } }) - # load db config - if not SonicDBConfig.isInit(): - if is_multi_asic(): - SonicDBConfig.load_sonic_global_db_config(namespace=asic_name) - else: - SonicDBConfig.load_sonic_db_config() if hwsku is not None: hardware_data = {'DEVICE_METADATA': {'localhost': { 'hwsku': hwsku From 25357d39eddc424d8922216707c2ad21c22f529a Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Fri, 6 May 2022 13:23:20 -0700 Subject: [PATCH 290/817] [sonic-swss-common] submodule update (#10747) Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan Why I did it submodule update for the following commits 7a203b1 [chassis] Add new tables in counter db for Voq counter support. (#530) 5effea3 add new table schema for bgp profile (#608) 130dca5 [ci] Update azure pipeline branch variable reference. 708ed39 [ci] Parameterize pipeline and improve azure pipeline (#599) 9c08456 Added new P4RT tables. (#604) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index c34a4e1cc733..7a203b1b1fde 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit c34a4e1cc7332fd7368239206a097478fa1dcc90 +Subproject commit 7a203b1b1fdefcd588ec7a72c0db95b32e50f3a7 From 322363b9abab7710e59aa38892fd47e4ae7dc044 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Fri, 6 May 2022 13:42:23 -0700 Subject: [PATCH 291/817] [master][sonic-linkmgrd] submodule updates (#10763) [master][sonic-linkmgrd] submodule updates df51322 Longxiang Lyu Fri May 6 10:01:46 2022 +0800 Add `ActiveActiveStateMachine` implementation (#64) e721ceb Jing Zhang Wed May 4 10:07:14 2022 -0700 Add doc for default route related changes (#63) 7bb06fb Jing Zhang Tue May 3 09:48:28 2022 -0700 Add Cli support to enable or disable default route related feature (#68) e4b02cb Jing Zhang Mon May 2 13:27:54 2022 -0700 Reset WaitActiveUp count before switching to active (#70) 212d960 Jing Zhang Wed Apr 27 10:35:05 2022 -0700 lower log level to warning (#69) 48abc9e Jing Zhang Thu Apr 14 16:50:04 2022 -0700 Add support to enable switchover time measurement (with link prober interval decreased to 10ms) feature (#61) c4858a6 Jing Zhang Thu Apr 14 11:27:55 2022 -0700 Avoid proactively switching to `active` if default route is missing (#62) sign-off: Jing Zhang zhangjing@microsoft.com --- dockers/docker-mux/supervisord.conf | 2 +- src/linkmgrd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-mux/supervisord.conf b/dockers/docker-mux/supervisord.conf index 87903f28e155..33eb650e85d4 100644 --- a/dockers/docker-mux/supervisord.conf +++ b/dockers/docker-mux/supervisord.conf @@ -28,7 +28,7 @@ stderr_logfile=syslog dependent_startup=true [program:linkmgrd] -command=nice -n -20 /usr/sbin/linkmgrd -v warning +command=nice -n -20 /usr/sbin/linkmgrd -v warning -d priority=2 autostart=false autorestart=false diff --git a/src/linkmgrd b/src/linkmgrd index 41f5fb9d44f2..df5132254e10 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 41f5fb9d44f2fd789dea372f2b647d40ec71ed75 +Subproject commit df5132254e104343d099da3b95eaf1336ac485cd From 45c5ca089c287e6c5b5016f790cd3f95a269e35a Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 6 May 2022 14:22:23 -0700 Subject: [PATCH 292/817] Fix: No explicit reading ConfigDB in get_asic_conf_file_path() (#10723) #### Why I did it This function is critical for is_multi_asic() and SonicDBConfig initializing. No explicit reading ConfigDB. Otherwise it will implicitly trigger SonicDBConfig initializing. #### How I did it 1. No explicit reading ConfigDB in get_asic_conf_file_path() 2. Collect asic_conf_path_candidates lazily to prevent any unnecessary side effect and improve the performance --- .../sonic_py_common/device_info.py | 66 ++++++++++++------- .../sonic_py_common/multi_asic.py | 33 +--------- 2 files changed, 43 insertions(+), 56 deletions(-) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index e5220e86e2ad..d57e08b3b5cb 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -40,11 +40,12 @@ CHASSIS_INFO_MODEL_FIELD = 'model' CHASSIS_INFO_REV_FIELD = 'revision' - -def get_localhost_info(field): +def get_localhost_info(field, config_db=None): try: - config_db = ConfigDBConnector() - config_db.connect() + # TODO: enforce caller to provide config_db explicitly and remove its default value + if not config_db: + config_db = ConfigDBConnector() + config_db.connect() metadata = config_db.get_table('DEVICE_METADATA') @@ -81,11 +82,16 @@ def get_machine_info(): return machine_vars - -def get_platform(): +def get_platform(**kwargs): """ Retrieve the device's platform identifier + Args: + config_db: a connected ConfigDBConector object. + If explicit None provided, this function will not read ConfigDB. This is useful before SonicDBConfig initializing. + If not provided, this function may implicitly ready ConfigDB. + Otherwise, this function will use it to read ConfigDB + Returns: A string containing the device's platform identifier """ @@ -111,8 +117,13 @@ def get_platform(): # container in SONiC, where the /host directory is not mounted. In this # case the value should already be populated in Config DB so we finally # try reading it from there. - - return get_localhost_info('platform') + if 'config_db' in kwargs: + config_db = kwargs['config_db'] + if config_db is None: + return None + else: + config_db = None + return get_localhost_info('platform', config_db=config_db) def get_hwsku(): @@ -144,21 +155,22 @@ def get_platform_and_hwsku(): def get_asic_conf_file_path(): """ - Retrieves the path to the ASIC conguration file on the device + Retrieves the path to the ASIC configuration file on the device Returns: - A string containing the path to the ASIC conguration file on success, + A string containing the path to the ASIC configuration file on success, None on failure """ - asic_conf_path_candidates = [] - - asic_conf_path_candidates.append(os.path.join(CONTAINER_PLATFORM_PATH, ASIC_CONF_FILENAME)) + def asic_conf_path_candidates(): + yield os.path.join(CONTAINER_PLATFORM_PATH, ASIC_CONF_FILENAME) - platform = get_platform() - if platform: - asic_conf_path_candidates.append(os.path.join(HOST_DEVICE_PATH, platform, ASIC_CONF_FILENAME)) + # Note: this function is critical for is_multi_asic() and SonicDBConfig initializing + # No explicit reading ConfigDB + platform = get_platform(config_db=None) + if platform: + yield os.path.join(HOST_DEVICE_PATH, platform, ASIC_CONF_FILENAME) - for asic_conf_file_path in asic_conf_path_candidates: + for asic_conf_file_path in asic_conf_path_candidates(): if os.path.isfile(asic_conf_file_path): return asic_conf_file_path @@ -167,10 +179,10 @@ def get_asic_conf_file_path(): def get_platform_env_conf_file_path(): """ - Retrieves the path to the PLATFORM ENV conguration file on the device + Retrieves the path to the PLATFORM ENV configuration file on the device Returns: - A string containing the path to the PLATFORM ENV conguration file on success, + A string containing the path to the PLATFORM ENV configuration file on success, None on failure """ platform_env_conf_path_candidates = [] @@ -339,7 +351,7 @@ def get_sonic_version_file(): # Get hardware information -def get_platform_info(): +def get_platform_info(config_db=None): """ This function is used to get the HW info helper function """ @@ -356,8 +368,10 @@ def get_platform_info(): hw_info_dict['asic_count'] = get_num_asics() try: - config_db = ConfigDBConnector() - config_db.connect() + # TODO: enforce caller to provide config_db explicitly and remove its default value + if not config_db: + config_db = ConfigDBConnector() + config_db.connect() metadata = config_db.get_table('DEVICE_METADATA')["localhost"] switch_type = metadata.get('switch_type') @@ -462,7 +476,7 @@ def get_namespaces(): return natsorted(ns_list) -def get_all_namespaces(): +def get_all_namespaces(config_db=None): """ In case of Multi-Asic platform, Each ASIC will have a linux network namespace created. So we loop through the databases in different namespaces and depending on the sub_role @@ -476,8 +490,10 @@ def get_all_namespaces(): if is_multi_npu(): for npu in range(num_npus): namespace = "{}{}".format(NPU_NAME_PREFIX, npu) - config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) - config_db.connect() + # TODO: enforce caller to provide config_db explicitly and remove its default value + if not config_db: + config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) + config_db.connect() metadata = config_db.get_table('DEVICE_METADATA') if metadata['localhost']['sub_role'] == FRONTEND_ASIC_SUB_ROLE: diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index 662c01800e35..8ba409165f8b 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -5,11 +5,8 @@ from natsort import natsorted from swsscommon import swsscommon -from .device_info import CONTAINER_PLATFORM_PATH -from .device_info import HOST_DEVICE_PATH -from .device_info import get_platform -from .device_info import is_supervisor -from .device_info import is_chassis +from .device_info import get_asic_conf_file_path +from .device_info import is_supervisor, is_chassis ASIC_NAME_PREFIX = 'asic' NAMESPACE_PATH_GLOB = '/run/netns/*' @@ -78,32 +75,6 @@ def connect_to_all_dbs_for_ns(namespace=DEFAULT_NAMESPACE): db.connect(db_id) return db - -def get_asic_conf_file_path(): - """ - Retrieves the path to the ASIC conguration file on the device - - Returns: - A string containing the path to the ASIC conguration file on success, - None on failure - """ - asic_conf_path_candidates = [] - - asic_conf_path_candidates.append(os.path.join(CONTAINER_PLATFORM_PATH, - ASIC_CONF_FILENAME)) - - platform = get_platform() - if platform: - asic_conf_path_candidates.append(os.path.join( - HOST_DEVICE_PATH, platform, ASIC_CONF_FILENAME)) - - for asic_conf_file_path in asic_conf_path_candidates: - if os.path.isfile(asic_conf_file_path): - return asic_conf_file_path - - return None - - def get_num_asics(): """ Retrieves the num of asics present in the multi ASIC platform From 7e190c783a73b8c264991a6276f26c2a6288a80d Mon Sep 17 00:00:00 2001 From: "Robert J. Halstead" Date: Fri, 6 May 2022 15:35:20 -0700 Subject: [PATCH 293/817] [submodule] Advance sonic-p4rt/sonic-pins pointer (#10566) #### Why I did it To pick up new commits: * 60d2467 Add depends to p4rt debian package #### How I did it update sonic-p4rt/sonic-pins submodule pointer #### How to verify it should be able to build with p4rt enabled. --- src/sonic-p4rt/sonic-pins | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-p4rt/sonic-pins b/src/sonic-p4rt/sonic-pins index 36322d349779..4168fdce1c11 160000 --- a/src/sonic-p4rt/sonic-pins +++ b/src/sonic-p4rt/sonic-pins @@ -1 +1 @@ -Subproject commit 36322d349779f99e30fc52c26fee60945b0eb5e8 +Subproject commit 4168fdce1c1131b923a02b8fffa6089a17f14a11 From d5a182f42e4a33798e907ee5ec7e146d4c4173d3 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Sat, 7 May 2022 11:28:25 +0800 Subject: [PATCH 294/817] [build] Add dependencies for sonic-config-engine to block bad PR. (#10770) Add dependencies device/* --- rules/sonic-config.dep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/sonic-config.dep b/rules/sonic-config.dep index 9e6d1e929341..65aabe74d76f 100644 --- a/rules/sonic-config.dep +++ b/rules/sonic-config.dep @@ -4,7 +4,7 @@ SPATH := $($(SONIC_CONFIG_ENGINE_PY3)_SRC_PATH) DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-config.mk rules/sonic-config.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) DEP_FILES += $(shell git ls-files $(SPATH)) -DEP_FILES += files/image_config/interfaces/interfaces.j2 dockers/docker-orchagent/ports.json.j2 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 dockers/docker-lldp/lldpd.conf.j2 dockers/docker-orchagent/ipinip.json.j2 $(wildcard device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/* device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/*) files/build_templates/qos_config.j2 dockers/docker-orchagent/switch.json.j2 dockers/docker-orchagent/vxlan.json.j2 files/image_config/constants/constants.yml +DEP_FILES += files/image_config/interfaces/interfaces.j2 dockers/docker-orchagent/ports.json.j2 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 dockers/docker-lldp/lldpd.conf.j2 dockers/docker-orchagent/ipinip.json.j2 $(shell find device -type f) files/build_templates/qos_config.j2 dockers/docker-orchagent/switch.json.j2 dockers/docker-orchagent/vxlan.json.j2 files/image_config/constants/constants.yml ifeq ($(ENABLE_PY2_MODULES), y) $(SONIC_CONFIG_ENGINE_PY2)_CACHE_MODE := GIT_CONTENT_SHA From 71a515e14b2edc67315e126e00ea5f90a2be3149 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 7 May 2022 17:14:36 +0800 Subject: [PATCH 295/817] [iproute2]: Fix format error of SSCI (#10767) Signed-off-by: Ze Gan #### Why I did it The SSCI is wrong in the output of MACsec so that the virtual SAI cannot parse the output corretly. The wrong output: ``` 142: macsec_eth1: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off cipher suite: GCM-AES-XPN-256, using ICV length 16 TXSC: 5254008f4f1c0001 on SA 0 0: PN 103, state on, key 12cbc4b64e26c9a1ba14d810da20d16e SSCI 33554432, RXSC: 525400edac5b0001, state on 0: PN 107, state on, key 12cbc4b64e26c9a1ba14d810da20d16e offload: off ``` Expected ``` 142: macsec_eth1: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off cipher suite: GCM-AES-XPN-256, using ICV length 16 TXSC: 5254008f4f1c0001 on SA 0 0: PN 252, state on, SSCI 33554432, key 12cbc4b64e26c9a1ba14d810da20d16e RXSC: 525400edac5b0001, state on 0: PN 264, state on, key 12cbc4b64e26c9a1ba14d810da20d16e ``` #### How I did it Move SSCI before the key so that SSCI will not be the front of SC information. --- src/iproute2/patch/0001-patch-macsec-xpn-support.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iproute2/patch/0001-patch-macsec-xpn-support.patch b/src/iproute2/patch/0001-patch-macsec-xpn-support.patch index c55daa3fd4c6..33e7e6a7dd94 100644 --- a/src/iproute2/patch/0001-patch-macsec-xpn-support.patch +++ b/src/iproute2/patch/0001-patch-macsec-xpn-support.patch @@ -182,11 +182,11 @@ index 18289ecd..1df19bf1 100644 print_bool(PRINT_JSON, "active", NULL, state); print_string(PRINT_FP, NULL, " state %s,", state ? "on" : "off"); - print_key(sa_attr[MACSEC_SA_ATTR_KEYID]); + if (sa_attr[MACSEC_SA_ATTR_SSCI]) { + print_uint(PRINT_ANY, "ssci", " SSCI %u,", + rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_SSCI])); + } + print_key(sa_attr[MACSEC_SA_ATTR_KEYID]); print_txsa_stats(prefix, sa_attr[MACSEC_SA_ATTR_STATS]); close_json_object(); From 0e30ffe4da977e5e2966f02f385911e487061d64 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 9 May 2022 16:43:21 +0800 Subject: [PATCH 296/817] [ci] Support multi tags when pushing docker image (#10771) --- push_docker.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/push_docker.sh b/push_docker.sh index 3e2da08d0b83..131494be2985 100755 --- a/push_docker.sh +++ b/push_docker.sh @@ -54,9 +54,10 @@ docker login -u ${REGISTRY_USERNAME} -p "${REGISTRY_PASSWD}" ${REGISTRY_SERVER_W docker_image_name=$(basename ${DOCKER_IMAGE_FILE} | cut -d. -f1) remote_image_name=${REGISTRY_SERVER_WITH_PORT}/${docker_image_name} -[ -z "${DOCKER_IMAGE_TAG}" ] || { - push_it ${docker_image_name} ${remote_image_name}:${DOCKER_IMAGE_TAG} -} +for tag in ${DOCKER_IMAGE_TAG} +do + push_it ${docker_image_name} ${remote_image_name}:$tag +done if [ -n "${sonic_version}" ] && [ -n "${sonic_platform}" ] then From 15cf9b0d70b3d839a40a06cec6b6fc10124017ae Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 9 May 2022 23:26:09 +0800 Subject: [PATCH 297/817] Reduce image size for lazy installation packages (#10775) Why I did it The image size is too large, when there are multiple lazy packages and multiple platforms. It is not necessary to keep the lazy installation packages in multiple copies. For cisco image, the image size will reduce from 3.5G to 1.7G. How I did it Use symbol links to only keep one package for each of the lazy package. Make a new folder fsroot/platform/common Copy the lazy packages into the folder. When using a package in each of the platform, such as x86_64-grub, x86_64-8800_rp-r0, x86_64-8201_on-r0, etc, only make a symbol link to the package in the common folder. --- build_debian.sh | 2 +- files/build_templates/sonic_debian_extension.j2 | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index b8216c629b8d..d99ba9d877ad 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -643,5 +643,5 @@ fi pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd ## Compress together with /boot, /var/lib/docker and $PLATFORM_DIR as an installer payload zip file -pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd +pushd $FILESYSTEM_ROOT && sudo zip --symlinks $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd sudo zip -g -n .squashfs:.gz $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 419ddf139100..aebd6b2fcd0d 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -610,7 +610,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT depmod -a {{kversion}} sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f --download-only sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}} -sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ +sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/common +sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/common/ +sudo ln -sf "../common/{{ debfilename }}" "$FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/{{ debfilename }}" for f in $(find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"); do sudo mv $f $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ done From b86499ccb980a17295a0eabd5dd63dcecd1edf2c Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Tue, 10 May 2022 01:47:45 +0800 Subject: [PATCH 298/817] [PDDF] Rename temp for as7816/7326/7726 (#10609) * [PDDF] Rename temp for 7816/7326/7726 Signed-off-by: Jostar Yang * Change naming to pddf device Co-authored-by: Jostar Yang --- .../pddf/pddf-device.json | 10 ++-- .../x86_64-accton_as7326_56x-r0/sensors.conf | 42 +++++++-------- .../pddf/pddf-device.json | 5 ++ .../x86_64-accton_as7726_32x-r0/sensors.conf | 52 +++++++++---------- .../pddf/pddf-device.json | 12 ++--- .../x86_64-accton_as7816_64x-r0/sensors.conf | 39 ++++++-------- 6 files changed, 80 insertions(+), 80 deletions(-) diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json index a8bd6d0c4043..857b4e1c4c8d 100644 --- a/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7326_56x-r0/pddf/pddf-device.json @@ -303,6 +303,7 @@ "TEMP1" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "dev_attr": { "display_name":"MB_RearMAC_temp(0x48)"}, "i2c": { "topo_info": { "parent_bus":"0xf", "dev_addr":"0x48", "dev_type":"lm75"}, @@ -316,7 +317,8 @@ }, "TEMP2" : { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX2"}, + "dev_attr": { "display_name":"MB_FrontMAC_temp(0x49)"}, "i2c": { "topo_info": { "parent_bus":"0xf", "dev_addr":"0x49", "dev_type":"lm75"}, @@ -330,7 +332,8 @@ }, "TEMP3" : { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX2"}, + "dev_attr": { "display_name":"MB_LeftCenter_temp(0x4A)"}, "i2c": { "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4A", "dev_type":"lm75"}, @@ -344,7 +347,8 @@ }, "TEMP4" : { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX2"}, + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX2"}, + "dev_attr": { "display_name":"CB_temp(0x4B)"}, "i2c": { "topo_info": { "parent_bus":"0xf", "dev_addr":"0x4B", "dev_type":"lm75"}, diff --git a/device/accton/x86_64-accton_as7326_56x-r0/sensors.conf b/device/accton/x86_64-accton_as7326_56x-r0/sensors.conf index ec28b6875a0c..7cace5e48d46 100644 --- a/device/accton/x86_64-accton_as7326_56x-r0/sensors.conf +++ b/device/accton/x86_64-accton_as7326_56x-r0/sensors.conf @@ -1,50 +1,46 @@ # libsensors configuration file for as7326-56x # ------------------------------------------------ # - bus "i2c-11" "i2c-1-mux (chan_id 2)" bus "i2c-13" "i2c-1-mux (chan_id 4)" bus "i2c-15" "i2c-1-mux (chan_id 6)" bus "i2c-17" "i2c-1-mux (chan_id 0)" - -chip "ym2651-i2c-*-59" +chip "psu_pmbus-i2c-*-59" label in3 "PSU 1 Voltage" label fan1 "PSU 1 Fan" label temp1 "PSU 1 Temperature" label power2 "PSU 1 Power" label curr2 "PSU 1 Current" - -chip "ym2651-i2c-*-5b" +chip "psu_pmbus-i2c-*-5b" label in3 "PSU 2 Voltage" label fan1 "PSU 2 Fan" label temp1 "PSU 2 Temperature" label power2 "PSU 2 Power" label curr2 "PSU 2 Current" - -chip "as7326_56x_fan-*" - label fan1 "Fan 1 Front" - label fan2 "Fan 2 Front" - label fan3 "Fan 3 Front" - label fan4 "Fan 4 Front" - label fan5 "Fan 5 Front" - label fan6 "Fan 6 Front" - label fan11 "Fan 1 Rear" - label fan12 "Fan 2 Rear" - label fan13 "Fan 3 Rear" - label fan14 "Fan 4 Rear" - label fan15 "Fan 5 Rear" - label fan16 "Fan 6 Rear" +chip "fan_ctrl-*" + label fan1 "Fantray1 Front" + label fan2 "Fantray1 Rear" + label fan3 "Fantray2 Front" + label fan4 "Fantray2 Rear" + label fan5 "Fantray3 Front" + label fan6 "Fantray3 Rear" + label fan7 "Fantray4 Front" + label fan8 "Fantray4 Rear" + label fan9 "Fantray5 Front" + label fan10 "Fantray5 Rear" + label fan11 "Fantray6 Front" + label fan12 "Fantray6 Rear" chip "lm75-i2c-*-48" - label temp1 "Main Board Temperature" + label temp1 "MB_RearMAC_temp" chip "lm75-i2c-*-49" - label temp1 "Main Board Temperature" + label temp1 "MB_FrontMAC_temp" chip "lm75-i2c-*-4a" - label temp1 "Main Board Temperature" + label temp1 "MB_LeftCenter_temp" chip "lm75-i2c-*-4b" - label temp1 "CPU Board Temperature" + label temp1 "CB_temp" diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json index 68a18fd5c018..b73f22b54191 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json @@ -1789,6 +1789,7 @@ "TEMP1" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX7"}, + "dev_attr": { "display_name":"FB_temp(0x4C)"}, "i2c": { "topo_info": { "parent_bus":"0x36", "dev_addr":"0x4c", "dev_type":"lm75"}, @@ -1804,6 +1805,7 @@ "TEMP2" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX7"}, + "dev_attr": { "display_name":"MB_RearMAC_temp(0x48)"}, "i2c": { "topo_info": { "parent_bus":"0x37", "dev_addr":"0x48", "dev_type":"lm75"}, @@ -1819,6 +1821,7 @@ "TEMP3" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX7"}, + "dev_attr": { "display_name":"MB_FrontMAC_temp(0x49)"}, "i2c": { "topo_info": { "parent_bus":"0x37", "dev_addr":"0x49", "dev_type":"lm75"}, @@ -1834,6 +1837,7 @@ "TEMP4" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX7"}, + "dev_attr": { "display_name":"MB_LeftCenter_temp(0x4A)"}, "i2c": { "topo_info": { "parent_bus":"0x37", "dev_addr":"0x4a", "dev_type":"lm75"}, @@ -1849,6 +1853,7 @@ "TEMP5" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP5", "device_parent":"MUX7"}, + "dev_attr": { "display_name":"CB_temp(0x4B)"}, "i2c": { "topo_info": { "parent_bus":"0x37", "dev_addr":"0x4b", "dev_type":"lm75"}, diff --git a/device/accton/x86_64-accton_as7726_32x-r0/sensors.conf b/device/accton/x86_64-accton_as7726_32x-r0/sensors.conf index a7b356ee0b1f..bdfb027ce324 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/sensors.conf +++ b/device/accton/x86_64-accton_as7726_32x-r0/sensors.conf @@ -1,49 +1,49 @@ # libsensors configuration file for as7726-32x # ------------------------------------------------ # - bus "i2c-49" "i2c-2-mux (chan_id 0)" bus "i2c-50" "i2c-2-mux (chan_id 1)" bus "i2c-54" "i2c-2-mux (chan_id 5)" bus "i2c-55" "i2c-2-mux (chan_id 6)" - -chip "ym2651-i2c-*-5b" +chip "psu_pmbus-i2c-*-5b" + label in3 "PSU 1 Voltage" label fan1 "PSU 1 Fan" label temp1 "PSU 1 Temperature" - label power1 "PSU 1 Power" - -chip "ym2651-i2c-*-58" + label power2 "PSU 1 Power" + label curr2 "PSU 1 Current" +chip "psu_pmbus-i2c-*-58" + label in3 "PSU 2 Voltage" label fan1 "PSU 2 Fan" label temp1 "PSU 2 Temperature" - label power1 "PSU 2 Power" - -chip "as7726_32x_fan-*" - label fan1 "Fan 1 Front" - label fan2 "Fan 2 Front" - label fan3 "Fan 3 Front" - label fan4 "Fan 4 Front" - label fan5 "Fan 5 Front" - label fan6 "Fan 6 Front" - label fan11 "Fan 1 Rear" - label fan12 "Fan 2 Rear" - label fan13 "Fan 3 Rear" - label fan14 "Fan 4 Rear" - label fan15 "Fan 5 Rear" - label fan16 "Fan 6 Rear" + label power2 "PSU 2 Power" + label curr2 "PSU 2 Current" +chip "fan_ctrl-*" + label fan1 "Fantray1 Front" + label fan2 "Fantray1 Rear" + label fan3 "Fantray2 Front" + label fan4 "Fantray2 Rear" + label fan5 "Fantray3 Front" + label fan6 "Fantray3 Rear" + label fan7 "Fantray4 Front" + label fan8 "Fantray4 Rear" + label fan9 "Fantray5 Front" + label fan10 "Fantray5 Rear" + label fan11 "Fantray6 Front" + label fan12 "Fantray6 Rear" chip "lm75-i2c-*-48" - label temp1 "Main Board Temperature" + label temp1 "MB_RearMAC_temp" chip "lm75-i2c-*-49" - label temp1 "Main Board Temperature" + label temp1 "MB_FrontMAC_temp" chip "lm75-i2c-*-4a" - label temp1 "Main Board Temperature" + label temp1 "MB_LeftCenter_temp" chip "lm75-i2c-*-4b" - label temp1 "CPU Board Temperature" + label temp1 "CB_temp" chip "lm75-i2c-*-4c" - label temp1 "Fan Board Temperature" + label temp1 "FB_temp" diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json index 27d181da1829..f373f39601e4 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7816_64x-r0/pddf/pddf-device.json @@ -319,7 +319,7 @@ "TEMP1" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_1"}, + "dev_attr": { "display_name":"FB_1_temp(0x4D)"}, "i2c": { "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4D", "dev_type":"lm75"}, @@ -334,7 +334,7 @@ "TEMP2" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_2"}, + "dev_attr": { "display_name":"FB_2_temp(0x4E)"}, "i2c": { "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4E", "dev_type":"lm75"}, @@ -349,7 +349,7 @@ "TEMP3" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_3"}, + "dev_attr": { "display_name":"MB_MAC_temp(0x48)"}, "i2c": { "topo_info": { "parent_bus":"0x12", "dev_addr":"0x48", "dev_type":"lm75"}, @@ -364,7 +364,7 @@ "TEMP4" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_4"}, + "dev_attr": { "display_name":"MB_RearCenter_temp(0x49)"}, "i2c": { "topo_info": { "parent_bus":"0x12", "dev_addr":"0x49", "dev_type":"lm75"}, @@ -379,7 +379,7 @@ "TEMP5" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP5", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_5"}, + "dev_attr": { "display_name":"MB_RightCenter_temp(0x4A)"}, "i2c": { "topo_info": { "parent_bus":"0x12", "dev_addr":"0x4A", "dev_type":"lm75"}, @@ -394,7 +394,7 @@ "TEMP6" : { "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP6", "device_parent":"MUX3"}, - "dev_attr": { "display_name":"Temp_6"}, + "dev_attr": { "display_name":"CpuBoard_temp(0x4B)"}, "i2c": { "topo_info": { "parent_bus":"0x12", "dev_addr":"0x4B", "dev_type":"lm75"}, diff --git a/device/accton/x86_64-accton_as7816_64x-r0/sensors.conf b/device/accton/x86_64-accton_as7816_64x-r0/sensors.conf index 56e4817a1b51..baa1fa54a37b 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/sensors.conf +++ b/device/accton/x86_64-accton_as7816_64x-r0/sensors.conf @@ -1,51 +1,46 @@ # libsensors configuration file for as7816-64x # ------------------------------------------------ # - bus "i2c-9" "i2c-1-mux (chan_id 0)" bus "i2c-10" "i2c-1-mux (chan_id 1)" bus "i2c-17" "i2c-1-mux (chan_id 0)" bus "i2c-18" "i2c-1-mux (chan_id 1)" - - -chip "ym2851-i2c-*-5b" +chip "psu_pmbus-i2c-*-5b" label in3 "PSU 1 Voltage" label fan1 "PSU 1 Fan" label temp1 "PSU 1 Temperature" label power2 "PSU 1 Power" label curr2 "PSU 1 Current" - -chip "ym2851-i2c-*-58" +chip "psu_pmbus-i2c-*-58" label in3 "PSU 2 Voltage" label fan1 "PSU 2 Fan" label temp1 "PSU 2 Temperature" label power2 "PSU 2 Power" label curr2 "PSU 2 Current" - -chip "as7816_64x_fan-*" - label fan1 "Fan 1 Front" - label fan2 "Fan 2 Front" - label fan3 "Fan 3 Front" - label fan4 "Fan 4 Front" - label fan11 "Fan 1 Rear" - label fan12 "Fan 2 Rear" - label fan13 "Fan 3 Rear" - label fan14 "Fan 4 Rear" +chip "fan_ctrl-*" + label fan1 "Fantray1 Front" + label fan2 "Fantray1 Rear" + label fan3 "Fantray2 Front" + label fan4 "Fantray2 Rear" + label fan5 "Fantray3 Front" + label fan6 "Fantray3 Rear" + label fan7 "Fantray4 Front" + label fan8 "Fantray4 Rear" chip "lm75-i2c-*-48" - label temp1 "Main Board Temperature" + label temp1 "MB_MAC_temp" chip "lm75-i2c-*-49" - label temp1 "Main Board Temperature" + label temp1 "MB_RearCenter_temp" chip "lm75-i2c-*-4a" - label temp1 "Main Board Temperature" + label temp1 "MB_RightCenter_temp" chip "lm75-i2c-*-4b" - label temp1 "CPU Board Temperature" + label temp1 "CpuBoard_temp" chip "lm75-i2c-*-4d" - label temp1 "Fan Board Temperature" + label temp1 "FB_1_temp" chip "lm75-i2c-*-4e" - label temp1 "Fan Board Temperature" + label temp1 "FB_2_temp" From 0ed671c9afbc4d5dd8418801fd366167a52709a2 Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Mon, 9 May 2022 23:19:25 +0530 Subject: [PATCH 299/817] Fixing some python errors in the common PDDF platform classes (#10669) --- platform/pddf/i2c/utils/pddf_util.py | 4 +-- platform/pddf/i2c/utils/pddfparse.py | 27 ++----------------- .../sonic_platform_pddf_base/pddf_sfp.py | 1 + .../sonic_platform_pddf_base/pddf_thermal.py | 1 + .../sonic_platform_pddf_base/pddfapi.py | 26 ++---------------- 5 files changed, 8 insertions(+), 51 deletions(-) diff --git a/platform/pddf/i2c/utils/pddf_util.py b/platform/pddf/i2c/utils/pddf_util.py index fdefc8933c15..d3ee5e43aca9 100755 --- a/platform/pddf/i2c/utils/pddf_util.py +++ b/platform/pddf/i2c/utils/pddf_util.py @@ -21,7 +21,7 @@ import shutil import subprocess import sys - +from sonic_py_common import device_info import pddfparse PLATFORM_ROOT_PATH = '/usr/share/sonic/device' @@ -139,7 +139,7 @@ def driver_check(): def get_path_to_device(): # Get platform and hwsku - (platform, hwsku) = pddf_obj.get_platform_and_hwsku() + (platform, hwsku) = device_info.get_platform_and_hwsku() # Load platform module from source platform_path = "/".join([PLATFORM_ROOT_PATH, platform]) diff --git a/platform/pddf/i2c/utils/pddfparse.py b/platform/pddf/i2c/utils/pddfparse.py index b8c7f39138a5..1a5774f44f8b 100755 --- a/platform/pddf/i2c/utils/pddfparse.py +++ b/platform/pddf/i2c/utils/pddfparse.py @@ -8,6 +8,7 @@ import sys import time import unicodedata +from sonic_py_common import device_info bmc_cache = {} cache = {} @@ -33,7 +34,7 @@ class PddfParse(): def __init__(self): if not os.path.exists("/usr/share/sonic/platform"): - platform, hwsku = self.get_platform_and_hwsku() + platform, hwsku = device_info.get_platform_and_hwsku() os.symlink("/usr/share/sonic/device/"+platform, "/usr/share/sonic/platform") try: @@ -47,30 +48,6 @@ def __init__(self): self.data_sysfs_obj = {} self.sysfs_obj = {} - # Returns platform and HW SKU - def get_platform_and_hwsku(self): - try: - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], - stdout=subprocess.PIPE, - shell=False, - universal_newlines=True, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - platform = stdout.rstrip('\n') - - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], - stdout=subprocess.PIPE, - shell=False, - universal_newlines=True, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - hwsku = stdout.rstrip('\n') - except OSError as e: - raise OSError("Cannot detect platform") - - return (platform, hwsku) ################################################################################################################### # GENERIC DEFS diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py index f11acf1a209b..66fe58543f51 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py @@ -6,6 +6,7 @@ try: from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + import time except ImportError as e: raise ImportError(str(e) + "- required module not found") diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py index a0fe6a28bf44..b94a66ca469c 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_thermal.py @@ -13,6 +13,7 @@ try: from sonic_platform_base.thermal_base import ThermalBase + import os except ImportError as e: raise ImportError(str(e) + "- required module not found") diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddfapi.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddfapi.py index a4075af87a94..352ad1b1744f 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddfapi.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddfapi.py @@ -6,6 +6,7 @@ import subprocess import time import unicodedata +from sonic_py_common import device_info bmc_cache = {} cache = {} @@ -31,7 +32,7 @@ class PddfApi(): def __init__(self): if not os.path.exists("/usr/share/sonic/platform"): - self.platform, self.hwsku = self.get_platform_and_hwsku() + self.platform, self.hwsku = device_info.get_platform_and_hwsku() os.symlink("/usr/share/sonic/device/"+self.platform, "/usr/share/sonic/platform") try: @@ -44,29 +45,6 @@ def __init__(self): self.data_sysfs_obj = {} self.sysfs_obj = {} - # Returns platform and HW SKU - def get_platform_and_hwsku(self): - try: - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - platform = stdout.rstrip('\n') - - proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - hwsku = stdout.rstrip('\n') - except OSError as e: - raise OSError("Cannot detect platform") - - return (platform, hwsku) - ################################################################################################################# # GENERIC DEFS ################################################################################################################# From 0f6eb29460706457c0a55da2e4b638f85cae21af Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 9 May 2022 10:58:00 -0700 Subject: [PATCH 300/817] [caclmgrd]Added logic to allow BFD port numbers (#10735) * [caclmgrd]Added logic to allow BFD port numbers --- src/sonic-host-services/scripts/caclmgrd | 31 ++++++++++-- .../tests/caclmgrd/caclmgrd_bfd_test.py | 50 +++++++++++++++++++ .../tests/caclmgrd/caclmgrd_dhcp_test.py | 22 ++++---- .../tests/caclmgrd/test_bfd_vectors.py | 29 +++++++++++ 4 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py create mode 100644 src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py diff --git a/src/sonic-host-services/scripts/caclmgrd b/src/sonic-host-services/scripts/caclmgrd index a65f05a34520..914547ad53b2 100755 --- a/src/sonic-host-services/scripts/caclmgrd +++ b/src/sonic-host-services/scripts/caclmgrd @@ -59,6 +59,8 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): ACL_TABLE_TYPE_CTRLPLANE = "CTRLPLANE" + BFD_SESSION_TABLE = "BFD_SESSION_TABLE" + # To specify a port range instead of a single port, use iptables format: # separate start and end ports with a colon, e.g., "1000:2000" ACL_SERVICES = { @@ -87,6 +89,7 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): UPDATE_DELAY_SECS = 0.5 DualToR = False + bfdAllowed = False def __init__(self, log_identifier): super(ControlPlaneAclManager, self).__init__(log_identifier) @@ -170,6 +173,7 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): self.log_error("Error running command '{}'".format(cmd)) elif stdout: return stdout.rstrip('\n') + return "" def parse_int_to_tcp_flags(self, hex_value): tcp_flags_str = "" @@ -705,6 +709,13 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): self.update_thread[namespace] = None return + def allow_bfd_protocol(self, namespace): + iptables_cmds = [] + # Add iptables/ip6tables commands to allow all BFD singlehop and multihop sessions + iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT") + iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT") + self.run_commands(iptables_cmds) + def run(self): # Set select timeout to 1 second SELECT_TIMEOUT_MS = 1000 @@ -730,12 +741,12 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): state_db_id = swsscommon.SonicDBConfig.getDbId("STATE_DB") dhcp_packet_mark_tbl = {} + # set up state_db connector + state_db_connector = swsscommon.DBConnector("STATE_DB", 0) + if self.DualToR: self.log_info("Dual ToR mode") - # set up state_db connector - state_db_connector = swsscommon.DBConnector("STATE_DB", 0) - subscribe_mux_cable = swsscommon.SubscriberStateTable(state_db_connector, self.MUX_CABLE_TABLE) sel.addSelectable(subscribe_mux_cable) @@ -746,6 +757,10 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): for namespace in list(self.config_db_map.keys()): self.setup_dhcp_chain(namespace) + # This should be migrated from state_db BFD session table to feature_table in the future when feature table support gets added for BFD + subscribe_bfd_session = swsscommon.SubscriberStateTable(state_db_connector, self.BFD_SESSION_TABLE) + sel.addSelectable(subscribe_bfd_session) + # Map of Namespace <--> susbcriber table's object config_db_subscriber_table_map = {} @@ -785,6 +800,16 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): db_id = redisSelectObj.getDbConnector().getDbId() if db_id == state_db_id: + while True: + key, op, fvs = subscribe_bfd_session.pop() + if not key: + break + + if op == 'SET' and not self.bfdAllowed: + self.allow_bfd_protocol(namespace) + self.bfdAllowed = True + sel.removeSelectable(subscribe_bfd_session) + if self.DualToR: '''dhcp packet mark update''' while True: diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py new file mode 100644 index 000000000000..358d4c413b9c --- /dev/null +++ b/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py @@ -0,0 +1,50 @@ +import os +import sys +import swsscommon + +from parameterized import parameterized +from sonic_py_common.general import load_module_from_source +from unittest import TestCase, mock +from pyfakefs.fake_filesystem_unittest import patchfs + +from .test_bfd_vectors import CACLMGRD_BFD_TEST_VECTOR +from tests.common.mock_configdb import MockConfigDb +from unittest.mock import MagicMock, patch + +DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' + +class TestCaclmgrdBfd(TestCase): + """ + Test caclmgrd bfd + """ + def setUp(self): + swsscommon.swsscommon.ConfigDBConnector = MockConfigDb + test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + modules_path = os.path.dirname(test_path) + scripts_path = os.path.join(modules_path, "scripts") + sys.path.insert(0, modules_path) + caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') + self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) + + @parameterized.expand(CACLMGRD_BFD_TEST_VECTOR) + @patchfs + def test_caclmgrd_bfd(self, test_name, test_data, fs): + if not os.path.exists(DBCONFIG_PATH): + fs.create_file(DBCONFIG_PATH) # fake database_config.json + + MockConfigDb.set_config_db(test_data["config_db"]) + + with mock.patch("caclmgrd.subprocess") as mocked_subprocess: + popen_mock = mock.Mock() + popen_attrs = test_data["popen_attributes"] + popen_mock.configure_mock(**popen_attrs) + mocked_subprocess.Popen.return_value = popen_mock + mocked_subprocess.PIPE = -1 + + call_rc = test_data["call_rc"] + mocked_subprocess.call.return_value = call_rc + + caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") + caclmgrd_daemon.allow_bfd_protocol('') + mocked_subprocess.Popen.assert_has_calls(test_data["expected_subprocess_calls"], any_order=True) + diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py index 176dec1b5081..a6eae7ba1230 100644 --- a/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py +++ b/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py @@ -10,23 +10,21 @@ from .test_dhcp_vectors import CACLMGRD_DHCP_TEST_VECTOR from tests.common.mock_configdb import MockConfigDb - DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' - -swsscommon.swsscommon.ConfigDBConnector = MockConfigDb -test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -sys.path.insert(0, modules_path) -caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') -caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) - - class TestCaclmgrdDhcp(TestCase): """ Test caclmgrd dhcp """ + def setUp(self): + swsscommon.ConfigDBConnector = MockConfigDb + test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + modules_path = os.path.dirname(test_path) + scripts_path = os.path.join(modules_path, "scripts") + sys.path.insert(0, modules_path) + caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') + self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) + @parameterized.expand(CACLMGRD_DHCP_TEST_VECTOR) @patchfs def test_caclmgrd_dhcp(self, test_name, test_data, fs): @@ -46,7 +44,7 @@ def test_caclmgrd_dhcp(self, test_name, test_data, fs): mark = test_data["mark"] - caclmgrd_daemon = caclmgrd.ControlPlaneAclManager("caclmgrd") + caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") mux_update = test_data["mux_update"] for key,data in mux_update: diff --git a/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py b/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py new file mode 100644 index 000000000000..35340849bd4c --- /dev/null +++ b/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py @@ -0,0 +1,29 @@ +from unittest.mock import call +import subprocess + +""" + caclmgrd bfd test vector +""" +CACLMGRD_BFD_TEST_VECTOR = [ + [ + "BFD_SESSION_TEST", + { + "config_db": { + "DEVICE_METADATA": { + "localhost": { + "subtype": "DualToR", + "type": "ToRRouter", + } + }, + }, + "expected_subprocess_calls": [ + call("iptables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT", shell=True, universal_newlines=True, stdout=subprocess.PIPE), + call("ip6tables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT", shell=True, universal_newlines=True, stdout=subprocess.PIPE) + ], + "popen_attributes": { + 'communicate.return_value': ('output', 'error'), + }, + "call_rc": 0, + } + ] +] From 23f9126f5928423805751f468561477bef31fc85 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Mon, 9 May 2022 14:06:11 -0400 Subject: [PATCH 301/817] [VoQ][config] Multiasic Supervisor card fails to load config_db#.json in chassis when system is reboot (#10106) Supervisor card fails to load config_db#.json in chassis when system reboot. This is an intermittent issue, fixes #10105 --- files/build_templates/docker_image_ctl.j2 | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 81efc39231e9..9e4cb65b7050 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -125,6 +125,34 @@ function setPlatformLagIdBoundaries() docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB SET "SYSTEM_LAG_ID_END" "$lag_id_end" fi } +function waitForAllInstanceDatabaseConfigJsonFilesReady() +{ + if [ ! -z "$DEV" ]; then + cnt=0 + SONIC_DB_GLOBAL_JSON="/var/run/redis/sonic-db/database_global.json" + if [ -f "$SONIC_DB_GLOBAL_JSON" ]; then + # Create a separate python script to get a list of location of all instance database_config.json file + redis_database_cfg_list=`/usr/bin/python -c "import sys; import os; import json; f=open(sys.argv[1]); \ + global_db_dir = os.path.dirname(sys.argv[1]); data=json.load(f); \ + print(\" \".join([os.path.normpath(global_db_dir+'/'+elem['include']) \ + for elem in data['INCLUDES'] if 'namespace' in elem])); f.close()" $SONIC_DB_GLOBAL_JSON` + for file in $redis_database_cfg_list + do + while [ ! -f $file ] + do + sleep 1 + cnt=$(( $cnt + 1)) + if [ $cnt -ge 60 ]; then + echo "Error: $file not found" + break + fi + done + done + fi + fi +} +# delay a second to allow the file to be fully accessible +sleep 1 {%- endif %} function postStartAction() @@ -161,6 +189,11 @@ function postStartAction() else # If there is a config_db.json dump file, load it. if [ -r /etc/sonic/config_db$DEV.json ]; then + + # For multi-asic, all /var/run/redis$DEV/sonic-db/database_config.json need to ready + # for loading config with --write-to-db + waitForAllInstanceDatabaseConfigJsonFilesReady + 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 From 123f20fea3b769fd8e8a54bfe8196b0a86ec2a59 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 9 May 2022 11:51:38 -0700 Subject: [PATCH 302/817] [Arista] Add missing configuration files for linecards (#10749) Why I did it Fixes some pmon errors/warnings by providing missing configuration files How I did it Add missing pcie.yaml and sensors.conf for supported linecards How to verify it pcie-check should pass sensors should display proper sensor names --- .../x86_64-arista_7800r3_48cq2_lc/pcie.yaml | 235 ++++++++++++++++++ .../sensors.conf | 27 ++ .../system_health_monitoring_config.json | 2 +- .../x86_64-arista_7800r3_48cqm2_lc/pcie.yaml | 235 ++++++++++++++++++ .../sensors.conf | 27 ++ .../system_health_monitoring_config.json | 2 +- ...tem_health_monitoring_config_linecard.json | 15 ++ 7 files changed, 541 insertions(+), 2 deletions(-) create mode 100644 device/arista/x86_64-arista_7800r3_48cq2_lc/pcie.yaml create mode 100644 device/arista/x86_64-arista_7800r3_48cqm2_lc/pcie.yaml create mode 100644 device/arista/x86_64-arista_common/system_health_monitoring_config_linecard.json diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/pcie.yaml b/device/arista/x86_64-arista_7800r3_48cq2_lc/pcie.yaml new file mode 100644 index 000000000000..8d7fb1849979 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/pcie.yaml @@ -0,0 +1,235 @@ +- bus: '00' + dev: '00' + fn: '0' + id: '1450' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: '1451' + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O + Memory Management Unit' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '5' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '6' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '02' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '04' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 59)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: '1460' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 0' +- bus: '00' + dev: '18' + fn: '1' + id: '1461' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 1' +- bus: '00' + dev: '18' + fn: '2' + id: '1462' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 2' +- bus: '00' + dev: '18' + fn: '3' + id: '1463' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 3' +- bus: '00' + dev: '18' + fn: '4' + id: '1464' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 4' +- bus: '00' + dev: '18' + fn: '5' + id: '1465' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 5' +- bus: '00' + dev: '18' + fn: '6' + id: '1466' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arista Networks, Inc. Device 0001' +- bus: '04' + dev: '00' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '03' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '05' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '06' + dev: '00' + fn: '0' + id: '8694' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device 8694 (rev 12)' +- bus: '07' + dev: '00' + fn: '0' + id: '0001' + name: 'System peripheral: Arista Networks, Inc. Device 0001 (rev 01)' +- bus: '10' + dev: '00' + fn: '0' + id: '1682' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM57762 Gigabit + Ethernet PCIe (rev 01)' +- bus: '11' + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: '11' + dev: '00' + fn: '2' + id: '1456' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 00h-0fh) Platform Security Processor' +- bus: '11' + dev: '00' + fn: '3' + id: 145f + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Zeppelin USB 3.0 Host + controller' +- bus: '12' + dev: '00' + fn: '0' + id: '1455' + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Renoir PCIe Dummy Function' +- bus: '12' + dev: '00' + fn: '1' + id: '1468' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Zeppelin Cryptographic + Coprocessor NTBCCP' +- bus: '12' + dev: '00' + fn: '2' + id: '7901' + name: 'SATA controller: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI + mode] (rev 51)' +- bus: '12' + dev: '00' + fn: '3' + id: '1457' + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + HD Audio Controller' diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/sensors.conf b/device/arista/x86_64-arista_7800r3_48cq2_lc/sensors.conf index e69de29bb2d1..0cafd27bcf88 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/sensors.conf +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/sensors.conf @@ -0,0 +1,27 @@ +# autogenerated by arista + +bus "i2c-17" "SCD 0000:07:00.0 SMBus master 1 bus 0" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + set temp1_max 90 + set temp1_crit 95 + +chip "tmp464-i2c-17-48" + label temp1 "Center back" + set temp1_max 85 + set temp1_crit 95 + label temp2 "Fap0 core0" + set temp2_max 100 + set temp2_crit 105 + label temp3 "Fap0 core1" + set temp3_max 100 + set temp3_crit 105 + label temp4 "PCIE" + set temp4_max 85 + set temp4_crit 90 + ignore temp5 + ignore temp6 + ignore temp7 + ignore temp8 + ignore temp9 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/system_health_monitoring_config.json b/device/arista/x86_64-arista_7800r3_48cq2_lc/system_health_monitoring_config.json index 1185f771fa8e..035cde619cd9 120000 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/system_health_monitoring_config.json +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/system_health_monitoring_config.json @@ -1 +1 @@ -../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file +../x86_64-arista_common/system_health_monitoring_config_linecard.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/pcie.yaml b/device/arista/x86_64-arista_7800r3_48cqm2_lc/pcie.yaml new file mode 100644 index 000000000000..8d7fb1849979 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/pcie.yaml @@ -0,0 +1,235 @@ +- bus: '00' + dev: '00' + fn: '0' + id: '1450' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: '1451' + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O + Memory Management Unit' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '5' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '6' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '02' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '04' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 59)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: '1460' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 0' +- bus: '00' + dev: '18' + fn: '1' + id: '1461' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 1' +- bus: '00' + dev: '18' + fn: '2' + id: '1462' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 2' +- bus: '00' + dev: '18' + fn: '3' + id: '1463' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 3' +- bus: '00' + dev: '18' + fn: '4' + id: '1464' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 4' +- bus: '00' + dev: '18' + fn: '5' + id: '1465' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 5' +- bus: '00' + dev: '18' + fn: '6' + id: '1466' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arista Networks, Inc. Device 0001' +- bus: '04' + dev: '00' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '03' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '05' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '06' + dev: '00' + fn: '0' + id: '8694' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device 8694 (rev 12)' +- bus: '07' + dev: '00' + fn: '0' + id: '0001' + name: 'System peripheral: Arista Networks, Inc. Device 0001 (rev 01)' +- bus: '10' + dev: '00' + fn: '0' + id: '1682' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM57762 Gigabit + Ethernet PCIe (rev 01)' +- bus: '11' + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: '11' + dev: '00' + fn: '2' + id: '1456' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 00h-0fh) Platform Security Processor' +- bus: '11' + dev: '00' + fn: '3' + id: 145f + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Zeppelin USB 3.0 Host + controller' +- bus: '12' + dev: '00' + fn: '0' + id: '1455' + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Renoir PCIe Dummy Function' +- bus: '12' + dev: '00' + fn: '1' + id: '1468' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Zeppelin Cryptographic + Coprocessor NTBCCP' +- bus: '12' + dev: '00' + fn: '2' + id: '7901' + name: 'SATA controller: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI + mode] (rev 51)' +- bus: '12' + dev: '00' + fn: '3' + id: '1457' + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + HD Audio Controller' diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/sensors.conf b/device/arista/x86_64-arista_7800r3_48cqm2_lc/sensors.conf index e69de29bb2d1..0cafd27bcf88 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/sensors.conf +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/sensors.conf @@ -0,0 +1,27 @@ +# autogenerated by arista + +bus "i2c-17" "SCD 0000:07:00.0 SMBus master 1 bus 0" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + set temp1_max 90 + set temp1_crit 95 + +chip "tmp464-i2c-17-48" + label temp1 "Center back" + set temp1_max 85 + set temp1_crit 95 + label temp2 "Fap0 core0" + set temp2_max 100 + set temp2_crit 105 + label temp3 "Fap0 core1" + set temp3_max 100 + set temp3_crit 105 + label temp4 "PCIE" + set temp4_max 85 + set temp4_crit 90 + ignore temp5 + ignore temp6 + ignore temp7 + ignore temp8 + ignore temp9 diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/system_health_monitoring_config.json b/device/arista/x86_64-arista_7800r3_48cqm2_lc/system_health_monitoring_config.json index 1185f771fa8e..035cde619cd9 120000 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/system_health_monitoring_config.json +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/system_health_monitoring_config.json @@ -1 +1 @@ -../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file +../x86_64-arista_common/system_health_monitoring_config_linecard.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_common/system_health_monitoring_config_linecard.json b/device/arista/x86_64-arista_common/system_health_monitoring_config_linecard.json new file mode 100644 index 000000000000..ea6443556062 --- /dev/null +++ b/device/arista/x86_64-arista_common/system_health_monitoring_config_linecard.json @@ -0,0 +1,15 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "fan", + "psu" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "amber", + "normal": "green", + "booting": "amber_blink" + } +} From 4a5f81dcb8c0f741f650d2f6010a9679ae583d97 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 9 May 2022 12:04:01 -0700 Subject: [PATCH 303/817] [Template]Update template to point to configuration.md in yang-models folder (#10777) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … folder #### Why I did it Update template to point to configuration.md in yang-model folder. --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c02d193fbeb4..62b8d0b2afca 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -42,7 +42,7 @@ pull request for inclusion in the changelog: #### A picture of a cute animal (not mandatory but encouraged) From dc6f3252aa8004ba54fdbb6dfbe4de5fd481e353 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 9 May 2022 12:05:57 -0700 Subject: [PATCH 304/817] Fix calculation of $(1)_DEP_PKGS_SHA in Makefile.cache (#10764) In Makefile.cache, for $(1)_DEP_PKGS_SHA, the intention is to include the DEP_MOD_SHA and MOD_HASH of each of the current package's dependencies. However, there's a level of dereferencing missing; instead of grabbing the value of $(dfile)_DEP_MOD_SHA, it is literally using the variable name $(dfile)_DEP_MOD_SHA. This means that the value of this variable will not change when some dependency changes. The impact of this is in transitive dependencies. For a specific example, if there is some change in sairedis, then sairedis will be rebuilt (because there's a change within that component), and swss will be rebuilt (because it's a direct dependency), but docker-swss-layer-buster will not get rebuilt, because only the direct dependencies are effectively being checked, and those aren't changing. Signed-off-by: Saikrishna Arcot --- Makefile.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.cache b/Makefile.cache index 2a47c9427eb3..50fac768a599 100644 --- a/Makefile.cache +++ b/Makefile.cache @@ -186,7 +186,7 @@ define GET_MOD_DEP_SHA $(if $($(1)_DEP_FILES_MISSING), $(warning "[ DPKG ] Dependecy file(s) are not found for $(1) : $($(1)_DEP_FILES_MISSING))) # Include package dependencies hash values into package hash calculation - $(eval $(1)_DEP_PKGS_SHA := $(foreach dfile,$(1)_MOD_DEP_PKGS,$(dfile)_DEP_MOD_SHA $(dfile)_MOD_HASH)) + $(eval $(1)_DEP_PKGS_SHA := $(foreach dfile,$($(1)_MOD_DEP_PKGS),$($(dfile)_DEP_MOD_SHA) $($(dfile)_MOD_HASH))) $(eval $(1)_DEP_MOD_SHA := $(shell bash -c "git hash-object $($(1)_DEP_MOD_SHA_FILES) && echo $($(1)_DEP_PKGS_SHA)" \ | sha1sum | awk '{print substr($$1,0,23);}')) From f579f61e4cfd1750d3bd01a5fbe6b0a0c8a701fe Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Tue, 10 May 2022 00:47:38 +0530 Subject: [PATCH 305/817] Fix for Accton platform build failure when doing incremental build (#10541) --- platform/broadcom/platform-modules-accton.mk | 2 +- platform/pddf/i2c/debian/control | 3 +++ platform/pddf/i2c/debian/sonic-platform-pddf-sym.install | 1 + platform/pddf/i2c/debian/sonic-platform-pddf-sym.postinst | 2 ++ platform/pddf/platform-modules-pddf.mk | 3 +++ 5 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 platform/pddf/i2c/debian/sonic-platform-pddf-sym.install create mode 100644 platform/pddf/i2c/debian/sonic-platform-pddf-sym.postinst diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 1e2bfdcf82de..85e7ff1f5641 100755 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -44,7 +44,7 @@ export ACCTON_AS7315_27XB_PLATFORM_MODULE_VERSION ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton -$(ACCTON_AS7712_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(ACCTON_AS7712_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(PDDF_PLATFORM_MODULE_SYM) $(ACCTON_AS7712_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7712_32x-r0 SONIC_DPKG_DEBS += $(ACCTON_AS7712_32X_PLATFORM_MODULE) diff --git a/platform/pddf/i2c/debian/control b/platform/pddf/i2c/debian/control index afd96c3d260a..a6056598dd6e 100755 --- a/platform/pddf/i2c/debian/control +++ b/platform/pddf/i2c/debian/control @@ -9,4 +9,7 @@ Package: sonic-platform-pddf Architecture: amd64 Description: kernel modules for platform devices such as psu, fan, sfp, led +Package: sonic-platform-pddf-sym +Architecture: amd64 +Description: PDDF kernel modules symbols which could be used for other platform modules build diff --git a/platform/pddf/i2c/debian/sonic-platform-pddf-sym.install b/platform/pddf/i2c/debian/sonic-platform-pddf-sym.install new file mode 100644 index 000000000000..a655ef1f64e8 --- /dev/null +++ b/platform/pddf/i2c/debian/sonic-platform-pddf-sym.install @@ -0,0 +1 @@ +Module.symvers.PDDF sonic/platform/pddf/i2c diff --git a/platform/pddf/i2c/debian/sonic-platform-pddf-sym.postinst b/platform/pddf/i2c/debian/sonic-platform-pddf-sym.postinst new file mode 100644 index 000000000000..0b34c29eed90 --- /dev/null +++ b/platform/pddf/i2c/debian/sonic-platform-pddf-sym.postinst @@ -0,0 +1,2 @@ +chmod 777 sonic/platform/pddf/i2c/Module.symvers.PDDF +chown $(stat -c "%u:%g" sonic/platform/pddf/i2c) sonic/platform/pddf/i2c/Module.symvers.PDDF diff --git a/platform/pddf/platform-modules-pddf.mk b/platform/pddf/platform-modules-pddf.mk index 5947c1806565..33d97e7fb50e 100644 --- a/platform/pddf/platform-modules-pddf.mk +++ b/platform/pddf/platform-modules-pddf.mk @@ -9,4 +9,7 @@ $(PDDF_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PDDF_PATH)/i2c $(PDDF_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) SONIC_DPKG_DEBS += $(PDDF_PLATFORM_MODULE) +PDDF_PLATFORM_MODULE_SYM = sonic-platform-pddf-sym_$(PDDF_PLATFORM_MODULE_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(PDDF_PLATFORM_MODULE),$(PDDF_PLATFORM_MODULE_SYM))) + SONIC_STRETCH_DEBS += $(PDDF_PLATFORM_MODULE) From d202bf26d7ee8077997e8a1df3bcb3dc5c63377c Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Tue, 10 May 2022 05:45:28 -0400 Subject: [PATCH 306/817] Upgrade mellanox platform containers (syncd / saiserver / syncd-rpc) and pmon to bullseye (#10580) Fixes #9279 - Why I did it Part of larger effort to move all SONiC systems to bullseye - How I did it 1. Update container makefiles with correct dependencies 2. Update container Dockerfile with correct base image 3. Update container Dockerfile with correct apt dependencies 4. Update any other makefiles with dependencies to remove python2 support 5. Minor changes to support bullseye / python3 - How to verify it Run regression on the switch: 1. Verify PTF community tests work 2. Verify syncd runs and all ports come up / pass traffic 3. Verify all platform tests succeed --- dockers/docker-platform-monitor/Dockerfile.j2 | 2 +- platform/mellanox/docker-saiserver-mlnx.mk | 7 ++-- .../docker-saiserver-mlnx/Dockerfile.j2 | 4 +-- platform/mellanox/docker-syncd-mlnx-rpc.mk | 4 +-- .../docker-syncd-mlnx-rpc/Dockerfile.j2 | 31 ++++++++++------- .../docker-syncd-mlnx-rpc/ptf_nn_agent.conf | 2 +- platform/mellanox/docker-syncd-mlnx.mk | 2 +- .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 11 ++++--- platform/mellanox/issu-version.mk | 2 -- platform/mellanox/issu-version/Makefile | 5 --- platform/mellanox/libsaithrift-dev.mk | 7 +--- platform/mellanox/mft.mk | 2 -- platform/mellanox/mft/Makefile | 2 -- platform/template/docker-syncd-bullseye.mk | 33 +++++++++++++++++++ rules/docker-platform-monitor.mk | 10 +++--- rules/lm-sensors.mk | 10 +++--- rules/sonic-ledd.mk | 2 +- rules/sonic-psud.mk | 2 +- rules/sonic-syseepromd.mk | 2 +- rules/sonic-thermalctld.mk | 2 +- rules/sonic-xcvrd.mk | 2 +- sonic-slave-bullseye/Dockerfile.j2 | 4 +++ 22 files changed, 87 insertions(+), 61 deletions(-) create mode 100644 platform/template/docker-syncd-bullseye.mk diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 739933aaf1e5..1e8c28b0682e 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/platform/mellanox/docker-saiserver-mlnx.mk b/platform/mellanox/docker-saiserver-mlnx.mk index d71349a28ae7..74fb96f91d1b 100644 --- a/platform/mellanox/docker-saiserver-mlnx.mk +++ b/platform/mellanox/docker-saiserver-mlnx.mk @@ -20,15 +20,12 @@ DOCKER_SAISERVER_MLNX = docker-saiserver$(SAITHRIFT_VER)-mlnx.gz $(DOCKER_SAISERVER_MLNX)_PATH = $(PLATFORM_PATH)/docker-saiserver-mlnx $(DOCKER_SAISERVER_MLNX)_DEPENDS += $(SAISERVER) $(PYTHON_SDK_API) $(DOCKER_SAISERVER_MLNX)_PYTHON_DEBS += $(MLNX_SFPD) -$(DOCKER_SAISERVER_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_SAISERVER_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) SONIC_DOCKER_IMAGES += $(DOCKER_SAISERVER_MLNX) -SONIC_BUSTER_DOCKERS += $(DOCKER_SAISERVER_MLNX) - $(DOCKER_SAISERVER_MLNX)_CONTAINER_NAME = saiserver$(SAITHRIFT_VER) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SAISERVER_MLNX) $(DOCKER_SAISERVER_MLNX)_RUN_OPT += --privileged -t $(DOCKER_SAISERVER_MLNX)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_SAISERVER_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_SYNCD_BASE)_RUN_OPT += --tmpfs /run/criu - -SONIC_BUSTER_DOCKERS += $(DOCKER_SAISERVER_MLNX) diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index 7ad0355886e3..20f966eb3e83 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -15,7 +15,7 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf @@ -41,7 +41,7 @@ python-debs/{{ deb }}{{' '}} {%- endfor -%} debs/ -RUN apt-get install -y --no-install-recommends libxml2 iptables libbsd0 protobuf-c-compiler protobuf-compiler python-protobuf libprotobuf-c1 python-future python-ipaddr libnet1 pkg-config asciidoc xmlto +RUN apt-get install -y --no-install-recommends libxml2 iptables libbsd0 protobuf-c-compiler protobuf-compiler python3-protobuf libprotobuf-c1 python3-future python3-ipaddr libnet1 pkg-config asciidoc xmlto {{ install_debian_packages(docker_saiserver_mlnx_debs.split(' ')) }} diff --git a/platform/mellanox/docker-syncd-mlnx-rpc.mk b/platform/mellanox/docker-syncd-mlnx-rpc.mk index fb740cdee4e9..9d6ce4bc6f1b 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc.mk +++ b/platform/mellanox/docker-syncd-mlnx-rpc.mk @@ -30,7 +30,7 @@ endif $(DOCKER_SYNCD_MLNX_RPC)_PYTHON_DEBS += $(MLNX_SFPD) $(DOCKER_SYNCD_MLNX_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_MLNX_RPC) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_MLNX_RPC) ifeq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) endif @@ -42,5 +42,3 @@ $(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += --privileged -t $(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += -v /host/warmboot:/var/warmboot - -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_MLNX_RPC) diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 0c93e327d3c5..d10d560110c6 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -24,21 +24,10 @@ RUN mkdir -p /var/run/sx_sdk RUN apt-get purge -y syncd -{% if docker_syncd_mlnx_rpc_debs.strip() -%} -# Copy locally-built Debian package dependencies -{{ copy_files("debs/", docker_syncd_mlnx_rpc_debs.split(' '), "/debs/") }} -{% endif %} - -{% if docker_syncd_mlnx_rpc_pydebs.strip() -%} -# Copy locally-built Debian package dependencies -{{ copy_files("python-debs/", docker_syncd_mlnx_rpc_pydebs.split(' '), "/debs/") }} -{% endif %} - ## Pre-install the fundamental packages RUN apt-get update \ && apt-get -y install \ net-tools \ - python-pip \ python-setuptools \ build-essential \ libssl-dev \ @@ -48,7 +37,22 @@ RUN apt-get update \ cmake \ libqt5core5a \ libqt5network5 \ - libboost-atomic1.71.0 + libboost-atomic1.74.0 + +# Build and install python-scapy +RUN curl http://ftp.us.debian.org/debian/pool/main/s/scapy/python-scapy_2.4.0-2_all.deb --output python-scapy_2.4.0-2_all.deb \ + && dpkg -i python-scapy_2.4.0-2_all.deb \ + && apt install -f + +{% if docker_syncd_mlnx_rpc_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_syncd_mlnx_rpc_debs.split(' '), "/debs/") }} +{% endif %} + +{% if docker_syncd_mlnx_rpc_pydebs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("python-debs/", docker_syncd_mlnx_rpc_pydebs.split(' '), "/debs/") }} +{% endif %} {% if docker_syncd_mlnx_rpc_debs.strip() -%} # Install locally-built Debian packages and implicitly install their dependencies @@ -60,6 +64,9 @@ RUN apt-get update \ {{ install_debian_packages(docker_syncd_mlnx_rpc_pydebs.split(' ')) }} {% endif %} +# Install pip2 since it is no longer in the APT upstream +RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py \ + && python2 get-pip.py RUN wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf b/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf index cd6a7d4db75d..80812464a19e 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf +++ b/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf @@ -1,5 +1,5 @@ [program:ptf_nn_agent] -command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-nn-rcv-buffer=109430400 --set-iface-rcv-buffer=109430400 --set-nn-snd-buffer=109430400 --set-iface-snd-buffer=109430400 +command=/usr/bin/python2 /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-nn-rcv-buffer=109430400 --set-iface-rcv-buffer=109430400 --set-nn-snd-buffer=109430400 --set-iface-snd-buffer=109430400 process_name=ptf_nn_agent stdout_logfile=/tmp/ptf_nn_agent.out.log stderr_logfile=/tmp/ptf_nn_agent.err.log diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index a2e733782b9e..1328d0e0d0dd 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -17,7 +17,7 @@ # docker image for mlnx syncd DOCKER_SYNCD_PLATFORM_CODE = mlnx -include $(PLATFORM_PATH)/../template/docker-syncd-base.mk +include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(MFT) diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index e3487c058b58..70c8795fb9e0 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -15,7 +15,7 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name @@ -29,14 +29,15 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ libxml2 \ - python-pip \ - python-dev \ + python3-pip \ + python3-dev \ + python-is-python3 \ {%- if ENABLE_ASAN == "y" %} libasan5 \ {%- endif %} - python-setuptools + python3-setuptools -RUN pip2 install --upgrade pip +RUN pip3 install --upgrade pip RUN apt-get purge -y python-pip {% if docker_syncd_mlnx_debs.strip() -%} diff --git a/platform/mellanox/issu-version.mk b/platform/mellanox/issu-version.mk index d369ec600236..ee0855c56ced 100644 --- a/platform/mellanox/issu-version.mk +++ b/platform/mellanox/issu-version.mk @@ -19,9 +19,7 @@ ISSU_VERSION_FILE = issu-version $(ISSU_VERSION_FILE)_SRC_PATH = $(PLATFORM_PATH)/issu-version -ifeq ($(BLDENV), buster) $(ISSU_VERSION_FILE)_DEPENDS += $(APPLIBS) -endif SONIC_MAKE_FILES += $(ISSU_VERSION_FILE) diff --git a/platform/mellanox/issu-version/Makefile b/platform/mellanox/issu-version/Makefile index 2578e9ff060b..fbb21af74902 100644 --- a/platform/mellanox/issu-version/Makefile +++ b/platform/mellanox/issu-version/Makefile @@ -19,15 +19,10 @@ SHELL = /bin/bash .SHELLFLAGS += -e MAIN_TARGET = issu-version -BUSTER_FILES_PATH = /sonic/target/files/buster $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : -ifneq (,$(findstring buster,$(DEST))) sx_sdk --version | egrep -o 'ISSU [0-9]+' > $(DEST)/$(MAIN_TARGET) || { echo "ISSU version is undefined: $(sx_sdk --version)" rm $(DEST)/$(MAIN_TARGET) exit 1 } -else - cp $(BUSTER_FILES_PATH)/$(MAIN_TARGET) $(DEST)/$(MAIN_TARGET) -endif diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index 579a41f02a24..4ee241eab4c7 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -20,14 +20,9 @@ SAI_VER = 0.9.4 LIBSAITHRIFT_DEV = libsaithrift$(SAITHRIFT_VER)-dev_$(SAI_VER)_amd64.deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI -ifeq ($(SAITHRIFT_V2),y) -$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT_0_14_1) $(LIBTHRIFT_0_14_1_DEV) $(PYTHON3_THRIFT_0_14_1) $(THRIFT_0_14_1_COMPILER) -$(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT_0_14_1) -$(LIBSAITHRIFT_DEV)_BUILD_ENV = SAITHRIFTV2=true SAITHRIFT_VER=v2 -else $(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) -endif +$(LIBSAITHRIFT_DEV)_BUILD_ENV = SAITHRIFT_VER=v2 # Workaround to use python3 in build $(LIBSAITHRIFT_DEV)_DEPENDS += $(MLNX_SAI) $(MLNX_SAI_DEV) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 981c456906b3..7dc654381f5a 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -25,12 +25,10 @@ MFT = mft_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb $(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft SONIC_MAKE_DEBS += $(MFT) -ifeq ($(BLDENV), bullseye) $(MFT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) KERNEL_MFT = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_amd64.deb $(eval $(call add_derived_package,$(MFT),$(KERNEL_MFT))) -endif MFT_OEM = mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb $(eval $(call add_derived_package,$(MFT),$(MFT_OEM))) diff --git a/platform/mellanox/mft/Makefile b/platform/mellanox/mft/Makefile index ed2fe7b1d1a1..755ef4afc220 100644 --- a/platform/mellanox/mft/Makefile +++ b/platform/mellanox/mft/Makefile @@ -35,7 +35,6 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : wget -O $(MFT_TGZ) http://www.mellanox.com/downloads/MFT/$(MFT_TGZ) tar xzf $(MFT_TGZ) -ifneq (,$(findstring bullseye,$(DEST))) pushd $(MFT_NAME)/SDEBS # put a lock here because dpkg does not allow installing packages in parallel @@ -63,7 +62,6 @@ ifneq (,$(findstring bullseye,$(DEST))) popd rm -rf $(DKMS_TMP) -endif # fix timestamp because we do not actually build tools, only kernel touch $(MFT_NAME)/DEBS/*.deb diff --git a/platform/template/docker-syncd-bullseye.mk b/platform/template/docker-syncd-bullseye.mk new file mode 100644 index 000000000000..d98d351acae5 --- /dev/null +++ b/platform/template/docker-syncd-bullseye.mk @@ -0,0 +1,33 @@ +# docker image for syncd + + +DOCKER_SYNCD_BASE_STEM = docker-syncd-$(DOCKER_SYNCD_PLATFORM_CODE) +DOCKER_SYNCD_BASE = $(DOCKER_SYNCD_BASE_STEM).gz +DOCKER_SYNCD_BASE_DBG = $(DOCKER_SYNCD_BASE_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_SYNCD_BASE)_PATH = $(PLATFORM_PATH)/docker-syncd-$(DOCKER_SYNCD_PLATFORM_CODE) + +$(DOCKER_SYNCD_BASE)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) + +$(DOCKER_SYNCD_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) +$(DOCKER_SYNCD_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_SYNCD_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BASE) +ifneq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BASE) +endif + +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_SYNCD_BASE_DBG) +ifneq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_SYNCD_BASE_DBG) +endif + +$(DOCKER_SYNCD_BASE)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_BASE)_RUN_OPT += --privileged -t +$(DOCKER_SYNCD_BASE)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_BASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_BASE) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_SYNCD_BASE_DBG) + diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 21babbcb49f4..bcfd6000fa00 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -27,13 +27,13 @@ ifeq ($(PDDF_SUPPORT),y) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(PDDF_PLATFORM_API_BASE_PY3) endif -$(DOCKER_PLATFORM_MONITOR)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_PLATFORM_MONITOR)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_PLATFORM_MONITOR)_DBG_DEPENDS += $(LIBSWSSCOMMON_DBG) $(LIBSENSORS_DBG) $(DOCKER_PLATFORM_MONITOR)_DBG_DEPENDS += $(LM_SENSORS_DBG) $(SENSORD_DBG) -$(DOCKER_PLATFORM_MONITOR)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_PLATFORM_MONITOR)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_PLATFORM_MONITOR)_VERSION = 1.0.0 $(DOCKER_PLATFORM_MONITOR)_PACKAGE_NAME = pmon @@ -66,5 +66,5 @@ $(DOCKER_PLATFORM_MONITOR)_BASE_IMAGE_FILES += cmd_wrapper:/usr/sbin/SmartCmd $(DOCKER_PLATFORM_MONITOR)_BASE_IMAGE_FILES += cmd_wrapper:/usr/bin/ethtool $(DOCKER_PLATFORM_MONITOR)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -SONIC_BUSTER_DOCKERS += $(DOCKER_PLATFORM_MONITOR) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_PLATFORM_MONITOR_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_PLATFORM_MONITOR) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_PLATFORM_MONITOR_DBG) diff --git a/rules/lm-sensors.mk b/rules/lm-sensors.mk index 414aeb72b229..b33f7cc3a61c 100644 --- a/rules/lm-sensors.mk +++ b/rules/lm-sensors.mk @@ -1,11 +1,13 @@ # lm-senensors package LM_SENSORS_MAJOR_VERSION = 3 -LM_SENSORS_MINOR_VERSION = 5 +LM_SENSORS_MINOR_VERSION = 6 LM_SENSORS_PATCH_VERSION = 0 +LIBSENSORS_VERSION = 5 + LM_SENSORS_VERSION=$(LM_SENSORS_MAJOR_VERSION).$(LM_SENSORS_MINOR_VERSION).$(LM_SENSORS_PATCH_VERSION) -LM_SENSORS_VERSION_FULL=$(LM_SENSORS_VERSION)-3 +LM_SENSORS_VERSION_FULL=$(LM_SENSORS_VERSION)-7 LM_SENSORS = lm-sensors_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(LM_SENSORS)_SRC_PATH = $(SRC_PATH)/lm-sensors @@ -16,10 +18,10 @@ $(eval $(call add_derived_package,$(LM_SENSORS),$(LM_SENSORS_DBG))) FANCONTROL = fancontrol_$(LM_SENSORS_VERSION_FULL)_all.deb $(eval $(call add_derived_package,$(LM_SENSORS),$(FANCONTROL))) -LIBSENSORS = libsensors$(LM_SENSORS_MINOR_VERSION)_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb +LIBSENSORS = libsensors$(LIBSENSORS_VERSION)_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LM_SENSORS),$(LIBSENSORS))) -LIBSENSORS_DBG = libsensors$(LM_SENSORS_MINOR_VERSION)-dbgsym_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb +LIBSENSORS_DBG = libsensors$(LIBSENSORS_VERSION)-dbgsym_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LM_SENSORS),$(LIBSENSORS_DBG))) SENSORD = sensord_$(LM_SENSORS_VERSION_FULL)_$(CONFIGURED_ARCH).deb diff --git a/rules/sonic-ledd.mk b/rules/sonic-ledd.mk index 1439d2c506b0..6abd3eda11cc 100644 --- a/rules/sonic-ledd.mk +++ b/rules/sonic-ledd.mk @@ -13,7 +13,7 @@ SONIC_PYTHON_WHEELS += $(SONIC_LEDD_PY2) SONIC_LEDD_PY3 = sonic_ledd-1.1-py3-none-any.whl $(SONIC_LEDD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-ledd -$(SONIC_LEDD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_LEDD_PY2) +$(SONIC_LEDD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_LEDD_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(SONIC_LEDD_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_LEDD_PY3) diff --git a/rules/sonic-psud.mk b/rules/sonic-psud.mk index a576be3ea03a..1c878f7e7ecf 100644 --- a/rules/sonic-psud.mk +++ b/rules/sonic-psud.mk @@ -13,7 +13,7 @@ SONIC_PYTHON_WHEELS += $(SONIC_PSUD_PY2) SONIC_PSUD_PY3 = sonic_psud-1.0-py3-none-any.whl $(SONIC_PSUD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-psud -$(SONIC_PSUD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_PSUD_PY2) +$(SONIC_PSUD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_PSUD_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(SONIC_PSUD_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_PSUD_PY3) diff --git a/rules/sonic-syseepromd.mk b/rules/sonic-syseepromd.mk index 03cc20a38f7a..9f1ba5907128 100644 --- a/rules/sonic-syseepromd.mk +++ b/rules/sonic-syseepromd.mk @@ -13,7 +13,7 @@ SONIC_PYTHON_WHEELS += $(SONIC_SYSEEPROMD_PY2) SONIC_SYSEEPROMD_PY3 = sonic_syseepromd-1.0-py3-none-any.whl $(SONIC_SYSEEPROMD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-syseepromd -$(SONIC_SYSEEPROMD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_SYSEEPROMD_PY2) +$(SONIC_SYSEEPROMD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_SYSEEPROMD_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(SONIC_SYSEEPROMD_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_SYSEEPROMD_PY3) diff --git a/rules/sonic-thermalctld.mk b/rules/sonic-thermalctld.mk index a73196e674c0..eb17d3eb1aa1 100644 --- a/rules/sonic-thermalctld.mk +++ b/rules/sonic-thermalctld.mk @@ -13,7 +13,7 @@ SONIC_PYTHON_WHEELS += $(SONIC_THERMALCTLD_PY2) SONIC_THERMALCTLD_PY3 = sonic_thermalctld-1.0-py3-none-any.whl $(SONIC_THERMALCTLD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-thermalctld -$(SONIC_THERMALCTLD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_THERMALCTLD_PY2) +$(SONIC_THERMALCTLD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_THERMALCTLD_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(SONIC_THERMALCTLD_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_THERMALCTLD_PY3) diff --git a/rules/sonic-xcvrd.mk b/rules/sonic-xcvrd.mk index 018363f367fd..a322fbd4e1b3 100644 --- a/rules/sonic-xcvrd.mk +++ b/rules/sonic-xcvrd.mk @@ -13,7 +13,7 @@ SONIC_PYTHON_WHEELS += $(SONIC_XCVRD_PY2) SONIC_XCVRD_PY3 = sonic_xcvrd-1.0-py3-none-any.whl $(SONIC_XCVRD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-xcvrd -$(SONIC_XCVRD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_XCVRD_PY2) $(SONIC_PLATFORM_COMMON_PY3) +$(SONIC_XCVRD_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_XCVRD_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(SONIC_XCVRD_PY3)_PYTHON_VERSION = 3 SONIC_PYTHON_WHEELS += $(SONIC_XCVRD_PY3) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 2d91a3f836c9..f190f0b35e3d 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -65,6 +65,9 @@ RUN apt-get update && apt-get install -y \ dh-exec \ kmod \ libtinyxml2-dev \ + python-all \ + python-dev \ + python-setuptools \ python3 \ python3-pip \ libncurses5-dev \ @@ -74,6 +77,7 @@ RUN apt-get update && apt-get install -y \ devscripts \ git-buildpackage \ perl-modules \ + libclass-accessor-perl \ libswitch-perl \ libzmq5 \ libzmq3-dev \ From 949e76a00fc156fb703d8d342d0429397f03ce16 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 10 May 2022 13:46:31 -0700 Subject: [PATCH 307/817] Update Linux kernel from 5.10.46 to 5.10.103 (#10634) Signed-off-by: Saikrishna Arcot --- build_debian.sh | 2 +- installer/x86_64/install.sh | 4 +-- platform/barefoot/bfn-modules/debian/control | 2 +- .../debian/control | 2 +- .../debian/control | 4 +-- .../sonic-platform-modules-bfn/debian/control | 2 +- .../debian/control | 2 +- platform/broadcom/saibcm-modules-dnx | 2 +- .../broadcom/saibcm-modules/debian/control | 2 +- .../debian/opennsl-modules.dirs | 2 +- .../debian/opennsl-modules.install | 14 +++++----- platform/broadcom/saibcm-modules/debian/rules | 4 +-- .../sonic-platform-modules-cel/debian/control | 8 +++--- .../debian/control | 24 ++++++++-------- .../debian/control | 8 +++--- platform/centec-arm64/sonic_fit.its | 4 +-- .../centec-arm64/tsingma-bsp/debian/control | 2 +- .../tsingma-bsp/debian/tsingma-bsp.install | 28 +++++++++---------- .../debian/control | 4 +-- .../debian/control | 2 +- .../debian/control | 6 ++-- platform/marvell-armhf/platform.conf | 4 +-- rules/linux-kernel.mk | 6 ++-- src/sonic-linux-kernel | 2 +- 24 files changed, 70 insertions(+), 70 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index d99ba9d877ad..1e05f33ea350 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -33,7 +33,7 @@ CONFIGURED_ARCH=$([ -f .arch ] && cat .arch || echo amd64) ## docker engine version (with platform) DOCKER_VERSION=5:20.10.14~3-0~debian-$IMAGE_DISTRO CONTAINERD_IO_VERSION=1.5.11-1 -LINUX_KERNEL_VERSION=5.10.0-8-2 +LINUX_KERNEL_VERSION=5.10.0-12-2 ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 4411e74edab0..f41a671543e8 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -679,13 +679,13 @@ menuentry '$demo_grub_entry' { if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_msdos insmod ext2 - linux /$image_dir/boot/vmlinuz-5.10.0-8-2-amd64 root=$grub_cfg_root rw $GRUB_CMDLINE_LINUX \ + linux /$image_dir/boot/vmlinuz-5.10.0-12-2-amd64 root=$grub_cfg_root rw $GRUB_CMDLINE_LINUX \ net.ifnames=0 biosdevname=0 \ loop=$image_dir/$FILESYSTEM_SQUASHFS loopfstype=squashfs \ systemd.unified_cgroup_hierarchy=0 \ apparmor=1 security=apparmor varlog_size=$VAR_LOG_SIZE usbcore.autosuspend=-1 $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX echo 'Loading $demo_volume_label $demo_type initial ramdisk ...' - initrd /$image_dir/boot/initrd.img-5.10.0-8-2-amd64 + initrd /$image_dir/boot/initrd.img-5.10.0-12-2-amd64 } EOF diff --git a/platform/barefoot/bfn-modules/debian/control b/platform/barefoot/bfn-modules/debian/control index 9023bdd63474..20b3a60600bc 100644 --- a/platform/barefoot/bfn-modules/debian/control +++ b/platform/barefoot/bfn-modules/debian/control @@ -7,6 +7,6 @@ Standards-Version: 3.9.3 Package: bfn-modules Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for bfn asic for mmap diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/debian/control b/platform/barefoot/sonic-platform-modules-bfn-montara/debian/control index 5c5d58b9bd53..1976ad4f483e 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/debian/control +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/debian/control @@ -7,6 +7,6 @@ Standards-Version: 3.9.3 Package: sonic-platform-modules-bfn-montara Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/debian/control b/platform/barefoot/sonic-platform-modules-bfn-newport/debian/control index 9663cc3f644a..43c4280447d6 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/debian/control +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/debian/control @@ -7,11 +7,11 @@ Standards-Version: 3.9.3 Package: sonic-platform-modules-bfn-newport-as9516 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel module for bfn platform fpga and scripts for the devices such as fan, led, sfp Package: sonic-platform-modules-bfn-newport-as9516bf Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel module for bfn platform fpga and scripts for the devices such as fan, led, sfp diff --git a/platform/barefoot/sonic-platform-modules-bfn/debian/control b/platform/barefoot/sonic-platform-modules-bfn/debian/control index de1a22fdb1b5..1cc22bb4684f 100644 --- a/platform/barefoot/sonic-platform-modules-bfn/debian/control +++ b/platform/barefoot/sonic-platform-modules-bfn/debian/control @@ -7,6 +7,6 @@ Standards-Version: 3.9.3 Package: sonic-platform-modules-bfn Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/barefoot/sonic-platform-modules-wnc-osw1800/debian/control b/platform/barefoot/sonic-platform-modules-wnc-osw1800/debian/control index bed8117da850..6449aecd5a9e 100644 --- a/platform/barefoot/sonic-platform-modules-wnc-osw1800/debian/control +++ b/platform/barefoot/sonic-platform-modules-wnc-osw1800/debian/control @@ -7,6 +7,6 @@ Standards-Version: 3.9.3 Package: platform-modules-wnc-osw1800 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/saibcm-modules-dnx b/platform/broadcom/saibcm-modules-dnx index fb4cf12529bc..8771baa40be8 160000 --- a/platform/broadcom/saibcm-modules-dnx +++ b/platform/broadcom/saibcm-modules-dnx @@ -1 +1 @@ -Subproject commit fb4cf12529bc27fffc1c988029f4db100138f133 +Subproject commit 8771baa40be8392c2cf662648fc166929efa4b64 diff --git a/platform/broadcom/saibcm-modules/debian/control b/platform/broadcom/saibcm-modules/debian/control index 37cf1213432e..341033b9fdfd 100644 --- a/platform/broadcom/saibcm-modules/debian/control +++ b/platform/broadcom/saibcm-modules/debian/control @@ -10,5 +10,5 @@ Standards-Version: 3.9.3 Package: opennsl-modules Architecture: amd64 Section: main -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for broadcom SAI diff --git a/platform/broadcom/saibcm-modules/debian/opennsl-modules.dirs b/platform/broadcom/saibcm-modules/debian/opennsl-modules.dirs index 2b3124646272..23d2a41500e5 100644 --- a/platform/broadcom/saibcm-modules/debian/opennsl-modules.dirs +++ b/platform/broadcom/saibcm-modules/debian/opennsl-modules.dirs @@ -1 +1 @@ -lib/modules/5.10.0-8-2-amd64/extra +lib/modules/5.10.0-12-2-amd64/extra diff --git a/platform/broadcom/saibcm-modules/debian/opennsl-modules.install b/platform/broadcom/saibcm-modules/debian/opennsl-modules.install index c739b6a5fc40..87a1453c12ac 100644 --- a/platform/broadcom/saibcm-modules/debian/opennsl-modules.install +++ b/platform/broadcom/saibcm-modules/debian/opennsl-modules.install @@ -1,8 +1,8 @@ -systems/linux/user/x86-smp_generic_64-2_6/linux-bcm-knet.ko lib/modules/5.10.0-8-2-amd64/extra -systems/linux/user/x86-smp_generic_64-2_6/linux-kernel-bde.ko lib/modules/5.10.0-8-2-amd64/extra -systems/linux/user/x86-smp_generic_64-2_6/linux-user-bde.ko lib/modules/5.10.0-8-2-amd64/extra -systems/linux/user/x86-smp_generic_64-2_6/linux-knet-cb.ko lib/modules/5.10.0-8-2-amd64/extra +systems/linux/user/x86-smp_generic_64-2_6/linux-bcm-knet.ko lib/modules/5.10.0-12-2-amd64/extra +systems/linux/user/x86-smp_generic_64-2_6/linux-kernel-bde.ko lib/modules/5.10.0-12-2-amd64/extra +systems/linux/user/x86-smp_generic_64-2_6/linux-user-bde.ko lib/modules/5.10.0-12-2-amd64/extra +systems/linux/user/x86-smp_generic_64-2_6/linux-knet-cb.ko lib/modules/5.10.0-12-2-amd64/extra systemd/opennsl-modules.service lib/systemd/system -sdklt/linux/bde/linux_ngbde.ko lib/modules/5.10.0-8-2-amd64/extra -sdklt/linux/knet/linux_ngknet.ko lib/modules/5.10.0-8-2-amd64/extra -sdklt/linux/knetcb/linux_ngknetcb.ko lib/modules/5.10.0-8-2-amd64/extra +sdklt/linux/bde/linux_ngbde.ko lib/modules/5.10.0-12-2-amd64/extra +sdklt/linux/knet/linux_ngknet.ko lib/modules/5.10.0-12-2-amd64/extra +sdklt/linux/knetcb/linux_ngknetcb.ko lib/modules/5.10.0-12-2-amd64/extra diff --git a/platform/broadcom/saibcm-modules/debian/rules b/platform/broadcom/saibcm-modules/debian/rules index b092d3d0c635..e013317233bc 100755 --- a/platform/broadcom/saibcm-modules/debian/rules +++ b/platform/broadcom/saibcm-modules/debian/rules @@ -34,8 +34,8 @@ sname:=opennsl PACKAGE=opennsl-modules # modifieable for experiments or debugging m-a MA_DIR ?= /usr/share/modass -KVERSION ?= 5.10.0-8-2-amd64 -KERNVERSION ?= 5.10.0-8-2 +KVERSION ?= 5.10.0-12-2-amd64 +KERNVERSION ?= 5.10.0-12-2 # load generic variable handling -include $(MA_DIR)/include/generic.make diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/control b/platform/broadcom/sonic-platform-modules-cel/debian/control index 48ae0ed83735..605a3cd0a834 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/control +++ b/platform/broadcom/sonic-platform-modules-cel/debian/control @@ -7,21 +7,21 @@ Standards-Version: 3.9.3 Package: platform-modules-dx010 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-haliburton Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-seastone2 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as led, sfp Package: platform-modules-silverstone Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as led, sfp. diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/control b/platform/broadcom/sonic-platform-modules-dell/debian/control index da3f2da58625..b16a3d790462 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/control +++ b/platform/broadcom/sonic-platform-modules-dell/debian/control @@ -7,60 +7,60 @@ Standards-Version: 3.9.3 Package: platform-modules-s6000 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-z9100 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s6100 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-z9264f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s5212f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s5224f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s5232f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s5248f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-n3248te Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-z9332f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-n3248pxe Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-s5296f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/centec-arm64/sonic-platform-modules-e530/debian/control b/platform/centec-arm64/sonic-platform-modules-e530/debian/control index 2e8becc2c718..5b9903c28bb3 100644 --- a/platform/centec-arm64/sonic-platform-modules-e530/debian/control +++ b/platform/centec-arm64/sonic-platform-modules-e530/debian/control @@ -7,20 +7,20 @@ Standards-Version: 3.9.3 Package: platform-modules-e530-48t4x-p Architecture: arm64 -Depends: linux-image-5.10.0-8-2-arm64-unsigned +Depends: linux-image-5.10.0-12-2-arm64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-e530-24x2c Architecture: arm64 -Depends: linux-image-5.10.0-8-2-arm64-unsigned +Depends: linux-image-5.10.0-12-2-arm64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-e530-48s4x Architecture: arm64 -Depends: linux-image-5.10.0-8-2-arm64-unsigned +Depends: linux-image-5.10.0-12-2-arm64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-e530-24x2q Architecture: arm64 -Depends: linux-image-5.10.0-8-2-arm64-unsigned +Depends: linux-image-5.10.0-12-2-arm64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/centec-arm64/sonic_fit.its b/platform/centec-arm64/sonic_fit.its index 71b013ab3221..ef59411b653e 100644 --- a/platform/centec-arm64/sonic_fit.its +++ b/platform/centec-arm64/sonic_fit.its @@ -12,7 +12,7 @@ images { kernel_ctc { description = "ARM64 Kernel"; - data = /incbin/("./vmlinuz-5.10.0-8-2-arm64"); + data = /incbin/("./vmlinuz-5.10.0-12-2-arm64"); type = "kernel"; arch = "arm64"; os = "linux"; @@ -25,7 +25,7 @@ }; initramfs { description = "initramfs"; - data = /incbin/("./initrd.img-5.10.0-8-2-arm64"); + data = /incbin/("./initrd.img-5.10.0-12-2-arm64"); type = "ramdisk"; arch = "arm64"; os = "linux"; diff --git a/platform/centec-arm64/tsingma-bsp/debian/control b/platform/centec-arm64/tsingma-bsp/debian/control index 9be7aa41d47e..6710cf311551 100644 --- a/platform/centec-arm64/tsingma-bsp/debian/control +++ b/platform/centec-arm64/tsingma-bsp/debian/control @@ -7,5 +7,5 @@ Standards-Version: 3.9.3 Package: tsingma-bsp Architecture: arm64 -Depends: linux-image-5.10.0-8-2-arm64-unsigned +Depends: linux-image-5.10.0-12-2-arm64-unsigned Description: kernel modules for tsingma bsp diff --git a/platform/centec-arm64/tsingma-bsp/debian/tsingma-bsp.install b/platform/centec-arm64/tsingma-bsp/debian/tsingma-bsp.install index ea3262bff452..64fdb498e0bd 100644 --- a/platform/centec-arm64/tsingma-bsp/debian/tsingma-bsp.install +++ b/platform/centec-arm64/tsingma-bsp/debian/tsingma-bsp.install @@ -1,17 +1,17 @@ -src/ctc5236-mc/ctc5236-mc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/pwm-ctc/pwm-ctc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ctc5236_switch/ctc5236_switch.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/pinctrl-ctc/pinctrl-ctc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ctc_wdt/ctc_wdt.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ctcmac/ctcmac.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ctcmac/ctc5236_mdio.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ctc-phy/mars.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/i2c-ctc/i2c-ctc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/gpio-ctc/gpio-ctc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/ehci-ctc/ehci-ctc.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/rtc-sd2405/rtc-sd2405.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/sdhci-ctc5236/sdhci-ctc5236.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra -src/spi-ctc-qspi/spi-ctc-qspi.ko /lib/modules/5.10.0-8-2-arm64/kernel/extra +src/ctc5236-mc/ctc5236-mc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/pwm-ctc/pwm-ctc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ctc5236_switch/ctc5236_switch.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/pinctrl-ctc/pinctrl-ctc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ctc_wdt/ctc_wdt.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ctcmac/ctcmac.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ctcmac/ctc5236_mdio.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ctc-phy/mars.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/i2c-ctc/i2c-ctc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/gpio-ctc/gpio-ctc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/ehci-ctc/ehci-ctc.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/rtc-sd2405/rtc-sd2405.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/sdhci-ctc5236/sdhci-ctc5236.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra +src/spi-ctc-qspi/spi-ctc-qspi.ko /lib/modules/5.10.0-12-2-arm64/kernel/extra src/ctc-dts/e530-ctc5236.dtb /boot/ src/config/fw_env.config /etc/ src/config/tsingma-bsp.service /lib/systemd/system diff --git a/platform/centec/sonic-platform-modules-e582/debian/control b/platform/centec/sonic-platform-modules-e582/debian/control index cfd5e45d891c..3ae51924f155 100644 --- a/platform/centec/sonic-platform-modules-e582/debian/control +++ b/platform/centec/sonic-platform-modules-e582/debian/control @@ -7,11 +7,11 @@ Standards-Version: 3.9.3 Package: platform-modules-e582-48x2q4z Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-e582-48x6q Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/centec/sonic-platform-modules-embedway/debian/control b/platform/centec/sonic-platform-modules-embedway/debian/control index 1e51f7bc05c9..0292565ecca5 100644 --- a/platform/centec/sonic-platform-modules-embedway/debian/control +++ b/platform/centec/sonic-platform-modules-embedway/debian/control @@ -7,6 +7,6 @@ Standards-Version: 3.9.3 Package: platform-modules-embedway-es6220 Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/centec/sonic-platform-modules-v682/debian/control b/platform/centec/sonic-platform-modules-v682/debian/control index 3460d4b00ba5..d4101a48d2cb 100644 --- a/platform/centec/sonic-platform-modules-v682/debian/control +++ b/platform/centec/sonic-platform-modules-v682/debian/control @@ -7,15 +7,15 @@ Standards-Version: 3.9.3 Package: platform-modules-v682-48y8c-d Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-v682-48y8c Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-v682-48x8c Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index 0ef500e16e4f..6dd8e238f98e 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -11,8 +11,8 @@ fdt_high=0x10fffff initrd_addr=0x2000000 VAR_LOG=512 -kernel_fname="/boot/vmlinuz-5.10.0-8-2-armmp" -initrd_fname="/boot/initrd.img-5.10.0-8-2-armmp" +kernel_fname="/boot/vmlinuz-5.10.0-12-2-armmp" +initrd_fname="/boot/initrd.img-5.10.0-12-2-armmp" fdt_fname="/boot/armada-385-ET6448M_4G_Nand.dtb" if [ "$install_env" = "onie" ]; then diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index b8fb093dd318..b51c4d12d05f 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -1,9 +1,9 @@ # linux kernel package -KVERSION_SHORT = 5.10.0-8-2 +KVERSION_SHORT = 5.10.0-12-2 KVERSION = $(KVERSION_SHORT)-$(CONFIGURED_ARCH) -KERNEL_VERSION = 5.10.46 -KERNEL_SUBVERSION = 4 +KERNEL_VERSION = 5.10.103 +KERNEL_SUBVERSION = 1 ifeq ($(CONFIGURED_ARCH), armhf) # Override kernel version for ARMHF as it uses arm MP (multi-platform) for short version KVERSION = $(KVERSION_SHORT)-armmp diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 10ef3904d940..b9083b1a271e 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 10ef3904d9401954b66915b7f5466e3f7591e7fb +Subproject commit b9083b1a271e63757bef4fcd914ed524bd3c35c9 From 04175eb34ab10b861281476d59ea49f15a553da3 Mon Sep 17 00:00:00 2001 From: rajendra-dendukuri <47423477+rajendra-dendukuri@users.noreply.github.com> Date: Wed, 11 May 2022 02:25:06 -0400 Subject: [PATCH 308/817] SONiC Yang model support for Kdump (#10786) #### Why I did it Created SONiC Yang model for Kdump Tables: KDUMP #### How I did it Defined Yang models for NAT based on Guideline doc: https://github.com/Azure/SONiC/blob/master/doc/mgmt/SONiC_YANG_Model_Guidelines.md and https://github.com/Azure/sonic-utilities/blob/master/doc/Command-Reference.md #### How to verify it Added test cases to verify it. --- src/sonic-yang-models/doc/Configuration.md | 15 +++++ src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 10 +++- .../tests/yang_model_tests/tests/kdump.json | 19 ++++++ .../yang_model_tests/tests_config/kdump.json | 57 ++++++++++++++++++ .../yang-models/sonic-kdump.yang | 60 +++++++++++++++++++ 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/kdump.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/kdump.json create mode 100644 src/sonic-yang-models/yang-models/sonic-kdump.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index b5890681ce41..9a8f2a9fe285 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -25,6 +25,7 @@ Table of Contents * [Device neighbor metada](#device-neighbor-metada) * [DSCP_TO_TC_MAP](#dscp_to_tc_map) * [FLEX_COUNTER_TABLE](#flex_counter_table) + * [KDUMP](#kdump) * [L2 Neighbors](#l2-neighbors) * [Loopback Interface](#loopback-interface) * [LOSSLESS_TRAFFIC_PATTERN](#LOSSLESS_TRAFFIC_PATTERN) @@ -861,6 +862,20 @@ instance is supported in SONiC. ``` +### KDUMP + +``` +{ + "KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:256M,4G-8G:384M,8G-:448M" + } + } +} + +``` ### L2 Neighbors diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 2b55946cc144..1298b768bafb 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -105,6 +105,7 @@ def run(self): './yang-models/sonic-flex_counter.yang', './yang-models/sonic-feature.yang', './yang-models/sonic-interface.yang', + './yang-models/sonic-kdump.yang', './yang-models/sonic-loopback-interface.yang', './yang-models/sonic-mgmt_interface.yang', './yang-models/sonic-mgmt_port.yang', @@ -164,6 +165,7 @@ def run(self): './cvlyang-models/sonic-flex_counter.yang', './cvlyang-models/sonic-feature.yang', './cvlyang-models/sonic-interface.yang', + './cvlyang-models/sonic-kdump.yang', './cvlyang-models/sonic-loopback-interface.yang', './cvlyang-models/sonic-mgmt_interface.yang', './cvlyang-models/sonic-mgmt_port.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index a214560de759..5af414359b29 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1792,7 +1792,15 @@ "rrclient": "0", "admin_status": "up" } - } + }, + + "KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:256M,4G-8G:384M,8G-:448M" + } + } }, "SAMPLE_CONFIG_DB_UNKNOWN": { "UNKNOWN_TABLE": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/kdump.json b/src/sonic-yang-models/tests/yang_model_tests/tests/kdump.json new file mode 100644 index 000000000000..29f026133527 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/kdump.json @@ -0,0 +1,19 @@ +{ + "KDUMP_WITH_VALID_VALUES": { + "desc": "Configuring the kdump with valid values." + }, + "KDUMP_WITH_VALID_VALUES_2": { + "desc": "Configuring the kdump with valid values." + }, + "KDUMP_WITH_VALID_VALUES_3": { + "desc": "Configuring the kdump with valid values." + }, + "KDUMP_WITH_INVALID_NUM_DUMPS": { + "desc": "Configuring kdump config with a invalid number of allowed kdumps.", + "eStr": ["pattern", "does not satisfy"] + }, + "KDUMP_WITH_INVALID_MEMORY": { + "desc": "Configuring kdump config with invalid memory config.", + "eStr": ["pattern", "does not satisfy"] + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/kdump.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/kdump.json new file mode 100644 index 000000000000..fe31148f50ae --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/kdump.json @@ -0,0 +1,57 @@ +{ + "KDUMP_WITH_VALID_VALUES": { + "sonic-kdump:sonic-kdump": { + "sonic-kdump:KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:256M,4G-8G:384M,8G-:448M" + } + } + } + }, + "KDUMP_WITH_VALID_VALUES_2": { + "sonic-kdump:sonic-kdump": { + "sonic-kdump:KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "9", + "memory": "512M" + } + } + } + }, + "KDUMP_WITH_VALID_VALUES_3": { + "sonic-kdump:sonic-kdump": { + "sonic-kdump:KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "1", + "memory": "512M" + } + } + } + }, + "KDUMP_WITH_INVALID_NUM_DUMPS": { + "sonic-kdump:sonic-kdump": { + "sonic-kdump:KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "100", + "memory": "0M-2G:256M,2G-4G:256M,4G-8G:384M,8G-:448M" + } + } + } + }, + "KDUMP_WITH_INVALID_MEMORY": { + "sonic-kdump:sonic-kdump": { + "sonic-kdump:KDUMP": { + "config": { + "enabled": "true", + "num_dumps": "3", + "memory": "666" + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-kdump.yang b/src/sonic-yang-models/yang-models/sonic-kdump.yang new file mode 100644 index 000000000000..c7640ee0c754 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-kdump.yang @@ -0,0 +1,60 @@ +module sonic-kdump { + namespace "http://github.com/Azure/sonic-kdump"; + prefix kdump; + yang-version 1.1; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "This module contains a collection of YANG definitions for the + Linux Kernel crash dumping (Kdump) mechanism. The Kdump feature + is used to detect and record Linux kernel crash events."; + + revision 2022-05-09 { + description + "Initial revision."; + } + + container sonic-kdump { + container KDUMP { + description + "Kdump configuration parameters"; + container config { + description "Top level grouping for attributes for Kdump."; + leaf enabled { + type boolean; + description + "Enable or Disable the Kdump mechanism"; + } + + leaf memory { + type string { + pattern "(((([0-9]+[MG])?(-([0-9]+[MG])?):)?[0-9]+[MG],?)+)"; + } + description + "Memory reserved for loading the crash handler kernel. The amount + of reserved memory can be variable, depending on the total amount + of installed memory. The syntax for variable memory reservation is + :,:. For example, 512M-2G:64M,2G-:128M, + where a memory of 64MB is reserved for the crash kernel for systems + with installed memory between 512MB and 2GB, 128MB is reserved for + systems that have more than 2GB installed memory. An absolute memory + value can also be specified in the format M or G. + For example, 512M."; + } + + leaf num_dumps { + type uint8 { + range "1 .. 9"; + } + description + "Maximum number of Kernel Core files Stored"; + } + } + } + } +} From dee7655526699e3f66bf3744e098f03203345449 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Wed, 11 May 2022 13:07:04 -0400 Subject: [PATCH 309/817] [reboiot-cause] Fix a broken symlink of previous-reboot-cause file removal issue (#10751) Signed-off-by: mlok --- src/sonic-host-services/scripts/determine-reboot-cause | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-host-services/scripts/determine-reboot-cause b/src/sonic-host-services/scripts/determine-reboot-cause index 1408ad0e2952..21b13d86aad8 100755 --- a/src/sonic-host-services/scripts/determine-reboot-cause +++ b/src/sonic-host-services/scripts/determine-reboot-cause @@ -174,7 +174,7 @@ def main(): os.makedirs(REBOOT_CAUSE_DIR) # Remove stale PREVIOUS_REBOOT_CAUSE_FILE if it exists - if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE): + if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE) or os.path.islink(PREVIOUS_REBOOT_CAUSE_FILE): os.remove(PREVIOUS_REBOOT_CAUSE_FILE) # This variable is kept for future-use purpose. When proc_cmd_line/vendor/software provides From 9887e76ca2aa85424b531267ba43c84b99640a58 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 12 May 2022 12:36:59 +0800 Subject: [PATCH 310/817] [submodule] Advance sonic-utilities pointer (#10670) 288c2d8 Revert "[scripts/fast-reboot] Shutdown remaining containers through systemd (#2133)" (#2161) bce4694 [autoneg] add support for remote speed advertisement (#2124) a73f156 [show][vrf]Fixing show vrf to include vlan subinterface (#2158) 7a06457 [auto_ts] Enable register/de-register auto_ts config for APP Extension (#2139) 083ebcc Add transceiver-info items advertised for cmis-supported moddules (#2135) 0811214 Validate destination port is not LAG (#2053) 6ab1c51 [minigraph] Consume golden_config_db.json while loading minigraph (#2140) c37a957 [Kdump] Remove the duplicate logic if Kdump was disabled (#2128) 1143869 Ordering fix for sfpshow eeprom (#2113) fdb79b8 Allow fw update for other boot type against on the previous "none" boot fw update (#2040) a54a091 [GCU] Supressing YANG errors from libyang while sorting (#1991) fbfa8bc [GCU] Enabling AddRack and adding RemoveRack tests (#2143) d012be9 [Command-Reference] Add CLI docs for route flow counter (#2069) 8c07d59 [Mellanox] [reboot] [asan] stop asan-enabled containers on reboot (#2107) 697aae3 Fix speed parsing when speed is NOT fetched from APPL_DB (#2138) 22a388b [show] fix get routing stack routine (#2137) cb3a047 Support option --ports of config qos reload for reloading ports' QoS and buffer configuration to default (#2125) 154a801 Enhance "config interface type/advertised-type" to be blocked on RJ45 ports (#2112) 3732ac5 Add CLI for route flow counter feature (#2031) 29771e7 [techsupport] improve robustness (#2117) f9dc681 [intfutil] Display RJ45 port and portchannel speed in 'M' instead of 'G' when it's <= 1000M (#2110) 781ae9f [config] Do not enable pfcwd for BmcMgmtToRRouter (#2136) 23e9398 [scripts/fast-reboot] Shutdown remaining containers through systemd (#2133) 576c9ef [scripts/fast-reboot] stop timers in advance (#2131) 4dad79c bugfix: incorrect command for portchannel creation (#2134) c17b1f4 [show][muxcable] Decrease the timeout for show mux status/hwmode (#2130) 49d61f8 [scripts/fast-reboot] cleanup (#2132) 52ca324 [config/config_mgmt.py]: Fix dpb issue with upper case mac in (#2066) 9e2fbf4 Update db_migrator to support `pfcwd_sw_enable` (#2087) 4010bd0 FGNHG CLI changes (#1588) 6bd54d0 Fix 'show mac' output when FDB entry for default vlan is None instead of 1 (#2126) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index f70dc27827a8..288c2d8d9328 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit f70dc27827a88d70e91e15ecdcde2ebbc446116d +Subproject commit 288c2d8d932899c71c34d360983cee640a9694fd From 992d233090e120bd503b3ee6dde5828aec18674f Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 12 May 2022 13:21:25 +0800 Subject: [PATCH 311/817] Add pool: sonictest-sonic-t0 (#10635) Signed-off-by: Ze Gan Existing pools cannot test MACsec scenario, So I add sonictest-sonic-t0 pool that can run MACsec testcases. --- .azure-pipelines/run-test-template.yml | 5 ++++- azure-pipelines.yml | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index 2ab707287c7c..2a75d1bc32dc 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -7,6 +7,9 @@ parameters: type: string - name: ptf_name type: string +- name: vmtype + type: string + default: 'ceos' - name: section type: string default: '' @@ -41,7 +44,7 @@ steps: git reset --hard origin/master sed -i s/use_own_value/${username}/ ansible/veos_vtb echo aaa > ansible/password.txt - docker exec sonic-mgmt bash -c "pushd /data/sonic-mgmt/ansible;./testbed-cli.sh -d /data/sonic-vm -m $(inventory) -t $(testbed_file) -k ceos refresh-dut ${{ parameters.tbname }} password.txt" && sleep 180 + docker exec sonic-mgmt bash -c "pushd /data/sonic-mgmt/ansible;./testbed-cli.sh -d /data/sonic-vm -m $(inventory) -t $(testbed_file) -k ${{ parameters.vmtype }} refresh-dut ${{ parameters.tbname }} password.txt" && sleep 180 displayName: "Setup testbed" - script: | diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f44704592c9b..7936f8f4f6f2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -193,3 +193,17 @@ stages: tbname: vms-kvm-t1-lag ptf_name: ptf_vms6-2 tbtype: t1-lag + + - job: + pool: sonictest-sonic-t0 + displayName: "kvmtest-t0-sonic" + timeoutInMinutes: 360 + + steps: + - template: .azure-pipelines/run-test-template.yml + parameters: + dut: vlab-02 + tbname: vms-kvm-t0-64-32 + ptf_name: ptf_vms6-1 + tbtype: t0-sonic + vmtype: vsonic From f4b22f67a419ce7e8ac346fe262a5dde8a78aa77 Mon Sep 17 00:00:00 2001 From: Arun Saravanan Balachandran <52521751+ArunSaravananBalachandran@users.noreply.github.com> Date: Thu, 12 May 2022 20:41:02 +0530 Subject: [PATCH 312/817] [initramfs]: SSD firmware upgrade in initramfs (#10748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it To upgrade SSD firmware in initramfs while rebooting from SONiC to SONiC and during NOS to SONiC migration. How I did it New option 'ssd-upgrader-part’ is introduced in grub command line, to indicate the partition and its filesystem type in which the SSD firmware updater is present. ‘ssd-upgrader-part’ syntax is ssd-upgrader-part=,. Example: ssd-upgrader-part=/dev/sda8,ext4 A new initramfs script ‘ssd-upgrade’ is included in init-premount and it invokes the SSD firmware updater (ssd-fw-upgrade) present in the partition indicated by the boot option 'ssd-upgrader-part' How to verify it In SONiC, the SSD firmware updater is copied to “/host/” directory. Fast-reboot is to be initiated with the ‘-u’ option ([scripts/fast-reboot] Add option to include ssd-upgrader-part boot option with SONiC partition sonic-utilities#2150) After reboot, while booting into SONiC the SSD firmware updater will be executed in initramfs. --- build_debian.sh | 4 ++++ files/image_config/platform/rc.local | 3 +++ files/initramfs-tools/ssd-upgrade | 35 ++++++++++++++++++++++++++++ files/initramfs-tools/union-mount.j2 | 5 ++++ 4 files changed, 47 insertions(+) create mode 100644 files/initramfs-tools/ssd-upgrade diff --git a/build_debian.sh b/build_debian.sh index 1e05f33ea350..676c0298ec7d 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -189,6 +189,10 @@ sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista- sudo cp files/initramfs-tools/resize-rootfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/resize-rootfs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/resize-rootfs +# Hook into initramfs: upgrade SSD from initramfs +sudo cp files/initramfs-tools/ssd-upgrade $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ssd-upgrade +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ssd-upgrade + # Hook into initramfs: run fsck to repair a non-clean filesystem prior to be mounted sudo cp files/initramfs-tools/fsck-rootfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/fsck-rootfs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/fsck-rootfs diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 7043da9fe143..647d552427ac 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -114,6 +114,9 @@ migrate_nos_configuration() # remove nos-config-part from cmdline sed -r -i.bak "s/nos-config-part=[^[:space:]]+//" /host/grub/grub.cfg + # remove ssd-upgrader-part from cmdline + sed -r -i.bak "s/ssd-upgrader-part=[^[:space:]]+//" /host/grub/grub.cfg + # Mount the previous NOS's partition NOS_DIR=/mnt/nos_migration MG_GZFILE=$NOS_DIR/minigraph.xml.gz.base64.txt diff --git a/files/initramfs-tools/ssd-upgrade b/files/initramfs-tools/ssd-upgrade new file mode 100644 index 000000000000..92139d7b114e --- /dev/null +++ b/files/initramfs-tools/ssd-upgrade @@ -0,0 +1,35 @@ +#!/bin/sh + +case $1 in + prereqs) + exit 0 + ;; +esac + +# Extract kernel parameters +set -- $(cat /proc/cmdline) +for x in "$@"; do + case "$x" in + ssd-upgrader-part=*) + ssd_upgrader_part="${x#ssd-upgrader-part=}" + ;; + esac +done + +if [ ! -z "$ssd_upgrader_part" ]; then + echo "ssd-upgrader-part found in /proc/cmdline" > /tmp/ssd-fw-upgrade.log + mkdir -p /mnt/ssd_upgrader_part + mount -t "${ssd_upgrader_part#*,}" "${ssd_upgrader_part%,*}" /mnt/ssd_upgrader_part + if [ -x /mnt/ssd_upgrader_part/ssd-fw-upgrade ]; then + cp /mnt/ssd_upgrader_part/ssd-fw-upgrade /tmp/ + cd /tmp/ + umount /mnt/ssd_upgrader_part + rm -r /mnt/ssd_upgrader_part + ./ssd-fw-upgrade >> /tmp/ssd-fw-upgrade.log 2>&1 + else + echo "ssd-fw-upgrade not found" >> /tmp/ssd-fw-upgrade.log + umount /mnt/ssd_upgrader_part + rm -r /mnt/ssd_upgrader_part + fi + gzip /tmp/ssd-fw-upgrade.log +fi diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index c9dd19204406..291806f951e6 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -190,3 +190,8 @@ fi if [ -f /tmp/fsck.log.gz ]; then mv /tmp/fsck.log.gz ${rootmnt}/var/log fi + +## ssd-fw-upgrade log file: /tmp will be lost when overlayfs is mounted +if [ -f /tmp/ssd-fw-upgrade.log.gz ]; then + mv /tmp/ssd-fw-upgrade.log.gz ${rootmnt}/var/log +fi From 942bef4475fa6ce936a75a7240207422ce837479 Mon Sep 17 00:00:00 2001 From: Arun Saravanan Balachandran <52521751+ArunSaravananBalachandran@users.noreply.github.com> Date: Thu, 12 May 2022 21:54:06 +0530 Subject: [PATCH 313/817] DellEMC: S6100, Z9332f - Include ONIE version in 'show platform firmware status' (#10493) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it To include ONIE version in show platform firmware status command output in DellEMC S6100 and Z9332f platforms. How I did it Include ‘ONIE’ in the list of components provided by platform APIs in DellEMC S6100 and Z9332f. Unmount ONIE-BOOT if mounted using fast/soft/warm-reboot plugins in DellEMC S6100. --- .../x86_64-dell_s6100_c2538-r0/platform.json | 3 ++ .../platform.json | 3 ++ .../common/onie_version | 28 +++++++++++++++++++ .../debian/platform-modules-s6100.install | 1 + .../debian/platform-modules-z9332f.install | 1 + .../s6100/scripts/fast-reboot_plugin | 7 +++++ .../s6100/sonic_platform/chassis.py | 2 +- .../s6100/sonic_platform/component.py | 9 +++++- .../z9332f/sonic_platform/chassis.py | 2 +- .../z9332f/sonic_platform/component.py | 11 ++++++++ 10 files changed, 64 insertions(+), 3 deletions(-) create mode 100755 platform/broadcom/sonic-platform-modules-dell/common/onie_version diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/platform.json b/device/dell/x86_64-dell_s6100_c2538-r0/platform.json index e9fbeaeff804..819f104aa53a 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/platform.json +++ b/device/dell/x86_64-dell_s6100_c2538-r0/platform.json @@ -18,6 +18,9 @@ }, { "name": "SSD" + }, + { + "name": "ONIE" } ], "fans": [ diff --git a/device/dell/x86_64-dellemc_z9332f_d1508-r0/platform.json b/device/dell/x86_64-dellemc_z9332f_d1508-r0/platform.json index 98a3322bf334..694f3e41d7c4 100644 --- a/device/dell/x86_64-dellemc_z9332f_d1508-r0/platform.json +++ b/device/dell/x86_64-dellemc_z9332f_d1508-r0/platform.json @@ -30,6 +30,9 @@ }, { "name": "PCIe" + }, + { + "name": "ONIE" } ], "fans": [ diff --git a/platform/broadcom/sonic-platform-modules-dell/common/onie_version b/platform/broadcom/sonic-platform-modules-dell/common/onie_version new file mode 100755 index 000000000000..e30a041ba8a5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/common/onie_version @@ -0,0 +1,28 @@ +#!/bin/bash +# script to get the ONIE version from NOS + +ONIEPATH="/mnt/onie-boot" + +# Exit if not superuser +if [[ "$EUID" -ne 0 ]]; then + echo "This command must be run as root" >&2 + exit 1 +fi + +# Mount ONIE partition if not already mounted +if ! grep -qs ${ONIEPATH} /proc/mounts; then + mkdir -p ${ONIEPATH} + mount LABEL=ONIE-BOOT ${ONIEPATH} || ERR=$? + if [[ ${ERR} -ne 0 ]]; then + exit 1 + fi +fi + +# Get ONIE version +onie_version=$(${ONIEPATH}/onie/tools/bin/onie-version | grep "ONIE version") || ERR=$? +if [[ ${ERR} -ne 0 ]]; then + exit 1 +fi + +onie_version=$(echo ${onie_version} | awk '{print $NF}') +echo ${onie_version} diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install index 4770ac7c2caf..22378cf0eb8b 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install @@ -37,3 +37,4 @@ s6100/systemd/s6100-platform-startup.service etc/systemd/system s6100/scripts/s6100_serial_getty_monitor etc/monit/conf.d common/fw-updater usr/local/bin common/onie_mode_set usr/local/bin +common/onie_version usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install index d668116c7445..ad25015472da 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install @@ -10,3 +10,4 @@ common/io_rd_wr.py usr/local/bin common/fw-updater usr/local/bin common/onie_mode_set usr/local/bin common/onie_stage_fwpkg usr/local/bin +common/onie_version usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin index 20a5d8cf5ac2..e38184ecff27 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/fast-reboot_plugin @@ -1,5 +1,12 @@ #!/bin/bash +ONIE_PATH="/mnt/onie-boot" + +# Unmount ONIE partition if mounted +if grep -qs ${ONIE_PATH} /proc/mounts; then + umount ${ONIE_PATH} +fi + if [[ -d /sys/devices/platform/SMF.512/hwmon/ ]]; then cd /sys/devices/platform/SMF.512/hwmon/* echo 0xcc > mb_poweron_reason diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py index 47e63f52a17d..b3d258f32e8f 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py @@ -28,7 +28,7 @@ MAX_S6100_FANTRAY = 4 MAX_S6100_PSU = 2 MAX_S6100_THERMAL = 10 -MAX_S6100_COMPONENT = 4 +MAX_S6100_COMPONENT = 5 class Chassis(ChassisBase): diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/component.py index a50028d3cb5a..0c605871b5a2 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/component.py @@ -23,6 +23,7 @@ SSD_VERSION_COMMAND = "ssdutil -v" SSD_UPGRADE_SCHEDULE = "/usr/local/bin/ssd_upgrade_schedule" PCI_VERSION_COMMAND = "lspci -s 0:0.0" +ONIE_VERSION_COMMAND = "/usr/local/bin/onie_version" class Component(ComponentBase): @@ -38,7 +39,8 @@ class Component(ComponentBase): ["FPGA", ("Platform management controller for on-board temperature " "monitoring, in-chassis power, Fan and LED control")], ["CPLD", "Used for managing IO modules, SFP+ modules and system LEDs"], - ["SSD", "Solid State Drive that stores data persistently"] + ["SSD", "Solid State Drive that stores data persistently"], + ["ONIE", "Open Network Install Environment"] ] MODULE_COMPONENT = [ "IOM{}-CPLD", @@ -261,6 +263,11 @@ def get_firmware_version(self): return self._get_cpld_version() elif self.index == 3: #SSD return self._get_ssd_version() + elif self.index == 4: # ONIE + try: + return subprocess.check_output(ONIE_VERSION_COMMAND, text=True).strip() + except (FileNotFoundError, subprocess.CalledProcessError): + return 'NA' def get_available_firmware_version(self, image_path): """ diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/chassis.py index 451a51f7b611..d59deb8b0a9e 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/chassis.py @@ -28,7 +28,7 @@ MAX_Z9332F_FAN = 2 MAX_Z9332F_PSU = 2 MAX_Z9332F_THERMAL = 14 -MAX_Z9332F_COMPONENT = 8 # BIOS,FPGA,BMC,BB CPLD,2 Switch CPLDs,SSD and PCIe +MAX_Z9332F_COMPONENT = 9 # BIOS,FPGA,BMC,BB CPLD,2 Switch CPLDs,SSD,PCIe and ONIE media_part_num_list = set([ \ "8T47V","XTY28","MHVPK","GF76J","J6FGD","F1KMV","9DN5J","H4DHD","6MCNV","0WRX0","X7F70","5R2PT","WTRD1","WTRD1","WTRD1","WTRD1","5250G","WTRD1","C5RNH","C5RNH","FTLX8571D3BCL-FC", diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py index 214467f8c35d..24619a481c4b 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py @@ -91,6 +91,12 @@ def get_pciephy_version(): return val +def get_onie_version(): + try: + return subprocess.check_output('/usr/local/bin/onie_version', text=True).strip() + except (FileNotFoundError, subprocess.CalledProcessError): + return 'NA' + class Component(ComponentBase): """DellEMC Platform-specific Component class""" @@ -134,6 +140,11 @@ class Component(ComponentBase): ['PCIe', 'ASIC PCIe firmware', get_pciephy_version + ], + + ['ONIE', + 'Open Network Install Environment', + get_onie_version ] ] From 4a1e7d8581cb2871a417154f85f1db06e5e6f0a8 Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Thu, 12 May 2022 15:56:11 -0700 Subject: [PATCH 314/817] remove voq chassis check (#10805) Why I did it Fixes #10793 How I did it Removed the switch_type validation from the Yang model. How to verify it compile sonic_yang_mgmt-1.0-py3-none-any.whl and sonic_yang_mgmt-1.0-py3-none-any.whl Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- .../tests/bgp_voq_chassis_neighbor.json | 4 -- .../bgp_voq_chassis_neighbor.json | 41 ------------------- .../sonic-bgp-voq-chassis-neighbor.yang | 3 -- 3 files changed, 48 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json index 3d575bb9759a..5c98b867e1b2 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_voq_chassis_neighbor.json @@ -2,10 +2,6 @@ "BGP_VOQ_CHASSIS_NEIGHBOR_TEST" : { "desc": "Load bgp voq chassis neighbor" }, - "BGP_VOQ_CHASSIS_WITH_INVALID_SWITCH_TYPE_TEST" : { - "desc": "Load bgp voq chassis on non voq chassis switch", - "eStr": ["Bgp voq neighbor are applicable only when switch_type is voq"] - }, "BGP_VOQ_CHASSIS_ABSENT_LOCAL_ADDRESS_TEST" : { "desc": "Load bgp voq chassis with no local address", "eStrKey" : "Mandatory" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json index 877903912383..f7ceb1d209ad 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_voq_chassis_neighbor.json @@ -40,47 +40,6 @@ } } }, - "BGP_VOQ_CHASSIS_WITH_INVALID_SWITCH_TYPE_TEST": { - "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { - "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { - "BGP_VOQ_CHASSIS_NEIGHBOR_LIST": [ - { - "neighbor": "10.0.0.1", - "asn": "65001", - "holdtime": "180", - "keepalive": "60", - "local_addr": "10.0.0.2", - "name": "sonic-chassis-lc3", - "nhopself": "0", - "rrclient": "0", - "admin_status": "up" - }, - { - "neighbor": "3333::3:6", - "asn": "65001", - "holdtime": "180", - "keepalive": "60", - "local_addr": "3333::3:3", - "name": "sonic-chassis-lc3", - "nhopself": "0", - "rrclient": "0", - "admin_status": "up" - } - ] - } - }, - "sonic-device_metadata:sonic-device_metadata": { - "sonic-device_metadata:DEVICE_METADATA": { - "localhost": { - "bgp_asn": "65001", - "default_bgp_status": "up", - "hostname": "sonic-chassis", - "platform": "voq-chassis", - "switch_type": "chassis-packet" - } - } - } - }, "BGP_VOQ_CHASSIS_ABSENT_LOCAL_ADDRESS_TEST": { "sonic-bgp-voq-chassis-neighbor:sonic-bgp-voq-chassis-neighbor": { "sonic-bgp-voq-chassis-neighbor:BGP_VOQ_CHASSIS_NEIGHBOR": { diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang b/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang index 0a7c6c9f1929..662f77c3c899 100644 --- a/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang +++ b/src/sonic-yang-models/yang-models/sonic-bgp-voq-chassis-neighbor.yang @@ -54,9 +54,6 @@ module sonic-bgp-voq-chassis-neighbor { } } } - must "(/dm:sonic-device_metadata/dm:DEVICE_METADATA/dm:localhost/dm:switch_type = 'voq')" { - error-message "Bgp voq neighbor are applicable only when switch_type is voq"; - } } } } From 5ea244cac84e7d8d204d40e6706db79bd60d25f4 Mon Sep 17 00:00:00 2001 From: Vivek R Date: Sat, 14 May 2022 05:20:57 -0700 Subject: [PATCH 315/817] Removed platform specific reboot files for mellanox simx platforms (#10806) - Why I did it Platform_reboot files for simx doesn't do aything different apart from calling /sbin/reboot. which is anyway done in the /usr/local/bin/reboot script i.e. the parent script which calls the platform specific reboot scripts if present. Moreover, /sbin/reboot invoked in the platform specific reboot script is a non-blocking call and thus it returns back to the original script (although /sbin/reboot does it job in the background) and we see messages like this. Signed-off-by: Vivek Reddy Karri --- .../platform_reboot | 21 ------------------- .../platform_reboot | 1 - .../platform_reboot | 1 - .../platform_reboot | 1 - .../platform_reboot | 1 - 5 files changed, 25 deletions(-) delete mode 100755 device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot delete mode 120000 device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot delete mode 120000 device/mellanox/x86_64-mlnx_msn4700_simx-r0/platform_reboot delete mode 120000 device/mellanox/x86_64-nvidia_sn4800_simx-r0/platform_reboot delete mode 120000 device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform_reboot diff --git a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot deleted file mode 100755 index 5b9809e10423..000000000000 --- a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -declare -r EXIT_SUCCESS="0" -declare -r EXIT_ERROR="1" - -FORCE_REBOOT="no" - -function ParseArguments() { - while [ $# -ge 1 ]; do - case "$1" in - -f|--force) - FORCE_REBOOT="yes" - ;; - esac - shift - done -} - -ParseArguments "$@" - -exec /sbin/reboot $@ diff --git a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot deleted file mode 120000 index dfaf53417665..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700_simx-r0/platform_reboot \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn4700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn4700_simx-r0/platform_reboot deleted file mode 120000 index dfaf53417665..000000000000 --- a/device/mellanox/x86_64-mlnx_msn4700_simx-r0/platform_reboot +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700_simx-r0/platform_reboot \ No newline at end of file diff --git a/device/mellanox/x86_64-nvidia_sn4800_simx-r0/platform_reboot b/device/mellanox/x86_64-nvidia_sn4800_simx-r0/platform_reboot deleted file mode 120000 index dfaf53417665..000000000000 --- a/device/mellanox/x86_64-nvidia_sn4800_simx-r0/platform_reboot +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700_simx-r0/platform_reboot \ No newline at end of file diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform_reboot b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform_reboot deleted file mode 120000 index dfaf53417665..000000000000 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform_reboot +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700_simx-r0/platform_reboot \ No newline at end of file From 5eda219bdc6b30173c31349b03b1e203f0d29a75 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Sun, 15 May 2022 13:02:49 +0800 Subject: [PATCH 316/817] [sonic-config-gen] Modify lag names to enforce 15 chars limit (#10792) Why I did it Previous subport unit tests uses port channel names like PortChannel01, so for subport name generated PortChannel01.10, it exceeds Linux network interface name 15 char limit. Signed-off-by: Longxiang Lyu lolv@microsoft.com How I did it Modify PortChannel01 to PortChannel1. --- .../tests/sample-graph-resource-type.xml | 8 ++++---- src/sonic-config-engine/tests/sample-graph-subintf.xml | 8 ++++---- src/sonic-config-engine/tests/simple-sample-graph.xml | 8 ++++---- src/sonic-config-engine/tests/test_cfggen.py | 10 +++++----- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index 62c2dfd64f3b..987d24358438 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -176,7 +176,7 @@ switch-t0 - PortChannel01 + PortChannel1 fortyGigE0/4 @@ -228,12 +228,12 @@ - PortChannel01 + PortChannel1 10.0.0.56/31 - PortChannel01 + PortChannel1 FC00::71/126 @@ -265,7 +265,7 @@ - PortChannel01 + PortChannel1 DataAcl DataPlane diff --git a/src/sonic-config-engine/tests/sample-graph-subintf.xml b/src/sonic-config-engine/tests/sample-graph-subintf.xml index a23b668c2c2f..7fa35c44cbe4 100644 --- a/src/sonic-config-engine/tests/sample-graph-subintf.xml +++ b/src/sonic-config-engine/tests/sample-graph-subintf.xml @@ -176,7 +176,7 @@ switch-t0 - PortChannel01 + PortChannel1 fortyGigE0/4 @@ -245,12 +245,12 @@ - PortChannel01 + PortChannel1 10.0.0.56/31 - PortChannel01 + PortChannel1 FC00::71/126 @@ -272,7 +272,7 @@ - PortChannel01 + PortChannel1 DataAcl DataPlane diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index 8d7800686c7a..c8cd3eacdc31 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -176,7 +176,7 @@ switch-t0 - PortChannel01 + PortChannel1 fortyGigE0/4 @@ -228,12 +228,12 @@ - PortChannel01 + PortChannel1 10.0.0.56/31 - PortChannel01 + PortChannel1 FC00::71/126 @@ -265,7 +265,7 @@ - PortChannel01 + PortChannel1 DataAcl DataPlane diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 29773dffc628..023f13c2f234 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -325,7 +325,7 @@ def test_minigraph_portchannels(self, **kwargs): output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), - utils.to_dict("{'PortChannel01': {'admin_status': 'up', 'min_links': '1', 'members': ['Ethernet4'], 'mtu': '9100', 'tpid': '0x8100'}}") + utils.to_dict("{'PortChannel1': {'admin_status': 'up', 'min_links': '1', 'members': ['Ethernet4'], 'mtu': '9100', 'tpid': '0x8100'}}") ) def test_minigraph_portchannel_with_more_member(self): @@ -349,7 +349,7 @@ def test_minigraph_portchannel_interfaces(self): output = self.run_script(argument) self.assertEqual( utils.liststr_to_dict(output.strip()), - utils.liststr_to_dict("['PortChannel01', ('PortChannel01', '10.0.0.56/31'), ('PortChannel01', 'FC00::71/126')]") + utils.liststr_to_dict("['PortChannel1', ('PortChannel1', '10.0.0.56/31'), ('PortChannel1', 'FC00::71/126')]") ) def test_minigraph_neighbors(self): @@ -803,11 +803,11 @@ def verify_sub_intf(self, **kwargs): self.assertEqual( utils.to_dict(output.strip()), utils.to_dict( - "{('PortChannel01.10', '10.0.0.56/31'): {}, " + "{('PortChannel1.10', '10.0.0.56/31'): {}, " "'Ethernet0.10': {'admin_status': 'up'}, " "('Ethernet0.10', '10.0.0.58/31'): {}, " - "('PortChannel01.10', 'FC00::71/126'): {}, " - "'PortChannel01.10': {'admin_status': 'up'}, " + "('PortChannel1.10', 'FC00::71/126'): {}, " + "'PortChannel1.10': {'admin_status': 'up'}, " "('Ethernet0.10', 'FC00::75/126'): {}}" ) ) From 4b581f1e9d35b354dce3a77c9ce76f99b9ebcaa3 Mon Sep 17 00:00:00 2001 From: "Dante (Kuo-Jung) Su" Date: Mon, 16 May 2022 03:52:22 +0800 Subject: [PATCH 317/817] sonic-port.yang: add link training support (#10025) This is part of HLD Azure/SONiC#925 #### Why I did it Add link-training support #### How I did it Update SONiC YANG for port link-training support #### Description for the changelog Add "link_training" to sonic-port.yang #### Link to config_db schema for YANG module changes https://github.com/sonic-net/SONiC/wiki/Configuration#port --- src/sonic-yang-models/doc/Configuration.md | 8 +-- .../tests/files/sample_config_db.json | 6 ++- .../tests/yang_model_tests/tests/port.json | 11 ++++ .../yang_model_tests/tests_config/port.json | 51 +++++++++++++++++++ .../yang-models/sonic-port.yang | 8 +++ 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 9a8f2a9fe285..9a1adcab9c48 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1167,7 +1167,8 @@ optional attributes. "description": "fortyGigE1/1/1", "mtu": "9100", "alias": "fortyGigE1/1/1", - "speed": "40000" + "speed": "40000", + "link_training": "off" }, "Ethernet1": { "index": "1", @@ -1176,9 +1177,10 @@ optional attributes. "mtu": "9100", "alias": "fortyGigE1/1/2", "admin_status": "up", - "speed": "40000" + "speed": "40000", + "link_training": "on" }, - "Ethernet63": { + "Ethernet63": { "index": "63", "lanes": "87,88", "description": "fortyGigE1/4/16", diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 5af414359b29..e19c8aeb8d68 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -438,7 +438,8 @@ "index": "0", "asic_port_name": "Eth0-ASIC1", "role": "Ext", - "macsec": "test" + "macsec": "test", + "link_training": "off" }, "Ethernet1": { "alias": "Eth1/2", @@ -449,7 +450,8 @@ "admin_status": "up", "autoneg": "on", "adv_speeds": "100000,50000", - "adv_interface_types": "CR,CR4" + "adv_interface_types": "CR,CR4", + "link_training": "on" }, "Ethernet2": { "alias": "Eth1/3", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json index db9b432714eb..0d67a73148b3 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json @@ -69,6 +69,17 @@ "desc": "PORT_INVALID_ADVTYPES_TEST_2 must condition failure.", "eStrKey" : "Must" }, + "PORT_VALID_LINK_TRAINING_TEST_1": { + "desc": "PORT_VALID_LINK_TRAINING_TEST_1 no failure." + }, + "PORT_VALID_LINK_TRAINING_TEST_2": { + "desc": "PORT_VALID_LINK_TRAINING_TEST_2 no failure." + }, + "PORT_INVALID_LINK_TRAINING_TEST": { + "desc": "PORT_INVALID_LINK_TRAINING_TEST must condition failure.", + "eStrKey" : "Pattern", + "eStr": ["on|off"] + }, "PORT_INVALID_TPID_TEST": { "desc": "PORT_INVALID_TPID_TEST invalid tpid value failure.", "eStrKey" : "Pattern", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json index db3334e80d2b..7f5c91230df8 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json @@ -311,6 +311,57 @@ } }, + "PORT_VALID_LINK_TRAINING_TEST_1": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "link_training": "on" + } + ] + } + } + }, + + "PORT_VALID_LINK_TRAINING_TEST_2": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "link_training": "off" + } + ] + } + } + }, + + "PORT_INVALID_LINK_TRAINING_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "link_training": 0 + } + ] + } + } + }, + "PORT_INVALID_TPID_TEST": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index eab52996fb00..6921613624ff 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -65,6 +65,14 @@ module sonic-port{ } } + leaf link_training { + description "Port link training mode"; + + type string { + pattern "on|off"; + } + } + leaf autoneg { description "Port auto negotiation mode"; From 3567888b03910aca207c05f13de492b446eac581 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 16 May 2022 08:57:26 +0800 Subject: [PATCH 318/817] [Ci] Support to trigger a pipeline to download and publish artifacts to storage (#10820) Why I did it Support to trigger a pipeline to download and publish artifacts to storage and container registry. Support to specify the patterns which docker images to upload. How I did it Pass the pipeline information and the artifact information by pipeline parameters to the pipeline which will be triggered a new build. It is to decouple the artifacts generation and the publish logic, how and where the artifacts/docker images will be published, depends on the triggered pipeline. How to verify it --- .../azure-pipelines-image-template.yml | 6 +- .../trigger-publish-artifacts-build.yml | 64 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 .azure-pipelines/trigger-publish-artifacts-build.yml diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 7f2874024740..20bedc8d8084 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -48,7 +48,7 @@ jobs: ENABLE_DOCKER_BASE_PULL=y make PLATFORM=$(PLATFORM_AZP) PLATFORM_ARCH=$(PLATFORM_ARCH) $(BUILD_OPTIONS) configure displayName: 'Make configure' postSteps: - - script: cp target -r $(Build.ArtifactStagingDirectory)/ + - script: mv target $(Build.ArtifactStagingDirectory)/ displayName: Copy Artifacts condition: always() - publish: $(Build.ArtifactStagingDirectory) @@ -58,6 +58,10 @@ jobs: condition: failed() artifact: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)$(System.JobAttempt)' displayName: "Archive failed sonic image" + - template: trigger-publish-artifacts-build.yml + parameters: + artifactName: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' + publishPrefix: '$(Build.DefinitionName)/$(Build.SourceBranchName)/$(GROUP_NAME)' - ${{ parameters.postSteps }} - template: cleanup.yml jobGroups: ${{ parameters.jobGroups }} diff --git a/.azure-pipelines/trigger-publish-artifacts-build.yml b/.azure-pipelines/trigger-publish-artifacts-build.yml new file mode 100644 index 000000000000..83bbfc1150ce --- /dev/null +++ b/.azure-pipelines/trigger-publish-artifacts-build.yml @@ -0,0 +1,64 @@ +# The steps to trigger the pipeline to publish the artifacts + +parameters: +- name: artifactName + type: string + default: "" +- name: publishPrefix + type: string + default: "$(Build.DefinitionName)/$(Build.SourceBranchName)" + +steps: +- script: | + . functions.sh + sonic_version=$(sonic_get_version) + latest_tag=$(git describe --tags --abbrev=0) + docker_tags="$sonic_version $(Build.SourceBranchName)" + if [ "$(Build.SourceBranchName)" == "master" ]; then + docker_tags="$docker_tags latest" + fi + echo "##vso[task.setvariable variable=sonic_version]$sonic_version" + echo "##vso[task.setvariable variable=latest_tag]$latest_tag" + echo "##vso[task.setvariable variable=docker_tags]$docker_tags" + condition: ne(variables['Build.Reason'], 'PullRequest') + displayName: 'Set trigger build variables' +- task: TriggerBuild@4 + condition: ne(variables['Build.Reason'], 'PullRequest') + inputs: + definitionIsInCurrentTeamProject: false + teamProject: internal + tfsServer: $(System.CollectionUri) + buildDefinition: 'publish-artifacts' + queueBuildForUserThatTriggeredBuild: true + ignoreSslCertificateErrors: false + useSameSourceVersion: false + useCustomSourceVersion: false + useSameBranch: false + waitForQueuedBuildsToFinish: false + storeInEnvironmentVariable: true + authenticationMethod: 'Personal Access Token' + password: '$(system.accesstoken)' + enableBuildInQueueCondition: false + dependentOnSuccessfulBuildCondition: false + dependentOnFailedBuildCondition: false + checkbuildsoncurrentbranch: false + failTaskIfConditionsAreNotFulfilled: false + buildParameters: '' + templateParameters: | + pipelineContext: {"buildId":"$(Build.BuildId)", + "pipelineId":"$(System.DefinitionId)", + "project": "$(System.TeamProject)", + "branchName":"$(Build.SourceBranchName)"}, + artifactContext: {"artifactName":"${{ parameters.artifactName }}", + "artifactPatterns":"**/*.bin\n + **/*.swi\n + **/*.raw\n + **/*.img.gz\n + **/*-rpc.gz\n + **/python-saithrift*.deb"}, + publishContext: {"publishPrefix":"${{ parameters.publishPrefix }}", + "keepArtifactName":false, + "dockerImagePatterns":"target/*-rpc.gz", + "dockerTags":"$(docker_tags)", + "version":"$(sonic_version)", + "latestTag":"$(latest_tag)"} From 1db50e54c830bd8539075eb36a7bb91f47115998 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Mon, 16 May 2022 11:42:20 +0800 Subject: [PATCH 319/817] [sonic-cfggen]: Update UT to run yang validation (#9700) Why I did it Config db schema generated by minigraph should run yang validation. How I did it Modify run_script to add yang validation. How to verify it Run sonic-config-engine unit test. Signed-off-by: Gang Lv ganglv@microsoft.com --- src/sonic-config-engine/tests/common_utils.py | 51 ++++++++++++++++++- src/sonic-config-engine/tests/test_cfggen.py | 3 ++ .../tests/test_minigraph_case.py | 3 ++ .../tests/test_multinpu_cfggen.py | 3 ++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/tests/common_utils.py b/src/sonic-config-engine/tests/common_utils.py index 47fe9f37f2a4..7b8d2b4e27a4 100644 --- a/src/sonic-config-engine/tests/common_utils.py +++ b/src/sonic-config-engine/tests/common_utils.py @@ -3,10 +3,14 @@ import os import re import sys +import subprocess +import argparse +import shlex PY3x = sys.version_info >= (3, 0) PYvX_DIR = "py3" if PY3x else "py2" PYTHON_INTERPRETTER = "python3" if PY3x else "python2" +YANG_MODELS_DIR = "/usr/local/yang-models" def tuple_to_str(tuplestr): """ Convert Python tuple '('elem1', 'elem2')' representation into string on the for "elem1|elem2" """ @@ -33,6 +37,52 @@ def liststr_to_dict(liststr): return list_obj +class YangWrapper(object): + def __init__(self, path=YANG_MODELS_DIR): + """ + sonic_yang only supports python3 + """ + if PY3x: + import sonic_yang + self.yang_parser = sonic_yang.SonicYang(path) + self.yang_parser.loadYangModel() + self.test_dir = os.path.dirname(os.path.realpath(__file__)) + self.script_file = PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') + + def validate(self, argument): + """ + Raise exception when yang validation failed + """ + if PY3x and "-m" in argument: + import sonic_yang + parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") + parser.add_argument("-m", "--minigraph", help="minigraph xml file", nargs='?', const='/etc/sonic/minigraph.xml') + parser.add_argument("-k", "--hwsku", help="HwSKU") + parser.add_argument("-n", "--namespace", help="namespace name", nargs='?', const=None, default=None) + parser.add_argument("-p", "--port-config", help="port config file, used with -m or -k", nargs='?', const=None) + parser.add_argument("-S", "--hwsku-config", help="hwsku config file, used with -p and -m or -k", nargs='?', const=None) + args, unknown = parser.parse_known_args(shlex.split(argument)) + + print('\n Validating yang schema') + cmd = self.script_file + ' -m ' + args.minigraph + if args.hwsku is not None: + cmd += ' -k ' + args.hwsku + if args.hwsku_config is not None: + cmd += ' -S ' + args.hwsku_config + if args.port_config is not None: + cmd += ' -p ' + args.port_config + if args.namespace is not None: + cmd += ' -n ' + args.namespace + cmd += ' --print-data' + output = subprocess.check_output(cmd, shell=True).decode() + try: + self.yang_parser.loadData(configdbJson=json.loads(output)) + self.yang_parser.validate_data_tree() + except sonic_yang.SonicYangException as e: + print("yang data generated from %s is not valid: %s"%(args.minigraph, str(e))) + return False + return True + def cmp(file1, file2): """ compare files """ try: @@ -43,4 +93,3 @@ def cmp(file1, file2): return obj1 == obj2 except: return filecmp.cmp(file1, file2) - diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 023f13c2f234..22ce5671ee85 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -14,6 +14,7 @@ class TestCfgGen(TestCase): def setUp(self): + self.yang = utils.YangWrapper() self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = utils.PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml') @@ -50,6 +51,8 @@ def tearDown(self): def run_script(self, argument, check_stderr=False, verbose=False): print('\n Running sonic-cfggen ' + argument) + self.assertTrue(self.yang.validate(argument)) + if check_stderr: output = subprocess.check_output(self.script_file + ' ' + argument, stderr=subprocess.STDOUT, shell=True) else: diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index d18dd0499dab..a6db6f37c591 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -14,6 +14,7 @@ class TestCfgGenCaseInsensitive(TestCase): def setUp(self): + self.yang = utils.YangWrapper() self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = utils.PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') self.sample_graph = os.path.join(self.test_dir, 'simple-sample-graph-case.xml') @@ -24,6 +25,8 @@ def setUp(self): def run_script(self, argument, check_stderr=False): print('\n Running sonic-cfggen ' + argument) + self.assertTrue(self.yang.validate(argument)) + if check_stderr: output = subprocess.check_output(self.script_file + ' ' + argument, stderr=subprocess.STDOUT, shell=True) else: diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index f39cc9dce1b8..35c2000c0e4e 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -20,6 +20,7 @@ class TestMultiNpuCfgGen(TestCase): def setUp(self): + self.yang = utils.YangWrapper() self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.test_data_dir = os.path.join(self.test_dir, 'multi_npu_data') self.script_file = utils.PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') @@ -34,6 +35,8 @@ def setUp(self): def run_script(self, argument, check_stderr=False): print('\n Running sonic-cfggen ' + argument) + self.assertTrue(self.yang.validate(argument)) + if check_stderr: output = subprocess.check_output(self.script_file + ' ' + argument, stderr=subprocess.STDOUT, shell=True) else: From 59e11f6e79d059c7545f6119a78337bd0a026607 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 17 May 2022 09:38:12 -0700 Subject: [PATCH 320/817] Update Configuration doc: fix separator and indentation (#10839) Update Configuration doc: fix separator and indentation --- src/sonic-yang-models/doc/Configuration.md | 46 +++++++++++----------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 9a1adcab9c48..d8904ae5e828 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -105,17 +105,18 @@ redis and json, correspondingly: ***Redis format*** + ``` -127.0.0.1:6379[4]> keys BGP_NEIGHBOR:* +127.0.0.1:6379[4]> keys BGP_NEIGHBOR|* -1) "BGP_NEIGHBOR:10.0.0.31" -2) "BGP_NEIGHBOR:10.0.0.39" -3) "BGP_NEIGHBOR:10.0.0.11" -4) "BGP_NEIGHBOR:10.0.0.7" +1) "BGP_NEIGHBOR|10.0.0.31" +2) "BGP_NEIGHBOR|10.0.0.39" +3) "BGP_NEIGHBOR|10.0.0.11" +4) "BGP_NEIGHBOR|10.0.0.7" ... -127.0.0.1:6379[4]> hgetall BGP_NEIGHBOR:10.0.0.3 +127.0.0.1:6379[4]> hgetall BGP_NEIGHBOR|10.0.0.3 1) "admin_status" 2) "up" @@ -128,26 +129,27 @@ redis and json, correspondingly: ``` ***Json format*** + ``` "BGP_NEIGHBOR": { - "10.0.0.57": { - "rrclient": "0", - "name": "ARISTA01T1", - "local_addr": "10.0.0.56", - "nhopself": "0", - "holdtime": "10", - "asn": "64600", - "keepalive": "3" - }, + "10.0.0.57": { + "rrclient": "0", + "name": "ARISTA01T1", + "local_addr": "10.0.0.56", + "nhopself": "0", + "holdtime": "10", + "asn": "64600", + "keepalive": "3" + }, "10.0.0.59": { - "rrclient": "0", - "name": "ARISTA02T1", - "local_addr": "10.0.0.58", - "nhopself": "0", - "holdtime": "10", - "asn": "64600", + "rrclient": "0", + "name": "ARISTA02T1", + "local_addr": "10.0.0.58", + "nhopself": "0", + "holdtime": "10", + "asn": "64600", "keepalive": "3" - }, + }, } ``` From 0eeb249fd85668b6d26a1a3401f43b81375afeb3 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 17 May 2022 13:55:59 -0700 Subject: [PATCH 321/817] [swss]: Convert swss docker to bullseye (#10484) * [swss]: Convert swss docker to bullseye Signed-off-by: Lawrence Lee --- dockers/docker-orchagent/Dockerfile.j2 | 13 +++-------- .../docker-swss-layer-bullseye/Dockerfile.j2 | 22 +++++++++++++++++++ rules/docker-orchagent.mk | 9 +++----- rules/docker-swss-layer-bullseye.dep | 9 ++++++++ rules/docker-swss-layer-bullseye.mk | 14 ++++++++++++ 5 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 dockers/docker-swss-layer-bullseye/Dockerfile.j2 create mode 100644 rules/docker-swss-layer-bullseye.dep create mode 100644 rules/docker-swss-layer-bullseye.mk diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index adb084cf2271..a023862c1d9d 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-swss-layer-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf @@ -26,17 +26,10 @@ RUN apt-get update && \ {% if ( CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" ) %} # Fix for gcc/python/iputils-ping not found in arm docker -RUN apt-get install -f -y python2.7 python2.7-dev RUN apt-get install -y \ - gcc-8 \ + gcc \ iputils-ping {% endif %} -{% if CONFIGURED_ARCH == "armhf" %} -RUN ln -s -f /usr/bin/gcc-8 /usr/bin/arm-linux-gnueabihf-gcc -{% endif %} -{% if CONFIGURED_ARCH == "arm64" %} -RUN ln -s -f /usr/bin/gcc-8 /usr/bin/aarch64-linux-gnu-gcc -{% endif %} # Dependencies of restore_neighbors.py RUN pip3 install \ @@ -45,7 +38,7 @@ RUN pip3 install \ {% if ( CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" ) %} # Remove installed gcc -RUN apt-get remove -y gcc-8 +RUN apt-get remove -y gcc {% endif %} {% if docker_orchagent_debs.strip() -%} diff --git a/dockers/docker-swss-layer-bullseye/Dockerfile.j2 b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 new file mode 100644 index 000000000000..15f0e0edcc4a --- /dev/null +++ b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 @@ -0,0 +1,22 @@ +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +{% if docker_swss_layer_bullseye_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_swss_layer_bullseye_debs.split(' '), "/debs/") }} + +# Install locally-built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_swss_layer_bullseye_debs.split(' ')) }} +{%- endif %} + +RUN apt-get clean -y && \ + apt-get autoclean -y && \ + apt-get autoremove -y && \ + rm -rf /debs + +ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/rules/docker-orchagent.mk b/rules/docker-orchagent.mk index ef0c203877d8..917fe0b13661 100644 --- a/rules/docker-orchagent.mk +++ b/rules/docker-orchagent.mk @@ -6,17 +6,17 @@ DOCKER_ORCHAGENT_DBG = $(DOCKER_ORCHAGENT_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS) -$(DOCKER_ORCHAGENT)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) +$(DOCKER_ORCHAGENT)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_DEPENDS) $(DOCKER_ORCHAGENT)_DBG_DEPENDS += $(SWSS_DBG) \ $(LIBSWSSCOMMON_DBG) \ $(LIBSAIREDIS_DBG) $(DOCKER_ORCHAGENT)_PYTHON_WHEELS += $(SCAPY) -$(DOCKER_ORCHAGENT)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_ORCHAGENT)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_IMAGE_PACKAGES) $(DOCKER_ORCHAGENT)_PATH = $(DOCKERS_PATH)/$(DOCKER_ORCHAGENT_STEM) -$(DOCKER_ORCHAGENT)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BUSTER) +$(DOCKER_ORCHAGENT)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BULLSEYE) $(DOCKER_ORCHAGENT)_VERSION = 1.0.0 $(DOCKER_ORCHAGENT)_PACKAGE_NAME = swss @@ -39,6 +39,3 @@ $(DOCKER_ORCHAGENT)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel $(DOCKER_ORCHAGENT)_FILES += $(ARP_UPDATE_SCRIPT) $(ARP_UPDATE_VARS_TEMPLATE) $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) - -SONIC_BUSTER_DOCKERS += $(DOCKER_ORCHAGENT) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_ORCHAGENT_DBG) diff --git a/rules/docker-swss-layer-bullseye.dep b/rules/docker-swss-layer-bullseye.dep new file mode 100644 index 000000000000..102405a467ed --- /dev/null +++ b/rules/docker-swss-layer-bullseye.dep @@ -0,0 +1,9 @@ + +DPATH := $($(DOCKER_SWSS_LAYER_BULLSEYE)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-swss-layer-bullseye.mk rules/docker-swss-layer-bullseye.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_SWSS_LAYER_BULLSEYE)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_SWSS_LAYER_BULLSEYE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_SWSS_LAYER_BULLSEYE)_DEP_FILES := $(DEP_FILES) diff --git a/rules/docker-swss-layer-bullseye.mk b/rules/docker-swss-layer-bullseye.mk new file mode 100644 index 000000000000..aebbbc122a68 --- /dev/null +++ b/rules/docker-swss-layer-bullseye.mk @@ -0,0 +1,14 @@ +# bullseye-based docker image for sonic swss layer + +DOCKER_SWSS_LAYER_BULLSEYE= docker-swss-layer-bullseye.gz +$(DOCKER_SWSS_LAYER_BULLSEYE)_PATH = $(DOCKERS_PATH)/docker-swss-layer-bullseye + +$(DOCKER_SWSS_LAYER_BULLSEYE)_DEPENDS += $(SWSS) +$(DOCKER_SWSS_LAYER_BULLSEYE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) + +$(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) \ + $(SWSS) +$(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_SWSS_LAYER_BULLSEYE) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SWSS_LAYER_BULLSEYE) From 9e3f1c791457c5666257c9534d4a9ec608e038df Mon Sep 17 00:00:00 2001 From: lizhuhuams <103542826+lizhuhuams@users.noreply.github.com> Date: Wed, 18 May 2022 10:37:32 -0700 Subject: [PATCH 322/817] Revert "[reboiot-cause] Fix a broken symlink of previous-reboot-cause file removal issue (#10751)" (#10849) This reverts commit dee7655526699e3f66bf3744e098f03203345449. Co-authored-by: Ubuntu --- src/sonic-host-services/scripts/determine-reboot-cause | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-host-services/scripts/determine-reboot-cause b/src/sonic-host-services/scripts/determine-reboot-cause index 21b13d86aad8..1408ad0e2952 100755 --- a/src/sonic-host-services/scripts/determine-reboot-cause +++ b/src/sonic-host-services/scripts/determine-reboot-cause @@ -174,7 +174,7 @@ def main(): os.makedirs(REBOOT_CAUSE_DIR) # Remove stale PREVIOUS_REBOOT_CAUSE_FILE if it exists - if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE) or os.path.islink(PREVIOUS_REBOOT_CAUSE_FILE): + if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE): os.remove(PREVIOUS_REBOOT_CAUSE_FILE) # This variable is kept for future-use purpose. When proc_cmd_line/vendor/software provides From 70e8ad325d3a47dfa4308a2ec8878ab1df399b14 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 18 May 2022 13:01:27 -0700 Subject: [PATCH 323/817] [scapy]: Patch scapy 2.4.5 for sniffing on intfs (#10644) Apply scapy fix (https://github.com/secdev/scapy/pull/3240) since it is not available in release yet Signed-off-by: Lawrence Lee --- ...-resolve-the-interface-name-globally.patch | 112 ++++++++++++++++++ src/scapy.patch/series | 1 + 2 files changed, 113 insertions(+) create mode 100644 src/scapy.patch/0003-Do-not-resolve-the-interface-name-globally.patch diff --git a/src/scapy.patch/0003-Do-not-resolve-the-interface-name-globally.patch b/src/scapy.patch/0003-Do-not-resolve-the-interface-name-globally.patch new file mode 100644 index 000000000000..daaa182b641a --- /dev/null +++ b/src/scapy.patch/0003-Do-not-resolve-the-interface-name-globally.patch @@ -0,0 +1,112 @@ +From 430f8942fe086553fcd6ad1444e886a343bfd658 Mon Sep 17 00:00:00 2001 +From: Guillaume Valadon +Date: Mon, 10 May 2021 12:02:32 +0200 +Subject: [PATCH] Do not resolve the interface name globally + +--- + doc/scapy/usage.rst | 2 ++ + scapy/sendrecv.py | 16 ++++++++-------- + test/regression.uts | 31 +++++++++++++++++++++++++++++-- + 3 files changed, 39 insertions(+), 10 deletions(-) + +diff --git a/doc/scapy/usage.rst b/doc/scapy/usage.rst +index 45266430fe..c6cb273f62 100644 +--- a/doc/scapy/usage.rst ++++ b/doc/scapy/usage.rst +@@ -711,6 +711,8 @@ We can sniff and do passive OS fingerprinting:: + + The number before the OS guess is the accuracy of the guess. + ++.. note:: When sniffing on several interfaces (e.g. ``iface=["eth0", ...]``), you can check what interface a packet was sniffed on by using the ``sniffed_on`` attribute, as shown in one of the examples above. ++ + Asynchronous Sniffing + --------------------- + +diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py +index 503c6a3b15..f97fc4153e 100644 +--- a/scapy/sendrecv.py ++++ b/scapy/sendrecv.py +@@ -1108,24 +1108,24 @@ def _run(self, + quiet=quiet) + )] = offline + if not sniff_sockets or iface is not None: +- iface = resolve_iface(iface or conf.iface) +- if L2socket is None: +- L2socket = iface.l2listen() ++ # The _RL2 function resolves the L2socket of an iface ++ _RL2 = lambda i: L2socket or resolve_iface(i).l2listen() # type: Callable[[_GlobInterfaceType], Callable[..., SuperSocket]] # noqa: E501 + if isinstance(iface, list): + sniff_sockets.update( +- (L2socket(type=ETH_P_ALL, iface=ifname, **karg), ++ (_RL2(ifname)(type=ETH_P_ALL, iface=ifname, **karg), + ifname) + for ifname in iface + ) + elif isinstance(iface, dict): + sniff_sockets.update( +- (L2socket(type=ETH_P_ALL, iface=ifname, **karg), ++ (_RL2(ifname)(type=ETH_P_ALL, iface=ifname, **karg), + iflabel) + for ifname, iflabel in six.iteritems(iface) + ) + else: +- sniff_sockets[L2socket(type=ETH_P_ALL, iface=iface, +- **karg)] = iface ++ iface = iface or conf.iface ++ sniff_sockets[_RL2(iface)(type=ETH_P_ALL, iface=iface, ++ **karg)] = iface + + # Get select information from the sockets + _main_socket = next(iter(sniff_sockets)) +@@ -1248,7 +1248,7 @@ def stop(self, join=True): + return self.results + return None + else: +- raise Scapy_Exception("Not started !") ++ raise Scapy_Exception("Not running ! (check .running attr)") + + def join(self, *args, **kwargs): + # type: (*Any, **Any) -> None +diff --git a/test/regression.uts b/test/regression.uts +index 38644b7d75..972af2f8cd 100644 +--- a/test/regression.uts ++++ b/test/regression.uts +@@ -1379,9 +1379,36 @@ def _test(): + assert (ans.time - req.sent_time) >= 0 + assert (ans.time - req.sent_time) <= 1e-3 + +-retry_test(_test) ++try: ++ retry_test(_test) ++finally: ++ conf.L3socket = sock ++ ++= Test sniffing on multiple sockets ++~ netaccess needs_root sniff ++ ++# This test sniffs on the same interface twice at the same time, to ++# simulate sniffing on multiple interfaces. ++ ++iface = conf.route.route("www.google.com")[0] ++port = int(RandShort()) ++pkt = IP(dst="www.google.com")/TCP(sport=port, dport=80, flags="S") ++ ++def cb(): ++ sr1(pkt, timeout=3) ++ ++sniffer = AsyncSniffer(started_callback=cb, ++ iface=[iface, iface], ++ lfilter=lambda x: TCP in x and x[TCP].dport == port, ++ prn=lambda x: x.summary(), ++ count=2) ++sniffer.start() ++sniffer.join(timeout=3) ++ ++assert len(sniffer.results) == 2 + +-conf.L3socket = sock ++for pkt in sniffer.results: ++ assert pkt.sniffed_on == iface + + = Sending a TCP syn 'forever' at layer 2 and layer 3 + ~ netaccess IP diff --git a/src/scapy.patch/series b/src/scapy.patch/series index d64f20f136c1..7b231848ac1f 100644 --- a/src/scapy.patch/series +++ b/src/scapy.patch/series @@ -1,2 +1,3 @@ 0001-Fix-version-string-generation-when-scapy-is-a-submod.patch 0002-Check-if-the-network-interface-still-exists.patch +0003-Do-not-resolve-the-interface-name-globally.patch From 0cc9fdc69bd01ef11b69120bfcbeb0a2ba7d286b Mon Sep 17 00:00:00 2001 From: StormLiangMS <89824293+StormLiangMS@users.noreply.github.com> Date: Thu, 19 May 2022 10:07:31 +0800 Subject: [PATCH 324/817] [bgpcfgd] ECMP overlay VxLan with BGP support (#10716) Why I did it https://github.com/Azure/SONiC/blob/master/doc/vxlan/Overlay%20ECMP%20with%20BFD.md From the design, need to advertise the route with community string, the PR is to implement this. How I did it To use the route-map as the profile for the community string, all advertised routes can be associated with one route-map. Add one file, mangers_rm.py, which is to add/update/del the route-map. Modified the managers_advertise_rt.py file to associate profile with IP route. The route-map usage is very flexible, by this PR, we only support one fixed usage to add community string for route to simplify this design. How to verify it Implement new unit tests for mangers_rm.py and updated unit test for managers_advertise_rt.py. Manually verified the test case in the test plan section, will add testcase in sonic-mgmt later. Azure/sonic-mgmt#5581 --- src/sonic-bgpcfgd/bgpcfgd/main.py | 2 + .../bgpcfgd/managers_advertise_rt.py | 83 ++++++++++++------- src/sonic-bgpcfgd/bgpcfgd/managers_rm.py | 78 +++++++++++++++++ src/sonic-bgpcfgd/tests/test_advertise_rt.py | 72 ++++++++++++++-- src/sonic-bgpcfgd/tests/test_rm.py | 62 ++++++++++++++ 5 files changed, 263 insertions(+), 34 deletions(-) create mode 100644 src/sonic-bgpcfgd/bgpcfgd/managers_rm.py create mode 100644 src/sonic-bgpcfgd/tests/test_rm.py diff --git a/src/sonic-bgpcfgd/bgpcfgd/main.py b/src/sonic-bgpcfgd/bgpcfgd/main.py index 28359dd62eb8..7b4291b4d4a3 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/main.py +++ b/src/sonic-bgpcfgd/bgpcfgd/main.py @@ -17,6 +17,7 @@ from .managers_intf import InterfaceMgr from .managers_setsrc import ZebraSetSrc from .managers_static_rt import StaticRouteMgr +from .managers_rm import RouteMapMgr from .runner import Runner, signal_handler from .template import TemplateFabric from .utils import read_constants @@ -62,6 +63,7 @@ def do_work(): StaticRouteMgr(common_objs, "CONFIG_DB", "STATIC_ROUTE"), # Route Advertisement Managers AdvertiseRouteMgr(common_objs, "STATE_DB", swsscommon.STATE_ADVERTISE_NETWORK_TABLE_NAME), + RouteMapMgr(common_objs, "APPL_DB", swsscommon.APP_BGP_PROFILE_TABLE_NAME), ] runner = Runner(common_objs['cfg_mgr']) for mgr in managers: diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_advertise_rt.py b/src/sonic-bgpcfgd/bgpcfgd/managers_advertise_rt.py index 352b89f7286c..68c48b044f61 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_advertise_rt.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_advertise_rt.py @@ -1,10 +1,14 @@ from .manager import Manager from .template import TemplateFabric from swsscommon import swsscommon +from .managers_rm import ROUTE_MAPS +import ipaddress +from .log import log_info, log_err, log_debug class AdvertiseRouteMgr(Manager): """ This class Advertises routes when ADVERTISE_NETWORK_TABLE in STATE_DB is updated """ + def __init__(self, common_objs, db, table): """ Initialize the object @@ -18,82 +22,105 @@ def __init__(self, common_objs, db, table): db, table, ) - + self.directory.subscribe([("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost/bgp_asn"),], self.on_bgp_asn_change) self.advertised_routes = dict() - OP_DELETE = 'DELETE' - OP_ADD = 'ADD' - + OP_DELETE = "DELETE" + OP_ADD = "ADD" def set_handler(self, key, data): + log_debug("AdvertiseRouteMgr:: set handler") + if not self.__set_handler_validate(key, data): + return True vrf, ip_prefix = self.split_key(key) - self.add_route_advertisement(vrf, ip_prefix) + self.add_route_advertisement(vrf, ip_prefix, data) return True - def del_handler(self, key): + log_debug("AdvertiseRouteMgr:: del handler") vrf, ip_prefix = self.split_key(key) self.remove_route_advertisement(vrf, ip_prefix) - - def add_route_advertisement(self, vrf, ip_prefix): + def __set_handler_validate(self, key, data): + if data: + if ("profile" in data and data["profile"] in ROUTE_MAPS) or data == {"":""}: + """ + APP which config the data should be responsible to pass a valid IP prefix + """ + return True + + log_err("BGPAdvertiseRouteMgr:: Invalid data %s for advertised route %s" % (data, key)) + return False + + def add_route_advertisement(self, vrf, ip_prefix, data): if self.directory.path_exist("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost/bgp_asn"): - if not self.advertised_routes.get(vrf, set()): + if not self.advertised_routes.get(vrf, dict()): self.bgp_network_import_check_commands(vrf, self.OP_ADD) - self.advertise_route_commands(ip_prefix, vrf, self.OP_ADD) - - self.advertised_routes.setdefault(vrf, set()).add(ip_prefix) + self.advertise_route_commands(ip_prefix, vrf, self.OP_ADD, data) + self.advertised_routes.setdefault(vrf, dict()).update({ip_prefix: data}) def remove_route_advertisement(self, vrf, ip_prefix): - self.advertised_routes.setdefault(vrf, set()).discard(ip_prefix) - if not self.advertised_routes.get(vrf, set()): + if ip_prefix not in self.advertised_routes.get(vrf, dict()): + log_info("BGPAdvertiseRouteMgr:: %s|%s does not exist" % (vrf, ip_prefix)) + return + self.advertised_routes.get(vrf, dict()).pop(ip_prefix) + if not self.advertised_routes.get(vrf, dict()): self.advertised_routes.pop(vrf, None) if self.directory.path_exist("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost/bgp_asn"): - if not self.advertised_routes.get(vrf, set()): + if not self.advertised_routes.get(vrf, dict()): self.bgp_network_import_check_commands(vrf, self.OP_DELETE) self.advertise_route_commands(ip_prefix, vrf, self.OP_DELETE) - - def advertise_route_commands(self, ip_prefix, vrf, op): + def advertise_route_commands(self, ip_prefix, vrf, op, data=None): is_ipv6 = TemplateFabric.is_ipv6(ip_prefix) bgp_asn = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME)["localhost"]["bgp_asn"] cmd_list = [] - if vrf == 'default': + if vrf == "default": cmd_list.append("router bgp %s" % bgp_asn) else: cmd_list.append("router bgp %s vrf %s" % (bgp_asn, vrf)) cmd_list.append(" address-family %s unicast" % ("ipv6" if is_ipv6 else "ipv4")) - cmd_list.append(" %snetwork %s" % ('no ' if op == self.OP_DELETE else '', ip_prefix)) - self.cfg_mgr.push_list(cmd_list) + if data and "profile" in data: + cmd_list.append(" network %s route-map %s" % (ip_prefix, "%s_RM" % data["profile"])) + log_debug( + "BGPAdvertiseRouteMgr:: Update bgp %s network %s with route-map %s" + % (bgp_asn, vrf + "|" + ip_prefix, "%s_RM" % data["profile"]) + ) + else: + cmd_list.append(" %snetwork %s" % ("no " if op == self.OP_DELETE else "", ip_prefix)) + log_debug( + "BGPAdvertiseRouteMgr:: %sbgp %s network %s" + % ("Remove " if op == self.OP_DELETE else "Update ", bgp_asn, vrf + "|" + ip_prefix) + ) + self.cfg_mgr.push_list(cmd_list) + log_debug("BGPAdvertiseRouteMgr::Done") def bgp_network_import_check_commands(self, vrf, op): bgp_asn = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME)["localhost"]["bgp_asn"] cmd_list = [] - if vrf == 'default': + if vrf == "default": cmd_list.append("router bgp %s" % bgp_asn) else: cmd_list.append("router bgp %s vrf %s" % (bgp_asn, vrf)) - cmd_list.append(" %sbgp network import-check" % ('' if op == self.OP_DELETE else 'no ')) + cmd_list.append(" %sbgp network import-check" % ("" if op == self.OP_DELETE else "no ")) self.cfg_mgr.push_list(cmd_list) - def on_bgp_asn_change(self): if self.directory.path_exist("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost/bgp_asn"): for vrf, ip_prefixes in self.advertised_routes.items(): self.bgp_network_import_check_commands(vrf, self.OP_ADD) for ip_prefix in ip_prefixes: - self.add_route_advertisement(vrf, ip_prefix) - + self.add_route_advertisement(vrf, ip_prefix, ip_prefixes[ip_prefix]) @staticmethod def split_key(key): @@ -102,7 +129,7 @@ def split_key(key): :param key: key to split :return: vrf name extracted from the key, ip prefix extracted from the key """ - if '|' not in key: - return 'default', key + if "|" not in key: + return "default", key else: - return tuple(key.split('|', 1)) + return tuple(key.split("|", 1)) diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_rm.py b/src/sonic-bgpcfgd/bgpcfgd/managers_rm.py new file mode 100644 index 000000000000..08609c68f9a6 --- /dev/null +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_rm.py @@ -0,0 +1,78 @@ +from .manager import Manager +from .log import log_err, log_debug + +ROUTE_MAPS = ["FROM_SDN_SLB_ROUTES"] + + +class RouteMapMgr(Manager): + """This class add route-map when BGP_PROFILE_TABLE in APPL_DB is updated""" + + def __init__(self, common_objs, db, table): + """ + Initialize the object + :param common_objs: common object dictionary + :param db: name of the db + :param table: name of the table in the db + """ + super(RouteMapMgr, self).__init__( + common_objs, + [], + db, + table, + ) + + def set_handler(self, key, data): + log_debug("BGPRouteMapMgr:: set handler") + """Only need a name as the key, and community id as the data""" + if not self.__set_handler_validate(key, data): + return True + + self.__update_rm(key, data) + return True + + def del_handler(self, key): + log_debug("BGPRouteMapMgr:: del handler") + if not self.__del_handler_validate(key): + return + self.__remove_rm(key) + + def __remove_rm(self, rm): + cmds = ["no route-map %s permit 100" % ("%s_RM" % rm)] + log_debug("BGPRouteMapMgr:: remove route-map %s" % ("%s_RM" % rm)) + self.cfg_mgr.push_list(cmds) + log_debug("BGPRouteMapMgr::Done") + + def __set_handler_validate(self, key, data): + if key not in ROUTE_MAPS: + log_err("BGPRouteMapMgr:: Invalid key for route-map %s" % key) + return False + + if not data: + log_err("BGPRouteMapMgr:: data is None") + return False + community_ids = data["community_id"].split(":") + try: + if ( + len(community_ids) != 2 + or int(community_ids[0]) not in range(0, 65536) + or int(community_ids[1]) not in range(0, 65536) + ): + log_err("BGPRouteMapMgr:: data %s doesn't include valid community id %s" % (data, community_ids)) + return False + except ValueError: + log_err("BGPRouteMapMgr:: data %s includes illegal input" % (data)) + return False + + return True + + def __del_handler_validate(self, key): + if key not in ROUTE_MAPS: + log_err("BGPRouteMapMgr:: Invalid key for route-map %s" % key) + return False + return True + + def __update_rm(self, rm, data): + cmds = ["route-map %s permit 100" % ("%s_RM" % rm), " set community %s" % data["community_id"]] + log_debug("BGPRouteMapMgr:: update route-map %s community %s" % ("%s_RM" % rm, data["community_id"])) + self.cfg_mgr.push_list(cmds) + log_debug("BGPRouteMapMgr::Done") diff --git a/src/sonic-bgpcfgd/tests/test_advertise_rt.py b/src/sonic-bgpcfgd/tests/test_advertise_rt.py index 26f7b6617650..751540600006 100644 --- a/src/sonic-bgpcfgd/tests/test_advertise_rt.py +++ b/src/sonic-bgpcfgd/tests/test_advertise_rt.py @@ -48,7 +48,7 @@ def test_set_del(): set_del_test( mgr, "SET", - ("10.1.0.0/24", {}), + ("10.1.0.0/24", {"":""}), True, [ ["router bgp 65100", @@ -62,7 +62,7 @@ def test_set_del(): set_del_test( mgr, "SET", - ("fc00:10::/64", {}), + ("fc00:10::/64", {"":""}), True, [ ["router bgp 65100", @@ -103,7 +103,7 @@ def test_set_del_vrf(): set_del_test( mgr, "SET", - ("vrfRED|10.2.0.0/24", {}), + ("vrfRED|10.2.0.0/24", {"":""}), True, [ ["router bgp 65100 vrf vrfRED", @@ -117,7 +117,7 @@ def test_set_del_vrf(): set_del_test( mgr, "SET", - ("vrfRED|fc00:20::/64", {}), + ("vrfRED|fc00:20::/64", {"":""}), True, [ ["router bgp 65100 vrf vrfRED", @@ -158,7 +158,9 @@ def test_set_del_bgp_asn_change(): set_del_test( mgr, "SET", - ("vrfRED|10.3.0.0/24", {}), + ("vrfRED|10.3.0.0/24", { + "profile": "FROM_SDN_SLB_ROUTES" + }), True, [] ) @@ -170,7 +172,7 @@ def test_set_del_bgp_asn_change(): " no bgp network import-check"], ["router bgp 65100 vrf vrfRED", " address-family ipv4 unicast", - " network 10.3.0.0/24"] + " network 10.3.0.0/24 route-map FROM_SDN_SLB_ROUTES_RM"] ] def push_list(cmds): test_set_del_bgp_asn_change.push_list_called = True @@ -183,3 +185,61 @@ def push_list(cmds): mgr.directory.put("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, "localhost", {"bgp_asn": "65100"}) assert test_set_del_bgp_asn_change.push_list_called + +def test_set_del_with_community(): + mgr = constructor() + set_del_test( + mgr, + "SET", + ("10.1.0.0/24", { + "profile": "FROM_SDN_SLB_ROUTES" + }), + True, + [ + ["router bgp 65100", + " no bgp network import-check"], + ["router bgp 65100", + " address-family ipv4 unicast", + " network 10.1.0.0/24 route-map FROM_SDN_SLB_ROUTES_RM"] + ] + ) + + set_del_test( + mgr, + "SET", + ("fc00:10::/64", { + "profile": "FROM_SDN_SLB_ROUTES" + }), + True, + [ + ["router bgp 65100", + " address-family ipv6 unicast", + " network fc00:10::/64 route-map FROM_SDN_SLB_ROUTES_RM"] + ] + ) + + set_del_test( + mgr, + "DEL", + ("10.1.0.0/24",), + True, + [ + ["router bgp 65100", + " address-family ipv4 unicast", + " no network 10.1.0.0/24"] + ] + ) + + set_del_test( + mgr, + "DEL", + ("fc00:10::/64",), + True, + [ + ["router bgp 65100", + " bgp network import-check"], + ["router bgp 65100", + " address-family ipv6 unicast", + " no network fc00:10::/64"] + ] + ) \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/test_rm.py b/src/sonic-bgpcfgd/tests/test_rm.py new file mode 100644 index 000000000000..fe89055d27f4 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/test_rm.py @@ -0,0 +1,62 @@ +from unittest.mock import MagicMock +from bgpcfgd.directory import Directory +from bgpcfgd.managers_rm import RouteMapMgr +from swsscommon import swsscommon + +def constructor(): + cfg_mgr = MagicMock() + + common_objs = { + 'directory': Directory(), + 'cfg_mgr': cfg_mgr, + 'constants': {}, + } + + mgr = RouteMapMgr(common_objs, "APPL_DB", "BGP_PROFILE_TABLE") + return mgr + +def set_del_test(mgr, op, args, expected_ret, expected_cmds): + set_del_test.push_list_called = False + def push_list(cmds): + set_del_test.push_list_called = True + assert cmds in expected_cmds + return True + mgr.cfg_mgr.push_list = push_list + + if op == "SET": + ret = mgr.set_handler(*args) + assert ret == expected_ret + elif op == "DEL": + mgr.del_handler(*args) + else: + assert False, "Wrong operation" + + if expected_cmds: + assert set_del_test.push_list_called, "cfg_mgr.push_list wasn't called" + else: + assert not set_del_test.push_list_called, "cfg_mgr.push_list was called" + +def test_set_del(): + mgr = constructor() + set_del_test( + mgr, + "SET", + ("FROM_SDN_SLB_ROUTES", { + "community_id": "1234:1234" + }), + True, + [ + ["route-map FROM_SDN_SLB_ROUTES_RM permit 100", + " set community 1234:1234"] + ] + ) + + set_del_test( + mgr, + "DEL", + ("FROM_SDN_SLB_ROUTES",), + True, + [ + ["no route-map FROM_SDN_SLB_ROUTES_RM permit 100"] + ] + ) From 910e1c6eb48ce6b6235068a65b76cf792c3631aa Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 19 May 2022 21:59:37 +0800 Subject: [PATCH 325/817] [docker-macsec]: MACsec CLI Plugin (#9390) #### Why I did it To provide MACsec config and show CLI for manipulating MACsec #### How I did it Add `config macsec` and `show macsec`. #### How to verify it This PR includes unittest for MACsec CLI, check Azp status. - Add MACsec profile ``` admin@sonic:~$ sudo config macsec profile add --help Usage: config macsec profile add [OPTIONS] Add MACsec profile Options: --priority For Key server election. In 0-255 range with 0 being the highest priority. [default: 255] --cipher_suite The cipher suite for MACsec. [default: GCM- AES-128] --primary_cak Primary Connectivity Association Key. [required] --primary_ckn Primary CAK Name. [required] --policy MACsec policy. INTEGRITY_ONLY: All traffic, except EAPOL, will be converted to MACsec packets without encryption. SECURITY: All traffic, except EAPOL, will be encrypted by SecY. [default: security] --enable_replay_protect / --disable_replay_protect Whether enable replay protect. [default: False] --replay_window Replay window size that is the number of packets that could be out of order. This field works only if ENABLE_REPLAY_PROTECT is true. [default: 0] --send_sci / --no_send_sci Send SCI in SecTAG field of MACsec header. [default: True] --rekey_period The period of proactively refresh (Unit second). [default: 0] -?, -h, --help Show this message and exit. ``` - Delete MACsec profile ``` admin@sonic:~$ sudo config macsec profile del --help Usage: config macsec profile del [OPTIONS] Delete MACsec profile Options: -?, -h, --help Show this message and exit. ``` - Enable MACsec on the port ``` admin@sonic:~$ sudo config macsec port add --help Usage: config macsec port add [OPTIONS] Add MACsec port Options: -?, -h, --help Show this message and exit. ``` - Disable MACsec on the port ``` admin@sonic:~$ sudo config macsec port del --help Usage: config macsec port del [OPTIONS] Delete MACsec port Options: -?, -h, --help Show this message and exit. ``` Show MACsec ``` MACsec port(Ethernet0) --------------------- ----------- cipher_suite GCM-AES-256 enable true enable_encrypt true enable_protect true enable_replay_protect false replay_window 0 send_sci true --------------------- ----------- MACsec Egress SC (5254008f4f1c0001) ----------- - encoding_an 2 ----------- - MACsec Egress SA (1) ------------------------------------- ---------------------------------------------------------------- auth_key 849B69D363E2B0AA154BEBBD7C1D9487 next_pn 1 sak AE8C9BB36EA44B60375E84BC8E778596289E79240FDFA6D7BA33D3518E705A5E salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 179 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED 0 ------------------------------------- ---------------------------------------------------------------- MACsec Egress SA (2) ------------------------------------- ---------------------------------------------------------------- auth_key 5A8B8912139551D3678B43DD0F10FFA5 next_pn 1 sak 7F2651140F12C434F782EF9AD7791EE2CFE2BF315A568A48785E35FC803C9DB6 salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 87185 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED 0 ------------------------------------- ---------------------------------------------------------------- MACsec Ingress SC (525400edac5b0001) MACsec Ingress SA (1) --------------------------------------- ---------------------------------------------------------------- active true auth_key 849B69D363E2B0AA154BEBBD7C1D9487 lowest_acceptable_pn 1 sak AE8C9BB36EA44B60375E84BC8E778596289E79240FDFA6D7BA33D3518E705A5E salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 103 SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED 0 SAI_MACSEC_SA_STAT_IN_PKTS_INVALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_LATE 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_OK 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA 0 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 --------------------------------------- ---------------------------------------------------------------- MACsec Ingress SA (2) --------------------------------------- ---------------------------------------------------------------- active true auth_key 5A8B8912139551D3678B43DD0F10FFA5 lowest_acceptable_pn 1 sak 7F2651140F12C434F782EF9AD7791EE2CFE2BF315A568A48785E35FC803C9DB6 salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 91824 SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED 0 SAI_MACSEC_SA_STAT_IN_PKTS_INVALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_LATE 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_OK 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA 0 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 --------------------------------------- ---------------------------------------------------------------- MACsec port(Ethernet1) --------------------- ----------- cipher_suite GCM-AES-256 enable true enable_encrypt true enable_protect true enable_replay_protect false replay_window 0 send_sci true --------------------- ----------- MACsec Egress SC (5254008f4f1c0001) ----------- - encoding_an 1 ----------- - MACsec Egress SA (1) ------------------------------------- ---------------------------------------------------------------- auth_key 35FC8F2C81BCA28A95845A4D2A1EE6EF next_pn 1 sak 1EC8572B75A840BA6B3833DC550C620D2C65BBDDAD372D27A1DFEB0CD786671B salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 4809 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED 0 ------------------------------------- ---------------------------------------------------------------- MACsec Ingress SC (525400edac5b0001) MACsec Ingress SA (1) --------------------------------------- ---------------------------------------------------------------- active true auth_key 35FC8F2C81BCA28A95845A4D2A1EE6EF lowest_acceptable_pn 1 sak 1EC8572B75A840BA6B3833DC550C620D2C65BBDDAD372D27A1DFEB0CD786671B salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 5033 SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED 0 SAI_MACSEC_SA_STAT_IN_PKTS_INVALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_LATE 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_OK 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA 0 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 --------------------------------------- ---------------------------------------------------------------- ``` --- Makefile.work | 1 + dockers/docker-macsec/Dockerfile.j2 | 1 + .../cli-plugin-tests/appl_db.json | 247 + .../cli-plugin-tests/conftest.py | 33 + .../cli-plugin-tests/counters_db.json | 56923 ++++++++++++++++ .../cli-plugin-tests/mock_tables.py | 124 + .../docker-macsec/cli-plugin-tests/pytest.ini | 2 + .../cli-plugin-tests/test_config_macsec.py | 146 + .../cli-plugin-tests/test_show_macsec.py | 25 + .../cli/config/plugins/macsec.py | 181 + .../cli/show/plugins/show_macsec.py | 217 + rules/docker-macsec.mk | 27 +- 12 files changed, 57919 insertions(+), 8 deletions(-) create mode 100644 dockers/docker-macsec/cli-plugin-tests/appl_db.json create mode 100644 dockers/docker-macsec/cli-plugin-tests/conftest.py create mode 100644 dockers/docker-macsec/cli-plugin-tests/counters_db.json create mode 100644 dockers/docker-macsec/cli-plugin-tests/mock_tables.py create mode 100644 dockers/docker-macsec/cli-plugin-tests/pytest.ini create mode 100644 dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py create mode 100644 dockers/docker-macsec/cli-plugin-tests/test_show_macsec.py create mode 100644 dockers/docker-macsec/cli/config/plugins/macsec.py create mode 100644 dockers/docker-macsec/cli/show/plugins/show_macsec.py diff --git a/Makefile.work b/Makefile.work index 9ecd611e92c6..9fe410a2ef48 100644 --- a/Makefile.work +++ b/Makefile.work @@ -354,6 +354,7 @@ SONIC_BUILD_INSTRUCTION := make \ SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD=$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) \ SONIC_INCLUDE_SYSTEM_TELEMETRY=$(INCLUDE_SYSTEM_TELEMETRY) \ INCLUDE_DHCP_RELAY=$(INCLUDE_DHCP_RELAY) \ + INCLUDE_MACSEC=$(INCLUDE_MACSEC) \ SONIC_INCLUDE_RESTAPI=$(INCLUDE_RESTAPI) \ SONIC_INCLUDE_MUX=$(INCLUDE_MUX) \ TELEMETRY_WRITABLE=$(TELEMETRY_WRITABLE) \ diff --git a/dockers/docker-macsec/Dockerfile.j2 b/dockers/docker-macsec/Dockerfile.j2 index 481e79aa02d0..2e7a412466a5 100644 --- a/dockers/docker-macsec/Dockerfile.j2 +++ b/dockers/docker-macsec/Dockerfile.j2 @@ -27,5 +27,6 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] COPY ["etc/wpa_supplicant.conf", "/etc/wpa_supplicant.conf"] +COPY ["cli", "/cli/"] ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-macsec/cli-plugin-tests/appl_db.json b/dockers/docker-macsec/cli-plugin-tests/appl_db.json new file mode 100644 index 000000000000..ec53af8fd4f0 --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/appl_db.json @@ -0,0 +1,247 @@ +{ + "MACSEC_EGRESS_SA_TABLE:Ethernet1:5254008f4f1c0001:1": { + "type": "hash", + "value": { + "sak": "1EC8572B75A840BA6B3833DC550C620D2C65BBDDAD372D27A1DFEB0CD786671B", + "auth_key": "35FC8F2C81BCA28A95845A4D2A1EE6EF", + "next_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2301455 + }, + "MACSEC_PORT_TABLE:Ethernet5": { + "type": "hash", + "value": { + "enable": "true", + "cipher_suite": "GCM-AES-256", + "send_sci": "true", + "enable_protect": "true", + "enable_encrypt": "true", + "enable_replay_protect": "false", + "replay_window": "0" + }, + "ttl": -0.001, + "expireat": 1651807960.2302043 + }, + "MACSEC_EGRESS_SC_TABLE:Ethernet1:5254008f4f1c0001": { + "type": "hash", + "value": { + "encoding_an": "1" + }, + "ttl": -0.001, + "expireat": 1651807960.2302194 + }, + "MACSEC_INGRESS_SA_TABLE:Ethernet1:525400edac5b0001:1": { + "type": "hash", + "value": { + "active": "true", + "sak": "1EC8572B75A840BA6B3833DC550C620D2C65BBDDAD372D27A1DFEB0CD786671B", + "auth_key": "35FC8F2C81BCA28A95845A4D2A1EE6EF", + "lowest_acceptable_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2302353 + }, + "MACSEC_INGRESS_SC_TABLE:Ethernet1:525400edac5b0001": { + "type": "hash", + "value": { + "Null": "Null" + }, + "ttl": -0.001, + "expireat": 1651807960.2302475 + }, + "MACSEC_INGRESS_SC_TABLE:Ethernet0:525400edac5b0001": { + "type": "hash", + "value": { + "Null": "Null" + }, + "ttl": -0.001, + "expireat": 1651807960.230258 + }, + "MACSEC_EGRESS_SA_TABLE:Ethernet5:5254008f4f1c0001:2": { + "type": "hash", + "value": { + "sak": "3BEBB5BB2539D7231EB95F312B843966180B6C941750B9F1A08AF71BA4508599", + "auth_key": "7C59E0CD393A3BA36B8DDC4C663A11FC", + "next_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2302718 + }, + "MACSEC_INGRESS_SA_TABLE:Ethernet0:525400edac5b0001:2": { + "type": "hash", + "value": { + "active": "true", + "sak": "7F2651140F12C434F782EF9AD7791EE2CFE2BF315A568A48785E35FC803C9DB6", + "auth_key": "5A8B8912139551D3678B43DD0F10FFA5", + "lowest_acceptable_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.230298 + }, + "MACSEC_EGRESS_SC_TABLE:Ethernet5:5254008f4f1c0001": { + "type": "hash", + "value": { + "encoding_an": "2" + }, + "ttl": -0.001, + "expireat": 1651807960.2303102 + }, + "MACSEC_PORT_TABLE:Ethernet0": { + "type": "hash", + "value": { + "enable": "true", + "cipher_suite": "GCM-AES-256", + "send_sci": "true", + "enable_protect": "true", + "enable_encrypt": "true", + "enable_replay_protect": "false", + "replay_window": "0" + }, + "ttl": -0.001, + "expireat": 1651807960.23036 + }, + "MACSEC_INGRESS_SA_TABLE:Ethernet5:5254002003660001:2": { + "type": "hash", + "value": { + "active": "true", + "sak": "3BEBB5BB2539D7231EB95F312B843966180B6C941750B9F1A08AF71BA4508599", + "auth_key": "7C59E0CD393A3BA36B8DDC4C663A11FC", + "lowest_acceptable_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2304032 + }, + "MACSEC_PORT_TABLE:Ethernet4": { + "type": "hash", + "value": { + "enable": "true", + "cipher_suite": "GCM-AES-256", + "send_sci": "true", + "enable_protect": "true", + "enable_encrypt": "true", + "enable_replay_protect": "false", + "replay_window": "0" + }, + "ttl": -0.001, + "expireat": 1651807960.2304454 + }, + "MACSEC_EGRESS_SA_TABLE:Ethernet4:5254008f4f1c0001:1": { + "type": "hash", + "value": { + "sak": "234128B1F6A679E02759D521C1FF448D5CE47B2E691852281EE8E34690B348DD", + "auth_key": "575FC253C395DFC3E1EE42C3DB665913", + "next_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2304764 + }, + "MACSEC_INGRESS_SA_TABLE:Ethernet0:525400edac5b0001:1": { + "type": "hash", + "value": { + "active": "true", + "sak": "AE8C9BB36EA44B60375E84BC8E778596289E79240FDFA6D7BA33D3518E705A5E", + "auth_key": "849B69D363E2B0AA154BEBBD7C1D9487", + "lowest_acceptable_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.230506 + }, + "MACSEC_EGRESS_SC_TABLE:Ethernet0:5254008f4f1c0001": { + "type": "hash", + "value": { + "encoding_an": "2" + }, + "ttl": -0.001, + "expireat": 1651807960.2305164 + }, + "MACSEC_INGRESS_SA_TABLE:Ethernet4:5254002003660001:1": { + "type": "hash", + "value": { + "active": "true", + "sak": "234128B1F6A679E02759D521C1FF448D5CE47B2E691852281EE8E34690B348DD", + "auth_key": "575FC253C395DFC3E1EE42C3DB665913", + "lowest_acceptable_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2305293 + }, + "MACSEC_EGRESS_SA_TABLE:Ethernet0:5254008f4f1c0001:2": { + "type": "hash", + "value": { + "sak": "7F2651140F12C434F782EF9AD7791EE2CFE2BF315A568A48785E35FC803C9DB6", + "auth_key": "5A8B8912139551D3678B43DD0F10FFA5", + "next_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2305422 + }, + "MACSEC_INGRESS_SC_TABLE:Ethernet5:5254002003660001": { + "type": "hash", + "value": { + "Null": "Null" + }, + "ttl": -0.001, + "expireat": 1651807960.2305527 + }, + "MACSEC_INGRESS_SC_TABLE:Ethernet4:5254002003660001": { + "type": "hash", + "value": { + "Null": "Null" + }, + "ttl": -0.001, + "expireat": 1651807960.2305627 + }, + "MACSEC_PORT_TABLE:Ethernet1": { + "type": "hash", + "value": { + "enable": "true", + "cipher_suite": "GCM-AES-256", + "send_sci": "true", + "enable_protect": "true", + "enable_encrypt": "true", + "enable_replay_protect": "false", + "replay_window": "0" + }, + "ttl": -0.001, + "expireat": 1651807960.2305753 + }, + "MACSEC_EGRESS_SA_TABLE:Ethernet0:5254008f4f1c0001:1": { + "type": "hash", + "value": { + "sak": "AE8C9BB36EA44B60375E84BC8E778596289E79240FDFA6D7BA33D3518E705A5E", + "auth_key": "849B69D363E2B0AA154BEBBD7C1D9487", + "next_pn": "1", + "ssci": "0", + "salt": "000000000000000000000000" + }, + "ttl": -0.001, + "expireat": 1651807960.2305882 + }, + "MACSEC_EGRESS_SC_TABLE:Ethernet4:5254008f4f1c0001": { + "type": "hash", + "value": { + "encoding_an": "1" + }, + "ttl": -0.001, + "expireat": 1651807960.2305987 + } +} diff --git a/dockers/docker-macsec/cli-plugin-tests/conftest.py b/dockers/docker-macsec/cli-plugin-tests/conftest.py new file mode 100644 index 000000000000..56dcc3f3023a --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/conftest.py @@ -0,0 +1,33 @@ +import pytest +import mock_tables # lgtm [py/unused-import] +from unittest import mock + + +@pytest.fixture() +def mock_cfgdb(): + cfgdb = mock.Mock() + CONFIG = { + 'PORT': { + 'Ethernet0': { + } + } + } + + def get_entry(table, key): + if table not in CONFIG or key not in CONFIG[table]: + return {} + return CONFIG[table][key] + + def set_entry(table, key, data): + CONFIG.setdefault(table, {}) + CONFIG[table].setdefault(key, {}) + CONFIG[table][key] = data + + def get_keys(table): + return CONFIG[table].keys() + + cfgdb.get_entry = mock.Mock(side_effect=get_entry) + cfgdb.set_entry = mock.Mock(side_effect=set_entry) + cfgdb.get_keys = mock.Mock(side_effect=get_keys) + + yield cfgdb diff --git a/dockers/docker-macsec/cli-plugin-tests/counters_db.json b/dockers/docker-macsec/cli-plugin-tests/counters_db.json new file mode 100644 index 000000000000..f872e7888af3 --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/counters_db.json @@ -0,0 +1,56923 @@ +{ + "COUNTERS_MACSEC_SA_RX_NAME_MAP": { + "type": "hash", + "value": { + "Ethernet0:525400edac5b0001:1": "oid:0x5c0000000027f9", + "Ethernet1:525400edac5b0001:1": "oid:0x5c0000000027fb", + "Ethernet4:5254002003660001:1": "oid:0x5c0000000027fd", + "Ethernet5:5254002003660001:2": "oid:0x5c0000000027ff", + "Ethernet0:525400edac5b0001:2": "oid:0x5c000000002801" + }, + "ttl": -0.001, + "expireat": 1651809068.9579792 + }, + "COUNTERS_MACSEC_NAME_MAP": { + "type": "hash", + "value": { + "Ethernet0:525400edac5b0001:1": "oid:0x5c0000000027f9", + "Ethernet0:5254008f4f1c0001:1": "oid:0x5c0000000027fa", + "Ethernet1:525400edac5b0001:1": "oid:0x5c0000000027fb", + "Ethernet1:5254008f4f1c0001:1": "oid:0x5c0000000027fc", + "Ethernet4:5254002003660001:1": "oid:0x5c0000000027fd", + "Ethernet4:5254008f4f1c0001:1": "oid:0x5c0000000027fe", + "Ethernet5:5254002003660001:2": "oid:0x5c0000000027ff", + "Ethernet5:5254008f4f1c0001:2": "oid:0x5c000000002800", + "Ethernet0:525400edac5b0001:2": "oid:0x5c000000002801", + "Ethernet0:5254008f4f1c0001:2": "oid:0x5c000000002802" + }, + "ttl": -0.001, + "expireat": 1651809068.9580717 + }, + "COUNTERS_MACSEC_SA_TX_NAME_MAP": { + "type": "hash", + "value": { + "Ethernet0:5254008f4f1c0001:1": "oid:0x5c0000000027fa", + "Ethernet1:5254008f4f1c0001:1": "oid:0x5c0000000027fc", + "Ethernet4:5254008f4f1c0001:1": "oid:0x5c0000000027fe", + "Ethernet5:5254008f4f1c0001:2": "oid:0x5c000000002800", + "Ethernet0:5254008f4f1c0001:2": "oid:0x5c000000002802" + }, + "ttl": -0.001, + "expireat": 1651809068.9580936 + }, + "COUNTERS:oid:0x5c00000000251d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.006698 + }, + "COUNTERS:oid:0x5c000000002615": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0067422 + }, + "COUNTERS:oid:0x5c0000000016d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "313" + }, + "ttl": -0.001, + "expireat": 1651808848.006761 + }, + "COUNTERS:oid:0x5c000000002302": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.006775 + }, + "COUNTERS:oid:0x5c000000001ba2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.006798 + }, + "COUNTERS:oid:0x5c00000000165d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0068138 + }, + "COUNTERS:oid:0x5c000000001697": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.006829 + }, + "COUNTERS:oid:0x5c0000000016de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0068412 + }, + "COUNTERS:oid:0x5c000000001a19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1314" + }, + "ttl": -0.001, + "expireat": 1651808848.0068521 + }, + "COUNTERS:oid:0x5c000000001f99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159" + }, + "ttl": -0.001, + "expireat": 1651808848.0068626 + }, + "COUNTERS:oid:0x5c000000001e46": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0068734 + }, + "COUNTERS:oid:0x5c000000001455": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.006884 + }, + "COUNTERS:oid:0x5c000000001e33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0068977 + }, + "COUNTERS:oid:0x5c0000000013ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "118" + }, + "ttl": -0.001, + "expireat": 1651808848.0069118 + }, + "COUNTERS:oid:0x5c000000001e57": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0069232 + }, + "COUNTERS:oid:0x5c0000000014f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "3541" + }, + "ttl": -0.001, + "expireat": 1651808848.0069337 + }, + "COUNTERS:oid:0x5c000000001d33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0069473 + }, + "COUNTERS:oid:0x5c000000002171": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0069616 + }, + "COUNTERS:oid:0x5c00000000248b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "739", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.006973 + }, + "COUNTERS:oid:0x5c000000001d86": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "465", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0069835 + }, + "COUNTERS:oid:0x5c0000000022f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "51" + }, + "ttl": -0.001, + "expireat": 1651808848.0070834 + }, + "COUNTERS:oid:0x5c000000001595": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0071015 + }, + "COUNTERS:oid:0x5c000000001d63": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0071144 + }, + "COUNTERS:oid:0x5c000000002130": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0071256 + }, + "COUNTERS:oid:0x5c000000001c34": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0071363 + }, + "COUNTERS:oid:0x5c0000000018a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.00715 + }, + "COUNTERS:oid:0x5c000000001375": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1355" + }, + "ttl": -0.001, + "expireat": 1651808848.007161 + }, + "COUNTERS:oid:0x5c00000000165c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "189" + }, + "ttl": -0.001, + "expireat": 1651808848.007189 + }, + "COUNTERS:oid:0x5c00000000226a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1507", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0072176 + }, + "COUNTERS:oid:0x5c000000001d87": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "37", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.007346 + }, + "COUNTERS:oid:0x5c000000001ab4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "126" + }, + "ttl": -0.001, + "expireat": 1651808848.0073662 + }, + "COUNTERS:oid:0x5c000000001be8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0073798 + }, + "COUNTERS:oid:0x5c000000001e41": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32" + }, + "ttl": -0.001, + "expireat": 1651808848.0073972 + }, + "COUNTERS:oid:0x5c000000001979": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.007411 + }, + "COUNTERS:oid:0x5c0000000015c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0074277 + }, + "COUNTERS:oid:0x5c0000000025a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0074422 + }, + "COUNTERS:oid:0x5c000000001d32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "121" + }, + "ttl": -0.001, + "expireat": 1651808848.0074558 + }, + "COUNTERS:oid:0x5c000000001641": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132" + }, + "ttl": -0.001, + "expireat": 1651808848.0074692 + }, + "COUNTERS:oid:0x5c000000001818": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0074859 + }, + "COUNTERS:oid:0x5c0000000025dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0074997 + }, + "COUNTERS:oid:0x5c0000000014e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11932", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0075166 + }, + "COUNTERS:oid:0x5c000000001c48": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0076163 + }, + "COUNTERS:oid:0x5c000000001b92": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110" + }, + "ttl": -0.001, + "expireat": 1651808848.0076487 + }, + "COUNTERS:oid:0x5c000000002310": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "50", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0076768 + }, + "COUNTERS:oid:0x5c000000001ff3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0077043 + }, + "COUNTERS:oid:0x5c000000001d51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.0077152 + }, + "COUNTERS:oid:0x5c000000001c8f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "238" + }, + "ttl": -0.001, + "expireat": 1651808848.00773 + }, + "COUNTERS:oid:0x5c000000001ccf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0077415 + }, + "COUNTERS:oid:0x5c000000001c21": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0077553 + }, + "COUNTERS:oid:0x5c000000002436": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0077693 + }, + "COUNTERS:oid:0x5c000000001eed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0077808 + }, + "COUNTERS:oid:0x5c000000001c27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "289" + }, + "ttl": -0.001, + "expireat": 1651808848.0077944 + }, + "COUNTERS:oid:0x5c0000000014cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0078056 + }, + "COUNTERS:oid:0x5c0000000026e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0078194 + }, + "COUNTERS:oid:0x5c000000001997": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0078342 + }, + "COUNTERS:oid:0x5c000000002598": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0078454 + }, + "COUNTERS:oid:0x5c0000000017ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "270" + }, + "ttl": -0.001, + "expireat": 1651808848.0078592 + }, + "COUNTERS:oid:0x5c00000000247a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0078733 + }, + "COUNTERS:oid:0x5c000000001cd3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.007884 + }, + "COUNTERS:oid:0x5c00000000162e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0078948 + }, + "COUNTERS:oid:0x5c00000000164e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0079055 + }, + "COUNTERS:oid:0x5c000000001772": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0079195 + }, + "COUNTERS:oid:0x5c0000000015ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "218" + }, + "ttl": -0.001, + "expireat": 1651808848.0079744 + }, + "COUNTERS:oid:0x5c000000001c10": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0079923 + }, + "COUNTERS:oid:0x5c0000000013cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0080047 + }, + "COUNTERS:oid:0x5c0000000019b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0080156 + }, + "COUNTERS:oid:0x5c00000000233d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.00803 + }, + "COUNTERS:oid:0x5c00000000232c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "61", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008044 + }, + "COUNTERS:oid:0x5c000000001d2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1333" + }, + "ttl": -0.001, + "expireat": 1651808848.008055 + }, + "COUNTERS:oid:0x5c0000000020ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1260" + }, + "ttl": -0.001, + "expireat": 1651808848.008066 + }, + "COUNTERS:oid:0x5c000000001def": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0080767 + }, + "COUNTERS:oid:0x5c00000000276f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0080903 + }, + "COUNTERS:oid:0x5c0000000017f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0081048 + }, + "COUNTERS:oid:0x5c000000001654": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0081162 + }, + "COUNTERS:oid:0x5c0000000022d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008127 + }, + "COUNTERS:oid:0x5c000000001651": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0081377 + }, + "COUNTERS:oid:0x5c000000001d5a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0081515 + }, + "COUNTERS:oid:0x5c000000001a02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "184" + }, + "ttl": -0.001, + "expireat": 1651808848.008163 + }, + "COUNTERS:oid:0x5c0000000018fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.008174 + }, + "COUNTERS:oid:0x5c000000002311": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.0081873 + }, + "COUNTERS:oid:0x5c000000002172": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.008199 + }, + "COUNTERS:oid:0x5c000000001a33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28" + }, + "ttl": -0.001, + "expireat": 1651808848.0082095 + }, + "COUNTERS:oid:0x5c00000000233e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.00822 + }, + "COUNTERS:oid:0x5c000000002473": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0082731 + }, + "COUNTERS:oid:0x5c000000002566": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1267" + }, + "ttl": -0.001, + "expireat": 1651808848.008287 + }, + "COUNTERS:oid:0x5c0000000013fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0083017 + }, + "COUNTERS:oid:0x5c000000001d7a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0083144 + }, + "COUNTERS:oid:0x5c000000001ae0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0083287 + }, + "COUNTERS:oid:0x5c000000001e3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008344 + }, + "COUNTERS:oid:0x5c000000001a4a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0083551 + }, + "COUNTERS:oid:0x5c0000000017f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "258" + }, + "ttl": -0.001, + "expireat": 1651808848.0083692 + }, + "COUNTERS:oid:0x5c000000001479": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "341", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008384 + }, + "COUNTERS:oid:0x5c000000001761": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0083954 + }, + "COUNTERS:oid:0x5c000000002349": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0084262 + }, + "COUNTERS:oid:0x5c0000000025fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008456 + }, + "COUNTERS:oid:0x5c00000000138c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0084674 + }, + "COUNTERS:oid:0x5c000000001741": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0084789 + }, + "COUNTERS:oid:0x5c000000001a32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "37" + }, + "ttl": -0.001, + "expireat": 1651808848.0085113 + }, + "COUNTERS:oid:0x5c000000001ec2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "97" + }, + "ttl": -0.001, + "expireat": 1651808848.0085275 + }, + "COUNTERS:oid:0x5c000000002155": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0085428 + }, + "COUNTERS:oid:0x5c000000002570": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0085552 + }, + "COUNTERS:oid:0x5c0000000017d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "310" + }, + "ttl": -0.001, + "expireat": 1651808848.0085704 + }, + "COUNTERS:oid:0x5c0000000015e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0085826 + }, + "COUNTERS:oid:0x5c00000000258c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0086384 + }, + "COUNTERS:oid:0x5c00000000208a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "111" + }, + "ttl": -0.001, + "expireat": 1651808848.0086534 + }, + "COUNTERS:oid:0x5c000000001705": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0086818 + }, + "COUNTERS:oid:0x5c000000001b10": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "429", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0086935 + }, + "COUNTERS:oid:0x5c000000001f30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0087092 + }, + "COUNTERS:oid:0x5c000000001e42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.0087218 + }, + "COUNTERS:oid:0x5c000000001570": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1582" + }, + "ttl": -0.001, + "expireat": 1651808848.0087335 + }, + "COUNTERS:oid:0x5c0000000018d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008748 + }, + "COUNTERS:oid:0x5c000000002544": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0087597 + }, + "COUNTERS:oid:0x5c000000001796": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0087752 + }, + "COUNTERS:oid:0x5c000000001650": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.008807 + }, + "COUNTERS:oid:0x5c0000000024f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.008819 + }, + "COUNTERS:oid:0x5c000000001e7e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0088463 + }, + "COUNTERS:oid:0x5c00000000250a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0088778 + }, + "COUNTERS:oid:0x5c00000000174c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0088916 + }, + "COUNTERS:oid:0x5c00000000145f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0089054 + }, + "COUNTERS:oid:0x5c00000000212e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1252" + }, + "ttl": -0.001, + "expireat": 1651808848.0089164 + }, + "COUNTERS:oid:0x5c0000000023ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.00893 + }, + "COUNTERS:oid:0x5c0000000018a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0089438 + }, + "COUNTERS:oid:0x5c0000000013b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.008955 + }, + "COUNTERS:oid:0x5c000000001682": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0090425 + }, + "COUNTERS:oid:0x5c000000001e9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0090604 + }, + "COUNTERS:oid:0x5c0000000022d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0090756 + }, + "COUNTERS:oid:0x5c000000001d85": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0090904 + }, + "COUNTERS:oid:0x5c000000001d67": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.009102 + }, + "COUNTERS:oid:0x5c000000001fef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0091136 + }, + "COUNTERS:oid:0x5c00000000171c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0091271 + }, + "COUNTERS:oid:0x5c00000000156f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0091414 + }, + "COUNTERS:oid:0x5c000000001f48": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0091553 + }, + "COUNTERS:oid:0x5c000000002619": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0091696 + }, + "COUNTERS:oid:0x5c0000000013d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0091813 + }, + "COUNTERS:oid:0x5c0000000026e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0091953 + }, + "COUNTERS:oid:0x5c00000000200a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.009227 + }, + "COUNTERS:oid:0x5c000000001df3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0092382 + }, + "COUNTERS:oid:0x5c000000002095": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "262" + }, + "ttl": -0.001, + "expireat": 1651808848.0092518 + }, + "COUNTERS:oid:0x5c000000001631": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "61" + }, + "ttl": -0.001, + "expireat": 1651808848.0092654 + }, + "COUNTERS:oid:0x5c000000002158": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0092764 + }, + "COUNTERS:oid:0x5c000000001a24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.00929 + }, + "COUNTERS:oid:0x5c000000001563": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.009364 + }, + "COUNTERS:oid:0x5c000000001723": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "155" + }, + "ttl": -0.001, + "expireat": 1651808848.0093815 + }, + "COUNTERS:oid:0x5c000000001dea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "118", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0093954 + }, + "COUNTERS:oid:0x5c0000000016c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "67", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0094092 + }, + "COUNTERS:oid:0x5c0000000026ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.009421 + }, + "COUNTERS:oid:0x5c0000000020ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0094318 + }, + "COUNTERS:oid:0x5c000000001ff7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0094597 + }, + "COUNTERS:oid:0x5c0000000023e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0094738 + }, + "COUNTERS:oid:0x5c0000000021f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.00951 + }, + "COUNTERS:oid:0x5c0000000020aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1401", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0095222 + }, + "COUNTERS:oid:0x5c000000001b08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0095332 + }, + "COUNTERS:oid:0x5c000000002447": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0095444 + }, + "COUNTERS:oid:0x5c000000001d9d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.009573 + }, + "COUNTERS:oid:0x5c0000000014ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11796" + }, + "ttl": -0.001, + "expireat": 1651808848.0095847 + }, + "COUNTERS:oid:0x5c00000000211f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0096002 + }, + "COUNTERS:oid:0x5c000000001707": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0096123 + }, + "COUNTERS:oid:0x5c000000001cf4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0096238 + }, + "COUNTERS:oid:0x5c000000001a61": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202" + }, + "ttl": -0.001, + "expireat": 1651808848.0096354 + }, + "COUNTERS:oid:0x5c000000001c55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0096498 + }, + "COUNTERS:oid:0x5c000000001d8f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198" + }, + "ttl": -0.001, + "expireat": 1651808848.0096648 + }, + "COUNTERS:oid:0x5c0000000013cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0097172 + }, + "COUNTERS:oid:0x5c000000001b70": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0097353 + }, + "COUNTERS:oid:0x5c000000002459": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1276", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.009748 + }, + "COUNTERS:oid:0x5c000000001abe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.00976 + }, + "COUNTERS:oid:0x5c000000001a6c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.0097873 + }, + "COUNTERS:oid:0x5c0000000020ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0098143 + }, + "COUNTERS:oid:0x5c000000002667": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.009828 + }, + "COUNTERS:oid:0x5c0000000022c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "71" + }, + "ttl": -0.001, + "expireat": 1651808848.0098393 + }, + "COUNTERS:oid:0x5c000000001c2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0098534 + }, + "COUNTERS:oid:0x5c0000000016e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265" + }, + "ttl": -0.001, + "expireat": 1651808848.0098648 + }, + "COUNTERS:oid:0x5c00000000256d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0098786 + }, + "COUNTERS:oid:0x5c000000002557": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0098925 + }, + "COUNTERS:oid:0x5c0000000026ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "85" + }, + "ttl": -0.001, + "expireat": 1651808848.0099065 + }, + "COUNTERS:oid:0x5c000000001a4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.0099177 + }, + "COUNTERS:oid:0x5c000000001f08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0099287 + }, + "COUNTERS:oid:0x5c000000002337": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "40", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0099428 + }, + "COUNTERS:oid:0x5c000000001ee4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0099568 + }, + "COUNTERS:oid:0x5c000000001c2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0099711 + }, + "COUNTERS:oid:0x5c000000001883": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0099826 + }, + "COUNTERS:oid:0x5c000000001e1a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0100317 + }, + "COUNTERS:oid:0x5c00000000191c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "249", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0100493 + }, + "COUNTERS:oid:0x5c0000000025e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.010064 + }, + "COUNTERS:oid:0x5c000000001673": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0100787 + }, + "COUNTERS:oid:0x5c000000001608": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0100904 + }, + "COUNTERS:oid:0x5c00000000231c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "512", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0101016 + }, + "COUNTERS:oid:0x5c0000000017a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0101154 + }, + "COUNTERS:oid:0x5c0000000017ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "122" + }, + "ttl": -0.001, + "expireat": 1651808848.0101266 + }, + "COUNTERS:oid:0x5c0000000013bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0101402 + }, + "COUNTERS:oid:0x5c0000000025c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0101542 + }, + "COUNTERS:oid:0x5c000000001c0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0101655 + }, + "COUNTERS:oid:0x5c0000000014c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "344", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.010179 + }, + "COUNTERS:oid:0x5c000000001fed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1383", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0101902 + }, + "COUNTERS:oid:0x5c000000001f03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "165", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0102015 + }, + "COUNTERS:oid:0x5c000000002583": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0102148 + }, + "COUNTERS:oid:0x5c000000001d01": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0102262 + }, + "COUNTERS:oid:0x5c000000001783": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1301" + }, + "ttl": -0.001, + "expireat": 1651808848.010237 + }, + "COUNTERS:oid:0x5c00000000173a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302" + }, + "ttl": -0.001, + "expireat": 1651808848.0102506 + }, + "COUNTERS:oid:0x5c0000000015fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300" + }, + "ttl": -0.001, + "expireat": 1651808848.0102646 + }, + "COUNTERS:oid:0x5c0000000018d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.0103133 + }, + "COUNTERS:oid:0x5c000000002318": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "52", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0103283 + }, + "COUNTERS:oid:0x5c00000000217c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0103395 + }, + "COUNTERS:oid:0x5c0000000016fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0103536 + }, + "COUNTERS:oid:0x5c00000000175e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298" + }, + "ttl": -0.001, + "expireat": 1651808848.0103683 + }, + "COUNTERS:oid:0x5c000000002604": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0103796 + }, + "COUNTERS:oid:0x5c00000000156d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.010395 + }, + "COUNTERS:oid:0x5c000000001e35": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0104089 + }, + "COUNTERS:oid:0x5c0000000019b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "152" + }, + "ttl": -0.001, + "expireat": 1651808848.0104227 + }, + "COUNTERS:oid:0x5c00000000162f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0104368 + }, + "COUNTERS:oid:0x5c0000000022ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0105639 + }, + "COUNTERS:oid:0x5c0000000019e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0106716 + }, + "COUNTERS:oid:0x5c000000002549": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0106924 + }, + "COUNTERS:oid:0x5c000000001baa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0107076 + }, + "COUNTERS:oid:0x5c0000000019a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196" + }, + "ttl": -0.001, + "expireat": 1651808848.0107214 + }, + "COUNTERS:oid:0x5c000000001769": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0107348 + }, + "COUNTERS:oid:0x5c0000000017bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "401" + }, + "ttl": -0.001, + "expireat": 1651808848.0107481 + }, + "COUNTERS:oid:0x5c00000000170b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "218" + }, + "ttl": -0.001, + "expireat": 1651808848.0107615 + }, + "COUNTERS:oid:0x5c0000000024fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0107746 + }, + "COUNTERS:oid:0x5c000000001e5e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0107923 + }, + "COUNTERS:oid:0x5c000000001e56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.010874 + }, + "COUNTERS:oid:0x5c000000001b53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0109105 + }, + "COUNTERS:oid:0x5c000000001f45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0109417 + }, + "COUNTERS:oid:0x5c000000001a77": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0109575 + }, + "COUNTERS:oid:0x5c000000001367": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1502" + }, + "ttl": -0.001, + "expireat": 1651808848.0109868 + }, + "COUNTERS:oid:0x5c000000001e58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.011002 + }, + "COUNTERS:oid:0x5c000000001b31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0110145 + }, + "COUNTERS:oid:0x5c000000001fc3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1330", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0110264 + }, + "COUNTERS:oid:0x5c0000000017aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0110419 + }, + "COUNTERS:oid:0x5c000000001f0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "289" + }, + "ttl": -0.001, + "expireat": 1651808848.0110571 + }, + "COUNTERS:oid:0x5c00000000244b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1280", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0110698 + }, + "COUNTERS:oid:0x5c000000001e61": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0110817 + }, + "COUNTERS:oid:0x5c000000001ce7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "152" + }, + "ttl": -0.001, + "expireat": 1651808848.011113 + }, + "COUNTERS:oid:0x5c000000001820": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0111492 + }, + "COUNTERS:oid:0x5c000000001754": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0111637 + }, + "COUNTERS:oid:0x5c000000002330": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "53", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0111752 + }, + "COUNTERS:oid:0x5c000000001863": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0112135 + }, + "COUNTERS:oid:0x5c0000000020fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0112798 + }, + "COUNTERS:oid:0x5c000000001a8c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0113647 + }, + "COUNTERS:oid:0x5c000000002089": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0113833 + }, + "COUNTERS:oid:0x5c000000001484": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278" + }, + "ttl": -0.001, + "expireat": 1651808848.0113957 + }, + "COUNTERS:oid:0x5c0000000013a1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1240" + }, + "ttl": -0.001, + "expireat": 1651808848.0114076 + }, + "COUNTERS:oid:0x5c000000001d15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0114348 + }, + "COUNTERS:oid:0x5c0000000019de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0114489 + }, + "COUNTERS:oid:0x5c000000001963": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0114605 + }, + "COUNTERS:oid:0x5c00000000206a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0114715 + }, + "COUNTERS:oid:0x5c0000000020c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0114825 + }, + "COUNTERS:oid:0x5c000000001904": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0114934 + }, + "COUNTERS:oid:0x5c0000000026ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "80" + }, + "ttl": -0.001, + "expireat": 1651808848.0115201 + }, + "COUNTERS:oid:0x5c00000000227f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.011531 + }, + "COUNTERS:oid:0x5c0000000016c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "246" + }, + "ttl": -0.001, + "expireat": 1651808848.0115416 + }, + "COUNTERS:oid:0x5c0000000025e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.011552 + }, + "COUNTERS:oid:0x5c0000000014a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285" + }, + "ttl": -0.001, + "expireat": 1651808848.0115628 + }, + "COUNTERS:oid:0x5c0000000026e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0115764 + }, + "COUNTERS:oid:0x5c000000001c4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "234", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0115907 + }, + "COUNTERS:oid:0x5c00000000217e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1296", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0116017 + }, + "COUNTERS:oid:0x5c000000001a2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0116155 + }, + "COUNTERS:oid:0x5c00000000248a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0116265 + }, + "COUNTERS:oid:0x5c000000001727": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0116377 + }, + "COUNTERS:oid:0x5c000000001e19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0116496 + }, + "COUNTERS:oid:0x5c000000001b7a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0117068 + }, + "COUNTERS:oid:0x5c000000001e85": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.011725 + }, + "COUNTERS:oid:0x5c000000002277": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "124", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.011737 + }, + "COUNTERS:oid:0x5c0000000019bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0117512 + }, + "COUNTERS:oid:0x5c000000001b77": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.01178 + }, + "COUNTERS:oid:0x5c00000000146e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.011795 + }, + "COUNTERS:oid:0x5c000000002309": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0118093 + }, + "COUNTERS:oid:0x5c00000000200d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "127", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0118208 + }, + "COUNTERS:oid:0x5c000000002186": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1411" + }, + "ttl": -0.001, + "expireat": 1651808848.011832 + }, + "COUNTERS:oid:0x5c00000000145b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5475" + }, + "ttl": -0.001, + "expireat": 1651808848.011843 + }, + "COUNTERS:oid:0x5c000000001eee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "169" + }, + "ttl": -0.001, + "expireat": 1651808848.0118568 + }, + "COUNTERS:oid:0x5c0000000015a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0118713 + }, + "COUNTERS:oid:0x5c000000001c60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0118828 + }, + "COUNTERS:oid:0x5c00000000171b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "136" + }, + "ttl": -0.001, + "expireat": 1651808848.0118935 + }, + "COUNTERS:oid:0x5c000000001c7f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0119042 + }, + "COUNTERS:oid:0x5c0000000018a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.011918 + }, + "COUNTERS:oid:0x5c000000001d78": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.011929 + }, + "COUNTERS:oid:0x5c000000001d07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.0119398 + }, + "COUNTERS:oid:0x5c00000000172a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0119536 + }, + "COUNTERS:oid:0x5c0000000013df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.0119653 + }, + "COUNTERS:oid:0x5c00000000144c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0120466 + }, + "COUNTERS:oid:0x5c00000000265a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0120609 + }, + "COUNTERS:oid:0x5c0000000026e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0120754 + }, + "COUNTERS:oid:0x5c000000001830": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0121067 + }, + "COUNTERS:oid:0x5c000000001c06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0121214 + }, + "COUNTERS:oid:0x5c00000000256b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0121353 + }, + "COUNTERS:oid:0x5c000000001751": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0121467 + }, + "COUNTERS:oid:0x5c0000000018b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0121603 + }, + "COUNTERS:oid:0x5c000000002457": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0121713 + }, + "COUNTERS:oid:0x5c0000000025b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.012185 + }, + "COUNTERS:oid:0x5c0000000027f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.012199 + }, + "COUNTERS:oid:0x5c00000000188e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "128", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0122135 + }, + "COUNTERS:oid:0x5c00000000233a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0122254 + }, + "COUNTERS:oid:0x5c0000000020f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0122364 + }, + "COUNTERS:oid:0x5c000000001ce4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0122466 + }, + "COUNTERS:oid:0x5c000000001349": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "210" + }, + "ttl": -0.001, + "expireat": 1651808848.0122602 + }, + "COUNTERS:oid:0x5c000000001e79": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "262", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0122967 + }, + "COUNTERS:oid:0x5c000000002563": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012311 + }, + "COUNTERS:oid:0x5c000000001888": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "309" + }, + "ttl": -0.001, + "expireat": 1651808848.012374 + }, + "COUNTERS:oid:0x5c000000001d14": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.012392 + }, + "COUNTERS:oid:0x5c0000000015d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0124042 + }, + "COUNTERS:oid:0x5c00000000199f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0124154 + }, + "COUNTERS:oid:0x5c000000002126": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1268" + }, + "ttl": -0.001, + "expireat": 1651808848.0124266 + }, + "COUNTERS:oid:0x5c000000001a3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.0124376 + }, + "COUNTERS:oid:0x5c000000001434": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0124516 + }, + "COUNTERS:oid:0x5c000000001753": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307" + }, + "ttl": -0.001, + "expireat": 1651808848.012463 + }, + "COUNTERS:oid:0x5c000000001df8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0124738 + }, + "COUNTERS:oid:0x5c00000000183a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012488 + }, + "COUNTERS:oid:0x5c0000000021eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1377" + }, + "ttl": -0.001, + "expireat": 1651808848.012499 + }, + "COUNTERS:oid:0x5c0000000024fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012513 + }, + "COUNTERS:oid:0x5c00000000189e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.012537 + }, + "COUNTERS:oid:0x5c0000000014f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "3559" + }, + "ttl": -0.001, + "expireat": 1651808848.012551 + }, + "COUNTERS:oid:0x5c00000000191a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0125654 + }, + "COUNTERS:oid:0x5c000000002653": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0125794 + }, + "COUNTERS:oid:0x5c000000002541": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "153" + }, + "ttl": -0.001, + "expireat": 1651808848.0125933 + }, + "COUNTERS:oid:0x5c0000000013e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0126045 + }, + "COUNTERS:oid:0x5c0000000014e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "327", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0126336 + }, + "COUNTERS:oid:0x5c000000002127": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0127077 + }, + "COUNTERS:oid:0x5c00000000214f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1215", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012723 + }, + "COUNTERS:oid:0x5c000000001d8b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0127378 + }, + "COUNTERS:oid:0x5c000000002351": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012752 + }, + "COUNTERS:oid:0x5c00000000186d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0127664 + }, + "COUNTERS:oid:0x5c000000001fe0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "263", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0127983 + }, + "COUNTERS:oid:0x5c00000000172d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.012826 + }, + "COUNTERS:oid:0x5c000000002007": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0128372 + }, + "COUNTERS:oid:0x5c000000001a8f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.012848 + }, + "COUNTERS:oid:0x5c000000001ccd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "455" + }, + "ttl": -0.001, + "expireat": 1651808848.0128589 + }, + "COUNTERS:oid:0x5c0000000025d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01287 + }, + "COUNTERS:oid:0x5c0000000014ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0129013 + }, + "COUNTERS:oid:0x5c00000000255e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1283", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.012932 + }, + "COUNTERS:oid:0x5c000000001e83": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0129468 + }, + "COUNTERS:oid:0x5c000000001786": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "140" + }, + "ttl": -0.001, + "expireat": 1651808848.012962 + }, + "COUNTERS:oid:0x5c000000001c78": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "111", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0130646 + }, + "COUNTERS:oid:0x5c0000000019dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0130816 + }, + "COUNTERS:oid:0x5c000000001a6d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0130968 + }, + "COUNTERS:oid:0x5c00000000263c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0131576 + }, + "COUNTERS:oid:0x5c00000000243f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0131726 + }, + "COUNTERS:oid:0x5c000000001775": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0131848 + }, + "COUNTERS:oid:0x5c0000000013dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0131965 + }, + "COUNTERS:oid:0x5c000000002138": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0132084 + }, + "COUNTERS:oid:0x5c000000001789": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0132535 + }, + "COUNTERS:oid:0x5c000000002774": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1505" + }, + "ttl": -0.001, + "expireat": 1651808848.0132802 + }, + "COUNTERS:oid:0x5c000000001782": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0132957 + }, + "COUNTERS:oid:0x5c0000000014d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0133076 + }, + "COUNTERS:oid:0x5c000000001d92": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "264", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.013321 + }, + "COUNTERS:oid:0x5c00000000180e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "195" + }, + "ttl": -0.001, + "expireat": 1651808848.0133348 + }, + "COUNTERS:oid:0x5c0000000014a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0133486 + }, + "COUNTERS:oid:0x5c00000000141a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0133796 + }, + "COUNTERS:oid:0x5c0000000016a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.01339 + }, + "COUNTERS:oid:0x5c000000001f1e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "477", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0134006 + }, + "COUNTERS:oid:0x5c000000001465": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0134106 + }, + "COUNTERS:oid:0x5c000000001701": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0134208 + }, + "COUNTERS:oid:0x5c000000001d17": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "467" + }, + "ttl": -0.001, + "expireat": 1651808848.013431 + }, + "COUNTERS:oid:0x5c000000001e8c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0134413 + }, + "COUNTERS:oid:0x5c0000000020a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0134513 + }, + "COUNTERS:oid:0x5c000000001cb7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0134616 + }, + "COUNTERS:oid:0x5c000000001e6f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0134716 + }, + "COUNTERS:oid:0x5c000000002509": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "152" + }, + "ttl": -0.001, + "expireat": 1651808848.0134842 + }, + "COUNTERS:oid:0x5c00000000260b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.013533 + }, + "COUNTERS:oid:0x5c000000001c83": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "442" + }, + "ttl": -0.001, + "expireat": 1651808848.013548 + }, + "COUNTERS:oid:0x5c00000000180d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0135584 + }, + "COUNTERS:oid:0x5c0000000017cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.0135694 + }, + "COUNTERS:oid:0x5c00000000253a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0135796 + }, + "COUNTERS:oid:0x5c000000002596": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1263", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01359 + }, + "COUNTERS:oid:0x5c00000000247d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0136 + }, + "COUNTERS:oid:0x5c000000001497": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11794", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0136132 + }, + "COUNTERS:oid:0x5c000000001e9d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0136244 + }, + "COUNTERS:oid:0x5c000000001f0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1330" + }, + "ttl": -0.001, + "expireat": 1651808848.0136342 + }, + "COUNTERS:oid:0x5c000000001d3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0136445 + }, + "COUNTERS:oid:0x5c000000001b6d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159" + }, + "ttl": -0.001, + "expireat": 1651808848.0136547 + }, + "COUNTERS:oid:0x5c000000001443": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0136678 + }, + "COUNTERS:oid:0x5c00000000232f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "39", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0136812 + }, + "COUNTERS:oid:0x5c00000000139c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "217", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0136945 + }, + "COUNTERS:oid:0x5c000000002107": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0137076 + }, + "COUNTERS:oid:0x5c000000001a01": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183" + }, + "ttl": -0.001, + "expireat": 1651808848.0137203 + }, + "COUNTERS:oid:0x5c000000002510": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0137484 + }, + "COUNTERS:oid:0x5c000000001816": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0137618 + }, + "COUNTERS:oid:0x5c000000001af9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.013775 + }, + "COUNTERS:oid:0x5c000000001750": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0138237 + }, + "COUNTERS:oid:0x5c000000001f5f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.013841 + }, + "COUNTERS:oid:0x5c0000000015a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "193", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0138547 + }, + "COUNTERS:oid:0x5c0000000026e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0138662 + }, + "COUNTERS:oid:0x5c000000001d56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0138795 + }, + "COUNTERS:oid:0x5c000000001b1a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0138905 + }, + "COUNTERS:oid:0x5c000000002576": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1284", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.013901 + }, + "COUNTERS:oid:0x5c00000000253f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0139143 + }, + "COUNTERS:oid:0x5c000000002518": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.013925 + }, + "COUNTERS:oid:0x5c000000001461": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0139353 + }, + "COUNTERS:oid:0x5c00000000189f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0139456 + }, + "COUNTERS:oid:0x5c000000001814": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.013959 + }, + "COUNTERS:oid:0x5c000000001b11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0139723 + }, + "COUNTERS:oid:0x5c000000001887": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0139832 + }, + "COUNTERS:oid:0x5c0000000025a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0139935 + }, + "COUNTERS:oid:0x5c0000000014f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "164", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0140066 + }, + "COUNTERS:oid:0x5c000000002666": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0140173 + }, + "COUNTERS:oid:0x5c000000002018": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "806" + }, + "ttl": -0.001, + "expireat": 1651808848.0140307 + }, + "COUNTERS:oid:0x5c0000000015fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0140417 + }, + "COUNTERS:oid:0x5c000000002646": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014052 + }, + "COUNTERS:oid:0x5c000000001569": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0140998 + }, + "COUNTERS:oid:0x5c000000002567": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0141168 + }, + "COUNTERS:oid:0x5c000000001cb4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "261" + }, + "ttl": -0.001, + "expireat": 1651808848.0141304 + }, + "COUNTERS:oid:0x5c000000001b95": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.014144 + }, + "COUNTERS:oid:0x5c0000000023dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0141575 + }, + "COUNTERS:oid:0x5c00000000254a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0141683 + }, + "COUNTERS:oid:0x5c000000001e00": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0141788 + }, + "COUNTERS:oid:0x5c0000000019b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.014192 + }, + "COUNTERS:oid:0x5c0000000018d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1294" + }, + "ttl": -0.001, + "expireat": 1651808848.014203 + }, + "COUNTERS:oid:0x5c000000002321": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0142164 + }, + "COUNTERS:oid:0x5c000000001ebb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "273" + }, + "ttl": -0.001, + "expireat": 1651808848.01423 + }, + "COUNTERS:oid:0x5c00000000245b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0142407 + }, + "COUNTERS:oid:0x5c0000000015de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "114" + }, + "ttl": -0.001, + "expireat": 1651808848.014251 + }, + "COUNTERS:oid:0x5c0000000015b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0142643 + }, + "COUNTERS:oid:0x5c0000000023fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.014275 + }, + "COUNTERS:oid:0x5c000000001ec5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.014288 + }, + "COUNTERS:oid:0x5c000000002010": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1528" + }, + "ttl": -0.001, + "expireat": 1651808848.0143013 + }, + "COUNTERS:oid:0x5c00000000245d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "140", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014312 + }, + "COUNTERS:oid:0x5c000000001a70": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.014356 + }, + "COUNTERS:oid:0x5c000000001833": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0143726 + }, + "COUNTERS:oid:0x5c00000000253d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014387 + }, + "COUNTERS:oid:0x5c000000001d30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0143979 + }, + "COUNTERS:oid:0x5c00000000147e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0144112 + }, + "COUNTERS:oid:0x5c000000001ce0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.014422 + }, + "COUNTERS:oid:0x5c000000001ca5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0144353 + }, + "COUNTERS:oid:0x5c000000001fff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0144465 + }, + "COUNTERS:oid:0x5c000000001a46": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1370" + }, + "ttl": -0.001, + "expireat": 1651808848.0144567 + }, + "COUNTERS:oid:0x5c000000001984": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1279" + }, + "ttl": -0.001, + "expireat": 1651808848.0144675 + }, + "COUNTERS:oid:0x5c00000000210f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0144808 + }, + "COUNTERS:oid:0x5c000000001804": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0144942 + }, + "COUNTERS:oid:0x5c0000000019f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "204" + }, + "ttl": -0.001, + "expireat": 1651808848.0145051 + }, + "COUNTERS:oid:0x5c000000001399": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0145328 + }, + "COUNTERS:oid:0x5c000000002442": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0145457 + }, + "COUNTERS:oid:0x5c000000002429": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0145588 + }, + "COUNTERS:oid:0x5c000000001b04": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0145693 + }, + "COUNTERS:oid:0x5c000000001919": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0145793 + }, + "COUNTERS:oid:0x5c00000000216e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1258", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0145893 + }, + "COUNTERS:oid:0x5c0000000013cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1268" + }, + "ttl": -0.001, + "expireat": 1651808848.014599 + }, + "COUNTERS:oid:0x5c000000001ce9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0146122 + }, + "COUNTERS:oid:0x5c0000000019bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.014657 + }, + "COUNTERS:oid:0x5c00000000251f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.014673 + }, + "COUNTERS:oid:0x5c000000001b2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0146873 + }, + "COUNTERS:oid:0x5c0000000023de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154" + }, + "ttl": -0.001, + "expireat": 1651808848.0147007 + }, + "COUNTERS:oid:0x5c0000000015fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014714 + }, + "COUNTERS:oid:0x5c000000001765": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.014725 + }, + "COUNTERS:oid:0x5c0000000018bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0147347 + }, + "COUNTERS:oid:0x5c00000000143e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0147474 + }, + "COUNTERS:oid:0x5c000000001f4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "281", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0147603 + }, + "COUNTERS:oid:0x5c0000000015a1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "61" + }, + "ttl": -0.001, + "expireat": 1651808848.0147736 + }, + "COUNTERS:oid:0x5c000000001c2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.0147839 + }, + "COUNTERS:oid:0x5c00000000189a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.0147965 + }, + "COUNTERS:oid:0x5c00000000184b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.014807 + }, + "COUNTERS:oid:0x5c000000001aed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.014817 + }, + "COUNTERS:oid:0x5c000000002444": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0148299 + }, + "COUNTERS:oid:0x5c00000000142c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "221", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0148432 + }, + "COUNTERS:oid:0x5c000000001ce3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.014856 + }, + "COUNTERS:oid:0x5c0000000017af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1317" + }, + "ttl": -0.001, + "expireat": 1651808848.0148666 + }, + "COUNTERS:oid:0x5c00000000232b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "496", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014911 + }, + "COUNTERS:oid:0x5c000000001925": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0149238 + }, + "COUNTERS:oid:0x5c000000002555": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0149374 + }, + "COUNTERS:oid:0x5c000000001cfc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0149486 + }, + "COUNTERS:oid:0x5c000000001ada": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "286" + }, + "ttl": -0.001, + "expireat": 1651808848.014962 + }, + "COUNTERS:oid:0x5c000000001e51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0149724 + }, + "COUNTERS:oid:0x5c000000001b33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0149825 + }, + "COUNTERS:oid:0x5c000000002274": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.014995 + }, + "COUNTERS:oid:0x5c0000000016d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "97" + }, + "ttl": -0.001, + "expireat": 1651808848.0150054 + }, + "COUNTERS:oid:0x5c000000001ca1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0150185 + }, + "COUNTERS:oid:0x5c00000000230b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "63" + }, + "ttl": -0.001, + "expireat": 1651808848.015032 + }, + "COUNTERS:oid:0x5c0000000016bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.015045 + }, + "COUNTERS:oid:0x5c000000001844": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0150754 + }, + "COUNTERS:oid:0x5c000000002624": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0150862 + }, + "COUNTERS:oid:0x5c000000001819": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "106" + }, + "ttl": -0.001, + "expireat": 1651808848.0150967 + }, + "COUNTERS:oid:0x5c00000000250b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.015107 + }, + "COUNTERS:oid:0x5c000000002133": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0151198 + }, + "COUNTERS:oid:0x5c000000002188": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.015131 + }, + "COUNTERS:oid:0x5c0000000027c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "188" + }, + "ttl": -0.001, + "expireat": 1651808848.01516 + }, + "COUNTERS:oid:0x5c00000000165b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "187" + }, + "ttl": -0.001, + "expireat": 1651808848.0151737 + }, + "COUNTERS:oid:0x5c00000000156e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0153139 + }, + "COUNTERS:oid:0x5c00000000169b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0153334 + }, + "COUNTERS:oid:0x5c000000001aa6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01535 + }, + "COUNTERS:oid:0x5c000000002165": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "220" + }, + "ttl": -0.001, + "expireat": 1651808848.0153813 + }, + "COUNTERS:oid:0x5c0000000013dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0153933 + }, + "COUNTERS:oid:0x5c0000000013c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "321", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0154076 + }, + "COUNTERS:oid:0x5c00000000166a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1304" + }, + "ttl": -0.001, + "expireat": 1651808848.015436 + }, + "COUNTERS:oid:0x5c000000002626": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0154471 + }, + "COUNTERS:oid:0x5c00000000277f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.015458 + }, + "COUNTERS:oid:0x5c00000000216b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "174", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0154722 + }, + "COUNTERS:oid:0x5c00000000149d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0154834 + }, + "COUNTERS:oid:0x5c00000000158e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0154943 + }, + "COUNTERS:oid:0x5c00000000191e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0155084 + }, + "COUNTERS:oid:0x5c000000002092": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1173" + }, + "ttl": -0.001, + "expireat": 1651808848.01552 + }, + "COUNTERS:oid:0x5c00000000145c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.015534 + }, + "COUNTERS:oid:0x5c000000001d6e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.0155604 + }, + "COUNTERS:oid:0x5c00000000189b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.015571 + }, + "COUNTERS:oid:0x5c0000000025db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0155852 + }, + "COUNTERS:oid:0x5c000000001a3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "199" + }, + "ttl": -0.001, + "expireat": 1651808848.015599 + }, + "COUNTERS:oid:0x5c00000000245e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0156312 + }, + "COUNTERS:oid:0x5c00000000215d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "245" + }, + "ttl": -0.001, + "expireat": 1651808848.0156808 + }, + "COUNTERS:oid:0x5c00000000213b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0156949 + }, + "COUNTERS:oid:0x5c00000000194d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0157084 + }, + "COUNTERS:oid:0x5c000000001c6b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1322" + }, + "ttl": -0.001, + "expireat": 1651808848.0157194 + }, + "COUNTERS:oid:0x5c000000002592": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0157328 + }, + "COUNTERS:oid:0x5c0000000016ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1260" + }, + "ttl": -0.001, + "expireat": 1651808848.0157435 + }, + "COUNTERS:oid:0x5c00000000195f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278" + }, + "ttl": -0.001, + "expireat": 1651808848.0157537 + }, + "COUNTERS:oid:0x5c0000000023f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "165" + }, + "ttl": -0.001, + "expireat": 1651808848.0157669 + }, + "COUNTERS:oid:0x5c00000000217f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0157807 + }, + "COUNTERS:oid:0x5c0000000020ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0157943 + }, + "COUNTERS:oid:0x5c000000001be9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0158079 + }, + "COUNTERS:oid:0x5c00000000258d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0158212 + }, + "COUNTERS:oid:0x5c0000000015ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0158317 + }, + "COUNTERS:oid:0x5c00000000242a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.015842 + }, + "COUNTERS:oid:0x5c000000001671": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.015855 + }, + "COUNTERS:oid:0x5c00000000255b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0158687 + }, + "COUNTERS:oid:0x5c000000001380": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0158823 + }, + "COUNTERS:oid:0x5c0000000023ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0158956 + }, + "COUNTERS:oid:0x5c000000001cdf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "126", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0159426 + }, + "COUNTERS:oid:0x5c000000001e73": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0159595 + }, + "COUNTERS:oid:0x5c000000001614": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161" + }, + "ttl": -0.001, + "expireat": 1651808848.0159712 + }, + "COUNTERS:oid:0x5c000000001f24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.015982 + }, + "COUNTERS:oid:0x5c0000000013ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0159948 + }, + "COUNTERS:oid:0x5c00000000164b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0160084 + }, + "COUNTERS:oid:0x5c00000000178c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.016022 + }, + "COUNTERS:oid:0x5c000000001713": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.016033 + }, + "COUNTERS:oid:0x5c000000001c9b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0160463 + }, + "COUNTERS:oid:0x5c000000001dd5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0160599 + }, + "COUNTERS:oid:0x5c000000001de4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "257", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0160735 + }, + "COUNTERS:oid:0x5c0000000018dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0160868 + }, + "COUNTERS:oid:0x5c000000001668": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.016098 + }, + "COUNTERS:oid:0x5c000000001b01": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0161111 + }, + "COUNTERS:oid:0x5c000000001a05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0161245 + }, + "COUNTERS:oid:0x5c00000000178f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.016135 + }, + "COUNTERS:oid:0x5c00000000214a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0161455 + }, + "COUNTERS:oid:0x5c000000001bc6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0161588 + }, + "COUNTERS:oid:0x5c0000000025ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.0162232 + }, + "COUNTERS:oid:0x5c0000000023d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0162368 + }, + "COUNTERS:oid:0x5c0000000015e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0162475 + }, + "COUNTERS:oid:0x5c00000000254f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.016261 + }, + "COUNTERS:oid:0x5c0000000023d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104" + }, + "ttl": -0.001, + "expireat": 1651808848.016273 + }, + "COUNTERS:oid:0x5c000000002488": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "89", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0162861 + }, + "COUNTERS:oid:0x5c000000001c81": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0163147 + }, + "COUNTERS:oid:0x5c000000001f06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278" + }, + "ttl": -0.001, + "expireat": 1651808848.0163252 + }, + "COUNTERS:oid:0x5c000000001bd9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0163386 + }, + "COUNTERS:oid:0x5c000000001703": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0163498 + }, + "COUNTERS:oid:0x5c0000000019c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "99" + }, + "ttl": -0.001, + "expireat": 1651808848.0163639 + }, + "COUNTERS:oid:0x5c000000001c42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "151" + }, + "ttl": -0.001, + "expireat": 1651808848.0163777 + }, + "COUNTERS:oid:0x5c0000000018a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.016389 + }, + "COUNTERS:oid:0x5c000000002589": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0164025 + }, + "COUNTERS:oid:0x5c0000000026d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1456" + }, + "ttl": -0.001, + "expireat": 1651808848.0164137 + }, + "COUNTERS:oid:0x5c000000001749": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.016424 + }, + "COUNTERS:oid:0x5c00000000230f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "48", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0164375 + }, + "COUNTERS:oid:0x5c000000001466": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.0164516 + }, + "COUNTERS:oid:0x5c0000000013c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0164652 + }, + "COUNTERS:oid:0x5c0000000016da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0164924 + }, + "COUNTERS:oid:0x5c00000000183f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1276" + }, + "ttl": -0.001, + "expireat": 1651808848.016537 + }, + "COUNTERS:oid:0x5c0000000017f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.01655 + }, + "COUNTERS:oid:0x5c000000001371": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0165606 + }, + "COUNTERS:oid:0x5c0000000026e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.016571 + }, + "COUNTERS:oid:0x5c000000001e2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0165849 + }, + "COUNTERS:oid:0x5c000000001a69": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "95" + }, + "ttl": -0.001, + "expireat": 1651808848.0165997 + }, + "COUNTERS:oid:0x5c000000001a28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0166132 + }, + "COUNTERS:oid:0x5c000000001951": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0166266 + }, + "COUNTERS:oid:0x5c000000001d66": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0166574 + }, + "COUNTERS:oid:0x5c000000001b80": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0166705 + }, + "COUNTERS:oid:0x5c000000001fe3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0166814 + }, + "COUNTERS:oid:0x5c000000001e0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0166914 + }, + "COUNTERS:oid:0x5c00000000158a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0167015 + }, + "COUNTERS:oid:0x5c000000001969": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0167115 + }, + "COUNTERS:oid:0x5c000000001f0f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0167246 + }, + "COUNTERS:oid:0x5c00000000137a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0167375 + }, + "COUNTERS:oid:0x5c0000000018b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0167506 + }, + "COUNTERS:oid:0x5c0000000019f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.016761 + }, + "COUNTERS:oid:0x5c000000001490": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0167713 + }, + "COUNTERS:oid:0x5c000000001af8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.0167813 + }, + "COUNTERS:oid:0x5c00000000211e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1247" + }, + "ttl": -0.001, + "expireat": 1651808848.0168242 + }, + "COUNTERS:oid:0x5c0000000020e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0168757 + }, + "COUNTERS:oid:0x5c000000002550": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.016888 + }, + "COUNTERS:oid:0x5c000000001de7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0168989 + }, + "COUNTERS:oid:0x5c000000001bbe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159" + }, + "ttl": -0.001, + "expireat": 1651808848.0169125 + }, + "COUNTERS:oid:0x5c00000000276c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1385", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.016924 + }, + "COUNTERS:oid:0x5c000000001482": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0169377 + }, + "COUNTERS:oid:0x5c000000001d9e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0169518 + }, + "COUNTERS:oid:0x5c00000000194f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01699 + }, + "COUNTERS:oid:0x5c000000001c8d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200" + }, + "ttl": -0.001, + "expireat": 1651808848.0170283 + }, + "COUNTERS:oid:0x5c00000000163f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0170429 + }, + "COUNTERS:oid:0x5c00000000210a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0170577 + }, + "COUNTERS:oid:0x5c0000000018e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0170953 + }, + "COUNTERS:oid:0x5c00000000168b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0171092 + }, + "COUNTERS:oid:0x5c0000000018c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "204" + }, + "ttl": -0.001, + "expireat": 1651808848.0171208 + }, + "COUNTERS:oid:0x5c0000000025f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0171347 + }, + "COUNTERS:oid:0x5c000000001422": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0171485 + }, + "COUNTERS:oid:0x5c00000000148c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.017162 + }, + "COUNTERS:oid:0x5c0000000013ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0171974 + }, + "COUNTERS:oid:0x5c0000000017e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0172138 + }, + "COUNTERS:oid:0x5c00000000227c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0172439 + }, + "COUNTERS:oid:0x5c0000000016f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0172575 + }, + "COUNTERS:oid:0x5c000000002103": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0173068 + }, + "COUNTERS:oid:0x5c000000001e17": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0173364 + }, + "COUNTERS:oid:0x5c000000001396": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.017366 + }, + "COUNTERS:oid:0x5c0000000025ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0173771 + }, + "COUNTERS:oid:0x5c0000000013a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0173876 + }, + "COUNTERS:oid:0x5c000000002112": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0174005 + }, + "COUNTERS:oid:0x5c000000001d11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0174112 + }, + "COUNTERS:oid:0x5c000000001890": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0174425 + }, + "COUNTERS:oid:0x5c000000002481": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0174565 + }, + "COUNTERS:oid:0x5c00000000136e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0174701 + }, + "COUNTERS:oid:0x5c000000001957": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.017484 + }, + "COUNTERS:oid:0x5c000000002620": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0174944 + }, + "COUNTERS:oid:0x5c000000002551": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0175078 + }, + "COUNTERS:oid:0x5c000000001864": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1313" + }, + "ttl": -0.001, + "expireat": 1651808848.0175388 + }, + "COUNTERS:oid:0x5c000000002651": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.017555 + }, + "COUNTERS:oid:0x5c0000000017b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.017569 + }, + "COUNTERS:oid:0x5c000000001406": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0175831 + }, + "COUNTERS:oid:0x5c000000001cbb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.017594 + }, + "COUNTERS:oid:0x5c000000001d29": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0176077 + }, + "COUNTERS:oid:0x5c000000001952": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "451" + }, + "ttl": -0.001, + "expireat": 1651808848.0176187 + }, + "COUNTERS:oid:0x5c000000001eb0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0176322 + }, + "COUNTERS:oid:0x5c000000002539": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "138", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0176637 + }, + "COUNTERS:oid:0x5c0000000027fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0176747 + }, + "COUNTERS:oid:0x5c00000000259d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0176883 + }, + "COUNTERS:oid:0x5c000000001e34": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0176992 + }, + "COUNTERS:oid:0x5c0000000025a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.017712 + }, + "COUNTERS:oid:0x5c00000000136d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "685" + }, + "ttl": -0.001, + "expireat": 1651808848.0177228 + }, + "COUNTERS:oid:0x5c000000001d2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0177357 + }, + "COUNTERS:oid:0x5c0000000014b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0177495 + }, + "COUNTERS:oid:0x5c000000001fd0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "258" + }, + "ttl": -0.001, + "expireat": 1651808848.017763 + }, + "COUNTERS:oid:0x5c00000000174d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0177736 + }, + "COUNTERS:oid:0x5c0000000020ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2406", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0178092 + }, + "COUNTERS:oid:0x5c000000001ff1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1202", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0178216 + }, + "COUNTERS:oid:0x5c000000001615": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0178354 + }, + "COUNTERS:oid:0x5c000000001c72": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "233", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0178494 + }, + "COUNTERS:oid:0x5c0000000020ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0178602 + }, + "COUNTERS:oid:0x5c000000001db8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1287" + }, + "ttl": -0.001, + "expireat": 1651808848.017898 + }, + "COUNTERS:oid:0x5c000000001c6c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0179286 + }, + "COUNTERS:oid:0x5c000000001457": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.01794 + }, + "COUNTERS:oid:0x5c000000001fd2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0179543 + }, + "COUNTERS:oid:0x5c000000001960": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0179884 + }, + "COUNTERS:oid:0x5c00000000164f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.018003 + }, + "COUNTERS:oid:0x5c000000001f56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.018015 + }, + "COUNTERS:oid:0x5c0000000019af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "96" + }, + "ttl": -0.001, + "expireat": 1651808848.018029 + }, + "COUNTERS:oid:0x5c000000001974": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0180612 + }, + "COUNTERS:oid:0x5c000000001f51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0180762 + }, + "COUNTERS:oid:0x5c000000001688": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172" + }, + "ttl": -0.001, + "expireat": 1651808848.018128 + }, + "COUNTERS:oid:0x5c000000001590": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1297" + }, + "ttl": -0.001, + "expireat": 1651808848.0181403 + }, + "COUNTERS:oid:0x5c00000000252f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.018157 + }, + "COUNTERS:oid:0x5c000000002131": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0182145 + }, + "COUNTERS:oid:0x5c000000001bb6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "96", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0182338 + }, + "COUNTERS:oid:0x5c000000001a0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0182629 + }, + "COUNTERS:oid:0x5c000000001d35": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0182946 + }, + "COUNTERS:oid:0x5c000000001b76": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0183258 + }, + "COUNTERS:oid:0x5c00000000161a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1266" + }, + "ttl": -0.001, + "expireat": 1651808848.018338 + }, + "COUNTERS:oid:0x5c000000001d03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0183496 + }, + "COUNTERS:oid:0x5c00000000167e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "163", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0183613 + }, + "COUNTERS:oid:0x5c0000000015b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0183728 + }, + "COUNTERS:oid:0x5c000000001fd9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1281" + }, + "ttl": -0.001, + "expireat": 1651808848.0184069 + }, + "COUNTERS:oid:0x5c000000001a60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192" + }, + "ttl": -0.001, + "expireat": 1651808848.0184584 + }, + "COUNTERS:oid:0x5c0000000018db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0184884 + }, + "COUNTERS:oid:0x5c000000001ffa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0185041 + }, + "COUNTERS:oid:0x5c0000000023d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0185206 + }, + "COUNTERS:oid:0x5c000000002014": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "125" + }, + "ttl": -0.001, + "expireat": 1651808848.0185368 + }, + "COUNTERS:oid:0x5c000000001ea4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0185723 + }, + "COUNTERS:oid:0x5c0000000014b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0185854 + }, + "COUNTERS:oid:0x5c000000001573": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "647", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0186017 + }, + "COUNTERS:oid:0x5c00000000201a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9" + }, + "ttl": -0.001, + "expireat": 1651808848.0186186 + }, + "COUNTERS:oid:0x5c000000002137": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0186572 + }, + "COUNTERS:oid:0x5c00000000265b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0186765 + }, + "COUNTERS:oid:0x5c0000000025b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01869 + }, + "COUNTERS:oid:0x5c0000000014ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0187063 + }, + "COUNTERS:oid:0x5c0000000013c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01872 + }, + "COUNTERS:oid:0x5c000000002184": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "157", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0187328 + }, + "COUNTERS:oid:0x5c000000001f41": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0187457 + }, + "COUNTERS:oid:0x5c000000002139": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.018762 + }, + "COUNTERS:oid:0x5c000000001c7e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0187795 + }, + "COUNTERS:oid:0x5c0000000018f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "229", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0187962 + }, + "COUNTERS:oid:0x5c0000000013f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0188096 + }, + "COUNTERS:oid:0x5c000000001b89": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.01884 + }, + "COUNTERS:oid:0x5c000000001ed5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.018856 + }, + "COUNTERS:oid:0x5c000000001bdb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0188954 + }, + "COUNTERS:oid:0x5c0000000016cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "294", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.018911 + }, + "COUNTERS:oid:0x5c000000001bad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "140", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0189266 + }, + "COUNTERS:oid:0x5c0000000020a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0189388 + }, + "COUNTERS:oid:0x5c00000000234a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.018951 + }, + "COUNTERS:oid:0x5c000000001d5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0189662 + }, + "COUNTERS:oid:0x5c0000000022f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "83", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0205345 + }, + "COUNTERS:oid:0x5c000000001867": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0205562 + }, + "COUNTERS:oid:0x5c000000001647": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0205715 + }, + "COUNTERS:oid:0x5c0000000027f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.020586 + }, + "COUNTERS:oid:0x5c000000001e04": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0206006 + }, + "COUNTERS:oid:0x5c000000002119": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0227287 + }, + "COUNTERS:oid:0x5c000000001494": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0241034 + }, + "COUNTERS:oid:0x5c000000001dad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0241227 + }, + "COUNTERS:oid:0x5c00000000144f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0241756 + }, + "COUNTERS:oid:0x5c000000001d49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1303" + }, + "ttl": -0.001, + "expireat": 1651808848.0241892 + }, + "COUNTERS:oid:0x5c0000000020af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0242062 + }, + "COUNTERS:oid:0x5c00000000240c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0242236 + }, + "COUNTERS:oid:0x5c000000001c31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.024256 + }, + "COUNTERS:oid:0x5c000000001577": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295" + }, + "ttl": -0.001, + "expireat": 1651808848.0242732 + }, + "COUNTERS:oid:0x5c000000001b05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0242891 + }, + "COUNTERS:oid:0x5c00000000143a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0243044 + }, + "COUNTERS:oid:0x5c000000002471": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1264" + }, + "ttl": -0.001, + "expireat": 1651808848.024317 + }, + "COUNTERS:oid:0x5c000000002401": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1267", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.024565 + }, + "COUNTERS:oid:0x5c000000001758": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.02458 + }, + "COUNTERS:oid:0x5c000000002162": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0245924 + }, + "COUNTERS:oid:0x5c0000000023e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0246038 + }, + "COUNTERS:oid:0x5c00000000214c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0246155 + }, + "COUNTERS:oid:0x5c0000000025bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0246272 + }, + "COUNTERS:oid:0x5c0000000020c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0246427 + }, + "COUNTERS:oid:0x5c000000002134": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0246673 + }, + "COUNTERS:oid:0x5c0000000017e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.0246794 + }, + "COUNTERS:oid:0x5c000000001b4a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.0246909 + }, + "COUNTERS:oid:0x5c000000001576": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "729" + }, + "ttl": -0.001, + "expireat": 1651808848.0247025 + }, + "COUNTERS:oid:0x5c000000001aae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1291" + }, + "ttl": -0.001, + "expireat": 1651808848.0247138 + }, + "COUNTERS:oid:0x5c0000000022fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "78", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0247288 + }, + "COUNTERS:oid:0x5c000000001964": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0247443 + }, + "COUNTERS:oid:0x5c000000001e1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.0247731 + }, + "COUNTERS:oid:0x5c0000000027f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0247848 + }, + "COUNTERS:oid:0x5c0000000015e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0248 + }, + "COUNTERS:oid:0x5c0000000025e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0248156 + }, + "COUNTERS:oid:0x5c00000000276a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0248306 + }, + "COUNTERS:oid:0x5c00000000193b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0248454 + }, + "COUNTERS:oid:0x5c00000000234d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0248804 + }, + "COUNTERS:oid:0x5c0000000019e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.02496 + }, + "COUNTERS:oid:0x5c000000001a2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0250642 + }, + "COUNTERS:oid:0x5c00000000173e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "127" + }, + "ttl": -0.001, + "expireat": 1651808848.025083 + }, + "COUNTERS:oid:0x5c0000000016c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0251117 + }, + "COUNTERS:oid:0x5c000000001c09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0251245 + }, + "COUNTERS:oid:0x5c000000002644": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0251367 + }, + "COUNTERS:oid:0x5c0000000019f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "203" + }, + "ttl": -0.001, + "expireat": 1651808848.0251515 + }, + "COUNTERS:oid:0x5c000000001440": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "97" + }, + "ttl": -0.001, + "expireat": 1651808848.0251641 + }, + "COUNTERS:oid:0x5c0000000025a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0251794 + }, + "COUNTERS:oid:0x5c000000001384": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1390" + }, + "ttl": -0.001, + "expireat": 1651808848.025212 + }, + "COUNTERS:oid:0x5c0000000018be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "455", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0252242 + }, + "COUNTERS:oid:0x5c000000001b81": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0252354 + }, + "COUNTERS:oid:0x5c0000000016f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0252466 + }, + "COUNTERS:oid:0x5c000000001419": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1249" + }, + "ttl": -0.001, + "expireat": 1651808848.0252726 + }, + "COUNTERS:oid:0x5c000000001a99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0252848 + }, + "COUNTERS:oid:0x5c0000000023f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1283", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0252964 + }, + "COUNTERS:oid:0x5c000000001968": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0253112 + }, + "COUNTERS:oid:0x5c0000000022f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0253272 + }, + "COUNTERS:oid:0x5c000000002529": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "150", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0253425 + }, + "COUNTERS:oid:0x5c000000001c8c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "152" + }, + "ttl": -0.001, + "expireat": 1651808848.0253575 + }, + "COUNTERS:oid:0x5c000000001e07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0253694 + }, + "COUNTERS:oid:0x5c0000000017f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144" + }, + "ttl": -0.001, + "expireat": 1651808848.0254302 + }, + "COUNTERS:oid:0x5c000000001c4e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1351" + }, + "ttl": -0.001, + "expireat": 1651808848.0254452 + }, + "COUNTERS:oid:0x5c000000001be0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0254567 + }, + "COUNTERS:oid:0x5c000000001736": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0254717 + }, + "COUNTERS:oid:0x5c0000000015f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0254846 + }, + "COUNTERS:oid:0x5c000000001ca4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.025496 + }, + "COUNTERS:oid:0x5c000000001b2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159" + }, + "ttl": -0.001, + "expireat": 1651808848.0255077 + }, + "COUNTERS:oid:0x5c000000001afd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0255222 + }, + "COUNTERS:oid:0x5c000000001fb1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0255678 + }, + "COUNTERS:oid:0x5c0000000016e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0255806 + }, + "COUNTERS:oid:0x5c0000000024f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "174" + }, + "ttl": -0.001, + "expireat": 1651808848.0256083 + }, + "COUNTERS:oid:0x5c00000000266d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.025624 + }, + "COUNTERS:oid:0x5c0000000025c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0256398 + }, + "COUNTERS:oid:0x5c000000001b36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.025655 + }, + "COUNTERS:oid:0x5c0000000017c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0256674 + }, + "COUNTERS:oid:0x5c00000000199c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "397", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.025679 + }, + "COUNTERS:oid:0x5c000000001773": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.025704 + }, + "COUNTERS:oid:0x5c00000000199e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31" + }, + "ttl": -0.001, + "expireat": 1651808848.0257196 + }, + "COUNTERS:oid:0x5c000000001c70": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110" + }, + "ttl": -0.001, + "expireat": 1651808848.025749 + }, + "COUNTERS:oid:0x5c0000000017ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0257618 + }, + "COUNTERS:oid:0x5c000000001e12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0258236 + }, + "COUNTERS:oid:0x5c000000001cd9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "267" + }, + "ttl": -0.001, + "expireat": 1651808848.0258431 + }, + "COUNTERS:oid:0x5c0000000015f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.025859 + }, + "COUNTERS:oid:0x5c00000000142d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0258715 + }, + "COUNTERS:oid:0x5c000000001d9c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0259078 + }, + "COUNTERS:oid:0x5c000000001b7c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0259242 + }, + "COUNTERS:oid:0x5c000000001681": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0259397 + }, + "COUNTERS:oid:0x5c000000002301": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0259554 + }, + "COUNTERS:oid:0x5c000000001cfe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "277" + }, + "ttl": -0.001, + "expireat": 1651808848.025971 + }, + "COUNTERS:oid:0x5c000000001ebf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.025986 + }, + "COUNTERS:oid:0x5c0000000021fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0259986 + }, + "COUNTERS:oid:0x5c00000000208f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0260139 + }, + "COUNTERS:oid:0x5c000000001dcc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0260386 + }, + "COUNTERS:oid:0x5c0000000017b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.026051 + }, + "COUNTERS:oid:0x5c0000000016b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0260625 + }, + "COUNTERS:oid:0x5c000000002552": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0260882 + }, + "COUNTERS:oid:0x5c000000001c59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0261037 + }, + "COUNTERS:oid:0x5c000000001e0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "276", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0261192 + }, + "COUNTERS:oid:0x5c000000001ac3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0261817 + }, + "COUNTERS:oid:0x5c000000002313": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "64", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0262008 + }, + "COUNTERS:oid:0x5c000000001ad8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026217 + }, + "COUNTERS:oid:0x5c0000000013e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "217", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0262296 + }, + "COUNTERS:oid:0x5c000000001d7d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0262446 + }, + "COUNTERS:oid:0x5c000000001c36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0262568 + }, + "COUNTERS:oid:0x5c00000000181a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0262718 + }, + "COUNTERS:oid:0x5c0000000023d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1596" + }, + "ttl": -0.001, + "expireat": 1651808848.0262938 + }, + "COUNTERS:oid:0x5c000000002161": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0263097 + }, + "COUNTERS:oid:0x5c0000000018b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0263216 + }, + "COUNTERS:oid:0x5c0000000014f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026351 + }, + "COUNTERS:oid:0x5c000000001b43": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.026367 + }, + "COUNTERS:oid:0x5c000000001ecd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0263824 + }, + "COUNTERS:oid:0x5c000000001944": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0263946 + }, + "COUNTERS:oid:0x5c000000002280": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4" + }, + "ttl": -0.001, + "expireat": 1651808848.02641 + }, + "COUNTERS:oid:0x5c000000002617": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026422 + }, + "COUNTERS:oid:0x5c000000002647": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.02645 + }, + "COUNTERS:oid:0x5c0000000015a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0264623 + }, + "COUNTERS:oid:0x5c00000000135c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "339" + }, + "ttl": -0.001, + "expireat": 1651808848.026525 + }, + "COUNTERS:oid:0x5c000000001d70": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0265405 + }, + "COUNTERS:oid:0x5c000000001d90": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161" + }, + "ttl": -0.001, + "expireat": 1651808848.026553 + }, + "COUNTERS:oid:0x5c0000000013ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1318" + }, + "ttl": -0.001, + "expireat": 1651808848.0265646 + }, + "COUNTERS:oid:0x5c000000002012": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.02658 + }, + "COUNTERS:oid:0x5c000000002120": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0265923 + }, + "COUNTERS:oid:0x5c00000000199b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026607 + }, + "COUNTERS:oid:0x5c000000002465": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.0266192 + }, + "COUNTERS:oid:0x5c000000001dbb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0266337 + }, + "COUNTERS:oid:0x5c000000001dc2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0266743 + }, + "COUNTERS:oid:0x5c0000000027f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0266864 + }, + "COUNTERS:oid:0x5c0000000015bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.026701 + }, + "COUNTERS:oid:0x5c000000002110": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026713 + }, + "COUNTERS:oid:0x5c000000001a12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026724 + }, + "COUNTERS:oid:0x5c000000002118": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0267353 + }, + "COUNTERS:oid:0x5c0000000023fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0267498 + }, + "COUNTERS:oid:0x5c0000000013bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0267618 + }, + "COUNTERS:oid:0x5c0000000021fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0267904 + }, + "COUNTERS:oid:0x5c000000001e76": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0268154 + }, + "COUNTERS:oid:0x5c000000001653": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0268328 + }, + "COUNTERS:oid:0x5c000000001c25": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.026863 + }, + "COUNTERS:oid:0x5c000000002627": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0269246 + }, + "COUNTERS:oid:0x5c000000001687": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0269434 + }, + "COUNTERS:oid:0x5c000000002418": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0269587 + }, + "COUNTERS:oid:0x5c0000000025d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0269732 + }, + "COUNTERS:oid:0x5c000000001885": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0269997 + }, + "COUNTERS:oid:0x5c000000001b47": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0270152 + }, + "COUNTERS:oid:0x5c000000001fdd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1323", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0270271 + }, + "COUNTERS:oid:0x5c0000000013be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0270414 + }, + "COUNTERS:oid:0x5c000000001808": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0270565 + }, + "COUNTERS:oid:0x5c000000001dee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027072 + }, + "COUNTERS:oid:0x5c000000001ed1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0270872 + }, + "COUNTERS:oid:0x5c0000000024c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0271184 + }, + "COUNTERS:oid:0x5c0000000023f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0271335 + }, + "COUNTERS:oid:0x5c000000001ccc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027148 + }, + "COUNTERS:oid:0x5c000000001aa3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0271595 + }, + "COUNTERS:oid:0x5c000000002590": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027171 + }, + "COUNTERS:oid:0x5c0000000024fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1606", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027182 + }, + "COUNTERS:oid:0x5c000000001e10": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0271966 + }, + "COUNTERS:oid:0x5c00000000198a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "109" + }, + "ttl": -0.001, + "expireat": 1651808848.0272977 + }, + "COUNTERS:oid:0x5c000000001764": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0273175 + }, + "COUNTERS:oid:0x5c000000001942": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1308" + }, + "ttl": -0.001, + "expireat": 1651808848.0273309 + }, + "COUNTERS:oid:0x5c000000001e09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "121" + }, + "ttl": -0.001, + "expireat": 1651808848.0273426 + }, + "COUNTERS:oid:0x5c000000001a63": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "270" + }, + "ttl": -0.001, + "expireat": 1651808848.027357 + }, + "COUNTERS:oid:0x5c000000002586": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1277" + }, + "ttl": -0.001, + "expireat": 1651808848.0273693 + }, + "COUNTERS:oid:0x5c000000002611": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0273836 + }, + "COUNTERS:oid:0x5c000000001840": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0273986 + }, + "COUNTERS:oid:0x5c0000000016e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0274105 + }, + "COUNTERS:oid:0x5c0000000018c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0274253 + }, + "COUNTERS:oid:0x5c000000002093": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0274544 + }, + "COUNTERS:oid:0x5c000000002802": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "85552" + }, + "ttl": -0.001, + "expireat": 1651808848.0274673 + }, + "COUNTERS:oid:0x5c000000002535": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0274823 + }, + "COUNTERS:oid:0x5c000000001cce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027498 + }, + "COUNTERS:oid:0x5c00000000157f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027513 + }, + "COUNTERS:oid:0x5c000000001d9f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0275252 + }, + "COUNTERS:oid:0x5c000000001ca0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0275366 + }, + "COUNTERS:oid:0x5c000000001a65": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0275514 + }, + "COUNTERS:oid:0x5c00000000169f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28" + }, + "ttl": -0.001, + "expireat": 1651808848.0275667 + }, + "COUNTERS:oid:0x5c0000000026bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0276008 + }, + "COUNTERS:oid:0x5c000000002610": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1258", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0276144 + }, + "COUNTERS:oid:0x5c000000002395": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147" + }, + "ttl": -0.001, + "expireat": 1651808848.0276263 + }, + "COUNTERS:oid:0x5c0000000019d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161" + }, + "ttl": -0.001, + "expireat": 1651808848.027641 + }, + "COUNTERS:oid:0x5c000000001bf3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0276566 + }, + "COUNTERS:oid:0x5c0000000022f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0276723 + }, + "COUNTERS:oid:0x5c000000002167": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0276968 + }, + "COUNTERS:oid:0x5c000000001f19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0277123 + }, + "COUNTERS:oid:0x5c00000000138f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1646" + }, + "ttl": -0.001, + "expireat": 1651808848.027724 + }, + "COUNTERS:oid:0x5c000000001480": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11523" + }, + "ttl": -0.001, + "expireat": 1651808848.0277355 + }, + "COUNTERS:oid:0x5c000000001b41": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0277505 + }, + "COUNTERS:oid:0x5c0000000015f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "169" + }, + "ttl": -0.001, + "expireat": 1651808848.0277653 + }, + "COUNTERS:oid:0x5c000000002170": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.027777 + }, + "COUNTERS:oid:0x5c00000000250d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0277917 + }, + "COUNTERS:oid:0x5c000000002621": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0278063 + }, + "COUNTERS:oid:0x5c0000000020fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.027818 + }, + "COUNTERS:oid:0x5c000000002408": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0278323 + }, + "COUNTERS:oid:0x5c000000001c68": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "199" + }, + "ttl": -0.001, + "expireat": 1651808848.0278442 + }, + "COUNTERS:oid:0x5c000000001a81": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0278587 + }, + "COUNTERS:oid:0x5c00000000244e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0278935 + }, + "COUNTERS:oid:0x5c000000002628": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1277" + }, + "ttl": -0.001, + "expireat": 1651808848.0279083 + }, + "COUNTERS:oid:0x5c000000001450": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "243" + }, + "ttl": -0.001, + "expireat": 1651808848.0279427 + }, + "COUNTERS:oid:0x5c0000000026c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0279725 + }, + "COUNTERS:oid:0x5c000000002108": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0279846 + }, + "COUNTERS:oid:0x5c000000002090": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0279965 + }, + "COUNTERS:oid:0x5c000000001420": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0280075 + }, + "COUNTERS:oid:0x5c000000002800": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4401", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.028019 + }, + "COUNTERS:oid:0x5c000000001a23": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0280302 + }, + "COUNTERS:oid:0x5c000000002524": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0280418 + }, + "COUNTERS:oid:0x5c000000001928": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0280564 + }, + "COUNTERS:oid:0x5c00000000252c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0280685 + }, + "COUNTERS:oid:0x5c00000000167c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0280805 + }, + "COUNTERS:oid:0x5c000000001e0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0280917 + }, + "COUNTERS:oid:0x5c000000001a22": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0281065 + }, + "COUNTERS:oid:0x5c000000001bc4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.028122 + }, + "COUNTERS:oid:0x5c0000000018cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1264" + }, + "ttl": -0.001, + "expireat": 1651808848.0281339 + }, + "COUNTERS:oid:0x5c000000001f1b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.028149 + }, + "COUNTERS:oid:0x5c000000001c98": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1337" + }, + "ttl": -0.001, + "expireat": 1651808848.028161 + }, + "COUNTERS:oid:0x5c00000000250e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1375", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0281727 + }, + "COUNTERS:oid:0x5c000000002016": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "8" + }, + "ttl": -0.001, + "expireat": 1651808848.0281878 + }, + "COUNTERS:oid:0x5c00000000195b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "164" + }, + "ttl": -0.001, + "expireat": 1651808848.0282598 + }, + "COUNTERS:oid:0x5c0000000026ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.028278 + }, + "COUNTERS:oid:0x5c000000001b1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1306" + }, + "ttl": -0.001, + "expireat": 1651808848.0282907 + }, + "COUNTERS:oid:0x5c0000000025b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.028303 + }, + "COUNTERS:oid:0x5c000000002622": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0283308 + }, + "COUNTERS:oid:0x5c000000002406": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0283427 + }, + "COUNTERS:oid:0x5c000000002500": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0283544 + }, + "COUNTERS:oid:0x5c000000001c04": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.028398 + }, + "COUNTERS:oid:0x5c000000001b75": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "138" + }, + "ttl": -0.001, + "expireat": 1651808848.0284104 + }, + "COUNTERS:oid:0x5c000000001b6b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0284219 + }, + "COUNTERS:oid:0x5c0000000025a1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0284586 + }, + "COUNTERS:oid:0x5c000000001981": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0284712 + }, + "COUNTERS:oid:0x5c000000001fd7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.028483 + }, + "COUNTERS:oid:0x5c000000001d4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0284977 + }, + "COUNTERS:oid:0x5c000000001a6e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0285096 + }, + "COUNTERS:oid:0x5c00000000241b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.028521 + }, + "COUNTERS:oid:0x5c000000001b49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "314" + }, + "ttl": -0.001, + "expireat": 1651808848.0285356 + }, + "COUNTERS:oid:0x5c000000001c24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0285475 + }, + "COUNTERS:oid:0x5c000000001fd8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "271" + }, + "ttl": -0.001, + "expireat": 1651808848.028562 + }, + "COUNTERS:oid:0x5c00000000256c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0285857 + }, + "COUNTERS:oid:0x5c000000001391": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0285978 + }, + "COUNTERS:oid:0x5c00000000260c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0286534 + }, + "COUNTERS:oid:0x5c000000001d4b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.028666 + }, + "COUNTERS:oid:0x5c00000000168d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "309", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.028681 + }, + "COUNTERS:oid:0x5c000000002015": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105" + }, + "ttl": -0.001, + "expireat": 1651808848.028693 + }, + "COUNTERS:oid:0x5c000000001ff8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "996" + }, + "ttl": -0.001, + "expireat": 1651808848.0287073 + }, + "COUNTERS:oid:0x5c00000000241c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0287218 + }, + "COUNTERS:oid:0x5c00000000146c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0287368 + }, + "COUNTERS:oid:0x5c0000000014de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0287511 + }, + "COUNTERS:oid:0x5c0000000020d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0287654 + }, + "COUNTERS:oid:0x5c000000001f52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0287771 + }, + "COUNTERS:oid:0x5c000000002009": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2326", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0287886 + }, + "COUNTERS:oid:0x5c000000001af1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0287995 + }, + "COUNTERS:oid:0x5c0000000015fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "123" + }, + "ttl": -0.001, + "expireat": 1651808848.0288105 + }, + "COUNTERS:oid:0x5c000000001ba6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0288215 + }, + "COUNTERS:oid:0x5c000000001ad5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0288322 + }, + "COUNTERS:oid:0x5c0000000025f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0288465 + }, + "COUNTERS:oid:0x5c0000000025f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.028861 + }, + "COUNTERS:oid:0x5c000000001c93": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0288754 + }, + "COUNTERS:oid:0x5c000000001895": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0288866 + }, + "COUNTERS:oid:0x5c0000000025e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0288973 + }, + "COUNTERS:oid:0x5c000000002558": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0289447 + }, + "COUNTERS:oid:0x5c000000001776": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "83", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0303493 + }, + "COUNTERS:oid:0x5c000000002538": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.031661 + }, + "COUNTERS:oid:0x5c0000000022f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "49", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0316818 + }, + "COUNTERS:oid:0x5c000000001f40": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0316997 + }, + "COUNTERS:oid:0x5c000000001d53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0317268 + }, + "COUNTERS:oid:0x5c00000000193e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0317392 + }, + "COUNTERS:oid:0x5c000000001464": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12134" + }, + "ttl": -0.001, + "expireat": 1651808848.0317507 + }, + "COUNTERS:oid:0x5c000000001598": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "949" + }, + "ttl": -0.001, + "expireat": 1651808848.0317624 + }, + "COUNTERS:oid:0x5c0000000025c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0317738 + }, + "COUNTERS:oid:0x5c000000001d39": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0318015 + }, + "COUNTERS:oid:0x5c000000001766": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0318172 + }, + "COUNTERS:oid:0x5c00000000183c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.031833 + }, + "COUNTERS:oid:0x5c000000001d84": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0318449 + }, + "COUNTERS:oid:0x5c000000001bff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0318723 + }, + "COUNTERS:oid:0x5c000000001b8b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "257", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0318875 + }, + "COUNTERS:oid:0x5c000000002140": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0318995 + }, + "COUNTERS:oid:0x5c000000001ff6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0319147 + }, + "COUNTERS:oid:0x5c000000002344": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "427" + }, + "ttl": -0.001, + "expireat": 1651808848.0319264 + }, + "COUNTERS:oid:0x5c000000001987": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.031941 + }, + "COUNTERS:oid:0x5c0000000025d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0319555 + }, + "COUNTERS:oid:0x5c000000001c58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0320706 + }, + "COUNTERS:oid:0x5c0000000013fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0320847 + }, + "COUNTERS:oid:0x5c00000000136f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1399" + }, + "ttl": -0.001, + "expireat": 1651808848.0321093 + }, + "COUNTERS:oid:0x5c000000001ff5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "500" + }, + "ttl": -0.001, + "expireat": 1651808848.032128 + }, + "COUNTERS:oid:0x5c0000000014d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0321395 + }, + "COUNTERS:oid:0x5c0000000026de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.032154 + }, + "COUNTERS:oid:0x5c0000000017be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "94" + }, + "ttl": -0.001, + "expireat": 1651808848.0321698 + }, + "COUNTERS:oid:0x5c000000002772": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.032181 + }, + "COUNTERS:oid:0x5c0000000013c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.032208 + }, + "COUNTERS:oid:0x5c000000001803": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0322196 + }, + "COUNTERS:oid:0x5c0000000015ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "287", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032255 + }, + "COUNTERS:oid:0x5c000000001bd8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.032267 + }, + "COUNTERS:oid:0x5c000000001873": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "88", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0322816 + }, + "COUNTERS:oid:0x5c000000001b25": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1339" + }, + "ttl": -0.001, + "expireat": 1651808848.032293 + }, + "COUNTERS:oid:0x5c000000001de2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105" + }, + "ttl": -0.001, + "expireat": 1651808848.0323071 + }, + "COUNTERS:oid:0x5c000000001901": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0323222 + }, + "COUNTERS:oid:0x5c000000001996": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0323336 + }, + "COUNTERS:oid:0x5c000000001c45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "239", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032348 + }, + "COUNTERS:oid:0x5c000000001362": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0323627 + }, + "COUNTERS:oid:0x5c000000001aff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "280", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032377 + }, + "COUNTERS:oid:0x5c00000000168f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0324132 + }, + "COUNTERS:oid:0x5c000000002614": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0324273 + }, + "COUNTERS:oid:0x5c000000001767": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1281" + }, + "ttl": -0.001, + "expireat": 1651808848.0324576 + }, + "COUNTERS:oid:0x5c000000001a18": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "282" + }, + "ttl": -0.001, + "expireat": 1651808848.0324724 + }, + "COUNTERS:oid:0x5c000000001771": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.032484 + }, + "COUNTERS:oid:0x5c00000000212f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0324984 + }, + "COUNTERS:oid:0x5c0000000015f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0325098 + }, + "COUNTERS:oid:0x5c000000002515": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032524 + }, + "COUNTERS:oid:0x5c0000000019e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "455" + }, + "ttl": -0.001, + "expireat": 1651808848.0325434 + }, + "COUNTERS:oid:0x5c000000001827": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0325553 + }, + "COUNTERS:oid:0x5c0000000023cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0325713 + }, + "COUNTERS:oid:0x5c000000001f2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.032583 + }, + "COUNTERS:oid:0x5c00000000142b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0325942 + }, + "COUNTERS:oid:0x5c000000002088": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0326085 + }, + "COUNTERS:oid:0x5c000000001d2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0326233 + }, + "COUNTERS:oid:0x5c00000000185f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032638 + }, + "COUNTERS:oid:0x5c00000000181b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1329" + }, + "ttl": -0.001, + "expireat": 1651808848.0326495 + }, + "COUNTERS:oid:0x5c0000000016c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "215", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032679 + }, + "COUNTERS:oid:0x5c000000001861": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0326931 + }, + "COUNTERS:oid:0x5c000000002504": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0327044 + }, + "COUNTERS:oid:0x5c0000000022c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "62" + }, + "ttl": -0.001, + "expireat": 1651808848.032744 + }, + "COUNTERS:oid:0x5c000000001ab2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0327578 + }, + "COUNTERS:oid:0x5c000000001748": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0327718 + }, + "COUNTERS:oid:0x5c00000000217b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0327861 + }, + "COUNTERS:oid:0x5c00000000194e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.032797 + }, + "COUNTERS:oid:0x5c000000001a9d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0328078 + }, + "COUNTERS:oid:0x5c000000001ded": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0328186 + }, + "COUNTERS:oid:0x5c0000000020a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0328321 + }, + "COUNTERS:oid:0x5c000000001695": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0328467 + }, + "COUNTERS:oid:0x5c0000000020b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2059" + }, + "ttl": -0.001, + "expireat": 1651808848.0328577 + }, + "COUNTERS:oid:0x5c0000000023c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "317" + }, + "ttl": -0.001, + "expireat": 1651808848.0328712 + }, + "COUNTERS:oid:0x5c0000000023f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0328972 + }, + "COUNTERS:oid:0x5c00000000190a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.0329182 + }, + "COUNTERS:oid:0x5c000000001ead": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0329297 + }, + "COUNTERS:oid:0x5c000000001729": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0329401 + }, + "COUNTERS:oid:0x5c0000000017c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "39" + }, + "ttl": -0.001, + "expireat": 1651808848.032954 + }, + "COUNTERS:oid:0x5c000000001e3f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "108", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.032999 + }, + "COUNTERS:oid:0x5c000000001743": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285" + }, + "ttl": -0.001, + "expireat": 1651808848.0330155 + }, + "COUNTERS:oid:0x5c000000002449": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0330296 + }, + "COUNTERS:oid:0x5c000000002326": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0330415 + }, + "COUNTERS:oid:0x5c000000001d02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0331714 + }, + "COUNTERS:oid:0x5c000000001bb9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.033187 + }, + "COUNTERS:oid:0x5c0000000015df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0332026 + }, + "COUNTERS:oid:0x5c0000000027db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0332148 + }, + "COUNTERS:oid:0x5c000000001e18": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.03323 + }, + "COUNTERS:oid:0x5c000000001e4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "296" + }, + "ttl": -0.001, + "expireat": 1651808848.0332458 + }, + "COUNTERS:oid:0x5c00000000231e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.033258 + }, + "COUNTERS:oid:0x5c000000001849": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.03327 + }, + "COUNTERS:oid:0x5c000000001b74": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.033285 + }, + "COUNTERS:oid:0x5c000000002179": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0333169 + }, + "COUNTERS:oid:0x5c0000000013f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0333338 + }, + "COUNTERS:oid:0x5c0000000014db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.033347 + }, + "COUNTERS:oid:0x5c000000002656": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0333593 + }, + "COUNTERS:oid:0x5c000000001c1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "168" + }, + "ttl": -0.001, + "expireat": 1651808848.0333903 + }, + "COUNTERS:oid:0x5c000000002404": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.0334053 + }, + "COUNTERS:oid:0x5c00000000231f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "40" + }, + "ttl": -0.001, + "expireat": 1651808848.0334203 + }, + "COUNTERS:oid:0x5c00000000159d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0334508 + }, + "COUNTERS:oid:0x5c0000000020ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0334625 + }, + "COUNTERS:oid:0x5c0000000015e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0335147 + }, + "COUNTERS:oid:0x5c000000001ea5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0335286 + }, + "COUNTERS:oid:0x5c00000000234b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "70", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0335426 + }, + "COUNTERS:oid:0x5c000000001fd6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0335572 + }, + "COUNTERS:oid:0x5c000000001c26": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0335686 + }, + "COUNTERS:oid:0x5c000000001a79": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.033582 + }, + "COUNTERS:oid:0x5c000000001adb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1334" + }, + "ttl": -0.001, + "expireat": 1651808848.0335937 + }, + "COUNTERS:oid:0x5c0000000020ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0336077 + }, + "COUNTERS:oid:0x5c00000000164a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "146" + }, + "ttl": -0.001, + "expireat": 1651808848.033619 + }, + "COUNTERS:oid:0x5c000000001a82": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.03363 + }, + "COUNTERS:oid:0x5c0000000018cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0336611 + }, + "COUNTERS:oid:0x5c000000001b45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0336888 + }, + "COUNTERS:oid:0x5c000000002174": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.033701 + }, + "COUNTERS:oid:0x5c000000001735": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "205" + }, + "ttl": -0.001, + "expireat": 1651808848.0337121 + }, + "COUNTERS:oid:0x5c000000001cb9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.033723 + }, + "COUNTERS:oid:0x5c000000001e9b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0337346 + }, + "COUNTERS:oid:0x5c000000001855": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0337458 + }, + "COUNTERS:oid:0x5c000000001ea8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0337605 + }, + "COUNTERS:oid:0x5c000000001dfb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.033775 + }, + "COUNTERS:oid:0x5c0000000026eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.0337987 + }, + "COUNTERS:oid:0x5c000000001de8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0338326 + }, + "COUNTERS:oid:0x5c0000000018ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "221", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0338497 + }, + "COUNTERS:oid:0x5c0000000019fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0338614 + }, + "COUNTERS:oid:0x5c000000001596": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0338726 + }, + "COUNTERS:oid:0x5c000000001c9e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0338843 + }, + "COUNTERS:oid:0x5c000000001fe4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1167" + }, + "ttl": -0.001, + "expireat": 1651808848.0338984 + }, + "COUNTERS:oid:0x5c00000000176a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183" + }, + "ttl": -0.001, + "expireat": 1651808848.033913 + }, + "COUNTERS:oid:0x5c000000002241": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "195" + }, + "ttl": -0.001, + "expireat": 1651808848.0339372 + }, + "COUNTERS:oid:0x5c0000000018e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.033949 + }, + "COUNTERS:oid:0x5c00000000170c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.033963 + }, + "COUNTERS:oid:0x5c000000002451": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0339775 + }, + "COUNTERS:oid:0x5c000000001f2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "262" + }, + "ttl": -0.001, + "expireat": 1651808848.0339923 + }, + "COUNTERS:oid:0x5c000000001cc6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.034007 + }, + "COUNTERS:oid:0x5c000000001b8e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0340188 + }, + "COUNTERS:oid:0x5c000000001728": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0340328 + }, + "COUNTERS:oid:0x5c000000001db7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "271", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0340476 + }, + "COUNTERS:oid:0x5c0000000017c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "150" + }, + "ttl": -0.001, + "expireat": 1651808848.0340621 + }, + "COUNTERS:oid:0x5c0000000016b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0341015 + }, + "COUNTERS:oid:0x5c000000001954": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0341158 + }, + "COUNTERS:oid:0x5c0000000020c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0341275 + }, + "COUNTERS:oid:0x5c000000002175": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "218" + }, + "ttl": -0.001, + "expireat": 1651808848.0341415 + }, + "COUNTERS:oid:0x5c000000001397": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.034153 + }, + "COUNTERS:oid:0x5c000000002597": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0341673 + }, + "COUNTERS:oid:0x5c000000001e2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0341816 + }, + "COUNTERS:oid:0x5c000000001ad9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "116" + }, + "ttl": -0.001, + "expireat": 1651808848.0341935 + }, + "COUNTERS:oid:0x5c00000000138a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0342238 + }, + "COUNTERS:oid:0x5c000000001c5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0342362 + }, + "COUNTERS:oid:0x5c000000002432": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0342505 + }, + "COUNTERS:oid:0x5c0000000022e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "97" + }, + "ttl": -0.001, + "expireat": 1651808848.034265 + }, + "COUNTERS:oid:0x5c000000001c01": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.034277 + }, + "COUNTERS:oid:0x5c00000000157b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1340", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0342908 + }, + "COUNTERS:oid:0x5c0000000017ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0343022 + }, + "COUNTERS:oid:0x5c000000001418": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0343132 + }, + "COUNTERS:oid:0x5c00000000192d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "361" + }, + "ttl": -0.001, + "expireat": 1651808848.0343244 + }, + "COUNTERS:oid:0x5c000000001f14": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "134" + }, + "ttl": -0.001, + "expireat": 1651808848.034336 + }, + "COUNTERS:oid:0x5c000000001c3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0343506 + }, + "COUNTERS:oid:0x5c00000000159e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0343623 + }, + "COUNTERS:oid:0x5c000000001d4e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "106", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0344057 + }, + "COUNTERS:oid:0x5c00000000154a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.03442 + }, + "COUNTERS:oid:0x5c0000000017d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0344348 + }, + "COUNTERS:oid:0x5c0000000016f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0344462 + }, + "COUNTERS:oid:0x5c000000001eeb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0344577 + }, + "COUNTERS:oid:0x5c000000001a74": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0344687 + }, + "COUNTERS:oid:0x5c000000002455": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0344796 + }, + "COUNTERS:oid:0x5c000000001730": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32" + }, + "ttl": -0.001, + "expireat": 1651808848.0344942 + }, + "COUNTERS:oid:0x5c00000000243a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0345087 + }, + "COUNTERS:oid:0x5c000000001742": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305" + }, + "ttl": -0.001, + "expireat": 1651808848.0345235 + }, + "COUNTERS:oid:0x5c0000000023ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.034535 + }, + "COUNTERS:oid:0x5c000000001842": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.034549 + }, + "COUNTERS:oid:0x5c000000001b7b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.034574 + }, + "COUNTERS:oid:0x5c000000001381": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0345862 + }, + "COUNTERS:oid:0x5c000000002574": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0346134 + }, + "COUNTERS:oid:0x5c000000002645": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0346277 + }, + "COUNTERS:oid:0x5c0000000026ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0346391 + }, + "COUNTERS:oid:0x5c000000002168": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0346498 + }, + "COUNTERS:oid:0x5c000000001c47": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0346637 + }, + "COUNTERS:oid:0x5c00000000232a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0346751 + }, + "COUNTERS:oid:0x5c000000001481": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0346859 + }, + "COUNTERS:oid:0x5c00000000141d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0347188 + }, + "COUNTERS:oid:0x5c000000002013": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0347316 + }, + "COUNTERS:oid:0x5c000000001451": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0347426 + }, + "COUNTERS:oid:0x5c000000001897": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0347533 + }, + "COUNTERS:oid:0x5c0000000013aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "289" + }, + "ttl": -0.001, + "expireat": 1651808848.034785 + }, + "COUNTERS:oid:0x5c000000001de5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1334" + }, + "ttl": -0.001, + "expireat": 1651808848.0347974 + }, + "COUNTERS:oid:0x5c000000001de1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0348086 + }, + "COUNTERS:oid:0x5c000000001b06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "101" + }, + "ttl": -0.001, + "expireat": 1651808848.0348196 + }, + "COUNTERS:oid:0x5c000000001c0f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0348308 + }, + "COUNTERS:oid:0x5c000000001619": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "288" + }, + "ttl": -0.001, + "expireat": 1651808848.0348637 + }, + "COUNTERS:oid:0x5c000000001f3c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0349185 + }, + "COUNTERS:oid:0x5c000000001669": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "292", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0349576 + }, + "COUNTERS:oid:0x5c0000000018b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.03497 + }, + "COUNTERS:oid:0x5c000000002641": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.034985 + }, + "COUNTERS:oid:0x5c000000002182": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "10", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.034997 + }, + "COUNTERS:oid:0x5c0000000017b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0350122 + }, + "COUNTERS:oid:0x5c000000001aa1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "445", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0350246 + }, + "COUNTERS:oid:0x5c0000000019e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.03504 + }, + "COUNTERS:oid:0x5c0000000020c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0350554 + }, + "COUNTERS:oid:0x5c000000001b90": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0350676 + }, + "COUNTERS:oid:0x5c00000000177d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "189", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0350795 + }, + "COUNTERS:oid:0x5c0000000020ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0351257 + }, + "COUNTERS:oid:0x5c0000000013f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.035139 + }, + "COUNTERS:oid:0x5c000000001417": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.035169 + }, + "COUNTERS:oid:0x5c00000000142a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32" + }, + "ttl": -0.001, + "expireat": 1651808848.0351846 + }, + "COUNTERS:oid:0x5c000000001d13": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.035197 + }, + "COUNTERS:oid:0x5c000000001625": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0352793 + }, + "COUNTERS:oid:0x5c0000000016d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1294" + }, + "ttl": -0.001, + "expireat": 1651808848.035303 + }, + "COUNTERS:oid:0x5c000000001584": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1142", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.035332 + }, + "COUNTERS:oid:0x5c000000001bc5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0353599 + }, + "COUNTERS:oid:0x5c000000001706": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0353749 + }, + "COUNTERS:oid:0x5c00000000232d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.035408 + }, + "COUNTERS:oid:0x5c000000001d23": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "282" + }, + "ttl": -0.001, + "expireat": 1651808848.0354393 + }, + "COUNTERS:oid:0x5c000000001cda": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1293" + }, + "ttl": -0.001, + "expireat": 1651808848.0354512 + }, + "COUNTERS:oid:0x5c0000000019b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0354652 + }, + "COUNTERS:oid:0x5c000000002141": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0354798 + }, + "COUNTERS:oid:0x5c00000000176f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0354912 + }, + "COUNTERS:oid:0x5c000000001872": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0355024 + }, + "COUNTERS:oid:0x5c0000000013d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0355167 + }, + "COUNTERS:oid:0x5c0000000019e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.035546 + }, + "COUNTERS:oid:0x5c0000000024e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0355577 + }, + "COUNTERS:oid:0x5c000000001c90": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1314" + }, + "ttl": -0.001, + "expireat": 1651808848.0355923 + }, + "COUNTERS:oid:0x5c000000002511": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "145", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.035609 + }, + "COUNTERS:oid:0x5c000000001467": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0356243 + }, + "COUNTERS:oid:0x5c0000000021f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0356357 + }, + "COUNTERS:oid:0x5c0000000025c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0356636 + }, + "COUNTERS:oid:0x5c00000000257e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1265", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0356753 + }, + "COUNTERS:oid:0x5c000000001bb2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.03569 + }, + "COUNTERS:oid:0x5c0000000016e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "66" + }, + "ttl": -0.001, + "expireat": 1651808848.0357046 + }, + "COUNTERS:oid:0x5c000000001692": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0357158 + }, + "COUNTERS:oid:0x5c0000000017db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.035727 + }, + "COUNTERS:oid:0x5c000000001a64": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1317" + }, + "ttl": -0.001, + "expireat": 1651808848.0357382 + }, + "COUNTERS:oid:0x5c000000001d1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0357494 + }, + "COUNTERS:oid:0x5c00000000215e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1256", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0357606 + }, + "COUNTERS:oid:0x5c00000000200c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.035775 + }, + "COUNTERS:oid:0x5c000000002097": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.035789 + }, + "COUNTERS:oid:0x5c0000000020ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0358164 + }, + "COUNTERS:oid:0x5c0000000024c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198" + }, + "ttl": -0.001, + "expireat": 1651808848.0358315 + }, + "COUNTERS:oid:0x5c000000001414": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161" + }, + "ttl": -0.001, + "expireat": 1651808848.0358431 + }, + "COUNTERS:oid:0x5c000000001ca7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.035857 + }, + "COUNTERS:oid:0x5c00000000157a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.035888 + }, + "COUNTERS:oid:0x5c0000000019f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0359013 + }, + "COUNTERS:oid:0x5c00000000213a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0359159 + }, + "COUNTERS:oid:0x5c000000001a31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "395" + }, + "ttl": -0.001, + "expireat": 1651808848.0359275 + }, + "COUNTERS:oid:0x5c000000001aec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.035942 + }, + "COUNTERS:oid:0x5c00000000190d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0359573 + }, + "COUNTERS:oid:0x5c000000002782": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0359817 + }, + "COUNTERS:oid:0x5c00000000263a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0359933 + }, + "COUNTERS:oid:0x5c0000000018e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0360043 + }, + "COUNTERS:oid:0x5c0000000014df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.036016 + }, + "COUNTERS:oid:0x5c00000000166b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0360303 + }, + "COUNTERS:oid:0x5c00000000214b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0360448 + }, + "COUNTERS:oid:0x5c0000000022f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "430", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0360565 + }, + "COUNTERS:oid:0x5c000000001da9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.036068 + }, + "COUNTERS:oid:0x5c00000000259f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0360823 + }, + "COUNTERS:oid:0x5c0000000020d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0360937 + }, + "COUNTERS:oid:0x5c000000001ed3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0361078 + }, + "COUNTERS:oid:0x5c000000002536": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1275" + }, + "ttl": -0.001, + "expireat": 1651808848.0361192 + }, + "COUNTERS:oid:0x5c000000002315": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0361335 + }, + "COUNTERS:oid:0x5c000000002353": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "43", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0361478 + }, + "COUNTERS:oid:0x5c000000001499": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0361803 + }, + "COUNTERS:oid:0x5c0000000016b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0361967 + }, + "COUNTERS:oid:0x5c000000001ef8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "112", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0362282 + }, + "COUNTERS:oid:0x5c000000001af7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "279" + }, + "ttl": -0.001, + "expireat": 1651808848.0362437 + }, + "COUNTERS:oid:0x5c000000001395": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0362554 + }, + "COUNTERS:oid:0x5c0000000015dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.03627 + }, + "COUNTERS:oid:0x5c000000001fc4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "320", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0362844 + }, + "COUNTERS:oid:0x5c0000000017da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0362988 + }, + "COUNTERS:oid:0x5c0000000023da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.036323 + }, + "COUNTERS:oid:0x5c000000001bbf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "174" + }, + "ttl": -0.001, + "expireat": 1651808848.036336 + }, + "COUNTERS:oid:0x5c00000000177f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0363474 + }, + "COUNTERS:oid:0x5c000000001c05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0363588 + }, + "COUNTERS:oid:0x5c0000000018bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.036373 + }, + "COUNTERS:oid:0x5c00000000185c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1236" + }, + "ttl": -0.001, + "expireat": 1651808848.0363848 + }, + "COUNTERS:oid:0x5c000000001678": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.036396 + }, + "COUNTERS:oid:0x5c000000001918": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.03641 + }, + "COUNTERS:oid:0x5c000000001ec0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.036422 + }, + "COUNTERS:oid:0x5c000000002094": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.036433 + }, + "COUNTERS:oid:0x5c0000000016fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0364442 + }, + "COUNTERS:oid:0x5c000000002659": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0364583 + }, + "COUNTERS:oid:0x5c000000002480": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0366292 + }, + "COUNTERS:oid:0x5c000000001feb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0366461 + }, + "COUNTERS:oid:0x5c00000000266a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0366712 + }, + "COUNTERS:oid:0x5c000000002485": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "54" + }, + "ttl": -0.001, + "expireat": 1651808848.0366828 + }, + "COUNTERS:oid:0x5c00000000210c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.036694 + }, + "COUNTERS:oid:0x5c00000000174b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.036705 + }, + "COUNTERS:oid:0x5c0000000018a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0367193 + }, + "COUNTERS:oid:0x5c000000001a9f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.036731 + }, + "COUNTERS:oid:0x5c000000002521": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "155", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0367446 + }, + "COUNTERS:oid:0x5c000000002142": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0367591 + }, + "COUNTERS:oid:0x5c000000001a66": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0367706 + }, + "COUNTERS:oid:0x5c00000000188b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0367815 + }, + "COUNTERS:oid:0x5c00000000178e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "162" + }, + "ttl": -0.001, + "expireat": 1651808848.0368118 + }, + "COUNTERS:oid:0x5c000000001b66": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "271", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0368266 + }, + "COUNTERS:oid:0x5c000000001aab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201" + }, + "ttl": -0.001, + "expireat": 1651808848.036838 + }, + "COUNTERS:oid:0x5c000000001624": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0368485 + }, + "COUNTERS:oid:0x5c00000000167d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "216", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.036863 + }, + "COUNTERS:oid:0x5c00000000136b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "728", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.036877 + }, + "COUNTERS:oid:0x5c000000001759": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "197" + }, + "ttl": -0.001, + "expireat": 1651808848.0368907 + }, + "COUNTERS:oid:0x5c00000000147f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11539" + }, + "ttl": -0.001, + "expireat": 1651808848.0369048 + }, + "COUNTERS:oid:0x5c000000001880": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.036941 + }, + "COUNTERS:oid:0x5c0000000018ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "167" + }, + "ttl": -0.001, + "expireat": 1651808848.0369546 + }, + "COUNTERS:oid:0x5c000000002166": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1279" + }, + "ttl": -0.001, + "expireat": 1651808848.0369658 + }, + "COUNTERS:oid:0x5c000000001ac8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0370321 + }, + "COUNTERS:oid:0x5c00000000185b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "291", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.03706 + }, + "COUNTERS:oid:0x5c000000001cba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144" + }, + "ttl": -0.001, + "expireat": 1651808848.037076 + }, + "COUNTERS:oid:0x5c000000001cb1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0370905 + }, + "COUNTERS:oid:0x5c000000001d25": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.037105 + }, + "COUNTERS:oid:0x5c000000001fdf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.037117 + }, + "COUNTERS:oid:0x5c000000001d28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0371282 + }, + "COUNTERS:oid:0x5c000000002553": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137" + }, + "ttl": -0.001, + "expireat": 1651808848.0371425 + }, + "COUNTERS:oid:0x5c000000001e05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0371695 + }, + "COUNTERS:oid:0x5c0000000015ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0371838 + }, + "COUNTERS:oid:0x5c0000000020db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.037195 + }, + "COUNTERS:oid:0x5c000000001b99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186" + }, + "ttl": -0.001, + "expireat": 1651808848.0372086 + }, + "COUNTERS:oid:0x5c00000000148a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "310", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0372226 + }, + "COUNTERS:oid:0x5c0000000022e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "492" + }, + "ttl": -0.001, + "expireat": 1651808848.0372338 + }, + "COUNTERS:oid:0x5c000000001338": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.037248 + }, + "COUNTERS:oid:0x5c000000001f12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0372593 + }, + "COUNTERS:oid:0x5c00000000190e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0372908 + }, + "COUNTERS:oid:0x5c0000000016d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0373068 + }, + "COUNTERS:oid:0x5c000000002483": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1282", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.037319 + }, + "COUNTERS:oid:0x5c000000002320": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "50" + }, + "ttl": -0.001, + "expireat": 1651808848.0373297 + }, + "COUNTERS:oid:0x5c000000002474": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0373433 + }, + "COUNTERS:oid:0x5c00000000246b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1269" + }, + "ttl": -0.001, + "expireat": 1651808848.0373545 + }, + "COUNTERS:oid:0x5c0000000016ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "155" + }, + "ttl": -0.001, + "expireat": 1651808848.0373654 + }, + "COUNTERS:oid:0x5c000000001d38": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0373762 + }, + "COUNTERS:oid:0x5c000000001a26": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0373898 + }, + "COUNTERS:oid:0x5c000000001acb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0374048 + }, + "COUNTERS:oid:0x5c0000000018c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "170", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0374188 + }, + "COUNTERS:oid:0x5c00000000179c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.037433 + }, + "COUNTERS:oid:0x5c0000000015d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "112" + }, + "ttl": -0.001, + "expireat": 1651808848.0374444 + }, + "COUNTERS:oid:0x5c0000000016c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0374582 + }, + "COUNTERS:oid:0x5c00000000169c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0374694 + }, + "COUNTERS:oid:0x5c000000002306": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0374808 + }, + "COUNTERS:oid:0x5c000000001802": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0374944 + }, + "COUNTERS:oid:0x5c0000000016b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0375235 + }, + "COUNTERS:oid:0x5c000000002458": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0375383 + }, + "COUNTERS:oid:0x5c0000000013da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0375729 + }, + "COUNTERS:oid:0x5c0000000015e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0375867 + }, + "COUNTERS:oid:0x5c00000000144a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0376012 + }, + "COUNTERS:oid:0x5c0000000020cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0376124 + }, + "COUNTERS:oid:0x5c000000001400": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0376263 + }, + "COUNTERS:oid:0x5c000000001bcf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0376375 + }, + "COUNTERS:oid:0x5c000000001cb8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0376515 + }, + "COUNTERS:oid:0x5c00000000247e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.037666 + }, + "COUNTERS:oid:0x5c000000001e14": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0377095 + }, + "COUNTERS:oid:0x5c000000001672": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0377233 + }, + "COUNTERS:oid:0x5c000000002594": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0377367 + }, + "COUNTERS:oid:0x5c000000001e1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "35" + }, + "ttl": -0.001, + "expireat": 1651808848.0377533 + }, + "COUNTERS:oid:0x5c000000001d3c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "438", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0377672 + }, + "COUNTERS:oid:0x5c000000001b15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.037784 + }, + "COUNTERS:oid:0x5c0000000017fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0378017 + }, + "COUNTERS:oid:0x5c000000001e67": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0378153 + }, + "COUNTERS:oid:0x5c00000000177c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "168", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.037832 + }, + "COUNTERS:oid:0x5c0000000017eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0378458 + }, + "COUNTERS:oid:0x5c0000000017d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0378623 + }, + "COUNTERS:oid:0x5c000000001862": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "138" + }, + "ttl": -0.001, + "expireat": 1651808848.037923 + }, + "COUNTERS:oid:0x5c0000000017e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "26" + }, + "ttl": -0.001, + "expireat": 1651808848.0379398 + }, + "COUNTERS:oid:0x5c00000000178a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "237" + }, + "ttl": -0.001, + "expireat": 1651808848.0379574 + }, + "COUNTERS:oid:0x5c0000000017bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0379755 + }, + "COUNTERS:oid:0x5c0000000013b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0380046 + }, + "COUNTERS:oid:0x5c00000000227a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.038019 + }, + "COUNTERS:oid:0x5c000000001ae3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.03803 + }, + "COUNTERS:oid:0x5c0000000017a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "268", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0380437 + }, + "COUNTERS:oid:0x5c000000001700": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0380578 + }, + "COUNTERS:oid:0x5c00000000266b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.0380726 + }, + "COUNTERS:oid:0x5c0000000021ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "435" + }, + "ttl": -0.001, + "expireat": 1651808848.0380838 + }, + "COUNTERS:oid:0x5c000000001be1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038098 + }, + "COUNTERS:oid:0x5c000000001ec4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1321" + }, + "ttl": -0.001, + "expireat": 1651808848.0381093 + }, + "COUNTERS:oid:0x5c000000001622": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1281" + }, + "ttl": -0.001, + "expireat": 1651808848.0381327 + }, + "COUNTERS:oid:0x5c000000001dd9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "204" + }, + "ttl": -0.001, + "expireat": 1651808848.0381477 + }, + "COUNTERS:oid:0x5c000000001a73": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.038162 + }, + "COUNTERS:oid:0x5c000000002281": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "3" + }, + "ttl": -0.001, + "expireat": 1651808848.038174 + }, + "COUNTERS:oid:0x5c000000002655": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038188 + }, + "COUNTERS:oid:0x5c000000001726": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.038202 + }, + "COUNTERS:oid:0x5c000000001e9c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0382378 + }, + "COUNTERS:oid:0x5c000000001929": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0382516 + }, + "COUNTERS:oid:0x5c000000001adc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038266 + }, + "COUNTERS:oid:0x5c000000001db0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.03828 + }, + "COUNTERS:oid:0x5c00000000148d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0382912 + }, + "COUNTERS:oid:0x5c000000001a15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186" + }, + "ttl": -0.001, + "expireat": 1651808848.0383048 + }, + "COUNTERS:oid:0x5c0000000014cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0383162 + }, + "COUNTERS:oid:0x5c000000001d74": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "121" + }, + "ttl": -0.001, + "expireat": 1651808848.0383272 + }, + "COUNTERS:oid:0x5c0000000014e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19" + }, + "ttl": -0.001, + "expireat": 1651808848.0383413 + }, + "COUNTERS:oid:0x5c00000000168c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.038353 + }, + "COUNTERS:oid:0x5c000000001989": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0383668 + }, + "COUNTERS:oid:0x5c0000000023ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0383816 + }, + "COUNTERS:oid:0x5c0000000017ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1302" + }, + "ttl": -0.001, + "expireat": 1651808848.0383928 + }, + "COUNTERS:oid:0x5c000000001a9b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0384037 + }, + "COUNTERS:oid:0x5c000000001a55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "110", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0384178 + }, + "COUNTERS:oid:0x5c0000000015da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1253" + }, + "ttl": -0.001, + "expireat": 1651808848.0384293 + }, + "COUNTERS:oid:0x5c000000001e3d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038443 + }, + "COUNTERS:oid:0x5c000000001447": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0384543 + }, + "COUNTERS:oid:0x5c000000001cf2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "449" + }, + "ttl": -0.001, + "expireat": 1651808848.038465 + }, + "COUNTERS:oid:0x5c000000001e31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0384789 + }, + "COUNTERS:oid:0x5c000000001bfd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0385106 + }, + "COUNTERS:oid:0x5c000000001cea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0385237 + }, + "COUNTERS:oid:0x5c000000001905": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0385556 + }, + "COUNTERS:oid:0x5c000000001cf3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0385702 + }, + "COUNTERS:oid:0x5c000000001ab9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038584 + }, + "COUNTERS:oid:0x5c000000001c6f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0386128 + }, + "COUNTERS:oid:0x5c000000001ba9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0386262 + }, + "COUNTERS:oid:0x5c000000001b2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038658 + }, + "COUNTERS:oid:0x5c0000000025bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0386724 + }, + "COUNTERS:oid:0x5c000000001ade": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0387046 + }, + "COUNTERS:oid:0x5c000000001428": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0387168 + }, + "COUNTERS:oid:0x5c0000000014ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0387313 + }, + "COUNTERS:oid:0x5c00000000169a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0387743 + }, + "COUNTERS:oid:0x5c00000000257c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0388205 + }, + "COUNTERS:oid:0x5c00000000160b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0388358 + }, + "COUNTERS:oid:0x5c000000002111": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0388513 + }, + "COUNTERS:oid:0x5c000000001a47": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0388672 + }, + "COUNTERS:oid:0x5c0000000014d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0388827 + }, + "COUNTERS:oid:0x5c000000001c4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.038935 + }, + "COUNTERS:oid:0x5c0000000019fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1326" + }, + "ttl": -0.001, + "expireat": 1651808848.0389693 + }, + "COUNTERS:oid:0x5c000000002670": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1360", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0389817 + }, + "COUNTERS:oid:0x5c000000001ec7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0389962 + }, + "COUNTERS:oid:0x5c000000001e80": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "116" + }, + "ttl": -0.001, + "expireat": 1651808848.0390084 + }, + "COUNTERS:oid:0x5c000000001ee1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1299" + }, + "ttl": -0.001, + "expireat": 1651808848.0390363 + }, + "COUNTERS:oid:0x5c000000001a6b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "268" + }, + "ttl": -0.001, + "expireat": 1651808848.0390508 + }, + "COUNTERS:oid:0x5c000000001a1a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0390809 + }, + "COUNTERS:oid:0x5c000000001a8b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0391126 + }, + "COUNTERS:oid:0x5c000000001d36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0391417 + }, + "COUNTERS:oid:0x5c000000001385": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0391524 + }, + "COUNTERS:oid:0x5c000000002437": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0391793 + }, + "COUNTERS:oid:0x5c00000000184a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0391932 + }, + "COUNTERS:oid:0x5c000000001716": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0392072 + }, + "COUNTERS:oid:0x5c0000000015f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0392215 + }, + "COUNTERS:oid:0x5c00000000243d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "156", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0393317 + }, + "COUNTERS:oid:0x5c00000000257f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0393486 + }, + "COUNTERS:oid:0x5c000000002650": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1276", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0393612 + }, + "COUNTERS:oid:0x5c0000000016e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.039373 + }, + "COUNTERS:oid:0x5c000000001906": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0393846 + }, + "COUNTERS:oid:0x5c0000000025d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0393994 + }, + "COUNTERS:oid:0x5c00000000243e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.039455 + }, + "COUNTERS:oid:0x5c000000002332": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0394692 + }, + "COUNTERS:oid:0x5c0000000023f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0394843 + }, + "COUNTERS:oid:0x5c0000000017ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107" + }, + "ttl": -0.001, + "expireat": 1651808848.039499 + }, + "COUNTERS:oid:0x5c000000002464": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "158" + }, + "ttl": -0.001, + "expireat": 1651808848.0395133 + }, + "COUNTERS:oid:0x5c0000000016b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1242" + }, + "ttl": -0.001, + "expireat": 1651808848.0395248 + }, + "COUNTERS:oid:0x5c0000000015cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0395539 + }, + "COUNTERS:oid:0x5c00000000240f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.039566 + }, + "COUNTERS:oid:0x5c000000002145": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "261", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0395806 + }, + "COUNTERS:oid:0x5c000000001d9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "256" + }, + "ttl": -0.001, + "expireat": 1651808848.0395956 + }, + "COUNTERS:oid:0x5c0000000025af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0396264 + }, + "COUNTERS:oid:0x5c000000001b84": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0396407 + }, + "COUNTERS:oid:0x5c0000000019c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.039666 + }, + "COUNTERS:oid:0x5c0000000018ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "313", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0396807 + }, + "COUNTERS:oid:0x5c00000000177e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0396948 + }, + "COUNTERS:oid:0x5c000000001c02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266" + }, + "ttl": -0.001, + "expireat": 1651808848.0397089 + }, + "COUNTERS:oid:0x5c000000002104": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0397203 + }, + "COUNTERS:oid:0x5c000000001588": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1410", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0397558 + }, + "COUNTERS:oid:0x5c000000001e24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "190", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0397725 + }, + "COUNTERS:oid:0x5c0000000014d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11990" + }, + "ttl": -0.001, + "expireat": 1651808848.039797 + }, + "COUNTERS:oid:0x5c000000001822": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0398118 + }, + "COUNTERS:oid:0x5c000000001c5a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0398233 + }, + "COUNTERS:oid:0x5c00000000183d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "96" + }, + "ttl": -0.001, + "expireat": 1651808848.0398343 + }, + "COUNTERS:oid:0x5c000000001d34": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0398452 + }, + "COUNTERS:oid:0x5c000000001487": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11976" + }, + "ttl": -0.001, + "expireat": 1651808848.039859 + }, + "COUNTERS:oid:0x5c0000000023db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0398703 + }, + "COUNTERS:oid:0x5c0000000016ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0398815 + }, + "COUNTERS:oid:0x5c000000001ae6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0399134 + }, + "COUNTERS:oid:0x5c000000001add": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0399256 + }, + "COUNTERS:oid:0x5c000000001caa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0399368 + }, + "COUNTERS:oid:0x5c000000001637": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "218" + }, + "ttl": -0.001, + "expireat": 1651808848.039951 + }, + "COUNTERS:oid:0x5c000000001cc5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0399632 + }, + "COUNTERS:oid:0x5c0000000016b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0399742 + }, + "COUNTERS:oid:0x5c00000000262d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0399883 + }, + "COUNTERS:oid:0x5c0000000015ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.04 + }, + "COUNTERS:oid:0x5c0000000013b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.040032 + }, + "COUNTERS:oid:0x5c000000002562": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0400438 + }, + "COUNTERS:oid:0x5c000000001e40": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "466" + }, + "ttl": -0.001, + "expireat": 1651808848.0400553 + }, + "COUNTERS:oid:0x5c0000000017b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.041949 + }, + "COUNTERS:oid:0x5c000000001b6e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "286" + }, + "ttl": -0.001, + "expireat": 1651808848.0419736 + }, + "COUNTERS:oid:0x5c000000001e78": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0419888 + }, + "COUNTERS:oid:0x5c000000001a3f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0420046 + }, + "COUNTERS:oid:0x5c00000000258b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0420172 + }, + "COUNTERS:oid:0x5c000000001f57": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311" + }, + "ttl": -0.001, + "expireat": 1651808848.0420322 + }, + "COUNTERS:oid:0x5c00000000254b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0420475 + }, + "COUNTERS:oid:0x5c000000001725": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.04206 + }, + "COUNTERS:oid:0x5c0000000025ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0420716 + }, + "COUNTERS:oid:0x5c000000001deb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.042083 + }, + "COUNTERS:oid:0x5c000000001a25": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0420947 + }, + "COUNTERS:oid:0x5c000000001d96": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0421097 + }, + "COUNTERS:oid:0x5c000000001c32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0421216 + }, + "COUNTERS:oid:0x5c000000001601": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0421367 + }, + "COUNTERS:oid:0x5c000000002163": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0421515 + }, + "COUNTERS:oid:0x5c000000001b28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.042166 + }, + "COUNTERS:oid:0x5c0000000021ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "320" + }, + "ttl": -0.001, + "expireat": 1651808848.0421808 + }, + "COUNTERS:oid:0x5c000000001806": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "86", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.042196 + }, + "COUNTERS:oid:0x5c000000001b9f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0422108 + }, + "COUNTERS:oid:0x5c00000000193f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0422647 + }, + "COUNTERS:oid:0x5c000000001a91": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1336" + }, + "ttl": -0.001, + "expireat": 1651808848.0422845 + }, + "COUNTERS:oid:0x5c000000001ea1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0422976 + }, + "COUNTERS:oid:0x5c000000001a89": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.0423272 + }, + "COUNTERS:oid:0x5c0000000018ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "130", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.04236 + }, + "COUNTERS:oid:0x5c0000000023e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "156", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0423734 + }, + "COUNTERS:oid:0x5c000000001f23": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.042405 + }, + "COUNTERS:oid:0x5c00000000149f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1362" + }, + "ttl": -0.001, + "expireat": 1651808848.042417 + }, + "COUNTERS:oid:0x5c00000000261f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0424323 + }, + "COUNTERS:oid:0x5c000000001b4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0424452 + }, + "COUNTERS:oid:0x5c000000002526": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1253" + }, + "ttl": -0.001, + "expireat": 1651808848.0424733 + }, + "COUNTERS:oid:0x5c000000001998": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0424848 + }, + "COUNTERS:oid:0x5c00000000184c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0424995 + }, + "COUNTERS:oid:0x5c000000001869": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0425327 + }, + "COUNTERS:oid:0x5c000000001dcf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "109" + }, + "ttl": -0.001, + "expireat": 1651808848.0425487 + }, + "COUNTERS:oid:0x5c000000001bca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.0425644 + }, + "COUNTERS:oid:0x5c000000001485": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0425768 + }, + "COUNTERS:oid:0x5c0000000020da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0425923 + }, + "COUNTERS:oid:0x5c000000001e45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0426085 + }, + "COUNTERS:oid:0x5c0000000013f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1271" + }, + "ttl": -0.001, + "expireat": 1651808848.042641 + }, + "COUNTERS:oid:0x5c000000001876": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0426733 + }, + "COUNTERS:oid:0x5c0000000017ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0427935 + }, + "COUNTERS:oid:0x5c00000000255d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0428298 + }, + "COUNTERS:oid:0x5c000000001a3d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266" + }, + "ttl": -0.001, + "expireat": 1651808848.0428467 + }, + "COUNTERS:oid:0x5c000000002338": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "49", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.042884 + }, + "COUNTERS:oid:0x5c000000001c94": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0428958 + }, + "COUNTERS:oid:0x5c0000000019e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0429108 + }, + "COUNTERS:oid:0x5c0000000015bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0429256 + }, + "COUNTERS:oid:0x5c000000002152": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0429375 + }, + "COUNTERS:oid:0x5c00000000251a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "133", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0429487 + }, + "COUNTERS:oid:0x5c00000000250f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0429635 + }, + "COUNTERS:oid:0x5c000000001d20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "199", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.042978 + }, + "COUNTERS:oid:0x5c000000001d81": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.042993 + }, + "COUNTERS:oid:0x5c000000002532": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0430048 + }, + "COUNTERS:oid:0x5c0000000017d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "129" + }, + "ttl": -0.001, + "expireat": 1651808848.0430193 + }, + "COUNTERS:oid:0x5c000000001932": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.043034 + }, + "COUNTERS:oid:0x5c000000001e4a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.043046 + }, + "COUNTERS:oid:0x5c000000001f35": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0430572 + }, + "COUNTERS:oid:0x5c000000001437": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0430892 + }, + "COUNTERS:oid:0x5c0000000015e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0431068 + }, + "COUNTERS:oid:0x5c00000000252a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0431192 + }, + "COUNTERS:oid:0x5c000000001ee2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0431337 + }, + "COUNTERS:oid:0x5c0000000016f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0431495 + }, + "COUNTERS:oid:0x5c00000000256a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0431616 + }, + "COUNTERS:oid:0x5c000000002335": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.043176 + }, + "COUNTERS:oid:0x5c000000001d3d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32" + }, + "ttl": -0.001, + "expireat": 1651808848.0431907 + }, + "COUNTERS:oid:0x5c0000000025ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0432057 + }, + "COUNTERS:oid:0x5c000000001dba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0432172 + }, + "COUNTERS:oid:0x5c000000001a52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0433064 + }, + "COUNTERS:oid:0x5c0000000015aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0433228 + }, + "COUNTERS:oid:0x5c000000002801": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "90191" + }, + "ttl": -0.001, + "expireat": 1651808848.0433385 + }, + "COUNTERS:oid:0x5c000000001e60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0433547 + }, + "COUNTERS:oid:0x5c0000000023e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1270", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.043367 + }, + "COUNTERS:oid:0x5c000000001dc9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0433817 + }, + "COUNTERS:oid:0x5c00000000163e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1282" + }, + "ttl": -0.001, + "expireat": 1651808848.0433943 + }, + "COUNTERS:oid:0x5c00000000197d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0434062 + }, + "COUNTERS:oid:0x5c000000002177": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0434215 + }, + "COUNTERS:oid:0x5c0000000014ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1226" + }, + "ttl": -0.001, + "expireat": 1651808848.043456 + }, + "COUNTERS:oid:0x5c00000000255a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0434704 + }, + "COUNTERS:oid:0x5c000000002334": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "500", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.043482 + }, + "COUNTERS:oid:0x5c000000001b73": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.043494 + }, + "COUNTERS:oid:0x5c000000001f5e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "39" + }, + "ttl": -0.001, + "expireat": 1651808848.0435216 + }, + "COUNTERS:oid:0x5c0000000025c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1273", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0435328 + }, + "COUNTERS:oid:0x5c000000001639": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0435479 + }, + "COUNTERS:oid:0x5c000000001970": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0435643 + }, + "COUNTERS:oid:0x5c0000000015a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.043576 + }, + "COUNTERS:oid:0x5c000000002501": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147" + }, + "ttl": -0.001, + "expireat": 1651808848.0435905 + }, + "COUNTERS:oid:0x5c0000000025e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0436027 + }, + "COUNTERS:oid:0x5c000000001568": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1420" + }, + "ttl": -0.001, + "expireat": 1651808848.0436144 + }, + "COUNTERS:oid:0x5c0000000013d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "309", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0436287 + }, + "COUNTERS:oid:0x5c000000001a43": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0436437 + }, + "COUNTERS:oid:0x5c0000000018b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0436554 + }, + "COUNTERS:oid:0x5c000000001abd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0436697 + }, + "COUNTERS:oid:0x5c000000001c22": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0436814 + }, + "COUNTERS:oid:0x5c0000000018fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0436933 + }, + "COUNTERS:oid:0x5c000000001d77": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0437076 + }, + "COUNTERS:oid:0x5c000000001633": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0437224 + }, + "COUNTERS:oid:0x5c0000000014c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11615" + }, + "ttl": -0.001, + "expireat": 1651808848.043734 + }, + "COUNTERS:oid:0x5c000000001a7c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "449" + }, + "ttl": -0.001, + "expireat": 1651808848.0437639 + }, + "COUNTERS:oid:0x5c0000000020d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.043781 + }, + "COUNTERS:oid:0x5c00000000247c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "160", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0437968 + }, + "COUNTERS:oid:0x5c000000001c3f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0438087 + }, + "COUNTERS:oid:0x5c000000001c3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0438318 + }, + "COUNTERS:oid:0x5c00000000158f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0438466 + }, + "COUNTERS:oid:0x5c000000001e89": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0438616 + }, + "COUNTERS:oid:0x5c0000000020ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1204" + }, + "ttl": -0.001, + "expireat": 1651808848.0438735 + }, + "COUNTERS:oid:0x5c0000000026f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "7", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0438848 + }, + "COUNTERS:oid:0x5c000000002149": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0438993 + }, + "COUNTERS:oid:0x5c000000001993": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0439258 + }, + "COUNTERS:oid:0x5c000000001f34": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0439594 + }, + "COUNTERS:oid:0x5c00000000159a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.043971 + }, + "COUNTERS:oid:0x5c000000001610": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.043999 + }, + "COUNTERS:oid:0x5c000000002438": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0440137 + }, + "COUNTERS:oid:0x5c0000000024f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0440288 + }, + "COUNTERS:oid:0x5c0000000020c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1273" + }, + "ttl": -0.001, + "expireat": 1651808848.0440438 + }, + "COUNTERS:oid:0x5c000000001cdd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0440586 + }, + "COUNTERS:oid:0x5c000000001bc8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "99", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0440938 + }, + "COUNTERS:oid:0x5c000000001b58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0441256 + }, + "COUNTERS:oid:0x5c00000000179a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "87", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0441525 + }, + "COUNTERS:oid:0x5c000000001dff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "197" + }, + "ttl": -0.001, + "expireat": 1651808848.0441682 + }, + "COUNTERS:oid:0x5c000000002475": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "142", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.04418 + }, + "COUNTERS:oid:0x5c000000001df1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0441918 + }, + "COUNTERS:oid:0x5c000000001c15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.044206 + }, + "COUNTERS:oid:0x5c00000000208e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1520" + }, + "ttl": -0.001, + "expireat": 1651808848.0442178 + }, + "COUNTERS:oid:0x5c0000000018b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.044229 + }, + "COUNTERS:oid:0x5c00000000156c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0442407 + }, + "COUNTERS:oid:0x5c000000001ef7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.044252 + }, + "COUNTERS:oid:0x5c000000001d42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0442631 + }, + "COUNTERS:oid:0x5c000000002665": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0442777 + }, + "COUNTERS:oid:0x5c000000001ced": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0442924 + }, + "COUNTERS:oid:0x5c000000001bb1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1301" + }, + "ttl": -0.001, + "expireat": 1651808848.0443041 + }, + "COUNTERS:oid:0x5c000000001a45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "294" + }, + "ttl": -0.001, + "expireat": 1651808848.0443184 + }, + "COUNTERS:oid:0x5c00000000194a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.04433 + }, + "COUNTERS:oid:0x5c000000001c1f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "275" + }, + "ttl": -0.001, + "expireat": 1651808848.0443447 + }, + "COUNTERS:oid:0x5c00000000242b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1265" + }, + "ttl": -0.001, + "expireat": 1651808848.044356 + }, + "COUNTERS:oid:0x5c00000000182b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "359", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0443676 + }, + "COUNTERS:oid:0x5c000000001dbf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "276", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0443928 + }, + "COUNTERS:oid:0x5c00000000192b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0444245 + }, + "COUNTERS:oid:0x5c000000001ffb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0444374 + }, + "COUNTERS:oid:0x5c000000001f37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.044449 + }, + "COUNTERS:oid:0x5c0000000016ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0444605 + }, + "COUNTERS:oid:0x5c000000001ed2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0444717 + }, + "COUNTERS:oid:0x5c000000002427": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0444834 + }, + "COUNTERS:oid:0x5c000000002734": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200" + }, + "ttl": -0.001, + "expireat": 1651808848.0444946 + }, + "COUNTERS:oid:0x5c000000002439": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1279" + }, + "ttl": -0.001, + "expireat": 1651808848.0445056 + }, + "COUNTERS:oid:0x5c00000000198f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0445204 + }, + "COUNTERS:oid:0x5c000000001708": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.044536 + }, + "COUNTERS:oid:0x5c000000001ee5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0445476 + }, + "COUNTERS:oid:0x5c0000000018e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0445623 + }, + "COUNTERS:oid:0x5c0000000013f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0445776 + }, + "COUNTERS:oid:0x5c00000000241a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0445929 + }, + "COUNTERS:oid:0x5c000000001dd2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.044605 + }, + "COUNTERS:oid:0x5c0000000025a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.044635 + }, + "COUNTERS:oid:0x5c000000001cbe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0446494 + }, + "COUNTERS:oid:0x5c000000001fe6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.044664 + }, + "COUNTERS:oid:0x5c000000002635": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.044678 + }, + "COUNTERS:oid:0x5c0000000014c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19" + }, + "ttl": -0.001, + "expireat": 1651808848.0446925 + }, + "COUNTERS:oid:0x5c00000000176b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0447218 + }, + "COUNTERS:oid:0x5c00000000173f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "159" + }, + "ttl": -0.001, + "expireat": 1651808848.044735 + }, + "COUNTERS:oid:0x5c000000002304": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "469", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0447462 + }, + "COUNTERS:oid:0x5c0000000024fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "130" + }, + "ttl": -0.001, + "expireat": 1651808848.0447574 + }, + "COUNTERS:oid:0x5c000000001ea9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0447686 + }, + "COUNTERS:oid:0x5c000000001c0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.044783 + }, + "COUNTERS:oid:0x5c000000001c4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0447946 + }, + "COUNTERS:oid:0x5c000000001a1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0448086 + }, + "COUNTERS:oid:0x5c000000002630": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0448203 + }, + "COUNTERS:oid:0x5c000000001426": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0448346 + }, + "COUNTERS:oid:0x5c0000000018f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0448458 + }, + "COUNTERS:oid:0x5c00000000193a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1299" + }, + "ttl": -0.001, + "expireat": 1651808848.044857 + }, + "COUNTERS:oid:0x5c0000000020b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0448709 + }, + "COUNTERS:oid:0x5c000000001791": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0448823 + }, + "COUNTERS:oid:0x5c000000001af0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0448961 + }, + "COUNTERS:oid:0x5c00000000181f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.0449076 + }, + "COUNTERS:oid:0x5c0000000019e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0449212 + }, + "COUNTERS:oid:0x5c0000000018c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0449326 + }, + "COUNTERS:oid:0x5c0000000025b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0449467 + }, + "COUNTERS:oid:0x5c000000001471": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0449586 + }, + "COUNTERS:oid:0x5c000000001ea6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0450222 + }, + "COUNTERS:oid:0x5c00000000242c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "139", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0450613 + }, + "COUNTERS:oid:0x5c0000000015b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0450754 + }, + "COUNTERS:oid:0x5c000000002164": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0451033 + }, + "COUNTERS:oid:0x5c00000000210d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305" + }, + "ttl": -0.001, + "expireat": 1651808848.0451171 + }, + "COUNTERS:oid:0x5c000000001383": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1387", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0451317 + }, + "COUNTERS:oid:0x5c0000000016d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "94" + }, + "ttl": -0.001, + "expireat": 1651808848.0451434 + }, + "COUNTERS:oid:0x5c000000002328": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "49", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0451717 + }, + "COUNTERS:oid:0x5c0000000026dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0451858 + }, + "COUNTERS:oid:0x5c000000002565": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0452003 + }, + "COUNTERS:oid:0x5c0000000023cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "99" + }, + "ttl": -0.001, + "expireat": 1651808848.0452123 + }, + "COUNTERS:oid:0x5c000000001d54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0452416 + }, + "COUNTERS:oid:0x5c000000002327": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "38", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0452573 + }, + "COUNTERS:oid:0x5c0000000016d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.045288 + }, + "COUNTERS:oid:0x5c000000001cc4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0453026 + }, + "COUNTERS:oid:0x5c000000001c2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0453172 + }, + "COUNTERS:oid:0x5c000000001b9e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0453289 + }, + "COUNTERS:oid:0x5c000000001f0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "133" + }, + "ttl": -0.001, + "expireat": 1651808848.0453396 + }, + "COUNTERS:oid:0x5c000000001621": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311" + }, + "ttl": -0.001, + "expireat": 1651808848.0453537 + }, + "COUNTERS:oid:0x5c000000001c82": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "106" + }, + "ttl": -0.001, + "expireat": 1651808848.0454154 + }, + "COUNTERS:oid:0x5c000000001e82": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0454304 + }, + "COUNTERS:oid:0x5c000000001ab1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.045445 + }, + "COUNTERS:oid:0x5c0000000016d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.045456 + }, + "COUNTERS:oid:0x5c00000000241f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.045467 + }, + "COUNTERS:oid:0x5c000000001d4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0454957 + }, + "COUNTERS:oid:0x5c00000000247f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0455072 + }, + "COUNTERS:oid:0x5c000000001390": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0455213 + }, + "COUNTERS:oid:0x5c000000002336": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0455332 + }, + "COUNTERS:oid:0x5c0000000016c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0455477 + }, + "COUNTERS:oid:0x5c000000002735": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "160" + }, + "ttl": -0.001, + "expireat": 1651808848.0455632 + }, + "COUNTERS:oid:0x5c0000000023ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0455935 + }, + "COUNTERS:oid:0x5c000000001f17": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0456073 + }, + "COUNTERS:oid:0x5c000000001629": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0456219 + }, + "COUNTERS:oid:0x5c000000001d18": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.045636 + }, + "COUNTERS:oid:0x5c000000001388": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0456505 + }, + "COUNTERS:oid:0x5c00000000277a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.045662 + }, + "COUNTERS:oid:0x5c00000000227e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.045676 + }, + "COUNTERS:oid:0x5c000000001a8e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0457482 + }, + "COUNTERS:oid:0x5c0000000016d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0457637 + }, + "COUNTERS:oid:0x5c00000000254d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297" + }, + "ttl": -0.001, + "expireat": 1651808848.0457785 + }, + "COUNTERS:oid:0x5c000000002525": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "296" + }, + "ttl": -0.001, + "expireat": 1651808848.0457933 + }, + "COUNTERS:oid:0x5c000000001d27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0458078 + }, + "COUNTERS:oid:0x5c0000000015f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.04582 + }, + "COUNTERS:oid:0x5c000000001f4c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0458343 + }, + "COUNTERS:oid:0x5c0000000016be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.045846 + }, + "COUNTERS:oid:0x5c000000001bee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "426", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0458572 + }, + "COUNTERS:oid:0x5c000000001b51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0458717 + }, + "COUNTERS:oid:0x5c00000000160c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0458834 + }, + "COUNTERS:oid:0x5c000000001ea2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0458977 + }, + "COUNTERS:oid:0x5c000000001dc1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.045912 + }, + "COUNTERS:oid:0x5c000000001da1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "121" + }, + "ttl": -0.001, + "expireat": 1651808848.0459232 + }, + "COUNTERS:oid:0x5c000000001cc2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "115" + }, + "ttl": -0.001, + "expireat": 1651808848.0459378 + }, + "COUNTERS:oid:0x5c000000001d2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0459492 + }, + "COUNTERS:oid:0x5c0000000017b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0459604 + }, + "COUNTERS:oid:0x5c0000000020ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0459745 + }, + "COUNTERS:oid:0x5c000000001ff0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.045989 + }, + "COUNTERS:oid:0x5c000000001e06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.046046 + }, + "COUNTERS:oid:0x5c000000001a7e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.046061 + }, + "COUNTERS:oid:0x5c000000002561": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0460753 + }, + "COUNTERS:oid:0x5c000000002056": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0460877 + }, + "COUNTERS:oid:0x5c00000000195e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297" + }, + "ttl": -0.001, + "expireat": 1651808848.0461018 + }, + "COUNTERS:oid:0x5c000000001ede": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0461311 + }, + "COUNTERS:oid:0x5c000000001403": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.0461428 + }, + "COUNTERS:oid:0x5c000000001937": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.046154 + }, + "COUNTERS:oid:0x5c000000001903": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0461688 + }, + "COUNTERS:oid:0x5c000000001693": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.046184 + }, + "COUNTERS:oid:0x5c00000000136a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.046215 + }, + "COUNTERS:oid:0x5c000000002019": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1727" + }, + "ttl": -0.001, + "expireat": 1651808848.0462267 + }, + "COUNTERS:oid:0x5c000000001b50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "119" + }, + "ttl": -0.001, + "expireat": 1651808848.0462377 + }, + "COUNTERS:oid:0x5c000000001f3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0462701 + }, + "COUNTERS:oid:0x5c0000000025e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.0462856 + }, + "COUNTERS:oid:0x5c000000002055": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "206" + }, + "ttl": -0.001, + "expireat": 1651808848.0463006 + }, + "COUNTERS:oid:0x5c0000000019f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "270" + }, + "ttl": -0.001, + "expireat": 1651808848.0463164 + }, + "COUNTERS:oid:0x5c000000001b24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "283" + }, + "ttl": -0.001, + "expireat": 1651808848.0463314 + }, + "COUNTERS:oid:0x5c0000000025b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0464015 + }, + "COUNTERS:oid:0x5c000000001908": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "439" + }, + "ttl": -0.001, + "expireat": 1651808848.0464163 + }, + "COUNTERS:oid:0x5c000000001813": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1306" + }, + "ttl": -0.001, + "expireat": 1651808848.046428 + }, + "COUNTERS:oid:0x5c000000001b9b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0464427 + }, + "COUNTERS:oid:0x5c000000001be4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "166" + }, + "ttl": -0.001, + "expireat": 1651808848.0464559 + }, + "COUNTERS:oid:0x5c0000000016bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0464668 + }, + "COUNTERS:oid:0x5c0000000016bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0464814 + }, + "COUNTERS:oid:0x5c000000002279": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0464935 + }, + "COUNTERS:oid:0x5c0000000023fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0465045 + }, + "COUNTERS:oid:0x5c000000001b68": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.046519 + }, + "COUNTERS:oid:0x5c00000000213f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0465333 + }, + "COUNTERS:oid:0x5c000000001b69": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0465453 + }, + "COUNTERS:oid:0x5c000000002773": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0465593 + }, + "COUNTERS:oid:0x5c000000002114": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0465705 + }, + "COUNTERS:oid:0x5c000000001fd4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1103" + }, + "ttl": -0.001, + "expireat": 1651808848.0465848 + }, + "COUNTERS:oid:0x5c0000000013d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1352" + }, + "ttl": -0.001, + "expireat": 1651808848.0466142 + }, + "COUNTERS:oid:0x5c000000001539": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141" + }, + "ttl": -0.001, + "expireat": 1651808848.0466287 + }, + "COUNTERS:oid:0x5c000000001eab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0466404 + }, + "COUNTERS:oid:0x5c0000000019d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0466518 + }, + "COUNTERS:oid:0x5c000000001a59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0466793 + }, + "COUNTERS:oid:0x5c000000001c6a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "237", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0466936 + }, + "COUNTERS:oid:0x5c0000000019d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.046776 + }, + "COUNTERS:oid:0x5c0000000023f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.046794 + }, + "COUNTERS:oid:0x5c0000000018cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0468066 + }, + "COUNTERS:oid:0x5c000000001412": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0468214 + }, + "COUNTERS:oid:0x5c000000001f07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0468364 + }, + "COUNTERS:oid:0x5c000000001acc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0468483 + }, + "COUNTERS:oid:0x5c000000001ae4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0468717 + }, + "COUNTERS:oid:0x5c0000000020b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0468864 + }, + "COUNTERS:oid:0x5c000000001911": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "203", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0469015 + }, + "COUNTERS:oid:0x5c000000001892": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0469167 + }, + "COUNTERS:oid:0x5c0000000014d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0469444 + }, + "COUNTERS:oid:0x5c0000000019cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "123" + }, + "ttl": -0.001, + "expireat": 1651808848.0469596 + }, + "COUNTERS:oid:0x5c0000000022f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0469716 + }, + "COUNTERS:oid:0x5c000000001e50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0469866 + }, + "COUNTERS:oid:0x5c00000000192c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "92", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0470014 + }, + "COUNTERS:oid:0x5c000000002572": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.047013 + }, + "COUNTERS:oid:0x5c000000002668": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1243", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0470247 + }, + "COUNTERS:oid:0x5c000000001ff2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.047039 + }, + "COUNTERS:oid:0x5c000000001900": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0470707 + }, + "COUNTERS:oid:0x5c0000000014a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11688" + }, + "ttl": -0.001, + "expireat": 1651808848.0470874 + }, + "COUNTERS:oid:0x5c000000001afa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0470994 + }, + "COUNTERS:oid:0x5c000000001666": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.047111 + }, + "COUNTERS:oid:0x5c000000001917": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.047122 + }, + "COUNTERS:oid:0x5c000000001c54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177" + }, + "ttl": -0.001, + "expireat": 1651808848.0471332 + }, + "COUNTERS:oid:0x5c0000000016a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "212" + }, + "ttl": -0.001, + "expireat": 1651808848.0471473 + }, + "COUNTERS:oid:0x5c0000000017a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1314" + }, + "ttl": -0.001, + "expireat": 1651808848.047159 + }, + "COUNTERS:oid:0x5c000000001369": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0471702 + }, + "COUNTERS:oid:0x5c000000001401": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0471811 + }, + "COUNTERS:oid:0x5c0000000020e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1233" + }, + "ttl": -0.001, + "expireat": 1651808848.0472105 + }, + "COUNTERS:oid:0x5c0000000017b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "120" + }, + "ttl": -0.001, + "expireat": 1651808848.0472214 + }, + "COUNTERS:oid:0x5c000000001f31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0473077 + }, + "COUNTERS:oid:0x5c000000002456": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0473413 + }, + "COUNTERS:oid:0x5c000000001a04": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0473535 + }, + "COUNTERS:oid:0x5c00000000172e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "69" + }, + "ttl": -0.001, + "expireat": 1651808848.0473676 + }, + "COUNTERS:oid:0x5c000000001e7f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.047383 + }, + "COUNTERS:oid:0x5c000000001709": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0474148 + }, + "COUNTERS:oid:0x5c000000001478": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19" + }, + "ttl": -0.001, + "expireat": 1651808848.047429 + }, + "COUNTERS:oid:0x5c00000000165e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0474584 + }, + "COUNTERS:oid:0x5c000000001ec1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0474732 + }, + "COUNTERS:oid:0x5c0000000017e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "79" + }, + "ttl": -0.001, + "expireat": 1651808848.047527 + }, + "COUNTERS:oid:0x5c0000000017fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.047541 + }, + "COUNTERS:oid:0x5c000000002006": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0475554 + }, + "COUNTERS:oid:0x5c00000000258e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1249", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0475671 + }, + "COUNTERS:oid:0x5c000000001967": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1346" + }, + "ttl": -0.001, + "expireat": 1651808848.0475783 + }, + "COUNTERS:oid:0x5c000000001a5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0475924 + }, + "COUNTERS:oid:0x5c000000001439": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107" + }, + "ttl": -0.001, + "expireat": 1651808848.0476205 + }, + "COUNTERS:oid:0x5c000000002609": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0476358 + }, + "COUNTERS:oid:0x5c000000001ee9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1354" + }, + "ttl": -0.001, + "expireat": 1651808848.0476477 + }, + "COUNTERS:oid:0x5c000000001839": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0476592 + }, + "COUNTERS:oid:0x5c00000000169d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "66", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.047674 + }, + "COUNTERS:oid:0x5c0000000013f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0476856 + }, + "COUNTERS:oid:0x5c0000000020fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0477164 + }, + "COUNTERS:oid:0x5c00000000144b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0477319 + }, + "COUNTERS:oid:0x5c000000001bc0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0477471 + }, + "COUNTERS:oid:0x5c0000000016af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0477622 + }, + "COUNTERS:oid:0x5c0000000025ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1279", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0477743 + }, + "COUNTERS:oid:0x5c0000000023e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "296", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0477889 + }, + "COUNTERS:oid:0x5c00000000245f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0478237 + }, + "COUNTERS:oid:0x5c0000000013ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0478592 + }, + "COUNTERS:oid:0x5c0000000018ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1323" + }, + "ttl": -0.001, + "expireat": 1651808848.0478735 + }, + "COUNTERS:oid:0x5c0000000018ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0479069 + }, + "COUNTERS:oid:0x5c000000001747": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "139" + }, + "ttl": -0.001, + "expireat": 1651808848.0479352 + }, + "COUNTERS:oid:0x5c000000001b96": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0479481 + }, + "COUNTERS:oid:0x5c00000000262f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0479794 + }, + "COUNTERS:oid:0x5c0000000019bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.048011 + }, + "COUNTERS:oid:0x5c000000002584": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0480232 + }, + "COUNTERS:oid:0x5c000000001d71": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.048038 + }, + "COUNTERS:oid:0x5c000000001b63": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.048053 + }, + "COUNTERS:oid:0x5c000000001893": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.048065 + }, + "COUNTERS:oid:0x5c000000001a92": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0480812 + }, + "COUNTERS:oid:0x5c0000000015d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1237" + }, + "ttl": -0.001, + "expireat": 1651808848.048093 + }, + "COUNTERS:oid:0x5c0000000016a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0481048 + }, + "COUNTERS:oid:0x5c000000001bbb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0481162 + }, + "COUNTERS:oid:0x5c000000001575": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0481277 + }, + "COUNTERS:oid:0x5c0000000025da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0481393 + }, + "COUNTERS:oid:0x5c000000002400": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0481544 + }, + "COUNTERS:oid:0x5c000000001e53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0481665 + }, + "COUNTERS:oid:0x5c000000001c9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.048178 + }, + "COUNTERS:oid:0x5c0000000015b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0481927 + }, + "COUNTERS:oid:0x5c00000000174f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0482254 + }, + "COUNTERS:oid:0x5c000000001afb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0482423 + }, + "COUNTERS:oid:0x5c00000000168a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.048255 + }, + "COUNTERS:oid:0x5c000000001b91": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0482695 + }, + "COUNTERS:oid:0x5c000000001865": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0482845 + }, + "COUNTERS:oid:0x5c0000000017d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0482967 + }, + "COUNTERS:oid:0x5c000000001db9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.048311 + }, + "COUNTERS:oid:0x5c000000001711": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.048323 + }, + "COUNTERS:oid:0x5c000000001b42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1292" + }, + "ttl": -0.001, + "expireat": 1651808848.0483344 + }, + "COUNTERS:oid:0x5c000000001404": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0483496 + }, + "COUNTERS:oid:0x5c000000001cae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.048362 + }, + "COUNTERS:oid:0x5c000000001662": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1286" + }, + "ttl": -0.001, + "expireat": 1651808848.0483735 + }, + "COUNTERS:oid:0x5c0000000017a1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.0483854 + }, + "COUNTERS:oid:0x5c000000001b78": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0484 + }, + "COUNTERS:oid:0x5c000000001dac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0484152 + }, + "COUNTERS:oid:0x5c000000001848": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0484302 + }, + "COUNTERS:oid:0x5c0000000015b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1342" + }, + "ttl": -0.001, + "expireat": 1651808848.048442 + }, + "COUNTERS:oid:0x5c000000001b7d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0484533 + }, + "COUNTERS:oid:0x5c000000001da6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0484684 + }, + "COUNTERS:oid:0x5c00000000156a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0484805 + }, + "COUNTERS:oid:0x5c000000001adf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.04851 + }, + "COUNTERS:oid:0x5c000000002512": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.048527 + }, + "COUNTERS:oid:0x5c0000000019d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1292" + }, + "ttl": -0.001, + "expireat": 1651808848.0485399 + }, + "COUNTERS:oid:0x5c00000000213e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1286", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0485518 + }, + "COUNTERS:oid:0x5c0000000018dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0485637 + }, + "COUNTERS:oid:0x5c0000000017bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.048575 + }, + "COUNTERS:oid:0x5c000000001737": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0485866 + }, + "COUNTERS:oid:0x5c000000001690": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486014 + }, + "COUNTERS:oid:0x5c0000000013de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.048617 + }, + "COUNTERS:oid:0x5c0000000023d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486326 + }, + "COUNTERS:oid:0x5c000000002517": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486476 + }, + "COUNTERS:oid:0x5c000000001d98": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486624 + }, + "COUNTERS:oid:0x5c000000001cca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486784 + }, + "COUNTERS:oid:0x5c0000000023d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0486934 + }, + "COUNTERS:oid:0x5c0000000020f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0487084 + }, + "COUNTERS:oid:0x5c000000001c52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0487206 + }, + "COUNTERS:oid:0x5c000000001a41": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.048735 + }, + "COUNTERS:oid:0x5c000000001d7b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0487502 + }, + "COUNTERS:oid:0x5c0000000020e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0497327 + }, + "COUNTERS:oid:0x5c000000001cad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.049759 + }, + "COUNTERS:oid:0x5c0000000018d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0497742 + }, + "COUNTERS:oid:0x5c000000002765": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "42" + }, + "ttl": -0.001, + "expireat": 1651808848.0497906 + }, + "COUNTERS:oid:0x5c000000001a2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0498035 + }, + "COUNTERS:oid:0x5c00000000184e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "91" + }, + "ttl": -0.001, + "expireat": 1651808848.0498195 + }, + "COUNTERS:oid:0x5c000000001e0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0498352 + }, + "COUNTERS:oid:0x5c000000001afe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "124" + }, + "ttl": -0.001, + "expireat": 1651808848.049848 + }, + "COUNTERS:oid:0x5c000000002637": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.0498784 + }, + "COUNTERS:oid:0x5c000000001a2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.049892 + }, + "COUNTERS:oid:0x5c000000001851": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0499253 + }, + "COUNTERS:oid:0x5c000000001c63": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0499415 + }, + "COUNTERS:oid:0x5c000000001923": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "112" + }, + "ttl": -0.001, + "expireat": 1651808848.049954 + }, + "COUNTERS:oid:0x5c0000000020a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.0499663 + }, + "COUNTERS:oid:0x5c000000001483": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297" + }, + "ttl": -0.001, + "expireat": 1651808848.0499816 + }, + "COUNTERS:oid:0x5c000000001e39": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0499978 + }, + "COUNTERS:oid:0x5c000000001ed9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0500143 + }, + "COUNTERS:oid:0x5c000000001431": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0500274 + }, + "COUNTERS:oid:0x5c0000000013e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "219", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.050057 + }, + "COUNTERS:oid:0x5c00000000263e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0500927 + }, + "COUNTERS:oid:0x5c000000001f5d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "41", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.050111 + }, + "COUNTERS:oid:0x5c0000000018fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0501273 + }, + "COUNTERS:oid:0x5c000000001e93": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.050143 + }, + "COUNTERS:oid:0x5c0000000017dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0501556 + }, + "COUNTERS:oid:0x5c000000001e02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "229", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0501711 + }, + "COUNTERS:oid:0x5c0000000025ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0501876 + }, + "COUNTERS:oid:0x5c00000000258f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0502572 + }, + "COUNTERS:oid:0x5c000000001efb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.050286 + }, + "COUNTERS:oid:0x5c000000001658": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0502982 + }, + "COUNTERS:oid:0x5c000000001493": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.050313 + }, + "COUNTERS:oid:0x5c00000000210e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1264" + }, + "ttl": -0.001, + "expireat": 1651808848.0503252 + }, + "COUNTERS:oid:0x5c000000001c88": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0503402 + }, + "COUNTERS:oid:0x5c0000000015c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0503552 + }, + "COUNTERS:oid:0x5c0000000013ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0503712 + }, + "COUNTERS:oid:0x5c000000001dec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.050386 + }, + "COUNTERS:oid:0x5c000000001a0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0503979 + }, + "COUNTERS:oid:0x5c000000001591": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0504131 + }, + "COUNTERS:oid:0x5c000000001c75": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0560358 + }, + "COUNTERS:oid:0x5c000000001805": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0561626 + }, + "COUNTERS:oid:0x5c000000002781": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0561829 + }, + "COUNTERS:oid:0x5c000000002123": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0562165 + }, + "COUNTERS:oid:0x5c0000000020bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0562294 + }, + "COUNTERS:oid:0x5c000000002477": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.056242 + }, + "COUNTERS:oid:0x5c0000000025d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0562847 + }, + "COUNTERS:oid:0x5c0000000025ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056298 + }, + "COUNTERS:oid:0x5c000000002769": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0563097 + }, + "COUNTERS:oid:0x5c000000001445": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1272" + }, + "ttl": -0.001, + "expireat": 1651808848.056322 + }, + "COUNTERS:oid:0x5c00000000260a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056334 + }, + "COUNTERS:oid:0x5c0000000016ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0563498 + }, + "COUNTERS:oid:0x5c0000000019cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198" + }, + "ttl": -0.001, + "expireat": 1651808848.0563624 + }, + "COUNTERS:oid:0x5c00000000213c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0563745 + }, + "COUNTERS:oid:0x5c000000002173": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0564055 + }, + "COUNTERS:oid:0x5c0000000023ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0564544 + }, + "COUNTERS:oid:0x5c000000002616": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056471 + }, + "COUNTERS:oid:0x5c0000000022fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056528 + }, + "COUNTERS:oid:0x5c000000001594": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "967" + }, + "ttl": -0.001, + "expireat": 1651808848.0565405 + }, + "COUNTERS:oid:0x5c00000000187d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0565555 + }, + "COUNTERS:oid:0x5c000000001dab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "407", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056568 + }, + "COUNTERS:oid:0x5c00000000187a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0565796 + }, + "COUNTERS:oid:0x5c0000000016e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056624 + }, + "COUNTERS:oid:0x5c000000001674": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0566597 + }, + "COUNTERS:oid:0x5c000000001dc5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0566893 + }, + "COUNTERS:oid:0x5c000000002783": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "88" + }, + "ttl": -0.001, + "expireat": 1651808848.0567052 + }, + "COUNTERS:oid:0x5c000000001e94": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056735 + }, + "COUNTERS:oid:0x5c0000000020b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0567472 + }, + "COUNTERS:oid:0x5c0000000013db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0567627 + }, + "COUNTERS:oid:0x5c00000000240a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0567787 + }, + "COUNTERS:oid:0x5c000000001bc3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0567913 + }, + "COUNTERS:oid:0x5c000000002124": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0568037 + }, + "COUNTERS:oid:0x5c0000000020c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0568285 + }, + "COUNTERS:oid:0x5c0000000019ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0568407 + }, + "COUNTERS:oid:0x5c0000000024f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1461" + }, + "ttl": -0.001, + "expireat": 1651808848.0568707 + }, + "COUNTERS:oid:0x5c00000000148b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1388" + }, + "ttl": -0.001, + "expireat": 1651808848.0569005 + }, + "COUNTERS:oid:0x5c000000002323": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "63", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.056933 + }, + "COUNTERS:oid:0x5c000000001b3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200" + }, + "ttl": -0.001, + "expireat": 1651808848.056965 + }, + "COUNTERS:oid:0x5c000000001ef2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.057101 + }, + "COUNTERS:oid:0x5c000000001f1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0571156 + }, + "COUNTERS:oid:0x5c000000001b9c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0571284 + }, + "COUNTERS:oid:0x5c00000000143d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1256" + }, + "ttl": -0.001, + "expireat": 1651808848.0571413 + }, + "COUNTERS:oid:0x5c000000002546": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1273" + }, + "ttl": -0.001, + "expireat": 1651808848.057194 + }, + "COUNTERS:oid:0x5c0000000014f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0572093 + }, + "COUNTERS:oid:0x5c000000001c37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147" + }, + "ttl": -0.001, + "expireat": 1651808848.057242 + }, + "COUNTERS:oid:0x5c00000000181d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0572555 + }, + "COUNTERS:oid:0x5c00000000158d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0572891 + }, + "COUNTERS:oid:0x5c000000001976": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "98", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0573065 + }, + "COUNTERS:oid:0x5c0000000027fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154367" + }, + "ttl": -0.001, + "expireat": 1651808848.0573235 + }, + "COUNTERS:oid:0x5c000000001c1a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.057337 + }, + "COUNTERS:oid:0x5c000000001c89": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.057365 + }, + "COUNTERS:oid:0x5c00000000200e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.057382 + }, + "COUNTERS:oid:0x5c000000001ad7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0573952 + }, + "COUNTERS:oid:0x5c000000002453": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1261", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0574086 + }, + "COUNTERS:oid:0x5c000000001bdc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "92" + }, + "ttl": -0.001, + "expireat": 1651808848.057437 + }, + "COUNTERS:oid:0x5c000000001de9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0574496 + }, + "COUNTERS:oid:0x5c000000001f2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1309" + }, + "ttl": -0.001, + "expireat": 1651808848.0574615 + }, + "COUNTERS:oid:0x5c0000000025eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.057478 + }, + "COUNTERS:oid:0x5c000000002777": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0575035 + }, + "COUNTERS:oid:0x5c0000000026d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311" + }, + "ttl": -0.001, + "expireat": 1651808848.0575204 + }, + "COUNTERS:oid:0x5c00000000164c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.057545 + }, + "COUNTERS:oid:0x5c000000001d46": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "205", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0575576 + }, + "COUNTERS:oid:0x5c00000000139d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "212", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0575697 + }, + "COUNTERS:oid:0x5c000000001f1f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34" + }, + "ttl": -0.001, + "expireat": 1651808848.0576074 + }, + "COUNTERS:oid:0x5c00000000145d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0576382 + }, + "COUNTERS:oid:0x5c000000001eb9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "140", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.05765 + }, + "COUNTERS:oid:0x5c000000001b02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0576777 + }, + "COUNTERS:oid:0x5c0000000022ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "45", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.057693 + }, + "COUNTERS:oid:0x5c000000001fc8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0577052 + }, + "COUNTERS:oid:0x5c00000000258a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0577352 + }, + "COUNTERS:oid:0x5c000000001657": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0577517 + }, + "COUNTERS:oid:0x5c0000000016dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0577877 + }, + "COUNTERS:oid:0x5c000000001f60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0578 + }, + "COUNTERS:oid:0x5c000000001cfb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "197", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0578153 + }, + "COUNTERS:oid:0x5c000000001846": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0578313 + }, + "COUNTERS:oid:0x5c000000001b32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0578473 + }, + "COUNTERS:oid:0x5c000000001f54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0578597 + }, + "COUNTERS:oid:0x5c000000001b85": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0578718 + }, + "COUNTERS:oid:0x5c0000000017e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.0578873 + }, + "COUNTERS:oid:0x5c000000001a4b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0579157 + }, + "COUNTERS:oid:0x5c000000002642": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0579288 + }, + "COUNTERS:oid:0x5c000000001744": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0579443 + }, + "COUNTERS:oid:0x5c00000000240d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0579765 + }, + "COUNTERS:oid:0x5c000000001b8c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0579906 + }, + "COUNTERS:oid:0x5c000000001cc9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.058003 + }, + "COUNTERS:oid:0x5c000000001cf8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0580332 + }, + "COUNTERS:oid:0x5c0000000013e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0580652 + }, + "COUNTERS:oid:0x5c00000000143b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0580816 + }, + "COUNTERS:oid:0x5c000000001875": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0580971 + }, + "COUNTERS:oid:0x5c000000001640": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0581286 + }, + "COUNTERS:oid:0x5c000000002634": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.058141 + }, + "COUNTERS:oid:0x5c0000000015b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0581527 + }, + "COUNTERS:oid:0x5c0000000020ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "288" + }, + "ttl": -0.001, + "expireat": 1651808848.058168 + }, + "COUNTERS:oid:0x5c000000001a6f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0581832 + }, + "COUNTERS:oid:0x5c000000002433": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0582132 + }, + "COUNTERS:oid:0x5c0000000014c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11896" + }, + "ttl": -0.001, + "expireat": 1651808848.058229 + }, + "COUNTERS:oid:0x5c0000000013ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0582418 + }, + "COUNTERS:oid:0x5c000000001a6a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.058254 + }, + "COUNTERS:oid:0x5c000000001e72": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1325" + }, + "ttl": -0.001, + "expireat": 1651808848.0582938 + }, + "COUNTERS:oid:0x5c0000000020b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "504" + }, + "ttl": -0.001, + "expireat": 1651808848.0583105 + }, + "COUNTERS:oid:0x5c000000001477": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11707" + }, + "ttl": -0.001, + "expireat": 1651808848.0583234 + }, + "COUNTERS:oid:0x5c0000000014b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.0583363 + }, + "COUNTERS:oid:0x5c000000002005": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.058349 + }, + "COUNTERS:oid:0x5c000000001446": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.058401 + }, + "COUNTERS:oid:0x5c000000001ca6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0584166 + }, + "COUNTERS:oid:0x5c000000001bc9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "437", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.05843 + }, + "COUNTERS:oid:0x5c000000002319": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "10" + }, + "ttl": -0.001, + "expireat": 1651808848.058446 + }, + "COUNTERS:oid:0x5c000000001f05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265" + }, + "ttl": -0.001, + "expireat": 1651808848.0584624 + }, + "COUNTERS:oid:0x5c0000000017d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.058475 + }, + "COUNTERS:oid:0x5c000000001491": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0584877 + }, + "COUNTERS:oid:0x5c0000000019ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0585032 + }, + "COUNTERS:oid:0x5c00000000175b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0585165 + }, + "COUNTERS:oid:0x5c0000000018b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0585327 + }, + "COUNTERS:oid:0x5c000000002331": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0585644 + }, + "COUNTERS:oid:0x5c000000001c00": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0585806 + }, + "COUNTERS:oid:0x5c000000001364": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0585961 + }, + "COUNTERS:oid:0x5c0000000025a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.058609 + }, + "COUNTERS:oid:0x5c000000001a2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.058624 + }, + "COUNTERS:oid:0x5c000000001985": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0586524 + }, + "COUNTERS:oid:0x5c000000002128": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0586658 + }, + "COUNTERS:oid:0x5c000000002148": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0586777 + }, + "COUNTERS:oid:0x5c000000001b27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0587063 + }, + "COUNTERS:oid:0x5c0000000014aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12159", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0587409 + }, + "COUNTERS:oid:0x5c0000000015ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1306" + }, + "ttl": -0.001, + "expireat": 1651808848.058755 + }, + "COUNTERS:oid:0x5c000000002591": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0587702 + }, + "COUNTERS:oid:0x5c000000002613": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0587862 + }, + "COUNTERS:oid:0x5c000000001d76": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.058798 + }, + "COUNTERS:oid:0x5c0000000014e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11938" + }, + "ttl": -0.001, + "expireat": 1651808848.0588098 + }, + "COUNTERS:oid:0x5c0000000019c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "407" + }, + "ttl": -0.001, + "expireat": 1651808848.058822 + }, + "COUNTERS:oid:0x5c000000001ec9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "166" + }, + "ttl": -0.001, + "expireat": 1651808848.0588365 + }, + "COUNTERS:oid:0x5c000000001a3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202" + }, + "ttl": -0.001, + "expireat": 1651808848.0588486 + }, + "COUNTERS:oid:0x5c000000001b93": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "275" + }, + "ttl": -0.001, + "expireat": 1651808848.0588634 + }, + "COUNTERS:oid:0x5c0000000016ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0588756 + }, + "COUNTERS:oid:0x5c00000000246e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0588906 + }, + "COUNTERS:oid:0x5c000000001d7e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0589023 + }, + "COUNTERS:oid:0x5c000000001d1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0589275 + }, + "COUNTERS:oid:0x5c0000000016f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1239" + }, + "ttl": -0.001, + "expireat": 1651808848.0589404 + }, + "COUNTERS:oid:0x5c000000001449": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.058952 + }, + "COUNTERS:oid:0x5c000000001fc9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.058984 + }, + "COUNTERS:oid:0x5c000000001b0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0589962 + }, + "COUNTERS:oid:0x5c000000001b0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.059026 + }, + "COUNTERS:oid:0x5c00000000178b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1362" + }, + "ttl": -0.001, + "expireat": 1651808848.0590515 + }, + "COUNTERS:oid:0x5c00000000171e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311" + }, + "ttl": -0.001, + "expireat": 1651808848.0590863 + }, + "COUNTERS:oid:0x5c000000001e54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "294", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059104 + }, + "COUNTERS:oid:0x5c000000001a09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0591617 + }, + "COUNTERS:oid:0x5c0000000020f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0591786 + }, + "COUNTERS:oid:0x5c000000001f50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1281" + }, + "ttl": -0.001, + "expireat": 1651808848.0591908 + }, + "COUNTERS:oid:0x5c000000001828": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0592062 + }, + "COUNTERS:oid:0x5c000000001e30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1338" + }, + "ttl": -0.001, + "expireat": 1651808848.0592184 + }, + "COUNTERS:oid:0x5c000000001978": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.0593085 + }, + "COUNTERS:oid:0x5c00000000255f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059329 + }, + "COUNTERS:oid:0x5c000000001724": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0593562 + }, + "COUNTERS:oid:0x5c000000001916": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059372 + }, + "COUNTERS:oid:0x5c0000000013fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1269" + }, + "ttl": -0.001, + "expireat": 1651808848.0593848 + }, + "COUNTERS:oid:0x5c000000001600": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0593963 + }, + "COUNTERS:oid:0x5c000000002416": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0594113 + }, + "COUNTERS:oid:0x5c000000001787": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144" + }, + "ttl": -0.001, + "expireat": 1651808848.0594413 + }, + "COUNTERS:oid:0x5c000000002105": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.059457 + }, + "COUNTERS:oid:0x5c000000001b8d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059472 + }, + "COUNTERS:oid:0x5c000000001fd5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1023" + }, + "ttl": -0.001, + "expireat": 1651808848.059507 + }, + "COUNTERS:oid:0x5c000000002101": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0595248 + }, + "COUNTERS:oid:0x5c0000000017cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0595412 + }, + "COUNTERS:oid:0x5c000000002135": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "290" + }, + "ttl": -0.001, + "expireat": 1651808848.0595572 + }, + "COUNTERS:oid:0x5c0000000019ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.059573 + }, + "COUNTERS:oid:0x5c000000001d62": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0595887 + }, + "COUNTERS:oid:0x5c000000001801": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0596008 + }, + "COUNTERS:oid:0x5c0000000015c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059613 + }, + "COUNTERS:oid:0x5c0000000019c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29" + }, + "ttl": -0.001, + "expireat": 1651808848.0596247 + }, + "COUNTERS:oid:0x5c000000001a78": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.059637 + }, + "COUNTERS:oid:0x5c00000000264c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.059649 + }, + "COUNTERS:oid:0x5c000000001eec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0597005 + }, + "COUNTERS:oid:0x5c0000000025d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0597131 + }, + "COUNTERS:oid:0x5c0000000013f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0597281 + }, + "COUNTERS:oid:0x5c0000000022ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "41" + }, + "ttl": -0.001, + "expireat": 1651808848.0597436 + }, + "COUNTERS:oid:0x5c000000001df4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "108" + }, + "ttl": -0.001, + "expireat": 1651808848.0597749 + }, + "COUNTERS:oid:0x5c0000000013cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "123" + }, + "ttl": -0.001, + "expireat": 1651808848.059787 + }, + "COUNTERS:oid:0x5c000000002470": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298" + }, + "ttl": -0.001, + "expireat": 1651808848.0598018 + }, + "COUNTERS:oid:0x5c000000001994": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0598319 + }, + "COUNTERS:oid:0x5c000000001cf0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0599067 + }, + "COUNTERS:oid:0x5c000000001a9e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0599253 + }, + "COUNTERS:oid:0x5c0000000025de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0599546 + }, + "COUNTERS:oid:0x5c000000002004": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0599697 + }, + "COUNTERS:oid:0x5c000000001f16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0599813 + }, + "COUNTERS:oid:0x5c000000001eb1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "26", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0599928 + }, + "COUNTERS:oid:0x5c000000002354": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "614", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.060004 + }, + "COUNTERS:oid:0x5c00000000212d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "257" + }, + "ttl": -0.001, + "expireat": 1651808848.0600486 + }, + "COUNTERS:oid:0x5c000000001df5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "401", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0600615 + }, + "COUNTERS:oid:0x5c0000000014dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.060073 + }, + "COUNTERS:oid:0x5c000000001ab7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0600882 + }, + "COUNTERS:oid:0x5c00000000157d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0601037 + }, + "COUNTERS:oid:0x5c0000000018ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0601158 + }, + "COUNTERS:oid:0x5c0000000016f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107" + }, + "ttl": -0.001, + "expireat": 1651808848.0601277 + }, + "COUNTERS:oid:0x5c00000000157c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1358" + }, + "ttl": -0.001, + "expireat": 1651808848.0601392 + }, + "COUNTERS:oid:0x5c00000000140b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.060167 + }, + "COUNTERS:oid:0x5c000000001a2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.060182 + }, + "COUNTERS:oid:0x5c000000002640": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1235" + }, + "ttl": -0.001, + "expireat": 1651808848.0601938 + }, + "COUNTERS:oid:0x5c000000001606": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.060205 + }, + "COUNTERS:oid:0x5c000000001e65": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "518", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0602162 + }, + "COUNTERS:oid:0x5c000000002303": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "59", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0602436 + }, + "COUNTERS:oid:0x5c000000001fe8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "269", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0603402 + }, + "COUNTERS:oid:0x5c0000000019b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0603566 + }, + "COUNTERS:oid:0x5c000000001977": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "401" + }, + "ttl": -0.001, + "expireat": 1651808848.0603898 + }, + "COUNTERS:oid:0x5c0000000017d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183" + }, + "ttl": -0.001, + "expireat": 1651808848.0604012 + }, + "COUNTERS:oid:0x5c0000000018da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.060432 + }, + "COUNTERS:oid:0x5c0000000014ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0604656 + }, + "COUNTERS:oid:0x5c000000002405": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0604813 + }, + "COUNTERS:oid:0x5c000000001ffe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0605102 + }, + "COUNTERS:oid:0x5c000000002347": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "38", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0605357 + }, + "COUNTERS:oid:0x5c00000000138b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1043", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0605516 + }, + "COUNTERS:oid:0x5c000000001592": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.060564 + }, + "COUNTERS:oid:0x5c000000001646": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1308" + }, + "ttl": -0.001, + "expireat": 1651808848.060576 + }, + "COUNTERS:oid:0x5c0000000015cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "184", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0606072 + }, + "COUNTERS:oid:0x5c000000002106": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1201" + }, + "ttl": -0.001, + "expireat": 1651808848.0606203 + }, + "COUNTERS:oid:0x5c0000000015d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0606353 + }, + "COUNTERS:oid:0x5c000000001e66": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "30" + }, + "ttl": -0.001, + "expireat": 1651808848.0606513 + }, + "COUNTERS:oid:0x5c000000001c12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "109", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0606844 + }, + "COUNTERS:oid:0x5c000000001845": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "101" + }, + "ttl": -0.001, + "expireat": 1651808848.0606978 + }, + "COUNTERS:oid:0x5c000000001366": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.060772 + }, + "COUNTERS:oid:0x5c000000001689": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "101" + }, + "ttl": -0.001, + "expireat": 1651808848.0608037 + }, + "COUNTERS:oid:0x5c00000000192e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.0608191 + }, + "COUNTERS:oid:0x5c000000002623": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0608346 + }, + "COUNTERS:oid:0x5c00000000259e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1284" + }, + "ttl": -0.001, + "expireat": 1651808848.0608473 + }, + "COUNTERS:oid:0x5c00000000172f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "255" + }, + "ttl": -0.001, + "expireat": 1651808848.060859 + }, + "COUNTERS:oid:0x5c000000002533": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0608737 + }, + "COUNTERS:oid:0x5c000000002478": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.060889 + }, + "COUNTERS:oid:0x5c000000001d26": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0609016 + }, + "COUNTERS:oid:0x5c000000001698": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.060924 + }, + "COUNTERS:oid:0x5c000000001924": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0609398 + }, + "COUNTERS:oid:0x5c000000001667": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.060955 + }, + "COUNTERS:oid:0x5c000000001dd1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34" + }, + "ttl": -0.001, + "expireat": 1651808848.0609987 + }, + "COUNTERS:oid:0x5c0000000017f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0610175 + }, + "COUNTERS:oid:0x5c000000001812": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "275", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0610332 + }, + "COUNTERS:oid:0x5c000000002355": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "3" + }, + "ttl": -0.001, + "expireat": 1651808848.0610485 + }, + "COUNTERS:oid:0x5c0000000013f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0610611 + }, + "COUNTERS:oid:0x5c00000000246c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0610762 + }, + "COUNTERS:oid:0x5c000000001a06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0611107 + }, + "COUNTERS:oid:0x5c00000000196b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0611246 + }, + "COUNTERS:oid:0x5c000000001c23": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0611575 + }, + "COUNTERS:oid:0x5c000000001941": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307" + }, + "ttl": -0.001, + "expireat": 1651808848.0612855 + }, + "COUNTERS:oid:0x5c000000001da8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0613062 + }, + "COUNTERS:oid:0x5c000000001889": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1262" + }, + "ttl": -0.001, + "expireat": 1651808848.0613213 + }, + "COUNTERS:oid:0x5c000000001788": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.06137 + }, + "COUNTERS:oid:0x5c00000000176c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.061389 + }, + "COUNTERS:oid:0x5c000000001593": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "967", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0614076 + }, + "COUNTERS:oid:0x5c0000000025be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1272", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0614223 + }, + "COUNTERS:oid:0x5c00000000263b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0614524 + }, + "COUNTERS:oid:0x5c000000001e20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0614707 + }, + "COUNTERS:oid:0x5c000000002520": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.061485 + }, + "COUNTERS:oid:0x5c000000001aa2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0615149 + }, + "COUNTERS:oid:0x5c000000001a11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0615337 + }, + "COUNTERS:oid:0x5c0000000020bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0615516 + }, + "COUNTERS:oid:0x5c00000000170a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "75" + }, + "ttl": -0.001, + "expireat": 1651808848.0615692 + }, + "COUNTERS:oid:0x5c0000000018aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.061625 + }, + "COUNTERS:oid:0x5c0000000018a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.061641 + }, + "COUNTERS:oid:0x5c00000000244c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.061658 + }, + "COUNTERS:oid:0x5c0000000023fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "165" + }, + "ttl": -0.001, + "expireat": 1651808848.0616758 + }, + "COUNTERS:oid:0x5c000000001413": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0616925 + }, + "COUNTERS:oid:0x5c00000000244a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0617263 + }, + "COUNTERS:oid:0x5c00000000265c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0617392 + }, + "COUNTERS:oid:0x5c000000002100": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0617688 + }, + "COUNTERS:oid:0x5c000000002595": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0617843 + }, + "COUNTERS:oid:0x5c000000001899": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "399", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0617974 + }, + "COUNTERS:oid:0x5c000000001456": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.061813 + }, + "COUNTERS:oid:0x5c00000000274d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0618289 + }, + "COUNTERS:oid:0x5c000000001572": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0618653 + }, + "COUNTERS:oid:0x5c000000001e5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0618777 + }, + "COUNTERS:oid:0x5c00000000234c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "428", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0618904 + }, + "COUNTERS:oid:0x5c000000001a68": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.061918 + }, + "COUNTERS:oid:0x5c000000001e2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102" + }, + "ttl": -0.001, + "expireat": 1651808848.06193 + }, + "COUNTERS:oid:0x5c000000001ecc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0619419 + }, + "COUNTERS:oid:0x5c00000000240e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.061957 + }, + "COUNTERS:oid:0x5c000000002312": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.061969 + }, + "COUNTERS:oid:0x5c00000000261c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.061981 + }, + "COUNTERS:oid:0x5c000000001cbd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1323" + }, + "ttl": -0.001, + "expireat": 1651808848.0620134 + }, + "COUNTERS:oid:0x5c000000001e75": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0620308 + }, + "COUNTERS:oid:0x5c000000001d16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "113", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0620477 + }, + "COUNTERS:oid:0x5c00000000148e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0620635 + }, + "COUNTERS:oid:0x5c000000001988": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0620751 + }, + "COUNTERS:oid:0x5c00000000146f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.062087 + }, + "COUNTERS:oid:0x5c000000001a97": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186" + }, + "ttl": -0.001, + "expireat": 1651808848.0620992 + }, + "COUNTERS:oid:0x5c00000000200b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0621157 + }, + "COUNTERS:oid:0x5c00000000194b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0621328 + }, + "COUNTERS:oid:0x5c000000001488": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11907" + }, + "ttl": -0.001, + "expireat": 1651808848.0621455 + }, + "COUNTERS:oid:0x5c000000001470": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.062161 + }, + "COUNTERS:oid:0x5c0000000018e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0621896 + }, + "COUNTERS:oid:0x5c000000002346": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0622022 + }, + "COUNTERS:oid:0x5c0000000016bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.062218 + }, + "COUNTERS:oid:0x5c0000000025f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.062234 + }, + "COUNTERS:oid:0x5c0000000018ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0622494 + }, + "COUNTERS:oid:0x5c00000000240b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.062263 + }, + "COUNTERS:oid:0x5c000000001d4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0622754 + }, + "COUNTERS:oid:0x5c000000001ae1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "114" + }, + "ttl": -0.001, + "expireat": 1651808848.062287 + }, + "COUNTERS:oid:0x5c000000001642": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0622995 + }, + "COUNTERS:oid:0x5c00000000274c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0623324 + }, + "COUNTERS:oid:0x5c00000000181c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0623498 + }, + "COUNTERS:oid:0x5c00000000234e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0623627 + }, + "COUNTERS:oid:0x5c000000001933": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0623744 + }, + "COUNTERS:oid:0x5c000000001602": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0623863 + }, + "COUNTERS:oid:0x5c000000001b26": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0624013 + }, + "COUNTERS:oid:0x5c000000002599": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0624168 + }, + "COUNTERS:oid:0x5c000000001fd3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.062429 + }, + "COUNTERS:oid:0x5c000000001eb8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0624444 + }, + "COUNTERS:oid:0x5c000000001634": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.062457 + }, + "COUNTERS:oid:0x5c000000001599": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.062472 + }, + "COUNTERS:oid:0x5c000000002125": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "280" + }, + "ttl": -0.001, + "expireat": 1651808848.0624876 + }, + "COUNTERS:oid:0x5c000000001398": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0625026 + }, + "COUNTERS:oid:0x5c00000000206b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.062518 + }, + "COUNTERS:oid:0x5c00000000215c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.06253 + }, + "COUNTERS:oid:0x5c00000000145a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5546", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0625446 + }, + "COUNTERS:oid:0x5c0000000015b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183" + }, + "ttl": -0.001, + "expireat": 1651808848.06256 + }, + "COUNTERS:oid:0x5c000000001ad2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "258", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0625753 + }, + "COUNTERS:oid:0x5c000000001fcf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0626075 + }, + "COUNTERS:oid:0x5c0000000025b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0626223 + }, + "COUNTERS:oid:0x5c0000000021f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.062648 + }, + "COUNTERS:oid:0x5c000000001ddc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "263", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0626645 + }, + "COUNTERS:oid:0x5c00000000241e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0626805 + }, + "COUNTERS:oid:0x5c000000001d88": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0626934 + }, + "COUNTERS:oid:0x5c000000001800": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0627089 + }, + "COUNTERS:oid:0x5c00000000178d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0627208 + }, + "COUNTERS:oid:0x5c0000000019b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0627356 + }, + "COUNTERS:oid:0x5c000000002341": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0627513 + }, + "COUNTERS:oid:0x5c000000001a88": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "258" + }, + "ttl": -0.001, + "expireat": 1651808848.0627666 + }, + "COUNTERS:oid:0x5c0000000013d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0627797 + }, + "COUNTERS:oid:0x5c000000001755": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0627913 + }, + "COUNTERS:oid:0x5c0000000014d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12006" + }, + "ttl": -0.001, + "expireat": 1651808848.0628068 + }, + "COUNTERS:oid:0x5c000000001e36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "100" + }, + "ttl": -0.001, + "expireat": 1651808848.062819 + }, + "COUNTERS:oid:0x5c0000000017d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0628343 + }, + "COUNTERS:oid:0x5c000000002154": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0628467 + }, + "COUNTERS:oid:0x5c0000000014e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1225" + }, + "ttl": -0.001, + "expireat": 1651808848.0628583 + }, + "COUNTERS:oid:0x5c000000001b59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "95", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0628736 + }, + "COUNTERS:oid:0x5c000000001bf4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0629067 + }, + "COUNTERS:oid:0x5c0000000025e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1281" + }, + "ttl": -0.001, + "expireat": 1651808848.0629206 + }, + "COUNTERS:oid:0x5c000000001dda": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "204" + }, + "ttl": -0.001, + "expireat": 1651808848.0629323 + }, + "COUNTERS:oid:0x5c000000001cdb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0629597 + }, + "COUNTERS:oid:0x5c00000000209e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1187", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0629728 + }, + "COUNTERS:oid:0x5c000000001bbd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0629983 + }, + "COUNTERS:oid:0x5c0000000020cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1507", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0630136 + }, + "COUNTERS:oid:0x5c000000001b1c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "277", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0630302 + }, + "COUNTERS:oid:0x5c000000001ac1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0630457 + }, + "COUNTERS:oid:0x5c000000002240": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147" + }, + "ttl": -0.001, + "expireat": 1651808848.063058 + }, + "COUNTERS:oid:0x5c000000001a93": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.06307 + }, + "COUNTERS:oid:0x5c000000001ac0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0630817 + }, + "COUNTERS:oid:0x5c0000000016f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.063111 + }, + "COUNTERS:oid:0x5c00000000140a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201" + }, + "ttl": -0.001, + "expireat": 1651808848.0631273 + }, + "COUNTERS:oid:0x5c000000001c49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.063142 + }, + "COUNTERS:oid:0x5c000000001da3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.063154 + }, + "COUNTERS:oid:0x5c000000001cd7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "168", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.063166 + }, + "COUNTERS:oid:0x5c00000000173d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.063178 + }, + "COUNTERS:oid:0x5c0000000025f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0631897 + }, + "COUNTERS:oid:0x5c00000000253c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0632014 + }, + "COUNTERS:oid:0x5c000000001710": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "194", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.063217 + }, + "COUNTERS:oid:0x5c00000000198d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0657375 + }, + "COUNTERS:oid:0x5c00000000262e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.065758 + }, + "COUNTERS:oid:0x5c0000000017a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198" + }, + "ttl": -0.001, + "expireat": 1651808848.0657752 + }, + "COUNTERS:oid:0x5c000000001f5b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0657918 + }, + "COUNTERS:oid:0x5c000000001a36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.065807 + }, + "COUNTERS:oid:0x5c000000001ac5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "100", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0658238 + }, + "COUNTERS:oid:0x5c00000000141f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0658398 + }, + "COUNTERS:oid:0x5c00000000244d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0658524 + }, + "COUNTERS:oid:0x5c000000001b64": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "157" + }, + "ttl": -0.001, + "expireat": 1651808848.0658646 + }, + "COUNTERS:oid:0x5c0000000015b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0658798 + }, + "COUNTERS:oid:0x5c00000000184d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0658922 + }, + "COUNTERS:oid:0x5c0000000015e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.065904 + }, + "COUNTERS:oid:0x5c00000000259a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0659153 + }, + "COUNTERS:oid:0x5c000000001762": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0659306 + }, + "COUNTERS:oid:0x5c0000000019f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1265" + }, + "ttl": -0.001, + "expireat": 1651808848.0659423 + }, + "COUNTERS:oid:0x5c0000000019db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0659537 + }, + "COUNTERS:oid:0x5c000000001b97": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0659688 + }, + "COUNTERS:oid:0x5c0000000021fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0659811 + }, + "COUNTERS:oid:0x5c0000000013f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0659924 + }, + "COUNTERS:oid:0x5c000000001b0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0660074 + }, + "COUNTERS:oid:0x5c000000001e99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0660417 + }, + "COUNTERS:oid:0x5c000000001f32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "263" + }, + "ttl": -0.001, + "expireat": 1651808848.0660596 + }, + "COUNTERS:oid:0x5c00000000216f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0660753 + }, + "COUNTERS:oid:0x5c0000000015ef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.066091 + }, + "COUNTERS:oid:0x5c00000000198c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1257" + }, + "ttl": -0.001, + "expireat": 1651808848.0661027 + }, + "COUNTERS:oid:0x5c000000001792": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0661182 + }, + "COUNTERS:oid:0x5c000000001fe2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0661335 + }, + "COUNTERS:oid:0x5c000000002629": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0661483 + }, + "COUNTERS:oid:0x5c000000001e96": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "242" + }, + "ttl": -0.001, + "expireat": 1651808848.0661638 + }, + "COUNTERS:oid:0x5c0000000015b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0661788 + }, + "COUNTERS:oid:0x5c000000001bb5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.066191 + }, + "COUNTERS:oid:0x5c000000001c9f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0662057 + }, + "COUNTERS:oid:0x5c000000001bd2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.066221 + }, + "COUNTERS:oid:0x5c000000001a67": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0662367 + }, + "COUNTERS:oid:0x5c000000002083": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "337" + }, + "ttl": -0.001, + "expireat": 1651808848.0662518 + }, + "COUNTERS:oid:0x5c000000002339": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0662673 + }, + "COUNTERS:oid:0x5c0000000013bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.0662787 + }, + "COUNTERS:oid:0x5c000000001648": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0663085 + }, + "COUNTERS:oid:0x5c000000001fdb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.066322 + }, + "COUNTERS:oid:0x5c000000001fdc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1407" + }, + "ttl": -0.001, + "expireat": 1651808848.0663378 + }, + "COUNTERS:oid:0x5c000000002324": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "486", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0663505 + }, + "COUNTERS:oid:0x5c000000001416": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0663657 + }, + "COUNTERS:oid:0x5c000000001dbd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0663805 + }, + "COUNTERS:oid:0x5c00000000137c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1052", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0663958 + }, + "COUNTERS:oid:0x5c0000000027dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0664105 + }, + "COUNTERS:oid:0x5c000000002342": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0664225 + }, + "COUNTERS:oid:0x5c0000000022fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0664344 + }, + "COUNTERS:oid:0x5c0000000023f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0664458 + }, + "COUNTERS:oid:0x5c000000002450": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0664604 + }, + "COUNTERS:oid:0x5c0000000026dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0664728 + }, + "COUNTERS:oid:0x5c000000001ab0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0664842 + }, + "COUNTERS:oid:0x5c0000000014f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0664985 + }, + "COUNTERS:oid:0x5c000000001e74": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0665104 + }, + "COUNTERS:oid:0x5c000000001605": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.066525 + }, + "COUNTERS:oid:0x5c000000001d12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.06654 + }, + "COUNTERS:oid:0x5c0000000020d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "913" + }, + "ttl": -0.001, + "expireat": 1651808848.0665548 + }, + "COUNTERS:oid:0x5c000000001578": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1429" + }, + "ttl": -0.001, + "expireat": 1651808848.0665853 + }, + "COUNTERS:oid:0x5c000000001368": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.066602 + }, + "COUNTERS:oid:0x5c00000000246a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.066614 + }, + "COUNTERS:oid:0x5c000000001411": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0666256 + }, + "COUNTERS:oid:0x5c0000000014d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0666404 + }, + "COUNTERS:oid:0x5c000000002430": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0666554 + }, + "COUNTERS:oid:0x5c0000000023cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0666704 + }, + "COUNTERS:oid:0x5c0000000013e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0666854 + }, + "COUNTERS:oid:0x5c0000000027ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1472" + }, + "ttl": -0.001, + "expireat": 1651808848.0666971 + }, + "COUNTERS:oid:0x5c000000001d05": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "91" + }, + "ttl": -0.001, + "expireat": 1651808848.0667088 + }, + "COUNTERS:oid:0x5c000000002639": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0667233 + }, + "COUNTERS:oid:0x5c000000001dc0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1347" + }, + "ttl": -0.001, + "expireat": 1651808848.0667353 + }, + "COUNTERS:oid:0x5c0000000017ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0667498 + }, + "COUNTERS:oid:0x5c000000001c80": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.066765 + }, + "COUNTERS:oid:0x5c0000000023e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0667768 + }, + "COUNTERS:oid:0x5c000000002150": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0667884 + }, + "COUNTERS:oid:0x5c000000001645": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0668204 + }, + "COUNTERS:oid:0x5c0000000014bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0668325 + }, + "COUNTERS:oid:0x5c0000000019df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0668445 + }, + "COUNTERS:oid:0x5c0000000026e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1571" + }, + "ttl": -0.001, + "expireat": 1651808848.0668561 + }, + "COUNTERS:oid:0x5c00000000256e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1244", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0668862 + }, + "COUNTERS:oid:0x5c0000000019ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0669038 + }, + "COUNTERS:oid:0x5c0000000017cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0669165 + }, + "COUNTERS:oid:0x5c0000000013c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201" + }, + "ttl": -0.001, + "expireat": 1651808848.0669444 + }, + "COUNTERS:oid:0x5c000000001ca2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0669556 + }, + "COUNTERS:oid:0x5c0000000014cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1279" + }, + "ttl": -0.001, + "expireat": 1651808848.0669672 + }, + "COUNTERS:oid:0x5c00000000179b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "317" + }, + "ttl": -0.001, + "expireat": 1651808848.0669782 + }, + "COUNTERS:oid:0x5c000000001821": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0669904 + }, + "COUNTERS:oid:0x5c0000000020f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0670047 + }, + "COUNTERS:oid:0x5c00000000196e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0670195 + }, + "COUNTERS:oid:0x5c000000001d9b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1316" + }, + "ttl": -0.001, + "expireat": 1651808848.0670311 + }, + "COUNTERS:oid:0x5c000000002581": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "164" + }, + "ttl": -0.001, + "expireat": 1651808848.067046 + }, + "COUNTERS:oid:0x5c000000001ea0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0670607 + }, + "COUNTERS:oid:0x5c00000000265d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0670755 + }, + "COUNTERS:oid:0x5c000000001d6b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0670874 + }, + "COUNTERS:oid:0x5c0000000015fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1294" + }, + "ttl": -0.001, + "expireat": 1651808848.0670986 + }, + "COUNTERS:oid:0x5c000000001ce1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "245", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0671134 + }, + "COUNTERS:oid:0x5c000000001de6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0671282 + }, + "COUNTERS:oid:0x5c000000001e87": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0671425 + }, + "COUNTERS:oid:0x5c00000000188a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0671573 + }, + "COUNTERS:oid:0x5c000000001469": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1301" + }, + "ttl": -0.001, + "expireat": 1651808848.0671866 + }, + "COUNTERS:oid:0x5c000000001f58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1393" + }, + "ttl": -0.001, + "expireat": 1651808848.0672002 + }, + "COUNTERS:oid:0x5c000000001ec6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.067212 + }, + "COUNTERS:oid:0x5c000000001f27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202" + }, + "ttl": -0.001, + "expireat": 1651808848.0673006 + }, + "COUNTERS:oid:0x5c000000001909": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31" + }, + "ttl": -0.001, + "expireat": 1651808848.0673263 + }, + "COUNTERS:oid:0x5c000000001c50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0673554 + }, + "COUNTERS:oid:0x5c000000001b55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.06737 + }, + "COUNTERS:oid:0x5c000000001ce8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0673978 + }, + "COUNTERS:oid:0x5c0000000023f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0674102 + }, + "COUNTERS:oid:0x5c000000002440": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0674253 + }, + "COUNTERS:oid:0x5c000000001373": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1386", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0674584 + }, + "COUNTERS:oid:0x5c0000000014a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0674908 + }, + "COUNTERS:oid:0x5c000000001995": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0675066 + }, + "COUNTERS:oid:0x5c00000000191d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1352" + }, + "ttl": -0.001, + "expireat": 1651808848.0675185 + }, + "COUNTERS:oid:0x5c00000000246f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0675297 + }, + "COUNTERS:oid:0x5c00000000216d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "217", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0675607 + }, + "COUNTERS:oid:0x5c00000000139b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.067572 + }, + "COUNTERS:oid:0x5c0000000026f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1067", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0675836 + }, + "COUNTERS:oid:0x5c00000000172c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.067598 + }, + "COUNTERS:oid:0x5c000000001d21": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0676103 + }, + "COUNTERS:oid:0x5c000000001927": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0676434 + }, + "COUNTERS:oid:0x5c0000000025a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1268", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0676572 + }, + "COUNTERS:oid:0x5c000000001b4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0676718 + }, + "COUNTERS:oid:0x5c000000001914": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "228" + }, + "ttl": -0.001, + "expireat": 1651808848.0676877 + }, + "COUNTERS:oid:0x5c000000001ef3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0676997 + }, + "COUNTERS:oid:0x5c000000001632": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0677114 + }, + "COUNTERS:oid:0x5c000000001c03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1309" + }, + "ttl": -0.001, + "expireat": 1651808848.0677226 + }, + "COUNTERS:oid:0x5c0000000014cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "292" + }, + "ttl": -0.001, + "expireat": 1651808848.0677369 + }, + "COUNTERS:oid:0x5c0000000014f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1194" + }, + "ttl": -0.001, + "expireat": 1651808848.0677483 + }, + "COUNTERS:oid:0x5c000000002522": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "136" + }, + "ttl": -0.001, + "expireat": 1651808848.06776 + }, + "COUNTERS:oid:0x5c000000001871": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0677745 + }, + "COUNTERS:oid:0x5c000000001b94": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1314" + }, + "ttl": -0.001, + "expireat": 1651808848.0677862 + }, + "COUNTERS:oid:0x5c0000000015d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0678008 + }, + "COUNTERS:oid:0x5c0000000019ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0678124 + }, + "COUNTERS:oid:0x5c000000001785": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.067824 + }, + "COUNTERS:oid:0x5c0000000016db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.067838 + }, + "COUNTERS:oid:0x5c00000000188f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0678682 + }, + "COUNTERS:oid:0x5c00000000277b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0679007 + }, + "COUNTERS:oid:0x5c000000001efa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34" + }, + "ttl": -0.001, + "expireat": 1651808848.067944 + }, + "COUNTERS:oid:0x5c00000000173b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1254" + }, + "ttl": -0.001, + "expireat": 1651808848.0679567 + }, + "COUNTERS:oid:0x5c000000001bfb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1268" + }, + "ttl": -0.001, + "expireat": 1651808848.06797 + }, + "COUNTERS:oid:0x5c000000001e7a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1345" + }, + "ttl": -0.001, + "expireat": 1651808848.068002 + }, + "COUNTERS:oid:0x5c0000000025f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0680363 + }, + "COUNTERS:oid:0x5c000000001c7d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0680494 + }, + "COUNTERS:oid:0x5c0000000018f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0680647 + }, + "COUNTERS:oid:0x5c0000000020fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.068078 + }, + "COUNTERS:oid:0x5c00000000217d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "220", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0680935 + }, + "COUNTERS:oid:0x5c000000001bd5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "233" + }, + "ttl": -0.001, + "expireat": 1651808848.0681093 + }, + "COUNTERS:oid:0x5c000000002648": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1275" + }, + "ttl": -0.001, + "expireat": 1651808848.0681221 + }, + "COUNTERS:oid:0x5c0000000013b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0681336 + }, + "COUNTERS:oid:0x5c00000000217a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.068146 + }, + "COUNTERS:oid:0x5c000000001b35": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "423", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0681577 + }, + "COUNTERS:oid:0x5c000000001bde": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1322" + }, + "ttl": -0.001, + "expireat": 1651808848.0681698 + }, + "COUNTERS:oid:0x5c0000000019a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0681853 + }, + "COUNTERS:oid:0x5c00000000187e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "204", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0681982 + }, + "COUNTERS:oid:0x5c0000000020e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.06821 + }, + "COUNTERS:oid:0x5c000000002276": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0682251 + }, + "COUNTERS:oid:0x5c00000000139a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0682406 + }, + "COUNTERS:oid:0x5c000000001bc2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0682719 + }, + "COUNTERS:oid:0x5c000000002571": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0683029 + }, + "COUNTERS:oid:0x5c000000001dde": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.068337 + }, + "COUNTERS:oid:0x5c000000001aad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.068371 + }, + "COUNTERS:oid:0x5c000000001c74": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0683887 + }, + "COUNTERS:oid:0x5c0000000025df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0684202 + }, + "COUNTERS:oid:0x5c000000001492": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0684352 + }, + "COUNTERS:oid:0x5c000000001476": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11662" + }, + "ttl": -0.001, + "expireat": 1651808848.06845 + }, + "COUNTERS:oid:0x5c000000001a21": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.0684621 + }, + "COUNTERS:oid:0x5c000000002462": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.068477 + }, + "COUNTERS:oid:0x5c0000000025fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0684886 + }, + "COUNTERS:oid:0x5c0000000013e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0685005 + }, + "COUNTERS:oid:0x5c000000001b5b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0685148 + }, + "COUNTERS:oid:0x5c000000001936": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "195" + }, + "ttl": -0.001, + "expireat": 1651808848.0685296 + }, + "COUNTERS:oid:0x5c00000000143c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0685413 + }, + "COUNTERS:oid:0x5c0000000025f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0685523 + }, + "COUNTERS:oid:0x5c0000000014d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1276" + }, + "ttl": -0.001, + "expireat": 1651808848.0685637 + }, + "COUNTERS:oid:0x5c000000001894": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0685778 + }, + "COUNTERS:oid:0x5c000000001d60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "113", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0685923 + }, + "COUNTERS:oid:0x5c000000001d0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0686073 + }, + "COUNTERS:oid:0x5c000000002446": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0686219 + }, + "COUNTERS:oid:0x5c000000002603": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0686734 + }, + "COUNTERS:oid:0x5c0000000018b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0686915 + }, + "COUNTERS:oid:0x5c000000001f15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0687068 + }, + "COUNTERS:oid:0x5c000000002443": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0687194 + }, + "COUNTERS:oid:0x5c000000001cb2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201" + }, + "ttl": -0.001, + "expireat": 1651808848.0687308 + }, + "COUNTERS:oid:0x5c00000000160a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0687428 + }, + "COUNTERS:oid:0x5c00000000161b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0687575 + }, + "COUNTERS:oid:0x5c000000001ba5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.068773 + }, + "COUNTERS:oid:0x5c000000001363": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0687847 + }, + "COUNTERS:oid:0x5c0000000025d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0687969 + }, + "COUNTERS:oid:0x5c000000002554": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154" + }, + "ttl": -0.001, + "expireat": 1651808848.0688086 + }, + "COUNTERS:oid:0x5c000000002153": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0688233 + }, + "COUNTERS:oid:0x5c000000001393": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0688353 + }, + "COUNTERS:oid:0x5c000000001435": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.068847 + }, + "COUNTERS:oid:0x5c000000002452": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0688589 + }, + "COUNTERS:oid:0x5c00000000250c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0688708 + }, + "COUNTERS:oid:0x5c000000001d0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0688822 + }, + "COUNTERS:oid:0x5c000000001d52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0688975 + }, + "COUNTERS:oid:0x5c000000001496": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "26" + }, + "ttl": -0.001, + "expireat": 1651808848.068912 + }, + "COUNTERS:oid:0x5c00000000143f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "184", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.068927 + }, + "COUNTERS:oid:0x5c00000000251c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0690112 + }, + "COUNTERS:oid:0x5c000000002176": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1277" + }, + "ttl": -0.001, + "expireat": 1651808848.0690265 + }, + "COUNTERS:oid:0x5c000000001585": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.06906 + }, + "COUNTERS:oid:0x5c00000000265f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.069077 + }, + "COUNTERS:oid:0x5c0000000014c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0690897 + }, + "COUNTERS:oid:0x5c0000000025fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0691056 + }, + "COUNTERS:oid:0x5c000000001b54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0691178 + }, + "COUNTERS:oid:0x5c000000001a1e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.069133 + }, + "COUNTERS:oid:0x5c000000002402": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0691488 + }, + "COUNTERS:oid:0x5c0000000023e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0691643 + }, + "COUNTERS:oid:0x5c000000001836": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "274", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0691803 + }, + "COUNTERS:oid:0x5c0000000018ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "278", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0692127 + }, + "COUNTERS:oid:0x5c000000001387": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1312" + }, + "ttl": -0.001, + "expireat": 1651808848.0692258 + }, + "COUNTERS:oid:0x5c000000001379": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0692382 + }, + "COUNTERS:oid:0x5c0000000024f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311" + }, + "ttl": -0.001, + "expireat": 1651808848.0692544 + }, + "COUNTERS:oid:0x5c0000000018fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.069283 + }, + "COUNTERS:oid:0x5c000000001495": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.069295 + }, + "COUNTERS:oid:0x5c0000000016d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.069339 + }, + "COUNTERS:oid:0x5c000000001472": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0693676 + }, + "COUNTERS:oid:0x5c0000000013a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0694473 + }, + "COUNTERS:oid:0x5c00000000149c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0694673 + }, + "COUNTERS:oid:0x5c0000000017de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0694997 + }, + "COUNTERS:oid:0x5c00000000215b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0695152 + }, + "COUNTERS:oid:0x5c00000000230d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.069531 + }, + "COUNTERS:oid:0x5c000000001604": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0695431 + }, + "COUNTERS:oid:0x5c000000002448": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0695589 + }, + "COUNTERS:oid:0x5c0000000027ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4401", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0695744 + }, + "COUNTERS:oid:0x5c0000000019d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0695899 + }, + "COUNTERS:oid:0x5c00000000171d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0696025 + }, + "COUNTERS:oid:0x5c000000001696": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0696142 + }, + "COUNTERS:oid:0x5c000000001874": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "391" + }, + "ttl": -0.001, + "expireat": 1651808848.069626 + }, + "COUNTERS:oid:0x5c000000001b72": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0696404 + }, + "COUNTERS:oid:0x5c000000001fb2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.069653 + }, + "COUNTERS:oid:0x5c000000001d10": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.069668 + }, + "COUNTERS:oid:0x5c000000001740": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0696836 + }, + "COUNTERS:oid:0x5c000000002503": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0696986 + }, + "COUNTERS:oid:0x5c000000001a20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "310" + }, + "ttl": -0.001, + "expireat": 1651808848.0697577 + }, + "COUNTERS:oid:0x5c000000001df0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0697773 + }, + "COUNTERS:oid:0x5c0000000018df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.06979 + }, + "COUNTERS:oid:0x5c00000000147a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1246", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0698018 + }, + "COUNTERS:oid:0x5c000000002424": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "134" + }, + "ttl": -0.001, + "expireat": 1651808848.069817 + }, + "COUNTERS:oid:0x5c000000001ffc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0698333 + }, + "COUNTERS:oid:0x5c000000001c4a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0698454 + }, + "COUNTERS:oid:0x5c00000000160f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0698607 + }, + "COUNTERS:oid:0x5c000000001ae8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0698755 + }, + "COUNTERS:oid:0x5c000000001ab5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0698905 + }, + "COUNTERS:oid:0x5c000000001ed0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.069903 + }, + "COUNTERS:oid:0x5c000000001731": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0699148 + }, + "COUNTERS:oid:0x5c0000000025ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0699265 + }, + "COUNTERS:oid:0x5c0000000014f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "8", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0699422 + }, + "COUNTERS:oid:0x5c000000001799": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0699544 + }, + "COUNTERS:oid:0x5c000000001a76": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0699658 + }, + "COUNTERS:oid:0x5c0000000014a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0699809 + }, + "COUNTERS:oid:0x5c0000000014af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0699933 + }, + "COUNTERS:oid:0x5c00000000137f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1381", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070005 + }, + "COUNTERS:oid:0x5c000000001f11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0700202 + }, + "COUNTERS:oid:0x5c000000001663": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.070079 + }, + "COUNTERS:oid:0x5c000000001884": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0700982 + }, + "COUNTERS:oid:0x5c000000001aaa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0701141 + }, + "COUNTERS:oid:0x5c000000001628": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0701263 + }, + "COUNTERS:oid:0x5c00000000166e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.070138 + }, + "COUNTERS:oid:0x5c000000001c92": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.07015 + }, + "COUNTERS:oid:0x5c0000000015a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0701652 + }, + "COUNTERS:oid:0x5c000000002307": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "47" + }, + "ttl": -0.001, + "expireat": 1651808848.0701807 + }, + "COUNTERS:oid:0x5c000000001dd0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "457", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0701928 + }, + "COUNTERS:oid:0x5c000000001a51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0702085 + }, + "COUNTERS:oid:0x5c000000002201": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070221 + }, + "COUNTERS:oid:0x5c000000001e8b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070236 + }, + "COUNTERS:oid:0x5c0000000021f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0702477 + }, + "COUNTERS:oid:0x5c000000002146": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0702598 + }, + "COUNTERS:oid:0x5c000000001424": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.070271 + }, + "COUNTERS:oid:0x5c0000000025cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0702863 + }, + "COUNTERS:oid:0x5c0000000018d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0703201 + }, + "COUNTERS:oid:0x5c00000000260f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0703359 + }, + "COUNTERS:oid:0x5c0000000015d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0703514 + }, + "COUNTERS:oid:0x5c000000001d72": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0704012 + }, + "COUNTERS:oid:0x5c0000000025cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0704203 + }, + "COUNTERS:oid:0x5c000000001ba1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070437 + }, + "COUNTERS:oid:0x5c000000002314": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "467", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070449 + }, + "COUNTERS:oid:0x5c000000001ef4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0704646 + }, + "COUNTERS:oid:0x5c0000000025cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0704803 + }, + "COUNTERS:oid:0x5c0000000025aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0704966 + }, + "COUNTERS:oid:0x5c000000001e0f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0705094 + }, + "COUNTERS:oid:0x5c0000000018b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0705242 + }, + "COUNTERS:oid:0x5c0000000025ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07054 + }, + "COUNTERS:oid:0x5c000000002593": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0705528 + }, + "COUNTERS:oid:0x5c0000000019f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0705688 + }, + "COUNTERS:oid:0x5c000000001868": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.070581 + }, + "COUNTERS:oid:0x5c0000000013a0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "311", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0705967 + }, + "COUNTERS:oid:0x5c000000001fe1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1227", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070625 + }, + "COUNTERS:oid:0x5c000000002396": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "208" + }, + "ttl": -0.001, + "expireat": 1651808848.0706403 + }, + "COUNTERS:oid:0x5c0000000017fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0706522 + }, + "COUNTERS:oid:0x5c000000001760": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0706673 + }, + "COUNTERS:oid:0x5c000000001583": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1080", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0707185 + }, + "COUNTERS:oid:0x5c000000001745": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.070734 + }, + "COUNTERS:oid:0x5c0000000013fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "309" + }, + "ttl": -0.001, + "expireat": 1651808848.0707495 + }, + "COUNTERS:oid:0x5c000000001ee8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "273" + }, + "ttl": -0.001, + "expireat": 1651808848.0707655 + }, + "COUNTERS:oid:0x5c000000001b4b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.070781 + }, + "COUNTERS:oid:0x5c000000001961": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0707936 + }, + "COUNTERS:oid:0x5c000000002543": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.070809 + }, + "COUNTERS:oid:0x5c000000002129": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0708241 + }, + "COUNTERS:oid:0x5c00000000262c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0708365 + }, + "COUNTERS:oid:0x5c000000002099": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1403" + }, + "ttl": -0.001, + "expireat": 1651808848.070852 + }, + "COUNTERS:oid:0x5c00000000166f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0708673 + }, + "COUNTERS:oid:0x5c00000000156b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "93" + }, + "ttl": -0.001, + "expireat": 1651808848.0708826 + }, + "COUNTERS:oid:0x5c0000000013ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0708978 + }, + "COUNTERS:oid:0x5c0000000017d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0709102 + }, + "COUNTERS:oid:0x5c000000001815": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0709217 + }, + "COUNTERS:oid:0x5c0000000023ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0709333 + }, + "COUNTERS:oid:0x5c000000001798": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.070948 + }, + "COUNTERS:oid:0x5c000000002528": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0709598 + }, + "COUNTERS:oid:0x5c00000000211a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0710185 + }, + "COUNTERS:oid:0x5c000000001627": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0710385 + }, + "COUNTERS:oid:0x5c000000002000": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1509" + }, + "ttl": -0.001, + "expireat": 1651808848.0710545 + }, + "COUNTERS:oid:0x5c000000001950": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0710669 + }, + "COUNTERS:oid:0x5c00000000141b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0710814 + }, + "COUNTERS:oid:0x5c000000001ff4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "562" + }, + "ttl": -0.001, + "expireat": 1651808848.0710967 + }, + "COUNTERS:oid:0x5c0000000013af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0711086 + }, + "COUNTERS:oid:0x5c000000002115": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.071124 + }, + "COUNTERS:oid:0x5c000000001d82": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0711358 + }, + "COUNTERS:oid:0x5c00000000161f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0711505 + }, + "COUNTERS:oid:0x5c000000001402": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0711656 + }, + "COUNTERS:oid:0x5c000000001bed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "100", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0711808 + }, + "COUNTERS:oid:0x5c000000002282": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.0711956 + }, + "COUNTERS:oid:0x5c000000001c73": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1364" + }, + "ttl": -0.001, + "expireat": 1651808848.0712078 + }, + "COUNTERS:oid:0x5c0000000025d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0712228 + }, + "COUNTERS:oid:0x5c0000000015dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0720153 + }, + "COUNTERS:oid:0x5c000000002096": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0720346 + }, + "COUNTERS:oid:0x5c0000000021c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "151" + }, + "ttl": -0.001, + "expireat": 1651808848.0720642 + }, + "COUNTERS:oid:0x5c000000001a0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "442" + }, + "ttl": -0.001, + "expireat": 1651808848.0721555 + }, + "COUNTERS:oid:0x5c000000002441": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1287", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0721714 + }, + "COUNTERS:oid:0x5c000000001da4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0721886 + }, + "COUNTERS:oid:0x5c0000000014a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0722024 + }, + "COUNTERS:oid:0x5c000000002479": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1299", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0722148 + }, + "COUNTERS:oid:0x5c000000001d45": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0722306 + }, + "COUNTERS:oid:0x5c000000001be2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0722435 + }, + "COUNTERS:oid:0x5c000000001795": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0722556 + }, + "COUNTERS:oid:0x5c0000000015a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "152", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.072267 + }, + "COUNTERS:oid:0x5c000000001f02": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "195", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0722826 + }, + "COUNTERS:oid:0x5c000000001ee7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.072295 + }, + "COUNTERS:oid:0x5c000000002652": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0723069 + }, + "COUNTERS:oid:0x5c0000000020d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0723188 + }, + "COUNTERS:oid:0x5c000000001acf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0723336 + }, + "COUNTERS:oid:0x5c000000001e62": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0723488 + }, + "COUNTERS:oid:0x5c00000000141c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0723608 + }, + "COUNTERS:oid:0x5c0000000020cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0723763 + }, + "COUNTERS:oid:0x5c0000000015d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0723925 + }, + "COUNTERS:oid:0x5c00000000211b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0724044 + }, + "COUNTERS:oid:0x5c000000001468": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0724165 + }, + "COUNTERS:oid:0x5c000000001e11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105" + }, + "ttl": -0.001, + "expireat": 1651808848.072428 + }, + "COUNTERS:oid:0x5c000000002169": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073023 + }, + "COUNTERS:oid:0x5c000000001c29": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0730498 + }, + "COUNTERS:oid:0x5c0000000014b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0730648 + }, + "COUNTERS:oid:0x5c000000001e1b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "393", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0731122 + }, + "COUNTERS:oid:0x5c000000002664": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0731251 + }, + "COUNTERS:oid:0x5c0000000019e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107" + }, + "ttl": -0.001, + "expireat": 1651808848.0731416 + }, + "COUNTERS:oid:0x5c000000001dcd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0731575 + }, + "COUNTERS:oid:0x5c000000002283": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "457" + }, + "ttl": -0.001, + "expireat": 1651808848.0731704 + }, + "COUNTERS:oid:0x5c000000001b4e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0731828 + }, + "COUNTERS:oid:0x5c00000000211c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.073195 + }, + "COUNTERS:oid:0x5c0000000016ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105" + }, + "ttl": -0.001, + "expireat": 1651808848.073207 + }, + "COUNTERS:oid:0x5c000000001bfe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0732222 + }, + "COUNTERS:oid:0x5c0000000026f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9" + }, + "ttl": -0.001, + "expireat": 1651808848.073235 + }, + "COUNTERS:oid:0x5c000000002582": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0732472 + }, + "COUNTERS:oid:0x5c000000001b56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0732594 + }, + "COUNTERS:oid:0x5c00000000261a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0732715 + }, + "COUNTERS:oid:0x5c0000000027f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0732915 + }, + "COUNTERS:oid:0x5c000000001bb8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "315", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073324 + }, + "COUNTERS:oid:0x5c0000000013fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0733397 + }, + "COUNTERS:oid:0x5c00000000146a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073355 + }, + "COUNTERS:oid:0x5c000000001fea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0733938 + }, + "COUNTERS:oid:0x5c000000001587": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.073413 + }, + "COUNTERS:oid:0x5c0000000020c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0734293 + }, + "COUNTERS:oid:0x5c000000001538": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192" + }, + "ttl": -0.001, + "expireat": 1651808848.0734415 + }, + "COUNTERS:oid:0x5c000000001d4a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0734568 + }, + "COUNTERS:oid:0x5c0000000020eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0734725 + }, + "COUNTERS:oid:0x5c00000000167a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "233", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0734847 + }, + "COUNTERS:oid:0x5c000000001943": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0734997 + }, + "COUNTERS:oid:0x5c000000001643": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073515 + }, + "COUNTERS:oid:0x5c000000001cbc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "263", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073531 + }, + "COUNTERS:oid:0x5c000000001442": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "313" + }, + "ttl": -0.001, + "expireat": 1651808848.0735462 + }, + "COUNTERS:oid:0x5c000000001838": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0735967 + }, + "COUNTERS:oid:0x5c000000002660": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1269", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0736098 + }, + "COUNTERS:oid:0x5c000000001fcd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "101" + }, + "ttl": -0.001, + "expireat": 1651808848.0736399 + }, + "COUNTERS:oid:0x5c000000002780": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "72" + }, + "ttl": -0.001, + "expireat": 1651808848.073653 + }, + "COUNTERS:oid:0x5c0000000023d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0736694 + }, + "COUNTERS:oid:0x5c000000001ef5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.073683 + }, + "COUNTERS:oid:0x5c000000002573": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0736992 + }, + "COUNTERS:oid:0x5c0000000016aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1270" + }, + "ttl": -0.001, + "expireat": 1651808848.073733 + }, + "COUNTERS:oid:0x5c00000000209c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0737486 + }, + "COUNTERS:oid:0x5c000000002575": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0737653 + }, + "COUNTERS:oid:0x5c000000001b52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0737798 + }, + "COUNTERS:oid:0x5c000000001794": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.073797 + }, + "COUNTERS:oid:0x5c0000000017b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0738106 + }, + "COUNTERS:oid:0x5c000000002420": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0738273 + }, + "COUNTERS:oid:0x5c00000000145e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.073845 + }, + "COUNTERS:oid:0x5c000000001e4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0738757 + }, + "COUNTERS:oid:0x5c0000000015db": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.073893 + }, + "COUNTERS:oid:0x5c000000001630": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0739067 + }, + "COUNTERS:oid:0x5c000000001af5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "194", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07392 + }, + "COUNTERS:oid:0x5c000000001e28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1318" + }, + "ttl": -0.001, + "expireat": 1651808848.0739334 + }, + "COUNTERS:oid:0x5c0000000026ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0739663 + }, + "COUNTERS:oid:0x5c000000001e13": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.07398 + }, + "COUNTERS:oid:0x5c000000001a27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141" + }, + "ttl": -0.001, + "expireat": 1651808848.0739927 + }, + "COUNTERS:oid:0x5c000000001991": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0740092 + }, + "COUNTERS:oid:0x5c000000001949": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0740263 + }, + "COUNTERS:oid:0x5c000000002113": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0740395 + }, + "COUNTERS:oid:0x5c000000001a95": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.074053 + }, + "COUNTERS:oid:0x5c00000000209f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0740862 + }, + "COUNTERS:oid:0x5c00000000256f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07417 + }, + "COUNTERS:oid:0x5c000000001bf8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0741875 + }, + "COUNTERS:oid:0x5c000000001e7c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0742004 + }, + "COUNTERS:oid:0x5c0000000016fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0742316 + }, + "COUNTERS:oid:0x5c00000000253e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1261", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0742443 + }, + "COUNTERS:oid:0x5c0000000016cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07426 + }, + "COUNTERS:oid:0x5c000000001cf1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "109", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0742755 + }, + "COUNTERS:oid:0x5c000000001fda": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0742915 + }, + "COUNTERS:oid:0x5c000000001ae5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0743039 + }, + "COUNTERS:oid:0x5c000000001870": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.074316 + }, + "COUNTERS:oid:0x5c000000001567": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "308" + }, + "ttl": -0.001, + "expireat": 1651808848.0743308 + }, + "COUNTERS:oid:0x5c000000002663": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0743463 + }, + "COUNTERS:oid:0x5c00000000266e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0743585 + }, + "COUNTERS:oid:0x5c000000001425": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0743704 + }, + "COUNTERS:oid:0x5c0000000026f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "7" + }, + "ttl": -0.001, + "expireat": 1651808848.0743854 + }, + "COUNTERS:oid:0x5c0000000015b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147" + }, + "ttl": -0.001, + "expireat": 1651808848.074398 + }, + "COUNTERS:oid:0x5c0000000019c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0744102 + }, + "COUNTERS:oid:0x5c000000002482": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0744221 + }, + "COUNTERS:oid:0x5c0000000016ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0744371 + }, + "COUNTERS:oid:0x5c0000000025bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0744524 + }, + "COUNTERS:oid:0x5c00000000192f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0745275 + }, + "COUNTERS:oid:0x5c0000000016f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0745468 + }, + "COUNTERS:oid:0x5c000000001394": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0745635 + }, + "COUNTERS:oid:0x5c000000002187": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "10", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07458 + }, + "COUNTERS:oid:0x5c000000001e98": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0745962 + }, + "COUNTERS:oid:0x5c00000000211d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0746124 + }, + "COUNTERS:oid:0x5c000000001831": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0746245 + }, + "COUNTERS:oid:0x5c0000000020d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0746367 + }, + "COUNTERS:oid:0x5c000000001e77": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "149" + }, + "ttl": -0.001, + "expireat": 1651808848.0746524 + }, + "COUNTERS:oid:0x5c000000001a00": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0746653 + }, + "COUNTERS:oid:0x5c00000000213d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "267", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0746808 + }, + "COUNTERS:oid:0x5c00000000208c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.074694 + }, + "COUNTERS:oid:0x5c0000000020e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298" + }, + "ttl": -0.001, + "expireat": 1651808848.0747087 + }, + "COUNTERS:oid:0x5c000000001d0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0747247 + }, + "COUNTERS:oid:0x5c000000002183": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "158", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0747752 + }, + "COUNTERS:oid:0x5c0000000018d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0747886 + }, + "COUNTERS:oid:0x5c000000001734": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "130" + }, + "ttl": -0.001, + "expireat": 1651808848.0748057 + }, + "COUNTERS:oid:0x5c000000001d79": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0748227 + }, + "COUNTERS:oid:0x5c00000000263f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297" + }, + "ttl": -0.001, + "expireat": 1651808848.0748613 + }, + "COUNTERS:oid:0x5c000000002180": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0748773 + }, + "COUNTERS:oid:0x5c00000000242d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "142", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0748906 + }, + "COUNTERS:oid:0x5c00000000231a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "10" + }, + "ttl": -0.001, + "expireat": 1651808848.0749035 + }, + "COUNTERS:oid:0x5c000000002778": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0749164 + }, + "COUNTERS:oid:0x5c000000001374": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0749454 + }, + "COUNTERS:oid:0x5c000000001bbc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0749786 + }, + "COUNTERS:oid:0x5c000000002003": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0750086 + }, + "COUNTERS:oid:0x5c0000000017f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0750213 + }, + "COUNTERS:oid:0x5c000000001d0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0750341 + }, + "COUNTERS:oid:0x5c000000001947": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0750666 + }, + "COUNTERS:oid:0x5c000000001c56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0750792 + }, + "COUNTERS:oid:0x5c0000000020b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1002" + }, + "ttl": -0.001, + "expireat": 1651808848.0750945 + }, + "COUNTERS:oid:0x5c00000000183b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0751073 + }, + "COUNTERS:oid:0x5c000000001562": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0751197 + }, + "COUNTERS:oid:0x5c00000000214e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0751352 + }, + "COUNTERS:oid:0x5c000000001da7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0751483 + }, + "COUNTERS:oid:0x5c000000001a8a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0751638 + }, + "COUNTERS:oid:0x5c000000002340": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "52" + }, + "ttl": -0.001, + "expireat": 1651808848.0751762 + }, + "COUNTERS:oid:0x5c00000000208b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.075192 + }, + "COUNTERS:oid:0x5c000000001361": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0752075 + }, + "COUNTERS:oid:0x5c00000000172b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0753057 + }, + "COUNTERS:oid:0x5c000000001e6e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0753255 + }, + "COUNTERS:oid:0x5c00000000188c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0753424 + }, + "COUNTERS:oid:0x5c000000001886": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "115", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0753586 + }, + "COUNTERS:oid:0x5c000000001b1f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.075371 + }, + "COUNTERS:oid:0x5c000000001c71": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0753837 + }, + "COUNTERS:oid:0x5c000000001677": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0753994 + }, + "COUNTERS:oid:0x5c000000001ae2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0754156 + }, + "COUNTERS:oid:0x5c00000000146d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0754282 + }, + "COUNTERS:oid:0x5c00000000180c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0754437 + }, + "COUNTERS:oid:0x5c0000000017fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "162" + }, + "ttl": -0.001, + "expireat": 1651808848.0754604 + }, + "COUNTERS:oid:0x5c000000001ef6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0754764 + }, + "COUNTERS:oid:0x5c000000001ddd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1299" + }, + "ttl": -0.001, + "expireat": 1651808848.0754895 + }, + "COUNTERS:oid:0x5c000000001ad4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.075505 + }, + "COUNTERS:oid:0x5c0000000013d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0755208 + }, + "COUNTERS:oid:0x5c000000001e29": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.075537 + }, + "COUNTERS:oid:0x5c000000001427": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0755527 + }, + "COUNTERS:oid:0x5c00000000260e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.075612 + }, + "COUNTERS:oid:0x5c000000001b79": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0756278 + }, + "COUNTERS:oid:0x5c000000002770": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0756404 + }, + "COUNTERS:oid:0x5c0000000020a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1144" + }, + "ttl": -0.001, + "expireat": 1651808848.0756526 + }, + "COUNTERS:oid:0x5c000000001999": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0756683 + }, + "COUNTERS:oid:0x5c000000002422": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.075685 + }, + "COUNTERS:oid:0x5c000000001e38": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0756977 + }, + "COUNTERS:oid:0x5c000000001d99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "92" + }, + "ttl": -0.001, + "expireat": 1651808848.07571 + }, + "COUNTERS:oid:0x5c0000000013b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0757217 + }, + "COUNTERS:oid:0x5c00000000162a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0757337 + }, + "COUNTERS:oid:0x5c00000000245c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137" + }, + "ttl": -0.001, + "expireat": 1651808848.0757494 + }, + "COUNTERS:oid:0x5c0000000015cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "184", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0757623 + }, + "COUNTERS:oid:0x5c0000000020bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1504" + }, + "ttl": -0.001, + "expireat": 1651808848.0757775 + }, + "COUNTERS:oid:0x5c00000000136c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0757904 + }, + "COUNTERS:oid:0x5c000000001448": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0758057 + }, + "COUNTERS:oid:0x5c000000001850": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0758219 + }, + "COUNTERS:oid:0x5c000000002658": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.075835 + }, + "COUNTERS:oid:0x5c000000001db1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.075847 + }, + "COUNTERS:oid:0x5c0000000016a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0758626 + }, + "COUNTERS:oid:0x5c000000001e84": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.075875 + }, + "COUNTERS:oid:0x5c0000000017d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1319" + }, + "ttl": -0.001, + "expireat": 1651808848.0758874 + }, + "COUNTERS:oid:0x5c000000002638": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1275" + }, + "ttl": -0.001, + "expireat": 1651808848.075938 + }, + "COUNTERS:oid:0x5c0000000018a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1240" + }, + "ttl": -0.001, + "expireat": 1651808848.075953 + }, + "COUNTERS:oid:0x5c0000000014f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9" + }, + "ttl": -0.001, + "expireat": 1651808848.0759652 + }, + "COUNTERS:oid:0x5c00000000186f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0759811 + }, + "COUNTERS:oid:0x5c000000001ba3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.075998 + }, + "COUNTERS:oid:0x5c0000000025bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0760138 + }, + "COUNTERS:oid:0x5c0000000017f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1317" + }, + "ttl": -0.001, + "expireat": 1651808848.0760267 + }, + "COUNTERS:oid:0x5c000000001376": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298" + }, + "ttl": -0.001, + "expireat": 1651808848.0760424 + }, + "COUNTERS:oid:0x5c000000001d3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0760589 + }, + "COUNTERS:oid:0x5c00000000191b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "99" + }, + "ttl": -0.001, + "expireat": 1651808848.0760715 + }, + "COUNTERS:oid:0x5c000000001ef0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0760872 + }, + "COUNTERS:oid:0x5c00000000264a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0761003 + }, + "COUNTERS:oid:0x5c0000000020a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0761125 + }, + "COUNTERS:oid:0x5c000000001965": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0761244 + }, + "COUNTERS:oid:0x5c0000000022f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0761397 + }, + "COUNTERS:oid:0x5c0000000025ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0761554 + }, + "COUNTERS:oid:0x5c0000000015c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "238", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0761685 + }, + "COUNTERS:oid:0x5c0000000020c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0761805 + }, + "COUNTERS:oid:0x5c0000000019c3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "38" + }, + "ttl": -0.001, + "expireat": 1651808848.076196 + }, + "COUNTERS:oid:0x5c00000000179d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0762084 + }, + "COUNTERS:oid:0x5c0000000022f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "38", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.076269 + }, + "COUNTERS:oid:0x5c0000000027fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "616626" + }, + "ttl": -0.001, + "expireat": 1651808848.076285 + }, + "COUNTERS:oid:0x5c000000001c43": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196" + }, + "ttl": -0.001, + "expireat": 1651808848.0762978 + }, + "COUNTERS:oid:0x5c0000000014ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.07631 + }, + "COUNTERS:oid:0x5c000000002568": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0763223 + }, + "COUNTERS:oid:0x5c000000001bea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0763347 + }, + "COUNTERS:oid:0x5c000000002454": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "138", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07635 + }, + "COUNTERS:oid:0x5c000000001c79": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.0763626 + }, + "COUNTERS:oid:0x5c000000002410": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0763779 + }, + "COUNTERS:oid:0x5c000000002643": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.076394 + }, + "COUNTERS:oid:0x5c000000001372": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0764098 + }, + "COUNTERS:oid:0x5c000000002121": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0764258 + }, + "COUNTERS:oid:0x5c0000000014b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0764415 + }, + "COUNTERS:oid:0x5c000000002425": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0764542 + }, + "COUNTERS:oid:0x5c000000001ef9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "442", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.076466 + }, + "COUNTERS:oid:0x5c00000000257a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0764816 + }, + "COUNTERS:oid:0x5c000000001986": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0764937 + }, + "COUNTERS:oid:0x5c000000002469": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0765095 + }, + "COUNTERS:oid:0x5c00000000241d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0765219 + }, + "COUNTERS:oid:0x5c000000002102": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.076534 + }, + "COUNTERS:oid:0x5c00000000144e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25" + }, + "ttl": -0.001, + "expireat": 1651808848.0765867 + }, + "COUNTERS:oid:0x5c0000000020dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0766063 + }, + "COUNTERS:oid:0x5c000000001ca9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0766222 + }, + "COUNTERS:oid:0x5c000000001879": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0766382 + }, + "COUNTERS:oid:0x5c0000000017ea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0766544 + }, + "COUNTERS:oid:0x5c00000000160d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "59" + }, + "ttl": -0.001, + "expireat": 1651808848.0766702 + }, + "COUNTERS:oid:0x5c000000001f49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0766828 + }, + "COUNTERS:oid:0x5c000000001a44": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.076695 + }, + "COUNTERS:oid:0x5c000000001649": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0767105 + }, + "COUNTERS:oid:0x5c000000001b2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0767226 + }, + "COUNTERS:oid:0x5c0000000024e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0767379 + }, + "COUNTERS:oid:0x5c000000001e03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1311" + }, + "ttl": -0.001, + "expireat": 1651808848.0767503 + }, + "COUNTERS:oid:0x5c0000000016d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0767658 + }, + "COUNTERS:oid:0x5c000000001a86": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202" + }, + "ttl": -0.001, + "expireat": 1651808848.0767782 + }, + "COUNTERS:oid:0x5c00000000174e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0767937 + }, + "COUNTERS:oid:0x5c000000001430": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "339", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0768094 + }, + "COUNTERS:oid:0x5c000000001d37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0768254 + }, + "COUNTERS:oid:0x5c00000000162b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0768774 + }, + "COUNTERS:oid:0x5c000000001af4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0768967 + }, + "COUNTERS:oid:0x5c0000000016e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0769098 + }, + "COUNTERS:oid:0x5c0000000023fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0769258 + }, + "COUNTERS:oid:0x5c0000000014ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12078" + }, + "ttl": -0.001, + "expireat": 1651808848.0769382 + }, + "COUNTERS:oid:0x5c000000002322": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.076951 + }, + "COUNTERS:oid:0x5c000000001f3d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0769632 + }, + "COUNTERS:oid:0x5c000000002305": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.077011 + }, + "COUNTERS:oid:0x5c000000001b21": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0770247 + }, + "COUNTERS:oid:0x5c0000000023f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077041 + }, + "COUNTERS:oid:0x5c000000001460": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1307" + }, + "ttl": -0.001, + "expireat": 1651808848.0770538 + }, + "COUNTERS:oid:0x5c000000001926": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0770688 + }, + "COUNTERS:oid:0x5c000000001463": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12185" + }, + "ttl": -0.001, + "expireat": 1651808848.077085 + }, + "COUNTERS:oid:0x5c0000000013e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "315", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0771008 + }, + "COUNTERS:oid:0x5c0000000015c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0771136 + }, + "COUNTERS:oid:0x5c00000000186b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0771294 + }, + "COUNTERS:oid:0x5c0000000014be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11665", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0771456 + }, + "COUNTERS:oid:0x5c000000001720": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0771794 + }, + "COUNTERS:oid:0x5c000000002413": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0772316 + }, + "COUNTERS:oid:0x5c0000000013d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077267 + }, + "COUNTERS:oid:0x5c000000002431": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1271", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0772805 + }, + "COUNTERS:oid:0x5c000000001c51": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0772965 + }, + "COUNTERS:oid:0x5c000000001b88": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "184", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077313 + }, + "COUNTERS:oid:0x5c0000000017cd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0773256 + }, + "COUNTERS:oid:0x5c000000002329": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0773416 + }, + "COUNTERS:oid:0x5c000000001e7d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0773575 + }, + "COUNTERS:oid:0x5c0000000018bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0773735 + }, + "COUNTERS:oid:0x5c000000001cc0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0773895 + }, + "COUNTERS:oid:0x5c000000001953": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.077406 + }, + "COUNTERS:oid:0x5c00000000188d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0774188 + }, + "COUNTERS:oid:0x5c000000001b03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0774343 + }, + "COUNTERS:oid:0x5c00000000232e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0774472 + }, + "COUNTERS:oid:0x5c000000001a9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077463 + }, + "COUNTERS:oid:0x5c0000000014ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0774784 + }, + "COUNTERS:oid:0x5c0000000017c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "205" + }, + "ttl": -0.001, + "expireat": 1651808848.077491 + }, + "COUNTERS:oid:0x5c000000001c84": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "29" + }, + "ttl": -0.001, + "expireat": 1651808848.0775065 + }, + "COUNTERS:oid:0x5c0000000015bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0775585 + }, + "COUNTERS:oid:0x5c0000000022f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0775752 + }, + "COUNTERS:oid:0x5c000000001d8c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0775876 + }, + "COUNTERS:oid:0x5c0000000016fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1270" + }, + "ttl": -0.001, + "expireat": 1651808848.0776 + }, + "COUNTERS:oid:0x5c000000001efd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0776117 + }, + "COUNTERS:oid:0x5c0000000020a1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.077628 + }, + "COUNTERS:oid:0x5c00000000245a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0776443 + }, + "COUNTERS:oid:0x5c0000000020a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297" + }, + "ttl": -0.001, + "expireat": 1651808848.0776603 + }, + "COUNTERS:oid:0x5c0000000019b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "157" + }, + "ttl": -0.001, + "expireat": 1651808848.077673 + }, + "COUNTERS:oid:0x5c000000002317": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "39", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0776892 + }, + "COUNTERS:oid:0x5c00000000252d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0777051 + }, + "COUNTERS:oid:0x5c000000001e3c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.077718 + }, + "COUNTERS:oid:0x5c000000001626": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "155" + }, + "ttl": -0.001, + "expireat": 1651808848.0777304 + }, + "COUNTERS:oid:0x5c00000000192a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0777462 + }, + "COUNTERS:oid:0x5c0000000013a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0777793 + }, + "COUNTERS:oid:0x5c0000000017b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.0777943 + }, + "COUNTERS:oid:0x5c0000000019aa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1255" + }, + "ttl": -0.001, + "expireat": 1651808848.0778062 + }, + "COUNTERS:oid:0x5c000000001aa7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0778186 + }, + "COUNTERS:oid:0x5c000000002098": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.07783 + }, + "COUNTERS:oid:0x5c000000001f38": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "150", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077845 + }, + "COUNTERS:oid:0x5c000000001be7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077896 + }, + "COUNTERS:oid:0x5c0000000023cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0779152 + }, + "COUNTERS:oid:0x5c0000000013a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0779278 + }, + "COUNTERS:oid:0x5c000000001aeb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "403" + }, + "ttl": -0.001, + "expireat": 1651808848.0779397 + }, + "COUNTERS:oid:0x5c0000000018ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0779514 + }, + "COUNTERS:oid:0x5c0000000020f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0779667 + }, + "COUNTERS:oid:0x5c000000001a85": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198" + }, + "ttl": -0.001, + "expireat": 1651808848.0779824 + }, + "COUNTERS:oid:0x5c0000000023e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.077998 + }, + "COUNTERS:oid:0x5c0000000016ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "133" + }, + "ttl": -0.001, + "expireat": 1651808848.0780098 + }, + "COUNTERS:oid:0x5c00000000185e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0780215 + }, + "COUNTERS:oid:0x5c00000000146b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0780332 + }, + "COUNTERS:oid:0x5c000000001571": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0780485 + }, + "COUNTERS:oid:0x5c000000002600": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1297", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0780606 + }, + "COUNTERS:oid:0x5c000000001ac4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0780723 + }, + "COUNTERS:oid:0x5c000000001b6f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1303" + }, + "ttl": -0.001, + "expireat": 1651808848.0780845 + }, + "COUNTERS:oid:0x5c0000000016df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0781167 + }, + "COUNTERS:oid:0x5c000000001bb0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0781507 + }, + "COUNTERS:oid:0x5c0000000017c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0781639 + }, + "COUNTERS:oid:0x5c000000001e5a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.078198 + }, + "COUNTERS:oid:0x5c00000000159c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0782113 + }, + "COUNTERS:oid:0x5c00000000257b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.078304 + }, + "COUNTERS:oid:0x5c0000000014da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0783243 + }, + "COUNTERS:oid:0x5c0000000025fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0783386 + }, + "COUNTERS:oid:0x5c000000001a8d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.078352 + }, + "COUNTERS:oid:0x5c000000001779": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "25", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0783646 + }, + "COUNTERS:oid:0x5c000000001cef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.078381 + }, + "COUNTERS:oid:0x5c000000001719": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0783944 + }, + "COUNTERS:oid:0x5c00000000246d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0784068 + }, + "COUNTERS:oid:0x5c000000001c95": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "94" + }, + "ttl": -0.001, + "expireat": 1651808848.078423 + }, + "COUNTERS:oid:0x5c0000000020f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0784364 + }, + "COUNTERS:oid:0x5c0000000027fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4947", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0784528 + }, + "COUNTERS:oid:0x5c000000001a1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.078466 + }, + "COUNTERS:oid:0x5c000000002519": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "169" + }, + "ttl": -0.001, + "expireat": 1651808848.078498 + }, + "COUNTERS:oid:0x5c0000000021f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1511", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0785265 + }, + "COUNTERS:oid:0x5c0000000021da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.078542 + }, + "COUNTERS:oid:0x5c0000000025b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1264", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0785546 + }, + "COUNTERS:oid:0x5c000000001cbf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0785666 + }, + "COUNTERS:oid:0x5c00000000196f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0785787 + }, + "COUNTERS:oid:0x5c00000000175f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1253" + }, + "ttl": -0.001, + "expireat": 1651808848.0785906 + }, + "COUNTERS:oid:0x5c000000002132": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0786026 + }, + "COUNTERS:oid:0x5c00000000209b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0786338 + }, + "COUNTERS:oid:0x5c00000000171a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0787086 + }, + "COUNTERS:oid:0x5c00000000176e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0787296 + }, + "COUNTERS:oid:0x5c0000000013d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "169" + }, + "ttl": -0.001, + "expireat": 1651808848.0787427 + }, + "COUNTERS:oid:0x5c000000002537": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0787587 + }, + "COUNTERS:oid:0x5c000000001ab3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0787742 + }, + "COUNTERS:oid:0x5c000000001dd6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0787873 + }, + "COUNTERS:oid:0x5c000000001c19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0788026 + }, + "COUNTERS:oid:0x5c000000002270": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0788183 + }, + "COUNTERS:oid:0x5c00000000234f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0788345 + }, + "COUNTERS:oid:0x5c000000001a08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.078847 + }, + "COUNTERS:oid:0x5c000000002409": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1260", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0788596 + }, + "COUNTERS:oid:0x5c000000001c5f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "28" + }, + "ttl": -0.001, + "expireat": 1651808848.0788746 + }, + "COUNTERS:oid:0x5c00000000144d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.078887 + }, + "COUNTERS:oid:0x5c00000000251b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.078902 + }, + "COUNTERS:oid:0x5c000000002527": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0789187 + }, + "COUNTERS:oid:0x5c000000001c16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.078931 + }, + "COUNTERS:oid:0x5c000000001aa0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0789468 + }, + "COUNTERS:oid:0x5c000000001975": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0789592 + }, + "COUNTERS:oid:0x5c0000000024ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.079019 + }, + "COUNTERS:oid:0x5c0000000019f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0790384 + }, + "COUNTERS:oid:0x5c000000002489": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.079055 + }, + "COUNTERS:oid:0x5c00000000264e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0790677 + }, + "COUNTERS:oid:0x5c0000000019be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.07908 + }, + "COUNTERS:oid:0x5c000000001841": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0790925 + }, + "COUNTERS:oid:0x5c0000000022fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "470", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0791044 + }, + "COUNTERS:oid:0x5c000000001616": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.079117 + }, + "COUNTERS:oid:0x5c000000001675": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.079129 + }, + "COUNTERS:oid:0x5c000000001e5f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0791411 + }, + "COUNTERS:oid:0x5c000000001360": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0791526 + }, + "COUNTERS:oid:0x5c000000001a7d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31" + }, + "ttl": -0.001, + "expireat": 1651808848.0791678 + }, + "COUNTERS:oid:0x5c000000002661": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0791843 + }, + "COUNTERS:oid:0x5c000000002082": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1412" + }, + "ttl": -0.001, + "expireat": 1651808848.079197 + }, + "COUNTERS:oid:0x5c000000002316": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0792089 + }, + "COUNTERS:oid:0x5c000000001e2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.079221 + }, + "COUNTERS:oid:0x5c000000002506": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1272", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0792966 + }, + "COUNTERS:oid:0x5c00000000134a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "158" + }, + "ttl": -0.001, + "expireat": 1651808848.0793111 + }, + "COUNTERS:oid:0x5c0000000014c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0793452 + }, + "COUNTERS:oid:0x5c00000000193c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0793588 + }, + "COUNTERS:oid:0x5c000000001915": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1294" + }, + "ttl": -0.001, + "expireat": 1651808848.079371 + }, + "COUNTERS:oid:0x5c000000001655": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "64", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0793877 + }, + "COUNTERS:oid:0x5c000000001cb5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305" + }, + "ttl": -0.001, + "expireat": 1651808848.07945 + }, + "COUNTERS:oid:0x5c000000001ea7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0794656 + }, + "COUNTERS:oid:0x5c000000001e59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0794783 + }, + "COUNTERS:oid:0x5c000000002587": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0794945 + }, + "COUNTERS:oid:0x5c00000000257d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.079512 + }, + "COUNTERS:oid:0x5c000000001b37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0795248 + }, + "COUNTERS:oid:0x5c0000000018e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0795376 + }, + "COUNTERS:oid:0x5c000000002633": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.079569 + }, + "COUNTERS:oid:0x5c0000000019fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "278", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0795848 + }, + "COUNTERS:oid:0x5c000000001990": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0795972 + }, + "COUNTERS:oid:0x5c00000000185d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0796125 + }, + "COUNTERS:oid:0x5c000000001abf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0796292 + }, + "COUNTERS:oid:0x5c00000000242e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0796452 + }, + "COUNTERS:oid:0x5c00000000160e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "205" + }, + "ttl": -0.001, + "expireat": 1651808848.0796578 + }, + "COUNTERS:oid:0x5c0000000023c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1492" + }, + "ttl": -0.001, + "expireat": 1651808848.0796697 + }, + "COUNTERS:oid:0x5c000000002116": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1218" + }, + "ttl": -0.001, + "expireat": 1651808848.0796816 + }, + "COUNTERS:oid:0x5c000000001b2f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0796933 + }, + "COUNTERS:oid:0x5c000000001e3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0797057 + }, + "COUNTERS:oid:0x5c000000001d3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0797174 + }, + "COUNTERS:oid:0x5c0000000019d5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0797286 + }, + "COUNTERS:oid:0x5c000000001847": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0797403 + }, + "COUNTERS:oid:0x5c000000002476": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0798004 + }, + "COUNTERS:oid:0x5c000000001597": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "246" + }, + "ttl": -0.001, + "expireat": 1651808848.0798202 + }, + "COUNTERS:oid:0x5c00000000154b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0798366 + }, + "COUNTERS:oid:0x5c000000001d6d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "272", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0798523 + }, + "COUNTERS:oid:0x5c0000000016b9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0798683 + }, + "COUNTERS:oid:0x5c0000000025e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0798845 + }, + "COUNTERS:oid:0x5c0000000015bc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.079897 + }, + "COUNTERS:oid:0x5c000000001858": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "198", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799124 + }, + "COUNTERS:oid:0x5c000000001623": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799282 + }, + "COUNTERS:oid:0x5c000000002764": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "208" + }, + "ttl": -0.001, + "expireat": 1651808848.0799403 + }, + "COUNTERS:oid:0x5c0000000025d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799563 + }, + "COUNTERS:oid:0x5c0000000023f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1282", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799694 + }, + "COUNTERS:oid:0x5c00000000276e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799813 + }, + "COUNTERS:oid:0x5c00000000264d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0799968 + }, + "COUNTERS:oid:0x5c000000002601": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0800126 + }, + "COUNTERS:oid:0x5c00000000215f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.080029 + }, + "COUNTERS:oid:0x5c0000000020b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "504" + }, + "ttl": -0.001, + "expireat": 1651808848.0800412 + }, + "COUNTERS:oid:0x5c000000001d09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.080091 + }, + "COUNTERS:oid:0x5c000000001aea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0801098 + }, + "COUNTERS:oid:0x5c000000001eb3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0801232 + }, + "COUNTERS:oid:0x5c000000002468": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302" + }, + "ttl": -0.001, + "expireat": 1651808848.0801392 + }, + "COUNTERS:oid:0x5c000000001410": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "21" + }, + "ttl": -0.001, + "expireat": 1651808848.0801556 + }, + "COUNTERS:oid:0x5c00000000264f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0801713 + }, + "COUNTERS:oid:0x5c000000001da5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0801835 + }, + "COUNTERS:oid:0x5c000000002559": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0801995 + }, + "COUNTERS:oid:0x5c0000000020c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0802162 + }, + "COUNTERS:oid:0x5c000000002091": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1169" + }, + "ttl": -0.001, + "expireat": 1651808848.0802321 + }, + "COUNTERS:oid:0x5c00000000196a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0802479 + }, + "COUNTERS:oid:0x5c000000001826": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0802639 + }, + "COUNTERS:oid:0x5c0000000013a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0802798 + }, + "COUNTERS:oid:0x5c000000002578": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0802925 + }, + "COUNTERS:oid:0x5c000000001e0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.080308 + }, + "COUNTERS:oid:0x5c000000001d2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "126" + }, + "ttl": -0.001, + "expireat": 1651808848.0803206 + }, + "COUNTERS:oid:0x5c000000001945": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0803375 + }, + "COUNTERS:oid:0x5c000000002523": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0803974 + }, + "COUNTERS:oid:0x5c000000002542": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "164" + }, + "ttl": -0.001, + "expireat": 1651808848.0804317 + }, + "COUNTERS:oid:0x5c000000001a58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0804663 + }, + "COUNTERS:oid:0x5c00000000266c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "142" + }, + "ttl": -0.001, + "expireat": 1651808848.0804799 + }, + "COUNTERS:oid:0x5c000000001407": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0804927 + }, + "COUNTERS:oid:0x5c000000001579": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0805094 + }, + "COUNTERS:oid:0x5c000000001da0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0805264 + }, + "COUNTERS:oid:0x5c000000001bce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0805433 + }, + "COUNTERS:oid:0x5c00000000242f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0805564 + }, + "COUNTERS:oid:0x5c000000001939": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295" + }, + "ttl": -0.001, + "expireat": 1651808848.0805728 + }, + "COUNTERS:oid:0x5c000000001971": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.080586 + }, + "COUNTERS:oid:0x5c000000002143": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0805986 + }, + "COUNTERS:oid:0x5c0000000018e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "417", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0806112 + }, + "COUNTERS:oid:0x5c000000001722": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.080624 + }, + "COUNTERS:oid:0x5c000000001603": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.080656 + }, + "COUNTERS:oid:0x5c0000000020d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1857" + }, + "ttl": -0.001, + "expireat": 1651808848.0806694 + }, + "COUNTERS:oid:0x5c000000001ffd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "95", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0806818 + }, + "COUNTERS:oid:0x5c000000002407": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "148" + }, + "ttl": -0.001, + "expireat": 1651808848.080694 + }, + "COUNTERS:oid:0x5c00000000161e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "91" + }, + "ttl": -0.001, + "expireat": 1651808848.0807064 + }, + "COUNTERS:oid:0x5c000000001e5b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.080719 + }, + "COUNTERS:oid:0x5c00000000262b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0807347 + }, + "COUNTERS:oid:0x5c000000001b0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0807853 + }, + "COUNTERS:oid:0x5c000000001fee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0808046 + }, + "COUNTERS:oid:0x5c00000000251e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1266" + }, + "ttl": -0.001, + "expireat": 1651808848.0808182 + }, + "COUNTERS:oid:0x5c000000002534": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.080831 + }, + "COUNTERS:oid:0x5c000000001436": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.080847 + }, + "COUNTERS:oid:0x5c000000001c99": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0808637 + }, + "COUNTERS:oid:0x5c0000000019b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "310" + }, + "ttl": -0.001, + "expireat": 1651808848.0808806 + }, + "COUNTERS:oid:0x5c0000000025c2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.080894 + }, + "COUNTERS:oid:0x5c0000000013f7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0809107 + }, + "COUNTERS:oid:0x5c00000000166c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0809271 + }, + "COUNTERS:oid:0x5c000000001ff9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2019" + }, + "ttl": -0.001, + "expireat": 1651808848.0809402 + }, + "COUNTERS:oid:0x5c000000002602": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0809526 + }, + "COUNTERS:oid:0x5c00000000214d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "254" + }, + "ttl": -0.001, + "expireat": 1651808848.0809956 + }, + "COUNTERS:oid:0x5c000000001902": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0810132 + }, + "COUNTERS:oid:0x5c00000000230e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.0810258 + }, + "COUNTERS:oid:0x5c000000001441": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.081038 + }, + "COUNTERS:oid:0x5c000000001ce5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0810537 + }, + "COUNTERS:oid:0x5c000000001454": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "337" + }, + "ttl": -0.001, + "expireat": 1651808848.0810704 + }, + "COUNTERS:oid:0x5c000000001c46": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1340" + }, + "ttl": -0.001, + "expireat": 1651808848.0810833 + }, + "COUNTERS:oid:0x5c000000001f2e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0810995 + }, + "COUNTERS:oid:0x5c000000001866": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0811517 + }, + "COUNTERS:oid:0x5c0000000023e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1306", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0811675 + }, + "COUNTERS:oid:0x5c0000000018d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154" + }, + "ttl": -0.001, + "expireat": 1651808848.0811837 + }, + "COUNTERS:oid:0x5c000000001ebd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0812013 + }, + "COUNTERS:oid:0x5c000000001e64": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "108", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0812182 + }, + "COUNTERS:oid:0x5c000000001f10": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0812309 + }, + "COUNTERS:oid:0x5c000000001dc6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "99" + }, + "ttl": -0.001, + "expireat": 1651808848.0812435 + }, + "COUNTERS:oid:0x5c000000001e08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.081259 + }, + "COUNTERS:oid:0x5c000000001dc3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0812752 + }, + "COUNTERS:oid:0x5c0000000020b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0812912 + }, + "COUNTERS:oid:0x5c000000001382": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0813074 + }, + "COUNTERS:oid:0x5c000000002356": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4" + }, + "ttl": -0.001, + "expireat": 1651808848.0813203 + }, + "COUNTERS:oid:0x5c000000001bfa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "270" + }, + "ttl": -0.001, + "expireat": 1651808848.081336 + }, + "COUNTERS:oid:0x5c000000001378": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0813522 + }, + "COUNTERS:oid:0x5c0000000020de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1238" + }, + "ttl": -0.001, + "expireat": 1651808848.0813653 + }, + "COUNTERS:oid:0x5c0000000020cb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0813813 + }, + "COUNTERS:oid:0x5c000000001c2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0813942 + }, + "COUNTERS:oid:0x5c00000000212a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0814106 + }, + "COUNTERS:oid:0x5c000000001ee3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0814607 + }, + "COUNTERS:oid:0x5c000000001d83": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0814805 + }, + "COUNTERS:oid:0x5c0000000014a5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.081494 + }, + "COUNTERS:oid:0x5c0000000015c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0815063 + }, + "COUNTERS:oid:0x5c000000001992": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "156" + }, + "ttl": -0.001, + "expireat": 1651808848.0815997 + }, + "COUNTERS:oid:0x5c000000002181": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0816247 + }, + "COUNTERS:oid:0x5c000000001d5e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0816453 + }, + "COUNTERS:oid:0x5c000000001882": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0816638 + }, + "COUNTERS:oid:0x5c000000001d95": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0816784 + }, + "COUNTERS:oid:0x5c000000001582": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0816922 + }, + "COUNTERS:oid:0x5c000000001702": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0817099 + }, + "COUNTERS:oid:0x5c0000000018b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "117" + }, + "ttl": -0.001, + "expireat": 1651808848.081724 + }, + "COUNTERS:oid:0x5c000000001423": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0817416 + }, + "COUNTERS:oid:0x5c000000001c3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "36" + }, + "ttl": -0.001, + "expireat": 1651808848.0817595 + }, + "COUNTERS:oid:0x5c0000000016c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0817735 + }, + "COUNTERS:oid:0x5c000000001c4b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.081791 + }, + "COUNTERS:oid:0x5c000000001ba4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "436", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0818102 + }, + "COUNTERS:oid:0x5c00000000182d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0818245 + }, + "COUNTERS:oid:0x5c000000001e7b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0818427 + }, + "COUNTERS:oid:0x5c000000002775": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "143" + }, + "ttl": -0.001, + "expireat": 1651808848.0818608 + }, + "COUNTERS:oid:0x5c00000000186e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0819557 + }, + "COUNTERS:oid:0x5c0000000017a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0819714 + }, + "COUNTERS:oid:0x5c00000000261b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0819879 + }, + "COUNTERS:oid:0x5c000000002417": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0820017 + }, + "COUNTERS:oid:0x5c000000001c33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.082018 + }, + "COUNTERS:oid:0x5c000000001a07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0820339 + }, + "COUNTERS:oid:0x5c00000000215a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0820467 + }, + "COUNTERS:oid:0x5c000000001712": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0820622 + }, + "COUNTERS:oid:0x5c000000002545": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.0820787 + }, + "COUNTERS:oid:0x5c000000001dfc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0820916 + }, + "COUNTERS:oid:0x5c0000000016ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0821073 + }, + "COUNTERS:oid:0x5c000000001752": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "80" + }, + "ttl": -0.001, + "expireat": 1651808848.0821238 + }, + "COUNTERS:oid:0x5c000000001415": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0821362 + }, + "COUNTERS:oid:0x5c000000001b34": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0821521 + }, + "COUNTERS:oid:0x5c0000000014d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1359" + }, + "ttl": -0.001, + "expireat": 1651808848.0821652 + }, + "COUNTERS:oid:0x5c0000000016c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "150", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0821774 + }, + "COUNTERS:oid:0x5c000000001d55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0821896 + }, + "COUNTERS:oid:0x5c0000000018f5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "101", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0822053 + }, + "COUNTERS:oid:0x5c000000001ac7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0822215 + }, + "COUNTERS:oid:0x5c0000000024fb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0822592 + }, + "COUNTERS:oid:0x5c000000001d08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0822783 + }, + "COUNTERS:oid:0x5c0000000020bb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0822947 + }, + "COUNTERS:oid:0x5c0000000021f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104" + }, + "ttl": -0.001, + "expireat": 1651808848.0823078 + }, + "COUNTERS:oid:0x5c0000000023d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0823202 + }, + "COUNTERS:oid:0x5c000000001b30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.082336 + }, + "COUNTERS:oid:0x5c00000000163d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "272", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.082352 + }, + "COUNTERS:oid:0x5c00000000197c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.082368 + }, + "COUNTERS:oid:0x5c0000000017b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0823839 + }, + "COUNTERS:oid:0x5c00000000231d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.0824003 + }, + "COUNTERS:oid:0x5c00000000166d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144" + }, + "ttl": -0.001, + "expireat": 1651808848.0824127 + }, + "COUNTERS:oid:0x5c0000000014b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1326" + }, + "ttl": -0.001, + "expireat": 1651808848.0824258 + }, + "COUNTERS:oid:0x5c0000000019b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1298" + }, + "ttl": -0.001, + "expireat": 1651808848.082438 + }, + "COUNTERS:oid:0x5c000000001be3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "186" + }, + "ttl": -0.001, + "expireat": 1651808848.0824537 + }, + "COUNTERS:oid:0x5c000000001d94": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0824695 + }, + "COUNTERS:oid:0x5c000000001b7e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0824854 + }, + "COUNTERS:oid:0x5c0000000016a4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "153" + }, + "ttl": -0.001, + "expireat": 1651808848.0824983 + }, + "COUNTERS:oid:0x5c000000001fec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1384", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0825143 + }, + "COUNTERS:oid:0x5c00000000173c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0825686 + }, + "COUNTERS:oid:0x5c000000001dc7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0825882 + }, + "COUNTERS:oid:0x5c00000000201b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9" + }, + "ttl": -0.001, + "expireat": 1651808848.0826013 + }, + "COUNTERS:oid:0x5c000000001c97": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "269", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0826182 + }, + "COUNTERS:oid:0x5c0000000015c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "69", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.082634 + }, + "COUNTERS:oid:0x5c000000001a4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.08265 + }, + "COUNTERS:oid:0x5c000000002588": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.082662 + }, + "COUNTERS:oid:0x5c000000001c0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0826776 + }, + "COUNTERS:oid:0x5c0000000027c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "123" + }, + "ttl": -0.001, + "expireat": 1651808848.0826938 + }, + "COUNTERS:oid:0x5c000000002348": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "47", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.082707 + }, + "COUNTERS:oid:0x5c000000001bc7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0827193 + }, + "COUNTERS:oid:0x5c000000002585": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.082735 + }, + "COUNTERS:oid:0x5c00000000231b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "65", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0827513 + }, + "COUNTERS:oid:0x5c000000001b07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0827675 + }, + "COUNTERS:oid:0x5c0000000019d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0827796 + }, + "COUNTERS:oid:0x5c000000001cc3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185" + }, + "ttl": -0.001, + "expireat": 1651808848.0827923 + }, + "COUNTERS:oid:0x5c00000000226b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "326", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0828075 + }, + "COUNTERS:oid:0x5c000000001aaf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0828238 + }, + "COUNTERS:oid:0x5c000000001d5b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0828726 + }, + "COUNTERS:oid:0x5c000000001efc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0828917 + }, + "COUNTERS:oid:0x5c0000000023dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0829048 + }, + "COUNTERS:oid:0x5c000000001704": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0829203 + }, + "COUNTERS:oid:0x5c000000001be5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0829368 + }, + "COUNTERS:oid:0x5c000000001b0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0829496 + }, + "COUNTERS:oid:0x5c0000000022ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0829654 + }, + "COUNTERS:oid:0x5c0000000026ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.082981 + }, + "COUNTERS:oid:0x5c00000000209a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1395" + }, + "ttl": -0.001, + "expireat": 1651808848.0829937 + }, + "COUNTERS:oid:0x5c000000001b60": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0830061 + }, + "COUNTERS:oid:0x5c000000001b48": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "91" + }, + "ttl": -0.001, + "expireat": 1651808848.0830185 + }, + "COUNTERS:oid:0x5c0000000017ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "249" + }, + "ttl": -0.001, + "expireat": 1651808848.083034 + }, + "COUNTERS:oid:0x5c000000001ce2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1353" + }, + "ttl": -0.001, + "expireat": 1651808848.0830467 + }, + "COUNTERS:oid:0x5c000000001db4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "162", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0830622 + }, + "COUNTERS:oid:0x5c00000000266f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "247", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0830777 + }, + "COUNTERS:oid:0x5c000000001c28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1326" + }, + "ttl": -0.001, + "expireat": 1651808848.0830905 + }, + "COUNTERS:oid:0x5c000000001580": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1260" + }, + "ttl": -0.001, + "expireat": 1651808848.0831025 + }, + "COUNTERS:oid:0x5c000000001ab6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1340" + }, + "ttl": -0.001, + "expireat": 1651808848.083115 + }, + "COUNTERS:oid:0x5c0000000023ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.083127 + }, + "COUNTERS:oid:0x5c000000001b8f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0831425 + }, + "COUNTERS:oid:0x5c000000001770": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0831952 + }, + "COUNTERS:oid:0x5c000000001370": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0832143 + }, + "COUNTERS:oid:0x5c0000000025c9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0832837 + }, + "COUNTERS:oid:0x5c000000002147": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0833097 + }, + "COUNTERS:oid:0x5c000000002136": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1276" + }, + "ttl": -0.001, + "expireat": 1651808848.083324 + }, + "COUNTERS:oid:0x5c000000001a5d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0833364 + }, + "COUNTERS:oid:0x5c000000001b44": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0833488 + }, + "COUNTERS:oid:0x5c000000001c6e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0833642 + }, + "COUNTERS:oid:0x5c000000001581": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0833848 + }, + "COUNTERS:oid:0x5c00000000198b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303" + }, + "ttl": -0.001, + "expireat": 1651808848.083401 + }, + "COUNTERS:oid:0x5c000000001ed6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0834134 + }, + "COUNTERS:oid:0x5c0000000016b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "153" + }, + "ttl": -0.001, + "expireat": 1651808848.083426 + }, + "COUNTERS:oid:0x5c0000000025f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0834377 + }, + "COUNTERS:oid:0x5c000000001c07": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0834498 + }, + "COUNTERS:oid:0x5c000000001f3e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0834653 + }, + "COUNTERS:oid:0x5c00000000186a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0834777 + }, + "COUNTERS:oid:0x5c000000002002": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0834928 + }, + "COUNTERS:oid:0x5c000000001b5f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0835085 + }, + "COUNTERS:oid:0x5c0000000025c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.083524 + }, + "COUNTERS:oid:0x5c000000001881": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1273" + }, + "ttl": -0.001, + "expireat": 1651808848.083577 + }, + "COUNTERS:oid:0x5c000000001eef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.083592 + }, + "COUNTERS:oid:0x5c000000001699": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.083608 + }, + "COUNTERS:oid:0x5c000000001abc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "123" + }, + "ttl": -0.001, + "expireat": 1651808848.0836203 + }, + "COUNTERS:oid:0x5c000000001946": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0836327 + }, + "COUNTERS:oid:0x5c000000001cec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0836449 + }, + "COUNTERS:oid:0x5c0000000020c6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2350", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.083657 + }, + "COUNTERS:oid:0x5c000000002484": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "53" + }, + "ttl": -0.001, + "expireat": 1651808848.0836728 + }, + "COUNTERS:oid:0x5c0000000013ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0836856 + }, + "COUNTERS:oid:0x5c000000002278": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0837007 + }, + "COUNTERS:oid:0x5c000000001a98": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.083717 + }, + "COUNTERS:oid:0x5c000000001365": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "138" + }, + "ttl": -0.001, + "expireat": 1651808848.08373 + }, + "COUNTERS:oid:0x5c00000000149e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "321" + }, + "ttl": -0.001, + "expireat": 1651808848.0837452 + }, + "COUNTERS:oid:0x5c000000001be6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0837576 + }, + "COUNTERS:oid:0x5c000000002486": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.0837727 + }, + "COUNTERS:oid:0x5c000000001fe7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.083785 + }, + "COUNTERS:oid:0x5c000000001ee0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "280" + }, + "ttl": -0.001, + "expireat": 1651808848.0838 + }, + "COUNTERS:oid:0x5c0000000020e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0838156 + }, + "COUNTERS:oid:0x5c00000000195c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180" + }, + "ttl": -0.001, + "expireat": 1651808848.0838282 + }, + "COUNTERS:oid:0x5c000000001e52": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "93" + }, + "ttl": -0.001, + "expireat": 1651808848.0838437 + }, + "COUNTERS:oid:0x5c0000000017f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0838969 + }, + "COUNTERS:oid:0x5c000000001638": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0839126 + }, + "COUNTERS:oid:0x5c000000001ab8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0839255 + }, + "COUNTERS:oid:0x5c000000001bae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0839376 + }, + "COUNTERS:oid:0x5c0000000021f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.08395 + }, + "COUNTERS:oid:0x5c000000001958": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0839622 + }, + "COUNTERS:oid:0x5c00000000244f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0839748 + }, + "COUNTERS:oid:0x5c00000000138e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "494" + }, + "ttl": -0.001, + "expireat": 1651808848.0839903 + }, + "COUNTERS:oid:0x5c0000000020be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2456" + }, + "ttl": -0.001, + "expireat": 1651808848.0840027 + }, + "COUNTERS:oid:0x5c0000000014a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11606" + }, + "ttl": -0.001, + "expireat": 1651808848.0840151 + }, + "COUNTERS:oid:0x5c000000001e81": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0840466 + }, + "COUNTERS:oid:0x5c0000000013b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0840628 + }, + "COUNTERS:oid:0x5c000000001d80": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0840755 + }, + "COUNTERS:oid:0x5c000000001bd7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.084091 + }, + "COUNTERS:oid:0x5c0000000019cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1319" + }, + "ttl": -0.001, + "expireat": 1651808848.0841029 + }, + "COUNTERS:oid:0x5c0000000026df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.0841148 + }, + "COUNTERS:oid:0x5c0000000025c4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0841262 + }, + "COUNTERS:oid:0x5c000000001a49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0841415 + }, + "COUNTERS:oid:0x5c000000001ef1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0841541 + }, + "COUNTERS:oid:0x5c000000001e27": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "265" + }, + "ttl": -0.001, + "expireat": 1651808848.0841691 + }, + "COUNTERS:oid:0x5c000000001a30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102" + }, + "ttl": -0.001, + "expireat": 1651808848.0841851 + }, + "COUNTERS:oid:0x5c000000001790": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0842376 + }, + "COUNTERS:oid:0x5c000000001edd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "124", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0842564 + }, + "COUNTERS:oid:0x5c000000001ae7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.08427 + }, + "COUNTERS:oid:0x5c000000002507": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0842855 + }, + "COUNTERS:oid:0x5c000000002784": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "802" + }, + "ttl": -0.001, + "expireat": 1651808848.0842977 + }, + "COUNTERS:oid:0x5c000000001940": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0843096 + }, + "COUNTERS:oid:0x5c000000001b19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0843246 + }, + "COUNTERS:oid:0x5c0000000019ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0843368 + }, + "COUNTERS:oid:0x5c000000002122": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0843515 + }, + "COUNTERS:oid:0x5c00000000259c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.084364 + }, + "COUNTERS:oid:0x5c000000001ddf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0843756 + }, + "COUNTERS:oid:0x5c000000001f3f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.084387 + }, + "COUNTERS:oid:0x5c00000000233c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "81" + }, + "ttl": -0.001, + "expireat": 1651808848.084402 + }, + "COUNTERS:oid:0x5c0000000019e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34" + }, + "ttl": -0.001, + "expireat": 1651808848.0844173 + }, + "COUNTERS:oid:0x5c000000002414": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "140", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0844326 + }, + "COUNTERS:oid:0x5c000000002467": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0844448 + }, + "COUNTERS:oid:0x5c000000001d5f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0844562 + }, + "COUNTERS:oid:0x5c000000001e9e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266" + }, + "ttl": -0.001, + "expireat": 1651808848.084471 + }, + "COUNTERS:oid:0x5c000000001a9c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0844867 + }, + "COUNTERS:oid:0x5c000000002625": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0845368 + }, + "COUNTERS:oid:0x5c000000001c85": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.084553 + }, + "COUNTERS:oid:0x5c000000001a4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.084568 + }, + "COUNTERS:oid:0x5c000000002771": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0845845 + }, + "COUNTERS:oid:0x5c000000001a72": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0845964 + }, + "COUNTERS:oid:0x5c0000000021f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0846112 + }, + "COUNTERS:oid:0x5c0000000014e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0846236 + }, + "COUNTERS:oid:0x5c000000001f39": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "170" + }, + "ttl": -0.001, + "expireat": 1651808848.0846355 + }, + "COUNTERS:oid:0x5c0000000013d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0846474 + }, + "COUNTERS:oid:0x5c000000001a40": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0846596 + }, + "COUNTERS:oid:0x5c000000001a29": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.084671 + }, + "COUNTERS:oid:0x5c0000000020d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.084686 + }, + "COUNTERS:oid:0x5c000000001807": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "349", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0846984 + }, + "COUNTERS:oid:0x5c000000002185": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "192", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0847135 + }, + "COUNTERS:oid:0x5c000000001686": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1253" + }, + "ttl": -0.001, + "expireat": 1651808848.0847256 + }, + "COUNTERS:oid:0x5c0000000017c7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0847406 + }, + "COUNTERS:oid:0x5c000000001980": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202" + }, + "ttl": -0.001, + "expireat": 1651808848.084756 + }, + "COUNTERS:oid:0x5c000000001860": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0847683 + }, + "COUNTERS:oid:0x5c000000001da2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0847836 + }, + "COUNTERS:oid:0x5c0000000019ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.084799 + }, + "COUNTERS:oid:0x5c0000000019d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "285" + }, + "ttl": -0.001, + "expireat": 1651808848.0848494 + }, + "COUNTERS:oid:0x5c000000001613": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "216" + }, + "ttl": -0.001, + "expireat": 1651808848.084868 + }, + "COUNTERS:oid:0x5c000000001c77": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.08488 + }, + "COUNTERS:oid:0x5c0000000019bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0848958 + }, + "COUNTERS:oid:0x5c000000002612": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.084908 + }, + "COUNTERS:oid:0x5c00000000181e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0849235 + }, + "COUNTERS:oid:0x5c000000002109": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.084939 + }, + "COUNTERS:oid:0x5c0000000013a7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0849512 + }, + "COUNTERS:oid:0x5c000000002531": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "162", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0849936 + }, + "COUNTERS:oid:0x5c000000002421": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1271" + }, + "ttl": -0.001, + "expireat": 1651808848.0850112 + }, + "COUNTERS:oid:0x5c000000002466": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0850267 + }, + "COUNTERS:oid:0x5c000000001fd1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1507" + }, + "ttl": -0.001, + "expireat": 1651808848.0850394 + }, + "COUNTERS:oid:0x5c000000001e9f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1356" + }, + "ttl": -0.001, + "expireat": 1651808848.085051 + }, + "COUNTERS:oid:0x5c000000001f43": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "539", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085063 + }, + "COUNTERS:oid:0x5c000000001c67": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "120" + }, + "ttl": -0.001, + "expireat": 1651808848.0850778 + }, + "COUNTERS:oid:0x5c0000000025f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0850904 + }, + "COUNTERS:oid:0x5c0000000019f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0851219 + }, + "COUNTERS:oid:0x5c00000000147b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17" + }, + "ttl": -0.001, + "expireat": 1651808848.0851343 + }, + "COUNTERS:oid:0x5c000000002419": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0851629 + }, + "COUNTERS:oid:0x5c000000001f5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6" + }, + "ttl": -0.001, + "expireat": 1651808848.0851746 + }, + "COUNTERS:oid:0x5c0000000014b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.085223 + }, + "COUNTERS:oid:0x5c00000000243b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.085238 + }, + "COUNTERS:oid:0x5c000000001e21": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.08525 + }, + "COUNTERS:oid:0x5c000000001afc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0852616 + }, + "COUNTERS:oid:0x5c00000000193d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0852766 + }, + "COUNTERS:oid:0x5c000000002117": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.085293 + }, + "COUNTERS:oid:0x5c000000001a16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "161", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0853055 + }, + "COUNTERS:oid:0x5c00000000260d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0853202 + }, + "COUNTERS:oid:0x5c000000002333": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "72", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085336 + }, + "COUNTERS:oid:0x5c000000001ee6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "94", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085352 + }, + "COUNTERS:oid:0x5c000000001389": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0853636 + }, + "COUNTERS:oid:0x5c000000001ec8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0853753 + }, + "COUNTERS:oid:0x5c000000001f2c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0853903 + }, + "COUNTERS:oid:0x5c000000002160": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0854025 + }, + "COUNTERS:oid:0x5c000000002350": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "40", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085414 + }, + "COUNTERS:oid:0x5c000000001a7a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0854254 + }, + "COUNTERS:oid:0x5c00000000254c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0854368 + }, + "COUNTERS:oid:0x5c000000001444": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0854487 + }, + "COUNTERS:oid:0x5c0000000020f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.08546 + }, + "COUNTERS:oid:0x5c000000001c35": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0854747 + }, + "COUNTERS:oid:0x5c000000001e3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0854871 + }, + "COUNTERS:oid:0x5c000000001b00": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1315" + }, + "ttl": -0.001, + "expireat": 1651808848.0855334 + }, + "COUNTERS:oid:0x5c000000002530": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0855477 + }, + "COUNTERS:oid:0x5c000000001586": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0855594 + }, + "COUNTERS:oid:0x5c000000001f1a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.085571 + }, + "COUNTERS:oid:0x5c000000001b9d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0855865 + }, + "COUNTERS:oid:0x5c000000001cde": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0855997 + }, + "COUNTERS:oid:0x5c0000000017dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0856147 + }, + "COUNTERS:oid:0x5c0000000020f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0856302 + }, + "COUNTERS:oid:0x5c000000001e16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0856454 + }, + "COUNTERS:oid:0x5c000000001829": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0856578 + }, + "COUNTERS:oid:0x5c0000000022fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0856729 + }, + "COUNTERS:oid:0x5c0000000013b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285" + }, + "ttl": -0.001, + "expireat": 1651808848.085685 + }, + "COUNTERS:oid:0x5c0000000019e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0856967 + }, + "COUNTERS:oid:0x5c000000001c91": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0857284 + }, + "COUNTERS:oid:0x5c000000002178": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0857403 + }, + "COUNTERS:oid:0x5c000000001de3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172" + }, + "ttl": -0.001, + "expireat": 1651808848.0857518 + }, + "COUNTERS:oid:0x5c000000001809": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085763 + }, + "COUNTERS:oid:0x5c000000002636": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.085775 + }, + "COUNTERS:oid:0x5c000000001a0d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.0857894 + }, + "COUNTERS:oid:0x5c000000001589": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0858047 + }, + "COUNTERS:oid:0x5c000000001cd6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0858195 + }, + "COUNTERS:oid:0x5c000000002428": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "298" + }, + "ttl": -0.001, + "expireat": 1651808848.085869 + }, + "COUNTERS:oid:0x5c0000000014b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "286", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0858872 + }, + "COUNTERS:oid:0x5c000000001f59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0859027 + }, + "COUNTERS:oid:0x5c000000001907": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "96" + }, + "ttl": -0.001, + "expireat": 1651808848.0859175 + }, + "COUNTERS:oid:0x5c000000002159": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0859325 + }, + "COUNTERS:oid:0x5c0000000025ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1269", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0859447 + }, + "COUNTERS:oid:0x5c0000000014dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0859597 + }, + "COUNTERS:oid:0x5c0000000017e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.085972 + }, + "COUNTERS:oid:0x5c0000000013ed": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0859833 + }, + "COUNTERS:oid:0x5c000000002252": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0859952 + }, + "COUNTERS:oid:0x5c000000001daa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "113", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.08601 + }, + "COUNTERS:oid:0x5c0000000019ce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "246" + }, + "ttl": -0.001, + "expireat": 1651808848.086025 + }, + "COUNTERS:oid:0x5c000000001793": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0860367 + }, + "COUNTERS:oid:0x5c000000001b0f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0860696 + }, + "COUNTERS:oid:0x5c000000002579": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086085 + }, + "COUNTERS:oid:0x5c00000000162c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0860972 + }, + "COUNTERS:oid:0x5c0000000023ad": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086109 + }, + "COUNTERS:oid:0x5c000000001664": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086124 + }, + "COUNTERS:oid:0x5c000000001eaa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0861742 + }, + "COUNTERS:oid:0x5c0000000020f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1186" + }, + "ttl": -0.001, + "expireat": 1651808848.0861893 + }, + "COUNTERS:oid:0x5c000000001a0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0862048 + }, + "COUNTERS:oid:0x5c000000001c0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0862172 + }, + "COUNTERS:oid:0x5c000000001dbc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0862467 + }, + "COUNTERS:oid:0x5c000000002605": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086262 + }, + "COUNTERS:oid:0x5c0000000017b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0862784 + }, + "COUNTERS:oid:0x5c000000001d19": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0862906 + }, + "COUNTERS:oid:0x5c000000001d6f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0863063 + }, + "COUNTERS:oid:0x5c0000000015c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0863218 + }, + "COUNTERS:oid:0x5c00000000252b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0863545 + }, + "COUNTERS:oid:0x5c00000000157e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0863662 + }, + "COUNTERS:oid:0x5c0000000015e6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0863774 + }, + "COUNTERS:oid:0x5c000000001e71": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "243" + }, + "ttl": -0.001, + "expireat": 1651808848.0863922 + }, + "COUNTERS:oid:0x5c000000001823": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0864043 + }, + "COUNTERS:oid:0x5c000000001b5c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0864158 + }, + "COUNTERS:oid:0x5c000000001c7a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0864303 + }, + "COUNTERS:oid:0x5c0000000015d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.086442 + }, + "COUNTERS:oid:0x5c0000000019dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0864532 + }, + "COUNTERS:oid:0x5c000000001bf0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0864654 + }, + "COUNTERS:oid:0x5c0000000017e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.086511 + }, + "COUNTERS:oid:0x5c00000000262a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0865252 + }, + "COUNTERS:oid:0x5c000000001784": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0865402 + }, + "COUNTERS:oid:0x5c00000000168e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1283" + }, + "ttl": -0.001, + "expireat": 1651808848.0865533 + }, + "COUNTERS:oid:0x5c0000000017bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.086565 + }, + "COUNTERS:oid:0x5c00000000216a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0865767 + }, + "COUNTERS:oid:0x5c000000001c2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0865877 + }, + "COUNTERS:oid:0x5c000000001d73": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0866022 + }, + "COUNTERS:oid:0x5c0000000013ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0866168 + }, + "COUNTERS:oid:0x5c00000000210b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0866468 + }, + "COUNTERS:oid:0x5c000000002463": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0866745 + }, + "COUNTERS:oid:0x5c00000000209d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086695 + }, + "COUNTERS:oid:0x5c0000000026f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "133", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.08671 + }, + "COUNTERS:oid:0x5c00000000176d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.086722 + }, + "COUNTERS:oid:0x5c0000000016b3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0867367 + }, + "COUNTERS:oid:0x5c000000001948": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "105" + }, + "ttl": -0.001, + "expireat": 1651808848.0867488 + }, + "COUNTERS:oid:0x5c000000001dc8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0867603 + }, + "COUNTERS:oid:0x5c000000001cc7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0867717 + }, + "COUNTERS:oid:0x5c000000001b20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086786 + }, + "COUNTERS:oid:0x5c0000000015f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1266" + }, + "ttl": -0.001, + "expireat": 1651808848.0867972 + }, + "COUNTERS:oid:0x5c000000001825": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0868087 + }, + "COUNTERS:oid:0x5c00000000135b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1446" + }, + "ttl": -0.001, + "expireat": 1651808848.086854 + }, + "COUNTERS:oid:0x5c000000002275": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0868678 + }, + "COUNTERS:oid:0x5c000000001e15": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0868797 + }, + "COUNTERS:oid:0x5c000000002460": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0868948 + }, + "COUNTERS:oid:0x5c0000000019fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "173" + }, + "ttl": -0.001, + "expireat": 1651808848.0869584 + }, + "COUNTERS:oid:0x5c0000000018fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "116" + }, + "ttl": -0.001, + "expireat": 1651808848.0869737 + }, + "COUNTERS:oid:0x5c0000000023df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.086986 + }, + "COUNTERS:oid:0x5c00000000164d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087001 + }, + "COUNTERS:oid:0x5c0000000019da": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0870168 + }, + "COUNTERS:oid:0x5c0000000025c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.087029 + }, + "COUNTERS:oid:0x5c00000000252e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1268", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0870402 + }, + "COUNTERS:oid:0x5c000000001b7f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "433", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087052 + }, + "COUNTERS:oid:0x5c0000000019a6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "121" + }, + "ttl": -0.001, + "expireat": 1651808848.0870836 + }, + "COUNTERS:oid:0x5c0000000015e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0871153 + }, + "COUNTERS:oid:0x5c0000000016dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0871446 + }, + "COUNTERS:oid:0x5c000000001ea3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0871575 + }, + "COUNTERS:oid:0x5c0000000014c1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0871701 + }, + "COUNTERS:oid:0x5c000000001f36": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087186 + }, + "COUNTERS:oid:0x5c0000000019a2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.087202 + }, + "COUNTERS:oid:0x5c000000001bd6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1308" + }, + "ttl": -0.001, + "expireat": 1651808848.0872147 + }, + "COUNTERS:oid:0x5c000000001eaf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "530", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0872748 + }, + "COUNTERS:oid:0x5c0000000013c5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1285", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0873172 + }, + "COUNTERS:oid:0x5c000000001f28": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "203", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0873318 + }, + "COUNTERS:oid:0x5c000000001429": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1199" + }, + "ttl": -0.001, + "expireat": 1651808848.087345 + }, + "COUNTERS:oid:0x5c000000001f2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0873575 + }, + "COUNTERS:oid:0x5c000000001a1f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "113" + }, + "ttl": -0.001, + "expireat": 1651808848.0873702 + }, + "COUNTERS:oid:0x5c0000000016b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0873828 + }, + "COUNTERS:oid:0x5c0000000026f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "6", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0874002 + }, + "COUNTERS:oid:0x5c000000001bdf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0874171 + }, + "COUNTERS:oid:0x5c000000002508": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0874295 + }, + "COUNTERS:oid:0x5c0000000018f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0874774 + }, + "COUNTERS:oid:0x5c0000000025b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.08751 + }, + "COUNTERS:oid:0x5c000000001fcc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0875251 + }, + "COUNTERS:oid:0x5c0000000021d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0875366 + }, + "COUNTERS:oid:0x5c000000001859": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "147", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087548 + }, + "COUNTERS:oid:0x5c0000000018d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0875628 + }, + "COUNTERS:oid:0x5c0000000018f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087578 + }, + "COUNTERS:oid:0x5c000000001d2b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.0875933 + }, + "COUNTERS:oid:0x5c0000000025cc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.087605 + }, + "COUNTERS:oid:0x5c0000000021c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "194" + }, + "ttl": -0.001, + "expireat": 1651808848.087674 + }, + "COUNTERS:oid:0x5c000000001f44": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "32" + }, + "ttl": -0.001, + "expireat": 1651808848.0876908 + }, + "COUNTERS:oid:0x5c000000002151": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "180", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0877268 + }, + "COUNTERS:oid:0x5c000000001c5d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0877445 + }, + "COUNTERS:oid:0x5c000000001ad0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "202", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087757 + }, + "COUNTERS:oid:0x5c00000000183e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "270", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0877726 + }, + "COUNTERS:oid:0x5c000000001ac6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "437", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0877843 + }, + "COUNTERS:oid:0x5c00000000247b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0877955 + }, + "COUNTERS:oid:0x5c00000000169e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "244", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087807 + }, + "COUNTERS:oid:0x5c000000001768": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0878212 + }, + "COUNTERS:oid:0x5c00000000277d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "68" + }, + "ttl": -0.001, + "expireat": 1651808848.0878367 + }, + "COUNTERS:oid:0x5c0000000015e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "57" + }, + "ttl": -0.001, + "expireat": 1651808848.0878518 + }, + "COUNTERS:oid:0x5c000000001cc8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0878675 + }, + "COUNTERS:oid:0x5c000000001607": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0878825 + }, + "COUNTERS:oid:0x5c000000001c11": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0878942 + }, + "COUNTERS:oid:0x5c000000001b98": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0879061 + }, + "COUNTERS:oid:0x5c000000001ceb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0879202 + }, + "COUNTERS:oid:0x5c000000002345": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.087935 + }, + "COUNTERS:oid:0x5c000000001a42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0879467 + }, + "COUNTERS:oid:0x5c0000000018e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0879614 + }, + "COUNTERS:oid:0x5c000000001a50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0879912 + }, + "COUNTERS:oid:0x5c000000001a03": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0880082 + }, + "COUNTERS:oid:0x5c000000001a53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0880241 + }, + "COUNTERS:oid:0x5c000000001837": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1283" + }, + "ttl": -0.001, + "expireat": 1651808848.0880358 + }, + "COUNTERS:oid:0x5c000000001e90": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.088048 + }, + "COUNTERS:oid:0x5c0000000021f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0880625 + }, + "COUNTERS:oid:0x5c000000001c38": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "460", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0880742 + }, + "COUNTERS:oid:0x5c00000000140d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1284" + }, + "ttl": -0.001, + "expireat": 1651808848.0880857 + }, + "COUNTERS:oid:0x5c000000002325": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0881004 + }, + "COUNTERS:oid:0x5c000000001d31": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0881157 + }, + "COUNTERS:oid:0x5c000000001a90": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "278" + }, + "ttl": -0.001, + "expireat": 1651808848.0881305 + }, + "COUNTERS:oid:0x5c00000000212b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0881424 + }, + "COUNTERS:oid:0x5c0000000021fa": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0881572 + }, + "COUNTERS:oid:0x5c000000001ebe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0881693 + }, + "COUNTERS:oid:0x5c000000001bb4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0887208 + }, + "COUNTERS:oid:0x5c000000002606": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0887482 + }, + "COUNTERS:oid:0x5c000000001665": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "109" + }, + "ttl": -0.001, + "expireat": 1651808848.088761 + }, + "COUNTERS:oid:0x5c000000001d6a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "167", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0887768 + }, + "COUNTERS:oid:0x5c000000001eea": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0888107 + }, + "COUNTERS:oid:0x5c000000001c7c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0888515 + }, + "COUNTERS:oid:0x5c000000001ba0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0888672 + }, + "COUNTERS:oid:0x5c000000001405": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0888798 + }, + "COUNTERS:oid:0x5c0000000025dd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.088895 + }, + "COUNTERS:oid:0x5c00000000276d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "131", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0889106 + }, + "COUNTERS:oid:0x5c000000001ecb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.088926 + }, + "COUNTERS:oid:0x5c000000001e55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1319" + }, + "ttl": -0.001, + "expireat": 1651808848.0889382 + }, + "COUNTERS:oid:0x5c000000001f55": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.088953 + }, + "COUNTERS:oid:0x5c000000001d0f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.089015 + }, + "COUNTERS:oid:0x5c000000001777": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0890293 + }, + "COUNTERS:oid:0x5c000000001661": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0890446 + }, + "COUNTERS:oid:0x5c000000002472": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0890598 + }, + "COUNTERS:oid:0x5c00000000163a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.089072 + }, + "COUNTERS:oid:0x5c000000001ad3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1310" + }, + "ttl": -0.001, + "expireat": 1651808848.0890837 + }, + "COUNTERS:oid:0x5c000000001f09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0890985 + }, + "COUNTERS:oid:0x5c00000000137d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1048", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0891106 + }, + "COUNTERS:oid:0x5c0000000014b7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0891254 + }, + "COUNTERS:oid:0x5c000000001abb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.089141 + }, + "COUNTERS:oid:0x5c00000000264b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0891562 + }, + "COUNTERS:oid:0x5c000000001b6a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0891929 + }, + "COUNTERS:oid:0x5c0000000017f9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0892074 + }, + "COUNTERS:oid:0x5c0000000017e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "166" + }, + "ttl": -0.001, + "expireat": 1651808848.0892224 + }, + "COUNTERS:oid:0x5c000000002001": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2433" + }, + "ttl": -0.001, + "expireat": 1651808848.0892346 + }, + "COUNTERS:oid:0x5c000000001676": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0892463 + }, + "COUNTERS:oid:0x5c000000001a71": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0892606 + }, + "COUNTERS:oid:0x5c0000000020d1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.089276 + }, + "COUNTERS:oid:0x5c000000001b1e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0892913 + }, + "COUNTERS:oid:0x5c000000001de0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0893064 + }, + "COUNTERS:oid:0x5c0000000017fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0893219 + }, + "COUNTERS:oid:0x5c0000000018d7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.089334 + }, + "COUNTERS:oid:0x5c00000000263d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0893483 + }, + "COUNTERS:oid:0x5c000000001966": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "307" + }, + "ttl": -0.001, + "expireat": 1651808848.0893638 + }, + "COUNTERS:oid:0x5c000000002540": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0893757 + }, + "COUNTERS:oid:0x5c000000002502": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "132" + }, + "ttl": -0.001, + "expireat": 1651808848.0893874 + }, + "COUNTERS:oid:0x5c000000001cb6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0894022 + }, + "COUNTERS:oid:0x5c0000000019d8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0894167 + }, + "COUNTERS:oid:0x5c00000000277c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1225", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0894284 + }, + "COUNTERS:oid:0x5c000000001377": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1194" + }, + "ttl": -0.001, + "expireat": 1651808848.0894582 + }, + "COUNTERS:oid:0x5c000000002403": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0894716 + }, + "COUNTERS:oid:0x5c000000001f0b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0894866 + }, + "COUNTERS:oid:0x5c000000001ac2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.089499 + }, + "COUNTERS:oid:0x5c00000000186c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0895104 + }, + "COUNTERS:oid:0x5c0000000014ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0895257 + }, + "COUNTERS:oid:0x5c000000001d00": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.089541 + }, + "COUNTERS:oid:0x5c0000000015a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "195", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0895526 + }, + "COUNTERS:oid:0x5c000000002200": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.089567 + }, + "COUNTERS:oid:0x5c000000001eb2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19" + }, + "ttl": -0.001, + "expireat": 1651808848.0895827 + }, + "COUNTERS:oid:0x5c0000000020fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1186" + }, + "ttl": -0.001, + "expireat": 1651808848.0895944 + }, + "COUNTERS:oid:0x5c000000001489": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0896058 + }, + "COUNTERS:oid:0x5c00000000140c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "327", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0896206 + }, + "COUNTERS:oid:0x5c000000001e4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1280" + }, + "ttl": -0.001, + "expireat": 1651808848.0896323 + }, + "COUNTERS:oid:0x5c000000001fce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0896468 + }, + "COUNTERS:oid:0x5c000000001d24": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1316" + }, + "ttl": -0.001, + "expireat": 1651808848.0896583 + }, + "COUNTERS:oid:0x5c0000000014b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0896733 + }, + "COUNTERS:oid:0x5c0000000015c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0896852 + }, + "COUNTERS:oid:0x5c000000001bf7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0896995 + }, + "COUNTERS:oid:0x5c000000001f42": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "114", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0897152 + }, + "COUNTERS:oid:0x5c000000001a96": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "127" + }, + "ttl": -0.001, + "expireat": 1651808848.0897682 + }, + "COUNTERS:oid:0x5c000000002618": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1254", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0897832 + }, + "COUNTERS:oid:0x5c000000001920": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "17", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0897987 + }, + "COUNTERS:oid:0x5c000000002300": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "51", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0898104 + }, + "COUNTERS:oid:0x5c000000001c13": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "405" + }, + "ttl": -0.001, + "expireat": 1651808848.089822 + }, + "COUNTERS:oid:0x5c0000000023ff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141" + }, + "ttl": -0.001, + "expireat": 1651808848.0898333 + }, + "COUNTERS:oid:0x5c0000000025b5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "296", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.089848 + }, + "COUNTERS:oid:0x5c00000000184f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "417" + }, + "ttl": -0.001, + "expireat": 1651808848.0898595 + }, + "COUNTERS:oid:0x5c00000000167b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0898743 + }, + "COUNTERS:oid:0x5c000000001c1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "201", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0898862 + }, + "COUNTERS:oid:0x5c000000001e63": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0898974 + }, + "COUNTERS:oid:0x5c0000000025ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0899088 + }, + "COUNTERS:oid:0x5c000000002011": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "2473", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0899198 + }, + "COUNTERS:oid:0x5c0000000020b8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0899315 + }, + "COUNTERS:oid:0x5c000000002608": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1278", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0899427 + }, + "COUNTERS:oid:0x5c000000001746": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "168" + }, + "ttl": -0.001, + "expireat": 1651808848.089958 + }, + "COUNTERS:oid:0x5c000000002631": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0899732 + }, + "COUNTERS:oid:0x5c000000001b22": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0899885 + }, + "COUNTERS:oid:0x5c000000002487": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "20" + }, + "ttl": -0.001, + "expireat": 1651808848.0900004 + }, + "COUNTERS:oid:0x5c000000001679": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "66", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0900152 + }, + "COUNTERS:oid:0x5c00000000227b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1478" + }, + "ttl": -0.001, + "expireat": 1651808848.090027 + }, + "COUNTERS:oid:0x5c00000000182c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "38", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0900953 + }, + "COUNTERS:oid:0x5c0000000020e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0901113 + }, + "COUNTERS:oid:0x5c000000001dc4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.090123 + }, + "COUNTERS:oid:0x5c000000001694": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0901346 + }, + "COUNTERS:oid:0x5c000000001c20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1301" + }, + "ttl": -0.001, + "expireat": 1651808848.090146 + }, + "COUNTERS:oid:0x5c0000000025f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0901575 + }, + "COUNTERS:oid:0x5c000000001ec3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305" + }, + "ttl": -0.001, + "expireat": 1651808848.0901725 + }, + "COUNTERS:oid:0x5c000000001d50": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "309" + }, + "ttl": -0.001, + "expireat": 1651808848.0901875 + }, + "COUNTERS:oid:0x5c000000001f33": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1308" + }, + "ttl": -0.001, + "expireat": 1651808848.0901992 + }, + "COUNTERS:oid:0x5c000000001f3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0902114 + }, + "COUNTERS:oid:0x5c00000000233f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "39" + }, + "ttl": -0.001, + "expireat": 1651808848.0902433 + }, + "COUNTERS:oid:0x5c0000000020dc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0902734 + }, + "COUNTERS:oid:0x5c000000001eae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "107", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090288 + }, + "COUNTERS:oid:0x5c000000001f18": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0902998 + }, + "COUNTERS:oid:0x5c000000001e49": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0903144 + }, + "COUNTERS:oid:0x5c000000001ca8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "404" + }, + "ttl": -0.001, + "expireat": 1651808848.0903263 + }, + "COUNTERS:oid:0x5c000000001b5a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "427", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0903382 + }, + "COUNTERS:oid:0x5c000000001896": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0903535 + }, + "COUNTERS:oid:0x5c0000000018f6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0903652 + }, + "COUNTERS:oid:0x5c000000001e4e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0903807 + }, + "COUNTERS:oid:0x5c000000001824": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0903955 + }, + "COUNTERS:oid:0x5c000000001891": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0904431 + }, + "COUNTERS:oid:0x5c000000001cdc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0904574 + }, + "COUNTERS:oid:0x5c000000001bdd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "260" + }, + "ttl": -0.001, + "expireat": 1651808848.0904725 + }, + "COUNTERS:oid:0x5c000000001854": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0904887 + }, + "COUNTERS:oid:0x5c000000001b09": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090504 + }, + "COUNTERS:oid:0x5c0000000020df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0905554 + }, + "COUNTERS:oid:0x5c0000000020f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0905688 + }, + "COUNTERS:oid:0x5c000000001cee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0905814 + }, + "COUNTERS:oid:0x5c000000001d93": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1299" + }, + "ttl": -0.001, + "expireat": 1651808848.0905943 + }, + "COUNTERS:oid:0x5c000000001beb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0906105 + }, + "COUNTERS:oid:0x5c000000002669": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0906267 + }, + "COUNTERS:oid:0x5c000000002008": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1305", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090644 + }, + "COUNTERS:oid:0x5c000000001797": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0906568 + }, + "COUNTERS:oid:0x5c000000001386": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "297", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090673 + }, + "COUNTERS:oid:0x5c0000000020a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1405" + }, + "ttl": -0.001, + "expireat": 1651808848.0907052 + }, + "COUNTERS:oid:0x5c000000002564": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0907335 + }, + "COUNTERS:oid:0x5c000000002632": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0907454 + }, + "COUNTERS:oid:0x5c000000001a54": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0907571 + }, + "COUNTERS:oid:0x5c0000000018bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "102" + }, + "ttl": -0.001, + "expireat": 1651808848.0907717 + }, + "COUNTERS:oid:0x5c0000000017ae": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "284", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090823 + }, + "COUNTERS:oid:0x5c000000001bec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.090839 + }, + "COUNTERS:oid:0x5c000000002516": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1273", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0908508 + }, + "COUNTERS:oid:0x5c000000001bda": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0908628 + }, + "COUNTERS:oid:0x5c000000002445": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "145", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0908911 + }, + "COUNTERS:oid:0x5c000000001eda": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0909023 + }, + "COUNTERS:oid:0x5c0000000015eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.090917 + }, + "COUNTERS:oid:0x5c000000001b3a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "19", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0909321 + }, + "COUNTERS:oid:0x5c0000000018f8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1332" + }, + "ttl": -0.001, + "expireat": 1651808848.090944 + }, + "COUNTERS:oid:0x5c000000001eac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0909588 + }, + "COUNTERS:oid:0x5c0000000021fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "31", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0909736 + }, + "COUNTERS:oid:0x5c00000000255c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "162", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0909858 + }, + "COUNTERS:oid:0x5c0000000023e2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0910003 + }, + "COUNTERS:oid:0x5c000000001685": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "303", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0910153 + }, + "COUNTERS:oid:0x5c000000002560": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0910273 + }, + "COUNTERS:oid:0x5c0000000015ba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "149" + }, + "ttl": -0.001, + "expireat": 1651808848.0910382 + }, + "COUNTERS:oid:0x5c000000002657": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "302", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.091053 + }, + "COUNTERS:oid:0x5c000000001a4e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0910652 + }, + "COUNTERS:oid:0x5c000000001c0e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0910792 + }, + "COUNTERS:oid:0x5c000000002505": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "295", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0910938 + }, + "COUNTERS:oid:0x5c000000001962": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0911427 + }, + "COUNTERS:oid:0x5c000000001a7b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "104" + }, + "ttl": -0.001, + "expireat": 1651808848.0911615 + }, + "COUNTERS:oid:0x5c00000000230a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.091174 + }, + "COUNTERS:oid:0x5c000000001c5b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.091189 + }, + "COUNTERS:oid:0x5c000000001cff": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1289" + }, + "ttl": -0.001, + "expireat": 1651808848.091201 + }, + "COUNTERS:oid:0x5c000000001f1d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0912158 + }, + "COUNTERS:oid:0x5c000000002580": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0912766 + }, + "COUNTERS:oid:0x5c000000001cf7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0913014 + }, + "COUNTERS:oid:0x5c0000000018c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "24" + }, + "ttl": -0.001, + "expireat": 1651808848.0913146 + }, + "COUNTERS:oid:0x5c000000001898": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "93", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0913293 + }, + "COUNTERS:oid:0x5c000000001bfc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0913444 + }, + "COUNTERS:oid:0x5c000000001b57": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0913591 + }, + "COUNTERS:oid:0x5c000000001a75": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0913742 + }, + "COUNTERS:oid:0x5c000000001b12": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0913863 + }, + "COUNTERS:oid:0x5c0000000013d3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0914006 + }, + "COUNTERS:oid:0x5c000000001912": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0914128 + }, + "COUNTERS:oid:0x5c000000001763": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "91" + }, + "ttl": -0.001, + "expireat": 1651808848.0914245 + }, + "COUNTERS:oid:0x5c000000001c30": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0914364 + }, + "COUNTERS:oid:0x5c000000001b6c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0914512 + }, + "COUNTERS:oid:0x5c000000001b71": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.0915003 + }, + "COUNTERS:oid:0x5c000000001620": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0915148 + }, + "COUNTERS:oid:0x5c000000002577": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0915303 + }, + "COUNTERS:oid:0x5c000000001652": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.091543 + }, + "COUNTERS:oid:0x5c0000000014d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305" + }, + "ttl": -0.001, + "expireat": 1651808848.0915582 + }, + "COUNTERS:oid:0x5c000000002411": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0915701 + }, + "COUNTERS:oid:0x5c000000001cd2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0915847 + }, + "COUNTERS:oid:0x5c000000001bb3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0915966 + }, + "COUNTERS:oid:0x5c000000001843": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0916145 + }, + "COUNTERS:oid:0x5c000000001c08": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137" + }, + "ttl": -0.001, + "expireat": 1651808848.0916917 + }, + "COUNTERS:oid:0x5c00000000226f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4" + }, + "ttl": -0.001, + "expireat": 1651808848.0917614 + }, + "COUNTERS:oid:0x5c0000000014ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11827", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0917823 + }, + "COUNTERS:oid:0x5c000000002569": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0918021 + }, + "COUNTERS:oid:0x5c000000001d04": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0918202 + }, + "COUNTERS:oid:0x5c00000000243c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "134", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.091838 + }, + "COUNTERS:oid:0x5c0000000020e0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0918522 + }, + "COUNTERS:oid:0x5c000000002157": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.09187 + }, + "COUNTERS:oid:0x5c00000000230c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "519" + }, + "ttl": -0.001, + "expireat": 1651808848.0918846 + }, + "COUNTERS:oid:0x5c000000001718": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.091902 + }, + "COUNTERS:oid:0x5c000000001486": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0919707 + }, + "COUNTERS:oid:0x5c0000000016a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "296" + }, + "ttl": -0.001, + "expireat": 1651808848.0919926 + }, + "COUNTERS:oid:0x5c0000000026e5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.092007 + }, + "COUNTERS:oid:0x5c000000002352": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0920362 + }, + "COUNTERS:oid:0x5c000000001d48": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "266", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0920525 + }, + "COUNTERS:oid:0x5c000000001609": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0920846 + }, + "COUNTERS:oid:0x5c000000001b3b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0920975 + }, + "COUNTERS:oid:0x5c0000000020d4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0921092 + }, + "COUNTERS:oid:0x5c00000000216c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "174", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.092121 + }, + "COUNTERS:oid:0x5c0000000016e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0921361 + }, + "COUNTERS:oid:0x5c000000001e2d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "172" + }, + "ttl": -0.001, + "expireat": 1651808848.0921519 + }, + "COUNTERS:oid:0x5c000000001c6d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0921643 + }, + "COUNTERS:oid:0x5c00000000175a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0921793 + }, + "COUNTERS:oid:0x5c000000001e2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0921912 + }, + "COUNTERS:oid:0x5c000000001f20": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0922034 + }, + "COUNTERS:oid:0x5c000000001c7b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0922306 + }, + "COUNTERS:oid:0x5c000000002423": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.092242 + }, + "COUNTERS:oid:0x5c0000000020e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0922534 + }, + "COUNTERS:oid:0x5c000000001b2a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.092284 + }, + "COUNTERS:oid:0x5c0000000014bf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11856" + }, + "ttl": -0.001, + "expireat": 1651808848.0922954 + }, + "COUNTERS:oid:0x5c0000000025fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0923095 + }, + "COUNTERS:oid:0x5c000000001b3f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "164" + }, + "ttl": -0.001, + "expireat": 1651808848.0923562 + }, + "COUNTERS:oid:0x5c000000001df2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0923743 + }, + "COUNTERS:oid:0x5c000000001922": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.09239 + }, + "COUNTERS:oid:0x5c0000000019d2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.092405 + }, + "COUNTERS:oid:0x5c000000001ca3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0924199 + }, + "COUNTERS:oid:0x5c000000001dbe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "134" + }, + "ttl": -0.001, + "expireat": 1651808848.0924313 + }, + "COUNTERS:oid:0x5c000000001ad6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0924456 + }, + "COUNTERS:oid:0x5c000000001fe9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1337", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0924573 + }, + "COUNTERS:oid:0x5c000000001e68": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0924716 + }, + "COUNTERS:oid:0x5c000000002343": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "74" + }, + "ttl": -0.001, + "expireat": 1651808848.0924866 + }, + "COUNTERS:oid:0x5c000000001d61": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "409", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0924978 + }, + "COUNTERS:oid:0x5c0000000017a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0925093 + }, + "COUNTERS:oid:0x5c00000000137b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0925202 + }, + "COUNTERS:oid:0x5c000000001c96": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "175" + }, + "ttl": -0.001, + "expireat": 1651808848.0925317 + }, + "COUNTERS:oid:0x5c0000000016ca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0925424 + }, + "COUNTERS:oid:0x5c000000001a1b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0925534 + }, + "COUNTERS:oid:0x5c000000001a56": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "393", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0925648 + }, + "COUNTERS:oid:0x5c0000000027fc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "4726", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0925758 + }, + "COUNTERS:oid:0x5c000000001df7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33" + }, + "ttl": -0.001, + "expireat": 1651808848.09259 + }, + "COUNTERS:oid:0x5c000000001e25": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "199" + }, + "ttl": -0.001, + "expireat": 1651808848.0926015 + }, + "COUNTERS:oid:0x5c00000000208d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "268" + }, + "ttl": -0.001, + "expireat": 1651808848.0926158 + }, + "COUNTERS:oid:0x5c00000000259b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15" + }, + "ttl": -0.001, + "expireat": 1651808848.092665 + }, + "COUNTERS:oid:0x5c000000002156": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1195", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0926797 + }, + "COUNTERS:oid:0x5c0000000017df": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.092691 + }, + "COUNTERS:oid:0x5c000000002435": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.092702 + }, + "COUNTERS:oid:0x5c000000001e69": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0927129 + }, + "COUNTERS:oid:0x5c000000001ece": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0927236 + }, + "COUNTERS:oid:0x5c000000002426": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0927382 + }, + "COUNTERS:oid:0x5c000000002649": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0927532 + }, + "COUNTERS:oid:0x5c000000001973": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0927646 + }, + "COUNTERS:oid:0x5c0000000015d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "305" + }, + "ttl": -0.001, + "expireat": 1651808848.092779 + }, + "COUNTERS:oid:0x5c000000001d7c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "103" + }, + "ttl": -0.001, + "expireat": 1651808848.0927904 + }, + "COUNTERS:oid:0x5c0000000016e3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0928044 + }, + "COUNTERS:oid:0x5c00000000199a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0928156 + }, + "COUNTERS:oid:0x5c000000001e97": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1312" + }, + "ttl": -0.001, + "expireat": 1651808848.0928266 + }, + "COUNTERS:oid:0x5c000000001778": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "34", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.092841 + }, + "COUNTERS:oid:0x5c0000000019fd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0928562 + }, + "COUNTERS:oid:0x5c0000000019b4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0928676 + }, + "COUNTERS:oid:0x5c0000000018d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "141" + }, + "ttl": -0.001, + "expireat": 1651808848.0928788 + }, + "COUNTERS:oid:0x5c0000000018f0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1319" + }, + "ttl": -0.001, + "expireat": 1651808848.0928898 + }, + "COUNTERS:oid:0x5c000000001817": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.092901 + }, + "COUNTERS:oid:0x5c000000002776": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0929153 + }, + "COUNTERS:oid:0x5c000000001337": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0929606 + }, + "COUNTERS:oid:0x5c000000001f13": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.093027 + }, + "COUNTERS:oid:0x5c00000000233b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "498" + }, + "ttl": -0.001, + "expireat": 1651808848.093058 + }, + "COUNTERS:oid:0x5c000000001bef": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "33", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0930736 + }, + "COUNTERS:oid:0x5c00000000200f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0930862 + }, + "COUNTERS:oid:0x5c00000000196c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "182" + }, + "ttl": -0.001, + "expireat": 1651808848.0931015 + }, + "COUNTERS:oid:0x5c0000000015f1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0931172 + }, + "COUNTERS:oid:0x5c00000000191f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0931294 + }, + "COUNTERS:oid:0x5c0000000025b1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0931444 + }, + "COUNTERS:oid:0x5c000000001ebc": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1304" + }, + "ttl": -0.001, + "expireat": 1651808848.0931563 + }, + "COUNTERS:oid:0x5c000000001421": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1301" + }, + "ttl": -0.001, + "expireat": 1651808848.0931847 + }, + "COUNTERS:oid:0x5c0000000025a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0931962 + }, + "COUNTERS:oid:0x5c00000000137e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0932102 + }, + "COUNTERS:oid:0x5c0000000018af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0932252 + }, + "COUNTERS:oid:0x5c000000001ae9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0932364 + }, + "COUNTERS:oid:0x5c0000000019a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.0932474 + }, + "COUNTERS:oid:0x5c000000001d57": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "181" + }, + "ttl": -0.001, + "expireat": 1651808848.0932586 + }, + "COUNTERS:oid:0x5c000000001691": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "100" + }, + "ttl": -0.001, + "expireat": 1651808848.0932696 + }, + "COUNTERS:oid:0x5c000000001ccb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0932808 + }, + "COUNTERS:oid:0x5c00000000253b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0932949 + }, + "COUNTERS:oid:0x5c000000001dce": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0933058 + }, + "COUNTERS:oid:0x5c000000001f53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0933561 + }, + "COUNTERS:oid:0x5c000000001d7f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0933738 + }, + "COUNTERS:oid:0x5c00000000254e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1256" + }, + "ttl": -0.001, + "expireat": 1651808848.0933855 + }, + "COUNTERS:oid:0x5c00000000261d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301" + }, + "ttl": -0.001, + "expireat": 1651808848.0933998 + }, + "COUNTERS:oid:0x5c00000000276b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0934148 + }, + "COUNTERS:oid:0x5c0000000014f3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "10" + }, + "ttl": -0.001, + "expireat": 1651808848.0934265 + }, + "COUNTERS:oid:0x5c000000001717": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1236" + }, + "ttl": -0.001, + "expireat": 1651808848.0934374 + }, + "COUNTERS:oid:0x5c000000002087": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0934486 + }, + "COUNTERS:oid:0x5c000000002412": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.09348 + }, + "COUNTERS:oid:0x5c000000001f9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "216" + }, + "ttl": -0.001, + "expireat": 1651808848.0934958 + }, + "COUNTERS:oid:0x5c000000001c9d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "111", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.093527 + }, + "COUNTERS:oid:0x5c00000000158b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1376", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0935602 + }, + "COUNTERS:oid:0x5c00000000198e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0935721 + }, + "COUNTERS:oid:0x5c0000000027ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "306" + }, + "ttl": -0.001, + "expireat": 1651808848.093604 + }, + "COUNTERS:oid:0x5c0000000025a9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0936356 + }, + "COUNTERS:oid:0x5c000000001bb7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179" + }, + "ttl": -0.001, + "expireat": 1651808848.0936475 + }, + "COUNTERS:oid:0x5c000000001c9c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0936587 + }, + "COUNTERS:oid:0x5c00000000227d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0936697 + }, + "COUNTERS:oid:0x5c000000001f4d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "200", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.093681 + }, + "COUNTERS:oid:0x5c000000001774": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0937297 + }, + "COUNTERS:oid:0x5c000000001c76": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0937486 + }, + "COUNTERS:oid:0x5c000000001972": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.093764 + }, + "COUNTERS:oid:0x5c0000000018cf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0937762 + }, + "COUNTERS:oid:0x5c000000001b23": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "136" + }, + "ttl": -0.001, + "expireat": 1651808848.0937877 + }, + "COUNTERS:oid:0x5c0000000023d0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0938025 + }, + "COUNTERS:oid:0x5c000000001dca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0938144 + }, + "COUNTERS:oid:0x5c000000001bd3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "149", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0938258 + }, + "COUNTERS:oid:0x5c0000000017f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "135" + }, + "ttl": -0.001, + "expireat": 1651808848.0938401 + }, + "COUNTERS:oid:0x5c0000000020b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0938525 + }, + "COUNTERS:oid:0x5c000000001498": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11730" + }, + "ttl": -0.001, + "expireat": 1651808848.093864 + }, + "COUNTERS:oid:0x5c00000000180f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "158" + }, + "ttl": -0.001, + "expireat": 1651808848.0938754 + }, + "COUNTERS:oid:0x5c0000000019c0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.093887 + }, + "COUNTERS:oid:0x5c0000000018de": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0939014 + }, + "COUNTERS:oid:0x5c00000000196d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "106" + }, + "ttl": -0.001, + "expireat": 1651808848.0939288 + }, + "COUNTERS:oid:0x5c000000001644": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.09394 + }, + "COUNTERS:oid:0x5c0000000015af": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.093954 + }, + "COUNTERS:oid:0x5c000000001d06": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "264", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0939686 + }, + "COUNTERS:oid:0x5c000000001eca": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "167" + }, + "ttl": -0.001, + "expireat": 1651808848.0939803 + }, + "COUNTERS:oid:0x5c000000001e88": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1366" + }, + "ttl": -0.001, + "expireat": 1651808848.0940087 + }, + "COUNTERS:oid:0x5c000000001438": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "171" + }, + "ttl": -0.001, + "expireat": 1651808848.0940235 + }, + "COUNTERS:oid:0x5c00000000161c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0940695 + }, + "COUNTERS:oid:0x5c000000002308": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "52" + }, + "ttl": -0.001, + "expireat": 1651808848.0940835 + }, + "COUNTERS:oid:0x5c000000001656": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "213", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0940952 + }, + "COUNTERS:oid:0x5c000000001bc1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0941064 + }, + "COUNTERS:oid:0x5c000000002779": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.094122 + }, + "COUNTERS:oid:0x5c000000001fe5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1148" + }, + "ttl": -0.001, + "expireat": 1651808848.0941346 + }, + "COUNTERS:oid:0x5c000000001dcb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.094149 + }, + "COUNTERS:oid:0x5c000000001c64": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22" + }, + "ttl": -0.001, + "expireat": 1651808848.0941613 + }, + "COUNTERS:oid:0x5c000000001e32": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0941722 + }, + "COUNTERS:oid:0x5c000000001e37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.094187 + }, + "COUNTERS:oid:0x5c0000000025e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.094202 + }, + "COUNTERS:oid:0x5c000000002253": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0942178 + }, + "COUNTERS:oid:0x5c0000000013ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0942507 + }, + "COUNTERS:oid:0x5c000000001a94": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.094266 + }, + "COUNTERS:oid:0x5c0000000023eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0942972 + }, + "COUNTERS:oid:0x5c0000000013bd": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0943093 + }, + "COUNTERS:oid:0x5c0000000025d6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1270", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.094337 + }, + "COUNTERS:oid:0x5c000000001473": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "23" + }, + "ttl": -0.001, + "expireat": 1651808848.094349 + }, + "COUNTERS:oid:0x5c00000000161d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0943804 + }, + "COUNTERS:oid:0x5c0000000017a8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "15", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0943952 + }, + "COUNTERS:oid:0x5c000000001670": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.094441 + }, + "COUNTERS:oid:0x5c000000001ecf": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0944588 + }, + "COUNTERS:oid:0x5c0000000020a3": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1140" + }, + "ttl": -0.001, + "expireat": 1651808848.0944746 + }, + "COUNTERS:oid:0x5c0000000014eb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0944865 + }, + "COUNTERS:oid:0x5c000000001574": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0945008 + }, + "COUNTERS:oid:0x5c000000002654": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "178" + }, + "ttl": -0.001, + "expireat": 1651808848.094513 + }, + "COUNTERS:oid:0x5c00000000162d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0945272 + }, + "COUNTERS:oid:0x5c000000002547": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.094542 + }, + "COUNTERS:oid:0x5c00000000159f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0945575 + }, + "COUNTERS:oid:0x5c000000001d59": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0945692 + }, + "COUNTERS:oid:0x5c000000001e86": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.0945807 + }, + "COUNTERS:oid:0x5c000000001ed4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "471", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0945923 + }, + "COUNTERS:oid:0x5c000000001392": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0946066 + }, + "COUNTERS:oid:0x5c0000000025ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0946183 + }, + "COUNTERS:oid:0x5c000000001d58": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0946324 + }, + "COUNTERS:oid:0x5c000000001aba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0946443 + }, + "COUNTERS:oid:0x5c000000002556": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1264" + }, + "ttl": -0.001, + "expireat": 1651808848.09469 + }, + "COUNTERS:oid:0x5c000000001bcb": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0947013 + }, + "COUNTERS:oid:0x5c0000000013b2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "304" + }, + "ttl": -0.001, + "expireat": 1651808848.0947158 + }, + "COUNTERS:oid:0x5c0000000014c8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0947278 + }, + "COUNTERS:oid:0x5c000000001983": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "300" + }, + "ttl": -0.001, + "expireat": 1651808848.094775 + }, + "COUNTERS:oid:0x5c000000001d0c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "187" + }, + "ttl": -0.001, + "expireat": 1651808848.094793 + }, + "COUNTERS:oid:0x5c000000001834": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0948052 + }, + "COUNTERS:oid:0x5c000000001b4f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "185", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0948203 + }, + "COUNTERS:oid:0x5c00000000170d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "27" + }, + "ttl": -0.001, + "expireat": 1651808848.0948327 + }, + "COUNTERS:oid:0x5c00000000261e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.094844 + }, + "COUNTERS:oid:0x5c000000001e8f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0948591 + }, + "COUNTERS:oid:0x5c0000000023d9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1314", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0948708 + }, + "COUNTERS:oid:0x5c000000001721": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0948822 + }, + "COUNTERS:oid:0x5c0000000025e8": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0948937 + }, + "COUNTERS:oid:0x5c00000000148f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0949078 + }, + "COUNTERS:oid:0x5c000000001f0a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0949194 + }, + "COUNTERS:oid:0x5c00000000158c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1380" + }, + "ttl": -0.001, + "expireat": 1651808848.0949306 + }, + "COUNTERS:oid:0x5c00000000141e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "308" + }, + "ttl": -0.001, + "expireat": 1651808848.094945 + }, + "COUNTERS:oid:0x5c0000000021f4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0949602 + }, + "COUNTERS:oid:0x5c00000000182a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "87", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0949755 + }, + "COUNTERS:oid:0x5c000000002461": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1295" + }, + "ttl": -0.001, + "expireat": 1651808848.0949872 + }, + "COUNTERS:oid:0x5c00000000138d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1015" + }, + "ttl": -0.001, + "expireat": 1651808848.0949988 + }, + "COUNTERS:oid:0x5c000000001c57": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.0950131 + }, + "COUNTERS:oid:0x5c000000002144": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "179", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.095025 + }, + "COUNTERS:oid:0x5c0000000016fe": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "183" + }, + "ttl": -0.001, + "expireat": 1651808848.0950725 + }, + "COUNTERS:oid:0x5c00000000171f": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1290" + }, + "ttl": -0.001, + "expireat": 1651808848.0950878 + }, + "COUNTERS:oid:0x5c000000001ce6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0951 + }, + "COUNTERS:oid:0x5c00000000159b": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0951152 + }, + "COUNTERS:oid:0x5c000000001b16": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0951273 + }, + "COUNTERS:oid:0x5c0000000015be": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0951385 + }, + "COUNTERS:oid:0x5c00000000277e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.095153 + }, + "COUNTERS:oid:0x5c0000000016ec": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "219" + }, + "ttl": -0.001, + "expireat": 1651808848.0951684 + }, + "COUNTERS:oid:0x5c000000001d75": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "292" + }, + "ttl": -0.001, + "expireat": 1651808848.095183 + }, + "COUNTERS:oid:0x5c0000000019ac": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "14" + }, + "ttl": -0.001, + "expireat": 1651808848.0951943 + }, + "COUNTERS:oid:0x5c0000000020e7": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0952086 + }, + "COUNTERS:oid:0x5c0000000026e1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "13" + }, + "ttl": -0.001, + "expireat": 1651808848.0952206 + }, + "COUNTERS:oid:0x5c0000000018f2": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0952861 + }, + "COUNTERS:oid:0x5c00000000194c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0953012 + }, + "COUNTERS:oid:0x5c000000001a37": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "16" + }, + "ttl": -0.001, + "expireat": 1651808848.0953126 + }, + "COUNTERS:oid:0x5c000000002548": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0953236 + }, + "COUNTERS:oid:0x5c000000001c53": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "177", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0953388 + }, + "COUNTERS:oid:0x5c000000001bba": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.095354 + }, + "COUNTERS:oid:0x5c000000001b9a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "125" + }, + "ttl": -0.001, + "expireat": 1651808848.0953662 + }, + "COUNTERS:oid:0x5c000000001fde": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.095381 + }, + "COUNTERS:oid:0x5c000000001d5d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1274" + }, + "ttl": -0.001, + "expireat": 1651808848.095433 + }, + "COUNTERS:oid:0x5c0000000018ab": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "154" + }, + "ttl": -0.001, + "expireat": 1651808848.095451 + }, + "COUNTERS:oid:0x5c0000000013e9": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1258" + }, + "ttl": -0.001, + "expireat": 1651808848.0954638 + }, + "COUNTERS:oid:0x5c000000001e5d": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0954783 + }, + "COUNTERS:oid:0x5c00000000174a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.095493 + }, + "COUNTERS:oid:0x5c000000001e8a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "486" + }, + "ttl": -0.001, + "expireat": 1651808848.0955057 + }, + "COUNTERS:oid:0x5c000000001c5e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "446" + }, + "ttl": -0.001, + "expireat": 1651808848.095517 + }, + "COUNTERS:oid:0x5c000000002017": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "9" + }, + "ttl": -0.001, + "expireat": 1651808848.0955286 + }, + "COUNTERS:oid:0x5c000000002415": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "144" + }, + "ttl": -0.001, + "expireat": 1651808848.09554 + }, + "COUNTERS:oid:0x5c00000000265e": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.095552 + }, + "COUNTERS:oid:0x5c00000000212c": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0955634 + }, + "COUNTERS:oid:0x5c000000001cc1": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.095575 + }, + "COUNTERS:oid:0x5c0000000013b0": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "176" + }, + "ttl": -0.001, + "expireat": 1651808848.0955892 + }, + "COUNTERS:oid:0x5c000000001b67": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1324" + }, + "ttl": -0.001, + "expireat": 1651808848.095601 + }, + "COUNTERS:oid:0x5c000000002514": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "134" + }, + "ttl": -0.001, + "expireat": 1651808848.0956125 + }, + "COUNTERS:oid:0x5c000000002434": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "137", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.095627 + }, + "COUNTERS:oid:0x5c000000002607": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "301", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0956416 + }, + "COUNTERS:oid:0x5c000000001b29": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0956533 + }, + "COUNTERS:oid:0x5c0000000014ee": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "299" + }, + "ttl": -0.001, + "expireat": 1651808848.0956678 + }, + "COUNTERS:oid:0x5c000000002513": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.0956795 + }, + "COUNTERS:oid:0x5c000000001d97": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0956905 + }, + "COUNTERS:oid:0x5c000000001f5a": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "5" + }, + "ttl": -0.001, + "expireat": 1651808848.095725 + }, + "COUNTERS:oid:0x5c000000001462": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0957417 + }, + "COUNTERS:oid:0x5c000000001a48": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "12" + }, + "ttl": -0.001, + "expireat": 1651808848.095754 + }, + "COUNTERS:oid:0x5c000000001921": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "18" + }, + "ttl": -0.001, + "expireat": 1651808848.0957656 + }, + "COUNTERS:oid:0x5c000000001db5": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "196", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0957773 + }, + "COUNTERS:oid:0x5c0000000013b6": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "1" + }, + "ttl": -0.001, + "expireat": 1651808848.095808 + }, + "COUNTERS:oid:0x5c000000001b46": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.0958195 + }, + "COUNTERS:oid:0x5c000000002662": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11", + "SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0958307 + }, + "COUNTERS:oid:0x5c000000001d41": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "22", + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0" + }, + "ttl": -0.001, + "expireat": 1651808848.0958455 + }, + "COUNTERS:oid:0x5c0000000026e4": { + "type": "hash", + "value": { + "SAI_MACSEC_SA_STAT_IN_PKTS_OK": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA": "0", + "SAI_MACSEC_SA_STAT_OCTETS_PROTECTED": "0", + "SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_LATE": "0", + "SAI_MACSEC_SA_STAT_IN_PKTS_INVALID": "0", + "SAI_MACSEC_SA_ATTR_CURRENT_XPN": "11" + }, + "ttl": -0.001, + "expireat": 1651808848.09586 + } +} diff --git a/dockers/docker-macsec/cli-plugin-tests/mock_tables.py b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py new file mode 100644 index 000000000000..2e88297597b3 --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py @@ -0,0 +1,124 @@ +# MONKEY PATCH!!! +import json +import os +from unittest import mock + +import mockredis +import redis +import swsssdk +from sonic_py_common import multi_asic +from swsssdk import SonicV2Connector, ConfigDBConnector, ConfigDBPipeConnector +from swsscommon import swsscommon + + +dedicated_dbs = {} + + +_old_connect_SonicV2Connector = SonicV2Connector.connect + +def connect_SonicV2Connector(self, db_name, retry_on=True): + # add the namespace to kwargs for testing multi asic + self.dbintf.redis_kwargs['namespace'] = self.namespace + # Mock DB filename for unit-test + global dedicated_dbs + if dedicated_dbs and dedicated_dbs.get(db_name): + self.dbintf.redis_kwargs['db_name'] = dedicated_dbs[db_name] + else: + self.dbintf.redis_kwargs['db_name'] = db_name + self.dbintf.redis_kwargs['decode_responses'] = True + _old_connect_SonicV2Connector(self, db_name, retry_on) + +def _subscribe_keyspace_notification(self, db_name, client): + pass + + +def config_set(self, *args): + pass + + +class MockPubSub: + def get_message(self): + return None + + def psubscribe(self, *args, **kwargs): + pass + + def __call__(self, *args, **kwargs): + return self + + def listen(self): + return [] + + def punsubscribe(self, *args, **kwargs): + pass + + def clear(self): + pass + +INPUT_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class SwssSyncClient(mockredis.MockRedis): + def __init__(self, *args, **kwargs): + super(SwssSyncClient, self).__init__(strict=True, *args, **kwargs) + # Namespace is added in kwargs specifically for unit-test + # to identify the file path to load the db json files. + namespace = kwargs.pop('namespace') + db_name = kwargs.pop('db_name') + self.decode_responses = kwargs.pop('decode_responses', False) == True + fname = db_name.lower() + ".json" + self.pubsub = MockPubSub() + + if namespace is not None and namespace is not multi_asic.DEFAULT_NAMESPACE: + fname = os.path.join(INPUT_DIR, namespace, fname) + else: + fname = os.path.join(INPUT_DIR, fname) + + if os.path.exists(fname): + with open(fname) as f: + js = json.load(f) + for k, v in js.items(): + if 'expireat' in v and 'ttl' in v and 'type' in v and 'value' in v: + # database is in redis-dump format + if v['type'] == 'hash': + # ignore other types for now since sonic has hset keys only in the db + for attr, value in v['value'].items(): + self.hset(k, attr, value) + else: + for attr, value in v.items(): + self.hset(k, attr, value) + + # Patch mockredis/mockredis/client.py + # The offical implementation assume decode_responses=False + # Here we detect the option and decode after doing encode + def _encode(self, value): + "Return a bytestring representation of the value. Taken from redis-py connection.py" + + value = super(SwssSyncClient, self)._encode(value) + + if self.decode_responses: + return value.decode('utf-8') + + # Patch mockredis/mockredis/client.py + # The official implementation will filter out keys with a slash '/' + # ref: https://github.com/locationlabs/mockredis/blob/master/mockredis/client.py + def keys(self, pattern='*'): + """Emulate keys.""" + import fnmatch + import re + + # Make regex out of glob styled pattern. + regex = fnmatch.translate(pattern) + regex = re.compile(regex) + + # Find every key that matches the pattern + return [key for key in self.redis if regex.match(key)] + + +swsssdk.interface.DBInterface._subscribe_keyspace_notification = _subscribe_keyspace_notification +mockredis.MockRedis.config_set = config_set +redis.StrictRedis = SwssSyncClient +SonicV2Connector.connect = connect_SonicV2Connector +swsscommon.SonicV2Connector = SonicV2Connector +swsscommon.ConfigDBConnector = ConfigDBConnector +swsscommon.ConfigDBPipeConnector = ConfigDBPipeConnector diff --git a/dockers/docker-macsec/cli-plugin-tests/pytest.ini b/dockers/docker-macsec/cli-plugin-tests/pytest.ini new file mode 100644 index 000000000000..50dac9146b5a --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = --cov-config=.coveragerc --cov --cov-report html --cov-report term --cov-report xml --junitxml=test-results.xml -vv \ No newline at end of file diff --git a/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py new file mode 100644 index 000000000000..4635092386ac --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py @@ -0,0 +1,146 @@ +import sys + +from unittest import mock +from click.testing import CliRunner +from utilities_common.db import Db + +sys.path.append('../cli/config/plugins/') +import macsec + + +profile_name = "test" +primary_cak = "01234567890123456789012345678912" +primary_ckn = "01234567890123456789012345678912" + + +class TestConfigMACsec(object): + def test_plugin_registration(self): + cli = mock.MagicMock() + macsec.register(cli) + cli.add_command.assert_called_once_with(macsec.macsec) + + def test_default_profile(self, mock_cfgdb): + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], + [profile_name, "--primary_cak=" + primary_cak,"--primary_ckn=" + primary_ckn], + obj=db) + assert result.exit_code == 0 + profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + assert profile_table + assert profile_table["priority"] == "255" + assert profile_table["cipher_suite"] == "GCM-AES-128" + assert profile_table["primary_cak"] == primary_cak + assert profile_table["primary_ckn"] == primary_ckn + assert profile_table["policy"] == "security" + assert "enable_replay_protect" not in profile_table + assert "replay_window" not in profile_table + assert profile_table["send_sci"] == "true" + assert "rekey_period" not in profile_table + + result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], [profile_name], obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + assert not profile_table + + def test_macsec_valid_profile(self, mock_cfgdb): + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + + profile_name = "test" + profile_map = { + "primary_cak": "0123456789012345678901234567891201234567890123456789012345678912", + "primary_ckn": "01234567890123456789012345678912", + "priority": 64, + "cipher_suite": "GCM-AES-XPN-256", + "policy": "integrity_only", + "enable_replay_protect": None, + "replay_window": 100, + "no_send_sci": None, + "rekey_period": 30 * 60, + } + options = [profile_name] + for k, v in profile_map.items(): + options.append("--" + k) + if v is not None: + options[-1] += "=" + str(v) + + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], options, obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + assert profile_table + assert profile_table["priority"] == str(profile_map["priority"]) + assert profile_table["cipher_suite"] == profile_map["cipher_suite"] + assert profile_table["primary_cak"] == profile_map["primary_cak"] + assert profile_table["primary_ckn"] == profile_map["primary_ckn"] + assert profile_table["policy"] == profile_map["policy"] + if "enable_replay_protect" in profile_map: + assert "enable_replay_protect" in profile_table and profile_table["enable_replay_protect"] == "true" + assert profile_table["replay_window"] == str(profile_map["replay_window"]) + if "send_sci" in profile_map: + assert profile_table["send_sci"] == "true" + if "no_send_sci" in profile_map: + assert profile_table["send_sci"] == "false" + if "rekey_period" in profile_map: + assert profile_table["rekey_period"] == str(profile_map["rekey_period"]) + + def test_macsec_invalid_profile(self, mock_cfgdb): + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + + # Loss primary cak and primary ckn + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test"], obj=db) + assert result.exit_code != 0 + + # Invalid primary cak + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=abcdfghjk90123456789012345678912","--primary_ckn=01234567890123456789012345678912", "--cipher_suite=GCM-AES-128"], obj=db) + assert result.exit_code != 0 + + # Invalid primary cak length + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912", "--cipher_suite=GCM-AES-256"], obj=db) + assert result.exit_code != 0 + + + def test_macsec_port(self, mock_cfgdb): + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + result = runner.invoke(macsec.macsec.commands["port"].commands["add"], ["Ethernet0", "test"], obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + port_table = db.cfgdb.get_entry("PORT", "Ethernet0") + assert port_table + assert port_table["macsec"] == "test" + + result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], ["test"], obj=db) + assert result.exit_code != 0 + + result = runner.invoke(macsec.macsec.commands["port"].commands["del"], ["Ethernet0"], obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + port_table = db.cfgdb.get_entry("PORT", "Ethernet0") + assert not port_table["macsec"] + + + def test_macsec_invalid_operation(self, mock_cfgdb): + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + + # Enable nonexisted profile + result = runner.invoke(macsec.macsec.commands["port"].commands["add"], ["Ethernet0", "test"], obj=db) + assert result.exit_code != 0 + + # Delete nonexisted profile + result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], ["test"], obj=db) + assert result.exit_code != 0 + + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + # Repeat add profile + result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + assert result.exit_code != 0 diff --git a/dockers/docker-macsec/cli-plugin-tests/test_show_macsec.py b/dockers/docker-macsec/cli-plugin-tests/test_show_macsec.py new file mode 100644 index 000000000000..39b3a39ea7a9 --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/test_show_macsec.py @@ -0,0 +1,25 @@ +import sys +from unittest import mock + +from click.testing import CliRunner + +sys.path.append('../cli/show/plugins/') +import show_macsec + + +class TestShowMACsec(object): + def test_plugin_registration(self): + cli = mock.MagicMock() + show_macsec.register(cli) + cli.add_command.assert_called_once_with(show_macsec.macsec) + + def test_show_all(self): + runner = CliRunner() + result = runner.invoke(show_macsec.macsec,[]) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + + def test_show_one_port(self): + runner = CliRunner() + result = runner.invoke(show_macsec.macsec,["Ethernet1"]) + assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) + diff --git a/dockers/docker-macsec/cli/config/plugins/macsec.py b/dockers/docker-macsec/cli/config/plugins/macsec.py new file mode 100644 index 000000000000..e5bc628b8cd0 --- /dev/null +++ b/dockers/docker-macsec/cli/config/plugins/macsec.py @@ -0,0 +1,181 @@ +import click +import utilities_common.cli as clicommon + +# +# 'macsec' group ('config macsec ...') +# +@click.group(cls=clicommon.AbbreviationGroup, name='macsec') +def macsec(): + """MACsec-related configuration tasks""" + pass + + +# +# 'port' group ('config macsec port ...') +# +@macsec.group(cls=clicommon.AbbreviationGroup, name='port') +def macsec_port(): + """Enable MACsec or disable MACsec on the specified port""" + pass + +# +# 'add' command ('config macsec port add ...') +# +@macsec_port.command('add') +@click.argument('port', metavar='', required=True) +@click.argument('profile', metavar='', required=True) +@clicommon.pass_db +def add_port(db, port, profile): + """ + Add MACsec port + """ + ctx = click.get_current_context() + + if clicommon.get_interface_naming_mode() == "alias": + alias = port + iface_alias_converter = clicommon.InterfaceAliasConverter(db) + port = iface_alias_converter.alias_to_name(alias) + if port is None: + ctx.fail("cannot find port name for alias {}".format(alias)) + + profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + if len(profile_entry) == 0: + ctx.fail("profile {} doesn't exist".format(profile)) + + db.cfgdb.set_entry("PORT", port, {'macsec': profile}) + + +# +# 'del' command ('config macsec port del ...') +# +@macsec_port.command('del') +@click.argument('port', metavar='', required=True) +@clicommon.pass_db +def del_port(db, port): + """ + Delete MACsec port + """ + ctx = click.get_current_context() + + if clicommon.get_interface_naming_mode() == "alias": + alias = port + iface_alias_converter = clicommon.InterfaceAliasConverter(db) + port = iface_alias_converter.alias_to_name(alias) + if port is None: + ctx.fail("cannot find port name for alias {}".format(alias)) + + db.cfgdb.set_entry("PORT", port, {'macsec': ""}) + + +# +# 'profile' group ('config macsec profile ...') +# +@macsec.group(cls=clicommon.AbbreviationGroup, name='profile') +def macsec_profile(): + pass + + +def is_hexstring(hexstring: str): + try: + int(hexstring, 16) + return True + except ValueError: + return False + + +# +# 'add' command ('config macsec profile add ...') +# +@macsec_profile.command('add') +@click.argument('profile', metavar='', required=True) +@click.option('--priority', metavar='', required=False, default=255, show_default=True, type=click.IntRange(0, 255), help="For Key server election. In 0-255 range with 0 being the highest priority.") +@click.option('--cipher_suite', metavar='', required=False, default="GCM-AES-128", show_default=True, type=click.Choice(["GCM-AES-128", "GCM-AES-256", "GCM-AES-XPN-128", "GCM-AES-XPN-256"]), help="The cipher suite for MACsec.") +@click.option('--primary_cak', metavar='', required=True, type=str, help="Primary Connectivity Association Key.") +@click.option('--primary_ckn', metavar='', required=True, type=str, help="Primary CAK Name.") +@click.option('--policy', metavar='', required=False, default="security", show_default=True, type=click.Choice(["integrity_only", "security"]), help="MACsec policy. INTEGRITY_ONLY: All traffic, except EAPOL, will be converted to MACsec packets without encryption. SECURITY: All traffic, except EAPOL, will be encrypted by SecY.") +@click.option('--enable_replay_protect/--disable_replay_protect', metavar='', required=False, default=False, show_default=True, is_flag=True, help="Whether enable replay protect.") +@click.option('--replay_window', metavar='', required=False, default=0, show_default=True, type=click.IntRange(0, 2**32), help="Replay window size that is the number of packets that could be out of order. This field works only if ENABLE_REPLAY_PROTECT is true.") +@click.option('--send_sci/--no_send_sci', metavar='', required=False, default=True, show_default=True, is_flag=True, help="Send SCI in SecTAG field of MACsec header.") +@click.option('--rekey_period', metavar='', required=False, default=0, show_default=True, type=click.IntRange(min=0), help="The period of proactively refresh (Unit second).") +@clicommon.pass_db +def add_profile(db, profile, priority, cipher_suite, primary_cak, primary_ckn, policy, enable_replay_protect, replay_window, send_sci, rekey_period): + """ + Add MACsec profile + """ + ctx = click.get_current_context() + profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + if not len(profile_entry) == 0: + ctx.fail("{} already exists".format(profile)) + + profile_table = {} + + profile_table["priority"] = priority + + profile_table["cipher_suite"] = cipher_suite + + if "128" in cipher_suite: + if len(primary_cak) != 32: + ctx.fail("Expect the length of CAK is 32, but got {}".format(len(primary_cak))) + elif "256" in cipher_suite: + if len(primary_cak) != 64: + ctx.fail("Expect the length of CAK is 64, but got {}".format(len(primary_cak))) + if not is_hexstring(primary_cak): + ctx.fail("Expect the primary_cak is valid hex string") + if not is_hexstring(primary_ckn): + ctx.fail("Expect the primary_ckn is valid hex string") + profile_table["primary_cak"] = primary_cak + profile_table["primary_ckn"] = primary_ckn + + profile_table["policy"] = policy + + if enable_replay_protect and replay_window > 0: + profile_table["enable_replay_protect"] = enable_replay_protect + profile_table["replay_window"] = replay_window + + profile_table["send_sci"] = send_sci + + if rekey_period > 0: + profile_table["rekey_period"] = rekey_period + + for k, v in profile_table.items(): + if isinstance(v, bool): + if v: + profile_table[k] = "true" + else: + profile_table[k] = "false" + else: + profile_table[k] = str(v) + db.cfgdb.set_entry("MACSEC_PROFILE", profile, profile_table) + + +# +# 'del' command ('config macsec profile del ...') +# +@macsec_profile.command('del') +@click.argument('profile', metavar='', required=True) +@clicommon.pass_db +def del_profile(db, profile): + """ + Delete MACsec profile + """ + ctx = click.get_current_context() + + profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + if len(profile_entry) == 0: + ctx.fail("{} doesn't exist".format(profile)) + + # Check if the profile is being used by any port + for port in db.cfgdb.get_keys('PORT'): + attr = db.cfgdb.get_entry('PORT', port) + if 'macsec' in attr and attr['macsec'] == profile: + ctx.fail("{} is being used by port {}, Please remove the MACsec from the port firstly".format(profile, port)) + + db.cfgdb.set_entry("MACSEC_PROFILE", profile, None) + + +def register(cli): + cli.add_command(macsec) + + +if __name__ == '__main__': + macsec() diff --git a/dockers/docker-macsec/cli/show/plugins/show_macsec.py b/dockers/docker-macsec/cli/show/plugins/show_macsec.py new file mode 100644 index 000000000000..538b8947f91d --- /dev/null +++ b/dockers/docker-macsec/cli/show/plugins/show_macsec.py @@ -0,0 +1,217 @@ +import typing +from natsort import natsorted + +import click +from tabulate import tabulate + +from swsscommon.swsscommon import SonicV2Connector + + +DB_CONNECTOR = SonicV2Connector(use_unix_socket_path=False) +DB_CONNECTOR.connect(DB_CONNECTOR.APPL_DB) +DB_CONNECTOR.connect(DB_CONNECTOR.COUNTERS_DB) + + +class MACsecAppMeta(object): + SEPARATOR = DB_CONNECTOR.get_db_separator(DB_CONNECTOR.APPL_DB) + + def __init__(self, *args) -> None: + key = self.__class__.get_appl_table_name() + MACsecAppMeta.SEPARATOR + \ + MACsecAppMeta.SEPARATOR.join(args) + self.meta = DB_CONNECTOR.get_all( + DB_CONNECTOR.APPL_DB, key) + if len(self.meta) == 0: + raise ValueError("No such MACsecAppMeta: {}".format(key)) + for k, v in self.meta.items(): + setattr(self, k, v) + + +class MACsecCounters(object): + def __init__(self, *args) -> None: + key = ":".join(args) + counters_id = DB_CONNECTOR.get( + DB_CONNECTOR.COUNTERS_DB, self.__class__.get_counter_table_name(), key) + counter_key = "COUNTERS:" + counters_id + self.counters = DB_CONNECTOR.get_all( + DB_CONNECTOR.COUNTERS_DB, counter_key) + + +class MACsecSA(MACsecAppMeta, MACsecCounters): + def __init__(self, port_name: str, sci: str, an: str) -> None: + self.port_name = port_name + self.sci = sci + self.an = an + MACsecAppMeta.__init__(self, port_name, sci, an) + MACsecCounters.__init__(self, port_name, sci, an) + + def dump_str(self) -> str: + buffer = self.get_header() + meta = sorted(self.meta.items(), key=lambda x: x[0]) + counters = sorted(self.counters.items(), key=lambda x: x[0]) + buffer += tabulate(meta + counters) + buffer = "\n".join(["\t\t" + line for line in buffer.splitlines()]) + return buffer + + +class MACsecIngressSA(MACsecSA): + def __init__(self, port_name: str, sci: str, an: str) -> None: + super(MACsecIngressSA, self).__init__(port_name, sci, an) + + @classmethod + def get_appl_table_name(cls) -> str: + return "MACSEC_INGRESS_SA_TABLE" + + @classmethod + def get_counter_table_name(cls) -> str: + return "COUNTERS_MACSEC_SA_RX_NAME_MAP" + + def get_header(self): + return "MACsec Ingress SA ({})\n".format(self.an) + + +class MACsecEgressSA(MACsecSA): + def __init__(self, port_name: str, sci: str, an: str) -> None: + super(MACsecEgressSA, self).__init__(port_name, sci, an) + + @classmethod + def get_appl_table_name(cls) -> str: + return "MACSEC_EGRESS_SA_TABLE" + + @classmethod + def get_counter_table_name(cls) -> str: + return "COUNTERS_MACSEC_SA_TX_NAME_MAP" + + def get_header(self): + return "MACsec Egress SA ({})\n".format(self.an) + + +class MACsecSC(MACsecAppMeta): + def __init__(self, port_name: str, sci: str) -> None: + self.port_name = port_name + self.sci = sci + super(MACsecSC, self).__init__(port_name, sci) + + +class MACsecIngressSC(MACsecSC): + def __init__(self, port_name: str, sci: str) -> None: + super(MACsecIngressSC, self).__init__(port_name, sci) + + @classmethod + def get_appl_table_name(cls) -> str: + return "MACSEC_INGRESS_SC_TABLE" + + def dump_str(self) -> str: + buffer = self.get_header() + buffer = "\n".join(["\t" + line for line in buffer.splitlines()]) + return buffer + + def get_header(self): + return "MACsec Ingress SC ({})\n".format(self.sci) + + +class MACsecEgressSC(MACsecSC): + def __init__(self, port_name: str, sci: str) -> None: + super(MACsecEgressSC, self).__init__(port_name, sci) + + @classmethod + def get_appl_table_name(cls) -> str: + return "MACSEC_EGRESS_SC_TABLE" + + def dump_str(self) -> str: + buffer = self.get_header() + buffer += tabulate(sorted(self.meta.items(), key=lambda x: x[0])) + buffer = "\n".join(["\t" + line for line in buffer.splitlines()]) + return buffer + + def get_header(self): + return "MACsec Egress SC ({})\n".format(self.sci) + + +class MACsecPort(MACsecAppMeta): + def __init__(self, port_name: str) -> None: + self.port_name = port_name + super(MACsecPort, self).__init__(port_name) + + @classmethod + def get_appl_table_name(cls) -> str: + return "MACSEC_PORT_TABLE" + + def dump_str(self) -> str: + buffer = self.get_header() + buffer += tabulate(sorted(self.meta.items(), key=lambda x: x[0])) + return buffer + + def get_header(self) -> str: + return "MACsec port({})\n".format(self.port_name) + + +def create_macsec_obj(key: str) -> MACsecAppMeta: + attr = key.split(":") + try: + if attr[0] == MACsecPort.get_appl_table_name(): + return MACsecPort(attr[1]) + elif attr[0] == MACsecIngressSC.get_appl_table_name(): + return MACsecIngressSC(attr[1], attr[2]) + elif attr[0] == MACsecEgressSC.get_appl_table_name(): + return MACsecEgressSC(attr[1], attr[2]) + elif attr[0] == MACsecIngressSA.get_appl_table_name(): + return MACsecIngressSA(attr[1], attr[2], attr[3]) + elif attr[0] == MACsecEgressSA.get_appl_table_name(): + return MACsecEgressSA(attr[1], attr[2], attr[3]) + raise TypeError("Unknown MACsec object type") + except ValueError as e: + return None + +def create_macsec_objs(interface_name: str) -> typing.List[MACsecAppMeta]: + objs = [] + objs.append(create_macsec_obj(MACsecPort.get_appl_table_name() + ":" + interface_name)) + egress_scs = DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, MACsecEgressSC.get_appl_table_name() + ":" + interface_name + ":*") + for sc_name in natsorted(egress_scs): + sc = create_macsec_obj(sc_name) + if sc is None: + continue + objs.append(sc) + egress_sas = DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, MACsecEgressSA.get_appl_table_name() + ":" + ":".join(sc_name.split(":")[1:]) + ":*") + for sa_name in natsorted(egress_sas): + sa = create_macsec_obj(sa_name) + if sa is None: + continue + objs.append(sa) + ingress_scs = DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, MACsecIngressSC.get_appl_table_name() + ":" + interface_name + ":*") + for sc_name in natsorted(ingress_scs): + sc = create_macsec_obj(sc_name) + if sc is None: + continue + objs.append(sc) + ingress_sas = DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, MACsecIngressSA.get_appl_table_name() + ":" + ":".join(sc_name.split(":")[1:]) + ":*") + for sa_name in natsorted(ingress_sas): + sa = create_macsec_obj(sa_name) + if sa is None: + continue + objs.append(sa) + return objs + + +@click.command() +@click.argument('interface_name', required=False) +def macsec(interface_name): + ctx = click.get_current_context() + objs = [] + interface_names = [name.split(":")[1] for name in DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, "MACSEC_PORT*")] + if interface_name is not None: + if interface_name not in interface_names: + ctx.fail("Cannot find the port {} in MACsec port lists {}".format(interface_name, interface_names)) + else: + interface_names = [interface_name] + for interface_name in natsorted(interface_names): + objs += create_macsec_objs(interface_name) + for obj in objs: + print(obj.dump_str()) + + +def register(cli): + cli.add_command(macsec) + + +if __name__ == '__main__': + macsec(None) diff --git a/rules/docker-macsec.mk b/rules/docker-macsec.mk index 7bea7ef321b8..3a6e9a558577 100644 --- a/rules/docker-macsec.mk +++ b/rules/docker-macsec.mk @@ -14,14 +14,25 @@ $(DOCKER_MACSEC)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMA $(DOCKER_MACSEC)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) +$(DOCKER_MACSEC)_INSTALL_PYTHON_WHEELS = $(SONIC_UTILITIES_PY3) +$(DOCKER_MACSEC)_INSTALL_DEBS = $(PYTHON3_SWSSCOMMON) $(LIBYANG_PY3) + SONIC_DOCKER_IMAGES += $(DOCKER_MACSEC) -ifeq ($(INCLUDE_MACSEC), y) -SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_MACSEC) +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_MACSEC_DBG) + +ifeq ($(INCLUDE_KUBERNETES),y) +$(DOCKER_MACSEC)_DEFAULT_FEATURE_OWNER = kube endif -SONIC_DOCKER_DBG_IMAGES += $(DOCKER_MACSEC_DBG) -ifeq ($(INCLUDE_MACSEC), y) -SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_MACSEC_DBG) +$(DOCKER_MACSEC)_DEFAULT_FEATURE_STATE_ENABLED = y + + +ifeq ($(INCLUDE_MACSEC),y) +ifeq ($(INSTALL_DEBUG_TOOLS),y) +SONIC_PACKAGES_LOCAL += $(DOCKER_MACSEC_DBG) +else +SONIC_PACKAGES_LOCAL += $(DOCKER_MACSEC) +endif endif $(DOCKER_MACSEC)_CONTAINER_NAME = macsec @@ -31,7 +42,7 @@ $(DOCKER_MACSEC)_RUN_OPT += --privileged -t $(DOCKER_MACSEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_MACSEC)_RUN_OPT += -v /host/warmboot:/var/warmboot -$(DOCKER_MACSEC)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) +$(DOCKER_MACSEC)_CLI_CONFIG_PLUGIN = /cli/config/plugins/macsec.py +$(DOCKER_MACSEC)_CLI_SHOW_PLUGIN = /cli/show/plugins/show_macsec.py -SONIC_BULLSEYE_DOCKERS += $(DOCKER_MACSEC) -SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_MACSEC_DBG) +$(DOCKER_MACSEC)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) From 70d71f99f573979669808fd89a605832d04f1827 Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Thu, 19 May 2022 17:36:02 +0300 Subject: [PATCH 326/817] [Mellanox] Credo Y-cable | add more log info, checks, fix exception message (#10779) - Why I did it Script fails when there is an exception while reading - How I did it Add more logs and checks. Fix wrong variable naming and messages. - How to verify it Provoke exception while read_eeprom() and check that it is handled properly --- platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 7ebe9d5e5e57..efaf3479b6ed 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -187,7 +187,7 @@ def write_mlxreg_eeprom(self, num_bytes, dword, device_address, page): --set {} -y".format(self.mst_pci_device, self.slot_id, self.sdk_index, device_address, page, num_bytes, dword) subprocess.check_call(cmd, shell=True, universal_newlines=True, stdout=subprocess.DEVNULL) except subprocess.CalledProcessError as e: - logger.log_error("Error! Unable to write data for {} port, page {} offset {}, rc = {}, err msg: {}".format(self.sdk_index, page, device_address, e.returncode, e.output)) + logger.log_error("Error! Unable to write data dword={} for {} port, page {} offset {}, rc = {}, err msg: {}".format(dword, self.sdk_index, page, device_address, e.returncode, e.output)) return False return True @@ -198,11 +198,14 @@ def read_mlxred_eeprom(self, offset, page, num_bytes): --get".format(self.mst_pci_device, self.slot_id, self.sdk_index, offset, page, num_bytes) result = subprocess.check_output(cmd, universal_newlines=True, shell=True) except subprocess.CalledProcessError as e: - logger.log_error("Error! Unable to write data for {} port, page {} offset {}, rc = {}, err msg: {}".format(self.sdk_index, page, device_address, e.returncode, e.output)) + logger.log_error("Error! Unable to read data for {} port, page {} offset {}, rc = {}, err msg: {}".format(self.sdk_index, page, offset, e.returncode, e.output)) return None return result def parse_mlxreg_read_output(self, read_output, num_bytes): + if not read_output: + return None + res = "" dword_num = num_bytes // BYTES_IN_DWORD used_bytes_in_dword = num_bytes % BYTES_IN_DWORD From b21cd709551f87473221a971cfce55a9bf4e4f90 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Fri, 20 May 2022 01:21:11 +0800 Subject: [PATCH 327/817] [Submodule]: update submodule for sonic-swss and sonic-wpa-supplicant (#10842) Signed-off-by: Ze Gan --- src/sonic-swss | 2 +- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 2ea8581da4ba..97b4387ca9f5 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 2ea8581da4ba6f97bebde4845a234d7c810e5515 +Subproject commit 97b4387ca9f527c074878f40a598acad7460a96e diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index f36c8c87702f..639a051357d0 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit f36c8c87702fa1bc6d1f9b7193872285a41bd630 +Subproject commit 639a051357d0e3712c54f7fa975d4ff64733cc38 From f7882b38850f50842103d6b6cad78a3f93a36c6b Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Thu, 19 May 2022 11:15:34 -0700 Subject: [PATCH 328/817] Fix for libsaithrift build for BRCM image (#10852) Updated libsaibcm to fix libsaithrift compile issue on BRCM image --- platform/broadcom/sai.mk | 2 +- slave.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 872c51276fe5..876c7af83850 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,4 +1,4 @@ -LIBSAIBCM_VERSION = 7.1.0.0 +LIBSAIBCM_VERSION = 7.1.0.0-1 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_VERSION)" diff --git a/slave.mk b/slave.mk index 4858e290cd3a..44d9e0ed8849 100644 --- a/slave.mk +++ b/slave.mk @@ -2,7 +2,7 @@ ## Presettings ############################################################################### -# Select bash for commands +# Select bash for commands .ONESHELL: SHELL = /bin/bash .SHELLFLAGS += -e From 937bf09c9207341f9738d7caeca43f102351c11a Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 19 May 2022 14:38:34 -0400 Subject: [PATCH 329/817] {nokia] Update Nokia IXR7250e supervisor card device data (#10595) Signed-off-by: mlok --- device/nokia/x86_64-nokia_ixr7250e_sup-r0/installer.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/installer.conf b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/installer.conf index 21bc03a020bc..6b58d6663580 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/installer.conf +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/installer.conf @@ -1,4 +1,4 @@ -CONSOLE_PORT=0x3f8 +CONSOLE_PORT=0x2f8 CONSOLE_DEV=0 CONSOLE_SPEED=115200 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="amd_iommu=off pci=resource_alignment=26@00:01.4" \ No newline at end of file +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="amd_iommu=off pci=resource_alignment=26@00:01.4" From 4fd629c021de2fb6982cf29a0509169aade2b5e7 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Thu, 19 May 2022 22:51:02 -0700 Subject: [PATCH 330/817] Added Support for BGP allow list feature to have route-map action of setting tag (#10731) What I did: Added support to create route-map action set tag when the the allow prefix list matches. The tag can ben define by user in constants.yml. Why I did: Since for Allow List feature we call from base route-map allow-list route-map having set tag option provides way for base route-map to do match tag and take any further action if needed. Adding tag provide metadata that can used by base route-map --- .../bgpcfgd/managers_allow_list.py | 17 ++++ src/sonic-bgpcfgd/tests/test_allow_list.py | 87 ++++++++++++++++++- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py index e03bb19c163f..209d12fd2f97 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py @@ -40,6 +40,7 @@ def __init__(self, common_objs, db, table): ) self.key_re = re.compile(r"^DEPLOYMENT_ID\|\d+\|\S+$|^DEPLOYMENT_ID\|\d+$") self.enabled = self.__get_enabled() + self.prefix_match_tag = self.__get_routemap_tag() self.__load_constant_lists() def set_handler(self, key, data): @@ -396,6 +397,8 @@ def __update_allow_route_map_entry(self, af, allow_address_pl_name, community_na ] if not community_name.endswith(self.EMPTY_COMMUNITY): cmds.append(" match community %s" % community_name) + elif self.prefix_match_tag: + cmds.append(" set tag %s" % self.prefix_match_tag) return cmds def __update_default_route_map_entry(self, route_map_name, default_action_community): @@ -612,6 +615,20 @@ def __get_route_map_calls(self, rms): inside_name = result.group(1) return rm_2_call + def __get_routemap_tag(self): + """ + Find if any user define tag is provided to be used when allow prefifx list is matched + :return: string: prefix mix tag if define in constants.yml else None + """ + prefix_match_tag = None + if 'bgp' in self.constants and \ + 'allow_list' in self.constants["bgp"] and \ + 'prefix_match_tag' in \ + self.constants["bgp"]["allow_list"]: + prefix_match_tag = \ + self.constants["bgp"]["allow_list"]["prefix_match_tag"] + return prefix_match_tag + @staticmethod def __get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call): """ diff --git a/src/sonic-bgpcfgd/tests/test_allow_list.py b/src/sonic-bgpcfgd/tests/test_allow_list.py index 5207c6283462..e77c692ee593 100644 --- a/src/sonic-bgpcfgd/tests/test_allow_list.py +++ b/src/sonic-bgpcfgd/tests/test_allow_list.py @@ -26,8 +26,26 @@ } } +global_constants_with_prefix_match_tag = { + "bgp": { + "allow_list": { + "enabled": True, + "default_pl_rules": { + "v4": [ "deny 0.0.0.0/0 le 17" ], + "v6": [ + "deny 0::/0 le 59", + "deny 0::/0 ge 65" + ] + }, + "default_action": "permit", + "drop_community": "123:123", + "prefix_match_tag": "1001" + } + } +} + @patch.dict("sys.modules", swsscommon=swsscommon_module_mock) -def set_del_test(op, args, currect_config, expected_config, update_global_default_action=None): +def set_del_test(op, args, currect_config, expected_config, update_global_default_action=None, update_constant_prefix_match_tag=False): from bgpcfgd.managers_allow_list import BGPAllowListMgr set_del_test.push_list_called = False def push_list(args): @@ -45,7 +63,7 @@ def push_list(args): 'directory': Directory(), 'cfg_mgr': cfg_mgr, 'tf': TemplateFabric(), - 'constants': deepcopy(global_constants), + 'constants': deepcopy(global_constants) if not update_constant_prefix_match_tag else deepcopy(global_constants_with_prefix_match_tag) } mgr = BGPAllowListMgr(common_objs, "CONFIG_DB", "BGP_ALLOWED_PREFIXES") @@ -92,6 +110,39 @@ def test_set_handler_with_community(): ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020', ] ) + +def test_set_handler_with_community_and_prefix_match_tag(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5|1010:2020", { + "prefixes_v4": "10.20.30.0/24,30.50.0.0/16", + "prefixes_v6": "fc00:20::/64,fc00:30::/64", + }), + [ + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 65535', + ' set community 123:123 additive' + ], + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 20 permit 10.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4 seq 30 permit 30.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 30 permit fc00:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6 seq 40 permit fc00:30::/64 le 128', + 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020 permit 1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 10', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V4', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 10', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020_V6', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_1010:2020', + ], + None, True + ) + def test_set_handler_with_community_and_permit_action(): set_del_test( "SET", @@ -188,6 +239,38 @@ def test_set_handler_no_community(): ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6', ] ) + +def test_set_handler_no_community_and_prefix_match_tag(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5", { + "prefixes_v4": "20.20.30.0/24,40.50.0.0/16", + "prefixes_v6": "fc01:20::/64,fc01:30::/64", + }), + [ + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 65535', + ' set community 123:123 additive', + ], + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V4 permit 30000', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V4', + ' set tag 1001', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_V6 permit 30000', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_COMMUNITY_empty_V6', + ' set tag 1001', + ], + None,True + ) + def test_set_handler_no_community_with_permit_action(): set_del_test( "SET", From f6927606b3720d4f526b9e734b4431f012d21ee3 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 20 May 2022 14:32:53 +0800 Subject: [PATCH 331/817] [Ci]: Fix to trigger the publish pipeline in failure build issue (#10847) Why I did it It is not necessary to trigger the publish pipeline when build is failed. How I did it Remove the condition in the azp task, change to use template condition. --- .azure-pipelines/azure-pipelines-image-template.yml | 9 +++++---- .azure-pipelines/trigger-publish-artifacts-build.yml | 2 -- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 20bedc8d8084..ae103ed28868 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -58,10 +58,11 @@ jobs: condition: failed() artifact: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)$(System.JobAttempt)' displayName: "Archive failed sonic image" - - template: trigger-publish-artifacts-build.yml - parameters: - artifactName: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' - publishPrefix: '$(Build.DefinitionName)/$(Build.SourceBranchName)/$(GROUP_NAME)' + - ${{ if ne(variables['Build.Reason'], 'PullRequest') }}: + - template: trigger-publish-artifacts-build.yml + parameters: + artifactName: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' + publishPrefix: '$(Build.DefinitionName)/$(Build.SourceBranchName)/$(GROUP_NAME)' - ${{ parameters.postSteps }} - template: cleanup.yml jobGroups: ${{ parameters.jobGroups }} diff --git a/.azure-pipelines/trigger-publish-artifacts-build.yml b/.azure-pipelines/trigger-publish-artifacts-build.yml index 83bbfc1150ce..7a6676e0f1ba 100644 --- a/.azure-pipelines/trigger-publish-artifacts-build.yml +++ b/.azure-pipelines/trigger-publish-artifacts-build.yml @@ -20,10 +20,8 @@ steps: echo "##vso[task.setvariable variable=sonic_version]$sonic_version" echo "##vso[task.setvariable variable=latest_tag]$latest_tag" echo "##vso[task.setvariable variable=docker_tags]$docker_tags" - condition: ne(variables['Build.Reason'], 'PullRequest') displayName: 'Set trigger build variables' - task: TriggerBuild@4 - condition: ne(variables['Build.Reason'], 'PullRequest') inputs: definitionIsInCurrentTeamProject: false teamProject: internal From f37dd770cd28607337aaaadfc4277a8522587141 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Guruswamy <75792349+sg893052@users.noreply.github.com> Date: Sat, 21 May 2022 01:55:11 +0530 Subject: [PATCH 332/817] System Ready (#10479) Why I did it At present, there is no mechanism in an event driven model to know that the system is up 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 HW. But we can get the closest up status of each app and arrive at the system readiness. How I did it A new python based system monitor tool is introduced under system-health framework 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. How to verify it "show system-health sysready-status" click CLI Syslogs for system ready --- files/build_templates/init_cfg.json.j2 | 6 + .../build_templates/sonic_debian_extension.j2 | 3 + ...rvices-data.determine-reboot-cause.service | 1 + .../yang-models/sonic-feature.yang | 7 + .../health_checker/sysmonitor.py | 436 ++++++++++++++++++ src/system-health/scripts/healthd | 5 + src/system-health/tests/mock_connector.py | 9 + src/system-health/tests/test_system_health.py | 215 +++++++++ 8 files changed, 682 insertions(+) create mode 100755 src/system-health/health_checker/sysmonitor.py diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index b51aaf2f0c14..5d44b0a64b9d 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -57,6 +57,12 @@ "has_global_scope": {% if feature + '.service' in installer_services.split(' ') %}true{% else %}false{% endif %}, "has_per_asic_scope": {% if feature + '@.service' in installer_services.split(' ') %}true{% else %}false{% endif %}, "auto_restart": "{{autorestart}}", +{# Set check_up_status to true here when app readiness will be marked in state db #} +{# For now, to support the infrastrucure, setting the check_up_status to false for bgp,swss,pmon #} +{# Once apps like bgp,synd supports app readiness, then bgp,syncd can set check_up_status to true #} +{%- if feature in ["bgp", "swss", "pmon"] %} + "check_up_status" : "false", +{%- endif %} {%- if include_kubernetes == "y" %} {%- if feature in ["lldp", "pmon", "radv", "snmp", "telemetry"] %} "set_owner": "kube", {% else %} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index aebd6b2fcd0d..185184fb91d5 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -890,3 +890,6 @@ sudo cp $BUILD_SCRIPTS_DIR/mask_disabled_services.py $FILESYSTEM_ROOT/tmp/ sudo chmod a+x $FILESYSTEM_ROOT/tmp/mask_disabled_services.py sudo LANG=C chroot $FILESYSTEM_ROOT /tmp/mask_disabled_services.py sudo rm -rf $FILESYSTEM_ROOT/tmp/mask_disabled_services.py + + +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install python3-dbus diff --git a/src/sonic-host-services-data/debian/sonic-host-services-data.determine-reboot-cause.service b/src/sonic-host-services-data/debian/sonic-host-services-data.determine-reboot-cause.service index f0d9e91fe991..50d79b3e7639 100644 --- a/src/sonic-host-services-data/debian/sonic-host-services-data.determine-reboot-cause.service +++ b/src/sonic-host-services-data/debian/sonic-host-services-data.determine-reboot-cause.service @@ -5,6 +5,7 @@ After=rc-local.service database.service [Service] Type=simple +RemainAfterExit=yes ExecStart=/usr/local/bin/determine-reboot-cause [Install] diff --git a/src/sonic-yang-models/yang-models/sonic-feature.yang b/src/sonic-yang-models/yang-models/sonic-feature.yang index be46bef19853..54133ef10612 100644 --- a/src/sonic-yang-models/yang-models/sonic-feature.yang +++ b/src/sonic-yang-models/yang-models/sonic-feature.yang @@ -86,6 +86,13 @@ module sonic-feature{ type feature-owner; default "local"; } + + leaf check_up_status { + description "This configuration controls the system ready tool to check + the app ready/up status"; + type boolean; + default false; + } } } } diff --git a/src/system-health/health_checker/sysmonitor.py b/src/system-health/health_checker/sysmonitor.py new file mode 100755 index 000000000000..a4058f8c09d3 --- /dev/null +++ b/src/system-health/health_checker/sysmonitor.py @@ -0,0 +1,436 @@ +#!/usr/bin/python3 + +import os +import sys +import glob +import multiprocessing +from datetime import datetime +from swsscommon import swsscommon +from sonic_py_common.logger import Logger +from . import utils +from sonic_py_common.task_base import ProcessTaskBase +from .config import Config + +SYSLOG_IDENTIFIER = "system#monitor" +REDIS_TIMEOUT_MS = 0 +system_allsrv_state = "DOWN" +spl_srv_list = ['database-chassis', 'gbsyncd'] +SELECT_TIMEOUT_MSECS = 1000 +QUEUE_TIMEOUT = 15 +TASK_STOP_TIMEOUT = 10 +mpmgr = multiprocessing.Manager() +logger = Logger(log_identifier=SYSLOG_IDENTIFIER) + + +#Subprocess which subscribes to STATE_DB FEATURE table for any update +#and push service events to main process via queue +class MonitorStateDbTask(ProcessTaskBase): + + def __init__(self,myQ): + ProcessTaskBase.__init__(self) + self.task_queue = myQ + + def subscribe_statedb(self): + state_db = swsscommon.DBConnector("STATE_DB", REDIS_TIMEOUT_MS, True) + sel = swsscommon.Select() + cst = swsscommon.SubscriberStateTable(state_db, "FEATURE") + sel.addSelectable(cst) + + while not self.task_stopping_event.is_set(): + (state, c) = sel.select(SELECT_TIMEOUT_MSECS) + if state == swsscommon.Select.TIMEOUT: + continue + if state != swsscommon.Select.OBJECT: + logger.log_warning("sel.select() did not return swsscommon.Select.OBJECT") + continue + (key, op, cfvs) = cst.pop() + key_ext = key + ".service" + timestamp = "{}".format(datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")) + msg={"unit": key_ext, "evt_src":"feature", "time":timestamp} + self.task_notify(msg) + + + def task_worker(self): + if self.task_stopping_event.is_set(): + return + try: + self.subscribe_statedb() + except Exception as e: + logger.log_error("subscribe_statedb exited- {}".format(str(e))) + + def task_notify(self, msg): + if self.task_stopping_event.is_set(): + return + self.task_queue.put(msg) + + +#Subprocess which subscribes to system dbus to listen for systemd events +#and push service events to main process via queue +class MonitorSystemBusTask(ProcessTaskBase): + + def __init__(self,myQ): + ProcessTaskBase.__init__(self) + self.task_queue = myQ + + def on_job_removed(self, id, job, unit, result): + if result == "done": + timestamp = "{}".format(datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")) + msg = {"unit": unit, "evt_src":"sysbus", "time":timestamp} + self.task_notify(msg) + return + + #Function for listening the systemd event on dbus + def subscribe_sysbus(self): + import dbus + from gi.repository import GLib + from dbus.mainloop.glib import DBusGMainLoop + + DBusGMainLoop(set_as_default=True) + bus = dbus.SystemBus() + systemd = bus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1') + manager = dbus.Interface(systemd, 'org.freedesktop.systemd1.Manager') + manager.Subscribe() + manager.connect_to_signal('JobRemoved', self.on_job_removed) + + loop = GLib.MainLoop() + loop.run() + + def task_worker(self): + if self.task_stopping_event.is_set(): + return + logger.log_info("Start Listening to systemd bus (pid {0})".format(os.getpid())) + self.subscribe_sysbus() + + def task_notify(self, msg): + if self.task_stopping_event.is_set(): + return + self.task_queue.put(msg) + +#Mainprocess which launches 2 subtasks - systembus task and statedb task +#and on receiving events, checks and updates the system ready status to state db +class Sysmonitor(ProcessTaskBase): + + def __init__(self): + ProcessTaskBase.__init__(self) + self._stop_timeout_secs = TASK_STOP_TIMEOUT + self.dnsrvs_name = set() + self.state_db = None + self.config_db = None + self.config = Config() + + #Sets system ready status to state db + def post_system_status(self, state): + try: + if not self.state_db: + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1') + self.state_db.connect(self.state_db.STATE_DB) + + self.state_db.set(self.state_db.STATE_DB, "SYSTEM_READY|SYSTEM_STATE", "Status", state) + logger.log_info("Posting system ready status {} to statedb".format(state)) + + except Exception as e: + logger.log_error("Unable to post system ready status: {}".format(str(e))) + + #Forms the service list to be monitored + def get_all_service_list(self): + + if not self.config_db: + self.config_db = swsscommon.ConfigDBConnector() + self.config_db.connect() + + dir_list = [] + #add the services from the below targets + targets= ["/etc/systemd/system/multi-user.target.wants", "/etc/systemd/system/sonic.target.wants"] + for path in targets: + dir_list += [os.path.basename(i) for i in glob.glob('{}/*.service'.format(path))] + + #add the enabled docker services from config db feature table + feature_table = self.config_db.get_table("FEATURE") + for srv in feature_table.keys(): + if feature_table[srv]["state"] not in ["disabled", "always_disabled"]: + srvext = srv + ".service" + if srvext not in dir_list: + dir_list.append(srvext) + + self.config.load_config() + if self.config and self.config.ignore_services: + for srv in self.config.ignore_services: + if srv in dir_list: + dir_list.remove(srv) + + dir_list.sort() + return dir_list + + + #Checks FEATURE table from config db for the service' check_up_status flag + #if marked to true, then read the service up_status from FEATURE table of state db. + #else, just return Up + def get_app_ready_status(self, service): + if not self.state_db: + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1') + self.state_db.connect(self.state_db.STATE_DB) + if not self.config_db: + self.config_db = swsscommon.ConfigDBConnector() + self.config_db.connect() + + fail_reason = "" + check_app_up_status = "" + up_status_flag = "" + configdb_feature_table = self.config_db.get_table('FEATURE') + update_time = "-" + + if service not in configdb_feature_table.keys(): + pstate = "Up" + else: + check_app_up_status = configdb_feature_table[service].get('check_up_status') + if check_app_up_status is not None and (check_app_up_status.lower()) == "true": + up_status_flag = self.state_db.get(self.state_db.STATE_DB, 'FEATURE|{}'.format(service), 'up_status') + if up_status_flag is not None and (up_status_flag.lower()) == "true": + pstate = "Up" + else: + fail_reason = self.state_db.get(self.state_db.STATE_DB, 'FEATURE|{}'.format(service), 'fail_reason') + if fail_reason is None: + fail_reason = "NA" + pstate = "Down" + + update_time = self.state_db.get(self.state_db.STATE_DB, 'FEATURE|{}'.format(service), 'update_time') + if update_time is None: + update_time = "-" + else: + #Either check_up_status marked False or entry does not exist + pstate = "Up" + + return pstate,fail_reason,update_time + + #Gets the service properties + def run_systemctl_show(self, service): + command = ('systemctl show {} --property=Id,LoadState,UnitFileState,Type,ActiveState,SubState,Result'.format(service)) + output = utils.run_command(command) + srv_properties = output.split('\n') + prop_dict = {} + for prop in srv_properties: + kv = prop.split("=", 1) + if len(kv) == 2: + prop_dict[kv[0]] = kv[1] + + return prop_dict + + #Sets the service status to state db + def post_unit_status(self, srv_name, srv_status, app_status, fail_reason, update_time): + if not self.state_db: + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1') + self.state_db.connect(self.state_db.STATE_DB) + + key = 'ALL_SERVICE_STATUS|{}'.format(srv_name) + statusvalue = {} + statusvalue['service_status'] = srv_status + statusvalue['app_ready_status'] = app_status + statusvalue['fail_reason'] = fail_reason + statusvalue['update_time'] = update_time + self.state_db.hmset(self.state_db.STATE_DB, key, statusvalue) + + #Reads the current status of the service and posts it to state db + def get_unit_status(self, event): + """ Get a unit status""" + global spl_srv_list + unit_status = "NOT OK" + update_time = "-" + + try: + service_status = "Down" + service_up_status = "Down" + service_name,last_name = event.split('.') + + sysctl_show = self.run_systemctl_show(event) + + load_state = sysctl_show['LoadState'] + if load_state == "loaded": + status = sysctl_show['UnitFileState'] + fail_reason = sysctl_show['Result'] + active_state = sysctl_show['ActiveState'] + sub_state = sysctl_show['SubState'] + srv_type = sysctl_show['Type'] + + #Raise syslog for service state change + logger.log_info("{} service state changed to [{}/{}]".format(event, active_state, sub_state)) + + if status == "enabled" or status == "enabled-runtime" or status == "static": + if fail_reason == "success": + fail_reason = "-" + if (active_state == "active" and sub_state == "exited"): + service_status = "OK" + service_up_status = "OK" + unit_status = "OK" + elif active_state == "active" and sub_state == "running": + service_status = "OK" + init_state,app_fail_reason,update_time = self.get_app_ready_status(service_name) + if init_state == "Up": + service_up_status = "OK" + unit_status = "OK" + else: + fail_reason = app_fail_reason + unit_status = "NOT OK" + if fail_reason == "docker start": + service_up_status = "Starting" + fail_reason = "-" + elif active_state == "activating": + service_status = "Starting" + service_up_status = "Starting" + elif active_state == "deactivating": + service_status = "Stopping" + service_up_status = "Stopping" + elif active_state == "inactive": + if srv_type == "oneshot" or service_name in spl_srv_list: + service_status = "OK" + service_up_status = "OK" + unit_status = "OK" + else: + unit_status = "NOT OK" + if fail_reason == "-": + fail_reason = "Inactive" + else: + unit_status = "NOT OK" + + self.post_unit_status(service_name, service_status, service_up_status, fail_reason, update_time) + + return unit_status + + except Exception as e: + logger.log_error("Get unit status {}-{}".format(service_name, str(e))) + + + #Gets status of all the services from service list + def get_all_system_status(self): + """ Shows the system ready status""" + #global dnsrvs_name + scan_srv_list = [] + + scan_srv_list = self.get_all_service_list() + for service in scan_srv_list: + ustate = self.get_unit_status(service) + if ustate == "NOT OK": + if service not in self.dnsrvs_name: + self.dnsrvs_name.add(service) + + if len(self.dnsrvs_name) == 0: + return "UP" + else: + return "DOWN" + + #Displays the system ready status message on console + def print_console_message(self, message): + with open('/dev/console', 'w') as console: + console.write("\n{} {}\n".format(datetime.now().strftime("%b %d %H:%M:%S.%f"), message)) + + #Publish the system ready status message on logger,console and state db + def publish_system_status(self, astate): + global system_allsrv_state + if system_allsrv_state != astate: + system_allsrv_state = astate + if astate == "DOWN": + msg = "System is not ready - one or more services are not up" + elif astate == "UP": + msg = "System is ready" + logger.log_notice(msg) + self.print_console_message(msg) + self.post_system_status(astate) + + #Checks all the services and updates the current system status + def update_system_status(self): + try: + astate = self.get_all_system_status() + self.publish_system_status(astate) + + except Exception as e: + logger.log_error("update system status exception:{}".format(str(e))) + + #Checks a service status and updates the system status + def check_unit_status(self, event): + #global dnsrvs_name + if not self.state_db: + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1') + self.state_db.connect(self.state_db.STATE_DB) + astate = "DOWN" + + full_srv_list = self.get_all_service_list() + if event in full_srv_list: + ustate = self.get_unit_status(event) + if ustate == "OK" and system_allsrv_state == "UP": + astate = "UP" + elif ustate == "OK" and system_allsrv_state == "DOWN": + if event in self.dnsrvs_name: + self.dnsrvs_name.remove(event) + if len(self.dnsrvs_name) == 0: + astate = "UP" + else: + astate = "DOWN" + else: + if event not in self.dnsrvs_name: + self.dnsrvs_name.add(event) + astate = "DOWN" + + self.publish_system_status(astate) + else: + #if received event is not in current full service list but exists in STATE_DB & set, + #then it should be removed from STATE_DB & set + if event in self.dnsrvs_name: + self.dnsrvs_name.remove(event) + + srv_name,last = event.split('.') + key = 'ALL_SERVICE_STATUS|{}'.format(srv_name) + key_exists = self.state_db.exists(self.state_db.STATE_DB, key) + if key_exists == 1: + self.state_db.delete(self.state_db.STATE_DB, key) + + return 0 + + def system_service(self): + if not self.state_db: + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1') + self.state_db.connect(self.state_db.STATE_DB) + + myQ = mpmgr.Queue() + try: + monitor_system_bus = MonitorSystemBusTask(myQ) + monitor_system_bus.task_run() + + monitor_statedb_table = MonitorStateDbTask(myQ) + monitor_statedb_table.task_run() + + except Exception as e: + logger.log_error("SubProcess-{}".format(str(e))) + sys.exit(1) + + + self.update_system_status() + + from queue import Empty + # Queue to receive the STATEDB and Systemd state change event + while not self.task_stopping_event.is_set(): + try: + msg = myQ.get(timeout=QUEUE_TIMEOUT) + event = msg["unit"] + event_src = msg["evt_src"] + event_time = msg["time"] + logger.log_debug("Main process- received event:{} from source:{} time:{}".format(event,event_src,event_time)) + logger.log_info("check_unit_status for [ "+event+" ] ") + self.check_unit_status(event) + except Empty: + pass + except Exception as e: + logger.log_error("system_service"+str(e)) + + #cleanup tables "'ALL_SERVICE_STATUS*', 'SYSTEM_READY*'" from statedb + self.state_db.delete_all_by_pattern(self.state_db.STATE_DB, "ALL_SERVICE_STATUS|*") + self.state_db.delete_all_by_pattern(self.state_db.STATE_DB, "SYSTEM_READY|*") + + monitor_system_bus.task_stop() + monitor_statedb_table.task_stop() + + def task_worker(self): + if self.task_stopping_event.is_set(): + return + self.system_service() + + + diff --git a/src/system-health/scripts/healthd b/src/system-health/scripts/healthd index dd276df2fafd..df52969d3aff 100644 --- a/src/system-health/scripts/healthd +++ b/src/system-health/scripts/healthd @@ -12,6 +12,8 @@ from sonic_py_common.daemon_base import DaemonBase from swsscommon.swsscommon import SonicV2Connector from health_checker.manager import HealthCheckerManager +from health_checker.sysmonitor import Sysmonitor + SYSLOG_IDENTIFIER = 'healthd' @@ -75,6 +77,8 @@ class HealthDaemon(DaemonBase): if not manager.config.config_file_exists(): self.log_warning("System health configuration file not found, exit...") return + sysmon = Sysmonitor() + sysmon.task_run() while 1: stat = manager.check(chassis) self._process_stat(chassis, manager.config, stat) @@ -85,6 +89,7 @@ class HealthDaemon(DaemonBase): self.log_warning("sonic_platform package not installed. Cannot start system-health daemon") self.deinit() + sysmon.task_stop() def _process_stat(self, chassis, config, stat): from health_checker.health_checker import HealthChecker diff --git a/src/system-health/tests/mock_connector.py b/src/system-health/tests/mock_connector.py index d32017ff8485..d602c8eaf165 100644 --- a/src/system-health/tests/mock_connector.py +++ b/src/system-health/tests/mock_connector.py @@ -22,3 +22,12 @@ def keys(self, db_id, pattern): def get_all(self, db_id, key): return MockConnector.data[key] + + def set(self, db_id, key, field, value): + self.data[key] = {} + self.data[key][field] = value + + def hmset(self, db_id, key, fieldsvalues): + self.data[key] = {} + for field,value in fieldsvalues.items(): + self.data[key][field] = value diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index 14d58c0f44b5..76f3ceea5d3f 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -3,6 +3,7 @@ 1. test_user_defined_checker mocks the output of a user defined checker and verify class UserDefinedChecker 2. test_service_checker mocks the output of monit service and verify class ServiceChecker 3. test_hardware_checker mocks the hardware status data in db and verify class HardwareChecker + 4. Mocks and tests the system ready status and verify class Sysmonitor And there are class that are not covered by unit test. These class will be covered by sonic-mgmt regression test. 1. HealthDaemon 2. HealthCheckerManager @@ -30,6 +31,9 @@ from health_checker.manager import HealthCheckerManager from health_checker.service_checker import ServiceChecker from health_checker.user_defined_checker import UserDefinedChecker +from health_checker.sysmonitor import Sysmonitor +from health_checker.sysmonitor import MonitorStateDbTask +from health_checker.sysmonitor import MonitorSystemBusTask mock_supervisorctl_output = """ snmpd RUNNING pid 67, uptime 1:03:56 @@ -505,3 +509,214 @@ def test_utils(): output = utils.run_command('ls') assert output + + +@patch('swsscommon.swsscommon.ConfigDBConnector.connect', MagicMock()) +@patch('sonic_py_common.multi_asic.is_multi_asic', MagicMock(return_value=False)) +@patch('docker.DockerClient') +@patch('health_checker.utils.run_command') +@patch('swsscommon.swsscommon.ConfigDBConnector') +def test_get_all_service_list(mock_config_db, mock_run, mock_docker_client): + mock_db_data = MagicMock() + mock_get_table = MagicMock() + mock_db_data.get_table = mock_get_table + mock_config_db.return_value = mock_db_data + mock_get_table.return_value = { + 'radv': { + 'state': 'enabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + }, + 'bgp': { + 'state': 'enabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + }, + 'pmon': { + 'state': 'disabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + } + } + sysmon = Sysmonitor() + print("mock get table:{}".format(mock_get_table.return_value)) + result = sysmon.get_all_service_list() + print("result get all service list:{}".format(result)) + assert 'radv.service' in result + assert 'pmon.service' not in result + + +@patch('swsscommon.swsscommon.ConfigDBConnector.connect', MagicMock()) +@patch('sonic_py_common.multi_asic.is_multi_asic', MagicMock(return_value=False)) +@patch('docker.DockerClient') +@patch('health_checker.utils.run_command') +@patch('swsscommon.swsscommon.ConfigDBConnector') +def test_get_app_ready_status(mock_config_db, mock_run, mock_docker_client): + mock_db_data = MagicMock() + mock_get_table = MagicMock() + mock_db_data.get_table = mock_get_table + mock_config_db.return_value = mock_db_data + mock_get_table.return_value = { + 'radv': { + 'state': 'enabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + 'check_up_status': 'True' + }, + 'bgp': { + 'state': 'enabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + 'check_up_status': 'True' + }, + 'snmp': { + 'state': 'enabled', + 'has_global_scope': 'True', + 'has_per_asic_scope': 'False', + 'check_up_status': 'False' + } + } + + MockConnector.data.update({ + 'FEATURE|radv': { + 'up_status': 'True', + 'fail_reason': '-', + 'update_time': '-' + }, + 'FEATURE|bgp': { + 'up_status': 'False', + 'fail_reason': 'some error', + 'update_time': '-' + }}) + + sysmon = Sysmonitor() + result = sysmon.get_app_ready_status('radv') + print(result) + assert 'Up' in result + result = sysmon.get_app_ready_status('bgp') + print(result) + assert 'Down' in result + result = sysmon.get_app_ready_status('snmp') + print(result) + assert 'Up' in result + + +mock_srv_props={ +'mock_radv.service':{'Type': 'simple', 'Result': 'success', 'Id': 'mock_radv.service', 'LoadState': 'loaded', 'ActiveState': 'active', 'SubState': 'running', 'UnitFileState': 'enabled'}, +'mock_bgp.service':{'Type': 'simple', 'Result': 'success', 'Id': 'mock_bgp.service', 'LoadState': 'loaded', 'ActiveState': 'inactive', 'SubState': 'dead', 'UnitFileState': 'enabled'} +} + +@patch('health_checker.sysmonitor.Sysmonitor.get_all_service_list', MagicMock(return_value=['mock_snmp.service', 'mock_bgp.service', 'mock_ns.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.run_systemctl_show', MagicMock(return_value=mock_srv_props['mock_bgp.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value=('Down','-','-'))) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +def test_check_unit_status(): + sysmon = Sysmonitor() + sysmon.check_unit_status('mock_bgp.service') + assert 'mock_bgp.service' in sysmon.dnsrvs_name + + + +@patch('health_checker.sysmonitor.Sysmonitor.run_systemctl_show', MagicMock(return_value=mock_srv_props['mock_radv.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value=('Up','-','-'))) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +def test_get_unit_status_ok(): + sysmon = Sysmonitor() + result = sysmon.get_unit_status('mock_radv.service') + print("get_unit_status:{}".format(result)) + assert result == 'OK' + + +@patch('health_checker.sysmonitor.Sysmonitor.run_systemctl_show', MagicMock(return_value=mock_srv_props['mock_bgp.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value=('Up','-','-'))) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +def test_get_unit_status_not_ok(): + sysmon = Sysmonitor() + result = sysmon.get_unit_status('mock_bgp.service') + print("get_unit_status:{}".format(result)) + assert result == 'NOT OK' + + +@patch('health_checker.sysmonitor.Sysmonitor.get_all_service_list', MagicMock(return_value=['mock_snmp.service', 'mock_ns.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_unit_status', MagicMock(return_value= 'OK')) +@patch('health_checker.sysmonitor.Sysmonitor.publish_system_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value='Up')) +def test_get_all_system_status_ok(): + sysmon = Sysmonitor() + result = sysmon.get_all_system_status() + print("result:{}".format(result)) + assert result == 'UP' + + +@patch('health_checker.sysmonitor.Sysmonitor.get_all_service_list', MagicMock(return_value=['mock_snmp.service', 'mock_ns.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_unit_status', MagicMock(return_value= 'NOT OK')) +@patch('health_checker.sysmonitor.Sysmonitor.publish_system_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value='Up')) +def test_get_all_system_status_not_ok(): + sysmon = Sysmonitor() + result = sysmon.get_all_system_status() + print("result:{}".format(result)) + assert result == 'DOWN' + +def test_post_unit_status(): + sysmon = Sysmonitor() + sysmon.post_unit_status("mock_bgp", 'OK', 'Down', 'mock reason', '-') + result = swsscommon.SonicV2Connector.get_all(MockConnector, 0, 'ALL_SERVICE_STATUS|mock_bgp') + print(result) + assert result['service_status'] == 'OK' + assert result['app_ready_status'] == 'Down' + assert result['fail_reason'] == 'mock reason' + +def test_post_system_status(): + sysmon = Sysmonitor() + sysmon.post_system_status("UP") + result = swsscommon.SonicV2Connector.get(MockConnector, 0, "SYSTEM_READY|SYSTEM_STATE", 'Status') + print("post system status result:{}".format(result)) + assert result == "UP" + +@patch('health_checker.sysmonitor.Sysmonitor.publish_system_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.post_system_status', test_post_system_status()) +@patch('health_checker.sysmonitor.Sysmonitor.print_console_message', MagicMock()) +def test_publish_system_status(): + sysmon = Sysmonitor() + sysmon.publish_system_status('UP') + result = swsscommon.SonicV2Connector.get(MockConnector, 0, "SYSTEM_READY|SYSTEM_STATE", 'Status') + assert result == "UP" + +@patch('health_checker.sysmonitor.Sysmonitor.get_all_system_status', test_get_all_system_status_ok()) +@patch('health_checker.sysmonitor.Sysmonitor.publish_system_status', test_publish_system_status()) +def test_update_system_status(): + sysmon = Sysmonitor() + sysmon.update_system_status() + result = swsscommon.SonicV2Connector.get(MockConnector, 0, "SYSTEM_READY|SYSTEM_STATE", 'Status') + assert result == "UP" + +from sonic_py_common.task_base import ProcessTaskBase +import multiprocessing +mpmgr = multiprocessing.Manager() + +myQ = mpmgr.Queue() +def test_monitor_statedb_task(): + sysmon = MonitorStateDbTask(myQ) + sysmon.SubscriberStateTable = MagicMock() + sysmon.task_run() + assert sysmon._task_process is not None + sysmon.task_stop() + +@patch('health_checker.sysmonitor.MonitorSystemBusTask.subscribe_sysbus', MagicMock()) +def test_monitor_sysbus_task(): + sysmon = MonitorSystemBusTask(myQ) + sysmon.SubscriberStateTable = MagicMock() + sysmon.task_run() + assert sysmon._task_process is not None + sysmon.task_stop() + +@patch('health_checker.sysmonitor.MonitorSystemBusTask.subscribe_sysbus', MagicMock()) +@patch('health_checker.sysmonitor.MonitorStateDbTask.subscribe_statedb', MagicMock()) +def test_system_service(): + sysmon = Sysmonitor() + sysmon.task_run() + assert sysmon._task_process is not None + sysmon.task_stop() From 392899682f0d8b5f84f5635b0868a51f64177198 Mon Sep 17 00:00:00 2001 From: Maxime Lorrillere Date: Fri, 20 May 2022 14:11:06 -0700 Subject: [PATCH 333/817] [Arista] Add support for Wolverine linecards (#8887) Add support for WolverineQCpu, WolverineQCpuMs, WolverineQCpuBk, WolverineQCpuBkMs Co-authored-by: Maxime Lorrillere --- .../Arista-7800R3A-36D-C72 | 1 + .../0/context_config.json | 25 + .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 996 ++++++++++++++++++ .../Arista-7800R3A-36D2-C72/0/port_config.ini | 39 + .../Arista-7800R3A-36D2-C72/0/sai.profile | 2 + .../1/context_config.json | 1 + .../1/j2p-a7800r3a-36d-36x400G.config.bcm | 996 ++++++++++++++++++ .../Arista-7800R3A-36D2-C72/1/port_config.ini | 39 + .../Arista-7800R3A-36D2-C72/1/sai.profile | 1 + .../Arista-7800R3A-36D2-C72/port_config.ini | 77 ++ .../Arista-7800R3A-36DM2-C72 | 1 + .../Arista-7800R3A-36P-C72 | 1 + .../Arista-7800R3AK-36D2-C72 | 1 + .../Arista-7800R3AK-36DM2-C72 | 1 + .../x86_64-arista_7800r3a_36d2_lc/asic.conf | 3 + .../chassisdb.conf | 2 + .../x86_64-arista_7800r3a_36d2_lc/pcie.yaml | 246 +++++ .../platform_asic | 1 + .../platform_env.conf | 2 + .../x86_64-arista_7800r3a_36d2_lc/plugins | 1 + .../pmon_daemon_control.json | 1 + .../sensors.conf | 6 + .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + device/arista/x86_64-arista_7800r3a_36d_lc | 1 + device/arista/x86_64-arista_7800r3a_36dm2_lc | 1 + device/arista/x86_64-arista_7800r3a_36p_lc | 1 + device/arista/x86_64-arista_7800r3ak_36d2_lc | 1 + device/arista/x86_64-arista_7800r3ak_36dm2_lc | 1 + files/Aboot/boot0.j2 | 16 + 30 files changed, 2466 insertions(+) create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D-C72 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/context_config.json create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/port_config.ini create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/sai.profile create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/context_config.json create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/port_config.ini create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/sai.profile create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/port_config.ini create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36DM2-C72 create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36P-C72 create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36D2-C72 create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36DM2-C72 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/asic.conf create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/chassisdb.conf create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/pcie.yaml create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/platform_asic create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/platform_env.conf create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/plugins create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/pmon_daemon_control.json create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/sensors.conf create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7800r3a_36d2_lc/thermal_policy.json create mode 120000 device/arista/x86_64-arista_7800r3a_36d_lc create mode 120000 device/arista/x86_64-arista_7800r3a_36dm2_lc create mode 120000 device/arista/x86_64-arista_7800r3a_36p_lc create mode 120000 device/arista/x86_64-arista_7800r3ak_36d2_lc create mode 120000 device/arista/x86_64-arista_7800r3ak_36dm2_lc diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D-C72 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D-C72 new file mode 120000 index 000000000000..762deebff6a7 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D-C72 @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/context_config.json b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/context_config.json new file mode 100644 index 000000000000..2c126e71899e --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/context_config.json @@ -0,0 +1,25 @@ +{ + "CONTEXTS": [ + { + "guid" : 0, + "name" : "syncd", + "dbAsic" : "ASIC_DB", + "dbCounters" : "COUNTERS_DB", + "dbFlex": "FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable": false, + "zmq_endpoint": "tcp://127.0.0.1:5555", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5556", + "switches": [ + { + "index" : 0, + "hwinfo" : "06:00.0" + }, + { + "index" : 1, + "hwinfo" : "07:00.0" + } + ] + } + ] +} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm new file mode 100644 index 000000000000..8d13e2ca43f3 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -0,0 +1,996 @@ +soc_family=BCM8885X + +dpp_db_path=/usr/share/bcm/db + +#################################################### +##Reference applications related properties - Start +#################################################### + +## PMF small EXEM connected stage: +# Options: IPMF2 - Ingress PMF 2 stage can perform small EXEM lookups. +# IPMF3 - Ingress PMF 3 stage can perform small EXEM lookups. +## PMF small EXEM connected stage: +# Options: IPMF2 - Ingress PMF 2 stage can perform small EXEM lookups. +# IPMF3 - Ingress PMF 3 stage can perform small EXEM lookups. +pmf_sexem3_stage=IPMF2 + +#################################################### +##Reference applications related properties - End +#################################################### + +# Jericho2-mode (description 0x1 used for Jericho 2 mode) +system_headers_mode=1 + +# Disable link-training +port_init_cl72=0 + +###Default interfaces for Jericho2Plus +#CPU interfaces +ucode_port_0=CPU.0:core_0.0 +ucode_port_200=CPU.8:core_1.200 +ucode_port_201=CPU.16:core_0.201 +ucode_port_202=CPU.24:core_1.202 +ucode_port_203=CPU.32:core_0.203 + +#NIF ETH interfaces on device +ucode_port_1=CGE18:core_1.1 +ucode_port_2=CGE19:core_1.2 +ucode_port_3=CGE20:core_1.3 +ucode_port_4=CGE21:core_1.4 +ucode_port_5=CGE22:core_1.5 +ucode_port_6=CGE23:core_1.6 +ucode_port_7=CGE24:core_1.7 +ucode_port_8=CGE25:core_1.8 +ucode_port_9=CGE26:core_1.9 +ucode_port_10=CGE27:core_1.10 +ucode_port_11=CGE28:core_1.11 +ucode_port_12=CGE29:core_1.12 +ucode_port_13=CGE30:core_1.13 +ucode_port_14=CGE31:core_1.14 +ucode_port_15=CGE32:core_1.15 +ucode_port_16=CGE33:core_1.16 +ucode_port_17=CGE34:core_1.17 +ucode_port_18=CGE35:core_1.18 + +ucode_port_19=CGE16:core_0.19 +ucode_port_20=CGE17:core_0.20 +ucode_port_21=CGE14:core_0.21 +ucode_port_22=CGE15:core_0.22 +ucode_port_23=CGE12:core_0.23 +ucode_port_24=CGE13:core_0.24 +ucode_port_25=CGE10:core_0.25 +ucode_port_26=CGE11:core_0.26 +ucode_port_27=CGE8:core_0.27 +ucode_port_28=CGE9:core_0.28 +ucode_port_29=CGE6:core_0.29 +ucode_port_30=CGE7:core_0.30 +ucode_port_31=CGE4:core_0.31 +ucode_port_32=CGE5:core_0.32 +ucode_port_33=CGE2:core_0.33 +ucode_port_34=CGE3:core_0.34 +ucode_port_35=CGE0:core_0.35 +ucode_port_36=CGE1:core_0.36 + +#NIF default speeds +port_init_speed_xe=10000 +port_init_speed_xl=40000 +port_init_speed_le=50000 +port_init_speed_ce=100000 +port_init_speed_cc=200000 +port_init_speed_cd=400000 +port_init_speed_il=10312 + +port_priorities=8 + +#special ports +ucode_port_240=OLP:core_0.240 + +# NIF lane mapping +lane_to_serdes_map_nif_lane0=rx3:tx4 +lane_to_serdes_map_nif_lane1=rx6:tx1 +lane_to_serdes_map_nif_lane2=rx7:tx5 +lane_to_serdes_map_nif_lane3=rx4:tx7 +lane_to_serdes_map_nif_lane4=rx1:tx2 +lane_to_serdes_map_nif_lane5=rx0:tx0 +lane_to_serdes_map_nif_lane6=rx5:tx3 +lane_to_serdes_map_nif_lane7=rx2:tx6 +lane_to_serdes_map_nif_lane8=rx10:tx11 +lane_to_serdes_map_nif_lane9=rx8:tx8 +lane_to_serdes_map_nif_lane10=rx14:tx12 +lane_to_serdes_map_nif_lane11=rx15:tx15 +lane_to_serdes_map_nif_lane12=rx13:tx10 +lane_to_serdes_map_nif_lane13=rx9:tx9 +lane_to_serdes_map_nif_lane14=rx11:tx13 +lane_to_serdes_map_nif_lane15=rx12:tx14 +lane_to_serdes_map_nif_lane16=rx16:tx17 +lane_to_serdes_map_nif_lane17=rx19:tx21 +lane_to_serdes_map_nif_lane18=rx21:tx18 +lane_to_serdes_map_nif_lane19=rx18:tx16 +lane_to_serdes_map_nif_lane20=rx17:tx23 +lane_to_serdes_map_nif_lane21=rx20:tx22 +lane_to_serdes_map_nif_lane22=rx22:tx20 +lane_to_serdes_map_nif_lane23=rx23:tx19 +lane_to_serdes_map_nif_lane24=rx26:tx28 +lane_to_serdes_map_nif_lane25=rx29:tx31 +lane_to_serdes_map_nif_lane26=rx31:tx29 +lane_to_serdes_map_nif_lane27=rx28:tx27 +lane_to_serdes_map_nif_lane28=rx25:tx25 +lane_to_serdes_map_nif_lane29=rx24:tx30 +lane_to_serdes_map_nif_lane30=rx30:tx24 +lane_to_serdes_map_nif_lane31=rx27:tx26 +lane_to_serdes_map_nif_lane32=rx32:tx39 +lane_to_serdes_map_nif_lane33=rx33:tx38 +lane_to_serdes_map_nif_lane34=rx38:tx32 +lane_to_serdes_map_nif_lane35=rx39:tx33 +lane_to_serdes_map_nif_lane36=rx35:tx37 +lane_to_serdes_map_nif_lane37=rx34:tx36 +lane_to_serdes_map_nif_lane38=rx36:tx34 +lane_to_serdes_map_nif_lane39=rx37:tx35 +lane_to_serdes_map_nif_lane40=rx40:tx41 +lane_to_serdes_map_nif_lane41=rx43:tx45 +lane_to_serdes_map_nif_lane42=rx45:tx42 +lane_to_serdes_map_nif_lane43=rx42:tx40 +lane_to_serdes_map_nif_lane44=rx41:tx47 +lane_to_serdes_map_nif_lane45=rx44:tx46 +lane_to_serdes_map_nif_lane46=rx46:tx44 +lane_to_serdes_map_nif_lane47=rx47:tx43 +lane_to_serdes_map_nif_lane48=rx50:tx52 +lane_to_serdes_map_nif_lane49=rx53:tx55 +lane_to_serdes_map_nif_lane50=rx55:tx53 +lane_to_serdes_map_nif_lane51=rx52:tx51 +lane_to_serdes_map_nif_lane52=rx49:tx49 +lane_to_serdes_map_nif_lane53=rx48:tx54 +lane_to_serdes_map_nif_lane54=rx54:tx48 +lane_to_serdes_map_nif_lane55=rx51:tx50 +lane_to_serdes_map_nif_lane56=rx56:tx63 +lane_to_serdes_map_nif_lane57=rx57:tx62 +lane_to_serdes_map_nif_lane58=rx62:tx56 +lane_to_serdes_map_nif_lane59=rx63:tx57 +lane_to_serdes_map_nif_lane60=rx59:tx61 +lane_to_serdes_map_nif_lane61=rx58:tx60 +lane_to_serdes_map_nif_lane62=rx60:tx58 +lane_to_serdes_map_nif_lane63=rx61:tx59 +lane_to_serdes_map_nif_lane64=rx64:tx65 +lane_to_serdes_map_nif_lane65=rx67:tx69 +lane_to_serdes_map_nif_lane66=rx69:tx66 +lane_to_serdes_map_nif_lane67=rx66:tx64 +lane_to_serdes_map_nif_lane68=rx65:tx71 +lane_to_serdes_map_nif_lane69=rx68:tx70 +lane_to_serdes_map_nif_lane70=rx70:tx68 +lane_to_serdes_map_nif_lane71=rx71:tx67 +lane_to_serdes_map_nif_lane72=rx79:tx74 +lane_to_serdes_map_nif_lane73=rx76:tx75 +lane_to_serdes_map_nif_lane74=rx72:tx76 +lane_to_serdes_map_nif_lane75=rx74:tx73 +lane_to_serdes_map_nif_lane76=rx77:tx79 +lane_to_serdes_map_nif_lane77=rx78:tx78 +lane_to_serdes_map_nif_lane78=rx73:tx77 +lane_to_serdes_map_nif_lane79=rx75:tx72 +lane_to_serdes_map_nif_lane80=rx86:tx86 +lane_to_serdes_map_nif_lane81=rx83:tx87 +lane_to_serdes_map_nif_lane82=rx82:tx81 +lane_to_serdes_map_nif_lane83=rx85:tx80 +lane_to_serdes_map_nif_lane84=rx87:tx85 +lane_to_serdes_map_nif_lane85=rx84:tx84 +lane_to_serdes_map_nif_lane86=rx80:tx82 +lane_to_serdes_map_nif_lane87=rx81:tx83 +lane_to_serdes_map_nif_lane88=rx95:tx90 +lane_to_serdes_map_nif_lane89=rx92:tx88 +lane_to_serdes_map_nif_lane90=rx88:tx92 +lane_to_serdes_map_nif_lane91=rx91:tx95 +lane_to_serdes_map_nif_lane92=rx94:tx89 +lane_to_serdes_map_nif_lane93=rx93:tx91 +lane_to_serdes_map_nif_lane94=rx89:tx93 +lane_to_serdes_map_nif_lane95=rx90:tx94 +lane_to_serdes_map_nif_lane96=rx103:tx97 +lane_to_serdes_map_nif_lane97=rx100:tx96 +lane_to_serdes_map_nif_lane98=rx96:tx100 +lane_to_serdes_map_nif_lane99=rx99:tx103 +lane_to_serdes_map_nif_lane100=rx102:tx99 +lane_to_serdes_map_nif_lane101=rx101:tx98 +lane_to_serdes_map_nif_lane102=rx97:tx101 +lane_to_serdes_map_nif_lane103=rx98:tx102 +lane_to_serdes_map_nif_lane104=rx110:tx107 +lane_to_serdes_map_nif_lane105=rx108:tx105 +lane_to_serdes_map_nif_lane106=rx104:tx108 +lane_to_serdes_map_nif_lane107=rx107:tx110 +lane_to_serdes_map_nif_lane108=rx111:tx106 +lane_to_serdes_map_nif_lane109=rx109:tx104 +lane_to_serdes_map_nif_lane110=rx105:tx109 +lane_to_serdes_map_nif_lane111=rx106:tx111 +lane_to_serdes_map_nif_lane112=rx119:tx114 +lane_to_serdes_map_nif_lane113=rx116:tx112 +lane_to_serdes_map_nif_lane114=rx112:tx116 +lane_to_serdes_map_nif_lane115=rx115:tx119 +lane_to_serdes_map_nif_lane116=rx118:tx113 +lane_to_serdes_map_nif_lane117=rx117:tx115 +lane_to_serdes_map_nif_lane118=rx113:tx117 +lane_to_serdes_map_nif_lane119=rx114:tx118 +lane_to_serdes_map_nif_lane120=rx127:tx121 +lane_to_serdes_map_nif_lane121=rx124:tx120 +lane_to_serdes_map_nif_lane122=rx120:tx124 +lane_to_serdes_map_nif_lane123=rx123:tx127 +lane_to_serdes_map_nif_lane124=rx126:tx123 +lane_to_serdes_map_nif_lane125=rx125:tx122 +lane_to_serdes_map_nif_lane126=rx121:tx125 +lane_to_serdes_map_nif_lane127=rx122:tx126 +lane_to_serdes_map_nif_lane128=rx134:tx131 +lane_to_serdes_map_nif_lane129=rx132:tx129 +lane_to_serdes_map_nif_lane130=rx128:tx132 +lane_to_serdes_map_nif_lane131=rx131:tx134 +lane_to_serdes_map_nif_lane132=rx135:tx130 +lane_to_serdes_map_nif_lane133=rx133:tx128 +lane_to_serdes_map_nif_lane134=rx129:tx133 +lane_to_serdes_map_nif_lane135=rx130:tx135 +lane_to_serdes_map_nif_lane136=rx143:tx138 +lane_to_serdes_map_nif_lane137=rx140:tx136 +lane_to_serdes_map_nif_lane138=rx136:tx140 +lane_to_serdes_map_nif_lane139=rx139:tx143 +lane_to_serdes_map_nif_lane140=rx142:tx137 +lane_to_serdes_map_nif_lane141=rx141:tx139 +lane_to_serdes_map_nif_lane142=rx137:tx141 +lane_to_serdes_map_nif_lane143=rx138:tx142 + +######################### +### High Availability ### +######################### + +sw_state_max_size=750000000 + +#location of warmboot NV memory +#Allowed options for dnx are - 3:external storage in filesystem 4:driver will save the state directly in shared memory +stable_location=4 + +# Note that each unit should have a unique filename and that adapter does not play well with tmp and dev/shm folders. +stable_filename=/dev/shm/warmboot_data_0 +stable_filename.1=/dev/shm/warmboot_data_1 +stable_filename.2=/dev/shm/warmboot_data_2 + +#Maximum size for NVM used for WB storage, must be larger than sw_state_max_size.BCM8885X +stable_size=800000000 + +######################### +######################### +######################### + +tm_port_header_type_in_0=INJECTED_2_PP +tm_port_header_type_out_0=CPU + +tm_port_header_type_in_200=INJECTED_2_PP +tm_port_header_type_out_200=ETH +tm_port_header_type_in_201=INJECTED_2_PP +tm_port_header_type_out_201=ETH +tm_port_header_type_in_202=INJECTED_2_PP +tm_port_header_type_out_202=ETH +tm_port_header_type_in_203=INJECTED_2_PP +tm_port_header_type_out_203=ETH + +### SAT +## Enable SAT Interface. 0 - Disable, 1 - Enable (Default) +sat_enable=1 +ucode_port_218=SAT:core_0.218 +tm_port_header_type_out_218=CPU +tm_port_header_type_in_218=INJECTED_2 +ucode_port_219=SAT:core_1.219 +tm_port_header_type_out_219=CPU +tm_port_header_type_in_219=INJECTED_2 +port_init_speed_sat=400000 + +### RCY +sai_recycle_port_lane_base=0 +ucode_port_221=RCY.21:core_0.221 +ucode_port_222=RCY.22:core_1.222 +tm_port_header_type_out_221=ETH +tm_port_header_type_in_221=ETH +tm_port_header_type_out_222=ETH +tm_port_header_type_in_222=ETH +port_init_speed_221=400000 +port_init_speed_222=400000 + +#OLP port +tm_port_header_type_in_240=INJECTED_2 +tm_port_header_type_out_240=RAW + +# Set statically the region mode per region id +dtm_flow_mapping_mode_region_257=3 +dtm_flow_mapping_mode_region_258=3 +dtm_flow_mapping_mode_region_259=3 +dtm_flow_mapping_mode_region_260=3 +dtm_flow_mapping_mode_region_261=3 +dtm_flow_mapping_mode_region_262=3 +dtm_flow_mapping_mode_region_263=3 +dtm_flow_mapping_mode_region_264=3 +dtm_flow_mapping_mode_region_265=3 +dtm_flow_mapping_mode_region_266=7 +dtm_flow_mapping_mode_region_267=3 +dtm_flow_mapping_mode_region_268=3 +dtm_flow_mapping_mode_region_269=3 +dtm_flow_mapping_mode_region_270=3 +dtm_flow_mapping_mode_region_271=3 +dtm_flow_mapping_mode_region_272=3 +dtm_flow_mapping_mode_region_273=3 +dtm_flow_mapping_mode_region_274=3 +dtm_flow_mapping_mode_region_275=3 +dtm_flow_mapping_mode_region_276=3 +dtm_flow_mapping_mode_region_277=3 +dtm_flow_mapping_mode_region_278=3 +dtm_flow_mapping_mode_region_279=3 +dtm_flow_mapping_mode_region_280=3 +dtm_flow_mapping_mode_region_281=3 +dtm_flow_mapping_mode_region_282=3 +dtm_flow_mapping_mode_region_283=3 +dtm_flow_mapping_mode_region_284=3 +dtm_flow_mapping_mode_region_285=3 +dtm_flow_mapping_mode_region_286=3 +dtm_flow_mapping_mode_region_287=3 + +## Configure number of symmetric cores each region supports ## +dtm_flow_nof_remote_cores_region_1=2 +dtm_flow_nof_remote_cores_region_2=2 +dtm_flow_nof_remote_cores_region_3=2 +dtm_flow_nof_remote_cores_region_4=2 +dtm_flow_nof_remote_cores_region_5=2 +dtm_flow_nof_remote_cores_region_6=2 +dtm_flow_nof_remote_cores_region_7=2 +dtm_flow_nof_remote_cores_region_8=2 +dtm_flow_nof_remote_cores_region_9=2 +dtm_flow_nof_remote_cores_region_10=2 +dtm_flow_nof_remote_cores_region_11=2 +dtm_flow_nof_remote_cores_region_12=2 +dtm_flow_nof_remote_cores_region_13=2 +dtm_flow_nof_remote_cores_region_14=2 +dtm_flow_nof_remote_cores_region_15=2 +dtm_flow_nof_remote_cores_region_16=2 +dtm_flow_nof_remote_cores_region_17=2 +dtm_flow_nof_remote_cores_region_18=2 +dtm_flow_nof_remote_cores_region_19=2 +dtm_flow_nof_remote_cores_region_20=2 +dtm_flow_nof_remote_cores_region_21=2 +dtm_flow_nof_remote_cores_region_22=2 +dtm_flow_nof_remote_cores_region_23=2 +dtm_flow_nof_remote_cores_region_24=2 +dtm_flow_nof_remote_cores_region_25=2 +dtm_flow_nof_remote_cores_region_26=2 +dtm_flow_nof_remote_cores_region_27=2 +dtm_flow_nof_remote_cores_region_28=2 +dtm_flow_nof_remote_cores_region_29=2 +dtm_flow_nof_remote_cores_region_30=2 +dtm_flow_nof_remote_cores_region_31=2 +dtm_flow_nof_remote_cores_region_32=2 +dtm_flow_nof_remote_cores_region_33=2 +dtm_flow_nof_remote_cores_region_34=2 +dtm_flow_nof_remote_cores_region_35=2 +dtm_flow_nof_remote_cores_region_36=2 +dtm_flow_nof_remote_cores_region_37=2 +dtm_flow_nof_remote_cores_region_38=2 +dtm_flow_nof_remote_cores_region_39=2 +dtm_flow_nof_remote_cores_region_40=2 +dtm_flow_nof_remote_cores_region_41=2 +dtm_flow_nof_remote_cores_region_42=2 +dtm_flow_nof_remote_cores_region_43=2 +dtm_flow_nof_remote_cores_region_44=2 +dtm_flow_nof_remote_cores_region_45=2 +dtm_flow_nof_remote_cores_region_46=2 +dtm_flow_nof_remote_cores_region_47=2 +dtm_flow_nof_remote_cores_region_48=2 +dtm_flow_nof_remote_cores_region_49=2 +dtm_flow_nof_remote_cores_region_50=2 +dtm_flow_nof_remote_cores_region_51=2 +dtm_flow_nof_remote_cores_region_52=2 +dtm_flow_nof_remote_cores_region_53=2 +dtm_flow_nof_remote_cores_region_54=2 +dtm_flow_nof_remote_cores_region_55=2 +dtm_flow_nof_remote_cores_region_56=2 +dtm_flow_nof_remote_cores_region_57=2 +dtm_flow_nof_remote_cores_region_58=2 +dtm_flow_nof_remote_cores_region_59=2 +dtm_flow_nof_remote_cores_region_60=2 + +### MDB configuration ### +mdb_profile=balanced-exem + +### Descriptor-DMA configuration ### +dma_desc_aggregator_chain_length_max=1000 +dma_desc_aggregator_buff_size_kb=100 +dma_desc_aggregator_timeout_usec=1000 +dma_desc_aggregator_enable_specific_MDB_LPM=1 +dma_desc_aggregator_enable_specific_MDB_FEC=1 + +### Outlif configuarion ### +outlif_logical_to_physical_phase_map_1=S1 +outlif_logical_to_physical_phase_map_2=L1 +outlif_logical_to_physical_phase_map_3=XL +outlif_logical_to_physical_phase_map_4=L2 +outlif_logical_to_physical_phase_map_5=M1 +outlif_logical_to_physical_phase_map_6=M2 +outlif_logical_to_physical_phase_map_7=M3 +outlif_logical_to_physical_phase_map_8=S2 + +### Outlif data granularity configuration ### +outlif_physical_phase_data_granularity_S1=60 +outlif_physical_phase_data_granularity_S2=60 +outlif_physical_phase_data_granularity_M1=60 +outlif_physical_phase_data_granularity_M2=60 +outlif_physical_phase_data_granularity_M3=60 +outlif_physical_phase_data_granularity_L1=60 +outlif_physical_phase_data_granularity_L2=60 +outlif_physical_phase_data_granularity_XL=60 + +### Fabric configuration ### +# Enable link-training +port_init_cl72_sfi=1 +serdes_lane_config_cl72_auto_polarity_en=0 +serdes_lane_config_cl72_auto_polarity_en_sfi=1 +serdes_lane_config_cl72_restart_timeout_en=0 + +#SFI speed rate +port_init_speed_fabric=53125 + +## Fabric transmission mode +# Set the Connect mode to the Fabric +# Options: FE - presence of a Fabric device (single stage) +# SINGLE_FAP - stand-alone device +# MESH - devices in Mesh +# Note: If 'diag_chassis' is on, value will be override in dnx.soc +# to be FE instead of SINGLE_FAP. +fabric_connect_mode=FE + +fabric_logical_port_base=512 + +# Fabric lane mapping +lane_to_serdes_map_fabric_lane0=rx0:tx0 +lane_to_serdes_map_fabric_lane1=rx1:tx1 +lane_to_serdes_map_fabric_lane2=rx2:tx2 +lane_to_serdes_map_fabric_lane3=rx3:tx3 +lane_to_serdes_map_fabric_lane4=rx4:tx4 +lane_to_serdes_map_fabric_lane5=rx5:tx5 +lane_to_serdes_map_fabric_lane6=rx6:tx6 +lane_to_serdes_map_fabric_lane7=rx7:tx7 +lane_to_serdes_map_fabric_lane8=rx8:tx10 +lane_to_serdes_map_fabric_lane9=rx9:tx11 +lane_to_serdes_map_fabric_lane10=rx10:tx9 +lane_to_serdes_map_fabric_lane11=rx11:tx8 +lane_to_serdes_map_fabric_lane12=rx12:tx12 +lane_to_serdes_map_fabric_lane13=rx13:tx15 +lane_to_serdes_map_fabric_lane14=rx14:tx14 +lane_to_serdes_map_fabric_lane15=rx15:tx13 +lane_to_serdes_map_fabric_lane16=rx16:tx17 +lane_to_serdes_map_fabric_lane17=rx17:tx18 +lane_to_serdes_map_fabric_lane18=rx18:tx16 +lane_to_serdes_map_fabric_lane19=rx19:tx19 +lane_to_serdes_map_fabric_lane20=rx20:tx21 +lane_to_serdes_map_fabric_lane21=rx21:tx23 +lane_to_serdes_map_fabric_lane22=rx22:tx20 +lane_to_serdes_map_fabric_lane23=rx23:tx22 +lane_to_serdes_map_fabric_lane24=rx24:tx26 +lane_to_serdes_map_fabric_lane25=rx25:tx24 +lane_to_serdes_map_fabric_lane26=rx26:tx25 +lane_to_serdes_map_fabric_lane27=rx27:tx27 +lane_to_serdes_map_fabric_lane28=rx28:tx31 +lane_to_serdes_map_fabric_lane29=rx29:tx30 +lane_to_serdes_map_fabric_lane30=rx30:tx29 +lane_to_serdes_map_fabric_lane31=rx31:tx28 +lane_to_serdes_map_fabric_lane32=rx32:tx32 +lane_to_serdes_map_fabric_lane33=rx33:tx33 +lane_to_serdes_map_fabric_lane34=rx34:tx34 +lane_to_serdes_map_fabric_lane35=rx35:tx35 +lane_to_serdes_map_fabric_lane36=rx36:tx36 +lane_to_serdes_map_fabric_lane37=rx37:tx37 +lane_to_serdes_map_fabric_lane38=rx38:tx38 +lane_to_serdes_map_fabric_lane39=rx39:tx39 +lane_to_serdes_map_fabric_lane40=rx40:tx43 +lane_to_serdes_map_fabric_lane41=rx41:tx42 +lane_to_serdes_map_fabric_lane42=rx42:tx41 +lane_to_serdes_map_fabric_lane43=rx43:tx40 +lane_to_serdes_map_fabric_lane44=rx44:tx47 +lane_to_serdes_map_fabric_lane45=rx45:tx46 +lane_to_serdes_map_fabric_lane46=rx46:tx45 +lane_to_serdes_map_fabric_lane47=rx47:tx44 +lane_to_serdes_map_fabric_lane48=rx48:tx48 +lane_to_serdes_map_fabric_lane49=rx49:tx49 +lane_to_serdes_map_fabric_lane50=rx50:tx50 +lane_to_serdes_map_fabric_lane51=rx51:tx51 +lane_to_serdes_map_fabric_lane52=rx52:tx52 +lane_to_serdes_map_fabric_lane53=rx53:tx53 +lane_to_serdes_map_fabric_lane54=rx54:tx54 +lane_to_serdes_map_fabric_lane55=rx55:tx55 +lane_to_serdes_map_fabric_lane56=rx56:tx59 +lane_to_serdes_map_fabric_lane57=rx57:tx58 +lane_to_serdes_map_fabric_lane58=rx58:tx57 +lane_to_serdes_map_fabric_lane59=rx59:tx56 +lane_to_serdes_map_fabric_lane60=rx60:tx63 +lane_to_serdes_map_fabric_lane61=rx61:tx62 +lane_to_serdes_map_fabric_lane62=rx62:tx61 +lane_to_serdes_map_fabric_lane63=rx63:tx60 +lane_to_serdes_map_fabric_lane64=rx64:tx64 +lane_to_serdes_map_fabric_lane65=rx65:tx65 +lane_to_serdes_map_fabric_lane66=rx66:tx66 +lane_to_serdes_map_fabric_lane67=rx67:tx67 +lane_to_serdes_map_fabric_lane68=rx68:tx68 +lane_to_serdes_map_fabric_lane69=rx69:tx69 +lane_to_serdes_map_fabric_lane70=rx70:tx70 +lane_to_serdes_map_fabric_lane71=rx71:tx71 +lane_to_serdes_map_fabric_lane72=rx72:tx75 +lane_to_serdes_map_fabric_lane73=rx73:tx74 +lane_to_serdes_map_fabric_lane74=rx74:tx73 +lane_to_serdes_map_fabric_lane75=rx75:tx72 +lane_to_serdes_map_fabric_lane76=rx76:tx79 +lane_to_serdes_map_fabric_lane77=rx77:tx78 +lane_to_serdes_map_fabric_lane78=rx78:tx77 +lane_to_serdes_map_fabric_lane79=rx79:tx76 +lane_to_serdes_map_fabric_lane80=rx80:tx80 +lane_to_serdes_map_fabric_lane81=rx81:tx81 +lane_to_serdes_map_fabric_lane82=rx82:tx83 +lane_to_serdes_map_fabric_lane83=rx83:tx82 +lane_to_serdes_map_fabric_lane84=rx84:tx85 +lane_to_serdes_map_fabric_lane85=rx85:tx86 +lane_to_serdes_map_fabric_lane86=rx86:tx84 +lane_to_serdes_map_fabric_lane87=rx87:tx87 +lane_to_serdes_map_fabric_lane88=rx88:tx90 +lane_to_serdes_map_fabric_lane89=rx89:tx88 +lane_to_serdes_map_fabric_lane90=rx90:tx91 +lane_to_serdes_map_fabric_lane91=rx91:tx89 +lane_to_serdes_map_fabric_lane92=rx92:tx93 +lane_to_serdes_map_fabric_lane93=rx93:tx92 +lane_to_serdes_map_fabric_lane94=rx94:tx94 +lane_to_serdes_map_fabric_lane95=rx95:tx95 +lane_to_serdes_map_fabric_lane96=rx96:tx96 +lane_to_serdes_map_fabric_lane97=rx97:tx97 +lane_to_serdes_map_fabric_lane98=rx98:tx98 +lane_to_serdes_map_fabric_lane99=rx99:tx99 +lane_to_serdes_map_fabric_lane100=rx100:tx100 +lane_to_serdes_map_fabric_lane101=rx101:tx101 +lane_to_serdes_map_fabric_lane102=rx102:tx102 +lane_to_serdes_map_fabric_lane103=rx103:tx103 +lane_to_serdes_map_fabric_lane104=rx104:tx105 +lane_to_serdes_map_fabric_lane105=rx105:tx106 +lane_to_serdes_map_fabric_lane106=rx106:tx107 +lane_to_serdes_map_fabric_lane107=rx107:tx104 +lane_to_serdes_map_fabric_lane108=rx108:tx111 +lane_to_serdes_map_fabric_lane109=rx109:tx109 +lane_to_serdes_map_fabric_lane110=rx110:tx110 +lane_to_serdes_map_fabric_lane111=rx111:tx108 +lane_to_serdes_map_fabric_lane112=rx112:tx114 +lane_to_serdes_map_fabric_lane113=rx113:tx113 +lane_to_serdes_map_fabric_lane114=rx114:tx112 +lane_to_serdes_map_fabric_lane115=rx115:tx115 +lane_to_serdes_map_fabric_lane116=rx116:tx117 +lane_to_serdes_map_fabric_lane117=rx117:tx116 +lane_to_serdes_map_fabric_lane118=rx118:tx119 +lane_to_serdes_map_fabric_lane119=rx119:tx118 +lane_to_serdes_map_fabric_lane120=rx120:tx123 +lane_to_serdes_map_fabric_lane121=rx121:tx120 +lane_to_serdes_map_fabric_lane122=rx122:tx122 +lane_to_serdes_map_fabric_lane123=rx123:tx121 +lane_to_serdes_map_fabric_lane124=rx124:tx127 +lane_to_serdes_map_fabric_lane125=rx125:tx125 +lane_to_serdes_map_fabric_lane126=rx126:tx124 +lane_to_serdes_map_fabric_lane127=rx127:tx126 +lane_to_serdes_map_fabric_lane128=rx128:tx128 +lane_to_serdes_map_fabric_lane129=rx129:tx129 +lane_to_serdes_map_fabric_lane130=rx130:tx130 +lane_to_serdes_map_fabric_lane131=rx131:tx131 +lane_to_serdes_map_fabric_lane132=rx132:tx132 +lane_to_serdes_map_fabric_lane133=rx133:tx133 +lane_to_serdes_map_fabric_lane134=rx134:tx134 +lane_to_serdes_map_fabric_lane135=rx135:tx135 +lane_to_serdes_map_fabric_lane136=rx136:tx139 +lane_to_serdes_map_fabric_lane137=rx137:tx138 +lane_to_serdes_map_fabric_lane138=rx138:tx137 +lane_to_serdes_map_fabric_lane139=rx139:tx136 +lane_to_serdes_map_fabric_lane140=rx140:tx140 +lane_to_serdes_map_fabric_lane141=rx141:tx142 +lane_to_serdes_map_fabric_lane142=rx142:tx141 +lane_to_serdes_map_fabric_lane143=rx143:tx143 +lane_to_serdes_map_fabric_lane144=rx144:tx144 +lane_to_serdes_map_fabric_lane145=rx145:tx145 +lane_to_serdes_map_fabric_lane146=rx146:tx146 +lane_to_serdes_map_fabric_lane147=rx147:tx147 +lane_to_serdes_map_fabric_lane148=rx148:tx148 +lane_to_serdes_map_fabric_lane149=rx149:tx149 +lane_to_serdes_map_fabric_lane150=rx150:tx150 +lane_to_serdes_map_fabric_lane151=rx151:tx151 +lane_to_serdes_map_fabric_lane152=rx152:tx155 +lane_to_serdes_map_fabric_lane153=rx153:tx154 +lane_to_serdes_map_fabric_lane154=rx154:tx153 +lane_to_serdes_map_fabric_lane155=rx155:tx152 +lane_to_serdes_map_fabric_lane156=rx156:tx159 +lane_to_serdes_map_fabric_lane157=rx157:tx158 +lane_to_serdes_map_fabric_lane158=rx158:tx157 +lane_to_serdes_map_fabric_lane159=rx159:tx156 +lane_to_serdes_map_fabric_lane160=rx160:tx160 +lane_to_serdes_map_fabric_lane161=rx161:tx161 +lane_to_serdes_map_fabric_lane162=rx162:tx162 +lane_to_serdes_map_fabric_lane163=rx163:tx163 +lane_to_serdes_map_fabric_lane164=rx164:tx164 +lane_to_serdes_map_fabric_lane165=rx165:tx165 +lane_to_serdes_map_fabric_lane166=rx166:tx166 +lane_to_serdes_map_fabric_lane167=rx167:tx167 +lane_to_serdes_map_fabric_lane168=rx168:tx171 +lane_to_serdes_map_fabric_lane169=rx169:tx170 +lane_to_serdes_map_fabric_lane170=rx170:tx169 +lane_to_serdes_map_fabric_lane171=rx171:tx168 +lane_to_serdes_map_fabric_lane172=rx172:tx175 +lane_to_serdes_map_fabric_lane173=rx173:tx174 +lane_to_serdes_map_fabric_lane174=rx174:tx173 +lane_to_serdes_map_fabric_lane175=rx175:tx172 +lane_to_serdes_map_fabric_lane176=rx176:tx176 +lane_to_serdes_map_fabric_lane177=rx177:tx177 +lane_to_serdes_map_fabric_lane178=rx178:tx179 +lane_to_serdes_map_fabric_lane179=rx179:tx178 +lane_to_serdes_map_fabric_lane180=rx180:tx181 +lane_to_serdes_map_fabric_lane181=rx181:tx182 +lane_to_serdes_map_fabric_lane182=rx182:tx180 +lane_to_serdes_map_fabric_lane183=rx183:tx183 +lane_to_serdes_map_fabric_lane184=rx184:tx186 +lane_to_serdes_map_fabric_lane185=rx185:tx184 +lane_to_serdes_map_fabric_lane186=rx186:tx185 +lane_to_serdes_map_fabric_lane187=rx187:tx187 +lane_to_serdes_map_fabric_lane188=rx188:tx188 +lane_to_serdes_map_fabric_lane189=rx189:tx189 +lane_to_serdes_map_fabric_lane190=rx190:tx190 +lane_to_serdes_map_fabric_lane191=rx191:tx191 + +# +##Protocol trap look-up mode: +# Options: IN_LIF - Look-ups in the profile table are done by IN-LIF +# IN_PORT - Look-ups in the profile table are done by IN-PORT +protocol_traps_mode=IN_LIF + +# access definitions +schan_intr_enable=0 +tdma_intr_enable=0 +tslam_intr_enable=0 +miim_intr_enable=0 +schan_timeout_usec=300000 +tdma_timeout_usec=1000000 +tslam_timeout_usec=1000000 + +### Interrupts +appl_enable_intr_init=1 +polled_irq_mode=1 +# reduce CPU load, configure delay 100ms +polled_irq_delay=1000 + +# reduce the CPU load over adapter (caused by counter thread) +bcm_stat_interval=1000 + +# shadow memory +mem_cache_enable_ecc=1 +mem_cache_enable_parity=1 + +# serdes_nif/fabric_clk_freq_in/out configuration +serdes_nif_clk_freq_in=2 +serdes_nif_clk_freq_out=1 +serdes_fabric_clk_freq_in=2 +serdes_fabric_clk_freq_out=1 + +dport_map_direct=1 + +rif_id_max=0x6000 + +phy_rx_polarity_flip_phy0=0 +phy_rx_polarity_flip_phy1=0 +phy_rx_polarity_flip_phy2=0 +phy_rx_polarity_flip_phy3=0 +phy_rx_polarity_flip_phy4=0 +phy_rx_polarity_flip_phy5=0 +phy_rx_polarity_flip_phy6=0 +phy_rx_polarity_flip_phy7=0 +phy_rx_polarity_flip_phy8=1 +phy_rx_polarity_flip_phy9=1 +phy_rx_polarity_flip_phy10=0 +phy_rx_polarity_flip_phy11=1 +phy_rx_polarity_flip_phy12=1 +phy_rx_polarity_flip_phy13=1 +phy_rx_polarity_flip_phy14=1 +phy_rx_polarity_flip_phy15=1 +phy_rx_polarity_flip_phy16=0 +phy_rx_polarity_flip_phy17=0 +phy_rx_polarity_flip_phy18=0 +phy_rx_polarity_flip_phy19=0 +phy_rx_polarity_flip_phy20=0 +phy_rx_polarity_flip_phy21=0 +phy_rx_polarity_flip_phy22=0 +phy_rx_polarity_flip_phy23=0 +phy_rx_polarity_flip_phy24=0 +phy_rx_polarity_flip_phy25=0 +phy_rx_polarity_flip_phy26=0 +phy_rx_polarity_flip_phy27=0 +phy_rx_polarity_flip_phy28=0 +phy_rx_polarity_flip_phy29=0 +phy_rx_polarity_flip_phy30=0 +phy_rx_polarity_flip_phy31=0 +phy_rx_polarity_flip_phy32=0 +phy_rx_polarity_flip_phy33=0 +phy_rx_polarity_flip_phy34=0 +phy_rx_polarity_flip_phy35=0 +phy_rx_polarity_flip_phy36=0 +phy_rx_polarity_flip_phy37=0 +phy_rx_polarity_flip_phy38=0 +phy_rx_polarity_flip_phy39=0 +phy_rx_polarity_flip_phy40=0 +phy_rx_polarity_flip_phy41=0 +phy_rx_polarity_flip_phy42=0 +phy_rx_polarity_flip_phy43=0 +phy_rx_polarity_flip_phy44=0 +phy_rx_polarity_flip_phy45=0 +phy_rx_polarity_flip_phy46=0 +phy_rx_polarity_flip_phy47=0 +phy_rx_polarity_flip_phy48=0 +phy_rx_polarity_flip_phy49=0 +phy_rx_polarity_flip_phy50=0 +phy_rx_polarity_flip_phy51=0 +phy_rx_polarity_flip_phy52=0 +phy_rx_polarity_flip_phy53=0 +phy_rx_polarity_flip_phy54=0 +phy_rx_polarity_flip_phy55=0 +phy_rx_polarity_flip_phy56=0 +phy_rx_polarity_flip_phy57=0 +phy_rx_polarity_flip_phy58=0 +phy_rx_polarity_flip_phy59=0 +phy_rx_polarity_flip_phy60=0 +phy_rx_polarity_flip_phy61=0 +phy_rx_polarity_flip_phy62=0 +phy_rx_polarity_flip_phy63=0 +phy_rx_polarity_flip_phy64=0 +phy_rx_polarity_flip_phy65=0 +phy_rx_polarity_flip_phy66=0 +phy_rx_polarity_flip_phy67=0 +phy_rx_polarity_flip_phy68=0 +phy_rx_polarity_flip_phy69=0 +phy_rx_polarity_flip_phy70=0 +phy_rx_polarity_flip_phy71=0 +phy_rx_polarity_flip_phy72=1 +phy_rx_polarity_flip_phy73=1 +phy_rx_polarity_flip_phy74=1 +phy_rx_polarity_flip_phy75=1 +phy_rx_polarity_flip_phy76=1 +phy_rx_polarity_flip_phy77=1 +phy_rx_polarity_flip_phy78=1 +phy_rx_polarity_flip_phy79=1 +phy_rx_polarity_flip_phy80=0 +phy_rx_polarity_flip_phy81=0 +phy_rx_polarity_flip_phy82=0 +phy_rx_polarity_flip_phy83=0 +phy_rx_polarity_flip_phy84=0 +phy_rx_polarity_flip_phy85=0 +phy_rx_polarity_flip_phy86=0 +phy_rx_polarity_flip_phy87=0 +phy_rx_polarity_flip_phy88=0 +phy_rx_polarity_flip_phy89=0 +phy_rx_polarity_flip_phy90=1 +phy_rx_polarity_flip_phy91=0 +phy_rx_polarity_flip_phy92=0 +phy_rx_polarity_flip_phy93=0 +phy_rx_polarity_flip_phy94=0 +phy_rx_polarity_flip_phy95=0 +phy_rx_polarity_flip_phy96=0 +phy_rx_polarity_flip_phy97=0 +phy_rx_polarity_flip_phy98=0 +phy_rx_polarity_flip_phy99=0 +phy_rx_polarity_flip_phy100=0 +phy_rx_polarity_flip_phy101=0 +phy_rx_polarity_flip_phy102=0 +phy_rx_polarity_flip_phy103=0 +phy_rx_polarity_flip_phy104=0 +phy_rx_polarity_flip_phy105=0 +phy_rx_polarity_flip_phy106=0 +phy_rx_polarity_flip_phy107=0 +phy_rx_polarity_flip_phy108=0 +phy_rx_polarity_flip_phy109=0 +phy_rx_polarity_flip_phy110=0 +phy_rx_polarity_flip_phy111=0 +phy_rx_polarity_flip_phy112=0 +phy_rx_polarity_flip_phy113=0 +phy_rx_polarity_flip_phy114=0 +phy_rx_polarity_flip_phy115=0 +phy_rx_polarity_flip_phy116=0 +phy_rx_polarity_flip_phy117=0 +phy_rx_polarity_flip_phy118=0 +phy_rx_polarity_flip_phy119=0 +phy_rx_polarity_flip_phy120=0 +phy_rx_polarity_flip_phy121=0 +phy_rx_polarity_flip_phy122=0 +phy_rx_polarity_flip_phy123=0 +phy_rx_polarity_flip_phy124=0 +phy_rx_polarity_flip_phy125=0 +phy_rx_polarity_flip_phy126=0 +phy_rx_polarity_flip_phy127=0 +phy_rx_polarity_flip_phy128=0 +phy_rx_polarity_flip_phy129=0 +phy_rx_polarity_flip_phy130=0 +phy_rx_polarity_flip_phy131=0 +phy_rx_polarity_flip_phy132=0 +phy_rx_polarity_flip_phy133=0 +phy_rx_polarity_flip_phy134=0 +phy_rx_polarity_flip_phy135=0 +phy_rx_polarity_flip_phy136=0 +phy_rx_polarity_flip_phy137=0 +phy_rx_polarity_flip_phy138=0 +phy_rx_polarity_flip_phy139=0 +phy_rx_polarity_flip_phy140=0 +phy_rx_polarity_flip_phy141=0 +phy_rx_polarity_flip_phy142=0 +phy_rx_polarity_flip_phy143=0 +phy_tx_polarity_flip_phy0=1 +phy_tx_polarity_flip_phy1=1 +phy_tx_polarity_flip_phy2=1 +phy_tx_polarity_flip_phy3=1 +phy_tx_polarity_flip_phy4=1 +phy_tx_polarity_flip_phy5=1 +phy_tx_polarity_flip_phy6=1 +phy_tx_polarity_flip_phy7=1 +phy_tx_polarity_flip_phy8=1 +phy_tx_polarity_flip_phy9=0 +phy_tx_polarity_flip_phy10=1 +phy_tx_polarity_flip_phy11=1 +phy_tx_polarity_flip_phy12=1 +phy_tx_polarity_flip_phy13=1 +phy_tx_polarity_flip_phy14=1 +phy_tx_polarity_flip_phy15=1 +phy_tx_polarity_flip_phy16=1 +phy_tx_polarity_flip_phy17=1 +phy_tx_polarity_flip_phy18=1 +phy_tx_polarity_flip_phy19=1 +phy_tx_polarity_flip_phy20=1 +phy_tx_polarity_flip_phy21=1 +phy_tx_polarity_flip_phy22=1 +phy_tx_polarity_flip_phy23=1 +phy_tx_polarity_flip_phy24=1 +phy_tx_polarity_flip_phy25=1 +phy_tx_polarity_flip_phy26=1 +phy_tx_polarity_flip_phy27=1 +phy_tx_polarity_flip_phy28=1 +phy_tx_polarity_flip_phy29=1 +phy_tx_polarity_flip_phy30=1 +phy_tx_polarity_flip_phy31=1 +phy_tx_polarity_flip_phy32=1 +phy_tx_polarity_flip_phy33=1 +phy_tx_polarity_flip_phy34=1 +phy_tx_polarity_flip_phy35=1 +phy_tx_polarity_flip_phy36=1 +phy_tx_polarity_flip_phy37=1 +phy_tx_polarity_flip_phy38=1 +phy_tx_polarity_flip_phy39=1 +phy_tx_polarity_flip_phy40=1 +phy_tx_polarity_flip_phy41=1 +phy_tx_polarity_flip_phy42=1 +phy_tx_polarity_flip_phy43=1 +phy_tx_polarity_flip_phy44=1 +phy_tx_polarity_flip_phy45=1 +phy_tx_polarity_flip_phy46=1 +phy_tx_polarity_flip_phy47=1 +phy_tx_polarity_flip_phy48=1 +phy_tx_polarity_flip_phy49=1 +phy_tx_polarity_flip_phy50=1 +phy_tx_polarity_flip_phy51=1 +phy_tx_polarity_flip_phy52=1 +phy_tx_polarity_flip_phy53=1 +phy_tx_polarity_flip_phy54=1 +phy_tx_polarity_flip_phy55=1 +phy_tx_polarity_flip_phy56=1 +phy_tx_polarity_flip_phy57=1 +phy_tx_polarity_flip_phy58=1 +phy_tx_polarity_flip_phy59=1 +phy_tx_polarity_flip_phy60=1 +phy_tx_polarity_flip_phy61=1 +phy_tx_polarity_flip_phy62=1 +phy_tx_polarity_flip_phy63=1 +phy_tx_polarity_flip_phy64=1 +phy_tx_polarity_flip_phy65=1 +phy_tx_polarity_flip_phy66=1 +phy_tx_polarity_flip_phy67=1 +phy_tx_polarity_flip_phy68=1 +phy_tx_polarity_flip_phy69=1 +phy_tx_polarity_flip_phy70=1 +phy_tx_polarity_flip_phy71=1 +phy_tx_polarity_flip_phy72=0 +phy_tx_polarity_flip_phy73=0 +phy_tx_polarity_flip_phy74=0 +phy_tx_polarity_flip_phy75=0 +phy_tx_polarity_flip_phy76=0 +phy_tx_polarity_flip_phy77=0 +phy_tx_polarity_flip_phy78=0 +phy_tx_polarity_flip_phy79=0 +phy_tx_polarity_flip_phy80=0 +phy_tx_polarity_flip_phy81=0 +phy_tx_polarity_flip_phy82=0 +phy_tx_polarity_flip_phy83=0 +phy_tx_polarity_flip_phy84=0 +phy_tx_polarity_flip_phy85=0 +phy_tx_polarity_flip_phy86=0 +phy_tx_polarity_flip_phy87=0 +phy_tx_polarity_flip_phy88=1 +phy_tx_polarity_flip_phy89=1 +phy_tx_polarity_flip_phy90=1 +phy_tx_polarity_flip_phy91=1 +phy_tx_polarity_flip_phy92=1 +phy_tx_polarity_flip_phy93=1 +phy_tx_polarity_flip_phy94=1 +phy_tx_polarity_flip_phy95=1 +phy_tx_polarity_flip_phy96=1 +phy_tx_polarity_flip_phy97=1 +phy_tx_polarity_flip_phy98=1 +phy_tx_polarity_flip_phy99=1 +phy_tx_polarity_flip_phy100=1 +phy_tx_polarity_flip_phy101=1 +phy_tx_polarity_flip_phy102=1 +phy_tx_polarity_flip_phy103=1 +phy_tx_polarity_flip_phy104=1 +phy_tx_polarity_flip_phy105=1 +phy_tx_polarity_flip_phy106=1 +phy_tx_polarity_flip_phy107=1 +phy_tx_polarity_flip_phy108=1 +phy_tx_polarity_flip_phy109=1 +phy_tx_polarity_flip_phy110=1 +phy_tx_polarity_flip_phy111=1 +phy_tx_polarity_flip_phy112=1 +phy_tx_polarity_flip_phy113=1 +phy_tx_polarity_flip_phy114=1 +phy_tx_polarity_flip_phy115=1 +phy_tx_polarity_flip_phy116=1 +phy_tx_polarity_flip_phy117=1 +phy_tx_polarity_flip_phy118=1 +phy_tx_polarity_flip_phy119=1 +phy_tx_polarity_flip_phy120=1 +phy_tx_polarity_flip_phy121=1 +phy_tx_polarity_flip_phy122=1 +phy_tx_polarity_flip_phy123=1 +phy_tx_polarity_flip_phy124=1 +phy_tx_polarity_flip_phy125=1 +phy_tx_polarity_flip_phy126=1 +phy_tx_polarity_flip_phy127=1 +phy_tx_polarity_flip_phy128=1 +phy_tx_polarity_flip_phy129=1 +phy_tx_polarity_flip_phy130=1 +phy_tx_polarity_flip_phy131=1 +phy_tx_polarity_flip_phy132=1 +phy_tx_polarity_flip_phy133=1 +phy_tx_polarity_flip_phy134=1 +phy_tx_polarity_flip_phy135=1 +phy_tx_polarity_flip_phy136=1 +phy_tx_polarity_flip_phy137=1 +phy_tx_polarity_flip_phy138=1 +phy_tx_polarity_flip_phy139=1 +phy_tx_polarity_flip_phy140=1 +phy_tx_polarity_flip_phy141=1 +phy_tx_polarity_flip_phy142=1 +phy_tx_polarity_flip_phy143=1 + +serdes_tx_taps_1=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_2=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_3=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_4=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_5=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_6=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_7=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_8=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_9=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_10=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_11=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_12=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_13=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_14=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_15=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_16=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_17=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_18=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_19=nrz:-6:85:-21:0:0:0 +serdes_tx_taps_20=nrz:-5:83:-22:0:0:0 +serdes_tx_taps_21=nrz:-4:75:-21:0:0:0 +serdes_tx_taps_22=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_23=nrz:-6:85:-21:0:0:0 +serdes_tx_taps_24=nrz:-5:83:-22:0:0:0 +serdes_tx_taps_25=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_26=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_27=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_28=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_29=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_30=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_31=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_32=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_33=nrz:-5:83:-22:0:0:0 +serdes_tx_taps_34=nrz:-5:83:-22:0:0:0 +serdes_tx_taps_35=nrz:-4:75:-21:0:0:0 +serdes_tx_taps_36=nrz:-8:89:-29:0:0:0 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/port_config.ini new file mode 100644 index 000000000000..25e9fb6226b1 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/port_config.ini @@ -0,0 +1,39 @@ +# name lanes alias index role speed asic_port_name coreId corePortId numVoq +Ethernet0 72,73,74,75 Ethernet1/1 1 Ext 100000 Eth0-ASIC0 1 1 8 +Ethernet4 76,77,78,79 Ethernet1/5 1 Ext 100000 Eth4-ASIC0 1 2 8 +Ethernet8 80,81,82,83 Ethernet2/1 2 Ext 100000 Eth8-ASIC0 1 3 8 +Ethernet12 84,85,86,87 Ethernet2/5 2 Ext 100000 Eth12-ASIC0 1 4 8 +Ethernet16 88,89,90,91 Ethernet3/1 3 Ext 100000 Eth16-ASIC0 1 5 8 +Ethernet20 92,93,94,95 Ethernet3/5 3 Ext 100000 Eth20-ASIC0 1 6 8 +Ethernet24 96,97,98,99 Ethernet4/1 4 Ext 100000 Eth24-ASIC0 1 7 8 +Ethernet28 100,101,102,103 Ethernet4/5 4 Ext 100000 Eth28-ASIC0 1 8 8 +Ethernet32 104,105,106,107 Ethernet5/1 5 Ext 100000 Eth32-ASIC0 1 9 8 +Ethernet36 108,109,110,111 Ethernet5/5 5 Ext 100000 Eth36-ASIC0 1 10 8 +Ethernet40 112,113,114,115 Ethernet6/1 6 Ext 100000 Eth40-ASIC0 1 11 8 +Ethernet44 116,117,118,119 Ethernet6/5 6 Ext 100000 Eth44-ASIC0 1 12 8 +Ethernet48 120,121,122,123 Ethernet7/1 7 Ext 100000 Eth48-ASIC0 1 13 8 +Ethernet52 124,125,126,127 Ethernet7/5 7 Ext 100000 Eth52-ASIC0 1 14 8 +Ethernet56 128,129,130,131 Ethernet8/1 8 Ext 100000 Eth56-ASIC0 1 15 8 +Ethernet60 132,133,134,135 Ethernet8/5 8 Ext 100000 Eth60-ASIC0 1 16 8 +Ethernet64 136,137,138,139 Ethernet9/1 9 Ext 100000 Eth64-ASIC0 1 17 8 +Ethernet68 140,141,142,143 Ethernet9/5 9 Ext 100000 Eth68-ASIC0 1 18 8 +Ethernet72 64,65,66,67 Ethernet10/1 10 Ext 100000 Eth72-ASIC0 0 19 8 +Ethernet76 68,69,70,71 Ethernet10/5 10 Ext 100000 Eth76-ASIC0 0 20 8 +Ethernet80 56,57,58,59 Ethernet11/1 11 Ext 100000 Eth80-ASIC0 0 21 8 +Ethernet84 60,61,62,63 Ethernet11/5 11 Ext 100000 Eth84-ASIC0 0 22 8 +Ethernet88 48,49,50,51 Ethernet12/1 12 Ext 100000 Eth88-ASIC0 0 23 8 +Ethernet92 52,53,54,55 Ethernet12/5 12 Ext 100000 Eth92-ASIC0 0 24 8 +Ethernet96 40,41,42,43 Ethernet13/1 13 Ext 100000 Eth96-ASIC0 0 25 8 +Ethernet100 44,45,46,47 Ethernet13/5 13 Ext 100000 Eth100-ASIC0 0 26 8 +Ethernet104 32,33,34,35 Ethernet14/1 14 Ext 100000 Eth104-ASIC0 0 27 8 +Ethernet108 36,37,38,39 Ethernet14/5 14 Ext 100000 Eth108-ASIC0 0 28 8 +Ethernet112 24,25,26,27 Ethernet15/1 15 Ext 100000 Eth112-ASIC0 0 29 8 +Ethernet116 28,29,30,31 Ethernet15/5 15 Ext 100000 Eth116-ASIC0 0 30 8 +Ethernet120 16,17,18,19 Ethernet16/1 16 Ext 100000 Eth120-ASIC0 0 31 8 +Ethernet124 20,21,22,23 Ethernet16/5 16 Ext 100000 Eth124-ASIC0 0 32 8 +Ethernet128 8,9,10,11 Ethernet17/1 17 Ext 100000 Eth128-ASIC0 0 33 8 +Ethernet132 12,13,14,15 Ethernet17/5 17 Ext 100000 Eth132-ASIC0 0 34 8 +Ethernet136 0,1,2,3 Ethernet18/1 18 Ext 100000 Eth136-ASIC0 0 35 8 +Ethernet140 4,5,6,7 Ethernet18/5 18 Ext 100000 Eth140-ASIC0 0 36 8 +Ethernet-Rec0 221 Recirc0/0 19 Rec 400000 Rcy0-ASIC0 0 221 8 +Ethernet-IB0 222 Recirc0/1 20 Inb 400000 Rcy1-ASIC0 1 222 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/sai.profile b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/sai.profile new file mode 100644 index 000000000000..894b300ad733 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/j2p-a7800r3a-36d-36x400G.config.bcm + diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/context_config.json b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/context_config.json new file mode 120000 index 000000000000..3db0e8ed3d9b --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/context_config.json @@ -0,0 +1 @@ +../0/context_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm new file mode 100644 index 000000000000..84b62055b92b --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm @@ -0,0 +1,996 @@ +soc_family=BCM8885X + +dpp_db_path=/usr/share/bcm/db + +#################################################### +##Reference applications related properties - Start +#################################################### + +## PMF small EXEM connected stage: +# Options: IPMF2 - Ingress PMF 2 stage can perform small EXEM lookups. +# IPMF3 - Ingress PMF 3 stage can perform small EXEM lookups. +## PMF small EXEM connected stage: +# Options: IPMF2 - Ingress PMF 2 stage can perform small EXEM lookups. +# IPMF3 - Ingress PMF 3 stage can perform small EXEM lookups. +pmf_sexem3_stage=IPMF2 + +#################################################### +##Reference applications related properties - End +#################################################### + +# Jericho2-mode (description 0x1 used for Jericho 2 mode) +system_headers_mode=1 + +# Disable link-training +port_init_cl72=0 + +###Default interfaces for Jericho2Plus +#CPU interfaces +ucode_port_0=CPU.0:core_0.0 +ucode_port_200=CPU.8:core_1.200 +ucode_port_201=CPU.16:core_0.201 +ucode_port_202=CPU.24:core_1.202 +ucode_port_203=CPU.32:core_0.203 + +#NIF ETH interfaces on device +ucode_port_1=CGE18:core_1.1 +ucode_port_2=CGE19:core_1.2 +ucode_port_3=CGE20:core_1.3 +ucode_port_4=CGE21:core_1.4 +ucode_port_5=CGE22:core_1.5 +ucode_port_6=CGE23:core_1.6 +ucode_port_7=CGE24:core_1.7 +ucode_port_8=CGE25:core_1.8 +ucode_port_9=CGE26:core_1.9 +ucode_port_10=CGE27:core_1.10 +ucode_port_11=CGE28:core_1.11 +ucode_port_12=CGE29:core_1.12 +ucode_port_13=CGE30:core_1.13 +ucode_port_14=CGE31:core_1.14 +ucode_port_15=CGE32:core_1.15 +ucode_port_16=CGE33:core_1.16 +ucode_port_17=CGE34:core_1.17 +ucode_port_18=CGE35:core_1.18 + +ucode_port_19=CGE16:core_0.19 +ucode_port_20=CGE17:core_0.20 +ucode_port_21=CGE14:core_0.21 +ucode_port_22=CGE15:core_0.22 +ucode_port_23=CGE12:core_0.23 +ucode_port_24=CGE13:core_0.24 +ucode_port_25=CGE10:core_0.25 +ucode_port_26=CGE11:core_0.26 +ucode_port_27=CGE8:core_0.27 +ucode_port_28=CGE9:core_0.28 +ucode_port_29=CGE6:core_0.29 +ucode_port_30=CGE7:core_0.30 +ucode_port_31=CGE4:core_0.31 +ucode_port_32=CGE5:core_0.32 +ucode_port_33=CGE2:core_0.33 +ucode_port_34=CGE3:core_0.34 +ucode_port_35=CGE0:core_0.35 +ucode_port_36=CGE1:core_0.36 + +#NIF default speeds +port_init_speed_xe=10000 +port_init_speed_xl=40000 +port_init_speed_le=50000 +port_init_speed_ce=100000 +port_init_speed_cc=200000 +port_init_speed_cd=400000 +port_init_speed_il=10312 + +port_priorities=8 + +#special ports +ucode_port_240=OLP:core_0.240 + +# NIF lane mapping +lane_to_serdes_map_nif_lane0=rx3:tx4 +lane_to_serdes_map_nif_lane1=rx6:tx1 +lane_to_serdes_map_nif_lane2=rx7:tx5 +lane_to_serdes_map_nif_lane3=rx4:tx7 +lane_to_serdes_map_nif_lane4=rx1:tx2 +lane_to_serdes_map_nif_lane5=rx0:tx0 +lane_to_serdes_map_nif_lane6=rx5:tx3 +lane_to_serdes_map_nif_lane7=rx2:tx6 +lane_to_serdes_map_nif_lane8=rx10:tx11 +lane_to_serdes_map_nif_lane9=rx8:tx8 +lane_to_serdes_map_nif_lane10=rx14:tx12 +lane_to_serdes_map_nif_lane11=rx15:tx15 +lane_to_serdes_map_nif_lane12=rx13:tx10 +lane_to_serdes_map_nif_lane13=rx9:tx9 +lane_to_serdes_map_nif_lane14=rx11:tx13 +lane_to_serdes_map_nif_lane15=rx12:tx14 +lane_to_serdes_map_nif_lane16=rx16:tx17 +lane_to_serdes_map_nif_lane17=rx19:tx21 +lane_to_serdes_map_nif_lane18=rx21:tx18 +lane_to_serdes_map_nif_lane19=rx18:tx16 +lane_to_serdes_map_nif_lane20=rx17:tx23 +lane_to_serdes_map_nif_lane21=rx20:tx22 +lane_to_serdes_map_nif_lane22=rx22:tx20 +lane_to_serdes_map_nif_lane23=rx23:tx19 +lane_to_serdes_map_nif_lane24=rx26:tx28 +lane_to_serdes_map_nif_lane25=rx29:tx31 +lane_to_serdes_map_nif_lane26=rx31:tx29 +lane_to_serdes_map_nif_lane27=rx28:tx27 +lane_to_serdes_map_nif_lane28=rx25:tx25 +lane_to_serdes_map_nif_lane29=rx24:tx30 +lane_to_serdes_map_nif_lane30=rx30:tx24 +lane_to_serdes_map_nif_lane31=rx27:tx26 +lane_to_serdes_map_nif_lane32=rx32:tx39 +lane_to_serdes_map_nif_lane33=rx33:tx38 +lane_to_serdes_map_nif_lane34=rx38:tx32 +lane_to_serdes_map_nif_lane35=rx39:tx33 +lane_to_serdes_map_nif_lane36=rx35:tx37 +lane_to_serdes_map_nif_lane37=rx34:tx36 +lane_to_serdes_map_nif_lane38=rx36:tx34 +lane_to_serdes_map_nif_lane39=rx37:tx35 +lane_to_serdes_map_nif_lane40=rx40:tx41 +lane_to_serdes_map_nif_lane41=rx43:tx45 +lane_to_serdes_map_nif_lane42=rx45:tx42 +lane_to_serdes_map_nif_lane43=rx42:tx40 +lane_to_serdes_map_nif_lane44=rx41:tx47 +lane_to_serdes_map_nif_lane45=rx44:tx46 +lane_to_serdes_map_nif_lane46=rx46:tx44 +lane_to_serdes_map_nif_lane47=rx47:tx43 +lane_to_serdes_map_nif_lane48=rx50:tx52 +lane_to_serdes_map_nif_lane49=rx53:tx55 +lane_to_serdes_map_nif_lane50=rx55:tx53 +lane_to_serdes_map_nif_lane51=rx52:tx51 +lane_to_serdes_map_nif_lane52=rx49:tx49 +lane_to_serdes_map_nif_lane53=rx48:tx54 +lane_to_serdes_map_nif_lane54=rx54:tx48 +lane_to_serdes_map_nif_lane55=rx51:tx50 +lane_to_serdes_map_nif_lane56=rx56:tx63 +lane_to_serdes_map_nif_lane57=rx57:tx62 +lane_to_serdes_map_nif_lane58=rx62:tx56 +lane_to_serdes_map_nif_lane59=rx63:tx57 +lane_to_serdes_map_nif_lane60=rx59:tx61 +lane_to_serdes_map_nif_lane61=rx58:tx60 +lane_to_serdes_map_nif_lane62=rx60:tx58 +lane_to_serdes_map_nif_lane63=rx61:tx59 +lane_to_serdes_map_nif_lane64=rx64:tx65 +lane_to_serdes_map_nif_lane65=rx67:tx69 +lane_to_serdes_map_nif_lane66=rx69:tx66 +lane_to_serdes_map_nif_lane67=rx66:tx64 +lane_to_serdes_map_nif_lane68=rx65:tx71 +lane_to_serdes_map_nif_lane69=rx68:tx70 +lane_to_serdes_map_nif_lane70=rx70:tx68 +lane_to_serdes_map_nif_lane71=rx71:tx67 +lane_to_serdes_map_nif_lane72=rx79:tx74 +lane_to_serdes_map_nif_lane73=rx76:tx75 +lane_to_serdes_map_nif_lane74=rx72:tx76 +lane_to_serdes_map_nif_lane75=rx74:tx73 +lane_to_serdes_map_nif_lane76=rx77:tx79 +lane_to_serdes_map_nif_lane77=rx78:tx78 +lane_to_serdes_map_nif_lane78=rx73:tx77 +lane_to_serdes_map_nif_lane79=rx75:tx72 +lane_to_serdes_map_nif_lane80=rx86:tx86 +lane_to_serdes_map_nif_lane81=rx83:tx87 +lane_to_serdes_map_nif_lane82=rx82:tx81 +lane_to_serdes_map_nif_lane83=rx85:tx80 +lane_to_serdes_map_nif_lane84=rx87:tx85 +lane_to_serdes_map_nif_lane85=rx84:tx84 +lane_to_serdes_map_nif_lane86=rx80:tx82 +lane_to_serdes_map_nif_lane87=rx81:tx83 +lane_to_serdes_map_nif_lane88=rx95:tx90 +lane_to_serdes_map_nif_lane89=rx92:tx88 +lane_to_serdes_map_nif_lane90=rx88:tx92 +lane_to_serdes_map_nif_lane91=rx91:tx95 +lane_to_serdes_map_nif_lane92=rx94:tx89 +lane_to_serdes_map_nif_lane93=rx93:tx91 +lane_to_serdes_map_nif_lane94=rx89:tx93 +lane_to_serdes_map_nif_lane95=rx90:tx94 +lane_to_serdes_map_nif_lane96=rx103:tx97 +lane_to_serdes_map_nif_lane97=rx100:tx96 +lane_to_serdes_map_nif_lane98=rx96:tx100 +lane_to_serdes_map_nif_lane99=rx99:tx103 +lane_to_serdes_map_nif_lane100=rx102:tx99 +lane_to_serdes_map_nif_lane101=rx101:tx98 +lane_to_serdes_map_nif_lane102=rx97:tx101 +lane_to_serdes_map_nif_lane103=rx98:tx102 +lane_to_serdes_map_nif_lane104=rx110:tx107 +lane_to_serdes_map_nif_lane105=rx108:tx105 +lane_to_serdes_map_nif_lane106=rx104:tx108 +lane_to_serdes_map_nif_lane107=rx107:tx110 +lane_to_serdes_map_nif_lane108=rx111:tx106 +lane_to_serdes_map_nif_lane109=rx109:tx104 +lane_to_serdes_map_nif_lane110=rx105:tx109 +lane_to_serdes_map_nif_lane111=rx106:tx111 +lane_to_serdes_map_nif_lane112=rx119:tx114 +lane_to_serdes_map_nif_lane113=rx116:tx112 +lane_to_serdes_map_nif_lane114=rx112:tx116 +lane_to_serdes_map_nif_lane115=rx115:tx119 +lane_to_serdes_map_nif_lane116=rx118:tx113 +lane_to_serdes_map_nif_lane117=rx117:tx115 +lane_to_serdes_map_nif_lane118=rx113:tx117 +lane_to_serdes_map_nif_lane119=rx114:tx118 +lane_to_serdes_map_nif_lane120=rx127:tx121 +lane_to_serdes_map_nif_lane121=rx124:tx120 +lane_to_serdes_map_nif_lane122=rx120:tx124 +lane_to_serdes_map_nif_lane123=rx123:tx127 +lane_to_serdes_map_nif_lane124=rx126:tx123 +lane_to_serdes_map_nif_lane125=rx125:tx122 +lane_to_serdes_map_nif_lane126=rx121:tx125 +lane_to_serdes_map_nif_lane127=rx122:tx126 +lane_to_serdes_map_nif_lane128=rx134:tx131 +lane_to_serdes_map_nif_lane129=rx132:tx129 +lane_to_serdes_map_nif_lane130=rx128:tx132 +lane_to_serdes_map_nif_lane131=rx131:tx134 +lane_to_serdes_map_nif_lane132=rx135:tx130 +lane_to_serdes_map_nif_lane133=rx133:tx128 +lane_to_serdes_map_nif_lane134=rx129:tx133 +lane_to_serdes_map_nif_lane135=rx130:tx135 +lane_to_serdes_map_nif_lane136=rx143:tx138 +lane_to_serdes_map_nif_lane137=rx140:tx136 +lane_to_serdes_map_nif_lane138=rx136:tx140 +lane_to_serdes_map_nif_lane139=rx139:tx143 +lane_to_serdes_map_nif_lane140=rx142:tx137 +lane_to_serdes_map_nif_lane141=rx141:tx139 +lane_to_serdes_map_nif_lane142=rx137:tx141 +lane_to_serdes_map_nif_lane143=rx138:tx142 + +######################### +### High Availability ### +######################### + +sw_state_max_size=750000000 + +#location of warmboot NV memory +#Allowed options for dnx are - 3:external storage in filesystem 4:driver will save the state directly in shared memory +stable_location=4 + +# Note that each unit should have a unique filename and that adapter does not play well with tmp and dev/shm folders. +stable_filename=/dev/shm/warmboot_data_0 +stable_filename.1=/dev/shm/warmboot_data_1 +stable_filename.2=/dev/shm/warmboot_data_2 + +#Maximum size for NVM used for WB storage, must be larger than sw_state_max_size.BCM8885X +stable_size=800000000 + +######################### +######################### +######################### + +tm_port_header_type_in_0=INJECTED_2_PP +tm_port_header_type_out_0=CPU + +tm_port_header_type_in_200=INJECTED_2_PP +tm_port_header_type_out_200=ETH +tm_port_header_type_in_201=INJECTED_2_PP +tm_port_header_type_out_201=ETH +tm_port_header_type_in_202=INJECTED_2_PP +tm_port_header_type_out_202=ETH +tm_port_header_type_in_203=INJECTED_2_PP +tm_port_header_type_out_203=ETH + +### SAT +## Enable SAT Interface. 0 - Disable, 1 - Enable (Default) +sat_enable=1 +ucode_port_218=SAT:core_0.218 +tm_port_header_type_out_218=CPU +tm_port_header_type_in_218=INJECTED_2 +ucode_port_219=SAT:core_1.219 +tm_port_header_type_out_219=CPU +tm_port_header_type_in_219=INJECTED_2 +port_init_speed_sat=400000 + +### RCY +sai_recycle_port_lane_base=0 +ucode_port_221=RCY.21:core_0.221 +ucode_port_222=RCY.22:core_1.222 +tm_port_header_type_out_221=ETH +tm_port_header_type_in_221=ETH +tm_port_header_type_out_222=ETH +tm_port_header_type_in_222=ETH +port_init_speed_221=400000 +port_init_speed_222=400000 + +#OLP port +tm_port_header_type_in_240=INJECTED_2 +tm_port_header_type_out_240=RAW + +# Set statically the region mode per region id +dtm_flow_mapping_mode_region_257=3 +dtm_flow_mapping_mode_region_258=3 +dtm_flow_mapping_mode_region_259=3 +dtm_flow_mapping_mode_region_260=3 +dtm_flow_mapping_mode_region_261=3 +dtm_flow_mapping_mode_region_262=3 +dtm_flow_mapping_mode_region_263=3 +dtm_flow_mapping_mode_region_264=3 +dtm_flow_mapping_mode_region_265=3 +dtm_flow_mapping_mode_region_266=7 +dtm_flow_mapping_mode_region_267=3 +dtm_flow_mapping_mode_region_268=3 +dtm_flow_mapping_mode_region_269=3 +dtm_flow_mapping_mode_region_270=3 +dtm_flow_mapping_mode_region_271=3 +dtm_flow_mapping_mode_region_272=3 +dtm_flow_mapping_mode_region_273=3 +dtm_flow_mapping_mode_region_274=3 +dtm_flow_mapping_mode_region_275=3 +dtm_flow_mapping_mode_region_276=3 +dtm_flow_mapping_mode_region_277=3 +dtm_flow_mapping_mode_region_278=3 +dtm_flow_mapping_mode_region_279=3 +dtm_flow_mapping_mode_region_280=3 +dtm_flow_mapping_mode_region_281=3 +dtm_flow_mapping_mode_region_282=3 +dtm_flow_mapping_mode_region_283=3 +dtm_flow_mapping_mode_region_284=3 +dtm_flow_mapping_mode_region_285=3 +dtm_flow_mapping_mode_region_286=3 +dtm_flow_mapping_mode_region_287=3 + +## Configure number of symmetric cores each region supports ## +dtm_flow_nof_remote_cores_region_1=2 +dtm_flow_nof_remote_cores_region_2=2 +dtm_flow_nof_remote_cores_region_3=2 +dtm_flow_nof_remote_cores_region_4=2 +dtm_flow_nof_remote_cores_region_5=2 +dtm_flow_nof_remote_cores_region_6=2 +dtm_flow_nof_remote_cores_region_7=2 +dtm_flow_nof_remote_cores_region_8=2 +dtm_flow_nof_remote_cores_region_9=2 +dtm_flow_nof_remote_cores_region_10=2 +dtm_flow_nof_remote_cores_region_11=2 +dtm_flow_nof_remote_cores_region_12=2 +dtm_flow_nof_remote_cores_region_13=2 +dtm_flow_nof_remote_cores_region_14=2 +dtm_flow_nof_remote_cores_region_15=2 +dtm_flow_nof_remote_cores_region_16=2 +dtm_flow_nof_remote_cores_region_17=2 +dtm_flow_nof_remote_cores_region_18=2 +dtm_flow_nof_remote_cores_region_19=2 +dtm_flow_nof_remote_cores_region_20=2 +dtm_flow_nof_remote_cores_region_21=2 +dtm_flow_nof_remote_cores_region_22=2 +dtm_flow_nof_remote_cores_region_23=2 +dtm_flow_nof_remote_cores_region_24=2 +dtm_flow_nof_remote_cores_region_25=2 +dtm_flow_nof_remote_cores_region_26=2 +dtm_flow_nof_remote_cores_region_27=2 +dtm_flow_nof_remote_cores_region_28=2 +dtm_flow_nof_remote_cores_region_29=2 +dtm_flow_nof_remote_cores_region_30=2 +dtm_flow_nof_remote_cores_region_31=2 +dtm_flow_nof_remote_cores_region_32=2 +dtm_flow_nof_remote_cores_region_33=2 +dtm_flow_nof_remote_cores_region_34=2 +dtm_flow_nof_remote_cores_region_35=2 +dtm_flow_nof_remote_cores_region_36=2 +dtm_flow_nof_remote_cores_region_37=2 +dtm_flow_nof_remote_cores_region_38=2 +dtm_flow_nof_remote_cores_region_39=2 +dtm_flow_nof_remote_cores_region_40=2 +dtm_flow_nof_remote_cores_region_41=2 +dtm_flow_nof_remote_cores_region_42=2 +dtm_flow_nof_remote_cores_region_43=2 +dtm_flow_nof_remote_cores_region_44=2 +dtm_flow_nof_remote_cores_region_45=2 +dtm_flow_nof_remote_cores_region_46=2 +dtm_flow_nof_remote_cores_region_47=2 +dtm_flow_nof_remote_cores_region_48=2 +dtm_flow_nof_remote_cores_region_49=2 +dtm_flow_nof_remote_cores_region_50=2 +dtm_flow_nof_remote_cores_region_51=2 +dtm_flow_nof_remote_cores_region_52=2 +dtm_flow_nof_remote_cores_region_53=2 +dtm_flow_nof_remote_cores_region_54=2 +dtm_flow_nof_remote_cores_region_55=2 +dtm_flow_nof_remote_cores_region_56=2 +dtm_flow_nof_remote_cores_region_57=2 +dtm_flow_nof_remote_cores_region_58=2 +dtm_flow_nof_remote_cores_region_59=2 +dtm_flow_nof_remote_cores_region_60=2 + +### MDB configuration ### +mdb_profile=balanced-exem + +### Descriptor-DMA configuration ### +dma_desc_aggregator_chain_length_max=1000 +dma_desc_aggregator_buff_size_kb=100 +dma_desc_aggregator_timeout_usec=1000 +dma_desc_aggregator_enable_specific_MDB_LPM=1 +dma_desc_aggregator_enable_specific_MDB_FEC=1 + +### Outlif configuarion ### +outlif_logical_to_physical_phase_map_1=S1 +outlif_logical_to_physical_phase_map_2=L1 +outlif_logical_to_physical_phase_map_3=XL +outlif_logical_to_physical_phase_map_4=L2 +outlif_logical_to_physical_phase_map_5=M1 +outlif_logical_to_physical_phase_map_6=M2 +outlif_logical_to_physical_phase_map_7=M3 +outlif_logical_to_physical_phase_map_8=S2 + +### Outlif data granularity configuration ### +outlif_physical_phase_data_granularity_S1=60 +outlif_physical_phase_data_granularity_S2=60 +outlif_physical_phase_data_granularity_M1=60 +outlif_physical_phase_data_granularity_M2=60 +outlif_physical_phase_data_granularity_M3=60 +outlif_physical_phase_data_granularity_L1=60 +outlif_physical_phase_data_granularity_L2=60 +outlif_physical_phase_data_granularity_XL=60 + +### Fabric configuration ### +# Enable link-training +port_init_cl72_sfi=1 +serdes_lane_config_cl72_auto_polarity_en=0 +serdes_lane_config_cl72_auto_polarity_en_sfi=1 +serdes_lane_config_cl72_restart_timeout_en=0 + +#SFI speed rate +port_init_speed_fabric=53125 + +## Fabric transmission mode +# Set the Connect mode to the Fabric +# Options: FE - presence of a Fabric device (single stage) +# SINGLE_FAP - stand-alone device +# MESH - devices in Mesh +# Note: If 'diag_chassis' is on, value will be override in dnx.soc +# to be FE instead of SINGLE_FAP. +fabric_connect_mode=FE + +fabric_logical_port_base=512 + +# Fabric lane mapping +lane_to_serdes_map_fabric_lane0=rx0:tx0 +lane_to_serdes_map_fabric_lane1=rx1:tx1 +lane_to_serdes_map_fabric_lane2=rx2:tx2 +lane_to_serdes_map_fabric_lane3=rx3:tx3 +lane_to_serdes_map_fabric_lane4=rx4:tx4 +lane_to_serdes_map_fabric_lane5=rx5:tx5 +lane_to_serdes_map_fabric_lane6=rx6:tx6 +lane_to_serdes_map_fabric_lane7=rx7:tx7 +lane_to_serdes_map_fabric_lane8=rx8:tx10 +lane_to_serdes_map_fabric_lane9=rx9:tx11 +lane_to_serdes_map_fabric_lane10=rx10:tx9 +lane_to_serdes_map_fabric_lane11=rx11:tx8 +lane_to_serdes_map_fabric_lane12=rx12:tx12 +lane_to_serdes_map_fabric_lane13=rx13:tx15 +lane_to_serdes_map_fabric_lane14=rx14:tx14 +lane_to_serdes_map_fabric_lane15=rx15:tx13 +lane_to_serdes_map_fabric_lane16=rx16:tx17 +lane_to_serdes_map_fabric_lane17=rx17:tx18 +lane_to_serdes_map_fabric_lane18=rx18:tx16 +lane_to_serdes_map_fabric_lane19=rx19:tx19 +lane_to_serdes_map_fabric_lane20=rx20:tx21 +lane_to_serdes_map_fabric_lane21=rx21:tx23 +lane_to_serdes_map_fabric_lane22=rx22:tx20 +lane_to_serdes_map_fabric_lane23=rx23:tx22 +lane_to_serdes_map_fabric_lane24=rx24:tx26 +lane_to_serdes_map_fabric_lane25=rx25:tx24 +lane_to_serdes_map_fabric_lane26=rx26:tx25 +lane_to_serdes_map_fabric_lane27=rx27:tx27 +lane_to_serdes_map_fabric_lane28=rx28:tx31 +lane_to_serdes_map_fabric_lane29=rx29:tx30 +lane_to_serdes_map_fabric_lane30=rx30:tx29 +lane_to_serdes_map_fabric_lane31=rx31:tx28 +lane_to_serdes_map_fabric_lane32=rx32:tx32 +lane_to_serdes_map_fabric_lane33=rx33:tx33 +lane_to_serdes_map_fabric_lane34=rx34:tx34 +lane_to_serdes_map_fabric_lane35=rx35:tx35 +lane_to_serdes_map_fabric_lane36=rx36:tx36 +lane_to_serdes_map_fabric_lane37=rx37:tx37 +lane_to_serdes_map_fabric_lane38=rx38:tx38 +lane_to_serdes_map_fabric_lane39=rx39:tx39 +lane_to_serdes_map_fabric_lane40=rx40:tx43 +lane_to_serdes_map_fabric_lane41=rx41:tx42 +lane_to_serdes_map_fabric_lane42=rx42:tx41 +lane_to_serdes_map_fabric_lane43=rx43:tx40 +lane_to_serdes_map_fabric_lane44=rx44:tx47 +lane_to_serdes_map_fabric_lane45=rx45:tx46 +lane_to_serdes_map_fabric_lane46=rx46:tx45 +lane_to_serdes_map_fabric_lane47=rx47:tx44 +lane_to_serdes_map_fabric_lane48=rx48:tx48 +lane_to_serdes_map_fabric_lane49=rx49:tx49 +lane_to_serdes_map_fabric_lane50=rx50:tx50 +lane_to_serdes_map_fabric_lane51=rx51:tx51 +lane_to_serdes_map_fabric_lane52=rx52:tx52 +lane_to_serdes_map_fabric_lane53=rx53:tx53 +lane_to_serdes_map_fabric_lane54=rx54:tx54 +lane_to_serdes_map_fabric_lane55=rx55:tx55 +lane_to_serdes_map_fabric_lane56=rx56:tx59 +lane_to_serdes_map_fabric_lane57=rx57:tx58 +lane_to_serdes_map_fabric_lane58=rx58:tx57 +lane_to_serdes_map_fabric_lane59=rx59:tx56 +lane_to_serdes_map_fabric_lane60=rx60:tx63 +lane_to_serdes_map_fabric_lane61=rx61:tx62 +lane_to_serdes_map_fabric_lane62=rx62:tx61 +lane_to_serdes_map_fabric_lane63=rx63:tx60 +lane_to_serdes_map_fabric_lane64=rx64:tx64 +lane_to_serdes_map_fabric_lane65=rx65:tx65 +lane_to_serdes_map_fabric_lane66=rx66:tx66 +lane_to_serdes_map_fabric_lane67=rx67:tx67 +lane_to_serdes_map_fabric_lane68=rx68:tx68 +lane_to_serdes_map_fabric_lane69=rx69:tx69 +lane_to_serdes_map_fabric_lane70=rx70:tx70 +lane_to_serdes_map_fabric_lane71=rx71:tx71 +lane_to_serdes_map_fabric_lane72=rx72:tx75 +lane_to_serdes_map_fabric_lane73=rx73:tx74 +lane_to_serdes_map_fabric_lane74=rx74:tx73 +lane_to_serdes_map_fabric_lane75=rx75:tx72 +lane_to_serdes_map_fabric_lane76=rx76:tx79 +lane_to_serdes_map_fabric_lane77=rx77:tx78 +lane_to_serdes_map_fabric_lane78=rx78:tx77 +lane_to_serdes_map_fabric_lane79=rx79:tx76 +lane_to_serdes_map_fabric_lane80=rx80:tx80 +lane_to_serdes_map_fabric_lane81=rx81:tx81 +lane_to_serdes_map_fabric_lane82=rx82:tx83 +lane_to_serdes_map_fabric_lane83=rx83:tx82 +lane_to_serdes_map_fabric_lane84=rx84:tx85 +lane_to_serdes_map_fabric_lane85=rx85:tx86 +lane_to_serdes_map_fabric_lane86=rx86:tx84 +lane_to_serdes_map_fabric_lane87=rx87:tx87 +lane_to_serdes_map_fabric_lane88=rx88:tx90 +lane_to_serdes_map_fabric_lane89=rx89:tx88 +lane_to_serdes_map_fabric_lane90=rx90:tx91 +lane_to_serdes_map_fabric_lane91=rx91:tx89 +lane_to_serdes_map_fabric_lane92=rx92:tx93 +lane_to_serdes_map_fabric_lane93=rx93:tx92 +lane_to_serdes_map_fabric_lane94=rx94:tx94 +lane_to_serdes_map_fabric_lane95=rx95:tx95 +lane_to_serdes_map_fabric_lane96=rx96:tx96 +lane_to_serdes_map_fabric_lane97=rx97:tx97 +lane_to_serdes_map_fabric_lane98=rx98:tx98 +lane_to_serdes_map_fabric_lane99=rx99:tx99 +lane_to_serdes_map_fabric_lane100=rx100:tx100 +lane_to_serdes_map_fabric_lane101=rx101:tx101 +lane_to_serdes_map_fabric_lane102=rx102:tx102 +lane_to_serdes_map_fabric_lane103=rx103:tx103 +lane_to_serdes_map_fabric_lane104=rx104:tx105 +lane_to_serdes_map_fabric_lane105=rx105:tx106 +lane_to_serdes_map_fabric_lane106=rx106:tx107 +lane_to_serdes_map_fabric_lane107=rx107:tx104 +lane_to_serdes_map_fabric_lane108=rx108:tx111 +lane_to_serdes_map_fabric_lane109=rx109:tx109 +lane_to_serdes_map_fabric_lane110=rx110:tx110 +lane_to_serdes_map_fabric_lane111=rx111:tx108 +lane_to_serdes_map_fabric_lane112=rx112:tx114 +lane_to_serdes_map_fabric_lane113=rx113:tx113 +lane_to_serdes_map_fabric_lane114=rx114:tx112 +lane_to_serdes_map_fabric_lane115=rx115:tx115 +lane_to_serdes_map_fabric_lane116=rx116:tx117 +lane_to_serdes_map_fabric_lane117=rx117:tx116 +lane_to_serdes_map_fabric_lane118=rx118:tx119 +lane_to_serdes_map_fabric_lane119=rx119:tx118 +lane_to_serdes_map_fabric_lane120=rx120:tx123 +lane_to_serdes_map_fabric_lane121=rx121:tx120 +lane_to_serdes_map_fabric_lane122=rx122:tx122 +lane_to_serdes_map_fabric_lane123=rx123:tx121 +lane_to_serdes_map_fabric_lane124=rx124:tx127 +lane_to_serdes_map_fabric_lane125=rx125:tx125 +lane_to_serdes_map_fabric_lane126=rx126:tx124 +lane_to_serdes_map_fabric_lane127=rx127:tx126 +lane_to_serdes_map_fabric_lane128=rx128:tx128 +lane_to_serdes_map_fabric_lane129=rx129:tx129 +lane_to_serdes_map_fabric_lane130=rx130:tx130 +lane_to_serdes_map_fabric_lane131=rx131:tx131 +lane_to_serdes_map_fabric_lane132=rx132:tx132 +lane_to_serdes_map_fabric_lane133=rx133:tx133 +lane_to_serdes_map_fabric_lane134=rx134:tx134 +lane_to_serdes_map_fabric_lane135=rx135:tx135 +lane_to_serdes_map_fabric_lane136=rx136:tx139 +lane_to_serdes_map_fabric_lane137=rx137:tx138 +lane_to_serdes_map_fabric_lane138=rx138:tx137 +lane_to_serdes_map_fabric_lane139=rx139:tx136 +lane_to_serdes_map_fabric_lane140=rx140:tx140 +lane_to_serdes_map_fabric_lane141=rx141:tx142 +lane_to_serdes_map_fabric_lane142=rx142:tx141 +lane_to_serdes_map_fabric_lane143=rx143:tx143 +lane_to_serdes_map_fabric_lane144=rx144:tx144 +lane_to_serdes_map_fabric_lane145=rx145:tx145 +lane_to_serdes_map_fabric_lane146=rx146:tx146 +lane_to_serdes_map_fabric_lane147=rx147:tx147 +lane_to_serdes_map_fabric_lane148=rx148:tx148 +lane_to_serdes_map_fabric_lane149=rx149:tx149 +lane_to_serdes_map_fabric_lane150=rx150:tx150 +lane_to_serdes_map_fabric_lane151=rx151:tx151 +lane_to_serdes_map_fabric_lane152=rx152:tx155 +lane_to_serdes_map_fabric_lane153=rx153:tx154 +lane_to_serdes_map_fabric_lane154=rx154:tx153 +lane_to_serdes_map_fabric_lane155=rx155:tx152 +lane_to_serdes_map_fabric_lane156=rx156:tx159 +lane_to_serdes_map_fabric_lane157=rx157:tx158 +lane_to_serdes_map_fabric_lane158=rx158:tx157 +lane_to_serdes_map_fabric_lane159=rx159:tx156 +lane_to_serdes_map_fabric_lane160=rx160:tx160 +lane_to_serdes_map_fabric_lane161=rx161:tx161 +lane_to_serdes_map_fabric_lane162=rx162:tx162 +lane_to_serdes_map_fabric_lane163=rx163:tx163 +lane_to_serdes_map_fabric_lane164=rx164:tx164 +lane_to_serdes_map_fabric_lane165=rx165:tx165 +lane_to_serdes_map_fabric_lane166=rx166:tx166 +lane_to_serdes_map_fabric_lane167=rx167:tx167 +lane_to_serdes_map_fabric_lane168=rx168:tx171 +lane_to_serdes_map_fabric_lane169=rx169:tx170 +lane_to_serdes_map_fabric_lane170=rx170:tx169 +lane_to_serdes_map_fabric_lane171=rx171:tx168 +lane_to_serdes_map_fabric_lane172=rx172:tx175 +lane_to_serdes_map_fabric_lane173=rx173:tx174 +lane_to_serdes_map_fabric_lane174=rx174:tx173 +lane_to_serdes_map_fabric_lane175=rx175:tx172 +lane_to_serdes_map_fabric_lane176=rx176:tx176 +lane_to_serdes_map_fabric_lane177=rx177:tx177 +lane_to_serdes_map_fabric_lane178=rx178:tx179 +lane_to_serdes_map_fabric_lane179=rx179:tx178 +lane_to_serdes_map_fabric_lane180=rx180:tx181 +lane_to_serdes_map_fabric_lane181=rx181:tx182 +lane_to_serdes_map_fabric_lane182=rx182:tx180 +lane_to_serdes_map_fabric_lane183=rx183:tx183 +lane_to_serdes_map_fabric_lane184=rx184:tx186 +lane_to_serdes_map_fabric_lane185=rx185:tx184 +lane_to_serdes_map_fabric_lane186=rx186:tx185 +lane_to_serdes_map_fabric_lane187=rx187:tx187 +lane_to_serdes_map_fabric_lane188=rx188:tx188 +lane_to_serdes_map_fabric_lane189=rx189:tx189 +lane_to_serdes_map_fabric_lane190=rx190:tx190 +lane_to_serdes_map_fabric_lane191=rx191:tx191 + +# +##Protocol trap look-up mode: +# Options: IN_LIF - Look-ups in the profile table are done by IN-LIF +# IN_PORT - Look-ups in the profile table are done by IN-PORT +protocol_traps_mode=IN_LIF + +# access definitions +schan_intr_enable=0 +tdma_intr_enable=0 +tslam_intr_enable=0 +miim_intr_enable=0 +schan_timeout_usec=300000 +tdma_timeout_usec=1000000 +tslam_timeout_usec=1000000 + +### Interrupts +appl_enable_intr_init=1 +polled_irq_mode=1 +# reduce CPU load, configure delay 100ms +polled_irq_delay=1000 + +# reduce the CPU load over adapter (caused by counter thread) +bcm_stat_interval=1000 + +# shadow memory +mem_cache_enable_ecc=1 +mem_cache_enable_parity=1 + +# serdes_nif/fabric_clk_freq_in/out configuration +serdes_nif_clk_freq_in=2 +serdes_nif_clk_freq_out=1 +serdes_fabric_clk_freq_in=2 +serdes_fabric_clk_freq_out=1 + +dport_map_direct=1 + +rif_id_max=0x6000 + +phy_rx_polarity_flip_phy0=0 +phy_rx_polarity_flip_phy1=0 +phy_rx_polarity_flip_phy2=0 +phy_rx_polarity_flip_phy3=0 +phy_rx_polarity_flip_phy4=0 +phy_rx_polarity_flip_phy5=0 +phy_rx_polarity_flip_phy6=0 +phy_rx_polarity_flip_phy7=0 +phy_rx_polarity_flip_phy8=1 +phy_rx_polarity_flip_phy9=1 +phy_rx_polarity_flip_phy10=0 +phy_rx_polarity_flip_phy11=0 +phy_rx_polarity_flip_phy12=1 +phy_rx_polarity_flip_phy13=1 +phy_rx_polarity_flip_phy14=0 +phy_rx_polarity_flip_phy15=1 +phy_rx_polarity_flip_phy16=0 +phy_rx_polarity_flip_phy17=0 +phy_rx_polarity_flip_phy18=0 +phy_rx_polarity_flip_phy19=0 +phy_rx_polarity_flip_phy20=0 +phy_rx_polarity_flip_phy21=0 +phy_rx_polarity_flip_phy22=0 +phy_rx_polarity_flip_phy23=0 +phy_rx_polarity_flip_phy24=0 +phy_rx_polarity_flip_phy25=0 +phy_rx_polarity_flip_phy26=0 +phy_rx_polarity_flip_phy27=0 +phy_rx_polarity_flip_phy28=0 +phy_rx_polarity_flip_phy29=0 +phy_rx_polarity_flip_phy30=0 +phy_rx_polarity_flip_phy31=0 +phy_rx_polarity_flip_phy32=0 +phy_rx_polarity_flip_phy33=0 +phy_rx_polarity_flip_phy34=0 +phy_rx_polarity_flip_phy35=0 +phy_rx_polarity_flip_phy36=0 +phy_rx_polarity_flip_phy37=0 +phy_rx_polarity_flip_phy38=0 +phy_rx_polarity_flip_phy39=0 +phy_rx_polarity_flip_phy40=0 +phy_rx_polarity_flip_phy41=0 +phy_rx_polarity_flip_phy42=0 +phy_rx_polarity_flip_phy43=0 +phy_rx_polarity_flip_phy44=0 +phy_rx_polarity_flip_phy45=0 +phy_rx_polarity_flip_phy46=0 +phy_rx_polarity_flip_phy47=0 +phy_rx_polarity_flip_phy48=0 +phy_rx_polarity_flip_phy49=0 +phy_rx_polarity_flip_phy50=0 +phy_rx_polarity_flip_phy51=0 +phy_rx_polarity_flip_phy52=0 +phy_rx_polarity_flip_phy53=0 +phy_rx_polarity_flip_phy54=0 +phy_rx_polarity_flip_phy55=0 +phy_rx_polarity_flip_phy56=0 +phy_rx_polarity_flip_phy57=0 +phy_rx_polarity_flip_phy58=0 +phy_rx_polarity_flip_phy59=0 +phy_rx_polarity_flip_phy60=0 +phy_rx_polarity_flip_phy61=0 +phy_rx_polarity_flip_phy62=0 +phy_rx_polarity_flip_phy63=0 +phy_rx_polarity_flip_phy64=0 +phy_rx_polarity_flip_phy65=0 +phy_rx_polarity_flip_phy66=0 +phy_rx_polarity_flip_phy67=0 +phy_rx_polarity_flip_phy68=0 +phy_rx_polarity_flip_phy69=0 +phy_rx_polarity_flip_phy70=0 +phy_rx_polarity_flip_phy71=0 +phy_rx_polarity_flip_phy72=1 +phy_rx_polarity_flip_phy73=1 +phy_rx_polarity_flip_phy74=0 +phy_rx_polarity_flip_phy75=1 +phy_rx_polarity_flip_phy76=1 +phy_rx_polarity_flip_phy77=1 +phy_rx_polarity_flip_phy78=1 +phy_rx_polarity_flip_phy79=1 +phy_rx_polarity_flip_phy80=0 +phy_rx_polarity_flip_phy81=0 +phy_rx_polarity_flip_phy82=0 +phy_rx_polarity_flip_phy83=0 +phy_rx_polarity_flip_phy84=0 +phy_rx_polarity_flip_phy85=0 +phy_rx_polarity_flip_phy86=0 +phy_rx_polarity_flip_phy87=0 +phy_rx_polarity_flip_phy88=0 +phy_rx_polarity_flip_phy89=0 +phy_rx_polarity_flip_phy90=0 +phy_rx_polarity_flip_phy91=0 +phy_rx_polarity_flip_phy92=0 +phy_rx_polarity_flip_phy93=0 +phy_rx_polarity_flip_phy94=0 +phy_rx_polarity_flip_phy95=0 +phy_rx_polarity_flip_phy96=0 +phy_rx_polarity_flip_phy97=0 +phy_rx_polarity_flip_phy98=0 +phy_rx_polarity_flip_phy99=0 +phy_rx_polarity_flip_phy100=0 +phy_rx_polarity_flip_phy101=0 +phy_rx_polarity_flip_phy102=0 +phy_rx_polarity_flip_phy103=0 +phy_rx_polarity_flip_phy104=0 +phy_rx_polarity_flip_phy105=0 +phy_rx_polarity_flip_phy106=0 +phy_rx_polarity_flip_phy107=0 +phy_rx_polarity_flip_phy108=0 +phy_rx_polarity_flip_phy109=0 +phy_rx_polarity_flip_phy110=0 +phy_rx_polarity_flip_phy111=0 +phy_rx_polarity_flip_phy112=0 +phy_rx_polarity_flip_phy113=0 +phy_rx_polarity_flip_phy114=0 +phy_rx_polarity_flip_phy115=0 +phy_rx_polarity_flip_phy116=0 +phy_rx_polarity_flip_phy117=0 +phy_rx_polarity_flip_phy118=0 +phy_rx_polarity_flip_phy119=0 +phy_rx_polarity_flip_phy120=0 +phy_rx_polarity_flip_phy121=0 +phy_rx_polarity_flip_phy122=0 +phy_rx_polarity_flip_phy123=0 +phy_rx_polarity_flip_phy124=0 +phy_rx_polarity_flip_phy125=0 +phy_rx_polarity_flip_phy126=0 +phy_rx_polarity_flip_phy127=0 +phy_rx_polarity_flip_phy128=0 +phy_rx_polarity_flip_phy129=0 +phy_rx_polarity_flip_phy130=0 +phy_rx_polarity_flip_phy131=0 +phy_rx_polarity_flip_phy132=0 +phy_rx_polarity_flip_phy133=0 +phy_rx_polarity_flip_phy134=0 +phy_rx_polarity_flip_phy135=0 +phy_rx_polarity_flip_phy136=0 +phy_rx_polarity_flip_phy137=0 +phy_rx_polarity_flip_phy138=0 +phy_rx_polarity_flip_phy139=0 +phy_rx_polarity_flip_phy140=0 +phy_rx_polarity_flip_phy141=0 +phy_rx_polarity_flip_phy142=0 +phy_rx_polarity_flip_phy143=0 +phy_tx_polarity_flip_phy0=1 +phy_tx_polarity_flip_phy1=1 +phy_tx_polarity_flip_phy2=1 +phy_tx_polarity_flip_phy3=1 +phy_tx_polarity_flip_phy4=1 +phy_tx_polarity_flip_phy5=1 +phy_tx_polarity_flip_phy6=1 +phy_tx_polarity_flip_phy7=1 +phy_tx_polarity_flip_phy8=1 +phy_tx_polarity_flip_phy9=1 +phy_tx_polarity_flip_phy10=1 +phy_tx_polarity_flip_phy11=1 +phy_tx_polarity_flip_phy12=1 +phy_tx_polarity_flip_phy13=1 +phy_tx_polarity_flip_phy14=1 +phy_tx_polarity_flip_phy15=1 +phy_tx_polarity_flip_phy16=1 +phy_tx_polarity_flip_phy17=1 +phy_tx_polarity_flip_phy18=1 +phy_tx_polarity_flip_phy19=1 +phy_tx_polarity_flip_phy20=1 +phy_tx_polarity_flip_phy21=1 +phy_tx_polarity_flip_phy22=1 +phy_tx_polarity_flip_phy23=1 +phy_tx_polarity_flip_phy24=1 +phy_tx_polarity_flip_phy25=1 +phy_tx_polarity_flip_phy26=1 +phy_tx_polarity_flip_phy27=1 +phy_tx_polarity_flip_phy28=1 +phy_tx_polarity_flip_phy29=1 +phy_tx_polarity_flip_phy30=1 +phy_tx_polarity_flip_phy31=1 +phy_tx_polarity_flip_phy32=1 +phy_tx_polarity_flip_phy33=1 +phy_tx_polarity_flip_phy34=1 +phy_tx_polarity_flip_phy35=1 +phy_tx_polarity_flip_phy36=1 +phy_tx_polarity_flip_phy37=1 +phy_tx_polarity_flip_phy38=1 +phy_tx_polarity_flip_phy39=1 +phy_tx_polarity_flip_phy40=1 +phy_tx_polarity_flip_phy41=1 +phy_tx_polarity_flip_phy42=1 +phy_tx_polarity_flip_phy43=1 +phy_tx_polarity_flip_phy44=1 +phy_tx_polarity_flip_phy45=1 +phy_tx_polarity_flip_phy46=1 +phy_tx_polarity_flip_phy47=1 +phy_tx_polarity_flip_phy48=1 +phy_tx_polarity_flip_phy49=1 +phy_tx_polarity_flip_phy50=1 +phy_tx_polarity_flip_phy51=1 +phy_tx_polarity_flip_phy52=1 +phy_tx_polarity_flip_phy53=1 +phy_tx_polarity_flip_phy54=1 +phy_tx_polarity_flip_phy55=1 +phy_tx_polarity_flip_phy56=1 +phy_tx_polarity_flip_phy57=1 +phy_tx_polarity_flip_phy58=1 +phy_tx_polarity_flip_phy59=1 +phy_tx_polarity_flip_phy60=1 +phy_tx_polarity_flip_phy61=1 +phy_tx_polarity_flip_phy62=1 +phy_tx_polarity_flip_phy63=1 +phy_tx_polarity_flip_phy64=1 +phy_tx_polarity_flip_phy65=1 +phy_tx_polarity_flip_phy66=1 +phy_tx_polarity_flip_phy67=1 +phy_tx_polarity_flip_phy68=1 +phy_tx_polarity_flip_phy69=1 +phy_tx_polarity_flip_phy70=1 +phy_tx_polarity_flip_phy71=1 +phy_tx_polarity_flip_phy72=0 +phy_tx_polarity_flip_phy73=0 +phy_tx_polarity_flip_phy74=0 +phy_tx_polarity_flip_phy75=0 +phy_tx_polarity_flip_phy76=0 +phy_tx_polarity_flip_phy77=0 +phy_tx_polarity_flip_phy78=0 +phy_tx_polarity_flip_phy79=0 +phy_tx_polarity_flip_phy80=0 +phy_tx_polarity_flip_phy81=0 +phy_tx_polarity_flip_phy82=0 +phy_tx_polarity_flip_phy83=0 +phy_tx_polarity_flip_phy84=0 +phy_tx_polarity_flip_phy85=0 +phy_tx_polarity_flip_phy86=0 +phy_tx_polarity_flip_phy87=0 +phy_tx_polarity_flip_phy88=1 +phy_tx_polarity_flip_phy89=1 +phy_tx_polarity_flip_phy90=1 +phy_tx_polarity_flip_phy91=1 +phy_tx_polarity_flip_phy92=1 +phy_tx_polarity_flip_phy93=1 +phy_tx_polarity_flip_phy94=1 +phy_tx_polarity_flip_phy95=1 +phy_tx_polarity_flip_phy96=1 +phy_tx_polarity_flip_phy97=1 +phy_tx_polarity_flip_phy98=1 +phy_tx_polarity_flip_phy99=1 +phy_tx_polarity_flip_phy100=1 +phy_tx_polarity_flip_phy101=1 +phy_tx_polarity_flip_phy102=1 +phy_tx_polarity_flip_phy103=1 +phy_tx_polarity_flip_phy104=1 +phy_tx_polarity_flip_phy105=1 +phy_tx_polarity_flip_phy106=1 +phy_tx_polarity_flip_phy107=1 +phy_tx_polarity_flip_phy108=1 +phy_tx_polarity_flip_phy109=1 +phy_tx_polarity_flip_phy110=1 +phy_tx_polarity_flip_phy111=1 +phy_tx_polarity_flip_phy112=1 +phy_tx_polarity_flip_phy113=1 +phy_tx_polarity_flip_phy114=1 +phy_tx_polarity_flip_phy115=1 +phy_tx_polarity_flip_phy116=1 +phy_tx_polarity_flip_phy117=1 +phy_tx_polarity_flip_phy118=1 +phy_tx_polarity_flip_phy119=1 +phy_tx_polarity_flip_phy120=1 +phy_tx_polarity_flip_phy121=1 +phy_tx_polarity_flip_phy122=1 +phy_tx_polarity_flip_phy123=1 +phy_tx_polarity_flip_phy124=1 +phy_tx_polarity_flip_phy125=1 +phy_tx_polarity_flip_phy126=1 +phy_tx_polarity_flip_phy127=1 +phy_tx_polarity_flip_phy128=1 +phy_tx_polarity_flip_phy129=1 +phy_tx_polarity_flip_phy130=1 +phy_tx_polarity_flip_phy131=1 +phy_tx_polarity_flip_phy132=1 +phy_tx_polarity_flip_phy133=1 +phy_tx_polarity_flip_phy134=1 +phy_tx_polarity_flip_phy135=1 +phy_tx_polarity_flip_phy136=1 +phy_tx_polarity_flip_phy137=1 +phy_tx_polarity_flip_phy138=1 +phy_tx_polarity_flip_phy139=1 +phy_tx_polarity_flip_phy140=1 +phy_tx_polarity_flip_phy141=1 +phy_tx_polarity_flip_phy142=1 +phy_tx_polarity_flip_phy143=1 + +serdes_tx_taps_1=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_2=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_3=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_4=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_5=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_6=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_7=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_8=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_9=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_10=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_11=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_12=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_13=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_14=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_15=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_16=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_17=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_18=nrz:-8:89:-29:0:0:0 +serdes_tx_taps_19=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_20=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_21=nrz:-4:75:-21:0:0:0 +serdes_tx_taps_22=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_23=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_24=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_25=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_26=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_27=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_28=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_29=nrz:-5:78:-22:0:0:0 +serdes_tx_taps_30=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_31=nrz:-7:85:-25:0:0:0 +serdes_tx_taps_32=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_33=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_34=nrz:-5:75:-20:0:0:0 +serdes_tx_taps_35=nrz:-5:80:-23:0:0:0 +serdes_tx_taps_36=nrz:-7:85:-25:0:0:0 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/port_config.ini new file mode 100644 index 000000000000..d5b9419c950f --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/port_config.ini @@ -0,0 +1,39 @@ +# name lanes alias index role speed asic_port_name coreId corePortId numVoq +Ethernet144 72,73,74,75 Ethernet19/1 19 Ext 100000 Eth144-ASIC1 1 1 8 +Ethernet148 76,77,78,79 Ethernet19/5 19 Ext 100000 Eth148-ASIC1 1 2 8 +Ethernet152 80,81,82,83 Ethernet20/1 20 Ext 100000 Eth152-ASIC1 1 3 8 +Ethernet156 84,85,86,87 Ethernet20/5 20 Ext 100000 Eth156-ASIC1 1 4 8 +Ethernet160 88,89,90,91 Ethernet21/1 21 Ext 100000 Eth160-ASIC1 1 5 8 +Ethernet164 92,93,94,95 Ethernet21/5 21 Ext 100000 Eth164-ASIC1 1 6 8 +Ethernet168 96,97,98,99 Ethernet22/1 22 Ext 100000 Eth168-ASIC1 1 7 8 +Ethernet172 100,101,102,103 Ethernet22/5 22 Ext 100000 Eth172-ASIC1 1 8 8 +Ethernet176 104,105,106,107 Ethernet23/1 23 Ext 100000 Eth176-ASIC1 1 9 8 +Ethernet180 108,109,110,111 Ethernet23/5 23 Ext 100000 Eth180-ASIC1 1 10 8 +Ethernet184 112,113,114,115 Ethernet24/1 24 Ext 100000 Eth184-ASIC1 1 11 8 +Ethernet188 116,117,118,119 Ethernet24/5 24 Ext 100000 Eth188-ASIC1 1 12 8 +Ethernet192 120,121,122,123 Ethernet25/1 25 Ext 100000 Eth192-ASIC1 1 13 8 +Ethernet196 124,125,126,127 Ethernet25/5 25 Ext 100000 Eth196-ASIC1 1 14 8 +Ethernet200 128,129,130,131 Ethernet26/1 26 Ext 100000 Eth200-ASIC1 1 15 8 +Ethernet204 132,133,134,135 Ethernet26/5 26 Ext 100000 Eth204-ASIC1 1 16 8 +Ethernet208 136,137,138,139 Ethernet27/1 27 Ext 100000 Eth208-ASIC1 1 17 8 +Ethernet212 140,141,142,143 Ethernet27/5 27 Ext 100000 Eth212-ASIC1 1 18 8 +Ethernet216 64,65,66,67 Ethernet28/1 28 Ext 100000 Eth216-ASIC1 0 19 8 +Ethernet220 68,69,70,71 Ethernet28/5 28 Ext 100000 Eth220-ASIC1 0 20 8 +Ethernet224 56,57,58,59 Ethernet29/1 29 Ext 100000 Eth224-ASIC1 0 21 8 +Ethernet228 60,61,62,63 Ethernet29/5 29 Ext 100000 Eth228-ASIC1 0 22 8 +Ethernet232 48,49,50,51 Ethernet30/1 30 Ext 100000 Eth232-ASIC1 0 23 8 +Ethernet236 52,53,54,55 Ethernet30/5 30 Ext 100000 Eth236-ASIC1 0 24 8 +Ethernet240 40,41,42,43 Ethernet31/1 31 Ext 100000 Eth240-ASIC1 0 25 8 +Ethernet244 44,45,46,47 Ethernet31/5 31 Ext 100000 Eth244-ASIC1 0 26 8 +Ethernet248 32,33,34,35 Ethernet32/1 32 Ext 100000 Eth248-ASIC1 0 27 8 +Ethernet252 36,37,38,39 Ethernet32/5 32 Ext 100000 Eth252-ASIC1 0 28 8 +Ethernet256 24,25,26,27 Ethernet33/1 33 Ext 100000 Eth256-ASIC1 0 29 8 +Ethernet260 28,29,30,31 Ethernet33/5 33 Ext 100000 Eth260-ASIC1 0 30 8 +Ethernet264 16,17,18,19 Ethernet34/1 34 Ext 100000 Eth264-ASIC1 0 31 8 +Ethernet268 20,21,22,23 Ethernet34/5 34 Ext 100000 Eth268-ASIC1 0 32 8 +Ethernet272 8,9,10,11 Ethernet35/1 35 Ext 100000 Eth272-ASIC1 0 33 8 +Ethernet276 12,13,14,15 Ethernet35/5 35 Ext 100000 Eth276-ASIC1 0 34 8 +Ethernet280 0,1,2,3 Ethernet36/1 36 Ext 100000 Eth280-ASIC1 0 35 8 +Ethernet284 4,5,6,7 Ethernet36/5 36 Ext 100000 Eth284-ASIC1 0 36 8 +Ethernet-Rec1 221 Recirc0/0 19 Rec 400000 Rcy0-ASIC1 0 221 8 +Ethernet-IB1 222 Recirc0/1 20 Inb 400000 Rcy1-ASIC1 1 222 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/sai.profile b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/sai.profile new file mode 120000 index 000000000000..1e172f3e0765 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/sai.profile @@ -0,0 +1 @@ +../0/sai.profile \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/port_config.ini new file mode 100644 index 000000000000..11446286191d --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/port_config.ini @@ -0,0 +1,77 @@ +# name lanes alias index role speed asic_port_name coreId corePortId numVoq +Ethernet0 72,73,74,75 Ethernet1/1 1 Ext 100000 Eth0-ASIC0 1 1 8 +Ethernet4 76,77,78,79 Ethernet1/5 1 Ext 100000 Eth4-ASIC0 1 2 8 +Ethernet8 80,81,82,83 Ethernet2/1 2 Ext 100000 Eth8-ASIC0 1 3 8 +Ethernet12 84,85,86,87 Ethernet2/5 2 Ext 100000 Eth12-ASIC0 1 4 8 +Ethernet16 88,89,90,91 Ethernet3/1 3 Ext 100000 Eth16-ASIC0 1 5 8 +Ethernet20 92,93,94,95 Ethernet3/5 3 Ext 100000 Eth20-ASIC0 1 6 8 +Ethernet24 96,97,98,99 Ethernet4/1 4 Ext 100000 Eth24-ASIC0 1 7 8 +Ethernet28 100,101,102,103 Ethernet4/5 4 Ext 100000 Eth28-ASIC0 1 8 8 +Ethernet32 104,105,106,107 Ethernet5/1 5 Ext 100000 Eth32-ASIC0 1 9 8 +Ethernet36 108,109,110,111 Ethernet5/5 5 Ext 100000 Eth36-ASIC0 1 10 8 +Ethernet40 112,113,114,115 Ethernet6/1 6 Ext 100000 Eth40-ASIC0 1 11 8 +Ethernet44 116,117,118,119 Ethernet6/5 6 Ext 100000 Eth44-ASIC0 1 12 8 +Ethernet48 120,121,122,123 Ethernet7/1 7 Ext 100000 Eth48-ASIC0 1 13 8 +Ethernet52 124,125,126,127 Ethernet7/5 7 Ext 100000 Eth52-ASIC0 1 14 8 +Ethernet56 128,129,130,131 Ethernet8/1 8 Ext 100000 Eth56-ASIC0 1 15 8 +Ethernet60 132,133,134,135 Ethernet8/5 8 Ext 100000 Eth60-ASIC0 1 16 8 +Ethernet64 136,137,138,139 Ethernet9/1 9 Ext 100000 Eth64-ASIC0 1 17 8 +Ethernet68 140,141,142,143 Ethernet9/5 9 Ext 100000 Eth68-ASIC0 1 18 8 +Ethernet72 64,65,66,67 Ethernet10/1 10 Ext 100000 Eth72-ASIC0 0 19 8 +Ethernet76 68,69,70,71 Ethernet10/5 10 Ext 100000 Eth76-ASIC0 0 20 8 +Ethernet80 56,57,58,59 Ethernet11/1 11 Ext 100000 Eth80-ASIC0 0 21 8 +Ethernet84 60,61,62,63 Ethernet11/5 11 Ext 100000 Eth84-ASIC0 0 22 8 +Ethernet88 48,49,50,51 Ethernet12/1 12 Ext 100000 Eth88-ASIC0 0 23 8 +Ethernet92 52,53,54,55 Ethernet12/5 12 Ext 100000 Eth92-ASIC0 0 24 8 +Ethernet96 40,41,42,43 Ethernet13/1 13 Ext 100000 Eth96-ASIC0 0 25 8 +Ethernet100 44,45,46,47 Ethernet13/5 13 Ext 100000 Eth100-ASIC0 0 26 8 +Ethernet104 32,33,34,35 Ethernet14/1 14 Ext 100000 Eth104-ASIC0 0 27 8 +Ethernet108 36,37,38,39 Ethernet14/5 14 Ext 100000 Eth108-ASIC0 0 28 8 +Ethernet112 24,25,26,27 Ethernet15/1 15 Ext 100000 Eth112-ASIC0 0 29 8 +Ethernet116 28,29,30,31 Ethernet15/5 15 Ext 100000 Eth116-ASIC0 0 30 8 +Ethernet120 16,17,18,19 Ethernet16/1 16 Ext 100000 Eth120-ASIC0 0 31 8 +Ethernet124 20,21,22,23 Ethernet16/5 16 Ext 100000 Eth124-ASIC0 0 32 8 +Ethernet128 8,9,10,11 Ethernet17/1 17 Ext 100000 Eth128-ASIC0 0 33 8 +Ethernet132 12,13,14,15 Ethernet17/5 17 Ext 100000 Eth132-ASIC0 0 34 8 +Ethernet136 0,1,2,3 Ethernet18/1 18 Ext 100000 Eth136-ASIC0 0 35 8 +Ethernet140 4,5,6,7 Ethernet18/5 18 Ext 100000 Eth140-ASIC0 0 36 8 +Ethernet-Rec0 221 Recirc0/0 19 Rec 400000 Rcy0-ASIC0 0 221 8 +Ethernet-IB0 222 Recirc0/1 20 Inb 400000 Rcy1-ASIC0 1 222 8 +Ethernet144 72,73,74,75 Ethernet19/1 19 Ext 100000 Eth144-ASIC1 1 1 8 +Ethernet148 76,77,78,79 Ethernet19/5 19 Ext 100000 Eth148-ASIC1 1 2 8 +Ethernet152 80,81,82,83 Ethernet20/1 20 Ext 100000 Eth152-ASIC1 1 3 8 +Ethernet156 84,85,86,87 Ethernet20/5 20 Ext 100000 Eth156-ASIC1 1 4 8 +Ethernet160 88,89,90,91 Ethernet21/1 21 Ext 100000 Eth160-ASIC1 1 5 8 +Ethernet164 92,93,94,95 Ethernet21/5 21 Ext 100000 Eth164-ASIC1 1 6 8 +Ethernet168 96,97,98,99 Ethernet22/1 22 Ext 100000 Eth168-ASIC1 1 7 8 +Ethernet172 100,101,102,103 Ethernet22/5 22 Ext 100000 Eth172-ASIC1 1 8 8 +Ethernet176 104,105,106,107 Ethernet23/1 23 Ext 100000 Eth176-ASIC1 1 9 8 +Ethernet180 108,109,110,111 Ethernet23/5 23 Ext 100000 Eth180-ASIC1 1 10 8 +Ethernet184 112,113,114,115 Ethernet24/1 24 Ext 100000 Eth184-ASIC1 1 11 8 +Ethernet188 116,117,118,119 Ethernet24/5 24 Ext 100000 Eth188-ASIC1 1 12 8 +Ethernet192 120,121,122,123 Ethernet25/1 25 Ext 100000 Eth192-ASIC1 1 13 8 +Ethernet196 124,125,126,127 Ethernet25/5 25 Ext 100000 Eth196-ASIC1 1 14 8 +Ethernet200 128,129,130,131 Ethernet26/1 26 Ext 100000 Eth200-ASIC1 1 15 8 +Ethernet204 132,133,134,135 Ethernet26/5 26 Ext 100000 Eth204-ASIC1 1 16 8 +Ethernet208 136,137,138,139 Ethernet27/1 27 Ext 100000 Eth208-ASIC1 1 17 8 +Ethernet212 140,141,142,143 Ethernet27/5 27 Ext 100000 Eth212-ASIC1 1 18 8 +Ethernet216 64,65,66,67 Ethernet28/1 28 Ext 100000 Eth216-ASIC1 0 19 8 +Ethernet220 68,69,70,71 Ethernet28/5 28 Ext 100000 Eth220-ASIC1 0 20 8 +Ethernet224 56,57,58,59 Ethernet29/1 29 Ext 100000 Eth224-ASIC1 0 21 8 +Ethernet228 60,61,62,63 Ethernet29/5 29 Ext 100000 Eth228-ASIC1 0 22 8 +Ethernet232 48,49,50,51 Ethernet30/1 30 Ext 100000 Eth232-ASIC1 0 23 8 +Ethernet236 52,53,54,55 Ethernet30/5 30 Ext 100000 Eth236-ASIC1 0 24 8 +Ethernet240 40,41,42,43 Ethernet31/1 31 Ext 100000 Eth240-ASIC1 0 25 8 +Ethernet244 44,45,46,47 Ethernet31/5 31 Ext 100000 Eth244-ASIC1 0 26 8 +Ethernet248 32,33,34,35 Ethernet32/1 32 Ext 100000 Eth248-ASIC1 0 27 8 +Ethernet252 36,37,38,39 Ethernet32/5 32 Ext 100000 Eth252-ASIC1 0 28 8 +Ethernet256 24,25,26,27 Ethernet33/1 33 Ext 100000 Eth256-ASIC1 0 29 8 +Ethernet260 28,29,30,31 Ethernet33/5 33 Ext 100000 Eth260-ASIC1 0 30 8 +Ethernet264 16,17,18,19 Ethernet34/1 34 Ext 100000 Eth264-ASIC1 0 31 8 +Ethernet268 20,21,22,23 Ethernet34/5 34 Ext 100000 Eth268-ASIC1 0 32 8 +Ethernet272 8,9,10,11 Ethernet35/1 35 Ext 100000 Eth272-ASIC1 0 33 8 +Ethernet276 12,13,14,15 Ethernet35/5 35 Ext 100000 Eth276-ASIC1 0 34 8 +Ethernet280 0,1,2,3 Ethernet36/1 36 Ext 100000 Eth280-ASIC1 0 35 8 +Ethernet284 4,5,6,7 Ethernet36/5 36 Ext 100000 Eth284-ASIC1 0 36 8 +Ethernet-Rec1 221 Recirc0/0 19 Rec 400000 Rcy0-ASIC1 0 221 8 +Ethernet-IB1 222 Recirc0/1 20 Inb 400000 Rcy1-ASIC1 1 222 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36DM2-C72 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36DM2-C72 new file mode 120000 index 000000000000..762deebff6a7 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36DM2-C72 @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36P-C72 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36P-C72 new file mode 120000 index 000000000000..762deebff6a7 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36P-C72 @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36D2-C72 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36D2-C72 new file mode 120000 index 000000000000..762deebff6a7 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36D2-C72 @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36DM2-C72 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36DM2-C72 new file mode 120000 index 000000000000..762deebff6a7 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3AK-36DM2-C72 @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/asic.conf b/device/arista/x86_64-arista_7800r3a_36d2_lc/asic.conf new file mode 100644 index 000000000000..3e123ed50a13 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/asic.conf @@ -0,0 +1,3 @@ +NUM_ASIC=2 +DEV_ID_ASIC_0=06:00.0 +DEV_ID_ASIC_1=07:00.0 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/chassisdb.conf b/device/arista/x86_64-arista_7800r3a_36d2_lc/chassisdb.conf new file mode 100644 index 000000000000..e259cf742191 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/chassisdb.conf @@ -0,0 +1,2 @@ +midplane_subnet=127.100.0.0/16 +chassis_db_address=127.100.1.1 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/pcie.yaml b/device/arista/x86_64-arista_7800r3a_36d2_lc/pcie.yaml new file mode 100644 index 000000000000..4b4481f3154d --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/pcie.yaml @@ -0,0 +1,246 @@ +- bus: '00' + dev: '00' + fn: '0' + id: '1450' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: '1451' + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O + Memory Management Unit' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '5' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '6' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '02' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '04' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 59)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: '1460' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 0' +- bus: '00' + dev: '18' + fn: '1' + id: '1461' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 1' +- bus: '00' + dev: '18' + fn: '2' + id: '1462' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 2' +- bus: '00' + dev: '18' + fn: '3' + id: '1463' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 3' +- bus: '00' + dev: '18' + fn: '4' + id: '1464' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 4' +- bus: '00' + dev: '18' + fn: '5' + id: '1465' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 5' +- bus: '00' + dev: '18' + fn: '6' + id: '1466' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arista Networks, Inc. Device 0001' +- bus: '04' + dev: '00' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '03' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '04' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '05' + dev: '05' + fn: '0' + id: '8717' + name: 'PCI bridge: PLX Technology, Inc. PEX 8717 16-lane, 8-Port PCI Express Gen + 3 (8.0 GT/s) Switch with DMA (rev ca)' +- bus: '06' + dev: '00' + fn: '0' + id: '8852' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device 8852 (rev 02)' +- bus: '07' + dev: '00' + fn: '0' + id: '8852' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device 8852 (rev 02)' +- bus: 08 + dev: '00' + fn: '0' + id: '0001' + name: 'System peripheral: Arista Networks, Inc. Device 0001 (rev 01)' +- bus: '10' + dev: '00' + fn: '0' + id: '1682' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM57762 Gigabit + Ethernet PCIe (rev 01)' +- bus: '11' + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: '11' + dev: '00' + fn: '2' + id: '1456' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 00h-0fh) Platform Security Processor' +- bus: '11' + dev: '00' + fn: '3' + id: 145f + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Zeppelin USB 3.0 Host + controller' +- bus: '12' + dev: '00' + fn: '0' + id: '1455' + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Renoir PCIe Dummy Function' +- bus: '12' + dev: '00' + fn: '1' + id: '1468' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Zeppelin Cryptographic + Coprocessor NTBCCP' +- bus: '12' + dev: '00' + fn: '2' + id: '7901' + name: 'SATA controller: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI + mode] (rev 51)' +- bus: '12' + dev: '00' + fn: '3' + id: '1457' + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + HD Audio Controller' diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_asic b/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_asic new file mode 100644 index 000000000000..9ba24ca3e753 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_asic @@ -0,0 +1 @@ +broadcom-dnx diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_env.conf b/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_env.conf new file mode 100644 index 000000000000..558fb7393f62 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/platform_env.conf @@ -0,0 +1,2 @@ +usemsi=1 +dmasize=64M diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/plugins b/device/arista/x86_64-arista_7800r3a_36d2_lc/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/pmon_daemon_control.json b/device/arista/x86_64-arista_7800r3a_36d2_lc/pmon_daemon_control.json new file mode 120000 index 000000000000..26ee0d4d1384 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control_linecard.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/sensors.conf b/device/arista/x86_64-arista_7800r3a_36d2_lc/sensors.conf new file mode 100644 index 000000000000..d2b272483eee --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/sensors.conf @@ -0,0 +1,6 @@ +# autogenerated by arista + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + set temp1_max 90 + set temp1_crit 95 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/system_health_monitoring_config.json b/device/arista/x86_64-arista_7800r3a_36d2_lc/system_health_monitoring_config.json new file mode 120000 index 000000000000..035cde619cd9 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config_linecard.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/thermal_policy.json b/device/arista/x86_64-arista_7800r3a_36d2_lc/thermal_policy.json new file mode 120000 index 000000000000..7c7982deaffa --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy_linecard.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36d_lc b/device/arista/x86_64-arista_7800r3a_36d_lc new file mode 120000 index 000000000000..50e843fb3105 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d_lc @@ -0,0 +1 @@ +x86_64-arista_7800r3a_36d2_lc \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36dm2_lc b/device/arista/x86_64-arista_7800r3a_36dm2_lc new file mode 120000 index 000000000000..50e843fb3105 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36dm2_lc @@ -0,0 +1 @@ +x86_64-arista_7800r3a_36d2_lc \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3a_36p_lc b/device/arista/x86_64-arista_7800r3a_36p_lc new file mode 120000 index 000000000000..50e843fb3105 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36p_lc @@ -0,0 +1 @@ +x86_64-arista_7800r3a_36d2_lc \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3ak_36d2_lc b/device/arista/x86_64-arista_7800r3ak_36d2_lc new file mode 120000 index 000000000000..50e843fb3105 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3ak_36d2_lc @@ -0,0 +1 @@ +x86_64-arista_7800r3a_36d2_lc \ No newline at end of file diff --git a/device/arista/x86_64-arista_7800r3ak_36dm2_lc b/device/arista/x86_64-arista_7800r3ak_36dm2_lc new file mode 120000 index 000000000000..50e843fb3105 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3ak_36dm2_lc @@ -0,0 +1 @@ +x86_64-arista_7800r3a_36d2_lc \ No newline at end of file diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 2510695d1363..5fe64b6884a4 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -558,6 +558,22 @@ write_platform_specific_cmdline() { aboot_machine=arista_7800r3_48cqm2_lc sonic_mode="$linecard_mode" fi + if [ "$sid" = "WolverineQCpu" ]; then + aboot_machine=arista_7800r3a_36d2_lc + sonic_mode="$linecard_mode" + fi + if [ "$sid" = "WolverineQCpuBk" ]; then + aboot_machine=arista_7800r3ak_36d2_lc + sonic_mode="$linecard_mode" + fi + if [ "$sid" = "WolverineQCpuMs" ]; then + aboot_machine=arista_7800r3a_36dm2_lc + sonic_mode="$linecard_mode" + fi + if [ "$sid" = "WolverineQCpuBkMs" ]; then + aboot_machine=arista_7800r3ak_36dm2_lc + sonic_mode="$linecard_mode" + fi if [ "$sid" = "OtterLake" ]; then aboot_machine=arista_7800_sup flash_size=30000 From b313563986a71b478e8bae486950cdcccb518c0f Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 23 May 2022 17:52:56 +0800 Subject: [PATCH 334/817] [ci] Add arm artifacts in common lib azure pipeline (#10817) * [ci] Add arm artifacts in common lib azure pipeline --- .azure-pipelines/template-commonlib.yml | 91 ++++++++++++++----------- slave.mk | 4 ++ 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/.azure-pipelines/template-commonlib.yml b/.azure-pipelines/template-commonlib.yml index 61a801e3f526..cd7551d83823 100644 --- a/.azure-pipelines/template-commonlib.yml +++ b/.azure-pipelines/template-commonlib.yml @@ -1,40 +1,53 @@ -jobs: -- job: Build - timeoutInMinutes: 120 - pool: sonicbld - variables: - - template: template-variables.yml - steps: - - checkout: self - clean: true - submodules: recursive - - script: | - set -ex - branch=$(Build.SourceBranchName) - # DIST_MASTER is set in variable. - BRANCH=DIST_${branch^^} - bldenvs=${!BRANCH} - [ "$bldenvs" == "" ] && bldenvs="$(COMMON_LIB_BUILD_ENVS)" - for bldenv in $bldenvs - do - BLDENV=$bldenv make -f Makefile.work configure PLATFORM=vs ENABLE_DOCKER_BASE_PULL=y - done - set +x - echo "##vso[task.setvariable variable=bldenvs;]$bldenvs" - displayName: Make configure - - script: | - set -ex - for bldenv in $(bldenvs) - do - LIBNL3_VERSION_BASE=$(grep "LIBNL3_VERSION_BASE =" rules/libnl3.mk | awk '{print$3}') - LIBNL3_VERSION=$(grep "LIBNL3_VERSION =" rules/libnl3.mk | awk '{print$3}' | sed -e "s/(//" -e "s/)//" -e "s/\\$//" -e "s/LIBNL3_VERSION_BASE/$LIBNL3_VERSION_BASE/") - SONIC_BUILD_JOBS=$(nproc) BLDENV=$bldenv make -f Makefile.work target/debs/$bldenv/libnl-3-200_${LIBNL3_VERSION}_amd64.deb ENABLE_DOCKER_BASE_PULL=y +parameters: +- name: archs + type: object + default: + - amd64 + - armhf + - arm64 - LIBYANG_VERSION_BASE=$(grep "LIBYANG_VERSION_BASE =" rules/libyang.mk | awk '{print$3}') - LIBYANG_VERSION=$(grep "LIBYANG_VERSION =" rules/libyang.mk | awk '{print$3}' | sed -e "s/\\$//" -e "s/(//" -e "s/)//" -e "s/LIBYANG_VERSION_BASE/$LIBYANG_VERSION_BASE/") - SONIC_BUILD_JOBS=$(nproc) BLDENV=$bldenv make -f Makefile.work target/debs/$bldenv/libyang_${LIBYANG_VERSION}_amd64.deb - done - mv target $(Build.ArtifactStagingDirectory) - displayName: Make common lib packages - - publish: $(Build.ArtifactStagingDirectory) - artifact: common-lib +jobs: +- ${{ each arch in parameters.archs }}: + - job: Build_${{ arch }} + timeoutInMinutes: 120 + ${{ if eq(arch,'amd64') }}: + pool: sonicbld + ${{ else }}: + pool: sonicbld-${{ arch }} + variables: + - template: template-variables.yml + steps: + - checkout: self + clean: true + submodules: recursive + - script: | + set -ex + branch=$(Build.SourceBranchName) + # replace all: '-' -> '_' + branch=${branch//-/_} + # replace all: 'a' -> 'A', DIST_MASTER is set in variable. + BRANCH=DIST_${branch^^} + # variable name is dynamic + bldenvs=${!BRANCH} + [ "$bldenvs" == "" ] && bldenvs="$(COMMON_LIB_BUILD_ENVS)" + for bldenv in $bldenvs + do + BLDENV=$bldenv make -f Makefile.work configure PLATFORM_ARCH=${{ arch }} PLATFORM=vs ENABLE_DOCKER_BASE_PULL=y + done + set +x + echo "##vso[task.setvariable variable=bldenvs;]$bldenvs" + displayName: Make configure + - script: | + set -ex + for bldenv in $(bldenvs) + do + SONIC_BUILD_JOBS=$(nproc) BLDENV=$bldenv make -f Makefile.work lib-packages ENABLE_DOCKER_BASE_PULL=y + done + mv target $(Build.ArtifactStagingDirectory) + displayName: Make common lib packages + - ${{ if eq(arch,'amd64') }}: + - publish: $(Build.ArtifactStagingDirectory) + artifact: common-lib + - ${{ else }}: + - publish: $(Build.ArtifactStagingDirectory) + artifact: common-lib.${{ arch }} diff --git a/slave.mk b/slave.mk index 44d9e0ed8849..7b91ba0384c0 100644 --- a/slave.mk +++ b/slave.mk @@ -1377,3 +1377,7 @@ jessie : $$(addprefix $(TARGET_PATH)/,$$(JESSIE_DOCKER_IMAGES)) \ .PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_FILES) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_STDEB_DEBS) $(SONIC_CLEAN_WHEELS) $(SONIC_PHONY_TARGETS) clean distclean configure .INTERMEDIATE : $(SONIC_INSTALL_DEBS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform + +## To build some commonly used libs. Some submodules depend on these libs. +## It is used in component pipelines. For example: swss needs libnl, libyang +lib-packages: $(addprefix $(DEBS_PATH)/,$(LIBNL3) $(LIBYANG)) From 70e2727b02429ec54e85232d382e6f2aa9d44bc7 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 23 May 2022 13:28:13 -0700 Subject: [PATCH 335/817] [Arista] Update platform submodules (#10800) This update has following changes Refactor pci topology logic for chassis (fixes some chassis commands and chassisd on linecard) Introduce new cooling algorithm Fix linecard poweroff logic when supervisor is going down Fix linecard status led leading to system-health crashing Misc fixes --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 9b61f8bdbe65..6e6f1f904f28 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 9b61f8bdbe657e8798bc40c09039a6e0a7f5d150 +Subproject commit 6e6f1f904f28df7fa06c169a71a1d77e739f431a diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 9b61f8bdbe65..6e6f1f904f28 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 9b61f8bdbe657e8798bc40c09039a6e0a7f5d150 +Subproject commit 6e6f1f904f28df7fa06c169a71a1d77e739f431a From b23ad6748af04964c3c67f4069514f5cd8e5794d Mon Sep 17 00:00:00 2001 From: Song Yuan <64041228+ysmanman@users.noreply.github.com> Date: Mon, 23 May 2022 13:50:04 -0700 Subject: [PATCH 336/817] [Arista] Add QOS and buffer profiles for SKU Arista-7800R3-48CQM2-C48 (#10752) * Add QOS and buffer profiles for Arista SKU. * Add unit test for SKU Arista-7800R3-48CQM2-C48. --- .../Arista-7800R3-48CQM2-C48/buffers.json.j2 | 2 + .../buffers_defaults_t2.j2 | 65 +++++++++++++++++++ .../pg_profile_lookup.ini | 23 +++++++ .../Arista-7800R3-48CQM2-C48/qos.json.j2 | 21 ++++++ src/sonic-config-engine/tests/test_j2files.py | 10 ++- 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers.json.j2 create mode 100644 device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 create mode 100644 device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini create mode 100644 device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers.json.j2 b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..b292a354b55a --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 @@ -0,0 +1,65 @@ +{%- set default_cable = '5m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,192,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "3220805000", + "type": "both", + "mode": "dynamic", + "xoff": "2102272" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "dynamic_th":"-2", + "xon_offset":"2560", + "xon":"0", + "xoff":"66048" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "xon_offset":"0", + "static_th":"30535680" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini new file mode 100644 index 000000000000..887b6a493291 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini @@ -0,0 +1,23 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1280 2560 45506 0 1280 + 25000 5m 1280 2560 49152 0 1280 + 40000 5m 1280 2560 49152 0 1280 + 50000 5m 1280 2560 53248 0 1280 + 100000 5m 1280 2560 65536 0 1280 + 200000 5m 1280 2560 90112 0 1280 + 400000 5m 1280 2560 135168 0 1280 + 10000 40m 1280 2560 45506 0 1280 + 25000 40m 1280 2560 49152 0 1280 + 40000 40m 1280 2560 53248 0 1280 + 50000 40m 1280 2560 57344 0 1280 + 100000 40m 1280 2560 69632 0 1280 + 200000 40m 1280 2560 102400 0 1280 + 400000 40m 1280 2560 159744 0 1280 + 10000 300m 1280 2560 49152 0 1280 + 25000 300m 1280 2560 61440 0 1280 + 40000 300m 1280 2560 69632 0 1280 + 50000 300m 1280 2560 77824 0 1280 + 100000 300m 1280 2560 114688 0 1280 + 200000 300m 1280 2560 188416 0 1280 + 400000 300m 1280 2560 331776 0 1280 diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 new file mode 100644 index 000000000000..34002048afdb --- /dev/null +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 52d4260dba77..af66af8eb59e 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -212,8 +212,8 @@ def test_qos_arista7050_render_template(self): sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) - def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): - arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', 'x86_64-arista_7800r3_48cq2_lc', 'Arista-7800R3-48CQ2-C48') + def do_test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self, platform, hwsku): + arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', platform, hwsku) qos_file = os.path.join(arista_dir_path, 'qos.json.j2') buffer_file = os.path.join(arista_dir_path, 'buffers.json.j2') port_config_ini_file = os.path.join(arista_dir_path, 'port_config.ini') @@ -236,6 +236,12 @@ def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, sample_output_file) assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) + def test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self): + self.do_test_qos_and_buffer_arista7800r3_48cq2_lc_render_template('x86_64-arista_7800r3_48cq2_lc', 'Arista-7800R3-48CQ2-C48') + + def test_qos_and_buffer_arista7800r3_48cqm2_lc_render_template(self): + self.do_test_qos_and_buffer_arista7800r3_48cq2_lc_render_template('x86_64-arista_7800r3_48cqm2_lc', 'Arista-7800R3-48CQM2-C48') + def test_qos_dell9332_render_template(self): dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') qos_file = os.path.join(dell_dir_path, 'qos.json.j2') From c92bfe0728ff1809603e255e782dc717f3550f4c Mon Sep 17 00:00:00 2001 From: jerseyang <48576574+jerseyang@users.noreply.github.com> Date: Tue, 24 May 2022 09:45:37 +0800 Subject: [PATCH 337/817] Add belgite support (#9511) Why I did it add celestica belgite platform How I did it add belgite platform in celestica Co-authored-by: nicwu-cel Co-authored-by: anjian Co-authored-by: sandycelestica --- .../CELESTICA-BELGITE/belgite.config.bcm | 169 ++++ .../CELESTICA-BELGITE/port_config.ini | 57 ++ .../CELESTICA-BELGITE/sai.profile | 1 + .../x86_64-cel_belgite-r0/custom_led.bin | Bin 0 -> 216 bytes .../x86_64-cel_belgite-r0/default_sku | 1 + .../x86_64-cel_belgite-r0/installer.conf | 4 + .../led-source-code/cmicx/Makefile | 24 + .../led-source-code/cmicx/custom_led.c | 171 ++++ .../led-source-code/cmicx/custom_led.lds | 21 + .../x86_64-cel_belgite-r0/led_proc_init.soc | 3 + .../x86_64-cel_belgite-r0/media_settings.json | 49 ++ .../celestica/x86_64-cel_belgite-r0/pcie.yaml | 121 +++ .../x86_64-cel_belgite-r0/pddf/pd-plugin.json | 61 ++ .../pddf/pddf-device.json | 685 ++++++++++++++++ .../pddf/pddf-device.json.original | 686 ++++++++++++++++ .../x86_64-cel_belgite-r0/pddf_support | 0 .../x86_64-cel_belgite-r0/platform.json | 395 ++++++++++ .../x86_64-cel_belgite-r0/platform_asic | 1 + .../x86_64-cel_belgite-r0/plugins/eeprom.py | 14 + .../pmon_daemon_control.json | 4 + .../system_health_monitoring_config.json | 16 + platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-cel.mk | 5 + .../belgite/modules/Makefile | 1 + .../belgite/modules/mc24lc64t.c | 174 ++++ .../belgite/modules/pddf_custom_psu.c | 125 +++ .../belgite/modules/pddf_custom_wdt.c | 741 ++++++++++++++++++ .../belgite/pddf/sonic_platform/__init__.py | 4 + .../belgite/pddf/sonic_platform/chassis.py | 162 ++++ .../belgite/pddf/sonic_platform/component.py | 142 ++++ .../belgite/pddf/sonic_platform/eeprom.py | 75 ++ .../belgite/pddf/sonic_platform/fan.py | 146 ++++ .../belgite/pddf/sonic_platform/fan_drawer.py | 33 + .../belgite/pddf/sonic_platform/platform.py | 21 + .../belgite/pddf/sonic_platform/psu.py | 55 ++ .../belgite/pddf/sonic_platform/sfp.py | 15 + .../belgite/pddf/sonic_platform/thermal.py | 111 +++ .../belgite/pddf/sonic_platform/watchdog.py | 229 ++++++ .../belgite/pddf/sonic_platform_setup.py | 27 + .../scripts/pddf_post_device_create.sh | 10 + .../scripts/pddf_pre_driver_install.sh | 5 + .../belgite-pddf-platform-monitor.service | 16 + .../systemd/pddf-platform-init.service | 15 + .../belgite/utils/belgite_pddf_monitor.py | 272 +++++++ .../sonic-platform-modules-cel/debian/control | 5 + .../debian/platform-modules-belgite.install | 7 + .../debian/platform-modules-belgite.postinst | 6 + .../sonic-platform-modules-cel/debian/rules | 17 +- .../platform_api/platform_api_mgnt.sh | 5 + 49 files changed, 4907 insertions(+), 1 deletion(-) create mode 100644 device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/belgite.config.bcm create mode 100644 device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/port_config.ini create mode 100644 device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/sai.profile create mode 100644 device/celestica/x86_64-cel_belgite-r0/custom_led.bin create mode 100644 device/celestica/x86_64-cel_belgite-r0/default_sku create mode 100644 device/celestica/x86_64-cel_belgite-r0/installer.conf create mode 100755 device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/Makefile create mode 100755 device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c create mode 100755 device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.lds create mode 100644 device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc create mode 100644 device/celestica/x86_64-cel_belgite-r0/media_settings.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/pcie.yaml create mode 100644 device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json.original create mode 100644 device/celestica/x86_64-cel_belgite-r0/pddf_support create mode 100644 device/celestica/x86_64-cel_belgite-r0/platform.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/platform_asic create mode 100644 device/celestica/x86_64-cel_belgite-r0/plugins/eeprom.py create mode 100644 device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/modules/mc24lc64t.c create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_wdt.c create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/watchdog.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform_setup.py create mode 100755 platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh create mode 100755 platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_pre_driver_install.sh create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/service/belgite-pddf-platform-monitor.service create mode 100644 platform/broadcom/sonic-platform-modules-cel/belgite/systemd/pddf-platform-init.service create mode 100755 platform/broadcom/sonic-platform-modules-cel/belgite/utils/belgite_pddf_monitor.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.install create mode 100644 platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.postinst diff --git a/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/belgite.config.bcm b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/belgite.config.bcm new file mode 100644 index 000000000000..a249804582c9 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/belgite.config.bcm @@ -0,0 +1,169 @@ +## 48xGE+4x10G+2xHGd[21] +phy_chain_rx_polarity_flip_physical{29.0}=1 +bcm_num_cos=8 +stable_size=0x5500000 +ifp_inports_support_enable=1 +ipv6_lpm_128b_enable=0x1 +l2xmsg_mode=1 +l2_mem_entries=32768 +l3_mem_entries=16384 +lpm_scaling_enable=0 +l3_alpm_enable=0 +riot_enable=0 +port_flex_enable=1 + +#Core clock Frequency +core_clock_frequency=266 + + +#GPORT0 +portmap_25=2:1 +phy_port_primary_and_offset_25=0x0100 +portmap_26=1:1 +phy_port_primary_and_offset_26=0x0101 +portmap_27=4:1 +phy_port_primary_and_offset_27=0x0102 +portmap_28=3:1 +phy_port_primary_and_offset_28=0x0103 +portmap_29=6:1 +phy_port_primary_and_offset_29=0x0500 +portmap_30=5:1 +phy_port_primary_and_offset_30=0x0501 +portmap_31=8:1 +phy_port_primary_and_offset_31=0x0502 +portmap_32=7:1 +phy_port_primary_and_offset_32=0x0503 + +#GPORT1 +portmap_33=10:1 +phy_port_primary_and_offset_33=0x0900 +portmap_34=9:1 +phy_port_primary_and_offset_34=0x0901 +portmap_35=12:1 +phy_port_primary_and_offset_35=0x0902 +portmap_36=11:1 +phy_port_primary_and_offset_36=0x0903 +portmap_37=14:1 +phy_port_primary_and_offset_37=0x0d00 +portmap_38=13:1 +phy_port_primary_and_offset_38=0x0d01 +portmap_39=16:1 +phy_port_primary_and_offset_39=0x0d02 +portmap_40=15:1 +phy_port_primary_and_offset_40=0x0d03 + +#GPORT2 +portmap_41=18:1 +phy_port_primary_and_offset_41=0x1101 +portmap_42=17:1 +phy_port_primary_and_offset_42=0x1100 +portmap_43=20:1 +phy_port_primary_and_offset_43=0x1103 +portmap_44=19:1 +phy_port_primary_and_offset_44=0x1102 +portmap_45=22:1 +phy_port_primary_and_offset_45=0x1501 +portmap_46=21:1 +phy_port_primary_and_offset_46=0x1500 +portmap_47=24:1 +phy_port_primary_and_offset_47=0x1503 +portmap_48=23:1 +phy_port_primary_and_offset_48=0x1502 + +#PM4x10Q0 +port_gmii_mode{25}=1 +portmap_1=26:1 +portmap_2=25:1 +portmap_3=28:1 +portmap_4=27:1 +portmap_5=30:1 +portmap_6=29:1 +portmap_7=32:1 +portmap_8=31:1 +phy_port_primary_and_offset_2=0x1900 +phy_port_primary_and_offset_1=0x1901 +phy_port_primary_and_offset_4=0x1902 +phy_port_primary_and_offset_3=0x1903 +phy_port_primary_and_offset_6=0x1904 +phy_port_primary_and_offset_5=0x1905 +phy_port_primary_and_offset_8=0x1906 +phy_port_primary_and_offset_7=0x1907 +port_phy_addr_2=0x01 +port_phy_addr_1=0x02 +port_phy_addr_4=0x03 +port_phy_addr_3=0x04 +port_phy_addr_6=0x05 +port_phy_addr_5=0x06 +port_phy_addr_8=0x07 +port_phy_addr_7=0x08 + +portmap_9=34:1 +portmap_10=33:1 +portmap_11=36:1 +portmap_12=35:1 +portmap_13=38:1 +portmap_14=37:1 +portmap_15=40:1 +portmap_16=39:1 + +phy_port_primary_and_offset_10=0x2100 +phy_port_primary_and_offset_9=0x2101 +phy_port_primary_and_offset_12=0x2102 +phy_port_primary_and_offset_11=0x2103 +phy_port_primary_and_offset_14=0x2104 +phy_port_primary_and_offset_13=0x2105 +phy_port_primary_and_offset_16=0x2106 +phy_port_primary_and_offset_15=0x2107 +port_phy_addr_10=0x2a +port_phy_addr_9=0x2b +port_phy_addr_12=0x2c +port_phy_addr_11=0x2d +port_phy_addr_14=0x2e +port_phy_addr_13=0x2f +port_phy_addr_16=0x30 +port_phy_addr_15=0x31 + +#PM4x10Q1 +port_gmii_mode{41}=1 +portmap_17=42:1 +portmap_18=41:1 +portmap_19=44:1 +portmap_20=43:1 +portmap_21=50:1 +portmap_22=49:1 +portmap_23=52:1 +portmap_24=51:1 + +phy_port_primary_and_offset_18=0x2900 +phy_port_primary_and_offset_17=0x2901 +phy_port_primary_and_offset_20=0x2902 +phy_port_primary_and_offset_19=0x2903 +phy_port_primary_and_offset_22=0x2904 +phy_port_primary_and_offset_21=0x2905 +phy_port_primary_and_offset_24=0x2906 +phy_port_primary_and_offset_23=0x2907 +port_phy_addr_18=0x53 +port_phy_addr_17=0x54 +port_phy_addr_20=0x55 +port_phy_addr_19=0x56 +port_phy_addr_22=0x57 +port_phy_addr_21=0x58 +port_phy_addr_24=0x59 +port_phy_addr_23=0x5a + +#PM4x25 +portmap_49=60:10 +portmap_50=58:10 +portmap_51=59:10 +portmap_52=57:10 + +##PM4x10HG +portmap_53=62:10 +portmap_54=64:10 +portmap_55=61:10 +portmap_56=63:10 + + +pbmp_xport_xe=0x01FFFFFFFFFFFFFE + +# \ No newline at end of file diff --git a/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/port_config.ini b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/port_config.ini new file mode 100644 index 000000000000..90ecfa4859ad --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias index speed autoneg +Ethernet0 26 Ethernet1/0/1 1 1000 1 +Ethernet1 25 Ethernet1/0/2 2 1000 1 +Ethernet2 28 Ethernet1/0/3 3 1000 1 +Ethernet3 27 Ethernet1/0/4 4 1000 1 +Ethernet4 30 Ethernet1/0/5 5 1000 1 +Ethernet5 29 Ethernet1/0/6 6 1000 1 +Ethernet6 32 Ethernet1/0/7 7 1000 1 +Ethernet7 31 Ethernet1/0/8 8 1000 1 +Ethernet8 34 Ethernet1/0/9 9 1000 1 +Ethernet9 33 Ethernet1/0/10 10 1000 1 +Ethernet10 36 Ethernet1/0/11 11 1000 1 +Ethernet11 35 Ethernet1/0/12 12 1000 1 +Ethernet12 38 Ethernet1/0/13 13 1000 1 +Ethernet13 37 Ethernet1/0/14 14 1000 1 +Ethernet14 40 Ethernet1/0/15 15 1000 1 +Ethernet15 39 Ethernet1/0/16 16 1000 1 +Ethernet16 42 Ethernet1/0/17 17 1000 1 +Ethernet17 41 Ethernet1/0/18 18 1000 1 +Ethernet18 44 Ethernet1/0/19 19 1000 1 +Ethernet19 43 Ethernet1/0/20 20 1000 1 +Ethernet20 50 Ethernet1/0/21 21 1000 1 +Ethernet21 49 Ethernet1/0/22 22 1000 1 +Ethernet22 52 Ethernet1/0/23 23 1000 1 +Ethernet23 51 Ethernet1/0/24 24 1000 1 +Ethernet24 2 Ethernet1/0/25 25 1000 1 +Ethernet25 1 Ethernet1/0/26 26 1000 1 +Ethernet26 4 Ethernet1/0/27 27 1000 1 +Ethernet27 3 Ethernet1/0/28 28 1000 1 +Ethernet28 6 Ethernet1/0/29 29 1000 1 +Ethernet29 5 Ethernet1/0/30 30 1000 1 +Ethernet30 8 Ethernet1/0/31 31 1000 1 +Ethernet31 7 Ethernet1/0/32 32 1000 1 +Ethernet32 10 Ethernet1/0/33 33 1000 1 +Ethernet33 9 Ethernet1/0/34 34 1000 1 +Ethernet34 12 Ethernet1/0/35 35 1000 1 +Ethernet35 11 Ethernet1/0/36 36 1000 1 +Ethernet36 14 Ethernet1/0/37 37 1000 1 +Ethernet37 13 Ethernet1/0/38 38 1000 1 +Ethernet38 16 Ethernet1/0/39 39 1000 1 +Ethernet39 15 Ethernet1/0/40 40 1000 1 +Ethernet40 18 Ethernet1/0/41 41 1000 1 +Ethernet41 17 Ethernet1/0/42 42 1000 1 +Ethernet42 20 Ethernet1/0/43 43 1000 1 +Ethernet43 19 Ethernet1/0/44 44 1000 1 +Ethernet44 22 Ethernet1/0/45 45 1000 1 +Ethernet45 21 Ethernet1/0/46 46 1000 1 +Ethernet46 24 Ethernet1/0/47 47 1000 1 +Ethernet47 23 Ethernet1/0/48 48 1000 1 +Ethernet48 60 Ethernet1/0/49 49 10000 0 +Ethernet49 58 Ethernet1/0/50 50 10000 0 +Ethernet50 59 Ethernet1/0/51 51 10000 0 +Ethernet51 57 Ethernet1/0/52 52 10000 0 +Ethernet52 62 Ethernet1/0/53 53 10000 0 +Ethernet53 64 Ethernet1/0/54 54 10000 0 +Ethernet54 61 Ethernet1/0/55 55 10000 0 +Ethernet55 63 Ethernet1/0/56 56 10000 0 diff --git a/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/sai.profile b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/sai.profile new file mode 100644 index 000000000000..2e5979fd112c --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/belgite.config.bcm diff --git a/device/celestica/x86_64-cel_belgite-r0/custom_led.bin b/device/celestica/x86_64-cel_belgite-r0/custom_led.bin new file mode 100644 index 0000000000000000000000000000000000000000..6973a4c9a73a6d0ee9eaac6150be92d1933ddf5b GIT binary patch literal 216 zcmV~$J5B;o06@_@A5t83?KOo>M$ga#MTOJbTnZ~R$z#gB_)Zh!bk_z z+kh;CjwN``X5JU$-{?bxQJt)o8=F({VHx&JguWE(8^wEmN;=wKk)hyPUv-6H51c_) zE%&_Gqgv5xKhAoknDP}q3<8`GCBiXbLL70(0YUcJqfLhv7B+X>bIU&z Cd?#W6 literal 0 HcmV?d00001 diff --git a/device/celestica/x86_64-cel_belgite-r0/default_sku b/device/celestica/x86_64-cel_belgite-r0/default_sku new file mode 100644 index 000000000000..3eeb370889f9 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/default_sku @@ -0,0 +1 @@ +CELESTICA-BELGITE t1 diff --git a/device/celestica/x86_64-cel_belgite-r0/installer.conf b/device/celestica/x86_64-cel_belgite-r0/installer.conf new file mode 100644 index 000000000000..61846e4455e0 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=9600 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off module_blacklist=gpio_ich crashkernel=0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M acpi_no_watchdog" diff --git a/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/Makefile b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/Makefile new file mode 100755 index 000000000000..ddc700bfb87e --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/Makefile @@ -0,0 +1,24 @@ +# +# Copyright: (c) 2012 Broadcom Corp. +# All Rights Reserved. +# + +SDK = ../../../../sdk-all-6.5.16/ +export SDK + +ifeq (${SDK},) +# { +$(error environment variable SDK not set) +# } +endif + +INCDIR = -I${SDK}/include + +all: + arm-linux-gcc -O1 -g ${INCDIR} -mthumb -mcpu=cortex-m0 -c -o custom_led.o custom_led.c + arm-linux-ld -T custom_led.lds -Bstatic -nostdlib --entry 0 -EL -Map custom_led.map -o custom_led.elf custom_led.o + arm-linux-objcopy -O binary custom_led.elf custom_led.bin + +clean: + rm -rf *.elf *.o *.map *.bin + diff --git a/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c new file mode 100755 index 000000000000..92fe25f5b898 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c @@ -0,0 +1,171 @@ +/* + * $Id: custom_led.c$ + * $Copyright: (c) 2019 Broadcom + * Broadcom Proprietary and Confidential. All rights reserved.$ + */ + +/****************************************************************************** +CMICX LED Interface has two RAM Banks, as shown below, Bank0(ACCUMULATION RAM) +for accumulation of status from ports and Bank1(PATTERN RAM) for writing +LED pattern. Both Bank0 and Bank1 are of 1024x16-bit, each row representing +one port. + + ACCUMULATION RAM (Bank 0) Pattern RAM (Bank1) + 15 0 15 0 + ------------------------------ ----------------------------- +Row 0 | Port1 status | | Port1 LED Pattern | + ------------------------------ ----------------------------- +Row 1 | Port2 status | | Port2 LED Pattern | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- +Row 127 | Port128 status | | Port128 LED Pattern | + ------------------------------ ----------------------------- +Row 128 | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- +Row x | Port(x+1) status | | Port(x+1) LED Pattern | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- + | | | | + ------------------------------ ----------------------------- +Row 1022| Port1023 status | | Port1023 LED Pattern | + ------------------------------ ----------------------------- +Row 1023| Port1024 status | | Port1024 LED Pattern | + ------------------------------ ----------------------------- + +Format of Accumulation RAM: + + +Bits 15:9 8 7 6 5 4:3 2 1 0 + ------------------------------------------------------------------------ + | Reserved | Link | Link Up | Flow | Duplex | Speed | Col | Tx | Rx | + | | Enable| Status | Control| | | | | | + ------------------------------------------------------------------------ + +The custom handler in this file should read port status, for each port used, +from accumulation ram, and form required LED bit pattern in the Bank1 RAM +(pattern RAM) location corresponding to the port of interest. Note that +physical port numbers may differ from row number of LED RAM Banks. For +Trident3, Physical port numbers spread from 1 to 128 in 128x25G configuration + and corresponding LED rows spread from Row 0 to Row 127. + +There are five LED interfaces in CMICX based devices. Although single +interface can be used to output LED pattern for all ports, it is possible +that more than one interface can be used in the end system, e.g., LEDs for +some ports are connected to one LED interface-0 (i.e LED_CLK and LED_DATA), +while the rest of the ports are connected to LED interface-1. Accordingly, +custom handler MUST fill in start port, end port and width of pattern in the +soc_led_custom_handler_ctrl_t structure passsed to custom handler. The +example custom handler provided in this file has reference code for forming +two different LED patterns. Please refer to these patterns before writing your +own custom handler code. + +The soc_led_custom_handler_ctrl_t structure definition is available in +$SDK/include/shared/cmicfw/cmicx_led_public.h + +soc_led_custom_handler_ctrl_t structure also carries a point to array +port_speed[] of size equal to maximum ports in the system, e.g 128 in Trident3. +This array would have port speed for each port, as per bit mapping defined in +"soc_led_speed_t" in $SDK/include/shared/cmicfw/cmicx_led_public.h file. + +Here is an exception, please keep in mind: +1. For TH3, port status/speed of xe1 (physical port 258) is located in the + accumulation entry/speed array of physical port 259. + +******************************************************************************/ +#include + +#define ACTIVITY_TICKS 2 +#define READ_LED_ACCU_DATA(base, port) (*((uint16 *)(base + ((port - 1) * sizeof(uint32))))) +#define WRITE_LED_SEND_DATA(base, port, val) (*((uint16 *)(base + ((port - 1) * sizeof(uint32)))) = val) + +#define PORT_NUM_TOTAL 56 + +#define LED_GREEN_BICOLOR 0x2 //bit : 10 +#define LED_AMBER_BICOLOR 0x1 //bit : 01 +#define LED_OFF_BICOLOR 0x3 //bit : 11 + +unsigned short portmap[] = { + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 49, 50, 51, 52, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 24, 23, 22, 21, + 20, 19, 18, 17, 16, 15, 14, 13, + 58, 60, 57, 59, 64, 62, 63, 61 +}; + + +/* + * Function: + * custom_led_handler + * Purpose: + * Timer event handler to accumulate, process and transmit led status + * Parameters: + * param - parameter added while registering the timer event. + * Returns: + * 0 on success + * Error code on failure + */ +void custom_led_handler(soc_led_custom_handler_ctrl_t *ctrl, + uint32 activity_count) +{ + unsigned short accu_val = 0, send_val = 0; + unsigned short port, physical_port; + + /* Physical port numbers to be used */ + for(port = 1; port <= PORT_NUM_TOTAL; port++) { + + physical_port = portmap[port-1]; + + /* Read value from led_ram bank0 */ + accu_val = READ_LED_ACCU_DATA(ctrl->accu_ram_base, physical_port); + + send_val = 0xff; + + if (((accu_val & LED_OUTPUT_RX) || (accu_val & LED_OUTPUT_TX)) && (activity_count & ACTIVITY_TICKS)) + { + send_val = LED_OFF_BICOLOR; + } + else if ( accu_val & LED_OUTPUT_LINK_UP) + { + send_val = LED_GREEN_BICOLOR; + } + else + { + send_val = LED_OFF_BICOLOR; + } + + /* Write value to led_ram bank1 */ + WRITE_LED_SEND_DATA(ctrl->pat_ram_base, port, send_val); + } /* for */ + + /* Send the pattern over LED interface 1 for ports 1 - 56*/ + ctrl->intf_ctrl[1].valid = 1; + ctrl->intf_ctrl[1].start_row = 0; + ctrl->intf_ctrl[1].end_row = 55; + ctrl->intf_ctrl[1].pat_width = 2; + + /* Invalidate rest of the interfaces */ + ctrl->intf_ctrl[0].valid = 0; + ctrl->intf_ctrl[2].valid = 0; + ctrl->intf_ctrl[3].valid = 0; + ctrl->intf_ctrl[4].valid = 0; + + return; + +} + diff --git a/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.lds b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.lds new file mode 100755 index 000000000000..8f585404e6b5 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.lds @@ -0,0 +1,21 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(custom_led_handler) +SECTIONS +{ + . = 0x3800; + + . = ALIGN(4); + .text : + { + *(.text) + *(.data) + *(.bss) + } + + /DISCARD/ : { *(.dynstr*) } + /DISCARD/ : { *(.dynamic*) } + /DISCARD/ : { *(.plt*) } + /DISCARD/ : { *(.interp*) } + /DISCARD/ : { *(.gnu*) } +} diff --git a/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc b/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc new file mode 100644 index 000000000000..f7192c5b081c --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc @@ -0,0 +1,3 @@ +m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin +led start + diff --git a/device/celestica/x86_64-cel_belgite-r0/media_settings.json b/device/celestica/x86_64-cel_belgite-r0/media_settings.json new file mode 100644 index 000000000000..50f7c545f09e --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/media_settings.json @@ -0,0 +1,49 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "49-52": { + "Default": { + "preemphasis": { + "lane0": "0x14410a" + } + }, + "TERALUX-ABS022,SFP+-CR-1.0,TERALUX-ABS023,SFP+-CR-3.0,TERALUX-ABS074,SFP+-CR-5.0": { + "preemphasis": { + "lane0": "0x14410a" + } + }, + "TERALUX-ABS661,SFP+-CR-7.0": { + "preemphasis": { + "lane0": "0x14410a" + } + }, + "FINISAR CORP.-FTLX8571D3BCV,SFP+-SR": { + "preemphasis": { + "lane0": "0x0c4104" + } + } + }, + "53-56": { + "Default": { + "preemphasis": { + "lane0": "0x0a3200" + } + }, + "TERALUX-ABS022,SFP+-CR-1.0,TERALUX-ABS023,SFP+-CR-3.0,TERALUX-ABS074,SFP+-CR-5.0": { + "preemphasis": { + "lane0": "0x0a280a" + } + }, + "TERALUX-ABS661,SFP+-CR-7.0": { + "preemphasis": { + "lane0": "0x0f2805" + } + }, + "FINISAR CORP.-FTLX8571D3BCV,SFP+-SR": { + "preemphasis": { + "lane0": "0x0a3200" + } + } + } + } +} + diff --git a/device/celestica/x86_64-cel_belgite-r0/pcie.yaml b/device/celestica/x86_64-cel_belgite-r0/pcie.yaml new file mode 100644 index 000000000000..46e202526716 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/pcie.yaml @@ -0,0 +1,121 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 1980 + name: 'Host bridge: Intel Corporation Atom Processor C3000 Series System Agent' +- bus: '00' + dev: '04' + fn: '0' + id: 19a1 + name: 'Host bridge: Intel Corporation Atom Processor C3000 Series Error Registers' +- bus: '00' + dev: '05' + fn: '0' + id: 19a2 + name: 'Generic system peripheral [0807]: Intel Corporation Atom Processor C3000 Series Root Complex Event Collector' +- bus: '00' + dev: '06' + fn: '0' + id: 19e2 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated QAT Root Port' +- bus: '00' + dev: '09' + fn: '0' + id: b277 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port' +- bus: '00' + dev: '0b' + fn: '0' + id: 1533 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port' +- bus: '00' + dev: '0e' + fn: '0' + id: 19a8 + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port' +- bus: '00' + dev: '12' + fn: '0' + id: 19ac + name: 'System peripheral: Intel Corporation DNV SMBus Contoller - Host' +- bus: '00' + dev: '14' + fn: '0' + id: 19c2 + name: 'SATA controller: Intel Corporation DNV SATA Controller 1' +- bus: '00' + dev: '15' + fn: '0' + id: 19d0 + name: 'USB controller: Intel Corporation Atom Processor C3000 Series USB 3.0 xHCI Controller' +- bus: '00' + dev: '16' + fn: '0' + id: 15ce + name: 'PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated LAN Root Port' +- bus: '00' + dev: '18' + fn: '0' + id: 19d3 + name: 'Communication controller: Intel Corporation Atom Processor C3000 Series ME HECI 1' +- bus: '00' + dev: '1a' + fn: '0' + id: 19d8 + name: 'Serial controller: Intel Corporation Atom Processor C3000 Series HSUART Controller' +- bus: '00' + dev: '1a' + fn: '1' + id: 19d8 + name: 'Serial controller: Intel Corporation Atom Processor C3000 Series HSUART Controller' +- bus: '00' + dev: '1a' + fn: '2' + id: 19d8 + name: 'Serial controller: Intel Corporation Atom Processor C3000 Series HSUART Controller' +- bus: '00' + dev: '1f' + fn: '0' + id: 19dc + name: 'ISA bridge: Intel Corporation DNV LPC or eSPI' +- bus: '00' + dev: '1f' + fn: '2' + id: 19de + name: 'Memory controller: Intel Corporation Atom Processor C3000 Series Power Management Controller' +- bus: '00' + dev: '1f' + fn: '4' + id: 19df + name: 'SMBus: Intel Corporation DNV SMBus controller' +- bus: '00' + dev: '1f' + fn: '5' + id: 19e0 + name: 'Serial bus controller [0c80]: Intel Corporation DNV SPI Controller' +- bus: '01' + dev: '00' + fn: '0' + id: 19e2 + name: 'Co-processor: Intel Corporation Atom Processor C3000 Series QuickAssist Technology' +- bus: '02' + dev: '00' + fn: '0' + id: b277 + name: 'Ethernet controller: Broadcom Limited Device b277' +- bus: '03' + dev: '00' + fn: '0' + id: 1533 + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection' +- bus: '05' + dev: '00' + fn: '0' + id: 15ce + name: 'Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+' +- bus: '05' + dev: '00' + fn: '1' + id: 15ce + name: 'Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+' + diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json b/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..05d724f3622b --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json @@ -0,0 +1,61 @@ +{ + "XCVR": + { + "xcvr_present": + { + "i2c": + { + "valmap-SFP28": {"1":false, "0":true } + } + } + }, + "PSU": + { + "psu_present": + { + "i2c": + { + "valmap": { "1":true, "0":false } + } + }, + "psu_power_good": + { + "i2c": + { + "valmap": { "0": true, "1":false } + } + }, + "psu_fan_dir": + { + "i2c": + { + "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + } + }, + "PSU_FAN_MAX_SPEED":"18000" + }, + "FAN": + { + "direction": + { + "i2c": + { + "valmap": {"1":"EXHAUST", "0":"INTAKE"} + } + }, + "present": + { + "i2c": + { + "valmap": {"1":false, "0":true} + } + }, + "fan_master_led_color": + { + "colmap": {"green":"green", "red":"amber"} + }, + "duty_cycle_to_pwm": "lambda dc: dc*255/100", + + "pwm_to_duty_cycle": "lambda pwm: pwm/255*100" + } +} diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json new file mode 100644 index 000000000000..7ccbd41fffea --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json @@ -0,0 +1,685 @@ +{ + "PLATFORM": + { + "num_psus":2, + "num_fantrays":3, + "num_fans_pertray":1, + "num_ports":56, + "num_temps":4, + "pddf_dev_types": + { + "description":"Belgite - Below is the list of supported PDDF device types (chip names) for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom", + "fan_cpld" + ], + "PORT_MODULE": + [ + "pddf_xcvr" + ] + }, + "std_perm_kos": + [ + "i2c-ismt", + "i2c-i801" + ], + "std_kos": + [ + "i2c_dev", + "i2c_mux_pca954x force_deselect_on_exit=1", + "gpio_pca953x", + "mc24lc64t", + "optoe" + ], + "pddf_kos": + [ + "pddf_client_module", + "pddf_mux_module", + "pddf_psu_driver_module", + "pddf_psu_module", + "pddf_gpio_module", + "pddf_xcvr_module", + "pddf_xcvr_driver_module", + "pddf_led_module", + "pddf_fan_driver_module", + "pddf_fan_module", + "pddf_led_module" + ], + "custom_kos": + [ + "pddf_custom_psu", + "pddf_custom_wdt" + ] + }, + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX1"} + ] + } + }, + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x52", "dev_type": "24lc64t"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": + [ + {"attr_name": "eeprom"} + ] + } + }, + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x70", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x2"}, + "channel": + [ + {"chn":"0", "dev":"CPLD1" }, + {"chn":"0", "dev":"FAN-CTRL" }, + {"chn":"2", "dev":"PSU1" }, + {"chn":"2", "dev":"PSU2" }, + {"chn":"3", "dev":"TEMP1"}, + {"chn":"3", "dev":"TEMP2"}, + {"chn":"4", "dev":"TEMP3"}, + {"chn":"4", "dev":"TEMP4"}, + {"chn":"7", "dev":"MUX2"} + ] + } + }, + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x9", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0xA"}, + "channel": + [ + {"chn":"0", "dev":"PORT49"}, + {"chn":"1", "dev":"PORT50"}, + {"chn":"2", "dev":"PORT51"}, + {"chn":"3", "dev":"PORT52"}, + {"chn":"4", "dev":"PORT53"}, + {"chn":"5", "dev":"PORT54"}, + {"chn":"6", "dev":"PORT55"}, + {"chn":"7", "dev":"PORT56"} + ] + } + }, + "CPLD1": + { + "dev_info": {"device_type": "CPLD", "device_name": "CPLD1", "device_parent": "MUX1"}, + "i2c": + { + "topo_info": {"parent_bus": "0x2", "dev_addr": "0x32", "dev_type": "i2c_cpld"}, + "dev_attr": {} + } + }, + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX1"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + } + }, + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX1", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x4", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"13" }, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"11" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"14" }, + { "attr_name":"psu_v_in", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x88", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_in", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x89", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX1" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + } + }, + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX1", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4", "dev_addr":"0x59", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"13" }, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"11" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"14" }, + { "attr_name":"psu_v_in", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x88", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_in", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x89", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + "TEMP1": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x5", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP2": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x5", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP3": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x6", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP4": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U60"}, + "i2c": + { + "topo_info": { "parent_bus":"0x6", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "PORT49": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT49", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"49"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT49-EEPROM" }, + { "itf":"control", "dev":"PORT49-CTRL" } + ] + } + }, + "PORT49-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT49-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0xA", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT49-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT49-CTRL", "device_parent":"MUX2", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0xA", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + "PORT50": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT50", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"50"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT50-EEPROM" }, + { "itf":"control", "dev":"PORT50-CTRL" } + ] + } + }, + "PORT50-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT50-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0xB", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT50-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT50-CTRL", "device_parent":"MUX2", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0xB", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + + ] + } + }, + "PORT51": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT51", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"51"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT51-EEPROM" }, + { "itf":"control", "dev":"PORT51-CTRL" } + ] + } + }, + "PORT51-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT51-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0xC", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT51-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT51-CTRL", "device_parent":"MUX2", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0xC", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT52": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT52", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"52"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT52-EEPROM" }, + { "itf":"control", "dev":"PORT52-CTRL" } + ] + } + }, + "PORT52-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT52-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0xD", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT52-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT52-CTRL", "device_parent":"MUX2", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0xD", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + + ] + } + }, + "PORT53": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT53", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"53"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT53-EEPROM" }, + { "itf":"control", "dev":"PORT53-CTRL" } + ] + } + }, + "PORT53-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT53-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0xE", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT53-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT53-CTRL", "device_parent":"MUX2", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0xE", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + + ] + } + }, + "PORT54": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT54", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"54"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT54-EEPROM" }, + { "itf":"control", "dev":"PORT54-CTRL" } + ] + } + }, + "PORT54-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT54-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0xF", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT54-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT54-CTRL", "device_parent":"MUX2", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0xF", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT55": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT55", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"55"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT55-EEPROM" }, + { "itf":"control", "dev":"PORT55-CTRL" } + ] + } + }, + "PORT55-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT55-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT55-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT55-CTRL", "device_parent":"MUX2", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + "PORT56": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT56", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"56"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT56-EEPROM" }, + { "itf":"control", "dev":"PORT56-CTRL" } + ] + } + }, + "PORT56-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT56-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT56-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT56-CTRL", "device_parent":"MUX2", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2", "dev_addr":"0x66", "dev_type":"fan_cpld"}, + "dev_attr": { "num_fantrays":"3"}, + "attr_list": + [ + { "attr_name":"fan1_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x32", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x36", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x3a", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x31", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150", "attr_is_divisor":0}, + { "attr_name":"fan2_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x35", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150" , "attr_is_divisor":0}, + { "attr_name":"fan3_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x39", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150", "attr_is_divisor":0} + ] + } + }, + "SYS_LED": + { + "dev_info": { "device_type":"LED", "device_name":"SYS_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_AMBER","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x1","swpld_addr_offset":"0x43"}, + {"attr_name":"STATUS_LED_COLOR_GREEN","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x2","swpld_addr_offset":"0x43"}, + {"attr_name":"STATUS_LED_COLOR_OFF","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x0","swpld_addr_offset":"0x43"} + ] + } + }, + "FANTRAY1_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_GREEN","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x33"}, + {"attr_name":"STATUS_LED_COLOR_AMBER","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x33"} + ] + } + }, + "FANTRAY2_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"1"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_GREEN","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x37"}, + {"attr_name":"STATUS_LED_COLOR_AMBER","attr_devtype":"cpld","attr_devname":"CPLD1B","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x37"} + ] + } + }, + "FANTRAY3_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"2"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"STATUS_LED_COLOR_GREEN","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x3b"}, + {"attr_name":"STATUS_LED_COLOR_AMBER","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x3b"} + ] + } + } +} diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json.original b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json.original new file mode 100644 index 000000000000..8f43a3f6090d --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json.original @@ -0,0 +1,686 @@ +{ + "PLATFORM": + { + "num_psus":2, + "num_fantrays":3, + "num_fans_pertray":1, + "num_ports":56, + "num_temps":4, + "pddf_dev_types": + { + "description":"Belgite - Below is the list of supported PDDF device types (chip names) for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom", + "fan_cpld" + ], + "PORT_MODULE": + [ + "pddf_xcvr" + ] + }, + "std_perm_kos": + [ + "i2c-ismt", + "i2c-i801" + ], + "std_kos": + [ + "i2c_dev", + "i2c_mux_pca954x", + "gpio_pca953x", + "mc24lc64t", + "optoe" + ], + "pddf_kos": + [ + "pddf_client_module", + "pddf_mux_module", + "pddf_psu_driver_module", + "pddf_psu_module", + "pddf_gpio_module", + "pddf_xcvr_module", + "pddf_xcvr_driver_module", + "pddf_led_module", + "pddf_fan_driver_module", + "pddf_fan_module", + "pddf_led_module" + ], + "custom_kos": + [ + "pddf_custom_psu" + ] + }, + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX1"} + ] + } + }, + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x52", "dev_type": "24lc64t"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": + [ + {"attr_name": "eeprom"} + ] + } + }, + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x70", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x2"}, + "channel": + [ + {"chn":"0", "dev":"CPLD1" }, + {"chn":"0", "dev":"FAN-CTRL1" }, + {"chn":"2", "dev":"PSU1" }, + {"chn":"2", "dev":"PSU2" }, + {"chn":"3", "dev":"TEMP1"}, + {"chn":"3", "dev":"TEMP2"}, + {"chn":"4", "dev":"TEMP3"}, + {"chn":"4", "dev":"TEMP4"}, + {"chn":"7", "dev":"MUX2"} + ] + } + }, + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x9", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x10"}, + "channel": + [ + {"chn":"0", "dev":"PORT49"}, + {"chn":"1", "dev":"PORT50"}, + {"chn":"2", "dev":"PORT51"}, + {"chn":"3", "dev":"PORT52"}, + {"chn":"4", "dev":"PORT53"}, + {"chn":"5", "dev":"PORT54"}, + {"chn":"6", "dev":"PORT55"}, + {"chn":"7", "dev":"PORT56"} + ] + } + }, + "CPLD1": + { + "dev_info": {"device_type": "CPLD", "device_name": "CPLD1", "device_parent": "MUX1"}, + "i2c": + { + "topo_info": {"parent_bus": "0x2", "dev_addr": "0x32", "dev_type": "i2c_cpld"}, + "dev_attr": {} + } + }, + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX1"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + } + }, + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX1", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x4", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"16" }, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"7" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"16" }, + { "attr_name":"psu_v_in", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x88", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_in", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x89", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_in", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xa7", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX1" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + } + }, + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX1", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x4", "dev_addr":"0x59", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_power_good", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x41", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"16" }, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"7" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"16" }, + { "attr_name":"psu_v_in", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x88", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_in", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x89", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_in", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xa7", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_temp1_input", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + "TEMP1": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x5", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP2": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x5", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP3": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x6", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "TEMP4": + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX1"}, + "dev_attr": { "display_name":"LM75_U60"}, + "i2c": + { + "topo_info": { "parent_bus":"0x6", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + "PORT49": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT49", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"49"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT49-EEPROM" }, + { "itf":"control", "dev":"PORT49-CTRL" } + ] + } + }, + "PORT49-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT49-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT49-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT49-CTRL", "device_parent":"MUX2", "virt_parent":"PORT49"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x0", "attr_cmpval":"0x1", "attr_len":"1"} + ] + } + }, + "PORT50": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT50", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"50"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT50-EEPROM" }, + { "itf":"control", "dev":"PORT50-CTRL" } + ] + } + }, + "PORT50-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT50-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT50-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT50-CTRL", "device_parent":"MUX2", "virt_parent":"PORT50"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x1", "attr_cmpval":"0x2", "attr_len":"1"} + + ] + } + }, + "PORT51": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT51", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"51"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT51-EEPROM" }, + { "itf":"control", "dev":"PORT51-CTRL" } + ] + } + }, + "PORT51-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT51-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0x12", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT51-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT51-CTRL", "device_parent":"MUX2", "virt_parent":"PORT51"}, + "i2c": + { + "topo_info": { "parent_bus":"0x12", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x2", "attr_cmpval":"0x4", "attr_len":"1"} + ] + } + }, + "PORT52": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT52", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"52"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT52-EEPROM" }, + { "itf":"control", "dev":"PORT52-CTRL" } + ] + } + }, + "PORT52-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT52-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0x13", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT52-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT52-CTRL", "device_parent":"MUX2", "virt_parent":"PORT52"}, + "i2c": + { + "topo_info": { "parent_bus":"0x13", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x3", "attr_cmpval":"0x8", "attr_len":"1"} + + ] + } + }, + "PORT53": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT53", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"53"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT53-EEPROM" }, + { "itf":"control", "dev":"PORT53-CTRL" } + ] + } + }, + "PORT53-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT53-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0x14", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT53-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT53-CTRL", "device_parent":"MUX2", "virt_parent":"PORT53"}, + "i2c": + { + "topo_info": { "parent_bus":"0x14", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x4", "attr_cmpval":"0x10", "attr_len":"1"} + + ] + } + }, + "PORT54": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT54", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"54"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT54-EEPROM" }, + { "itf":"control", "dev":"PORT54-CTRL" } + ] + } + }, + "PORT54-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT54-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0x15", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT54-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT54-CTRL", "device_parent":"MUX2", "virt_parent":"PORT54"}, + "i2c": + { + "topo_info": { "parent_bus":"0x15", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x5", "attr_cmpval":"0x20", "attr_len":"1"} + ] + } + }, + "PORT55": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT55", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"55"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT55-EEPROM" }, + { "itf":"control", "dev":"PORT55-CTRL" } + ] + } + }, + "PORT55-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT55-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x16", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT55-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT55-CTRL", "device_parent":"MUX2", "virt_parent":"PORT55"}, + "i2c": + { + "topo_info": { "parent_bus":"0x16", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x6", "attr_cmpval":"0x40", "attr_len":"1"} + ] + } + }, + "PORT56": + { + "dev_info": { "device_type":"SFP28", "device_name":"PORT56", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"56"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT56-EEPROM" }, + { "itf":"control", "dev":"PORT56-CTRL" } + ] + } + }, + "PORT56-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT56-EEPROM", "device_parent":"MUX2", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x17", "dev_addr":"0x50", "dev_type":"optoe2"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT56-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT56-CTRL", "device_parent":"MUX2", "virt_parent":"PORT56"}, + "i2c": + { + "topo_info": { "parent_bus":"0x17", "dev_addr":"0x66", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_txfault", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x47", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_txdisable", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_lpmode", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x4a", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_present", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x49", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"}, + { "attr_name":"xcvr_rxlos", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x48", "attr_mask":"0x7", "attr_cmpval":"0x80", "attr_len":"1"} + ] + } + }, + "FAN-CTRL1": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL1", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x2", "dev_addr":"0x66", "dev_type":"fan_cpld"}, + "dev_attr": { "num_fantrays":"3"}, + "attr_list": + [ + { "attr_name":"fan1_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x32", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x36", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_pwm", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x3a", "attr_mask":"0xff", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x31", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150", "attr_is_divisor":0}, + { "attr_name":"fan2_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x35", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150" , "attr_is_divisor":0}, + { "attr_name":"fan3_input", "attr_devaddr":"0x32", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x39", "attr_mask":"0xff", "attr_len":"1", "attr_mult":"150", "attr_is_divisor":0} + ] + } + }, + "SYS_LED": + { + "dev_info": { "device_type":"LED", "device_name":"SYS_LED"}, + "dev_attr": { "index":"0", "flag": "rw"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"amber","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x1","swpld_addr_offset":"0x43"}, + {"attr_name":"green","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x2","swpld_addr_offset":"0x43"}, + {"attr_name":"off","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x0","swpld_addr_offset":"0x43"} + ] + } + }, + "FANTRAY1_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"0", "flag": "rw"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"green","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x33"}, + {"attr_name":"red","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x33"} + ] + } + }, + "FANTRAY2_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"1", "flag": "rw"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"green","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x37"}, + {"attr_name":"red","attr_devtype":"cpld","attr_devname":"CPLD1B","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x37"} + ] + } + }, + "FANTRAY3_LED": + { + "dev_info": { "device_type":"LED", "device_name":"FANTRAY_LED"}, + "dev_attr": { "index":"2", "flag": "rw"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"green","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x3b"}, + {"attr_name":"red","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x3b"} + ] + } + } +} diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf_support b/device/celestica/x86_64-cel_belgite-r0/pddf_support new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/celestica/x86_64-cel_belgite-r0/platform.json b/device/celestica/x86_64-cel_belgite-r0/platform.json new file mode 100644 index 000000000000..1d4a1f9e3420 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/platform.json @@ -0,0 +1,395 @@ +{ + "chassis": { + "name": "E1070", + "status_led": { + "controllable": true, + "colors": ["green", "amber", "off"] + }, + "thermal_manager": false, + "components": [ + { + "name": "SWCPLD" + }, + { + "name": "Main_BIOS" + }, + { + "name": "Backup_BIOS" + } + ], + "fans": [ + { + "name": "Fantray1_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + }, + { + "name": "Fantray2_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + }, + { + "name": "Fantray3_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + }, + { + "name": "Fantray1_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + }, + { + "name": "Fantray2_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + }, + { + "name": "Fantray3_1", + "speed": { + "controllable": true + }, + "status_led": { + "controllable": true, + "colors": ["green", "amber","off"] + } + } + ], + "fan_drawers": [ + { + "name": "Fantray1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "max_consumed_power": false, + "fans": [ + { + "name": "Fantray1_1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "Fantray2", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "max_consumed_power": false, + "fans": [ + { + "name": "Fantray2_1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "Fantray3", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "max_consumed_power": false, + "fans": [ + { + "name": "Fantray3_1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "fans": [ + { + "name": "PSU1_FAN1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": false, + "voltage_low_threshold": false, + "temperature": false, + "fans_target_speed": false, + "status_led": { + "controllable": false + } + }, + { + "name": "PSU2", + "fans": [ + { + "name": "PSU2_FAN1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": false, + "voltage_low_threshold": false, + "temperature": false, + "fans_target_speed": false, + "status_led": { + "controllable": false + } + } + ], + "thermals": [ + { + "name": "LM75_U10", + "controllable": false, + "low-threshold": false, + "low-crit-threshold": true + }, + { + "name": "LM75_U4", + "controllable": false, + "low-threshold": false, + "low-crit-threshold": true + }, + { + "name": "LM75_U7", + "controllable": false, + "low-threshold": false, + "low-crit-threshold": true + }, + { + "name": "LM75_U60", + "controllable": false, + "low-threshold": false, + "low-crit-threshold": true + } + ], + "sfps": [ + { + "name": "PORT0" + }, + { + "name": "PORT1" + }, + { + "name": "PORT2" + }, + { + "name": "PORT3" + }, + { + "name": "PORT4" + }, + { + "name": "PORT5" + }, + { + "name": "PORT6" + }, + { + "name": "PORT7" + }, + { + "name": "PORT8" + }, + { + "name": "PORT9" + }, + { + "name": "PORT10" + }, + { + "name": "PORT11" + }, + { + "name": "PORT12" + }, + { + "name": "PORT13" + }, + { + "name": "PORT14" + }, + { + "name": "PORT15" + }, + { + "name": "PORT16" + }, + { + "name": "PORT17" + }, + { + "name": "PORT18" + }, + { + "name": "PORT19" + }, + { + "name": "PORT20" + }, + { + "name": "PORT21" + }, + { + "name": "PORT22" + }, + { + "name": "PORT23" + }, + { + "name": "PORT24" + }, + { + "name": "PORT25" + }, + { + "name": "PORT26" + }, + { + "name": "PORT27" + }, + { + "name": "PORT28" + }, + { + "name": "PORT29" + }, + { + "name": "PORT30" + }, + { + "name": "PORT31" + }, + { + "name": "PORT32" + }, + { + "name": "PORT33" + }, + { + "name": "PORT34" + }, + { + "name": "PORT35" + }, + { + "name": "PORT36" + }, + { + "name": "PORT37" + }, + { + "name": "PORT38" + }, + { + "name": "PORT39" + }, + { + "name": "PORT40" + }, + { + "name": "PORT41" + }, + { + "name": "PORT42" + }, + { + "name": "PORT43" + }, + { + "name": "PORT44" + }, + { + "name": "PORT45" + }, + { + "name": "PORT46" + }, + { + "name": "PORT47" + }, + { + "name": "PORT48" + }, + { + "name": "PORT49" + }, + { + "name": "PORT50" + }, + { + "name": "PORT51" + }, + { + "name": "PORT52" + }, + { + "name": "PORT53" + }, + { + "name": "PORT54" + }, + { + "name": "PORT55" + } + ] + }, + "interfaces": {} +} diff --git a/device/celestica/x86_64-cel_belgite-r0/platform_asic b/device/celestica/x86_64-cel_belgite-r0/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/celestica/x86_64-cel_belgite-r0/plugins/eeprom.py b/device/celestica/x86_64-cel_belgite-r0/plugins/eeprom.py new file mode 100644 index 000000000000..d28ff1d0cddb --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/plugins/eeprom.py @@ -0,0 +1,14 @@ +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/0-0052/eeprom" + #Two i2c buses might get flipped order, check them both. + if not os.path.exists(self.eeprom_path): + self.eeprom_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-1/1-0052/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json b/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..689def2c1e25 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true, + "skip_pcied": true +} diff --git a/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json b/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..4dc38d035ab4 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json @@ -0,0 +1,16 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu.temperature", + "PSU2 Fan", + "PSU1 Fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "orange", + "normal": "green", + "booting": "orange_blink" + } +} \ No newline at end of file diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 4405070460ad..00b3716c06eb 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -52,6 +52,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) \ $(CEL_HALIBURTON_PLATFORM_MODULE) \ $(CEL_SEASTONE2_PLATFORM_MODULE) \ + $(CEL_BELGITE_PLATFORM_MODULE) \ $(DELTA_AG9032V1_PLATFORM_MODULE) \ $(DELTA_AG9064_PLATFORM_MODULE) \ $(DELTA_AG5648_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-cel.mk b/platform/broadcom/platform-modules-cel.mk index de021df7e4db..d485f128c6c2 100644 --- a/platform/broadcom/platform-modules-cel.mk +++ b/platform/broadcom/platform-modules-cel.mk @@ -4,11 +4,13 @@ CEL_DX010_PLATFORM_MODULE_VERSION = 0.9 CEL_HALIBURTON_PLATFORM_MODULE_VERSION = 0.9 CEL_SEASTONE2_PLATFORM_MODULE_VERSION = 0.9 CEL_SILVERSTONE_PLATFORM_MODULE_VERSION = 0.9 +CEL_BELGITE_PLATFORM_MODULE_VERSION = 0.9 export CEL_DX010_PLATFORM_MODULE_VERSION export CEL_HALIBURTON_PLATFORM_MODULE_VERSION export CEL_SEASTONE2_PLATFORM_MODULE_VERSION export CEL_SILVERSTONE_PLATFORM_MODULE_VERSION +export CEL_BELGITE_PLATFORM_MODULE_VERSION CEL_DX010_PLATFORM_MODULE = platform-modules-dx010_$(CEL_DX010_PLATFORM_MODULE_VERSION)_amd64.deb $(CEL_DX010_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cel @@ -28,3 +30,6 @@ CEL_SILVERSTONE_PLATFORM_MODULE = platform-modules-silverstone_$(CEL_SILVERSTONE $(CEL_SILVERSTONE_PLATFORM_MODULE)_PLATFORM = x86_64-cel_silverstone-r0 $(eval $(call add_extra_package,$(CEL_DX010_PLATFORM_MODULE),$(CEL_SILVERSTONE_PLATFORM_MODULE))) +CEL_BELGITE_PLATFORM_MODULE = platform-modules-belgite_$(CEL_BELGITE_PLATFORM_MODULE_VERSION)_amd64.deb +$(CEL_BELGITE_PLATFORM_MODULE)_PLATFORM = x86_64-cel_belgite-r0 +$(eval $(call add_extra_package,$(CEL_DX010_PLATFORM_MODULE),$(CEL_BELGITE_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/modules/Makefile b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/Makefile new file mode 100644 index 000000000000..0e3d1284778d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/Makefile @@ -0,0 +1 @@ +obj-m:= mc24lc64t.o pddf_custom_wdt.o pddf_custom_psu.o diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/modules/mc24lc64t.c b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/mc24lc64t.c new file mode 100644 index 000000000000..e71e551438eb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/mc24lc64t.c @@ -0,0 +1,174 @@ +/* + * mc24lc64t.c - driver for Microchip 24LC64T(TLV Eeprom) + * + * Copyright (C) 2017 Celestica Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define EEPROM_SIZE 256 //mc24lt64t eeprom size in bytes. + +struct mc24lc64t_data { + struct mutex update_lock; +}; + +static ssize_t mc24lc64t_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = kobj_to_i2c_client(kobj); + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + unsigned long timeout, read_time, i = 0; + int status; + + mutex_lock(&drvdata->update_lock); + + if (i2c_smbus_write_byte_data(client, off>>8, off)) + { + status = -EIO; + goto exit; + } + + msleep(1); + +begin: + + if (i < count) + { + timeout = jiffies + msecs_to_jiffies(25); /* 25 mS timeout*/ + do { + read_time = jiffies; + + status = i2c_smbus_read_byte(client); + if (status >= 0) + { + buf[i++] = status; + goto begin; + } + } while (time_before(read_time, timeout)); + + status = -ETIMEDOUT; + goto exit; + } + + status = count; + +exit: + mutex_unlock(&drvdata->update_lock); + + return status; +} + +static ssize_t mc24lc64t_write (struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count){ + + struct i2c_client *client = kobj_to_i2c_client(kobj); + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + unsigned long timeout, write_time, i = 0; + int status; + u16 value; + + mutex_lock(&drvdata->update_lock); + +begin: + if (i < count){ + timeout = jiffies + msecs_to_jiffies(25); /* 25 mS timeout*/ + value = (buf[i] << 8 | ( off &0xff)); + do { + write_time = jiffies; + status = i2c_smbus_write_word_data(client, off>>8, value); + if (status >= 0) + { + // increase offset + off++; + // increase buffer index + i++; + goto begin; + } + } while (time_before(write_time, timeout)); + status = -ETIMEDOUT; + goto exit; + } + status = count; + +exit: + mutex_unlock(&drvdata->update_lock); + return status; +} + + +static struct bin_attribute mc24lc64t_bit_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO | S_IWUGO, + }, + .size = EEPROM_SIZE, + .read = mc24lc64t_read, + .write = mc24lc64t_write, +}; + +static int mc24lc64t_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = client->adapter; + struct mc24lc64t_data *drvdata; + int err; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA + | I2C_FUNC_SMBUS_READ_BYTE)) + return -EPFNOSUPPORT; + + if (!(drvdata = devm_kzalloc(&client->dev, + sizeof(struct mc24lc64t_data), GFP_KERNEL))) + return -ENOMEM; + + i2c_set_clientdata(client, drvdata); + mutex_init(&drvdata->update_lock); + + err = sysfs_create_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + return err; +} + +static int mc24lc64t_remove(struct i2c_client *client) +{ + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + sysfs_remove_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + + return 0; +} + +static const struct i2c_device_id mc24lc64t_id[] = { + { "24lc64t", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mc24lc64t_id); + +static struct i2c_driver mc24lc64t_driver = { + .driver = { + .name = "mc24lc64t", + .owner = THIS_MODULE, + }, + .probe = mc24lc64t_probe, + .remove = mc24lc64t_remove, + .id_table = mc24lc64t_id, +}; + +module_i2c_driver(mc24lc64t_driver); + +MODULE_AUTHOR("Abhisit Sangjan "); +MODULE_DESCRIPTION("Microchip 24LC64T Driver"); +MODULE_LICENSE("GPL"); + diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_psu.c b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_psu.c new file mode 100644 index 000000000000..3c5e5872aa2e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_psu.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../../pddf/i2c/modules/include/pddf_psu_defs.h" + +#define PSU_REG_VOUT_MODE 0x20 +#define PSU_REG_READ_VOUT 0x8b + +ssize_t pddf_show_custom_psu_v_out(struct device *dev, struct device_attribute *da, char *buf); +extern PSU_SYSFS_ATTR_DATA access_psu_v_out; + +static int two_complement_to_int(u16 data, u8 valid_bit, int mask) +{ + u16 valid_data = data & mask; + bool is_negative = valid_data >> (valid_bit - 1); + + return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; +} + +static u8 psu_get_vout_mode(struct i2c_client *client) +{ + u8 status = 0, retry = 10; + uint8_t offset = PSU_REG_VOUT_MODE; + + while (retry) { + status = i2c_smbus_read_byte_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + printk(KERN_ERR "%s: Get PSU Vout mode failed\n", __func__); + return 0; + } + else + { + /*printk(KERN_ERR "%s: vout_mode reg value 0x%x\n", __func__, status);*/ + return status; + } +} + +static u16 psu_get_v_out(struct i2c_client *client) +{ + u16 status = 0, retry = 10; + uint8_t offset = PSU_REG_READ_VOUT; + + while (retry) { + status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + printk(KERN_ERR "%s: Get PSU Vout failed\n", __func__); + return 0; + } + else + { + /*printk(KERN_ERR "%s: vout reg value 0x%x\n", __func__, status);*/ + return status; + } +} + +ssize_t pddf_show_custom_psu_v_out(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + int exponent, mantissa; + int multiplier = 1000; + + u16 value = psu_get_v_out(client); + u8 vout_mode = psu_get_vout_mode(client); + + if ((vout_mode >> 5) == 0) + exponent = two_complement_to_int(vout_mode & 0x1f, 5, 0x1f); + else + { + /*printk(KERN_ERR "%s: Only support linear mode for vout mode\n", __func__);*/ + exponent = 0; + } + mantissa = value; + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); + else + return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); +} + + + +static int __init pddf_custom_psu_init(void) +{ + access_psu_v_out.show = pddf_show_custom_psu_v_out; + access_psu_v_out.do_get = NULL; + return 0; +} + +static void __exit pddf_custom_psu_exit(void) +{ + return; +} + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("pddf custom psu api"); +MODULE_LICENSE("GPL"); + +module_init(pddf_custom_psu_init); +module_exit(pddf_custom_psu_exit); diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_wdt.c b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_wdt.c new file mode 100644 index 000000000000..a73a6f6eb143 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/modules/pddf_custom_wdt.c @@ -0,0 +1,741 @@ +/*************************************************************************** + * Copyright (C) 2021 Celestica Corp * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WDT_CONTROL_BASE 0xA100 +#define TEST_SCRATCH_REG 0xA101 +#define REBOOT_CAUSE_REG 0xA105 +#define WDT_SET_TIMER_H_BIT_REG 0xA161 +#define WDT_SET_TIMER_M_BIT_REG 0xA162 +#define WDT_SET_TIMER_L_BIT_REG 0xA163 +#define WDT_TIMER_H_BIT_REG 0xA164 +#define WDT_TIMER_M_BIT_REG 0xA165 +#define WDT_TIMER_L_BIT_REG 0xA166 +#define WDT_ENABLE_REG 0xA167 +#define WDT_FEED_REG 0xA168 +#define WDT_PUNCH_REG 0xA169 +#define WDT_START_FEED 0x01 +#define WDT_STOP_FEED 0x00 + +#define POWER_CYCLE_RESET 0x00 +#define POWER_ON_RESET 0x11 +#define SOFT_SET_WARM_RESET 0x22 +#define SOFT_SET_COLD_RESET 0x33 +#define CPU_WARM_RESET 0x44 +#define CPU_COLD_RESET 0x55 +#define CPU_GPIO_WARM_RESET 0x66 +#define WDT_RESET 0x77 +#define CPU_OVERLOAD_RESET 0x88 +#define INSUFFICIENT_FAN_SPEED_RESET 0xAA + + +#define MAX_TIMER_VALUE 0xffffff +#define DEFUALT_TIMER_VALUE 180000 /* 180s */ +#define WDT_ENABLE 0x01 +#define WDT_DISABLE 0x00 +#define WDT_RESTART 0x00 +#define DRV_NAME "cpld_wdt" +#define DRV_VERSION "1.0.0" +#define DEV_NAME "cpld_wdt" + +struct wdt_data { + unsigned long opened; + struct mutex lock; + char expect_close; + struct watchdog_info ident; + int timeout; + int timer_val; + char caused_reboot; /* last reboot was by the watchdog */ + struct resource *res; +}; + +struct cpld_wdt_private { + struct platform_device *pdev; + struct watchdog_device wddev; + struct cdev cdev; + bool suspended; + struct wdt_data wdat; +}; + +//struct class *cpld_wdt; +static const int max_timeout = MAX_TIMER_VALUE; + +static int timeout = DEFUALT_TIMER_VALUE; /* default 180s */ +module_param(timeout, int, 0); +MODULE_PARM_DESC(timeout, "Start watchdog timer on module load with" + " given initial timeout(unit: ms)." + " Zero (default) disables this feature."); + +static bool nowayout = WATCHDOG_NOWAYOUT; +module_param(nowayout, bool, 0444); +MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close"); + +static unsigned int watchdog_get_timeleft(struct cpld_wdt_private *wdt) +{ + int time = 0; + + mutex_lock(&wdt->wdat.lock); + + time = inb(WDT_TIMER_H_BIT_REG); + time = time << 8 | inb(WDT_TIMER_M_BIT_REG); + time = time << 8 | inb(WDT_TIMER_L_BIT_REG); + time = time/1000; + mutex_unlock(&wdt->wdat.lock); + //pr_crit("Watchdog Get Timeleft:%u\n", time); + return time; +} +static int watchdog_get_timeout(struct cpld_wdt_private *wdt) +{ + int timeout = 0; + if(!wdt) + return -EINVAL; + + mutex_lock(&wdt->wdat.lock); + timeout = inb(WDT_SET_TIMER_H_BIT_REG); + timeout = timeout << 8 | inb(WDT_SET_TIMER_M_BIT_REG); + timeout = timeout << 8 | inb(WDT_SET_TIMER_L_BIT_REG); + timeout=timeout/1000; + mutex_unlock(&wdt->wdat.lock); + + return timeout; +} +static int watchdog_set_timeout(struct cpld_wdt_private *wdt, unsigned int timeout) +{ + unsigned char val = 0; + if(!wdt) + return -EINVAL; + + if (timeout <= 0 + || timeout > max_timeout) { + pr_err("watchdog timeout out of range\n"); + return -EINVAL; + } + + mutex_lock(&wdt->wdat.lock); + + wdt->wdat.timeout = timeout; + if (timeout > MAX_TIMER_VALUE) { + wdt->wdat.timer_val = MAX_TIMER_VALUE; + } else { + wdt->wdat.timer_val = timeout; + } + /* Set timer value */ + //pr_crit("Watchdog Timeout:0x%06x\n", wdt->wdat.timer_val); + + outb((wdt->wdat.timer_val >> 16) & 0xff, WDT_SET_TIMER_H_BIT_REG); + outb((wdt->wdat.timer_val >> 8) & 0xff, WDT_SET_TIMER_M_BIT_REG); + outb(wdt->wdat.timer_val & 0xff, WDT_SET_TIMER_L_BIT_REG); + + mutex_unlock(&wdt->wdat.lock); + + return 0; +} + +static int watchdog_ping(struct cpld_wdt_private *wdt) +{ + if(!wdt) + return -EINVAL; + + mutex_lock(&wdt->wdat.lock); + + /* start feed watchdog */ + outb(WDT_START_FEED, WDT_FEED_REG); + /* stop feed watchdog */ + outb(WDT_STOP_FEED, WDT_FEED_REG); + //pr_crit("Watchdog Ping\n"); + mutex_unlock(&wdt->wdat.lock); + + return 0; +} + +static void watchdog_keepalive(struct cpld_wdt_private *wdt) +{ + unsigned char val = 0; + if(!wdt) + return; + + mutex_lock(&wdt->wdat.lock); + + val = inb(WDT_FEED_REG); + + val &= 0x1; + + val = ~val; + + val &= 0x1; + /* start feed watchdog */ + outb(val, WDT_FEED_REG); + //pr_crit("Watchdog Keepalive\n"); + mutex_unlock(&wdt->wdat.lock); + return; +} + +static int watchdog_start(struct cpld_wdt_private *wdt) +{ + if(!wdt) + return -EINVAL; + + /* Make sure we don't die as soon as the watchdog is enabled below */ + //watchdog_keepalive(); + mutex_lock(&wdt->wdat.lock); + outb(WDT_ENABLE, WDT_ENABLE_REG); + outb(WDT_RESTART, WDT_PUNCH_REG); + mutex_unlock(&wdt->wdat.lock); + //pr_crit("Watchdog Start:Enable and PUNCH\n"); + return 0; +} + +static int watchdog_stop(struct cpld_wdt_private *wdt) +{ + if(!wdt) + return -EINVAL; + + mutex_lock(&wdt->wdat.lock); + outb(WDT_DISABLE, WDT_ENABLE_REG); + mutex_unlock(&wdt->wdat.lock); + //pr_crit("Watchdog Stop\n"); + return 0; +} + +static char watchdog_get_reason(struct cpld_wdt_private *p) +{ + char status = 0; + + if (!p) + return -1; + mutex_lock(&p->wdat.lock); + status = inb(REBOOT_CAUSE_REG); + mutex_unlock(&p->wdat.lock); + + return status; +} + +static bool watchdog_is_running(struct cpld_wdt_private *wdt) +{ + /* + * if we fail to determine the watchdog's status assume it to be + * running to be on the safe side + */ + + bool is_running = true; + + mutex_lock(&wdt->wdat.lock); + is_running = inb(WDT_ENABLE_REG); + mutex_unlock(&wdt->wdat.lock); + + return is_running; +} + +static const struct watchdog_info ident = { + .options = WDIOF_SETTIMEOUT | + WDIOF_KEEPALIVEPING | + WDIOF_MAGICCLOSE, + .firmware_version = 0, + .identity = DRV_NAME, +}; + +static ssize_t identity_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + if(!wdt) + return -EINVAL; + return sprintf(buf, "%s\n", wdt->wdat.ident.identity); +} + +static DEVICE_ATTR_RO(identity); + + +static ssize_t state_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + bool state = watchdog_is_running(wdt); + if(true == state) + return sprintf(buf, "active\n"); + else + return sprintf(buf, "inactive\n"); +} + +static DEVICE_ATTR_RO(state); + +static ssize_t status_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + unsigned int status; + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + if(!wdt) + return -EINVAL; + + return sprintf(buf, "0x%x\n", status); +} + +static DEVICE_ATTR_RO(status); + +static ssize_t reason_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char bootstatus; + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + if(!wdt) + return -EINVAL; + + bootstatus = watchdog_get_reason(wdt); + + return sprintf(buf, "0x%02x\n", bootstatus); +} + +static DEVICE_ATTR_RO(reason); + +static ssize_t timeleft_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + unsigned int timeleft; + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + if(!wdt) + return -EINVAL; + + timeleft = watchdog_get_timeleft(wdt); + + return sprintf(buf, "%u\n", timeleft); + +} + +static DEVICE_ATTR_RO(timeleft); + + +static ssize_t timeout_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + unsigned int timeout; + struct cpld_wdt_private *wdt = dev_get_drvdata(dev); + if(!wdt) + return -EINVAL; + + timeout = watchdog_get_timeout(wdt); + + return sprintf(buf, "%u\n", timeout); +} +static DEVICE_ATTR_RO(timeout); + + +static struct attribute *wdt_attrs[] = { + &dev_attr_state.attr, + &dev_attr_identity.attr, + &dev_attr_status.attr, + &dev_attr_reason.attr, + &dev_attr_timeleft.attr, + &dev_attr_timeout.attr, + NULL, +}; + +static const struct attribute_group wdt_group = { + .attrs = wdt_attrs, +}; + +static int watchdog_open(struct inode *inode, struct file *file) +{ + struct cpld_wdt_private *wdt; + + wdt = container_of(inode->i_cdev, struct cpld_wdt_private, cdev); + + /* If the watchdog is alive we don't need to start it again */ + + if (test_and_set_bit(0, &wdt->wdat.opened)) + return -EBUSY; + + //watchdog_start(wdt); + + if (nowayout) + __module_get(THIS_MODULE); + + wdt->wdat.expect_close = 0; + + file->private_data = wdt; + return nonseekable_open(inode, file); +} + +static int watchdog_release(struct inode *inode, struct file *file) +{ + struct cpld_wdt_private *p; + p = (struct cpld_wdt_private *)file->private_data; + + if(!p) + return -EINVAL; + + clear_bit(0, &p->wdat.opened); + + if (!p->wdat.expect_close) { + //watchdog_keepalive(p); + //pr_crit("Unexpected close, Not stopping watchdog!\n"); + } else if (!nowayout) { + //pr_crit("Cpld Watchdog Stopped!\n"); + watchdog_stop(p); + } + return 0; +} + +/* + * watchdog_write: + * @file: file handle to the watchdog + * @buf: buffer to write + * @count: count of bytes + * @ppos: pointer to the position to write. No seeks allowed + * + * A write to a watchdog device is defined as a keepalive signal. Any + * write of data will do, as we we don't define content meaning. + */ + +static ssize_t watchdog_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct cpld_wdt_private *p; + p = (struct cpld_wdt_private *)file->private_data; + + if(!p) + return -EINVAL; + + + if (count) { + if (!nowayout) { + size_t i; + + /* In case it was set long ago */ + bool expect_close = false; + + for (i = 0; i != count; i++) { + char c; + if (get_user(c, buf + i)) + return -EFAULT; + expect_close = (c == 'V'); + } + + /* Properly order writes across fork()ed processes */ + mutex_lock(&p->wdat.lock); + p->wdat.expect_close = expect_close; + mutex_unlock(&p->wdat.lock); + } + + /* someone wrote to us, we should restart timer */ + watchdog_keepalive(p); + } + return count; +} + +/* + * watchdog_ioctl: + * @inode: inode of the device + * @file: file handle to the device + * @cmd: watchdog command + * @arg: argument pointer + * + * The watchdog API defines a common set of functions for all watchdogs + * according to their available features. + */ +static long watchdog_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + int status; + int new_options; + int new_timeout; + unsigned int val; + union { + struct watchdog_info __user *ident; + int __user *i; + } uarg; + + uarg.i = (int __user *)arg; + + struct cpld_wdt_private *p; + p = (struct cpld_wdt_private *)file->private_data; + if(!p) + return -EINVAL; + + switch (cmd) { + case WDIOC_GETSUPPORT: + return copy_to_user(uarg.ident, &p->wdat.ident, + sizeof(p->wdat.ident)) ? -EFAULT : 0; + + case WDIOC_GETSTATUS: + status = watchdog_is_running(p); + return put_user(status, uarg.i); + + case WDIOC_GETBOOTSTATUS: + //status = watchdog_get_bootstatus(p); + return put_user(status, uarg.i); + + case WDIOC_SETOPTIONS: + if (get_user(new_options, uarg.i)){ + return -EFAULT; + } + + if (new_options & WDIOS_DISABLECARD){ + return watchdog_stop(p); + } + + if (new_options & WDIOS_ENABLECARD){ + return watchdog_start(p); + } + + return 0; + + case WDIOC_KEEPALIVE: + watchdog_keepalive(p); + return 0; + + case WDIOC_SETTIMEOUT: + if (get_user(new_timeout, uarg.i)) + return -EFAULT; + new_timeout = new_timeout*1000; + if (watchdog_set_timeout(p, new_timeout)) + return -EINVAL; + + val = watchdog_get_timeout(p); + return put_user(val, uarg.i); + case WDIOC_GETTIMEOUT: + val = watchdog_get_timeout(p); + return put_user(val, uarg.i); + + case WDIOC_GETTIMELEFT: + val = watchdog_get_timeleft(p); + return put_user(val, uarg.i); + default: + return -ENOTTY; + + } +} + +static int watchdog_notify_sys(struct notifier_block *this, unsigned long code, + void *unused) +{ + if (code == SYS_DOWN || code == SYS_HALT) + //watchdog_stop(p); + + pr_err("CPLD Watchdog did not Stop!\n"); + return NOTIFY_DONE; +} + +static const struct file_operations watchdog_fops = { + .owner = THIS_MODULE, + .llseek = no_llseek, + .open = watchdog_open, + .release = watchdog_release, + .write = watchdog_write, + .unlocked_ioctl = watchdog_ioctl, +}; + +static struct miscdevice watchdog_miscdev = { + //.minor = WATCHDOG_MINOR, + .name = DEV_NAME, + .fops = &watchdog_fops, +}; + +static struct notifier_block watchdog_notifier = { + .notifier_call = watchdog_notify_sys, +}; + +static int cpld_wdt_probe(struct platform_device *pdev) +{ + int wdt_reboot_cause, err = 0; + unsigned char ver = 0; + struct device *dev = &pdev->dev; + + struct cpld_wdt_private *p; + + p = devm_kzalloc(dev, sizeof(*p), GFP_KERNEL); + if (!p) + return -ENOMEM; + + + mutex_init(&(p->wdat.lock)); + + p->wdat.ident.options = WDIOC_SETTIMEOUT + | WDIOF_MAGICCLOSE + | WDIOF_KEEPALIVEPING + | WDIOC_GETTIMELEFT; + + snprintf(p->wdat.ident.identity, + sizeof(p->wdat.ident.identity), "%s", DRV_NAME); + + wdt_reboot_cause = inb(REBOOT_CAUSE_REG); // REBOOT_CAUSE + p->wdat.caused_reboot = wdt_reboot_cause; + ver = inb(WDT_CONTROL_BASE); + pr_info("Watchdog CPLD Version:0x%02x\n", + ver); + + if (timeout) { + if (timeout <= 0 + || timeout > max_timeout) { + pr_err("starting timeout out of range\n"); + err = -EINVAL; + return err; + } + + //watchdog_start(p); + + + if (timeout > MAX_TIMER_VALUE) { + watchdog_set_timeout(p, MAX_TIMER_VALUE); + } else { + watchdog_set_timeout(p, timeout); + } + + if (nowayout) + __module_get(THIS_MODULE); + + pr_info("watchdog started with initial timeout of %u Second(s)\n", + timeout/1000); + } + + err = watchdog_set_timeout(p, timeout); + if (err) + return err; + + err = register_reboot_notifier(&watchdog_notifier); + if (err) + return err; + + err = misc_register(&watchdog_miscdev); + if (err) { + pr_err("cannot register miscdev on minor=%d\n", + watchdog_miscdev.minor); + return err;; + } + + /*p->wdat.res = platform_get_resource(pdev, IORESOURCE_IO, WDT_CONTROL_BASE); + if (!p->wdat.res) + return -ENODEV; + + if (!devm_request_region(dev, p->wdat.res->start, + resource_size(p->wdat.res), + pdev->name)) { + return -EBUSY; + } + */ + err = sysfs_create_group(&pdev->dev.kobj, &wdt_group); + if (err) { + printk(KERN_ERR "Cannot create sysfs for cpld_wdt.\n"); + return err; + } + + platform_set_drvdata(pdev, p); + dev_set_drvdata(dev, p); + + pr_info("initialized. sec (nowayout=%d)\n", + nowayout); + + return 0; +} + +static int cpld_wdt_remove(struct platform_device *pdev) +{ + struct cpld_wdt_private *p = platform_get_drvdata(pdev); + /* + if (!nowayout) + watchdog_stop(&p->wddev); + */ + if(!p) + return 0; + + sysfs_remove_group(&pdev->dev.kobj, &wdt_group); + + misc_deregister(&watchdog_miscdev); + + unregister_reboot_notifier(&watchdog_notifier); + + return 0; + +} + +static struct platform_driver cpld_wdt_driver = { + .probe = cpld_wdt_probe, + .remove = cpld_wdt_remove, + .driver = { + .name = DRV_NAME, + }, +}; + +static struct resource cpld_wdt_resources[] = { + { + .start = 0xA100, + .end = 0xA1F2, + .flags = IORESOURCE_IO, + }, +}; + +static void wdt_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device cpld_wdt_dev = { + .name = DRV_NAME, + .id = -1, + .num_resources = ARRAY_SIZE(cpld_wdt_resources), + .resource = cpld_wdt_resources, + .dev = { + .release = wdt_dev_release, + } +}; + +static int __init cpld_wdt_init_module(void) +{ + int err = 0; + + err = platform_device_register(&cpld_wdt_dev); + err += platform_driver_register(&cpld_wdt_driver); + if(err < 0) + pr_info("Platform Device/Driver Register Failed. err:%d\n", err); + + pr_info("CPLD WatchDog Timer Driver v%s\n", DRV_VERSION); + return err; +} + +static void __exit cpld_wdt_cleanup_module(void) +{ + platform_driver_unregister(&cpld_wdt_driver); + platform_device_unregister(&cpld_wdt_dev); + pr_info("Watchdog Module Unloaded\n"); +} + +module_init(cpld_wdt_init_module); +module_exit(cpld_wdt_cleanup_module); + + +MODULE_DESCRIPTION("Cpld Watchdog Driver"); +MODULE_VERSION(DRV_VERSION); +MODULE_AUTHOR("Nicholas "); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/__init__.py new file mode 100644 index 000000000000..0533d11584e1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/__init__.py @@ -0,0 +1,4 @@ +# All the derived classes for PDDF +__all__ = ["platform", "chassis", "sfp", "psu", "thermal"] +from sonic_platform import * #[py/polluting-import] + diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py new file mode 100644 index 000000000000..5e2b204e3d0b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py @@ -0,0 +1,162 @@ +############################################################################# +# PDDF +# Module contains an implementation of SONiC Chassis API +# +############################################################################# +import os + +try: + from sonic_platform_pddf_base.pddf_chassis import PddfChassis + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.watchdog import Watchdog + import sys + import subprocess + from sonic_py_common import device_info +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_COMPONENT = 3 +FAN_DIRECTION_FILE_PATH = "/var/fan_direction" + +class Chassis(PddfChassis): + """ + PDDF Platform-specific Chassis class + """ + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + + PddfChassis.__init__(self, pddf_data, pddf_plugin_data) + vendor_ext = self._eeprom.vendor_ext_str() + with open(FAN_DIRECTION_FILE_PATH, "w+") as f: + f.write(vendor_ext) + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + self.__initialize_components() + + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + # Provide the functions/variables below for which implementation is to be overwritten + + def initizalize_system_led(self): + return True + + def get_sfp(self, index): + """ + Retrieves sfp represented by (1-based) index + For Quanta the index in sfputil.py starts from 1, so override + Args: + index: An integer, the index (1-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 1. + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + + try: + if index == 0: + raise IndexError + sfp = self._sfp_list[index - 1] + except IndexError: + sys.stderr.write("override: SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + + return sfp + + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + self._watchdog = Watchdog() + + return self._watchdog + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + hw_reboot_cause = "" + with open("/sys/devices/platform/cpld_wdt/reason", "r") as f: + hw_reboot_cause = f.read().strip() + + if hw_reboot_cause == "0x77": + reboot_cause = self.REBOOT_CAUSE_WATCHDOG + description = 'Hardware Watchdog Reset' + elif hw_reboot_cause == "0x66": + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'GPIO Request Warm Reset' + elif hw_reboot_cause == "0x55": + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'CPU Cold Reset' + elif hw_reboot_cause == "0x44": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = 'CPU Warm Reset' + elif hw_reboot_cause == "0x33": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = 'Soft-Set Cold Reset' + elif hw_reboot_cause == "0x22": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = 'Soft-Set Warm Reset' + elif hw_reboot_cause == "0x11": + reboot_cause = self.REBOOT_CAUSE_POWER_LOSS + description = 'Power Loss' + else: + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = 'Unkown Reason' + + return (reboot_cause, description) + + def get_serial(self): + return self._eeprom.serial_number_str() + + def get_revision(self): + return self._eeprom.revision_str() + + @staticmethod + def get_position_in_parent(): + return -1 + + @staticmethod + def is_replaceable(): + return True + + def get_base_mac(self): + return self._eeprom.base_mac_addr() + + def get_system_eeprom_info(self): + return self._eeprom.system_eeprom_info() + + def get_name(self): + return self.modelstr() + + def get_model(self): + return self._eeprom.part_number_str() + + def set_status_led(self, color): + color_dict = { + 'green': "STATUS_LED_COLOR_GREEN", + 'red': "STATUS_LED_COLOR_AMBER", + 'amber': "STATUS_LED_COLOR_AMBER", + 'off': "STATUS_LED_COLOR_OFF" + } + return self.set_system_led("SYS_LED", color_dict.get(color, "off")) + + def get_status_led(self): + return self.get_system_led("SYS_LED") + diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py new file mode 100644 index 000000000000..e4f3e1257da8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +import os.path +import subprocess +import time +import os + +try: + from sonic_platform_base.component_base import ComponentBase + #from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +SWCPLD_VERSION_PATH = "i2cget -y -f 2 0x32 0" +BIOS_VERSION_PATH = "dmidecode -t bios | grep Version" +COMPONENT_NAME_LIST = ["SWCPLD", "Main_BIOS", "Backup_BIOS"] +COMPONENT_DES_LIST = ["Use for boot control and BIOS switch", + "Main basic Input/Output System", + "Backup basic Input/Output System"] + + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index): + ComponentBase.__init__(self) + self.index = component_index + #self._api_helper = APIHelper() + self.name = self.get_name() + + def run_command(self,cmd): + responses = os.popen(cmd).read() + return responses + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + result = self.run_command("i2cget -y -f 2 0x32 0x19") + if result.strip() == "0x01": + if self.name == "Main_BIOS": + version = self.run_command(BIOS_VERSION_PATH) + bios_version = version.strip().split(" ")[1] + return str(bios_version) + elif self.name == "Backup_BIOS": + bios_version = "na" + return bios_version + + elif result.strip() == "0x03": + if self.name == "Backup_BIOS": + version = self.run_command(BIOS_VERSION_PATH) + bios_version = version.strip().split(" ")[1] + return str(bios_version) + elif self.name == "Main_BIOS": + bios_version = "na" + return bios_version + + def __get_cpld_version(self): + if self.name == "SWCPLD": + ver = self.run_command(SWCPLD_VERSION_PATH) + print("ver is %s" % ver) + ver = ver.strip().split("x")[1] + print("ver2 is %s" % ver) + version = int(ver.strip()) / 10 + return str(version) + + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_NAME_LIST[self.index] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_DES_LIST[self.index] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if "BIOS" in self.name: + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + fw_version = self.__get_cpld_version() + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + return False + + def update_firmware(self, image_path): + return False + + def get_available_firmware_version(self, image_path): + return 'N/A' + + def get_firmware_update_notification(self, image_path): + return "None" + + def get_model(self): + return 'N/A' + + def get_position_in_parent(self): + return -1 + + def get_presence(self): + return True + + def get_serial(self): + return 'N/A' + + def get_status(self): + return True + + def is_replaceable(self): + return False diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/eeprom.py new file mode 100644 index 000000000000..bc1ef6420b68 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/eeprom.py @@ -0,0 +1,75 @@ +try: + from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(PddfEeprom): + + _TLV_DISPLAY_VENDOR_EXT = True + _TLV_INFO_MAX_LEN = 256 + pddf_obj = {} + plugin_data = {} + + def __init__(self, pddf_data=None, pddf_plugin_data=None): + if not pddf_data or not pddf_plugin_data: + raise ValueError('PDDF JSON data error') + + self.pddf_obj = pddf_data + self.plugin_data = pddf_plugin_data + + # system EEPROM always has device name EEPROM1 + self.eeprom_path = self.pddf_obj.get_path("EEPROM1", "eeprom") + if self.eeprom_path is None: + return + + super(PddfEeprom, self).__init__(self.eeprom_path, 0, '', True) + #super().__init__(self.pddf_obj, self.plugin_data) + self.eeprom_tlv_dict = dict() + try: + self.eeprom_data = self.read_eeprom() + except Exception as e: + self.eeprom_data = "N/A" + raise RuntimeError("PddfEeprom is not Programmed - Error: {}".format(str(e))) + else: + eeprom = self.eeprom_data + + if not self.is_valid_tlvinfo_header(eeprom): + return + + total_length = ((eeprom[9]) << 8) | (eeprom[10]) + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_length + + while (tlv_index + 2) < self._TLV_INFO_MAX_LEN and tlv_index < tlv_end: + if not self.is_valid_tlv(eeprom[tlv_index:]): + break + + tlv = eeprom[tlv_index:tlv_index + 2 + + (eeprom[tlv_index + 1])] + code = "0x%02X" % ((tlv[0])) + + if (tlv[0]) == self._TLV_CODE_VENDOR_EXT: + name = "Vendor Extension" #lgtm [py/multiple-definition] + value = "" + if self._TLV_DISPLAY_VENDOR_EXT: + for c in tlv[2:2 + tlv[1]]: + value += "0x%02X " % c + else: + name, value = self.decoder(None, tlv) + + self.eeprom_tlv_dict[code] = value + if (eeprom[tlv_index]) == self._TLV_CODE_CRC_32: + break + + tlv_index += (eeprom[tlv_index+1]) + 2 + + def vendor_ext_str(self): + """ + :return: the direction of fan(FB or BF, string) + """ + (is_valid, results) = self.get_tlv_field(self.eeprom_data, self._TLV_CODE_VENDOR_EXT) + if not is_valid: + return "N/A" + return str(hex(int(results[2][2]))).replace("0x", "").upper() + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py new file mode 100644 index 000000000000..36e95f2c0c08 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py @@ -0,0 +1,146 @@ +try: + from sonic_platform_pddf_base.pddf_fan import PddfFan + import os +except ImportError as e: + raise ImportError(str(e) + "- required module not found") +# ------------------------------------------------------------------ +# HISTORY: +# 5/1/2022 (A.D.) +# add function:set_status_led, +# Solve the problem that when a fan is pulled out, the Fan LED on the front panel is still green Issue-#11525 +# ------------------------------------------------------------------ +FAN_DIRECTION_FILE_PATH = "/var/fan_direction" + + +class Fan(PddfFan): + """PDDF Platform-Specific Fan class""" + + def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): + # idx is 0-based + PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) + + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + # Fix the speed vairance to 10 percent. If it changes based on platforms, overwrite + # this value in derived pddf fan class + return 20 + + + def get_presence(self): + #Overwirte the PDDF Common since the FANs on Belgite are all Fixed and present + return True + + def get_direction(self): + """ + Retrieves the direction of fan + + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + if self.is_psu_fan: + cmd_num = "58" if self.fans_psu_index == 1 else "59" + cmd = "i2cget -y -f 4 0x%s 0x80" % cmd_num + res = os.popen(cmd).read() + # F2B + if res.strip() == "0x01": + direction = "EXHAUST" + else: + direction = "INTAKE" + else: + direction = "INTAKE" + with open(FAN_DIRECTION_FILE_PATH, "r") as f: + fan_direction = f.read() + if fan_direction.strip() == "FB": + direction = "EXHAUST" + return direction + + + def get_status(self): + speed = self.get_speed_rpm() + status = True if (speed != 0) else False + return status + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + target_speed = 0 + if self.is_psu_fan: + # Target speed not usually supported for PSU fans + target_speed = "N/A" + else: + idx = (self.fantray_index - 1) * 1 + self.fan_index + attr = "fan" + str(idx) + "_pwm" + pwm_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-2/2-0066/" + attr + pwm = 0 + with open(pwm_path, "r") as f: + pwm = f.read() + + percentage = int(pwm.strip()) + speed_percentage = int(round(percentage / 255 * 100)) + target_speed = speed_percentage + + return target_speed + + def set_status_led(self, color): + color_dict = {"green": "STATUS_LED_COLOR_GREEN", + "red": "STATUS_LED_COLOR_AMBER"} + color = color_dict.get(color, "off") + index = str(self.fantray_index - 1) + led_device_name = "FANTRAY{}".format(self.fantray_index) + "_LED" + + result, msg = self.pddf_obj.is_supported_sysled_state(led_device_name, color) + if result is False: + return False + device_name = self.pddf_obj.data[led_device_name]['dev_info']['device_name'] + self.pddf_obj.create_attr('device_name', device_name, self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('index', index, self.pddf_obj.get_led_path()) + self.pddf_obj.create_attr('color', color, self.pddf_obj.get_led_cur_state_path()) + + self.pddf_obj.create_attr('dev_ops', 'set_status', self.pddf_obj.get_led_path()) + return True + + @staticmethod + def get_model(): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model = "Unknown" + return model + + @staticmethod + def get_serial(): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + return serial + + def get_position_in_parent(self): + """ + Retrieves the fan/psu fan index number + """ + return self.fantray_index if not self.is_psu_fan else self.fans_psu_index + 4 + + @staticmethod + def is_replaceable(): + """ + Retrieves whether the device is replaceable + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..ac80aad4b1eb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan_drawer.py @@ -0,0 +1,33 @@ +############################################################################# +# PDDF +# +# PDDF fan_drawer base class inherited from the common base class fan_drawer.py +# +############################################################################# + +try: + from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class FanDrawer(PddfFanDrawer): + """PDDF Platform-Specific Fan-Drawer class""" + + def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): + # idx is 0-based + PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) + + + def set_status_led(self, color): + return self._fan_list[0].set_status_led(color) + + def get_status_led(self, color=None): + return self._fan_list[0].get_status_led() + + def get_serial(self): + serial = "Unknown" + return serial + + def get_model(self): + model = "Unknown" + return model diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/platform.py new file mode 100644 index 000000000000..d6fee81bea31 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/platform.py @@ -0,0 +1,21 @@ +############################################################################# +# PDDF +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_pddf_base.pddf_platform import PddfPlatform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Platform(PddfPlatform): + """ + PDDF Platform-Specific Platform Class + """ + + def __init__(self): + PddfPlatform.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py new file mode 100644 index 000000000000..9616d030012f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py @@ -0,0 +1,55 @@ +try: + from sonic_platform_pddf_base.pddf_psu import PddfPsu +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Psu(PddfPsu): + """PDDF Platform-Specific PSU class""" + + PLATFORM_PSU_CAPACITY = 550 + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten + def get_capacity(self): + """ + Gets the capacity (maximum output power) of the PSU in watts + + Returns: + An integer, the capacity of PSU + """ + return (self.PLATFORM_PSU_CAPACITY) + + def get_type(self): + """ + Gets the type of the PSU + + Returns: + A string, the type of PSU (AC/DC) + """ + ptype = "AC" + + # This platform supports AC PSU + return ptype + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_position_in_parent(self): + """ + Retrieves the psu index number + """ + return self.psu_index + + def get_revision(self): + return "N/A" + + def temperature(self): + return self.get_temperature() diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/sfp.py new file mode 100644 index 000000000000..a216a37afcf8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/sfp.py @@ -0,0 +1,15 @@ +try: + from sonic_platform_pddf_base.pddf_sfp import PddfSfp +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class Sfp(PddfSfp): + """ + PDDF Platform-Specific Sfp class + """ + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None): + PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data) + + # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/thermal.py new file mode 100644 index 000000000000..7dd294fb8475 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/thermal.py @@ -0,0 +1,111 @@ +try: + from sonic_platform_pddf_base.pddf_thermal import PddfThermal +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + + +class Thermal(PddfThermal): + """PDDF Platform-Specific Thermal class""" + + def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): + PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) + self.minimum_thermal = self.get_temperature() + self.maximum_thermal = self.get_temperature() + # Provide the functions/variables below for which implementation is to be overwritten + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return 0.001 + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + Returns: + A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + + return 100.000 + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp < self.minimum_thermal: + self.minimum_thermal = tmp + + return self.minimum_thermal + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp > self.maximum_thermal: + self.maximum_thermal = tmp + + return self.maximum_thermal + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if Thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + + return True + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False + + def get_position_in_parent(self): + """ + Retrieves the thermal position information + Returns: + A int value, 0 represent ASIC thermal, 1 represent CPU thermal info + """ + return 0 diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/watchdog.py new file mode 100644 index 000000000000..7973e8a3cfad --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/watchdog.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python + +############################################################################# +# +# Watchdog contains an implementation of SONiC Platform Base Watchdog API +# +############################################################################# +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +""" ioctl constants """ +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +""" Watchdog ioctl commands """ +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +""" Watchdog status constants """ +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WD_MAIN_IDENTITY = "cpld_wdt" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + +DEFAULT_TIMEOUT=180 +watchdog = 0 + +class CpldWatchdog(WatchdogBase): + + watchdog = None + def __init__(self): + global watchdog + self.status_path = "/sys/devices/platform/cpld_wdt/status" + self.state_path = "/sys/devices/platform/cpld_wdt/state" + self.timeout_path = "/sys/devices/platform/cpld_wdt/timeout" + # Set default value + with open("/sys/devices/platform/cpld_wdt/state", "r") as fd: + txt = fd.read() + state = txt.strip() + self.armed = True if state == "active" else False + self.timeout = DEFAULT_TIMEOUT + if not watchdog: + watchdog = os.open("/dev/cpld_wdt", os.O_RDWR) + + self.watchdog = watchdog + #self._disable() + + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self, timeout_path): + """ + Get watchdog timeout + @return watchdog timeout + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + ################################################################# + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + + if self.armed: + self._keepalive() + else: + self._enable() + self.armed = True + + ret = self.timeout + except IOError as e: + pass + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + + timeleft = WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + + if self.watchdog is not None : + os.close(self.watchdog) + +class Watchdog(CpldWatchdog): + """PDDF Platform-Specific Watchdog Class""" + + def __init__(self): + CpldWatchdog.__init__(self) + + # Provide the functions/variables below for which implementation is to be overwritten + diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform_setup.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform_setup.py new file mode 100644 index 000000000000..159e26656138 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform_setup.py @@ -0,0 +1,27 @@ +import os +from setuptools import setup +os.listdir + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Celestica Platforms based on PDDF', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + packages=['sonic_platform'], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh new file mode 100755 index 000000000000..414eea7a2b40 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# Set U60 shutdown threhold 80 +sudo i2cset -y -f 6 0x49 0x3 0x4e 0x00 i +sleep 0.1 +sudo i2cset -y -f 6 0x49 0x1 0x2 +sleep 0.1 +#Set LM75 shutdown enable +sudo i2cset -y -f 2 0x32 0x45 0x1 + +echo -2 | tee /sys/bus/i2c/drivers/pca954x/*-00*/idle_state diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_pre_driver_install.sh b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_pre_driver_install.sh new file mode 100755 index 000000000000..2b37a5d5f6ff --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_pre_driver_install.sh @@ -0,0 +1,5 @@ +#!/bin/bash +modprobe -r i2c_ismt +sleep 0.1 +modprobe -r i2c-i801 +sleep 0.1 diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/service/belgite-pddf-platform-monitor.service b/platform/broadcom/sonic-platform-modules-cel/belgite/service/belgite-pddf-platform-monitor.service new file mode 100644 index 000000000000..233971ae784d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/service/belgite-pddf-platform-monitor.service @@ -0,0 +1,16 @@ +[Unit] +Description=Belgite Platform Monitoring service +Before=pmon.service +After=pddf-platform-init.service +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/belgite_pddf_monitor.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/systemd/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-cel/belgite/systemd/pddf-platform-init.service new file mode 100644 index 000000000000..249fa2e89764 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/systemd/pddf-platform-init.service @@ -0,0 +1,15 @@ +[Unit] +Description=PDDF module and device initialization service +Before=pmon.service watchdog-control.service +Before=opennsl-modules.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/pddf_util.py install +ExecStop=/usr/local/bin/pddf_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +WantedBy=opennsl-modules.service diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/utils/belgite_pddf_monitor.py b/platform/broadcom/sonic-platform-modules-cel/belgite/utils/belgite_pddf_monitor.py new file mode 100755 index 000000000000..017a04709f3c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/utils/belgite_pddf_monitor.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python3 +# +# Copyright (C) Celestica Technology Corporation +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# ------------------------------------------------------------------ +# HISTORY: +# 9/16/2021 (A.D.) +# ------------------------------------------------------------------ + +try: + import sys + import getopt + import subprocess + import logging + import logging.config + import time # this is only being used as part of the example + import signal + import math + from sonic_platform import platform +except ImportError as e: + raise ImportError('%s - required module not found' % str(e)) + +# Deafults +FUNCTION_NAME = 'cel_belgite_monitor' +DUTY_MAX = 100 +FAN_NUMBER = 3 +SENSOR_NUMBER = 4 +CPU_CORE_TEMP = r"/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input" + + +class cel_belgite_monitor(object): + """ + Make a class we can use to capture stdout and sterr in the log + """ + # static temp var + _ori_temp = 0 + _new_perc = DUTY_MAX / 2 + syslog = logging.getLogger("[" + FUNCTION_NAME + "]") + init_fan_temperature = [0, 0, 0, 0] + + def __init__(self, log_file, log_level): + """Needs a logger and a logger level.""" + formatter = logging.Formatter('%(name)s %(message)s') + sys_handler = logging.handlers.SysLogHandler(address='/dev/log') + sys_handler.setFormatter(formatter) + sys_handler.ident = 'common' + self.syslog.setLevel(logging.WARNING) + self.syslog.addHandler(sys_handler) + self.platform_chassis_obj = platform.Platform().get_chassis() + # set up logging to file + logging.basicConfig( + filename=log_file, + filemode='w', + level=log_level, + format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', + datefmt='%H:%M:%S' + ) + + # set up logging to console + if log_level == logging.DEBUG: + console = logging.StreamHandler() + console.setLevel(log_level) + formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') + console.setFormatter(formatter) + logging.getLogger('').addHandler(console) + logging.debug('SET. logfile:%s / loglevel:%d' % (log_file, log_level)) + + def get_all_temperature(self): + """ + return: all temperature + """ + all_temperature_list = list() + for sensor_index in range(SENSOR_NUMBER): + temp = self.platform_chassis_obj.get_thermal(sensor_index).get_temperature() + if temp is None or str(temp).strip() == "": + return False + temp = temp*1000 + all_temperature_list.append(temp) + u4_temperature = all_temperature_list[0] + u7_temperature = all_temperature_list[1] + # default CPU temperature 70 + cpu_temperature = 70000 + try: + with open(CPU_CORE_TEMP, "r") as f: + cpu_temperature = float(f.read().strip()) + except Exception as E: + logging.debug('Error: %s' % E) + u60_temperature = all_temperature_list[3] + return [u4_temperature, u7_temperature, cpu_temperature, u60_temperature] + + def get_fan_speed_by_temperature(self, temp_list): + fan1_direction = self.platform_chassis_obj.get_fan(0).get_direction() + logging.debug('INFO: fan direction: %s' % str(fan1_direction)) + all_temp = self.get_all_temperature() + logging.debug('INFO: all_temp: %s' % str(all_temp)) + # B2F=intake: U7 temperature, F2B-EXHAUST: U4 temperature + a = 1 if fan1_direction.lower() == "intake" else 0 + sensor_temp = all_temp[a] + cup_temp = all_temp[2] + u60_temp = all_temp[3] + logging.debug('sensor_temp:%d cup_temp:%d u60_temp:%d' % (sensor_temp, cup_temp, u60_temp)) + update_temp_sensor, update_temp_cpu, update_temp_u60 = True, True, True + if all_temp[a] - temp_list[a] < 0: + update_temp_sensor = False + if cup_temp - temp_list[2] < 0: + update_temp_cpu = False + if u60_temp - temp_list[3] < 0: + update_temp_u60 = False + + # U4 U7 + if not update_temp_sensor: # temperature down + b = math.trunc(1400/13) + if sensor_temp <= 32000: + sensor_temp_speed = 40 + elif sensor_temp >= 45000: + sensor_temp_speed = 100 + else: + sensor_temp_speed = int(math.trunc(60 / 13) * math.trunc(sensor_temp / 1000) - b) + else: # temperature up + b = math.trunc(1580 / 13) + if sensor_temp <= 35000: + sensor_temp_speed = 40 + elif sensor_temp >= 48000: + sensor_temp_speed = 100 + else: + sensor_temp_speed = int(math.trunc(60/13) * math.trunc(sensor_temp/1000) - b) + + # CPU + if not update_temp_cpu: # temperature down + b = 228 + if cup_temp <= 67000: + cpu_temp_speed = 40 + elif cup_temp >= 82000: + cpu_temp_speed = 100 + else: + cpu_temp_speed = int(4 * (cup_temp / 1000) - b) + else: # temperature up + b = 240 + if cup_temp <= 70000: + cpu_temp_speed = 40 + elif cup_temp >= 85000: + cpu_temp_speed = 100 + else: + cpu_temp_speed = int(4 * (cup_temp / 1000) - b) + + # U60 + if not update_temp_u60: # temperature down + b = 168 + if u60_temp <= 52000: + u60_temp_speed = 40 + elif u60_temp >= 67000: + u60_temp_speed = 100 + else: + u60_temp_speed = int(4 * (u60_temp / 1000) - b) + else: # temperature up + b = 180 + if u60_temp <= 55000: + u60_temp_speed = 40 + elif u60_temp >= 70000: + u60_temp_speed = 100 + else: + u60_temp_speed = int(4 * (u60_temp / 1000) - b) + return max([sensor_temp_speed, cpu_temp_speed, u60_temp_speed]) + + def manage_fans(self): + fan_presence_list = [True, True, True] # whether fan is absent or not + for fan_index in range(FAN_NUMBER): + if not self.platform_chassis_obj.get_fan(fan_index).get_presence() or not \ + self.platform_chassis_obj.get_fan(fan_index).get_status(): + fan_presence_list[fan_index] = False + logging.debug('self.platform_chassis_obj.get_fan(fan_index).get_presence():%s' + % str(self.platform_chassis_obj.get_fan(fan_index).get_presence())) + logging.debug('self.platform_chassis_obj.get_fan(fan_index).get_status():%s' + % str(self.platform_chassis_obj.get_fan(fan_index).get_status())) + else: + fan_presence_list[fan_index] = True + + fans_inserted_num = FAN_NUMBER - fan_presence_list.count(False) + if fans_inserted_num == 0: # all fans broken, power off + self.syslog.critical("No fans inserted. Severe overheating hazard. " + "Please insert Fans immediately or power off the device\n") + + # power off + elif fans_inserted_num in [1, 2]: # 1 or 2 present, full speed + self._new_perc = DUTY_MAX + else: # 3 fans normal, manage the fans follow thermal policy + self._new_perc = self.get_fan_speed_by_temperature(self.init_fan_temperature) + logging.debug('INFO: 3 fans inserted: self._new_perc: %s' % str(self._new_perc)) + self.init_fan_temperature = self.get_all_temperature() + + for i in range(FAN_NUMBER): + aa = self.platform_chassis_obj.get_fan(i).get_speed() + logging.debug("INFO: Get before setting fan speed: %s" % aa) + if self._new_perc < 40: + self._new_perc = 40 + if self._new_perc > 100: + self._new_perc = 100 + set_stat = self.platform_chassis_obj.get_fan(i).set_speed(self._new_perc) + if set_stat is True: + logging.debug('INFO: PASS. set_fan%d_duty_cycle (%d)' % (i, self._new_perc)) + else: + logging.debug('INFO: FAIL. set_fan%d_duty_cycle (%d)' % (i, self._new_perc)) + + +def handler(signum, frame): + platform_chassis = platform.Platform().get_chassis() + for _ in range(FAN_NUMBER): + set_stat = platform_chassis.get_fan(_).set_speed(DUTY_MAX) + if set_stat is True: + logging.debug('INFO:Cause signal %d, set fan speed max.' % signum) + else: + logging.debug('INFO: FAIL. set_fan_duty_cycle (%d)' % DUTY_MAX) + # Enable the CPLD Heartbeat back + status, output = subprocess.getstatusoutput('i2cset -f -y 75 0x40 0x22 0x00') + if status == 0: + logging.debug('INFO: CPLD Heartbeat check is enabled back') + sys.exit(0) + + +def main(argv): + global test_temp + + log_file = '/home/admin/%s.log' % FUNCTION_NAME + log_level = logging.INFO + if len(sys.argv) != 1: + try: + opts, args = getopt.getopt(argv, 'hdlt:', ['lfile=']) + except getopt.GetoptError: + print('Usage: %s [-d] [-l ]' % sys.argv[0]) + return 0 + for opt, arg in opts: + if opt == '-h': + print('Usage: %s [-d] [-l ]' % sys.argv[0]) + return 0 + elif opt in ('-d', '--debug'): + log_level = logging.DEBUG + elif opt in ('-l', '--lfile'): + log_file = arg + + if sys.argv[1] == '-t': + if len(sys.argv) != 6: + print("temp test, need input 4 temp") + return 0 + + signal.signal(signal.SIGINT, handler) + signal.signal(signal.SIGTERM, handler) + # Disaable the CPLD Heartbeat check to control Fan speed from CPU via ADT7470 + subprocess.getstatusoutput('i2cset -f -y 2 0x32 0x30 0x01') + + monitor = cel_belgite_monitor(log_file, log_level) + + # Loop forever, doing something useful hopefully: + while True: + monitor.manage_fans() + time.sleep(10) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/control b/platform/broadcom/sonic-platform-modules-cel/debian/control index 605a3cd0a834..2ba492829d26 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/control +++ b/platform/broadcom/sonic-platform-modules-cel/debian/control @@ -25,3 +25,8 @@ Package: platform-modules-silverstone Architecture: amd64 Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as led, sfp. + +Package: platform-modules-belgite +Architecture: amd64 +Depends: linux-image-5.10.0-8-2-amd64-unsigned +Description: kernel modules for platform devices such as led, sfp diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.install b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.install new file mode 100644 index 000000000000..6f9f8f267ed9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.install @@ -0,0 +1,7 @@ +belgite/systemd/pddf-platform-init.service etc/systemd/system +belgite/service/belgite-pddf-platform-monitor.service lib/systemd/system +belgite/scripts/pddf_pre_driver_install.sh usr/local/bin +belgite/scripts/pddf_post_device_create.sh usr/local/bin +belgite/utils/belgite_pddf_monitor.py usr/local/bin +belgite/pddf/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-cel_belgite-r0/pddf +services/platform_api/platform_api_mgnt.sh usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.postinst b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.postinst new file mode 100644 index 000000000000..4abd671baec9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-belgite.postinst @@ -0,0 +1,6 @@ +depmod -a +/usr/local/bin/platform_api_mgnt.sh install +systemctl enable pddf-platform-init.service +systemctl start pddf-platform-init.service +systemctl enable belgite-pddf-platform-monitor.service +systemctl start belgite-pddf-platform-monitor.service diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/rules b/platform/broadcom/sonic-platform-modules-cel/debian/rules index 97d383fcfa28..29b2b7913ade 100755 --- a/platform/broadcom/sonic-platform-modules-cel/debian/rules +++ b/platform/broadcom/sonic-platform-modules-cel/debian/rules @@ -1,11 +1,12 @@ #!/usr/bin/make -f export INSTALL_MOD_DIR:=extra +export KBUILD_EXTRA_SYMBOLS := /sonic/platform/pddf/i2c/Module.symvers.PDDF KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= dx010 haliburton silverstone seastone2 +MODULE_DIRS:= dx010 haliburton silverstone seastone2 belgite %: dh $@ @@ -18,6 +19,17 @@ override_dh_auto_build: python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ continue; \ fi; \ + if [ $$mod = "belgite" ]; then \ + cd $(MOD_SRC_DIR); \ + if [ -d $(MOD_SRC_DIR)/$${mod}/pddf ]; then \ + cd $(MOD_SRC_DIR)/$${mod}/pddf; \ + if [ -f sonic_platform_setup.py ]; then \ + python3 sonic_platform_setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/pddf; \ + echo "Finished makig pddf whl package for $$mod"; \ + fi; \ + fi; \ + continue; \ + fi; \ cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ done) @@ -36,4 +48,7 @@ override_dh_clean: dh_clean (for mod in $(MODULE_DIRS); do \ make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + if [ -f $(MOD_SRC_DIR)/$${mod}/pddf/*.whl ]; then \ + rm -f $(MOD_SRC_DIR)/$${mod}/pddf/*.whl; \ + fi; \ done) diff --git a/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh index 7515b81784b4..0f648246ad33 100755 --- a/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh +++ b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh @@ -11,6 +11,11 @@ install() { if [ -e $PY3_PACK ]; then pip3 install $PY3_PACK fi + + if [ -e $DEVICE/$PLATFORM/pddf/sonic_platform-1.0-py3-none-any.whl ]; then + PY3_PACK=$DEVICE/$PLATFORM/pddf/sonic_platform-1.0-py3-none-any.whl + pip3 install $PY3_PACK + fi } init() { From 2faa69eed23dd17b488d49c927288decc9d0632f Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Tue, 24 May 2022 10:42:09 +0800 Subject: [PATCH 338/817] [Azp]: Ignore the result of t0-sonic pool (#10905) Signed-off-by: Ze Gan --- .azure-pipelines/run-test-template.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index 2a75d1bc32dc..7d3a6c8dd612 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -51,6 +51,8 @@ steps: rm -rf $(Build.ArtifactStagingDirectory)/* docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }} ${{ parameters.section }}" displayName: "Run tests" + ${{ if eq(parameters.tbtype, 't0-sonic') }}: + continueOnError: true - script: | # save dut state if test fails From 8f7ef1e593aa07145021ab711e6de99662d41ef2 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Tue, 24 May 2022 15:10:48 +0800 Subject: [PATCH 339/817] [dualtor][minigraph.py] Add `soc_ipv4` and `cable_type` to `MUX_CABLE` (#10776) Why I did it To further add cable_type and soc_ipv4 field to table MUX_CABLE, this PR tries to parse the minigraph like the following: ``` SmartCable active-active
192.168.0.3/21
::/0 0.0.0.0/0 ::/0 svcstr-7050-acs-1-Servers0-SC
Server
192.168.0.2/21
fc02:1000::2/64 0.0.0.0/0 Servers0
``` Signed-off-by: Longxiang Lyu lolv@microsoft.com How I did it get_mux_cable_entries will try to get the mux cable device from the devices list and get the cable type and soc ip address from the device definition. How to verify it Pass the unit-test --- src/sonic-config-engine/minigraph.py | 41 +++++++++++++++---- .../tests/simple-sample-graph-case.xml | 41 ++++++++++++++++++- .../tests/test_minigraph_case.py | 19 ++++++++- 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 35a6f564568f..e950e7912292 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -44,6 +44,8 @@ FRONTEND_ASIC_SUB_ROLE = 'FrontEnd' BACKEND_ASIC_SUB_ROLE = 'BackEnd' +dualtor_cable_types = ["active-active", "active-standby"] + # Default Virtual Network Index (VNI) vni_default = 8000 @@ -76,6 +78,7 @@ def get_peer_switch_info(link_metadata, devices): return peer_switch_table + def parse_device(device): lo_prefix = None lo_prefix_v6 = None @@ -85,6 +88,7 @@ def parse_device(device): name = None deployment_id = None cluster = None + d_subtype = None for node in device: if node.tag == str(QName(ns, "Address")): @@ -103,11 +107,14 @@ def parse_device(device): d_type = node.text elif node.tag == str(QName(ns, "ClusterName")): cluster = node.text + elif node.tag == str(QName(ns, "SubType")): + d_subtype = node.text if d_type is None and str(QName(ns3, "type")) in device.attrib: d_type = device.attrib[str(QName(ns3, "type"))] - return (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster) + return (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, d_subtype) + def calculate_lcm_for_ecmp (nhdevices_bank_map, nhip_bank_map): banks_enumerated = {} @@ -243,14 +250,16 @@ def parse_png(png, hname, dpg_ecmp_content = None): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): - (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } + (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, d_subtype) = parse_device(device) + device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku} if cluster: device_data['cluster'] = cluster if deployment_id: device_data['deployment_id'] = deployment_id if lo_prefix_v6: device_data['lo_addr_v6'] = lo_prefix_v6 + if d_subtype: + device_data['subtype'] = d_subtype devices[name] = device_data if child.tag == str(QName(ns, "DeviceInterfaceLinks")): @@ -275,10 +284,11 @@ def parse_png(png, hname, dpg_ecmp_content = None): for link in child.findall(str(QName(ns, 'DeviceLinkBase'))): if link.find(str(QName(ns, "ElementType"))).text == "LogicalLink": intf_name = link.find(str(QName(ns, "EndPort"))).text + start_device = link.find(str(QName(ns, "StartDevice"))).text if intf_name in port_alias_map: intf_name = port_alias_map[intf_name] - mux_cable_ports[intf_name] = "true" + mux_cable_ports[intf_name] = start_device if dpg_ecmp_content and (len(dpg_ecmp_content)): for version, content in dpg_ecmp_content.items(): # version is ipv4 or ipv6 @@ -373,7 +383,7 @@ def parse_asic_png(png, asic_name, hostname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): - (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster) = parse_device(device) + (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, _) = parse_device(device) device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } if cluster: device_data['cluster'] = cluster @@ -1475,7 +1485,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw # If connected to a smart cable, get the connection position for port_name, port in ports.items(): if port_name in mux_cable_ports: - port['mux_cable'] = mux_cable_ports[port_name] + port['mux_cable'] = "true" # set port description if parsed from deviceinfo for port_name in port_descriptions: @@ -1720,7 +1730,7 @@ def get_tunnel_entries(tunnel_intfs, lo_intfs, hostname): def get_mux_cable_entries(mux_cable_ports, neighbors, devices): mux_cable_table = {} - for intf in mux_cable_ports: + for intf, cable_name in mux_cable_ports.items(): if intf in neighbors: entry = {} neighbor = neighbors[intf]['name'] @@ -1740,11 +1750,26 @@ def get_mux_cable_entries(mux_cable_ports, neighbors, devices): else: print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor)) + if cable_name in devices: + cable_type = devices[cable_name].get('subtype') + if cable_type is None: + continue + if cable_type in dualtor_cable_types: + mux_cable_table[intf]['cable_type'] = cable_type + if cable_type == 'active-active': + soc_ipv4 = devices[cable_name]['lo_addr'].split('/')[0] + soc_ipv4_prefix = ipaddress.ip_network(UNICODE_TYPE(soc_ipv4)) + mux_cable_table[intf]['soc_ipv4'] = str(soc_ipv4_prefix) + else: + print("Warning: skip parsing device %s for mux cable entry, cable type %s not supported" % (cable_name, cable_type)) + else: + print("Warning: skip parsing device %s for mux cable entry, device definition not found" % cable_name) + return mux_cable_table def parse_device_desc_xml(filename): root = ET.parse(filename).getroot() - (lo_prefix, lo_prefix_v6, mgmt_prefix, hostname, hwsku, d_type, _, _) = parse_device(root) + (lo_prefix, lo_prefix_v6, mgmt_prefix, hostname, hwsku, d_type, _, _, _) = parse_device(root) results = {} results['DEVICE_METADATA'] = {'localhost': { diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case.xml b/src/sonic-config-engine/tests/simple-sample-graph-case.xml index d6a8c394f604..7bbef28aaa38 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case.xml @@ -258,7 +258,7 @@ switch-t0 fortyGigE0/4 true - mux-cable + server1-SC L true @@ -269,7 +269,7 @@ switch-t0 fortyGigE0/8 true - mux-cable + server2-SC U true @@ -317,6 +317,24 @@ Force10-S6000 + + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + server1-SC + smartcable-sku +
Server
@@ -331,6 +349,25 @@ server1 server-sku + + SmartCable + active-active +
+ 10.10.10.3/32 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + server2-SC + smartcable-sku +
Server
diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index a6db6f37c591..d5fe3aad7535 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -226,6 +226,21 @@ def test_minigraph_neighbor_metadata(self): 'lo_addr_v6': 'fe80::0002/128', 'mgmt_addr': '10.0.0.2/32', 'type': 'Server' + }, + 'server1-SC': { + 'hwsku': 'smartcable-sku', + 'lo_addr': '0.0.0.0/0', + 'lo_addr_v6': '::/0', + 'mgmt_addr': '0.0.0.0/0', + 'type': 'SmartCable' + }, + 'server2-SC': { + 'hwsku': 'smartcable-sku', + 'lo_addr': '10.10.10.3/32', + 'lo_addr_v6': '::/0', + 'mgmt_addr': '0.0.0.0/0', + 'type': 'SmartCable', + 'subtype': 'active-active' } } output = self.run_script(argument) @@ -365,7 +380,9 @@ def test_minigraph_mux_cable_table(self): 'Ethernet8': { 'state': 'auto', 'server_ipv4': '10.10.10.2/32', - 'server_ipv6': 'fe80::2/128' + 'server_ipv6': 'fe80::2/128', + 'soc_ipv4': '10.10.10.3/32', + 'cable_type': 'active-active' } } From 0156c21eff95a8feab7e0af0bf0dcf070d8d368b Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Tue, 24 May 2022 18:42:54 +0800 Subject: [PATCH 340/817] [macsec-cli]: Fixing to config MACsec on the port will clear port attributes in config db (#10903) Why I did it There is a bug that the Port attributes in CONFIG_DB will be cleared if using sudo config macsec port add Ethernet0 or sudo config macsec port del Ethernet0 How I did it To fetch the port attributes before set/remove MACsec field in port table. Signed-off-by: Ze Gan --- .../docker-macsec/cli-plugin-tests/conftest.py | 1 + .../cli-plugin-tests/test_config_macsec.py | 4 +++- .../docker-macsec/cli/config/plugins/macsec.py | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dockers/docker-macsec/cli-plugin-tests/conftest.py b/dockers/docker-macsec/cli-plugin-tests/conftest.py index 56dcc3f3023a..e6608ce71265 100644 --- a/dockers/docker-macsec/cli-plugin-tests/conftest.py +++ b/dockers/docker-macsec/cli-plugin-tests/conftest.py @@ -9,6 +9,7 @@ def mock_cfgdb(): CONFIG = { 'PORT': { 'Ethernet0': { + "admin_status": "up" } } } diff --git a/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py index 4635092386ac..425ca2afa433 100644 --- a/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py +++ b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py @@ -116,6 +116,7 @@ def test_macsec_port(self, mock_cfgdb): port_table = db.cfgdb.get_entry("PORT", "Ethernet0") assert port_table assert port_table["macsec"] == "test" + assert port_table["admin_status"] == "up" result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], ["test"], obj=db) assert result.exit_code != 0 @@ -123,7 +124,8 @@ def test_macsec_port(self, mock_cfgdb): result = runner.invoke(macsec.macsec.commands["port"].commands["del"], ["Ethernet0"], obj=db) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) port_table = db.cfgdb.get_entry("PORT", "Ethernet0") - assert not port_table["macsec"] + assert "macsec" not in port_table or not port_table["macsec"] + assert port_table["admin_status"] == "up" def test_macsec_invalid_operation(self, mock_cfgdb): diff --git a/dockers/docker-macsec/cli/config/plugins/macsec.py b/dockers/docker-macsec/cli/config/plugins/macsec.py index e5bc628b8cd0..b76de8c98c7f 100644 --- a/dockers/docker-macsec/cli/config/plugins/macsec.py +++ b/dockers/docker-macsec/cli/config/plugins/macsec.py @@ -42,7 +42,13 @@ def add_port(db, port, profile): if len(profile_entry) == 0: ctx.fail("profile {} doesn't exist".format(profile)) - db.cfgdb.set_entry("PORT", port, {'macsec': profile}) + port_entry = db.cfgdb.get_entry('PORT', port) + if len(port_entry) == 0: + ctx.fail("port {} doesn't exist".format(port)) + + port_entry['macsec'] = profile + + db.cfgdb.set_entry("PORT", port, port_entry) # @@ -64,7 +70,13 @@ def del_port(db, port): if port is None: ctx.fail("cannot find port name for alias {}".format(alias)) - db.cfgdb.set_entry("PORT", port, {'macsec': ""}) + port_entry = db.cfgdb.get_entry('PORT', port) + if len(port_entry) == 0: + ctx.fail("port {} doesn't exist".format(port)) + + del port_entry['macsec'] + + db.cfgdb.set_entry("PORT", port, port_entry) # From a6b1b0a968283f884260b5d2a8143045d2be41ef Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 25 May 2022 05:25:57 +0800 Subject: [PATCH 341/817] [submodule]: Update submodule for sonic-wpa-supplicant (#10904) 64caafe38 [driver_macsec_sonic]: Fixing missing zeros at the beginning of SCI (#52) Signed-off-by: Ze Gan --- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 639a051357d0..64caafe38339 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 639a051357d0e3712c54f7fa975d4ff64733cc38 +Subproject commit 64caafe3833914f4838fa2e2db290ad676ad8dda From 915f2834b0c455277e9a58090b889ba653e1bc88 Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Tue, 24 May 2022 14:36:09 -0700 Subject: [PATCH 342/817] [voq][chassis]fix recirc port admin status (#10769) Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan arlakshm@microsoft.com Why I did it resolves #10761. For VOQ chassis, the Recirc port, which was added for the Everflow, stays admin down after load minigraph. This PR add the fix to make the recirc port as admin up How I did it The PR adds a change in minigraph.py, if port has role as Rec make the the port as admin-status up. How to verify it UT Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 6 +++ src/sonic-config-engine/tests/test_cfggen.py | 42 ++++++++++++----- .../tests/voq-sample-port-config.ini | 45 +++++-------------- 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index e950e7912292..1446457eb513 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1540,6 +1540,12 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if inband_port in ports.keys(): ports[inband_port]['admin_status'] = 'up' + # bring up the recirc port for voq chassis + for port, port_attributes in ports.items(): + port_role = port_attributes.get('role', None) + if port_role == 'Rec': + ports[port]['admin_status'] = 'up' + results['PORT'] = ports results['CONSOLE_PORT'] = console_ports diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 22ce5671ee85..175aefff8da4 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -896,18 +896,36 @@ def test_minigraph_voq_inband_port(self): output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( - output_dict['Ethernet-IB0'], - {'lanes': '133', - 'alias': 'Recycle0', - 'description': 'Recycle0', - 'mtu': '9100', - 'tpid': '0x8100', - 'pfc_asym': 'off', - 'admin_status': 'up', - 'fec': 'rs', - 'speed': '100000' - } - ) + output_dict['Ethernet-IB0'], { + "lanes": "222", + "alias": "Recirc0/1", + "index": "52", + "role": "Inb", + "speed": "400000", + "description": "Recirc0/1", + "mtu": "9100", + "tpid": "0x8100", + "pfc_asym": "off", + "admin_status": "up" + }) + + def test_minigraph_voq_recirc_ports(self): + argument = "-m {} -p {} --var-json PORT".format(self.sample_graph_voq, self.voq_port_config) + output = self.run_script(argument) + output_dict = utils.to_dict(output.strip()) + self.assertDictEqual( + output_dict['Ethernet-Rec0'], { + "lanes": "221", + "alias": "Recirc0/0", + "index": "51", + "role": "Rec", + "speed": "400000", + "description": "Recirc0/0", + "mtu": "9100", + "tpid": "0x8100", + "pfc_asym": "off", + "admin_status": "up" + }) def test_minigraph_dhcp(self): argument = '-m "' + self.sample_graph_simple_case + '" -p "' + self.port_config + '" -v DHCP_RELAY' diff --git a/src/sonic-config-engine/tests/voq-sample-port-config.ini b/src/sonic-config-engine/tests/voq-sample-port-config.ini index 3910e29de0a3..a0ea4e451267 100644 --- a/src/sonic-config-engine/tests/voq-sample-port-config.ini +++ b/src/sonic-config-engine/tests/voq-sample-port-config.ini @@ -1,34 +1,11 @@ -# name lanes alias -Ethernet0 29,30,31,32 fortyGigE0/0 -Ethernet4 25,26,27,28 fortyGigE0/4 -Ethernet8 37,38,39,40 fortyGigE0/8 -Ethernet12 33,34,35,36 fortyGigE0/12 -Ethernet16 41,42,43,44 fortyGigE0/16 -Ethernet20 45,46,47,48 fortyGigE0/20 -Ethernet24 5,6,7,8 fortyGigE0/24 -Ethernet28 1,2,3,4 fortyGigE0/28 -Ethernet32 9,10,11,12 fortyGigE0/32 -Ethernet36 13,14,15,16 fortyGigE0/36 -Ethernet40 21,22,23,24 fortyGigE0/40 -Ethernet44 17,18,19,20 fortyGigE0/44 -Ethernet48 49,50,51,52 fortyGigE0/48 -Ethernet52 53,54,55,56 fortyGigE0/52 -Ethernet56 61,62,63,64 fortyGigE0/56 -Ethernet60 57,58,59,60 fortyGigE0/60 -Ethernet64 65,66,67,68 fortyGigE0/64 -Ethernet68 69,70,71,72 fortyGigE0/68 -Ethernet72 77,78,79,80 fortyGigE0/72 -Ethernet76 73,74,75,76 fortyGigE0/76 -Ethernet80 105,106,107,108 fortyGigE0/80 -Ethernet84 109,110,111,112 fortyGigE0/84 -Ethernet88 117,118,119,120 fortyGigE0/88 -Ethernet92 113,114,115,116 fortyGigE0/92 -Ethernet96 121,122,123,124 fortyGigE0/96 -Ethernet100 125,126,127,128 fortyGigE0/100 -Ethernet104 85,86,87,88 fortyGigE0/104 -Ethernet108 81,82,83,84 fortyGigE0/108 -Ethernet112 89,90,91,92 fortyGigE0/112 -Ethernet116 93,94,95,96 fortyGigE0/116 -Ethernet120 97,98,99,100 fortyGigE0/120 -Ethernet124 101,102,103,104 fortyGigE0/124 -Ethernet-IB0 133 Recycle0 +# name lanes alias index role speed +Ethernet0 6,7 Ethernet1/1 1 Ext 100000 +Ethernet4 2,3 Ethernet2/1 2 Ext 100000 +Ethernet12 0,1 Ethernet4/1 4 Ext 100000 +Ethernet8 4,5 Ethernet3/1 3 Ext 100000 +Ethernet16 14,15 Ethernet5/1 5 Ext 100000 +Ethernet20 10,11 Ethernet6/1 6 Ext 100000 +Ethernet24 12,13 Ethernet7/1 7 Ext 100000 +Ethernet28 8,9 Ethernet8/1 8 Ext 100000 +Ethernet-Rec0 221 Recirc0/0 51 Rec 400000 +Ethernet-IB0 222 Recirc0/1 52 Inb 400000 \ No newline at end of file From 2ead3aaefc1c20ff987faab6133accdff43de122 Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Tue, 24 May 2022 14:37:16 -0700 Subject: [PATCH 343/817] [dhcp6relay] Fix option parsing and add dhcpv6 client messages (#10819) --- .../test_show_dhcp6relay_counters.py | 32 ++++++++++--------- .../cli/show/plugins/show_dhcp_relay.py | 2 +- src/dhcp6relay/src/relay.cpp | 24 ++++++++------ src/dhcp6relay/src/relay.h | 3 ++ 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py b/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py index d818fa9c69a3..3cb2d2bb5443 100644 --- a/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py +++ b/dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py @@ -18,21 +18,23 @@ pass expected_counts = """\ - Message Type Vlan1000 --------------- ----------- - Unknown - Solicit - Advertise - Request - Confirm - Renew - Rebind - Reply - Release - Decline - Relay-Forward - Relay-Reply - Malformed + Message Type Vlan1000 +------------------- ----------- + Unknown + Solicit + Advertise + Request + Confirm + Renew + Rebind + Reply + Release + Decline + Reconfigure +Information-Request + Relay-Forward + Relay-Reply + Malformed """ diff --git a/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py b/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py index 91d5082e8f0c..4178915fe0b2 100644 --- a/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py +++ b/dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py @@ -12,7 +12,7 @@ DHCPv6_COUNTER_TABLE = 'DHCPv6_COUNTER_TABLE' # DHCPv6 Counter Messages -messages = ["Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline", "Relay-Forward", "Relay-Reply", "Malformed"] +messages = ["Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline", "Reconfigure", "Information-Request", "Relay-Forward", "Relay-Reply", "Malformed"] # DHCP_RELAY Config Table DHCP_RELAY = 'DHCP_RELAY' diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index f9c7900c2690..4b3b4d4010bf 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -59,6 +59,8 @@ std::map counterMap = {{DHCPv6_MESSAGE_TYPE_UNKNOWN, "Unknown" {DHCPv6_MESSAGE_TYPE_REPLY, "Reply"}, {DHCPv6_MESSAGE_TYPE_RELEASE, "Release"}, {DHCPv6_MESSAGE_TYPE_DECLINE, "Decline"}, + {DHCPv6_MESSAGE_TYPE_RECONFIGURE, "Reconfigure"}, + {DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST, "Information-Request"}, {DHCPv6_MESSAGE_TYPE_RELAY_FORW, "Relay-Forward"}, {DHCPv6_MESSAGE_TYPE_RELAY_REPL, "Relay-Reply"}, {DHCPv6_MESSAGE_TYPE_MALFORMED, "Malformed"}}; @@ -84,6 +86,8 @@ void initialize_counter(swss::DBConnector *db, std::string counterVlan) { db->hset(counterVlan, "Reply", toString(counters[DHCPv6_MESSAGE_TYPE_REPLY])); db->hset(counterVlan, "Release", toString(counters[DHCPv6_MESSAGE_TYPE_RELEASE])); db->hset(counterVlan, "Decline", toString(counters[DHCPv6_MESSAGE_TYPE_DECLINE])); + db->hset(counterVlan, "Reconfigure", toString(counters[DHCPv6_MESSAGE_TYPE_RECONFIGURE])); + db->hset(counterVlan, "Information-Request", toString(counters[DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST])); db->hset(counterVlan, "Relay-Forward", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_FORW])); db->hset(counterVlan, "Relay-Reply", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_REPL])); db->hset(counterVlan, "Malformed", toString(counters[DHCPv6_MESSAGE_TYPE_MALFORMED])); @@ -204,11 +208,12 @@ const struct dhcpv6_relay_msg *parse_dhcpv6_relay(const uint8_t *buffer) { * @return dhcpv6_option end of dhcpv6 message option */ const struct dhcpv6_option *parse_dhcpv6_opt(const uint8_t *buffer, const uint8_t **out_end) { - uint32_t size = 4; // option-code + option-len - size += ntohs(*(uint16_t *)(buffer + 2)); - (*out_end) = buffer + size; + auto option = (const struct dhcpv6_option *)buffer; + uint8_t size = 4; // option-code + option-len + size += *(uint16_t *)(buffer); + (*out_end) = buffer + size + ntohs(option->option_length); - return (const struct dhcpv6_option *)buffer; + return option; } /** @@ -589,6 +594,7 @@ void relay_relay_forw(int sock, const uint8_t *msg, int32_t len, const ip6_hdr * void callback(evutil_socket_t fd, short event, void *arg) { struct relay_config *config = (struct relay_config *)arg; static uint8_t message_buffer[4096]; + std::string counterVlan = counter_table; int32_t len = recv(config->filter, message_buffer, 4096, 0); if (len <= 0) { syslog(LOG_WARNING, "recv: Failed to receive data at filter socket: %s\n", strerror(errno)); @@ -626,10 +632,6 @@ void callback(evutil_socket_t fd, short event, void *arg) { auto msg = parse_dhcpv6_hdr(current_position); auto option_position = current_position + sizeof(struct dhcpv6_msg); - counters[msg->msg_type]++; - std::string counterVlan = counter_table; - update_counter(config->db, counterVlan.append(config->interface), msg->msg_type); - switch (msg->msg_type) { case DHCPv6_MESSAGE_TYPE_RELAY_FORW: { @@ -638,21 +640,25 @@ void callback(evutil_socket_t fd, short event, void *arg) { } case DHCPv6_MESSAGE_TYPE_SOLICIT: case DHCPv6_MESSAGE_TYPE_REQUEST: + case DHCPv6_MESSAGE_TYPE_CONFIRM: case DHCPv6_MESSAGE_TYPE_RENEW: case DHCPv6_MESSAGE_TYPE_REBIND: case DHCPv6_MESSAGE_TYPE_RELEASE: case DHCPv6_MESSAGE_TYPE_DECLINE: + case DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST: { while (option_position - message_buffer < len) { auto option = parse_dhcpv6_opt(option_position, &tmp); option_position = tmp; - if(ntohs(option->option_code) > DHCPv6_OPTION_LIMIT) { + if (ntohs(option->option_code) > DHCPv6_OPTION_LIMIT) { counters[DHCPv6_MESSAGE_TYPE_MALFORMED]++; update_counter(config->db, counterVlan.append(config->interface), DHCPv6_MESSAGE_TYPE_MALFORMED); syslog(LOG_WARNING, "DHCPv6 option is invalid or contains malformed payload\n"); return; } } + counters[msg->msg_type]++; + update_counter(config->db, counterVlan.append(config->interface), msg->msg_type); relay_client(config->local_sock, current_position, ntohs(udp_header->len) - sizeof(udphdr), ip_header, ether_header, config); break; } diff --git a/src/dhcp6relay/src/relay.h b/src/dhcp6relay/src/relay.h index 29e365bb5d83..c5b07325421c 100644 --- a/src/dhcp6relay/src/relay.h +++ b/src/dhcp6relay/src/relay.h @@ -36,6 +36,8 @@ typedef enum DHCPv6_MESSAGE_TYPE_REPLY = 7, DHCPv6_MESSAGE_TYPE_RELEASE = 8, DHCPv6_MESSAGE_TYPE_DECLINE = 9, + DHCPv6_MESSAGE_TYPE_RECONFIGURE = 10, + DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST = 11, DHCPv6_MESSAGE_TYPE_RELAY_FORW = 12, DHCPv6_MESSAGE_TYPE_RELAY_REPL = 13, DHCPv6_MESSAGE_TYPE_MALFORMED = 14, @@ -60,6 +62,7 @@ struct relay_config { struct dhcpv6_msg { uint8_t msg_type; + uint8_t xid[3]; }; struct PACKED dhcpv6_relay_msg { From a477dbb1751b741ac2762b4328da08b37eb400db Mon Sep 17 00:00:00 2001 From: Hasan Naqvi <56742004+hasan-brcm@users.noreply.github.com> Date: Tue, 24 May 2022 14:47:09 -0700 Subject: [PATCH 344/817] Frr 8.2 upgrade (#10691) Why I did it Upgrade FRR to version 8.2.2. Build libyang2 required by FRR. How I did it Update FRR version and tag. How to verify it Following tests were performed on sonic-vs: BGP docker status check BGP configuration and session establishment Route redistribution and ping Issued show commands to check the bgp neighbor and routes Checked app-db to ensure bgp routes are installed with correct interface and nexthop. Create VRF and check FRR knows the VRF Check VRF routes are installed in app-db with correct Vrf name and next-hop Establish BGP Evpn session and check if Evpn routes (multicast, mac, prefix) are exchanged and installed correctly in app-db. --- .gitmodules | 2 +- rules/docker-fpm-frr.mk | 4 +- rules/frr.mk | 12 +- rules/libyang.mk | 4 +- rules/libyang2.dep | 10 + rules/libyang2.mk | 43 +++ sonic-slave-buster/Dockerfile.j2 | 2 +- src/libyang2/.gitignore | 3 + src/libyang2/Makefile | 40 ++ src/sonic-frr/Makefile | 2 +- ...01-Add-support-of-bgp-tcp-DSCP-value.patch | 47 ++- ...verity-of-Vty-connected-from-message.patch | 16 +- ...003-Use-vrf_id-for-vrf-not-tabled_id.patch | 14 +- ...EXT_HOP-to-be-0.0.0.0-due-to-allevia.patch | 13 +- ...nexthops-compare-vrf-only-if-ip-type.patch | 18 +- ...r-log-outchannel-to-var-log-frr.log.patch} | 8 +- ... 0007-Add-support-of-bgp-l3vni-evpn.patch} | 107 +++--- ...et-for-bgp-ipv6-link-local-neighbors.patch | 29 ++ ...p-bestpath-peer-type-multipath-relax.patch | 346 ------------------ ...et-for-bgp-ipv6-link-local-neighbors.patch | 44 --- .../patch/0010-remove-doc-png-install.patch | 21 -- ...-address-for-Ipv6-linl-local-nexthop.patch | 55 --- ...ble-ipv6-src-address-test-in-pceplib.patch | 27 ++ src/sonic-frr/patch/series | 10 +- 24 files changed, 281 insertions(+), 596 deletions(-) create mode 100644 rules/libyang2.dep create mode 100644 rules/libyang2.mk create mode 100644 src/libyang2/.gitignore create mode 100644 src/libyang2/Makefile rename src/sonic-frr/patch/{0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch => 0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch} (88%) rename src/sonic-frr/patch/{0008-Add-support-of-bgp-l3vni-evpn.patch => 0007-Add-support-of-bgp-l3vni-evpn.patch} (57%) create mode 100644 src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch delete mode 100644 src/sonic-frr/patch/0009-Add-bgp-bestpath-peer-type-multipath-relax.patch delete mode 100644 src/sonic-frr/patch/0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch delete mode 100644 src/sonic-frr/patch/0010-remove-doc-png-install.patch delete mode 100644 src/sonic-frr/patch/0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch create mode 100644 src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch diff --git a/.gitmodules b/.gitmodules index 59cddea4a8f2..3d1a042fb025 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,7 +46,7 @@ [submodule "src/sonic-frr/frr"] path = src/sonic-frr/frr url = https://github.com/Azure/sonic-frr.git - branch = frr/7.5 + branch = frr/8.2 [submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] path = platform/p4/p4-hlir/p4-hlir-v1.1 url = https://github.com/p4lang/p4-hlir.git diff --git a/rules/docker-fpm-frr.mk b/rules/docker-fpm-frr.mk index 2249f828a48c..ff594288419c 100644 --- a/rules/docker-fpm-frr.mk +++ b/rules/docker-fpm-frr.mk @@ -7,10 +7,10 @@ DOCKER_FPM_FRR_DBG = $(DOCKER_FPM_FRR_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_FPM_FRR)_PATH = $(DOCKERS_PATH)/$(DOCKER_FPM_FRR_STEM) $(DOCKER_FPM_FRR)_PYTHON_WHEELS += $(SONIC_BGPCFGD) $(SONIC_FRR_MGMT_FRAMEWORK) -$(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(FRR_SNMP) $(SWSS) $(LIBYANG1) +$(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(FRR_SNMP) $(SWSS) $(LIBYANG2) $(DOCKER_FPM_FRR)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) $(DOCKER_FPM_FRR)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) \ - $(FRR_DBG) $(FRR_SNMP_DBG) $(LIBYANG1_DBG) + $(FRR_DBG) $(FRR_SNMP_DBG) $(LIBYANG2_DBG) $(DOCKER_FPM_FRR)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) diff --git a/rules/frr.mk b/rules/frr.mk index 72cde12ebf75..7bc5cc8024f0 100644 --- a/rules/frr.mk +++ b/rules/frr.mk @@ -1,16 +1,16 @@ # FRRouting (frr) package -FRR_VERSION = 7.5.1 +FRR_VERSION = 8.2.2 FRR_SUBVERSION = 0 -FRR_BRANCH = frr/7.5 -FRR_TAG = frr-7.5.1-s1 +FRR_BRANCH = frr/8.2 +FRR_TAG = frr-8.2.2 export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG FRR = frr_$(FRR_VERSION)-sonic-$(FRR_SUBVERSION)_$(CONFIGURED_ARCH).deb -$(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG1) $(LIBYANG1_DEV) -$(FRR)_RDEPENDS += $(LIBYANG1) -$(FRR)_UNINSTALLS = $(LIBYANG1_DEV) $(LIBYANG1) +$(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG2) $(LIBYANG2_DEV) +$(FRR)_RDEPENDS += $(LIBYANG2) +$(FRR)_UNINSTALLS = $(LIBYANG2_DEV) $(LIBYANG2) $(FRR)_SRC_PATH = $(SRC_PATH)/sonic-frr SONIC_MAKE_DEBS += $(FRR) diff --git a/rules/libyang.mk b/rules/libyang.mk index c8873c3b3231..b361c9796b92 100644 --- a/rules/libyang.mk +++ b/rules/libyang.mk @@ -29,7 +29,7 @@ LIBYANG_PY3 = python3-yang_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb $(LIBYANG_PY3)_DEPENDS += $(LIBYANG) $(LIBYANG_CPP) $(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_PY3))) -$(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1))) -$(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV))) +$(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1),$(LIBYANG2))) +$(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV),$(LIBYANG2_DEV))) export LIBYANG LIBYANG_DBG LIBYANG_DEV LIBYANG_CPP LIBYANG_PY3 diff --git a/rules/libyang2.dep b/rules/libyang2.dep new file mode 100644 index 000000000000..a1b3977f2d86 --- /dev/null +++ b/rules/libyang2.dep @@ -0,0 +1,10 @@ + +SPATH := $($(LIBYANG2)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/libyang2.mk rules/libyang2.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(SPATH)) + +$(LIBYANG2)_CACHE_MODE := GIT_CONTENT_SHA +$(LIBYANG2)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(LIBYANG2)_DEP_FILES := $(DEP_FILES) + diff --git a/rules/libyang2.mk b/rules/libyang2.mk new file mode 100644 index 000000000000..1e181b2a30eb --- /dev/null +++ b/rules/libyang2.mk @@ -0,0 +1,43 @@ +# libyang2 + +LIBYANG2_VERSION_BASE = 2.0 +LIBYANG2_VERSION = $(LIBYANG2_VERSION_BASE).112 +LIBYANG2_SUBVERSION = 6 +LIBYANG2_FULLVERSION = $(LIBYANG2_VERSION)-$(LIBYANG2_SUBVERSION) + +export LIBYANG2_VERSION_BASE +export LIBYANG2_VERSION +export LIBYANG2_SUBVERSION +export LIBYANG2_FULLVERSION + +LIBYANG2 = libyang2_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(LIBYANG2)_SRC_PATH = $(SRC_PATH)/libyang2 +SONIC_MAKE_DEBS += $(LIBYANG2) + +LIBYANG2_DEV = libyang2-dev_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DEV))) + +LIBYANG2_DBG = libyang2-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DBG))) + +LIBYANG2_CPP = libyang2-cpp1_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(LIBYANG2_CPP)_DEPENDS += $(LIBYANG2) +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP))) + +LIBYANG2_CPP_DEV = libyang2-cpp-dev_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DEV))) + +LIBYANG2_CPP_DBG = libyang2-cpp1-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DBG))) + +YANG_TOOLS = yang-tools_$(LIBYANG2_FULLVERSION)_all.deb +$(YANG_TOOLS)_DEPENDS += $(LIBYANG2) +$(eval $(call add_derived_package,$(LIBYANG2),$(YANG_TOOLS))) + +LIBYANG2_TOOLS = libyang2-tools_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS))) + +LIBYANG2_TOOLS_DBG = libyang2-tools-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS_DBG))) + +export LIBYANG2 LIBYANG2_DBG LIBYANG2_DEV LIBYANG2_CPP LIBYANG2_CPP_DEV LIBYANG2_CPP_DBG YANG_TOOLS LIBYANG2_TOOLS LIBYANG2_TOOLS_DBG diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 401f032725cf..2a9b49b82811 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -90,7 +90,7 @@ RUN apt-get update && apt-get install -y \ imagemagick \ ghostscript \ groff \ - libpcre3-dev \ + libpcre2-dev \ gawk \ chrpath \ # For frr build diff --git a/src/libyang2/.gitignore b/src/libyang2/.gitignore new file mode 100644 index 000000000000..a0991ff4402b --- /dev/null +++ b/src/libyang2/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!Makefile diff --git a/src/libyang2/Makefile b/src/libyang2/Makefile new file mode 100644 index 000000000000..621717521972 --- /dev/null +++ b/src/libyang2/Makefile @@ -0,0 +1,40 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +LIBYANG_URL = https://sonicstorage.blob.core.windows.net/debian/pool/main/liby/libyang + +DSC_FILE = libyang2_$(LIBYANG2_FULLVERSION).dsc +ORIG_FILE = libyang2_$(LIBYANG2_VERSION).orig.tar.gz +DEBIAN_FILE = libyang2_$(LIBYANG2_FULLVERSION).debian.tar.xz + +DSC_FILE_URL = $(LIBYANG_URL)/$(DSC_FILE) +ORIG_FILE_URL = $(LIBYANG_URL)/$(ORIG_FILE) +DEBIAN_FILE_URL = $(LIBYANG_URL)/$(DEBIAN_FILE) + +MAIN_TARGET = $(LIBYANG2) +DERIVED_TARGETS = $(LIBYANG2_DEV) $(LIBYANG2_DBG) $(LIBYANG2_TOOLS) $(LIBYANG2_TOOLS_DBG) + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtaining the libyang + rm -fr ./libyang2-$(LIBYANG2_VERSION) + + # download debian libyang + wget -NO "$(DSC_FILE)" $(DSC_FILE_URL) + wget -NO "$(ORIG_FILE)" $(ORIG_FILE_URL) + wget -NO "$(DEBIAN_FILE)" $(DEBIAN_FILE_URL) + dpkg-source -x libyang2_$(LIBYANG2_FULLVERSION).dsc + + pushd libyang2-$(LIBYANG2_VERSION) + #sed -i 's/set(LIBYANG_MAJOR_SOVERSION 1)/set(LIBYANG_MAJOR_SOVERSION 2)/' CMakeLists.txt + #sed -i 's/libyang2/libyang2/' debian/libyang2.install + # Enable large file support for 32-bit arch + echo 'add_definitions(-D_FILE_OFFSET_BITS=64)' >> CMakeLists.txt + + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) + popd + + # Move the newly-built .deb packages to the destination directory + mv $* $(DERIVED_TARGETS) $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/sonic-frr/Makefile b/src/sonic-frr/Makefile index 45f37e52781e..a2e2c12885db 100644 --- a/src/sonic-frr/Makefile +++ b/src/sonic-frr/Makefile @@ -13,7 +13,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git checkout -b $(FRR_BRANCH) origin/$(FRR_BRANCH) || git checkout $(FRR_BRANCH) stg branch --create $(STG_BRANCH) $(FRR_TAG) stg import -s ../patch/series - tools/tarsource.sh -V -e '-sonic' + gbp dch --ignore-branch --new-version=$(FRR_VERSION)-sonic-$(FRR_SUBVERSION) --dch-opt="--force-bad-version" --commit --git-author dpkg-buildpackage -rfakeroot -b -us -uc -Ppkg.frr.nortrlib -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) stg undo || true git clean -xfdf diff --git a/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch b/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch index 5f4ce04d3ff5..ba5668394385 100644 --- a/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch +++ b/src/sonic-frr/patch/0001-Add-support-of-bgp-tcp-DSCP-value.patch @@ -1,20 +1,20 @@ -From 71415ae851357025a99b8ead7edf5755a55b6fbb Mon Sep 17 00:00:00 2001 +From 4ab192df23362e64d1a11441fae82329388f103e Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:00:12 -0800 -Subject: [PATCH 1/5] Add support of bgp tcp DSCP value +Subject: [PATCH 1/8] Add support of bgp tcp DSCP value --- bgpd/bgp_network.c | 11 ++++------- bgpd/bgp_vty.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ - bgpd/bgpd.c | 2 +- + bgpd/bgpd.c | 1 + bgpd/bgpd.h | 3 +++ - 4 files changed, 52 insertions(+), 8 deletions(-) + 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c -index cae11ae7b..f1d96664d 100644 +index 3fb7619ed..70c771683 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c -@@ -721,11 +721,9 @@ int bgp_connect(struct peer *peer) +@@ -743,11 +743,9 @@ int bgp_connect(struct peer *peer) #ifdef IPTOS_PREC_INTERNETCONTROL frr_with_privs(&bgpd_privs) { if (sockunion_family(&peer->su) == AF_INET) @@ -28,7 +28,7 @@ index cae11ae7b..f1d96664d 100644 } #endif -@@ -801,10 +799,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen, +@@ -824,10 +822,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen, #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) @@ -42,10 +42,10 @@ index cae11ae7b..f1d96664d 100644 sockopt_v6only(sa->sa_family, sock); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c -index bb2f89f9e..33662b08e 100644 +index 4df2abef8..950d1d25c 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c -@@ -1330,6 +1330,42 @@ DEFUN (no_router_bgp, +@@ -1558,6 +1558,42 @@ DEFUN (no_router_bgp, return CMD_SUCCESS; } @@ -88,7 +88,7 @@ index bb2f89f9e..33662b08e 100644 /* BGP router-id. */ -@@ -15549,6 +15585,10 @@ int bgp_config_write(struct vty *vty) +@@ -17053,6 +17089,10 @@ int bgp_config_write(struct vty *vty) if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) vty_out(vty, " no bgp fast-external-failover\n"); @@ -97,9 +97,9 @@ index bb2f89f9e..33662b08e 100644 + vty_out(vty, " bgp session-dscp %02X\n", bgp->tcp_dscp >> 2); + /* BGP router ID. */ - if (bgp->router_id_static.s_addr != 0) - vty_out(vty, " bgp router-id %s\n", -@@ -16057,6 +16097,10 @@ void bgp_vty_init(void) + if (bgp->router_id_static.s_addr != INADDR_ANY) + vty_out(vty, " bgp router-id %pI4\n", +@@ -17662,6 +17702,10 @@ void bgp_vty_init(void) /* "no router bgp" commands. */ install_element(CONFIG_NODE, &no_router_bgp_cmd); @@ -111,32 +111,31 @@ index bb2f89f9e..33662b08e 100644 install_element(BGP_NODE, &bgp_router_id_cmd); install_element(BGP_NODE, &no_bgp_router_id_cmd); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c -index cf9ff038d..0e8579843 100644 +index 7e528b219..005523544 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c -@@ -3069,7 +3069,7 @@ static struct bgp *bgp_create(as_t *as, const char *name, - +@@ -3229,6 +3229,7 @@ static struct bgp *bgp_create(as_t *as, const char *name, bgp->evpn_info = XCALLOC(MTYPE_BGP_EVPN_INFO, sizeof(struct bgp_evpn_info)); -- + + bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL; bgp_evpn_init(bgp); + bgp_evpn_vrf_es_init(bgp); bgp_pbr_init(bgp); - diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h -index 2aa069002..914f296e5 100644 +index 8b93c450e..e780d8a03 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h -@@ -678,6 +678,9 @@ struct bgp { +@@ -743,6 +743,9 @@ struct bgp { /* Weighted ECMP related config. */ enum bgp_link_bw_handling lb_handling; + /* dscp value for tcp sessions */ + uint8_t tcp_dscp; + - QOBJ_FIELDS - }; - DECLARE_QOBJ_TYPE(bgp) + /* Process Queue for handling routes */ + struct work_queue *process_queue; + -- -2.29.2.windows.2 +2.12.2 diff --git a/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch b/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch index 5e4daafae2d0..764d38463289 100644 --- a/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch +++ b/src/sonic-frr/patch/0002-Reduce-severity-of-Vty-connected-from-message.patch @@ -1,25 +1,25 @@ -From a81d37fc1558c33426a4fb59ff25c6d73a20f210 Mon Sep 17 00:00:00 2001 +From 15274a197e4d3b7ac0f11ca63a5274f1168739f5 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:11:47 -0800 -Subject: [PATCH 2/5] Reduce severity of 'Vty connected from' message +Subject: [PATCH 2/8] Reduce severity of 'Vty connected from' message --- lib/vty.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vty.c b/lib/vty.c -index 077c6f621..3204948b8 100644 +index 8eaf13619..7edeb5538 100644 --- a/lib/vty.c +++ b/lib/vty.c -@@ -1859,7 +1859,7 @@ static int vty_accept(struct thread *thread) +@@ -1814,7 +1814,7 @@ static int vty_accept(struct thread *thread) zlog_info("can't set sockopt to vty_sock : %s", safe_strerror(errno)); -- zlog_info("Vty connection from %s", -+ zlog_debug("Vty connection from %s", - sockunion2str(&su, buf, SU_ADDRSTRLEN)); +- zlog_info("Vty connection from %pSU", &su); ++ zlog_debug("Vty connection from %pSU", &su); vty_create(vty_sock, &su); + -- -2.29.2.windows.2 +2.12.2 diff --git a/src/sonic-frr/patch/0003-Use-vrf_id-for-vrf-not-tabled_id.patch b/src/sonic-frr/patch/0003-Use-vrf_id-for-vrf-not-tabled_id.patch index cefeca769c6d..f815cf38455e 100644 --- a/src/sonic-frr/patch/0003-Use-vrf_id-for-vrf-not-tabled_id.patch +++ b/src/sonic-frr/patch/0003-Use-vrf_id-for-vrf-not-tabled_id.patch @@ -1,25 +1,25 @@ -From ecc9aa458a34f49744a2b90d3a7ebcce951a8478 Mon Sep 17 00:00:00 2001 +From 39bb40dc4bad4462e4ae9c98580d75fa2c92e032 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:29:46 -0800 -Subject: [PATCH 3/5] Use vrf_id for vrf, not tabled_id +Subject: [PATCH 3/8] Use vrf_id for vrf, not tabled_id --- zebra/zebra_fpm_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c -index 2c0741363..0ab92398f 100644 +index ec22c5dd4..aad0156b3 100644 --- a/zebra/zebra_fpm_netlink.c +++ b/zebra/zebra_fpm_netlink.c -@@ -286,7 +286,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd, - ri->af = rib_dest_af(dest); +@@ -287,7 +287,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd, + ri->nlmsg_pid = zvrf->zns->netlink_dplane_out.snl.nl_pid; ri->nlmsg_type = cmd; -- ri->rtm_table = rib_table_info(rib_dest_table(dest))->table_id; +- ri->rtm_table = table_info->table_id; + ri->rtm_table = zvrf_id(rib_dest_vrf(dest)); ri->rtm_protocol = RTPROT_UNSPEC; /* -- -2.29.2.windows.2 +2.12.2 diff --git a/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch b/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch index df92c8d65738..9d2f08efb191 100644 --- a/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch +++ b/src/sonic-frr/patch/0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch @@ -1,17 +1,18 @@ -From 70739436fc8ab4d5e507a0185fbc58eca298f7eb Mon Sep 17 00:00:00 2001 +From afff474c79e0c177e090d1b45d68c9f816a52e3e Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:33:46 -0800 -Subject: [PATCH 4/5] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to alleviate -the vendor bug +Subject: [PATCH 4/8] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to + alleviate + --- bgpd/bgp_route.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 1c646c03e..df2aa1b4c 100644 +index b297ca006..d4b5066c6 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c -@@ -3354,8 +3354,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, +@@ -3625,8 +3625,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi, /* If NEXT_HOP is present, validate it. */ if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) { @@ -22,5 +23,5 @@ index 1c646c03e..df2aa1b4c 100644 return true; } -- -2.29.2.windows.2 +2.12.2 diff --git a/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch b/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch index 1ca955d175d5..2db1105622eb 100644 --- a/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch +++ b/src/sonic-frr/patch/0005-nexthops-compare-vrf-only-if-ip-type.patch @@ -1,7 +1,7 @@ -From dd66532a0e73b0c3ae6375e795b3b47f16196d09 Mon Sep 17 00:00:00 2001 +From 786087468520db44c55e3566f77438b41f52763f Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 16 Nov 2020 18:35:01 -0800 -Subject: [PATCH 5/5] nexthops compare vrf only if ip type +Subject: [PATCH 5/8] nexthops compare vrf only if ip type --- lib/nexthop.c | 12 ++++++------ @@ -9,10 +9,10 @@ Subject: [PATCH 5/5] nexthops compare vrf only if ip type 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/nexthop.c b/lib/nexthop.c -index 0ea72d03e..50552df60 100644 +index e17eeb830..a1ce22e3b 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c -@@ -105,12 +105,6 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1, +@@ -140,12 +140,6 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1, { int ret = 0; @@ -25,7 +25,7 @@ index 0ea72d03e..50552df60 100644 if (next1->type < next2->type) return -1; -@@ -126,6 +120,12 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1, +@@ -161,6 +155,12 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1, switch (next1->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV6: @@ -39,10 +39,10 @@ index 0ea72d03e..50552df60 100644 if (ret != 0) return ret; diff --git a/lib/zclient.c b/lib/zclient.c -index fb48d4a12..39132465f 100644 +index 445837017..c104623b7 100644 --- a/lib/zclient.c +++ b/lib/zclient.c -@@ -822,12 +822,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, +@@ -864,12 +864,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, { int ret = 0; @@ -55,7 +55,7 @@ index fb48d4a12..39132465f 100644 if (next1->type < next2->type) return -1; -@@ -843,6 +837,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, +@@ -885,6 +879,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1, switch (next1->type) { case NEXTHOP_TYPE_IPV4: case NEXTHOP_TYPE_IPV6: @@ -69,5 +69,5 @@ index fb48d4a12..39132465f 100644 &next2->gate); if (ret != 0) -- -2.29.2.windows.2 +2.12.2 diff --git a/src/sonic-frr/patch/0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch b/src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch similarity index 88% rename from src/sonic-frr/patch/0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch rename to src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch index de5064885191..6d3db6d518e9 100644 --- a/src/sonic-frr/patch/0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch +++ b/src/sonic-frr/patch/0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch @@ -1,14 +1,12 @@ -From 31464e3fd0f677bc15286e99d4a30e2e33480c53 Mon Sep 17 00:00:00 2001 +From 0417036a3aece862c95111d4646ca7508a028165 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 25 Nov 2020 22:28:43 +0000 -Subject: [PATCH] [frr] remove frr log outchannel to /var/log/frr.log - +Subject: [PATCH] [PATCH 6/8] [frr] remove frr log outchannel to /var/log/frr.log SONiC runs frr inside a docker and the logs are sent to base image via rsyslog and recorded already. There is no need to keep the frr.log inside the docker. It will grow and take all harddrive space eventually. -Signed-off-by: Ying Xie --- tools/etc/rsyslog.d/45-frr.conf | 19 ------------------- 1 file changed, 19 deletions(-) @@ -44,5 +42,5 @@ index feeeb13f1..fcd23d23a 100644 $programname == 'bgpd' or $programname == 'eigrpd' or -- -2.17.1 +2.12.2 diff --git a/src/sonic-frr/patch/0008-Add-support-of-bgp-l3vni-evpn.patch b/src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch similarity index 57% rename from src/sonic-frr/patch/0008-Add-support-of-bgp-l3vni-evpn.patch rename to src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch index 8a32e77a825e..5097ad513ef0 100644 --- a/src/sonic-frr/patch/0008-Add-support-of-bgp-l3vni-evpn.patch +++ b/src/sonic-frr/patch/0007-Add-support-of-bgp-l3vni-evpn.patch @@ -1,34 +1,36 @@ -From 2e9ed539d29f13d874c6a5ab3120bf4bb26ab2bb Mon Sep 17 00:00:00 2001 +From 74ee34e4990dbd168b7b8072894eb0cf8927f9d1 Mon Sep 17 00:00:00 2001 From: Kishore Kunal Date: Fri, 15 Jan 2021 15:52:13 -0800 -Subject: [PATCH] This is temp patch till Prefix to ARP indirection is add in neighorch +Subject: [PATCH 7/8] This is temp patch till Prefix to ARP indirection is + add in neighorch --- - lib/nexthop.c | 1 + - lib/nexthop.h | 7 ++++++- + lib/nexthop.c | 2 ++ + lib/nexthop.h | 6 ++++++ zebra/rt_netlink.c | 2 +- - zebra/zapi_msg.c | 2 ++ - zebra/zebra_dplane.c | 2 +- - zebra/zebra_fpm_netlink.c | 19 +++++++++++++++++++ - 6 files changed, 30 insertions(+), 3 deletions(-) + zebra/zapi_msg.c | 4 ++++ + zebra/zebra_dplane.c | 1 + + zebra/zebra_fpm_netlink.c | 20 ++++++++++++++++++++ + 6 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/nexthop.c b/lib/nexthop.c -index 0ea72d03e..02e826048 100644 +index a1ce22e3b..6f3fe2a5f 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c -@@ -657,6 +657,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy, +@@ -813,6 +813,8 @@ void nexthop_copy_no_recurse(struct nexthop *copy, + memcpy(©->src, &nexthop->src, sizeof(nexthop->src)); + memcpy(©->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src)); + copy->rparent = rparent; ++ memcpy(©->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN); ++ + if (nexthop->nh_label) nexthop_add_labels(copy, nexthop->nh_label_type, nexthop->nh_label->num_labels, - &nexthop->nh_label->label[0]); -+ memcpy(©->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN); - } - - void nexthop_copy(struct nexthop *copy, const struct nexthop *nexthop, diff --git a/lib/nexthop.h b/lib/nexthop.h -index cadcea1f4..fd959eb9e 100644 +index 320b46315..0f98dc3c2 100644 --- a/lib/nexthop.h +++ b/lib/nexthop.h -@@ -71,6 +71,11 @@ enum nh_encap_type { +@@ -66,6 +66,11 @@ enum nh_encap_type { /* Backup index value is limited */ #define NEXTHOP_BACKUP_IDX_MAX 255 @@ -40,20 +42,19 @@ index cadcea1f4..fd959eb9e 100644 /* Nexthop structure. */ struct nexthop { struct nexthop *next; -@@ -140,7 +145,7 @@ struct nexthop { - /* Encapsulation information. */ +@@ -136,6 +141,7 @@ struct nexthop { enum nh_encap_type nh_encap_type; union { -- vni_t vni; + vni_t vni; + struct vxlan_nh_encap encap_data; } nh_encap; /* SR-TE color used for matching SR-TE policies */ diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c -index 50b1a62d8..d8249f8e0 100644 +index 24c01b7f5..5e0f4cd8f 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c -@@ -1590,7 +1590,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, +@@ -1856,7 +1856,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, return false; if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */, @@ -63,43 +64,44 @@ index 50b1a62d8..d8249f8e0 100644 nl_attr_nest_end(n, nest); break; diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c -index e436e5a28..c10d50797 100644 +index 5cf7d815d..529cbb44b 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c -@@ -1477,6 +1477,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re, - zebra_vxlan_evpn_vrf_route_add( - api_nh->vrf_id, &api_nh->rmac, - &vtep_ip, &api->prefix); -+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN); +@@ -1577,6 +1577,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, + vtep_ip.ipa_type = IPADDR_V4; + memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4), + sizeof(struct in_addr)); ++ memcpy(&(nexthop->nh_encap.encap_data.rmac), ++ &api_nh->rmac, ETH_ALEN); + zebra_rib_queue_evpn_route_add( + api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p); } - break; - case NEXTHOP_TYPE_IPV6: -@@ -1511,6 +1512,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re, - zebra_vxlan_evpn_vrf_route_add( - api_nh->vrf_id, &api_nh->rmac, - &vtep_ip, &api->prefix); -+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN); +@@ -1610,6 +1612,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh, + vtep_ip.ipa_type = IPADDR_V6; + memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6), + sizeof(struct in6_addr)); ++ memcpy(&(nexthop->nh_encap.encap_data.rmac), ++ &api_nh->rmac, ETH_ALEN); + zebra_rib_queue_evpn_route_add( + api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p); } - break; - case NEXTHOP_TYPE_BLACKHOLE: diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c -index abd0adb64..e66d7aae5 100644 +index 656ebcf3b..8d125d77e 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c -@@ -1891,7 +1891,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, - zl3vni = zl3vni_from_vrf(nexthop->vrf_id); +@@ -2421,6 +2421,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, if (zl3vni && is_l3vni_oper_up(zl3vni)) { nexthop->nh_encap_type = NET_VXLAN; -- nexthop->nh_encap.vni = zl3vni->vni; + nexthop->nh_encap.vni = zl3vni->vni; + nexthop->nh_encap.encap_data.vni = zl3vni->vni; } } diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c -index 2c0741363..2731f64fb 100644 +index aad0156b3..34be9fb39 100644 --- a/zebra/zebra_fpm_netlink.c +++ b/zebra/zebra_fpm_netlink.c -@@ -129,10 +129,12 @@ static const char *fpm_nh_encap_type_to_str(enum fpm_nh_encap_type_t encap_type) +@@ -95,10 +95,12 @@ static const char *fpm_nh_encap_type_to_str(enum fpm_nh_encap_type_t encap_type) struct vxlan_encap_info_t { vni_t vni; @@ -112,16 +114,17 @@ index 2c0741363..2731f64fb 100644 }; struct fpm_nh_encap_info_t { -@@ -238,6 +240,8 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri, - - /* Add VNI to VxLAN encap info */ - nhi.encap_info.vxlan_encap.vni = zl3vni->vni; -+ memcpy(&nhi.encap_info.vxlan_encap.rmac, &(nexthop->nh_encap.encap_data.rmac), -+ ETH_ALEN); +@@ -234,6 +236,9 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri, } + + nhi.encap_info.vxlan_encap.vni = vni; ++ memcpy(&nhi.encap_info.vxlan_encap.rmac, ++ &(nexthop->nh_encap.encap_data.rmac), ++ ETH_ALEN); } -@@ -454,9 +458,16 @@ static int netlink_route_info_encode(struct netlink_route_info *ri, + /* +@@ -456,9 +461,16 @@ static int netlink_route_info_encode(struct netlink_route_info *ri, nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE, encap); vxlan = &nhi->encap_info.vxlan_encap; @@ -138,7 +141,7 @@ index 2c0741363..2731f64fb 100644 nl_attr_nest_end(&req->n, nest); break; } -@@ -490,10 +501,18 @@ static int netlink_route_info_encode(struct netlink_route_info *ri, +@@ -494,10 +506,18 @@ static int netlink_route_info_encode(struct netlink_route_info *ri, nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE, encap); vxlan = &nhi->encap_info.vxlan_encap; @@ -158,5 +161,5 @@ index 2c0741363..2731f64fb 100644 break; } -- -2.18.0 +2.12.2 diff --git a/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch b/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch new file mode 100644 index 000000000000..c2ff17dab88c --- /dev/null +++ b/src/sonic-frr/patch/0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch @@ -0,0 +1,29 @@ +From 92ab2d74fca06f86c00d886ac249f7f2d89e93fe Mon Sep 17 00:00:00 2001 +From: Akhilesh Samineni +Date: Mon, 5 Apr 2021 13:21:40 -0700 +Subject: [PATCH 8/8] Link local scope was not set while binding socket + with local address causing socket errors for bgp ipv6 link local neighbors. + +--- + bgpd/bgp_network.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c +index 70c771683..dbc9870a5 100644 +--- a/bgpd/bgp_network.c ++++ b/bgpd/bgp_network.c +@@ -662,6 +662,11 @@ static int bgp_update_address(struct interface *ifp, const union sockunion *dst, + return 1; + + prefix2sockunion(sel, addr); ++ ++ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) { ++ addr->sin6.sin6_scope_id = ifp->ifindex; ++ } ++ + return 0; + } + +-- +2.12.2 + diff --git a/src/sonic-frr/patch/0009-Add-bgp-bestpath-peer-type-multipath-relax.patch b/src/sonic-frr/patch/0009-Add-bgp-bestpath-peer-type-multipath-relax.patch deleted file mode 100644 index 0e9af83aa864..000000000000 --- a/src/sonic-frr/patch/0009-Add-bgp-bestpath-peer-type-multipath-relax.patch +++ /dev/null @@ -1,346 +0,0 @@ -From a70c630a504e041da1c2441337b2d47e8fdd3d30 Mon Sep 17 00:00:00 2001 -From: Joanne Mikkelson -Date: Mon, 29 Jun 2020 13:31:49 -0700 -Subject: [PATCH] Add "bgp bestpath peer-type multipath-relax" - -This new BGP configuration is akin to "bgp bestpath aspath -multipath-relax". When applied, paths learned from different peer types -will be eligible to be considered for multipath (ECMP). Paths from all -of eBGP, iBGP, and confederation peers may be included in multipaths -if they are otherwise equal cost. - -This change preserves the existing bestpath behavior of step 10's result -being returned, not the result from steps 8 and 9, in the case where -both 8+9 and 10 determine a winner. - -When "bgp bestpath peer-type multipath-relax" is enabled, multipaths -with both eBGP and iBGP learned routes may exist. It is not desirable -for the iBGP next hops to be discarded from the FIB because they are not -directly connected. When publishing a nexthop group to zebra, the -ZEBRA_FLAG_ALLOW_RECURSION flag is normally not set when the best path -is eBGP; when "bgp bestpath aspath multipath-relax" is configured, the -flag will now be set if any paths are from iBGP peers. This leaves -all-eBGP multipaths still requiring nexthops over connected routes. ---- - bgpd/bgp_route.c | 76 ++++++++++++++++++++++++++++++++++-------------- - bgpd/bgp_vty.c | 43 +++++++++++++++++++++++++++ - bgpd/bgp_zebra.c | 15 +++++++++- - bgpd/bgpd.h | 1 + - doc/user/bgp.rst | 7 +++++ - 5 files changed, 119 insertions(+), 23 deletions(-) - -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 1c646c03e..73dbf3c5f 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -540,6 +540,8 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - int internal_as_route; - int confed_as_route; - int ret = 0; -+ int igp_metric_ret = 0; -+ int peer_sort_ret = -1; - char new_buf[PATH_ADDPATH_STR_BUFFER]; - char exist_buf[PATH_ADDPATH_STR_BUFFER]; - uint32_t new_mm_seq; -@@ -940,7 +942,9 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - zlog_debug( - "%s: %s wins over %s due to eBGP peer > iBGP peer", - pfx_buf, new_buf, exist_buf); -- return 1; -+ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ return 1; -+ peer_sort_ret = 1; - } - - if (exist_sort == BGP_PEER_EBGP -@@ -950,7 +954,9 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - zlog_debug( - "%s: %s loses to %s due to iBGP peer < eBGP peer", - pfx_buf, new_buf, exist_buf); -- return 0; -+ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ return 0; -+ peer_sort_ret = 0; - } - - /* 8. IGP metric check. */ -@@ -962,19 +968,19 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - existm = exist->extra->igpmetric; - - if (newm < existm) { -- if (debug) -+ if (debug && peer_sort_ret < 0) - zlog_debug( - "%s: %s wins over %s due to IGP metric %d < %d", - pfx_buf, new_buf, exist_buf, newm, existm); -- ret = 1; -+ igp_metric_ret = 1; - } - - if (newm > existm) { -- if (debug) -+ if (debug && peer_sort_ret < 0) - zlog_debug( - "%s: %s loses to %s due to IGP metric %d > %d", - pfx_buf, new_buf, exist_buf, newm, existm); -- ret = 0; -+ igp_metric_ret = 0; - } - - /* 9. Same IGP metric. Compare the cluster list length as -@@ -992,21 +998,21 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - existm = BGP_CLUSTER_LIST_LENGTH(exist->attr); - - if (newm < existm) { -- if (debug) -+ if (debug && peer_sort_ret < 0) - zlog_debug( - "%s: %s wins over %s due to CLUSTER_LIST length %d < %d", - pfx_buf, new_buf, exist_buf, - newm, existm); -- ret = 1; -+ igp_metric_ret = 1; - } - - if (newm > existm) { -- if (debug) -+ if (debug && peer_sort_ret < 0) - zlog_debug( - "%s: %s loses to %s due to CLUSTER_LIST length %d > %d", - pfx_buf, new_buf, exist_buf, - newm, existm); -- ret = 0; -+ igp_metric_ret = 0; - } - } - } -@@ -1020,7 +1026,10 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - zlog_debug( - "%s: %s wins over %s due to confed-external peer > confed-internal peer", - pfx_buf, new_buf, exist_buf); -- return 1; -+ if (!CHECK_FLAG(bgp->flags, -+ BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ return 1; -+ peer_sort_ret = 1; - } - - if (exist_sort == BGP_PEER_CONFED -@@ -1030,7 +1039,10 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - zlog_debug( - "%s: %s loses to %s due to confed-internal peer < confed-external peer", - pfx_buf, new_buf, exist_buf); -- return 0; -+ if (!CHECK_FLAG(bgp->flags, -+ BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ return 0; -+ peer_sort_ret = 0; - } - } - -@@ -1091,20 +1103,40 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, - * TODO: If unequal cost ibgp multipath is enabled we can - * mark the paths as equal here instead of returning - */ -- if (debug) { -- if (ret == 1) -- zlog_debug( -- "%s: %s wins over %s after IGP metric comparison", -- pfx_buf, new_buf, exist_buf); -- else -- zlog_debug( -- "%s: %s loses to %s after IGP metric comparison", -- pfx_buf, new_buf, exist_buf); -+ -+ /* Prior to the addition of BGP_FLAG_PEERTYPE_MULTIPATH_RELAX, -+ * if either step 7 or 10 (peer type checks) yielded a winner, -+ * that result was returned immediately. Returning from step 10 -+ * ignored the return value computed in steps 8 and 9 (IGP -+ * metric checks). In order to preserve that behavior, if -+ * peer_sort_ret is set, return that rather than igp_metric_ret. -+ */ -+ ret = peer_sort_ret; -+ if (peer_sort_ret < 0) { -+ ret = igp_metric_ret; -+ if (debug) { -+ if (ret == 1) -+ zlog_debug( -+ "%s: %s wins over %s after IGP metric comparison", -+ pfx_buf, new_buf, exist_buf); -+ else -+ zlog_debug( -+ "%s: %s loses to %s after IGP metric comparison", -+ pfx_buf, new_buf, exist_buf); -+ } -+ *reason = bgp_path_selection_igp_metric; - } -- *reason = bgp_path_selection_igp_metric; - return ret; - } - -+ /* -+ * At this point, the decision whether to set *paths_eq = 1 has been -+ * completed. If we deferred returning because of bestpath peer-type -+ * relax configuration, return now. -+ */ -+ if (peer_sort_ret >= 0) -+ return peer_sort_ret; -+ - /* 12. If both paths are external, prefer the path that was received - first (the oldest one). This step minimizes route-flap, since a - newer path won't displace an older one, even if it was the -diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c -index bb2f89f9e..4d1ce5a46 100644 ---- a/bgpd/bgp_vty.c -+++ b/bgpd/bgp_vty.c -@@ -3009,6 +3009,37 @@ DEFUN (no_bgp_bestpath_aspath_multipath_relax, - return CMD_SUCCESS; - } - -+/* "bgp bestpath peer-type multipath-relax" configuration. */ -+DEFUN(bgp_bestpath_peer_type_multipath_relax, -+ bgp_bestpath_peer_type_multipath_relax_cmd, -+ "bgp bestpath peer-type multipath-relax", -+ BGP_STR -+ "Change the default bestpath selection\n" -+ "Peer type\n" -+ "Allow load sharing across routes learned from different peer types\n") -+{ -+ VTY_DECLVAR_CONTEXT(bgp, bgp); -+ SET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX); -+ bgp_recalculate_all_bestpaths(bgp); -+ -+ return CMD_SUCCESS; -+} -+ -+DEFUN(no_bgp_bestpath_peer_type_multipath_relax, -+ no_bgp_bestpath_peer_type_multipath_relax_cmd, -+ "no bgp bestpath peer-type multipath-relax", -+ NO_STR BGP_STR -+ "Change the default bestpath selection\n" -+ "Peer type\n" -+ "Allow load sharing across routes learned from different peer types\n") -+{ -+ VTY_DECLVAR_CONTEXT(bgp, bgp); -+ UNSET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX); -+ bgp_recalculate_all_bestpaths(bgp); -+ -+ return CMD_SUCCESS; -+} -+ - /* "bgp log-neighbor-changes" configuration. */ - DEFUN (bgp_log_neighbor_changes, - bgp_log_neighbor_changes_cmd, -@@ -8999,6 +9030,9 @@ static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json) - } else - json_object_string_add(bestpath, "multiPathRelax", "false"); - -+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ json_object_boolean_true_add(bestpath, "peerTypeRelax"); -+ - if (CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID)) - json_object_string_add(bestpath, "compareRouterId", "true"); - if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED) -@@ -15750,6 +15784,10 @@ int bgp_config_write(struct vty *vty) - vty_out(vty, "\n"); - } - -+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)) -+ vty_out(vty, -+ " bgp bestpath peer-type multipath-relax\n"); -+ - /* Link bandwidth handling. */ - if (bgp->lb_handling == BGP_LINK_BW_IGNORE_BW) - vty_out(vty, " bgp bestpath bandwidth ignore\n"); -@@ -16214,6 +16252,11 @@ void bgp_vty_init(void) - install_element(BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd); - install_element(BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd); - -+ /* "bgp bestpath peer-type multipath-relax" commands */ -+ install_element(BGP_NODE, &bgp_bestpath_peer_type_multipath_relax_cmd); -+ install_element(BGP_NODE, -+ &no_bgp_bestpath_peer_type_multipath_relax_cmd); -+ - /* "bgp log-neighbor-changes" commands */ - install_element(BGP_NODE, &bgp_log_neighbor_changes_cmd); - install_element(BGP_NODE, &no_bgp_log_neighbor_changes_cmd); -diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c -index b20323852..4f7cfeaa2 100644 ---- a/bgpd/bgp_zebra.c -+++ b/bgpd/bgp_zebra.c -@@ -1184,6 +1184,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, - int nh_family; - unsigned int valid_nh_count = 0; - int has_valid_label = 0; -+ bool allow_recursion = false; - uint8_t distance; - struct peer *peer; - struct bgp_path_info *mpinfo; -@@ -1259,7 +1260,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, - || CHECK_FLAG(peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK) - || CHECK_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK)) - -- SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION); -+ allow_recursion = true; - - if (info->attr->rmap_table_id) { - SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID); -@@ -1397,6 +1398,15 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, - if (!nh_updated) - continue; - -+ /* Allow recursion if it is a multipath group with both -+ * eBGP and iBGP paths. -+ */ -+ if (!allow_recursion -+ && CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX) -+ && (mpinfo->peer->sort == BGP_PEER_IBGP -+ || mpinfo->peer->sort == BGP_PEER_CONFED)) -+ allow_recursion = true; -+ - if (mpinfo->extra - && bgp_is_valid_label(&mpinfo->extra->label[0]) - && !CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE)) { -@@ -1415,6 +1425,9 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p, - valid_nh_count++; - } - -+ if (allow_recursion) -+ SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION); -+ - /* - * When we create an aggregate route we must also - * install a Null0 route in the RIB, so overwrite -diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h -index 2aa069002..e268d5b1e 100644 ---- a/bgpd/bgpd.h -+++ b/bgpd/bgpd.h -@@ -456,6 +456,7 @@ struct bgp { - #define BGP_FLAG_GR_DISABLE_EOR (1 << 24) - #define BGP_FLAG_EBGP_REQUIRES_POLICY (1 << 25) - #define BGP_FLAG_SHOW_NEXTHOP_HOSTNAME (1 << 26) -+#define BGP_FLAG_PEERTYPE_MULTIPATH_RELAX (1 << 31) - - /* This flag is set if the instance is in administrative shutdown */ - #define BGP_FLAG_SHUTDOWN (1 << 27) -diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst -index b58030212..e248ffceb 100644 ---- a/doc/user/bgp.rst -+++ b/doc/user/bgp.rst -@@ -386,6 +386,13 @@ Route Selection - other measures were taken to avoid these. The exact behaviour will be - sensitive to the iBGP and reflection topology. - -+.. clicmd:: bgp bestpath peer-type multipath-relax -+ -+ This command specifies that BGP decision process should consider paths -+ from all peers for multipath computation. If this option is enabled, -+ paths learned from any of eBGP, iBGP, or confederation neighbors will -+ be multipath if they are otherwise considered equal cost. -+ - .. _bgp-distance: - - Administrative Distance Metrics --- -2.29.2 - diff --git a/src/sonic-frr/patch/0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch b/src/sonic-frr/patch/0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch deleted file mode 100644 index 82a1b26fb98f..000000000000 --- a/src/sonic-frr/patch/0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 4b45abcdb107c8c5d58fd63a2616c54c800305b3 Mon Sep 17 00:00:00 2001 -From: Akhilesh Samineni -Date: Mon, 5 Apr 2021 13:21:40 -0700 -Subject: [PATCH] Link local scope was not set while binding socket with local - address causing socket errors for bgp ipv6 link local neighbors. - ---- - bgpd/bgp_network.c | 5 +++++ - bgpd/bgp_zebra.c | 3 +++ - 2 files changed, 8 insertions(+) - -diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c -index 6a5c2c4b3..d7047a154 100644 ---- a/bgpd/bgp_network.c -+++ b/bgpd/bgp_network.c -@@ -556,6 +556,11 @@ static int bgp_update_address(struct interface *ifp, const union sockunion *dst, - return 1; - - prefix2sockunion(sel, addr); -+ -+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) { -+ addr->sin6.sin6_scope_id = ifp->ifindex; -+ } -+ - return 0; - } - -diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c -index e42d6ee26..8e9fa8903 100644 ---- a/bgpd/bgp_zebra.c -+++ b/bgpd/bgp_zebra.c -@@ -814,6 +814,9 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote, - ? peer->conf_if - : peer->ifname, - peer->bgp->vrf_id); -+ else if (peer->update_if) -+ ifp = if_lookup_by_name(peer->update_if, -+ peer->bgp->vrf_id); - } else if (peer->update_if) - ifp = if_lookup_by_name(peer->update_if, - peer->bgp->vrf_id); --- -2.18.0 - diff --git a/src/sonic-frr/patch/0010-remove-doc-png-install.patch b/src/sonic-frr/patch/0010-remove-doc-png-install.patch deleted file mode 100644 index c911d43eaa29..000000000000 --- a/src/sonic-frr/patch/0010-remove-doc-png-install.patch +++ /dev/null @@ -1,21 +0,0 @@ -Remove the *.png file installation from the frr-doc package. It doesn't look -like it's installed there with Bullseye's tools. - -From: Saikrishna Arcot - ---- - debian/frr-doc.install | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/debian/frr-doc.install b/debian/frr-doc.install -index c48dc5a8d..955c8fc5a 100644 ---- a/debian/frr-doc.install -+++ b/debian/frr-doc.install -@@ -3,7 +3,6 @@ usr/share/doc/frr/html - - # info + images referenced by it - usr/share/info/ --doc/user/_build/texinfo/*.png usr/share/info - - # other - README.md usr/share/doc/frr diff --git a/src/sonic-frr/patch/0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch b/src/sonic-frr/patch/0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch deleted file mode 100644 index 7a041c02fe15..000000000000 --- a/src/sonic-frr/patch/0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c -index 7b0611bf9..b5582ea35 100644 ---- a/zebra/zebra_fpm.c -+++ b/zebra/zebra_fpm.c -@@ -288,6 +288,9 @@ static void zfpm_start_connect_timer(const char *reason); - static void zfpm_start_stats_timer(void); - static void zfpm_mac_info_del(struct fpm_mac_info_t *fpm_mac); - -+static const char ipv4_ll_buf[16] = "169.254.0.1"; -+union g_addr ipv4ll_gateway; -+ - /* - * zfpm_thread_should_yield - */ -@@ -1988,6 +1991,9 @@ static int zfpm_init(struct thread_master *master) - zfpm_stats_init(&zfpm_g->last_ivl_stats); - zfpm_stats_init(&zfpm_g->cumulative_stats); - -+ memset(&ipv4ll_gateway, 0, sizeof(ipv4ll_gateway)); -+ inet_pton(AF_INET, ipv4_ll_buf, &ipv4ll_gateway.ipv4); -+ - install_node(&zebra_node); - install_element(ENABLE_NODE, &show_zebra_fpm_stats_cmd); - install_element(ENABLE_NODE, &clear_zebra_fpm_stats_cmd); -diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c -index 60ea7f97e..0f8ba5413 100644 ---- a/zebra/zebra_fpm_netlink.c -+++ b/zebra/zebra_fpm_netlink.c -@@ -221,7 +221,12 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri, - - if (nexthop->type == NEXTHOP_TYPE_IPV6 - || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) { -- nhi.gateway = &nexthop->gate; -+ /* Special handling for IPv4 route with IPv6 Link Local next hop -+ */ -+ if (ri->af == AF_INET) -+ nhi.gateway = &ipv4ll_gateway; -+ else -+ nhi.gateway = &nexthop->gate; - } - - if (nexthop->type == NEXTHOP_TYPE_IFINDEX) { -diff --git a/zebra/zebra_fpm_private.h b/zebra/zebra_fpm_private.h -index c169ee8c2..13415c7e1 100644 ---- a/zebra/zebra_fpm_private.h -+++ b/zebra/zebra_fpm_private.h -@@ -97,6 +97,8 @@ extern int zfpm_netlink_encode_mac(struct fpm_mac_info_t *mac, char *in_buf, - - extern struct route_entry *zfpm_route_for_update(rib_dest_t *dest); - -+extern union g_addr ipv4ll_gateway; -+ - #ifdef __cplusplus - } - #endif diff --git a/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch b/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch new file mode 100644 index 000000000000..b924b9a66fc4 --- /dev/null +++ b/src/sonic-frr/patch/Disable-ipv6-src-address-test-in-pceplib.patch @@ -0,0 +1,27 @@ +From dfe0158344ea581370dd2dba8e4db189cf369147 Mon Sep 17 00:00:00 2001 +From: Syed Hasan Raza Naqvi +Date: Wed, 4 May 2022 05:11:01 +0000 +Subject: [PATCH] Disable ipv6 src address test in pcep. Docker lo interface + doesn't have ipv6 enabled. Socket bind returns cannot assign requested + address. + +--- + pceplib/test/pcep_socket_comm_test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pceplib/test/pcep_socket_comm_test.c b/pceplib/test/pcep_socket_comm_test.c +index 116531f12..8b71a5090 100644 +--- a/pceplib/test/pcep_socket_comm_test.c ++++ b/pceplib/test/pcep_socket_comm_test.c +@@ -92,7 +92,7 @@ void pcep_socket_comm_test_setup() + inet_pton(AF_INET, "127.0.0.1", &(test_host_ip)); + inet_pton(AF_INET, "127.0.0.1", &(test_src_ip)); + inet_pton(AF_INET6, "::1", &(test_host_ipv6)); +- inet_pton(AF_INET6, "::1", &(test_src_ipv6)); ++ inet_pton(AF_INET6, "::", &(test_src_ipv6)); + } + + void pcep_socket_comm_test_teardown() +-- +2.20.1 + diff --git a/src/sonic-frr/patch/series b/src/sonic-frr/patch/series index b77931d57e9a..43e407a3c952 100644 --- a/src/sonic-frr/patch/series +++ b/src/sonic-frr/patch/series @@ -3,9 +3,7 @@ 0003-Use-vrf_id-for-vrf-not-tabled_id.patch 0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch 0005-nexthops-compare-vrf-only-if-ip-type.patch -0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch -0008-Add-support-of-bgp-l3vni-evpn.patch -0009-Add-bgp-bestpath-peer-type-multipath-relax.patch -0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch -0010-remove-doc-png-install.patch -0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch +0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch +0007-Add-support-of-bgp-l3vni-evpn.patch +0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch +Disable-ipv6-src-address-test-in-pceplib.patch From 0285bfe42ea6673e94d56416e3330c13608ab6f1 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Tue, 24 May 2022 16:54:12 -0700 Subject: [PATCH 345/817] [chassis] Fix issues regarding database service failure handling and mid-plane connectivity for namespace. (#10500) What/Why I did: Issue1: By setting up of ipvlan interface in interface-config.sh we are not tolerant to failures. Reason being interface-config.service is one-shot and do not have restart capability. Scenario: For example if let's say database service goes in fail state then interface-services also gets failed because of dependency check but later database service gets restart but interface service will remain in stuck state and the ipvlan interface nevers get created. Solution: Moved all the logic in database service from interface-config service which looks more align logically also since the namespace is created here and all the network setting (sysctl) are happening here.With this if database starts we recreate the interface. Issue 2: Use of IPVLAN vs MACVLAN Currently we are using ipvlan mode. However above failure scenario is not handle correctly by ipvlan mode. Once the ipvlan interface is created and ip address assign to it and if we restart interface-config or database (new PR) service Linux Kernel gives error "Error: Address already assigned to an ipvlan device." based on this:https://github.com/torvalds/linux/blob/master/drivers/net/ipvlan/ipvlan_main.c#L978Reason being if we do not do cleanup of ip address assignment (need to be unique for IPVLAN) it remains in Kernel Database and never goes to free pool even though namespace is deleted. Solution: Considering this hard dependency of unique ip macvlan mode is better for us and since everything is managed by Linux Kernel and no dependency for on user configured IP address. Issue3: Namespace database Service do not check reachability to Supervisor Redis Chassis Server. Currently there is no explicit check as we never do Redis PING from namespace to Supervisor Redis Chassis Server. With this check it's possible we will start database and all other docker even though there is no connectivity and will hit the error/failure late in cycle Solution: Added explicit PING from namespace that will check this reachability. Issue 4:flushdb give exception when trying to accces Chassis Server DB over Unix Sokcet. Solution: Handle gracefully via try..except and log the message. --- .../chassisdb.conf | 1 - dockers/docker-database/flush_unused_database | 8 +++- files/build_templates/docker_image_ctl.j2 | 42 +++++++++++++++---- .../interfaces/interfaces-config.sh | 42 ------------------- 4 files changed, 40 insertions(+), 53 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/chassisdb.conf b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/chassisdb.conf index a2daf40b9fef..3296a7929a81 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/chassisdb.conf +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/chassisdb.conf @@ -2,4 +2,3 @@ start_chassis_db=1 chassis_db_address=10.6.0.100 lag_id_start=1 lag_id_end=512 -midplane_subnet=10.6.0.0/16 diff --git a/dockers/docker-database/flush_unused_database b/dockers/docker-database/flush_unused_database index b1d4af063860..e1f7394d9776 100755 --- a/dockers/docker-database/flush_unused_database +++ b/dockers/docker-database/flush_unused_database @@ -3,6 +3,7 @@ import swsssdk import redis import subprocess import time +import syslog while(True): output = subprocess.Popen(['sonic-db-cli', 'PING'], stdout=subprocess.PIPE, text=True).communicate()[0] @@ -24,5 +25,8 @@ for instname, v in instlists.items(): if dbinst == instname: continue - r = redis.Redis(host=insthost, unix_socket_path=instsocket, db=dbid) - r.flushdb() + try: + r = redis.Redis(host=insthost, unix_socket_path=instsocket, db=dbid) + r.flushdb() + except (redis.exceptions.ConnectionError): + syslog.syslog(syslog.LOG_INFO,"flushdb:Redis Unix Socket connection error for path {} and dbaname {}".format(instsocket, dbname)) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 9e4cb65b7050..f0a1dcccbaae 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -118,12 +118,8 @@ function preStartAction() function setPlatformLagIdBoundaries() { - CHASSIS_CONF=/usr/share/sonic/device/$PLATFORM/chassisdb.conf - if [ -f "$CHASSIS_CONF" ]; then - source $CHASSIS_CONF - docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB SET "SYSTEM_LAG_ID_START" "$lag_id_start" - docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB SET "SYSTEM_LAG_ID_END" "$lag_id_end" - fi + docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB SET "SYSTEM_LAG_ID_START" "$lag_id_start" + docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB SET "SYSTEM_LAG_ID_END" "$lag_id_end" } function waitForAllInstanceDatabaseConfigJsonFilesReady() { @@ -158,6 +154,8 @@ sleep 1 function postStartAction() { {%- if docker_container_name == "database" %} + CHASSISDB_CONF="/usr/share/sonic/device/$PLATFORM/chassisdb.conf" + [ -f $CHASSISDB_CONF ] && source $CHASSISDB_CONF if [ "$DEV" ]; then # Enable the forwarding on eth0 interface in namespace. SYSCTL_NET_CONFIG="/etc/sysctl.d/sysctl-net.conf" @@ -165,6 +163,31 @@ function postStartAction() s/^net.ipv6.conf.eth0.forwarding=0/net.ipv6.conf.eth0.forwarding=1/" $SYSCTL_NET_CONFIG docker exec -i database$DEV sysctl --system -e link_namespace $DEV + + + if [[ -n "$midplane_subnet" ]]; then + # Use /16 for loopback interface + ip netns exec "$NET_NS" ip addr add 127.0.0.1/16 dev lo + ip netns exec "$NET_NS" ip addr del 127.0.0.1/8 dev lo + + # Create eth1 in database instance + ip link add name ns-eth1"$NET_NS" link eth1-midplane type macvlan mode bridge + ip link set dev ns-eth1"$NET_NS" netns "$NET_NS" + ip netns exec "$NET_NS" ip link set ns-eth1"$NET_NS" name eth1 + + # Configure IP address and enable eth1 + lc_slot_id=$(python3 -c 'import sonic_platform.platform; platform_chassis = sonic_platform.platform.Platform().get_chassis(); print(platform_chassis.get_my_slot())' 2>/dev/null) + lc_ip_address=`echo $midplane_subnet | awk -F. '{print $1 "." $2}'`.$lc_slot_id.$(($DEV + 10)) + lc_subnet_mask=${midplane_subnet#*/} + ip netns exec "$NET_NS" ip addr add $lc_ip_address/$lc_subnet_mask dev eth1 + ip netns exec "$NET_NS" ip link set dev eth1 up + + # Allow localnet routing on the new interfaces if midplane is using a + # subnet in the 127/8 range. + if [[ "${midplane_subnet#127}" != "$midplane_subnet" ]]; then + ip netns exec "$NET_NS" bash -c "echo 1 > /proc/sys/net/ipv4/conf/eth1/route_localnet" + fi + fi fi # Setup ebtables configuration ebtables_config @@ -180,7 +203,8 @@ function postStartAction() # then we catch python exception of file not valid # that comes to syslog which is unwanted so wait till database # config is ready and then ping - until [[ ($(docker exec -i database$DEV pgrep -x -c supervisord) -gt 0) && ($($SONIC_DB_CLI PING | grep -c PONG) -gt 0) ]]; do + until [[ ($(docker exec -i database$DEV pgrep -x -c supervisord) -gt 0) && ($($SONIC_DB_CLI PING | grep -c PONG) -gt 0) && + ($(docker exec -i database$DEV sonic-db-cli PING | grep -c PONG) -gt 0) ]]; do sleep 1; done if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then @@ -222,7 +246,9 @@ function postStartAction() ($(docker exec -i ${DOCKERNAME} $SONIC_DB_CLI CHASSIS_APP_DB PING | grep -c True) -gt 0) ]]; do sleep 1 done - setPlatformLagIdBoundaries + if [[ -n "$lag_id_start" && -n "$lag_id_end" ]]; then + setPlatformLagIdBoundaries + fi REDIS_SOCK="/var/run/redis-chassis/redis_chassis.sock" fi chgrp -f redis $REDIS_SOCK && chmod -f 0760 $REDIS_SOCK diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 8c8a4e205875..f6aa4147a4e4 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -60,48 +60,6 @@ for intf_pid in $(ls -1 /var/run/dhclient*.Ethernet*.pid 2> /dev/null); do [[ -f ${intf_pid} ]] && kill `cat ${intf_pid}` && rm -f ${intf_pid} done - -# Setup eth1 if we connect to a remote chassis DB. -PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} -CHASSISDB_CONF="/usr/share/sonic/device/$PLATFORM/chassisdb.conf" -[[ -f $CHASSISDB_CONF ]] && source $CHASSISDB_CONF - -ASIC_CONF="/usr/share/sonic/device/$PLATFORM/asic.conf" -[[ -f $ASIC_CONF ]] && source $ASIC_CONF - -if [[ -n "$midplane_subnet" && ($NUM_ASIC -gt 1) ]]; then - for asic_id in `seq 0 $((NUM_ASIC - 1))`; do - NET_NS="asic$asic_id" - - PIDS=`ip netns pids "$NET_NS" 2>/dev/null` - if [[ "$?" -ne "0" ]]; then # namespace doesn't exist - continue - fi - - # Use /16 for loopback interface - ip netns exec $NET_NS ip addr add 127.0.0.1/16 dev lo - ip netns exec $NET_NS ip addr del 127.0.0.1/8 dev lo - - # Create eth1 in database instance - ip link add name ns-eth1 link eth1-midplane type ipvlan mode l2 - ip link set dev ns-eth1 netns $NET_NS - ip netns exec $NET_NS ip link set ns-eth1 name eth1 - - # Configure IP address and enable eth1 - lc_slot_id=$(python3 -c 'import sonic_platform.platform; platform_chassis = sonic_platform.platform.Platform().get_chassis(); print(platform_chassis.get_my_slot())' 2>/dev/null) - lc_ip_address=`echo $midplane_subnet | awk -F. '{print $1 "." $2}'`.$lc_slot_id.$((asic_id + 10)) - lc_subnet_mask=${midplane_subnet#*/} - ip netns exec $NET_NS ip addr add $lc_ip_address/$lc_subnet_mask dev eth1 - ip netns exec $NET_NS ip link set dev eth1 up - - # Allow localnet routing on the new interfaces if midplane is using a - # subnet in the 127/8 range. - if [[ "${midplane_subnet#127}" != "$midplane_subnet" ]]; then - ip netns exec $NET_NS bash -c "echo 1 > /proc/sys/net/ipv4/conf/eth1/route_localnet" - fi - done -fi - # Read sysctl conf files again sysctl -p /etc/sysctl.d/90-dhcp6-systcl.conf From 11f0bffe13d5b43d84695d71a0382b0dea3fbb79 Mon Sep 17 00:00:00 2001 From: Taylor Cai <103631396+cel-taylor@users.noreply.github.com> Date: Thu, 26 May 2022 00:06:50 +0800 Subject: [PATCH 346/817] [device/celestica]:Fix failed test case of Haliburton snmp (#10844) --- device/celestica/x86_64-cel_e1031-r0/sonic_platform/psu.py | 2 +- .../celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/psu.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/psu.py index 136010802233..0ea4aceeba7b 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/psu.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/psu.py @@ -234,7 +234,7 @@ def get_position_in_parent(self): Returns: integer: The 1-based relative physical position in parent device or -1 if cannot determine the position """ - return -1 + return self.index + 1 def is_replaceable(self): """ diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py index d224281a5935..ab702d02d095 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py @@ -324,6 +324,5 @@ def get_position_in_parent(self): Returns: A int value, 0 represent ASIC thermal, 1 represent CPU thermal info """ - if self.postion == "cpu": - return 1 - return 0 + + return self.index + 1 From 8315d119599a562dbad6f0e71ba41fb77992a17e Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Wed, 25 May 2022 10:17:47 -0700 Subject: [PATCH 347/817] Add YANG model and unit tests for sonic-telemetry (#10840) - Why I did it YANG schema is missing for sonic-telemetry - How I did it Added YANG schema to sonic-yang-models and appropriate unit tests inside of test and test_config - How to verify it Build sonic-yang-models python wheels target and verify that unit tests are passing --- src/sonic-yang-models/doc/Configuration.md | 22 +++++- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 14 +++- .../yang_model_tests/tests/telemetry.json | 17 ++++ .../tests_config/telemetry.json | 66 ++++++++++++++++ .../yang-models/sonic-telemetry.yang | 78 +++++++++++++++++++ 6 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/telemetry.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/telemetry.json create mode 100644 src/sonic-yang-models/yang-models/sonic-telemetry.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index d8904ae5e828..47ccb2a3e4ee 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -44,7 +44,8 @@ Table of Contents * [Queue](#queue) * [Tacplus Server](#tacplus-server) * [TC to Priority group map](#tc-to-priority-group-map) - * [TC to Queue map](#tc-to-queue-map) + * [TC to Queue map](#tc-to-queue-map) + * [Telemetry](#telemetry) * [Versions](#versions) * [VLAN](#vlan) * [VLAN_MEMBER](#vlan_member) @@ -1355,6 +1356,25 @@ name as object key and member list as attribute. } ``` +### Telemetry + +``` +{ + "TELEMETRY": { + "certs": { + "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", + "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer", + "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50051" + } + } +} +``` + ### Versions This table is where the curret version of the software is recorded. diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 1298b768bafb..52cf020f4491 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -126,6 +126,7 @@ def run(self): './yang-models/sonic-syslog.yang', './yang-models/sonic-system-aaa.yang', './yang-models/sonic-system-tacacs.yang', + './yang-models/sonic-telemetry.yang', './yang-models/sonic-types.yang', './yang-models/sonic-versions.yang', './yang-models/sonic-vlan.yang', @@ -184,6 +185,7 @@ def run(self): './cvlyang-models/sonic-sflow.yang', './cvlyang-models/sonic-system-aaa.yang', './cvlyang-models/sonic-system-tacacs.yang', + './cvlyang-models/sonic-telemetry.yang', './cvlyang-models/sonic-types.yang', './cvlyang-models/sonic-versions.yang', './cvlyang-models/sonic-vlan.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e19c8aeb8d68..e284794616a7 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1045,6 +1045,18 @@ "VERSION": "version_1_0_3" } }, + "TELEMETRY": { + "certs": { + "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", + "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer", + "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50051" + } + }, "FLEX_COUNTER_TABLE": { "PFCWD": { "FLEX_COUNTER_STATUS": "enable" @@ -1516,7 +1528,7 @@ "pir": "2560000", "type": "STRICT" } - }, + }, "WRED_PROFILE": { "Wred1": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/telemetry.json b/src/sonic-yang-models/tests/yang_model_tests/tests/telemetry.json new file mode 100644 index 000000000000..f79e8ea73272 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/telemetry.json @@ -0,0 +1,17 @@ +{ + "TELEMETRY_TABLE_WITH_INCORRECT_CERT": { + "desc": "TABLE_WITH_INCORRECT_CERT failure.", + "eStrKey": "Pattern" + }, + "TELEMETRY_TABLE_WITH_INCORRECT_CLIENT_AUTH": { + "desc": "TABLE_WITH_INCORRECT_CLIENT_AUTH failure", + "eStrKey": "InvalidValue" + }, + "TELEMETRY_TABLE_WITH_INCORRECT_PORT": { + "desc": "TABLE_WITH_INCORRECT_PORT failure.", + "eStrKey": "InvalidValue" + }, + "TELEMETRY_TABLE_WITH_VALID_CONFIG": { + "desc": "TABLE WITH VALID CONFIG." + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/telemetry.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/telemetry.json new file mode 100644 index 000000000000..1231a4cee662 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/telemetry.json @@ -0,0 +1,66 @@ +{ + "TELEMETRY_TABLE_WITH_INCORRECT_CERT": { + "sonic-telemetry:sonic-telemetry": { + "sonic-telemetry:TELEMETRY": { + "certs": { + "ca_crt": "abcd.config", + "server_crt": "a/b/c", + "server_key": "123" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50051" + } + } + } + }, + "TELEMETRY_TABLE_WITH_INCORRECT_CLIENT_AUTH": { + "sonic-telemetry:sonic-telemetry": { + "sonic-telemetry:TELEMETRY": { + "certs": { + "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", + "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer", + "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key" + }, + "gnmi": { + "client_auth": "up", + "log_level": "2", + "port": "50051" + } + } + } + }, + "TELEMETRY_TABLE_WITH_INCORRECT_PORT": { + "sonic-telemetry:sonic-telemetry": { + "sonic-telemetry:TELEMETRY": { + "certs": { + "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", + "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer", + "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "abc" + } + } + } + }, + "TELEMETRY_TABLE_WITH_VALID_CONFIG": { + "sonic-telemetry:sonic-telemetry": { + "sonic-telemetry:TELEMETRY": { + "certs": { + "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", + "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer", + "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50051" + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-telemetry.yang b/src/sonic-yang-models/yang-models/sonic-telemetry.yang new file mode 100644 index 000000000000..0164da5157eb --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-telemetry.yang @@ -0,0 +1,78 @@ +module sonic-telemetry { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-telemetry"; + prefix telemetry; + + import ietf-inet-types { + prefix inet; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description "TELEMETRY YANG Module for SONiC OS"; + + revision 2022-05-13 { + description "First Revision"; + } + + container sonic-telemetry { + + container TELEMETRY { + + description "TELEMETRY TABLE part of config_db.json"; + + container certs { + + leaf ca_crt { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).cer'; + } + description "Local path for ca_crt."; + } + + leaf server_crt { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).cer'; + } + description "Local path for server_crt."; + } + + leaf server_key { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).key'; + } + description "Local path for server_key."; + } + + } + + container gnmi { + + leaf client_auth { + type boolean; + description "Flag for requiring client auth."; + } + + leaf log_level { + type uint8 { + range 0..100; + } + description "Log level for gnmi."; + } + + leaf port { + type inet:port-number; + description "Port gnmi runs on."; + } + + } + + } + } +} From b5e59a1355b48e15801694953f103e9720b34ef8 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Wed, 25 May 2022 15:48:02 -0700 Subject: [PATCH 348/817] [sonic-config-engine] Change hwsku for sample graph in unit tests (#10889) #### Why I did it To ensure that some internal testcases do not break due to external changes #### How to verify it Ran test_cfggen.py with the changes and it passed --- .../tests/sample-graph-resource-type.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index 987d24358438..5d07e04fb03a 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -314,7 +314,7 @@ switch-t0 - Force10-S6000 + Arista-7050QX-32S AAA00PrdStr00 @@ -751,7 +751,7 @@ true 0 - Force10-S6000 + Arista-7050QX-32S DeviceInterface @@ -786,5 +786,5 @@ switch-t0 - Force10-S6000 + Arista-7050QX-32S From f0dfd398a6ed425034d8a80231d7bfd4880a4a50 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 26 May 2022 09:39:48 +0800 Subject: [PATCH 349/817] Revert "Reduce image size for lazy installation packages (#10775)" (#10916) This reverts commit 15cf9b0d70b3d839a40a06cec6b6fc10124017ae. Why I did it Revert the PR #10775, for it has impact on onie installation. It is caused by the symbol links not supported in some of the onie unzip. We will enable after fixing the issue, see #10914 --- build_debian.sh | 2 +- files/build_templates/sonic_debian_extension.j2 | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 676c0298ec7d..25f039c90697 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -647,5 +647,5 @@ fi pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd ## Compress together with /boot, /var/lib/docker and $PLATFORM_DIR as an installer payload zip file -pushd $FILESYSTEM_ROOT && sudo zip --symlinks $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd +pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd sudo zip -g -n .squashfs:.gz $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 185184fb91d5..659921d50aa9 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -610,9 +610,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT depmod -a {{kversion}} sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f --download-only sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}} -sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/common -sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/common/ -sudo ln -sf "../common/{{ debfilename }}" "$FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/{{ debfilename }}" +sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ for f in $(find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"); do sudo mv $f $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ done From cc9a4beb0c0712c149f5139e3911017b42348a64 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 26 May 2022 21:55:13 +0800 Subject: [PATCH 350/817] Touch the donwload files to change the modified time (#10929) Why I did it It is to improve the build performance, when building multiple targets. The modified time of downloaded files should be not older than the file .platform. If not, the file will be downloaded again, when building any dependent targets. How I did it When downloading the packages from web site, the modified time will be changed by the command "touch". --- src/sonic-fips/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sonic-fips/Makefile b/src/sonic-fips/Makefile index f38583e2f6c8..3ee9f46fc509 100644 --- a/src/sonic-fips/Makefile +++ b/src/sonic-fips/Makefile @@ -24,6 +24,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : url=$(FIPS_URL_PREFIX)/$$filename mkdir -p "$$(dirname $(DEST)/$$target)" wget -O "$(DEST)/$$target" "$$url" + touch "$(DEST)/$$target" done $(addprefix $(DEST)/, $(FIPS_DERIVED_TARGET)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) From c618a653a14071fdfe9cb8962f117d5e53fa6eaa Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 26 May 2022 23:16:23 +0800 Subject: [PATCH 351/817] [yang] Support new interface types CR8/SR8/KR8/LR8 (#10826) - Why I did it With SAI V.1.10.2, new interface types CR8/SR8/KR8/LR8 have been introduced, we should also support them from the CLI configuration. - How I did it Add new enum for the new interface types - How to verify it Run the "config interface type" command to verify new interface types can be accepted and handled correctly. Signed-off-by: Kebo Liu --- src/sonic-yang-models/yang-templates/sonic-types.yang.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 index da043fa8761d..29be032e8876 100644 --- a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 @@ -136,13 +136,17 @@ module sonic-types { enum CR; enum CR2; enum CR4; + enum CR8; enum SR; enum SR2; enum SR4; + enum SR8; enum LR; enum LR4; + enum LR8; enum KR; enum KR4; + enum KR8; enum CAUI; enum GMII; enum SFI; From a5932e326420950ca02cd5f5b4250cd588239d44 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Thu, 26 May 2022 18:33:59 +0300 Subject: [PATCH 352/817] [submodule] Advanced sonic-swss pointer (#10926) [muxorch] Handling optional attributes in muxorch (#2288) Update netlink messages handler (#2233) Broadcast Unknown-multicast and Unknown-unicast Storm-control (#1306) [vstest]: Increase PollingConfig default timeout (#2285) [FDB] Fix fbdorch to properly handle syncd FDB FLUSH Notif (#2254) [macsecorch]: Support for non-default sa per sc (#2250) Migrating the NAT vs tests from Click to direct DB access (#2278) [neighsync] Ignoring IPv4 link local addresses (#2260) [IntfMgrd] Retry adding ipv6 prefix by setting disabled_ipv6 flag (#2267) Increase Redis Timeout value for Switch Create Opration for Packet (#2243) Update fdborch.cpp (#2261) Signed-off-by: dprital --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 97b4387ca9f5..0e5e7ba5cb55 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 97b4387ca9f527c074878f40a598acad7460a96e +Subproject commit 0e5e7ba5cb5581c1ea4d470216cf3aadcd19fb94 From e61bfd7bb4d3fd7b0d4d86a3b99250dbd884d3a4 Mon Sep 17 00:00:00 2001 From: AmitKaushik7 <52193450+AmitKaushik7@users.noreply.github.com> Date: Fri, 27 May 2022 00:20:07 +0530 Subject: [PATCH 353/817] Add crm sample data for snat/dnat/ipmc entries for Yang Model (#10865) #### Why I did it For yang model, sample_config_db.json file was missing Sample data for the features SNAT/DNAT/IPMC #### How I did it Added the SNAT,DNAT,IPMC(low Threshold/high threshold/threshold_type)entries in CRM table. #### How to verify it With sanity Build/test only. --- src/sonic-yang-models/tests/files/sample_config_db.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index e284794616a7..01bcf4ecf18c 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1112,12 +1112,21 @@ "acl_counter_high_threshold": "85", "acl_counter_low_threshold": "70", "acl_counter_threshold_type": "percentage", + "dnat_entry_threshold_type": "percentage", + "dnat_entry_high_threshold": "85", + "dnat_entry_low_threshold": "70", + "ipmc_entry_threshold_type": "percentage", + "ipmc_entry_high_threshold": "85", + "ipmc_entry_low_threshold": "70", "ipv6_neighbor_high_threshold": "67", "ipv6_neighbor_low_threshold": "56", "ipv6_neighbor_threshold_type": "percentage", "nexthop_group_high_threshold": "67", "nexthop_group_low_threshold": "56", "nexthop_group_threshold_type": "percentage", + "snat_entry_threshold_type": "percentage", + "snat_entry_high_threshold": "85", + "snat_entry_low_threshold": "70", "polling_interval": "0" } }, From 054eb25c85c304339a136d22826e37ccbc825beb Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 27 May 2022 08:58:40 +0800 Subject: [PATCH 354/817] Update sonic-swss-common submodule (#10872) Updating sonic-utilities sub module with the following commits 84dbd93 Clear the fvs vector before popping the message out of notification a90b2b7 selectabletimer: add mutex to start() and stop() 7ae22be Fix SIGTERM can't terminate PubSub::listen issue #### Why I did it To fix hostcfgd can't terminate by sigint issue, need update sonic-swss-common submodule. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog 84dbd93 Clear the fvs vector before popping the message out of notification a90b2b7 selectabletimer: add mutex to start() and stop() 7ae22be Fix SIGTERM can't terminate PubSub::listen issue #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 7a203b1b1fde..7ae22be4c1bf 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 7a203b1b1fdefcd588ec7a72c0db95b32e50f3a7 +Subproject commit 7ae22be4c1bf8dd7c5f697cdf2faf7317a02ba14 From 441cd1d283d12ad96c4c0bf0d2b17c31e27a9e8d Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Fri, 27 May 2022 09:45:29 -0700 Subject: [PATCH 355/817] [yang] add Sample configuration for ACL_TABLE_TYPE (#10937) Signed-off-by: Sudharsan Dhamal Gopalarathnam --- .../tests/files/sample_config_db.json | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 01bcf4ecf18c..d6a4e8f2a9ee 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -302,6 +302,12 @@ "MIRROR_INGRESS_ACTION": "erspan", "DSCP": "10", "PRIORITY": "9999" + }, + "DATAACL|RULE0": { + "PRIORITY": "999", + "PACKET_ACTION": "DROP", + "IP_TYPE": "IPv4ANY", + "SRC_IP": "1.1.1.1/32" } }, "DEVICE_METADATA": { @@ -816,6 +822,14 @@ "Ethernet24" ], "stage": "ingress" + }, + "DATAACL": { + "stage": "INGRESS", + "type": "CUSTOM_L3", + "ports": [ + "Ethernet0", + "PortChannel0003" + ] } }, @@ -1823,7 +1837,24 @@ "num_dumps": "3", "memory": "0M-2G:256M,2G-4G:256M,4G-8G:384M,8G-:448M" } - } + }, + "ACL_TABLE_TYPE": { + "CUSTOM_L3": { + "matches": [ + "IN_PORTS", + "OUT_PORTS", + "SRC_IP" + ], + "actions": [ + "PACKET_ACTION", + "MIRROR_INGRESS_ACTION" + ], + "bind_points": [ + "PORT", + "LAG" + ] + } + } }, "SAMPLE_CONFIG_DB_UNKNOWN": { "UNKNOWN_TABLE": { From 1bce88ad29dc71327913d80f3afa1a803e7e0e21 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Fri, 27 May 2022 09:46:23 -0700 Subject: [PATCH 356/817] [sonic-config-engine] Fix typo in hwsku name in sample graph (#10941) Signed-off-by: Neetha John Why I did it There was a typo in hwsku specified as part of #10889 How I did it Replaced with the correct hwsku How to verify it test_cfggen.py is passing --- .../tests/sample-graph-resource-type.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/tests/sample-graph-resource-type.xml b/src/sonic-config-engine/tests/sample-graph-resource-type.xml index 5d07e04fb03a..93c9f01cd512 100644 --- a/src/sonic-config-engine/tests/sample-graph-resource-type.xml +++ b/src/sonic-config-engine/tests/sample-graph-resource-type.xml @@ -314,7 +314,7 @@ switch-t0 - Arista-7050QX-32S + Arista-7050-QX-32S AAA00PrdStr00 @@ -751,7 +751,7 @@ true 0 - Arista-7050QX-32S + Arista-7050-QX-32S DeviceInterface @@ -786,5 +786,5 @@ switch-t0 - Arista-7050QX-32S + Arista-7050-QX-32S From 71c868f56ae8c012b6813b5aa1337692e4c17b42 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Fri, 27 May 2022 14:28:01 -0400 Subject: [PATCH 357/817] Upgrade libasan to version 6 in docker-syncd-mlnx to align with bullseye libasan (#10886) --- platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 70c8795fb9e0..cd3f74bcfaf3 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -33,7 +33,7 @@ RUN apt-get update && \ python3-dev \ python-is-python3 \ {%- if ENABLE_ASAN == "y" %} - libasan5 \ + libasan6 \ {%- endif %} python3-setuptools From 1ac60d39f056ff66f8ff9063e544b9e98543c981 Mon Sep 17 00:00:00 2001 From: Hasan Naqvi <56742004+hasan-brcm@users.noreply.github.com> Date: Fri, 27 May 2022 13:49:58 -0700 Subject: [PATCH 358/817] [frr]: fix official build break (#10947) Official build fails complaining missing below targets: 2022-05-25T10:50:38.0560306Z tar: target/debs/buster/libyang2-cpp1_2.0.112-6_amd64.deb: Cannot stat: No such file or directory 2022-05-25T10:50:38.0571392Z tar: target/debs/buster/libyang2-cpp-dev_2.0.112-6_amd64.deb: Cannot stat: No such file or directory 2022-05-25T10:50:38.0588893Z tar: target/debs/buster/libyang2-cpp1-dbgsym_2.0.112-6_amd64.deb: Cannot stat: No such file or directory 2022-05-25T10:50:38.0590887Z tar: target/debs/buster/yang-tools_2.0.112-6_all.deb: Cannot stat: No such file or directory --- rules/libyang2.mk | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/rules/libyang2.mk b/rules/libyang2.mk index 1e181b2a30eb..ca6d611b52ee 100644 --- a/rules/libyang2.mk +++ b/rules/libyang2.mk @@ -20,19 +20,6 @@ $(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DEV))) LIBYANG2_DBG = libyang2-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DBG))) -LIBYANG2_CPP = libyang2-cpp1_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb -$(LIBYANG2_CPP)_DEPENDS += $(LIBYANG2) -$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP))) - -LIBYANG2_CPP_DEV = libyang2-cpp-dev_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DEV))) - -LIBYANG2_CPP_DBG = libyang2-cpp1-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DBG))) - -YANG_TOOLS = yang-tools_$(LIBYANG2_FULLVERSION)_all.deb -$(YANG_TOOLS)_DEPENDS += $(LIBYANG2) -$(eval $(call add_derived_package,$(LIBYANG2),$(YANG_TOOLS))) LIBYANG2_TOOLS = libyang2-tools_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS))) @@ -40,4 +27,5 @@ $(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS))) LIBYANG2_TOOLS_DBG = libyang2-tools-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS_DBG))) -export LIBYANG2 LIBYANG2_DBG LIBYANG2_DEV LIBYANG2_CPP LIBYANG2_CPP_DEV LIBYANG2_CPP_DBG YANG_TOOLS LIBYANG2_TOOLS LIBYANG2_TOOLS_DBG +export LIBYANG2 LIBYANG2_DBG LIBYANG2_DEV LIBYANG2_TOOLS LIBYANG2_TOOLS_DBG + From 9bf84fcad53e2e4c032a07d100700e278319fe54 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Fri, 27 May 2022 21:01:32 -0700 Subject: [PATCH 359/817] [submodule]: Update submodule for sonic-wpa-supplicant (#10957) 1069d2dd4 [sonic_operators.cpp]: Fixbug wait with false positive to return success Signed-off-by: Ze Gan --- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 64caafe38339..1069d2dd4f71 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 64caafe3833914f4838fa2e2db290ad676ad8dda +Subproject commit 1069d2dd4f7108838246abe2b8f693180c972acd From b62526c46cb669c53b04bb4b1672bc6335aff6b8 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Sat, 28 May 2022 15:34:28 +0800 Subject: [PATCH 360/817] Define `SYSTEM_DEFAULTS` table to control tunnel_qos_remap (#10877) * Define SYSTEM_DEFAULTS table to control tunnel_qos_remap Signed-off-by: bingwang --- src/sonic-config-engine/minigraph.py | 87 +- ...imple-sample-graph-case-remap-disabled.xml | 894 ++++++++++++++++++ ...simple-sample-graph-case-remap-enabled.xml | 894 ++++++++++++++++++ .../tests/test_minigraph_case.py | 36 + 4 files changed, 1898 insertions(+), 13 deletions(-) create mode 100644 src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml create mode 100644 src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 1446457eb513..b1ad117d255c 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -66,7 +66,9 @@ def default(self, obj): def get_peer_switch_info(link_metadata, devices): peer_switch_table = {} - for data in link_metadata.values(): + peer_switch_ip = None + mux_tunnel_name = None + for port, data in link_metadata.items(): if "PeerSwitch" in data: peer_hostname = data["PeerSwitch"] peer_lo_addr_str = devices[peer_hostname]["lo_addr"] @@ -75,8 +77,10 @@ def get_peer_switch_info(link_metadata, devices): peer_switch_table[peer_hostname] = { 'address_ipv4': str(peer_lo_addr.network_address) if peer_lo_addr else peer_lo_addr_str } + mux_tunnel_name = port + peer_switch_ip = peer_switch_table[peer_hostname]['address_ipv4'] - return peer_switch_table + return peer_switch_table, mux_tunnel_name, peer_switch_ip def parse_device(device): @@ -410,6 +414,8 @@ def parse_dpg(dpg, hname): mgmtintfs = None subintfs = None tunnelintfs = defaultdict(dict) + tunnelintfs_qos_remap_config = defaultdict(dict) + for child in dpg: """ In Multi-NPU platforms the acl intfs are defined only for the host not for individual asic. @@ -717,6 +723,13 @@ def parse_dpg(dpg, hname): "ecn_mode": "EcnDecapsulationMode", "dscp_mode": "DifferentiatedServicesCodePointMode", "ttl_mode": "TtlMode"} + + tunnel_qos_remap_table_key_to_mg_key_map = { + "decap_dscp_to_tc_map": "DecapDscpToTcMap", + "decap_tc_to_pg_map": "DecapTcToPgMap", + "encap_tc_to_queue_map": "EncapTcToQueueMap", + "encap_tc_to_dscp_map": "EncapTcToDscpMap"} + for mg_tunnel in mg_tunnels.findall(str(QName(ns, "TunnelInterface"))): tunnel_type = mg_tunnel.attrib["Type"] tunnel_name = mg_tunnel.attrib["Name"] @@ -728,9 +741,17 @@ def parse_dpg(dpg, hname): # If the minigraph has the key, add the corresponding config DB key to the table if mg_key in mg_tunnel.attrib: tunnelintfs[tunnel_type][tunnel_name][table_key] = mg_tunnel.attrib[mg_key] + + tunnelintfs_qos_remap_config[tunnel_type][tunnel_name] = { + "tunnel_type": mg_tunnel.attrib["Type"].upper(), + } - return intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnelintfs, dpg_ecmp_content, static_routes - return None, None, None, None, None, None, None, None, None, None, None, None, None, None, None + for table_key, mg_key in tunnel_qos_remap_table_key_to_mg_key_map.items(): + if mg_key in mg_tunnel.attrib: + tunnelintfs_qos_remap_config[tunnel_type][tunnel_name][table_key] = mg_tunnel.attrib[mg_key] + + return intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnelintfs, dpg_ecmp_content, static_routes, tunnelintfs_qos_remap_config + return None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None @@ -909,6 +930,29 @@ def parse_meta(meta, hname): return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data +def parse_system_defaults(meta): + system_default_values = {} + + system_defaults = meta.find(str(QName(ns1, "SystemDefaults"))) + + if system_defaults is None: + return system_default_values + + for system_default in system_defaults.findall(str(QName(ns1, "SystemDefault"))): + name = system_default.find(str(QName(ns1, "Name"))).text + value = system_default.find(str(QName(ns1, "Value"))).text + + # Tunnel Qos remapping + if name == "TunnelQosRemapEnabled": + if value.lower() == "true": + status = "enabled" + else: + status = "disabled" + system_default_values["tunnel_qos_remap"] = {"status": status} + + return system_default_values + + def parse_linkmeta(meta, hname): link = meta.find(str(QName(ns, "Link"))) linkmetas = {} @@ -1200,6 +1244,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw vlan_intfs = None pc_intfs = None tunnel_intfs = None + tunnel_intfs_qos_remap_config = None vlans = None vlan_members = None dhcp_relay_table = None @@ -1240,6 +1285,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw local_devices = [] kube_data = {} static_routes = {} + system_defaults = {} hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -1262,7 +1308,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw for child in root: if asic_name is None: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content, static_routes) = parse_dpg(child, hostname) + (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content, static_routes, tunnel_intfs_qos_remap_config) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): @@ -1275,9 +1321,11 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): (port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku) + elif child.tag == str(QName(ns, "SystemDefaultsDeclaration")): + system_defaults = parse_system_defaults(child) else: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content, static_routes) = parse_dpg(child, asic_name) + (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content, static_routes, tunnel_intfs_qos_remap_config) = parse_dpg(child, asic_name) host_lo_intfs = parse_host_loopback(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name, local_devices) @@ -1289,6 +1337,8 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): (port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku) + elif child.tag == str(QName(ns, "SystemDefaultsDeclaration")): + system_defaults = parse_system_defaults(child) # set the host device type in asic metadata also device_type = [devices[key]['type'] for key in devices if key.lower() == hostname.lower()][0] @@ -1324,8 +1374,11 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw 'ip': kube_data.get('ip', '') } } - - results['PEER_SWITCH'] = get_peer_switch_info(linkmetas, devices) + + if len(system_defaults) > 0: + results['SYSTEM_DEFAULTS'] = system_defaults + + results['PEER_SWITCH'], mux_tunnel_name, peer_switch_ip = get_peer_switch_info(linkmetas, devices) if bool(results['PEER_SWITCH']): results['DEVICE_METADATA']['localhost']['subtype'] = 'DualToR' @@ -1625,7 +1678,8 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['VLAN'] = vlans results['VLAN_MEMBER'] = vlan_members - results['TUNNEL'] = get_tunnel_entries(tunnel_intfs, lo_intfs, hostname) + # Add src_ip and qos remapping config into TUNNEL table if tunnel_qos_remap is enabled + results['TUNNEL'] = get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, system_defaults.get('tunnel_qos_remap', {}), mux_tunnel_name, peer_switch_ip) results['MUX_CABLE'] = get_mux_cable_entries(mux_cable_ports, neighbors, devices) @@ -1717,7 +1771,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw return results -def get_tunnel_entries(tunnel_intfs, lo_intfs, hostname): +def get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, tunnel_qos_remap, mux_tunnel_name, peer_switch_ip): lo_addr = '' # Use the first IPv4 loopback as the tunnel destination IP for addr in lo_intfs.keys(): @@ -1730,7 +1784,14 @@ def get_tunnel_entries(tunnel_intfs, lo_intfs, hostname): for type, tunnel_dict in tunnel_intfs.items(): for tunnel_key, tunnel_attr in tunnel_dict.items(): tunnel_attr['dst_ip'] = lo_addr + + if (tunnel_qos_remap.get('status') == 'enabled') and (mux_tunnel_name == tunnel_key) and (peer_switch_ip is not None): + tunnel_attr['src_ip'] = peer_switch_ip + if tunnel_key in tunnel_intfs_qos_remap_config[type]: + tunnel_attr.update(tunnel_intfs_qos_remap_config[type][tunnel_key].items()) + tunnels[tunnel_key] = tunnel_attr + return tunnels def get_mux_cable_entries(mux_cable_ports, neighbors, devices): @@ -1754,7 +1815,7 @@ def get_mux_cable_entries(mux_cable_ports, neighbors, devices): entry['server_ipv6'] = str(server_ipv6_lo_prefix) mux_cable_table[intf] = entry else: - print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor)) + print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor), file=sys.stderr) if cable_name in devices: cable_type = devices[cable_name].get('subtype') @@ -1767,9 +1828,9 @@ def get_mux_cable_entries(mux_cable_ports, neighbors, devices): soc_ipv4_prefix = ipaddress.ip_network(UNICODE_TYPE(soc_ipv4)) mux_cable_table[intf]['soc_ipv4'] = str(soc_ipv4_prefix) else: - print("Warning: skip parsing device %s for mux cable entry, cable type %s not supported" % (cable_name, cable_type)) + print("Warning: skip parsing device %s for mux cable entry, cable type %s not supported" % (cable_name, cable_type), file=sys.stderr) else: - print("Warning: skip parsing device %s for mux cable entry, device definition not found" % cable_name) + print("Warning: skip parsing device %s for mux cable entry, device definition not found" % cable_name, file=sys.stderr) return mux_cable_table diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml new file mode 100644 index 000000000000..7d0be06e4e82 --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml @@ -0,0 +1,894 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/4 + + + + + + + + + ab1 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + 00:aa:bb:cc:dd:ee + + + ab2 + fortyGigE0/4 + 192.0.0.1 + fc02:2000::3;fc02:2000::4 + 2000 + 2000 + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + ab1 + 192.168.0.1/27 + + + + + + PortChannel01 + DataAcl + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + ERSPAN_DSCP + Everflow_dscp + Everflow_dscp + + + + + + + + + + DeviceSerialLink + 9600 + switch-t0 + console + true + switch-t1 + 1 + + + DeviceSerialLink + 9600 + switch-t0 + 1 + true + managed_device + console + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/0 + switch-01t1 + port1 + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/12 + switch-02t1 + port1 + + + DeviceInterfaceLink + 25000 + switch-t0 + fortyGigE0/4 + server1 + port1 + + + DeviceInterfaceLink + 40000 + switch-t0 + fortyGigE0/8 + server2 + port1 + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/4 + true + mux-cable + L + true + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/8 + true + mux-cable + U + true + + + LogicalLink + 0 + false + switch-t0 + MuxTunnel0 + false + switch2-t0 + MuxTunnel0 + true + + + + + ToRRouter +
+ 26.1.1.10/32 +
+ switch-t0 + Force10-S6000 + AAA00PrdStr00 +
+ +
+ 25.1.1.10/32 +
+ + 10.7.0.196/26 + + switch2-t0 + Force10-S6000 +
+ + switch-01t1 +
+ 10.1.0.186/32 +
+ 2 + + + 10.7.0.196/26 + + Force10-S6000 +
+ + Server +
+ 10.10.10.1/32 +
+ + fe80::0001/80 + + + 10.0.0.1/32 + + server1 + server-sku +
+ + Server +
+ 10.10.10.2/32 +
+ + fe80::0002/128 + + + 10.0.0.2/32 + + server2 + server-sku +
+
+
+ + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + switch-t0 + + + LowerTOR + + switch2-t0 + + + switch2-t0:MuxTunnel0;switch-t0:MuxTunnel0 + + + + + + AutoNegotiation + + True + + + switch-01t1:port1;switch-t0:fortyGigE0/0 + + + + + + AutoNegotiation + + True + + + switch-02t1:port1;switch-t0:fortyGigE0/12 + + + + + + AutoNegotiation + + True + + + server1:port1;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + True + + + server2:port1;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + ErspanDestinationIpv4 + + 10.0.100.1 + + + NtpResources + + 10.0.10.1;10.0.10.2 + + + + SnmpResources + + 10.0.10.3;10.0.10.4 + + + + SyslogResources + + 10.0.10.5;10.0.10.6 + + + + TacacsServer + + 10.0.10.7;10.0.10.8 + + + KubernetesEnabled + + 0 + + + KubernetesServerIp + + 10.10.10.10 + + + ResourceType + + Storage + + + + + + + + + + TunnelQosRemapEnabled + False + + + + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + true + 0 + Force10-S6000 + + + DeviceInterface + + true + 1 + eth0 + false + eth0 + 1000 + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml new file mode 100644 index 000000000000..d38f77774e9f --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml @@ -0,0 +1,894 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/4 + + + + + + + + + ab1 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + 00:aa:bb:cc:dd:ee + + + ab2 + fortyGigE0/4 + 192.0.0.1 + fc02:2000::3;fc02:2000::4 + 2000 + 2000 + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + ab1 + 192.168.0.1/27 + + + + + + PortChannel01 + DataAcl + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + ERSPAN_DSCP + Everflow_dscp + Everflow_dscp + + + + + + + + + + DeviceSerialLink + 9600 + switch-t0 + console + true + switch-t1 + 1 + + + DeviceSerialLink + 9600 + switch-t0 + 1 + true + managed_device + console + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/0 + switch-01t1 + port1 + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/12 + switch-02t1 + port1 + + + DeviceInterfaceLink + 25000 + switch-t0 + fortyGigE0/4 + server1 + port1 + + + DeviceInterfaceLink + 40000 + switch-t0 + fortyGigE0/8 + server2 + port1 + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/4 + true + mux-cable + L + true + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/8 + true + mux-cable + U + true + + + LogicalLink + 0 + false + switch-t0 + MuxTunnel0 + false + switch2-t0 + MuxTunnel0 + true + + + + + ToRRouter +
+ 26.1.1.10/32 +
+ switch-t0 + Force10-S6000 + AAA00PrdStr00 +
+ +
+ 25.1.1.10/32 +
+ + 10.7.0.196/26 + + switch2-t0 + Force10-S6000 +
+ + switch-01t1 +
+ 10.1.0.186/32 +
+ 2 + + + 10.7.0.196/26 + + Force10-S6000 +
+ + Server +
+ 10.10.10.1/32 +
+ + fe80::0001/80 + + + 10.0.0.1/32 + + server1 + server-sku +
+ + Server +
+ 10.10.10.2/32 +
+ + fe80::0002/128 + + + 10.0.0.2/32 + + server2 + server-sku +
+
+
+ + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + switch-t0 + + + LowerTOR + + switch2-t0 + + + switch2-t0:MuxTunnel0;switch-t0:MuxTunnel0 + + + + + + AutoNegotiation + + True + + + switch-01t1:port1;switch-t0:fortyGigE0/0 + + + + + + AutoNegotiation + + True + + + switch-02t1:port1;switch-t0:fortyGigE0/12 + + + + + + AutoNegotiation + + True + + + server1:port1;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + True + + + server2:port1;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + ErspanDestinationIpv4 + + 10.0.100.1 + + + NtpResources + + 10.0.10.1;10.0.10.2 + + + + SnmpResources + + 10.0.10.3;10.0.10.4 + + + + SyslogResources + + 10.0.10.5;10.0.10.6 + + + + TacacsServer + + 10.0.10.7;10.0.10.8 + + + KubernetesEnabled + + 0 + + + KubernetesServerIp + + 10.10.10.10 + + + ResourceType + + Storage + + + + + + + + + + TunnelQosRemapEnabled + True + + + + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + true + 0 + Force10-S6000 + + + DeviceInterface + + true + 1 + eth0 + false + eth0 + 1000 + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index d5fe3aad7535..b4756219399d 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -369,6 +369,42 @@ def test_minigraph_tunnel_table(self): expected_tunnel ) + # Validate tunnel config is as before when tunnel_qos_remap = disabled + sample_graph_disabled_remap = os.path.join(self.test_dir, 'simple-sample-graph-case-remap-disabled.xml') + argument = '-m "' + sample_graph_disabled_remap + '" -p "' + self.port_config + '" -v "TUNNEL"' + + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + expected_tunnel + ) + + # Validate extra config is generated when tunnel_qos_remap = enabled + sample_graph_enabled_remap = os.path.join(self.test_dir, 'simple-sample-graph-case-remap-enabled.xml') + argument = '-m "' + sample_graph_enabled_remap + '" -p "' + self.port_config + '" -v "TUNNEL"' + expected_tunnel = { + "MuxTunnel0": { + "tunnel_type": "IPINIP", + "src_ip": "25.1.1.10", + "dst_ip": "10.1.0.32", + "dscp_mode": "uniform", + "encap_ecn_mode": "standard", + "ecn_mode": "copy_from_outer", + "ttl_mode": "pipe", + "decap_dscp_to_tc_map": "AZURE_TUNNEL", + "decap_tc_to_pg_map": "AZURE_TUNNEL", + "encap_tc_to_dscp_map": "AZURE_TUNNEL", + "encap_tc_to_queue_map": "AZURE_TUNNEL" + } + } + + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + expected_tunnel + ) + + def test_minigraph_mux_cable_table(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MUX_CABLE"' expected_table = { From 29043ff026a815e1fea338759ff05491c48e2f03 Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Sat, 28 May 2022 15:45:02 +0300 Subject: [PATCH 361/817] [MFT] Update MFT version to MFT 4.20.0-34 (#10933) - Why I did it Update MFT to newer version - How I did it Update MFT_VERSION in platform/mellanox/mft.mk - How to verify it Check version via dpkg -l | grep mft Signed-off-by: Andriy Yurkiv --- platform/mellanox/mft.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 7dc654381f5a..c3ebdac356e7 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -16,8 +16,8 @@ # # Mellanox SAI -MFT_VERSION = 4.18.0 -MFT_REVISION = 106 +MFT_VERSION = 4.20.0 +MFT_REVISION = 34 export MFT_VERSION MFT_REVISION From ab0930313b34aa37819b4a5a325ed8b2f633e028 Mon Sep 17 00:00:00 2001 From: davidpil2002 <91657985+davidpil2002@users.noreply.github.com> Date: Sun, 29 May 2022 13:54:51 +0300 Subject: [PATCH 362/817] [YANG] Add support for Password Hardening (#10322) - Why I did it Yang Model about password hardening feature, the sonic CLI of this feature was autogenerated from this Yang model - How I did it Create new Yang model in src/sonic-yang-models/yang-models/sonic-passwh.yang. - How to verify it There are unitests(yang test) in this P.R covering all the passwords policies with good and bad values cases. Or is possible manually using the config/show password commands that were autogenerated from this Yang model. (this CLI code added in sonic-utilities) --- files/build_templates/init_cfg.json.j2 | 14 ++ src/sonic-yang-models/doc/Configuration.md | 35 +++++ src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 15 ++ .../tests/password_hardening.json | 32 ++++ .../tests_config/password_hardening.json | 146 ++++++++++++++++++ .../yang-models/sonic-passwh.yang | 76 +++++++++ 7 files changed, 319 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/password_hardening.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/password_hardening.json create mode 100755 src/sonic-yang-models/yang-models/sonic-passwh.yang diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index 5d44b0a64b9d..a197c22a9020 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -91,5 +91,19 @@ "rate_limit_interval" : "600" }{%if not loop.last %},{% endif -%} {% endfor %} + }, + "PASSW_HARDENING": { + "POLICIES":{ + "state": "disabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": "true", + "lower_class": "true", + "upper_class": "true", + "digits_class": "true", + "special_class": "true" + } } } diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 47ccb2a3e4ee..3d5bf91db542 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -51,6 +51,7 @@ Table of Contents * [VLAN_MEMBER](#vlan_member) * [Virtual router](#virtual-router) * [WRED_PROFILE](#wred_profile) + * [PASSWORD_HARDENING](#password_hardening) * [For Developers](#for-developers) * [Generating Application Config by Jinja2 Template](#generating-application-config-by-jinja2-template) * [Incremental Configuration by Subscribing to ConfigDB](#incremental-configuration-by-subscribing-to-configdb) @@ -1506,6 +1507,40 @@ The packet action could be: } } ``` +### PASSWORD_HARDENING + +Password Hardening, a user password is the key credential used in order to verify the user accessing the switch and acts as the first line of defense in regards to securing the switch. PASSWORD_HARDENING - support the enforce strong policies. + +- state - Enable/Disable password hardening feature +- len_min - The minimum length of the PW should be subject to a user change. +- expiration - PW Age Change Once a PW change takes place - the DB record for said PW is updated with the new PW value and a fresh new age (=0). +- expiration_warning - The switch will provide a warning for PW change before and (this is to allow a sufficient warning for upgrading the PW which might be relevant to numerous switches). +- history_cnt - remember last passwords, and reject to use the old passw +- reject_user_passw_match - reject to set same username and passw +- PW classes - are the type of characters the user is required to enter when setting/updating a PW. +There are 4 classes + - lower_class - Small characters - a-z + - upper_class - Big characters - A-Z + - digits_class -Numbers - 0-9 + - special_class - Special Characters `~!@#$%^&*()-_+=|[{}];:',<.>/? and white space +``` +{ +"PASSW_HARDENING": { + "POLICIES": { + "state": "disabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": "true", + "lower_class": "true", + "upper_class": "true", + "digits_class": "true", + "special_class": "true" + } + } +} +``` ### BREAKOUT_CFG diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 52cf020f4491..3dfdde1cef89 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -114,6 +114,7 @@ def run(self): './yang-models/sonic-ntp.yang', './yang-models/sonic-nat.yang', './yang-models/sonic-nvgre-tunnel.yang', + './yang-models/sonic-passwh.yang', './yang-models/sonic-pbh.yang', './yang-models/sonic-port.yang', './yang-models/sonic-policer.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index d6a4e8f2a9ee..9be6d29e8922 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1792,6 +1792,21 @@ } }, + "PASSW_HARDENING": { + "POLICIES": { + "state": "enabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": "true", + "digits_class": "true", + "lower_class": "true", + "special_class": "true", + "upper_class": "true" + } + }, + "MACSEC_PROFILE": { "test": { "priority": "64", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/password_hardening.json b/src/sonic-yang-models/tests/yang_model_tests/tests/password_hardening.json new file mode 100644 index 000000000000..4bcde92849f1 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/password_hardening.json @@ -0,0 +1,32 @@ +{ + "PASSWORD_TABLE": { + "desc": "Configure policer with all default fields." + }, + "PASSWORD_ENABLE_FEATURE_WITH_POLICIES": { + "desc": "Configure password policies and enabled feature." + }, + "PASSWORD_BAD_ENABLE_FEATURE": { + "desc": "Configure password policies enabled feature with a wrong value.", + "eStrKey" : "InvalidValue" + }, + "PASSWORD_BAD_DIGIT": { + "desc": "Configure password Digit Class policy with invalid value", + "eStrKey" : "InvalidValue" + }, + "PASSWORD_BAD_HISTORY_CNT": { + "desc": "Configure password history_cnt with out of range value", + "eStrKey" : "InvalidValue" + }, + "PASSWORD_BAD_LEN_MIN": { + "desc": "Configure password len-min with out of range value", + "eStrKey" : "Pattern" + }, + "PASSWORD_BAD_EXPIRATION": { + "desc": "Configure password expiration with out of range value", + "eStrKey" : "Pattern" + }, + "PASSWORD_BAD_EXPIRATION_WARN": { + "desc": "Configure password expiration-warning with out of range value", + "eStrKey" : "Pattern" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/password_hardening.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/password_hardening.json new file mode 100644 index 000000000000..0b7eb5a3cb40 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/password_hardening.json @@ -0,0 +1,146 @@ +{ + "PASSWORD_TABLE": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "disabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_ENABLE_FEATURE_WITH_POLICIES": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_BAD_ENABLE_FEATURE": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "33", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_BAD_DIGIT": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "disabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": "1", + "special_class": true + } + } + } + }, + "PASSWORD_BAD_HISTORY_CNT": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "300", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_BAD_LEN_MIN": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "50", + "len_min": "50", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_BAD_EXPIRATION": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "400", + "expiration_warning": "15", + "history_cnt": "50", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + }, + "PASSWORD_BAD_EXPIRATION_WARN": { + "sonic-passwh:sonic-passwh": { + "sonic-passwh:PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "180", + "expiration_warning": "40", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": true, + "lower_class": true, + "upper_class": true, + "digits_class": true, + "special_class": true + } + } + } + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-passwh.yang b/src/sonic-yang-models/yang-models/sonic-passwh.yang new file mode 100755 index 000000000000..8814bc2e5a29 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-passwh.yang @@ -0,0 +1,76 @@ +module sonic-passwh { + yang-version 1.1; + namespace "http://github.com/Azure/sonic-passwh"; + prefix password; + + description "PASSWORD HARDENING YANG Module for SONiC OS"; + + revision 2022-05-03 { + description "First Revision"; + } + + container sonic-passwh { + + typedef feature_state { + type enumeration { + enum enabled; + enum disabled; + } + } + + container PASSW_HARDENING { + 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)"; + 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 */ From ed27eff71fe4bff53fce995a52c45b56362ab340 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Sun, 29 May 2022 18:21:03 -0700 Subject: [PATCH 363/817] [swss] advance sonic-swss submodule head (#10959) * 910bfd4 2022-05-28 | [ACL] Add default action_list for default ACL table type (#2298) (github/master) [bingwang-ms] * 4d6fa42 2022-05-27 | [ci] Change artifact reference pipeline to common lib pipeline. (#2294) [Shilong Liu] * 583236f 2022-05-26 | [P4Orch] Lazy UDF match creation to avoid failure during warm reboot (#2282) [Yilan Ji] * d7b5ff7 2022-05-26 | [ci] Use correct branch when downloading artifact. (#2292) [Shilong Liu] * 2f13244 2022-05-26 | [ci] Improve azp trigger settings to automaticlly support new release branch. (#2289) [Shilong Liu] Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 0e5e7ba5cb55..910bfd4d1778 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 0e5e7ba5cb5581c1ea4d470216cf3aadcd19fb94 +Subproject commit 910bfd4d17782a059daf2d81deb87673ae6ca58e From b9ecaa32349c0cd6f91aec3a294f3282279bb0af Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 30 May 2022 12:06:32 +0800 Subject: [PATCH 364/817] [Build]: Support to use the base image version when a package version not specified (#10971) Why I did it It is to fix issue: #10952 [Build]: Support to use the base image version when a package version not specified --- .../scripts/buildinfo_base.sh | 53 +++++++++++++++++++ .../scripts/pre_run_buildinfo | 1 + 2 files changed, 54 insertions(+) diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index e1ef80b01162..ff249dfdfb91 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -264,6 +264,59 @@ release_apt_installation_lock() rm -f $DPKG_INSTALLTION_LOCK_FILE } +update_preference_deb() +{ + local version_file="$VERSION_PATH/versions-deb" + if [ -f "$version_file" ]; then + rm -f $VERSION_DEB_PREFERENCE + for pacakge_version in $(cat "$version_file"); do + package=$(echo $pacakge_version | awk -F"==" '{print $1}') + version=$(echo $pacakge_version | awk -F"==" '{print $2}') + echo -e "Package: $package\nPin: version $version\nPin-Priority: 999\n\n" >> $VERSION_DEB_PREFERENCE + done + fi +} + +update_version_file() +{ + local version_name=$1 + local pre_version_file="$(ls $PRE_VERSION_PATH/${version_name}-* 2>/dev/null | head -n 1)" + local version_file="$VERSION_PATH/$1" + if [ ! -f "$pre_version_file" ]; then + return 0 + fi + local pacakge_versions="$(cat $pre_version_file)" + [ -f "$version_file" ] && pacakge_versions="$pacakge_versions $(cat $version_file)" + declare -A versions + for pacakge_version in $pacakge_versions; do + package=$(echo $pacakge_version | awk -F"==" '{print $1}') + version=$(echo $pacakge_version | awk -F"==" '{print $2}') + if [ -z "$package" ] || [ -z "$version" ]; then + continue + fi + versions[$package]=$version + done + + tmp_file=$(mktemp) + for package in "${!versions[@]}"; do + echo "$package==${versions[$package]}" >> $tmp_file + done + sort -u $tmp_file > $version_file + rm -f $tmp_file + + if [[ "${version_name}" == *-deb ]]; then + update_preference_deb + fi +} + +update_version_files() +{ + local version_names="versions-deb versions-py2 versions-py3" + for version_name in $version_names; do + update_version_file $version_name + done +} + ENABLE_VERSION_CONTROL_DEB=$(check_version_control "deb") ENABLE_VERSION_CONTROL_PY2=$(check_version_control "py2") ENABLE_VERSION_CONTROL_PY3=$(check_version_control "py3") diff --git a/src/sonic-build-hooks/scripts/pre_run_buildinfo b/src/sonic-build-hooks/scripts/pre_run_buildinfo index d9b927ab42f9..5a8f00b55ecb 100755 --- a/src/sonic-build-hooks/scripts/pre_run_buildinfo +++ b/src/sonic-build-hooks/scripts/pre_run_buildinfo @@ -11,6 +11,7 @@ mkdir -p $LOG_PATH [ -d $POST_VERSION_PATH ] && rm -rf $POST_VERSION_PATH mkdir -p $POST_VERSION_PATH collect_version_files $PRE_VERSION_PATH +update_version_files symlink_build_hooks set_reproducible_mirrors From b3e33d4f45d80ae0002bb80c2d9aad4e3cd381cc Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Sun, 29 May 2022 22:53:46 -0700 Subject: [PATCH 365/817] [sonic-linkmgrd][master] submodule updates (#10925) [sonic-linkmgrd][master] submodule updates d744bfb Longxiang Lyu Wed May 25 08:40:42 2022 +0800 Support switch between using wellknown mac or server mac addr (#73) 684e989 Jing Zhang Wed May 18 09:59:02 2022 -0700 Avoid switching active when LinkState == Down (#77) e4aa4fd Longxiang Lyu Tue May 17 09:13:23 2022 +0800 [Makefile] Remove redundant optimization options (#75) 4ec7505 Jing Zhang Thu May 12 08:19:20 2022 -0700 [ci]: uplift diff coverage threshold to 80% (#71) sign-off: Jing Zhang zhangjing@microsoft.com --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index df5132254e10..d744bfb4a694 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit df5132254e104343d099da3b95eaf1336ac485cd +Subproject commit d744bfb4a6947cacfde744fc73550a7b99d8e0c8 From 650b00e41ee4b489b2a8ebf627afdd029688de64 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 30 May 2022 16:02:27 +0800 Subject: [PATCH 366/817] [ci] Publish logs when building image job is canceled by timeout. (#10919) --- .azure-pipelines/azure-pipelines-image-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index ae103ed28868..9df0b3ffa6ef 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -55,7 +55,7 @@ jobs: artifact: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' displayName: "Archive sonic image" - publish: $(Build.ArtifactStagingDirectory) - condition: failed() + condition: or(failed(), canceled()) artifact: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)$(System.JobAttempt)' displayName: "Archive failed sonic image" - ${{ if ne(variables['Build.Reason'], 'PullRequest') }}: From 73c5ac11eea0752298c4ad1c3639efd5940c79fc Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Mon, 30 May 2022 01:25:51 -0700 Subject: [PATCH 367/817] [CODEOWNERS]: update code owners for various repos (#10980) Signed-off-by: Guohan Lu --- .github/CODEOWNERS | 74 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6482f6837d16..5a3aad7b8f69 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -19,6 +19,9 @@ /Makefile.work @qiluo-msft @xumia @lguohan /slave.mk @qiluo-msft @xumia @lguohan /scripts @qiluo-msft @xumia @lguohan +/src/sonic-build-hooks/ @Azure/sonic-build +/src/debootstrap/ @Azure/sonic-build +/src/sonic-fips/ @Azure/sonic-build # installer /installer/ @qiluo-msft @@ -31,8 +34,77 @@ /dockers/docker-config-engine*/ @qiluo-msft /dockers/docker-snmp/ @qiluo-msft -# src +# kernel +/src/sonic-linux-kernel/ @Azure/sonic-kernel + +# devices +/device/ @Azure/sonic-platform +/src/sonic-platform-common/ @Azure/sonic-platform +/src/sonic-platform-daemons/ @Azure/sonic-platform +/src/sonic-platform-pde/ @Azure/sonic-platform +/src/lm-sensors/ @Azure/sonic-platform +/src/flashrom/ @Azure/sonic-platform + +# common library /src/initramfs-tools/ @qiluo-msft +/src/redis-dump-load/ @Azure/sonic-management +/src/sonic-py-common/ @Azure/sonic-management +/src/sonic-py-swsssdk/ @Azure/sonic-management +/src/sonic-swss-common/ @Azure/sonic-management +/src/bash/ @Azure/sonic-management +/src/tacacs/ @Azure/sonic-management +/src/radius/ @Azure/sonic-management +/src/swig/ @Azure/sonic-management +/src/socat/ @Azure/sonic-management + +# redis +/src/redis/ @Azure/sonic-management +/src/hiredis/ @Azure/sonic-management # yang /src/sonic-yang-models/ @praveen-li @dgsudharsan @rathnasabapathyv @venkatmahalingam @qiluo-msft +/src/sonic-yang-mgmt/ @Azure/sonic-management +/src/libyang/ @Azure/sonic-management +/src/libyang1/ @Azure/sonic-management +/src/libyang2/ @Azure/sonic-management + +# bgpcfgd +/src/sonic-bgpcfgd/ @StormLiangMS + +# sonic-config-engine +/src/sonic-config-engine/ @Azure/sonic-management + +# sonic-utilities +/src/sonic-utilities/ @Azure/sonic-management + +# sonic-telemetry +/src/sonic-telemetry/ @Azure/sonic-management + +# snmp +/src/sonic-snmpagent/ @Azure/sonic-management +/src/snmpd/ @Azure/sonic-management + +# dhcp relay +/src/dhcp6relay/ @Azure/sonic-fundamentals +/src/dhcpmon/ @Azure/sonic-fundamentals +/src/isc-dhcp/ @Azure/sonic-fundamentals + +# sflow +/src/sflow/ @Azure/sonic-dataplane + +# sonic restapi +/src/sonic-restapi/ @Azure/sonic-dataplane + +# sonic swss +/src/sonic-swss/ @Azure/sonic-dataplane + +# linux networking, e.g., libnl3, iproute2, ifupdown2, ethtool +/src/libnl3/ @Azure/sonic-dataplane +/src/iproute2/ @Azure/sonic-dataplane +/src/ifupdown2/ @Azure/sonic-dataplane +/src/ethtool/ @Azure/sonic-dataplane + +# ptf +/src/ptf/ @Azure/sonic-fundamentals +/src/ptf-py3/ @Azure/sonic-fundamentals +/src/scapy/ @Azure/sonic-fundamentals From 5072315c897ad5681ad23774a62ca2e08f8fdb78 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 30 May 2022 16:50:06 +0800 Subject: [PATCH 368/817] [Ci]: Fix the target directory not empty issue when publishing artifacts #10972 Why I did it Fix the target directory not empty issue when publishing artifacts. Some of the artifacts are published to $(Build.ArtifactStagingDirectory)/target/ before source code checked out. --- .azure-pipelines/azure-pipelines-image-template.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 9df0b3ffa6ef..6a9c2790572f 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -48,7 +48,9 @@ jobs: ENABLE_DOCKER_BASE_PULL=y make PLATFORM=$(PLATFORM_AZP) PLATFORM_ARCH=$(PLATFORM_ARCH) $(BUILD_OPTIONS) configure displayName: 'Make configure' postSteps: - - script: mv target $(Build.ArtifactStagingDirectory)/ + - script: | + mkdir -p $(Build.ArtifactStagingDirectory)/target + mv target/* $(Build.ArtifactStagingDirectory)/target/ displayName: Copy Artifacts condition: always() - publish: $(Build.ArtifactStagingDirectory) From 912923f47b4de90341047dd4da4946cf24ddc567 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 30 May 2022 13:34:55 -0700 Subject: [PATCH 369/817] [Arista] Update supervisor configurations (#10913) * Removed unused default_config.json * Remove asic.conf file from HW SKUs directories as they are not used by upstream code * Enable dynamic PCI ID identification on Otterlake2 Co-authored-by: Maxime Lorrillere --- .../Arista-7804R3-FM/0/default_config.json | 14 -------------- .../Arista-7804R3-FM/1/default_config.json | 14 -------------- .../Arista-7804R3-FM/10/default_config.json | 14 -------------- .../Arista-7804R3-FM/11/default_config.json | 14 -------------- .../Arista-7804R3-FM/2/default_config.json | 14 -------------- .../Arista-7804R3-FM/3/default_config.json | 14 -------------- .../Arista-7804R3-FM/4/default_config.json | 14 -------------- .../Arista-7804R3-FM/5/default_config.json | 14 -------------- .../Arista-7804R3-FM/6/default_config.json | 14 -------------- .../Arista-7804R3-FM/7/default_config.json | 14 -------------- .../Arista-7804R3-FM/8/default_config.json | 14 -------------- .../Arista-7804R3-FM/9/default_config.json | 14 -------------- .../Arista-7804R3-FM/asic.conf | 2 -- .../Arista-7808R3-FM/0/default_config.json | 14 -------------- .../Arista-7808R3-FM/1/default_config.json | 14 -------------- .../Arista-7808R3-FM/10/default_config.json | 14 -------------- .../Arista-7808R3-FM/11/default_config.json | 14 -------------- .../Arista-7808R3-FM/12/default_config.json | 14 -------------- .../Arista-7808R3-FM/13/default_config.json | 14 -------------- .../Arista-7808R3-FM/14/default_config.json | 14 -------------- .../Arista-7808R3-FM/15/default_config.json | 14 -------------- .../Arista-7808R3-FM/16/default_config.json | 14 -------------- .../Arista-7808R3-FM/17/default_config.json | 14 -------------- .../Arista-7808R3-FM/2/default_config.json | 14 -------------- .../Arista-7808R3-FM/3/default_config.json | 14 -------------- .../Arista-7808R3-FM/4/default_config.json | 14 -------------- .../Arista-7808R3-FM/5/default_config.json | 14 -------------- .../Arista-7808R3-FM/6/default_config.json | 14 -------------- .../Arista-7808R3-FM/7/default_config.json | 14 -------------- .../Arista-7808R3-FM/8/default_config.json | 14 -------------- .../Arista-7808R3-FM/9/default_config.json | 14 -------------- .../Arista-7808R3-FM/asic.conf | 2 -- .../Arista-7808R3A-FM/0/default_config.json | 14 -------------- .../Arista-7808R3A-FM/1/default_config.json | 14 -------------- .../Arista-7808R3A-FM/10/default_config.json | 14 -------------- .../Arista-7808R3A-FM/11/default_config.json | 14 -------------- .../Arista-7808R3A-FM/2/default_config.json | 14 -------------- .../Arista-7808R3A-FM/3/default_config.json | 14 -------------- .../Arista-7808R3A-FM/4/default_config.json | 14 -------------- .../Arista-7808R3A-FM/5/default_config.json | 14 -------------- .../Arista-7808R3A-FM/6/default_config.json | 14 -------------- .../Arista-7808R3A-FM/7/default_config.json | 14 -------------- .../Arista-7808R3A-FM/8/default_config.json | 14 -------------- .../Arista-7808R3A-FM/9/default_config.json | 14 -------------- .../Arista-7808R3A-FM/asic.conf | 2 -- .../x86_64-arista_7800_sup/use_pci_id_chassis | 0 .../default_config.json | 8 -------- 47 files changed, 602 deletions(-) delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/asic.conf delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/asic.conf delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/default_config.json delete mode 100644 device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/asic.conf create mode 100644 device/arista/x86_64-arista_7800_sup/use_pci_id_chassis delete mode 100644 device/arista/x86_64-arista_7800r3_48cq2_lc/default_config.json diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/default_config.json deleted file mode 100644 index 9e5c1c472d7d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon1", - "switch_id": "300", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "09:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/default_config.json deleted file mode 100644 index 8113f6c1e6db..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon2", - "switch_id": "301", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "10:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/default_config.json deleted file mode 100644 index 94fe59532c63..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon11", - "switch_id": "310", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3b:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/default_config.json deleted file mode 100644 index 3fea7772b027..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon12", - "switch_id": "311", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "42:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/default_config.json deleted file mode 100644 index 861b946ff979..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon3", - "switch_id": "302", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "13:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/default_config.json deleted file mode 100644 index a601e1e0013f..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon4", - "switch_id": "303", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1a:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/default_config.json deleted file mode 100644 index 6aabfc6f325d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon5", - "switch_id": "304", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1d:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/default_config.json deleted file mode 100644 index 9a87905ec1c4..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon6", - "switch_id": "305", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "24:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/default_config.json deleted file mode 100644 index fd6e92231403..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon7", - "switch_id": "306", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "27:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/default_config.json deleted file mode 100644 index f0b41732e27c..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon8", - "switch_id": "307", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "2e:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/default_config.json deleted file mode 100644 index 3dfbe68c5260..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon9", - "switch_id": "308", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "31:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/default_config.json deleted file mode 100644 index e323ec82a29d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon10", - "switch_id": "309", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "38:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/asic.conf b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/asic.conf deleted file mode 100644 index e1e6faadb80b..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/asic.conf +++ /dev/null @@ -1,2 +0,0 @@ -NUM_ASIC=12 -SYS_DMA_SIZE=512 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/default_config.json deleted file mode 100644 index 9e5c1c472d7d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon1", - "switch_id": "300", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "09:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/default_config.json deleted file mode 100644 index 09870ad1b829..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon2", - "switch_id": "301", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "0b:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/default_config.json deleted file mode 100644 index f10addbcda34..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon11", - "switch_id": "310", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "29:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/default_config.json deleted file mode 100644 index 779fd99d457d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon12", - "switch_id": "311", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "2a:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/default_config.json deleted file mode 100644 index 1433edafb7d5..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon13", - "switch_id": "312", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "31:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/default_config.json deleted file mode 100644 index 189497914a6a..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon14", - "switch_id": "313", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "33:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/default_config.json deleted file mode 100644 index b427698ea7e6..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon15", - "switch_id": "314", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "34:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/default_config.json deleted file mode 100644 index 8bcaaa65df0e..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon16", - "switch_id": "315", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3b:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/default_config.json deleted file mode 100644 index f93ae4f6e398..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon17", - "switch_id": "316", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3d:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/default_config.json deleted file mode 100644 index 7f22591dd367..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon18", - "switch_id": "317", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3e:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/default_config.json deleted file mode 100644 index 9f1e3753011f..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon3", - "switch_id": "302", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "0c:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/default_config.json deleted file mode 100644 index 879b2ea5813c..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon4", - "switch_id": "303", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "13:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/default_config.json deleted file mode 100644 index 02ba5d98fea6..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon5", - "switch_id": "304", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "15:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/default_config.json deleted file mode 100644 index 8811a3c21580..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon6", - "switch_id": "305", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "16:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/default_config.json deleted file mode 100644 index 99af78444fa3..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon7", - "switch_id": "306", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1d:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/default_config.json deleted file mode 100644 index 851c269035c2..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon8", - "switch_id": "307", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1f:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/default_config.json deleted file mode 100644 index 45539ac34a78..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon9", - "switch_id": "308", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "20:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/default_config.json deleted file mode 100644 index 1e353321c405..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon10", - "switch_id": "309", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "27:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/asic.conf b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/asic.conf deleted file mode 100644 index c5317c37721e..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/asic.conf +++ /dev/null @@ -1,2 +0,0 @@ -NUM_ASIC=18 -SYS_DMA_SIZE=512 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/default_config.json deleted file mode 100644 index 9e5c1c472d7d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon1", - "switch_id": "300", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "09:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/default_config.json deleted file mode 100644 index 09870ad1b829..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon2", - "switch_id": "301", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "0b:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/default_config.json deleted file mode 100644 index 94fe59532c63..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon11", - "switch_id": "310", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3b:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/default_config.json deleted file mode 100644 index df58c1860e7c..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon12", - "switch_id": "311", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "3d:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/default_config.json deleted file mode 100644 index 861b946ff979..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon3", - "switch_id": "302", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "13:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/default_config.json deleted file mode 100644 index bc4ffa8940d2..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon4", - "switch_id": "303", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "15:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/default_config.json deleted file mode 100644 index 6aabfc6f325d..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon5", - "switch_id": "304", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1d:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/default_config.json deleted file mode 100644 index c38256698e86..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon6", - "switch_id": "305", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "1f:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/default_config.json deleted file mode 100644 index fd6e92231403..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon7", - "switch_id": "306", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "27:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/default_config.json deleted file mode 100644 index 4620bb0f0a76..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon8", - "switch_id": "307", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "29:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/default_config.json deleted file mode 100644 index 3dfbe68c5260..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon9", - "switch_id": "308", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "31:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/default_config.json b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/default_config.json deleted file mode 100644 index 16c3ff70f18f..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/default_config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "instance_name": "Ramon10", - "switch_id": "309", - "switch_type": "fabric", - "chassis_db_address" : "240.127.1.1", - "start_chassis_db" : "1", - "connect_to_chassis_db" : "1", - "sub_role" : "None", - "asic_id" : "33:00.0" - } - } -} diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/asic.conf b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/asic.conf deleted file mode 100644 index e1e6faadb80b..000000000000 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/asic.conf +++ /dev/null @@ -1,2 +0,0 @@ -NUM_ASIC=12 -SYS_DMA_SIZE=512 diff --git a/device/arista/x86_64-arista_7800_sup/use_pci_id_chassis b/device/arista/x86_64-arista_7800_sup/use_pci_id_chassis new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/default_config.json b/device/arista/x86_64-arista_7800r3_48cq2_lc/default_config.json deleted file mode 100644 index cda3ef93b03c..000000000000 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/default_config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DEVICE_METADATA": { - "localhost": { - "chassis_db_address" : "127.100.1.1", - "connect_to_chassis_db" : "1" - } - } -} From 8c1ded61b05d608c6fce3a7af44b400b62a76016 Mon Sep 17 00:00:00 2001 From: Eric Zhu <79439153+cel-eric@users.noreply.github.com> Date: Tue, 31 May 2022 10:54:55 +0800 Subject: [PATCH 370/817] [SONiC-CEL]: fix platform fancontrol testcase failure issue (#10934) --- .../services/fancontrol/fancontrol | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-cel/services/fancontrol/fancontrol b/platform/broadcom/sonic-platform-modules-cel/services/fancontrol/fancontrol index da32acedd2f9..e625ce9a921e 100755 --- a/platform/broadcom/sonic-platform-modules-cel/services/fancontrol/fancontrol +++ b/platform/broadcom/sonic-platform-modules-cel/services/fancontrol/fancontrol @@ -348,8 +348,12 @@ CheckFiles || exit 1 if [ -f "$PIDFILE" ] then - echo "File $PIDFILE exists, is fancontrol already running?" >&2 - exit 1 + # Test if process is really running, if not, no need to exit + if ps -p $(echo $PIDFILE) > /dev/null + then + echo "File $PIDFILE exists, is fancontrol already running?" >&2 + exit 1 + fi fi echo $$ > "$PIDFILE" From bd91b2eef3644e5b58ac0f06a0b62ea0b3000910 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Tue, 31 May 2022 09:24:18 +0300 Subject: [PATCH 371/817] [asan] add debug package for asan-enabled containers (#10953) This is to improve the readability of ASAN reports. The debug package adds function names and source code references to the backtrace (currently, there are only binary addresses of functions) Another way to address this issue is to build the image with "INSTALL_DEBUG_TOOLS=y". The downside of this approach is that the image size and compilation time are unnecessarily big. Also, the idea is to make the "ENABLE_ASAN" self-sufficient, which would not be the case for this approach. - Why I did it To improve the readability of asan logs. - How I did it Added SYNCD_DBG and SWSS_DBG to corresponding docker images for ASAN_ENABLE=y build - How to verify it Add artificial memory leak Build with ASAN_ENABLE=y Test the image and check the ASAN report Signed-off-by: Yakiv Huryk --- platform/mellanox/docker-syncd-mlnx.mk | 4 ++++ rules/docker-orchagent.mk | 4 ++++ rules/syncd.mk | 2 -- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 1328d0e0d0dd..37ffe1203f7d 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -21,6 +21,10 @@ include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(MFT) +ifeq ($(ENABLE_ASAN), y) +$(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD_DBG) +endif + $(DOCKER_SYNCD_BASE)_FILES += $(ISSU_VERSION_FILE) $(DOCKER_SYNCD_BASE)_DBG_DEPENDS += $(SYNCD_DBG) \ diff --git a/rules/docker-orchagent.mk b/rules/docker-orchagent.mk index 917fe0b13661..fed461290f4b 100644 --- a/rules/docker-orchagent.mk +++ b/rules/docker-orchagent.mk @@ -6,6 +6,10 @@ DOCKER_ORCHAGENT_DBG = $(DOCKER_ORCHAGENT_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS) +ifeq ($(ENABLE_ASAN), y) +$(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS_DBG) +endif + $(DOCKER_ORCHAGENT)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_DEPENDS) $(DOCKER_ORCHAGENT)_DBG_DEPENDS += $(SWSS_DBG) \ $(LIBSWSSCOMMON_DBG) \ diff --git a/rules/syncd.mk b/rules/syncd.mk index 595e04671c30..2b7007d84d5b 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -21,12 +21,10 @@ $(SYNCD)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBTHRIFT_DEV) $(SYNCD)_DPKG_TARGET = binary-syncd-rpc endif -ifeq ($(INSTALL_DEBUG_TOOLS), y) SYNCD_DBG = syncd-dbg_1.0.0_$(CONFIGURED_ARCH).deb $(SYNCD_DBG)_DEPENDS += $(SYNCD) $(SYNCD_DBG)_RDEPENDS += $(SYNCD) $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_DBG))) -endif ifeq ($(ENABLE_SYNCD_RPC),y) SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_$(CONFIGURED_ARCH).deb From 7306d684113bd8dea8221433ee3ad74a78162c48 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Tue, 31 May 2022 11:15:44 +0300 Subject: [PATCH 372/817] [build][asan] make dpkg cache asan-aware (#10750) Currently, the build with ASAN_ENABLE=y reuses the packages built with ASAN_ENABLE=n (and vice versa). To address this issue, ASAN_ENABLE is added to DEP_FLAGS for asan-enabled packages (docker-syncd-mlnx, syncd, docker-orchagent, swss). - Why I did it To make dpkg cache use/rebuild the packages for ASAN_ENABLE=y/n. - How I did it Added ASAN_ENABLE to the DEP_FLAGS for asan-enabled packages. - How to verify it Built with ASAN_ENABLE=y/n and checked the .flags .log files. Signed-off-by: Yakiv Huryk --- platform/mellanox/docker-syncd-mlnx.dep | 2 +- rules/docker-orchagent.dep | 2 +- rules/swss.dep | 2 +- rules/syncd.dep | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx.dep b/platform/mellanox/docker-syncd-mlnx.dep index 659b09cec8f4..8f2ab723dd5c 100644 --- a/platform/mellanox/docker-syncd-mlnx.dep +++ b/platform/mellanox/docker-syncd-mlnx.dep @@ -6,7 +6,7 @@ DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) DEP_FILES += $(shell git ls-files -- $(DPATH)) $(DOCKER_SYNCD_BASE)_CACHE_MODE := GIT_CONTENT_SHA -$(DOCKER_SYNCD_BASE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_SYNCD_BASE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(ENABLE_ASAN) $(DOCKER_SYNCD_BASE)_DEP_FILES := $(DEP_FILES) $(eval $(call add_dbg_docker,$(DOCKER_SYNCD_BASE),$(DOCKER_SYNCD_BASE_DBG))) diff --git a/rules/docker-orchagent.dep b/rules/docker-orchagent.dep index 7aff4d0d9f23..a5fc67a65aa2 100644 --- a/rules/docker-orchagent.dep +++ b/rules/docker-orchagent.dep @@ -5,7 +5,7 @@ DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) DEP_FILES += $(shell git ls-files $(DPATH)) $(DOCKER_ORCHAGENT)_CACHE_MODE := GIT_CONTENT_SHA -$(DOCKER_ORCHAGENT)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_ORCHAGENT)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(ENABLE_ASAN) $(DOCKER_ORCHAGENT)_DEP_FILES := $(DEP_FILES) $(eval $(call add_dbg_docker,$(DOCKER_ORCHAGENT),$(DOCKER_ORCHAGENT_DBG))) diff --git a/rules/swss.dep b/rules/swss.dep index e57a9e7a6314..784d2ddd951e 100644 --- a/rules/swss.dep +++ b/rules/swss.dep @@ -5,7 +5,7 @@ DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) $(SWSS)_CACHE_MODE := GIT_CONTENT_SHA -$(SWSS)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SWSS)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(ENABLE_ASAN) $(SWSS)_DEP_FILES := $(DEP_FILES) $(SWSS)_SMDEP_FILES := $(SMDEP_FILES) $(SWSS)_SMDEP_PATHS := $(SPATH) diff --git a/rules/syncd.dep b/rules/syncd.dep index d9f40a8a0210..fe0706ff9754 100644 --- a/rules/syncd.dep +++ b/rules/syncd.dep @@ -12,7 +12,7 @@ $(foreach path, $(SMDEP_PATHS), $(eval $(path) :=$(filter-out $(SMDEP_PATHS),$(a $(SYNCD)_CACHE_MODE := GIT_CONTENT_SHA -$(SYNCD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SYNCD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(ENABLE_ASAN) $(SYNCD)_DEP_FILES := $(DEP_FILES) $(SYNCD)_SMDEP_FILES := $(foreach path, $(SMDEP_PATHS), $($(path))) $(SYNCD)_SMDEP_PATHS := $(SMDEP_PATHS) From c9b27cde718de66e47d2bb82449ccfd3e052f7e8 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Tue, 31 May 2022 17:54:31 +0200 Subject: [PATCH 373/817] [swss] Clear VXLAN tunnel table from State DB on startup (#10822) * When reloading config after crashes, VTEP interfaces are sometimes not created since the tunnel still exists in the STATE_DB. * Adding VXLAN_TUNNEL_TABLE to the list of tables to be cleaned in swss.sh fixes the problem. --- files/scripts/swss.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 40acaa33c573..000790c6d051 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -176,7 +176,7 @@ start() { $SONIC_DB_CLI GB_ASIC_DB FLUSHDB $SONIC_DB_CLI GB_COUNTERS_DB FLUSHDB $SONIC_DB_CLI RESTAPI_DB FLUSHDB - clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*'" + clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*'" $SONIC_DB_CLI APPL_STATE_DB FLUSHDB fi From b4bc05126716ffe500086d199114ff8270d8c858 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Tue, 31 May 2022 12:59:52 -0400 Subject: [PATCH 374/817] Add logging for slave container builds (#10628) #### Why I did it No logs currently exist for sonic-save-X containers which makes it difficult to debug. #### How I did it Altered Makefile.work to create logs in the sonic-slave-X folder while still displaying the log to the screen to prevent interfering with any existing tooling. #### How to verify it Do `make configure` and verify that logs show up in `sonic-slave-buster/` and `sonic-slave-bullseye/` #### Description for the changelog Add logging for slave container builds #### A picture of a cute animal (not mandatory but encouraged) TBD --- .gitignore | 3 +++ Makefile.work | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 49861324aa1d..5f6f41b1a09c 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ target/ *.img *.pyc +# Slave docker log files +sonic-slave*/*.log + # Autogenerated Dockerfiles sonic-slave*/Dockerfile sonic-slave*/Dockerfile.user diff --git a/Makefile.work b/Makefile.work index 9fe410a2ef48..c1a6555cc5bc 100644 --- a/Makefile.work +++ b/Makefile.work @@ -294,12 +294,18 @@ endif endif +SPLIT_LOG = | tee + +DOCKER_BASE_LOG = $(SLAVE_DIR)/$(SLAVE_BASE_IMAGE)_$(SLAVE_BASE_TAG).log +DOCKER_LOG = $(SLAVE_DIR)/$(SLAVE_IMAGE)_$(SLAVE_TAG).log + + DOCKER_BASE_BUILD = docker build --no-cache \ -t $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) \ --build-arg http_proxy=$(http_proxy) \ --build-arg https_proxy=$(https_proxy) \ --build-arg no_proxy=$(no_proxy) \ - $(SLAVE_DIR) + $(SLAVE_DIR) $(SPLIT_LOG) $(DOCKER_BASE_LOG) DOCKER_BASE_PULL = docker pull \ $(REGISTRY_SERVER):$(REGISTRY_PORT)/$(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) @@ -312,7 +318,7 @@ DOCKER_BUILD = docker build --no-cache \ --build-arg slave_base_tag_ref=$(SLAVE_BASE_TAG) \ -t $(SLAVE_IMAGE):$(SLAVE_TAG) \ -f $(SLAVE_DIR)/Dockerfile.user \ - $(SLAVE_DIR) + $(SLAVE_DIR) $(SPLIT_LOG) $(DOCKER_LOG) SONIC_BUILD_INSTRUCTION := make \ -f slave.mk \ From 299e67a318ec65d1d4a060e8386477552cee29a9 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 31 May 2022 13:59:35 -0700 Subject: [PATCH 375/817] [Arista] Update platform library (#10922) - Implement Pcie plugin for chassis - Implement set_admin_status for chassis modules - Fix phy declaration for phy-credo --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 6e6f1f904f28..e4940f0937c1 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 6e6f1f904f28df7fa06c169a71a1d77e739f431a +Subproject commit e4940f0937c1425c5ba8248e524a5d753c223aca diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 6e6f1f904f28..e4940f0937c1 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 6e6f1f904f28df7fa06c169a71a1d77e739f431a +Subproject commit e4940f0937c1425c5ba8248e524a5d753c223aca From 96954f0134cc1b134fdbeac1b51322433d9e2b8a Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 1 Jun 2022 08:05:53 +0800 Subject: [PATCH 376/817] [swsscommon] Add c++ version sonic-db-cli from sonic-swss-common (#10825) #### Why I did it Fix sonic-db-cli high CPU usage on SONiC startup issue: https://github.com/Azure/sonic-buildimage/issues/10218 ETA of this issue will be 2022/05/31 #### How I did it Re-write sonic-cli with c++ in sonic-swss-common: https://github.com/Azure/sonic-swss-common/pull/607 Modify swss-common rules and slave.mk to install c++ version sonic-db-cli. #### How to verify it Pass all E2E test scenario. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 #### Description for the changelog Build and install c++ version sonic-db-cli from swss-common. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- files/build_templates/sonic_debian_extension.j2 | 4 ++++ rules/docker-config-engine-bullseye.mk | 3 ++- rules/docker-config-engine-buster.mk | 3 ++- rules/docker-config-engine-stretch.mk | 4 +++- rules/docker-config-engine.mk | 2 ++ rules/docker-database.mk | 3 +++ rules/swss-common.mk | 3 +++ slave.mk | 1 + src/sonic-swss-common | 2 +- 9 files changed, 21 insertions(+), 4 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 659921d50aa9..fc66c74f8655 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -312,6 +312,10 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noni {% endfor %} {% endif %} +# Install sonic-db-cli +sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/sonic-db-cli_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f + # Install custom-built monit package and SONiC configuration files sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/monit_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f diff --git a/rules/docker-config-engine-bullseye.mk b/rules/docker-config-engine-bullseye.mk index eae426a111df..0c4aad67a8d7 100644 --- a/rules/docker-config-engine-bullseye.mk +++ b/rules/docker-config-engine-bullseye.mk @@ -7,7 +7,8 @@ $(DOCKER_CONFIG_ENGINE_BULLSEYE)_DEPENDS += $(LIBSWSSCOMMON) \ $(LIBYANG) \ $(LIBYANG_CPP) \ $(LIBYANG_PY3) \ - $(PYTHON3_SWSSCOMMON) + $(PYTHON3_SWSSCOMMON) \ + $(SONIC_DB_CLI) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SWSSSDK_PY3) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ diff --git a/rules/docker-config-engine-buster.mk b/rules/docker-config-engine-buster.mk index f3df95c36d74..079fc6dd074c 100644 --- a/rules/docker-config-engine-buster.mk +++ b/rules/docker-config-engine-buster.mk @@ -7,7 +7,8 @@ $(DOCKER_CONFIG_ENGINE_BUSTER)_DEPENDS += $(LIBSWSSCOMMON) \ $(LIBYANG) \ $(LIBYANG_CPP) \ $(LIBYANG_PY3) \ - $(PYTHON3_SWSSCOMMON) + $(PYTHON3_SWSSCOMMON) \ + $(SONIC_DB_CLI) $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SWSSSDK_PY3) $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ diff --git a/rules/docker-config-engine-stretch.mk b/rules/docker-config-engine-stretch.mk index 7e90c1587a9d..8644102abed3 100644 --- a/rules/docker-config-engine-stretch.mk +++ b/rules/docker-config-engine-stretch.mk @@ -2,7 +2,9 @@ DOCKER_CONFIG_ENGINE_STRETCH = docker-config-engine-stretch.gz $(DOCKER_CONFIG_ENGINE_STRETCH)_PATH = $(DOCKERS_PATH)/docker-config-engine-stretch -$(DOCKER_CONFIG_ENGINE_STRETCH)_DEPENDS += $(LIBSWSSCOMMON) $(PYTHON_SWSSCOMMON) +$(DOCKER_CONFIG_ENGINE_STRETCH)_DEPENDS += $(LIBSWSSCOMMON) \ + $(PYTHON_SWSSCOMMON) \ + $(SONIC_DB_CLI) $(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY2) $(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY2) diff --git a/rules/docker-config-engine.mk b/rules/docker-config-engine.mk index 518e73415a6b..3923a970b4d6 100644 --- a/rules/docker-config-engine.mk +++ b/rules/docker-config-engine.mk @@ -2,6 +2,8 @@ DOCKER_CONFIG_ENGINE = docker-config-engine.gz $(DOCKER_CONFIG_ENGINE)_PATH = $(DOCKERS_PATH)/docker-config-engine +$(DOCKER_CONFIG_ENGINE)_DEPENDS += $(LIBSWSSCOMMON) \ + $(SONIC_DB_CLI) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY2) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY2) diff --git a/rules/docker-database.mk b/rules/docker-database.mk index 707adc2d64cb..b66583b9bd2c 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -4,6 +4,9 @@ DOCKER_DATABASE_STEM = docker-database DOCKER_DATABASE = $(DOCKER_DATABASE_STEM).gz DOCKER_DATABASE_DBG = $(DOCKER_DATABASE_STEM)-$(DBG_IMAGE_MARK).gz +$(DOCKER_DATABASE)_DEPENDS += $(LIBSWSSCOMMON) \ + $(SONIC_DB_CLI) + $(DOCKER_DATABASE)_PATH = $(DOCKERS_PATH)/$(DOCKER_DATABASE_STEM) $(DOCKER_DATABASE)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) diff --git a/rules/swss-common.mk b/rules/swss-common.mk index bbc37a8d632f..9ab49b672b6c 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -32,6 +32,9 @@ $(LIBSWSSCOMMON_DBG)_DEPENDS += $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DBG)_RDEPENDS += $(LIBSWSSCOMMON) $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DBG))) +SONIC_DB_CLI = sonic-db-cli_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(SONIC_DB_CLI))) + # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} # are archived into debug one image to facilitate debugging. # diff --git a/slave.mk b/slave.mk index 7b91ba0384c0..c092ea0d2730 100644 --- a/slave.mk +++ b/slave.mk @@ -1048,6 +1048,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(OPENSSH_SERVER) \ $(PYTHON_SWSSCOMMON) \ $(PYTHON3_SWSSCOMMON) \ + $(SONIC_DB_CLI) \ $(SONIC_UTILITIES_DATA) \ $(SONIC_HOST_SERVICES_DATA) \ $(BASH) \ diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 7ae22be4c1bf..33afb9bee18e 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 7ae22be4c1bf8dd7c5f697cdf2faf7317a02ba14 +Subproject commit 33afb9bee18ea116665f231b396cab32258c98d8 From 3eea73cf3fcecfef4c30a8759e7409406b058ab0 Mon Sep 17 00:00:00 2001 From: roman_savchuk Date: Wed, 1 Jun 2022 15:31:41 +0300 Subject: [PATCH 377/817] [BFN] Update BFN sdk to SAI 1.10.2 (#10821) --- platform/barefoot/bfn-platform.mk | 2 +- platform/barefoot/bfn-sai.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/bfn-platform.mk b/platform/barefoot/bfn-platform.mk index f12bbaa8a966..a35795dda6c2 100644 --- a/platform/barefoot/bfn-platform.mk +++ b/platform/barefoot/bfn-platform.mk @@ -1,4 +1,4 @@ -BFN_PLATFORM = bfnplatform_20220408_sai_1.9.1_deb10.deb +BFN_PLATFORM = bfnplatform_20220512_sai_1.10.2_deb10.deb $(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_PLATFORM)" SONIC_ONLINE_DEBS += $(BFN_PLATFORM) diff --git a/platform/barefoot/bfn-sai.mk b/platform/barefoot/bfn-sai.mk index a0a1d2348dea..13f2800c0b9a 100644 --- a/platform/barefoot/bfn-sai.mk +++ b/platform/barefoot/bfn-sai.mk @@ -1,4 +1,4 @@ -BFN_SAI = bfnsdk_20220408_sai_1.9.1_deb10.deb +BFN_SAI = bfnsdk_20220512_sai_1.10.2_deb10.deb $(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_SAI)" $(BFN_SAI)_DEPENDS += $(LIBNL_GENL3_DEV) From 0552d6b1722f51c028b0c69d1b3d54f0b0e4268f Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 2 Jun 2022 15:35:17 +0800 Subject: [PATCH 378/817] Support symcrypt fips config for aboot/uboot (#10729) Why I did it Support symcrypt fips config for aboot/uboot --- build_image.sh | 8 ++++++++ files/Aboot/boot0.j2 | 2 +- installer/arm64/install.sh | 3 +++ installer/armhf/install.sh | 3 +++ platform/centec-arm64/platform.conf | 6 ++++-- platform/marvell-arm64/platform.conf | 2 +- platform/marvell-armhf/platform.conf | 2 +- 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/build_image.sh b/build_image.sh index 71351dbfe7e0..0963ff4a4843 100755 --- a/build_image.sh +++ b/build_image.sh @@ -200,6 +200,14 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then generate_device_list ".platforms_asic" zip -g $OUTPUT_ABOOT_IMAGE .platforms_asic + if [ "$ENABLE_FIPS" = "y" ]; then + echo "sonic_fips=1" > kernel-cmdline + else + echo "sonic_fips=0" > kernel-cmdline + fi + zip -g $OUTPUT_ABOOT_IMAGE kernel-cmdline + rm kernel-cmdline + zip -g $OUTPUT_ABOOT_IMAGE $ABOOT_BOOT_IMAGE rm $ABOOT_BOOT_IMAGE if [ "$SONIC_ENABLE_IMAGE_SIGNATURE" = "y" ]; then diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 5fe64b6884a4..ad7540df0946 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -86,7 +86,7 @@ installer_image_path="$image_path/$installer_image" boot_config="$target_path/boot-config" -cmdline_allowlist="crashkernel hwaddr_ma1" +cmdline_allowlist="crashkernel hwaddr_ma1 sonic_fips" # for backward compatibility with the sonic_upgrade= behavior install="${install:-${sonic_upgrade:-}}" diff --git a/installer/arm64/install.sh b/installer/arm64/install.sh index dee3ceec9038..445b2007faeb 100755 --- a/installer/arm64/install.sh +++ b/installer/arm64/install.sh @@ -181,6 +181,9 @@ if [ "$install_env" = "onie" ]; then fi fi +extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% +echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" + # Update Bootloader Menu with installed image bootloader_menu_config diff --git a/installer/armhf/install.sh b/installer/armhf/install.sh index 9ade40d5149e..0dd6e48a08e7 100755 --- a/installer/armhf/install.sh +++ b/installer/armhf/install.sh @@ -181,6 +181,9 @@ if [ "$install_env" = "onie" ]; then fi fi +extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% +echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" + # Update Bootloader Menu with installed image bootloader_menu_config diff --git a/platform/centec-arm64/platform.conf b/platform/centec-arm64/platform.conf index 39dc4b70239a..09cf9be6e8cc 100755 --- a/platform/centec-arm64/platform.conf +++ b/platform/centec-arm64/platform.conf @@ -16,9 +16,10 @@ mount_partition() { bootloader_menu_config() { if [ "$install_env" = "onie" ]; then + fw_setenv -f linuxargs "${extra_cmdline_linux}" fw_setenv -f nos_bootcmd "test -n \$boot_once && setenv do_boot_once \$boot_once && setenv boot_once && saveenv && run do_boot_once; run boot_next" - fw_setenv -f sonic_image_1 "ext4load mmc 0:1 \$loadaddr \$sonic_dir_1/boot/sonic_arm64.fit && setenv bootargs quiet console=\$consoledev,\$baudrate root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 loopfstype=squashfs loop=\$sonic_dir_1/fs.squashfs systemd.unified_cgroup_hierarchy=0 && bootm \$loadaddr" + fw_setenv -f sonic_image_1 "ext4load mmc 0:1 \$loadaddr \$sonic_dir_1/boot/sonic_arm64.fit && setenv bootargs quiet console=\$consoledev,\$baudrate root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 loopfstype=squashfs loop=\$sonic_dir_1/fs.squashfs systemd.unified_cgroup_hierarchy=0 \${linuxargs} && bootm \$loadaddr" fw_setenv -f sonic_image_2 "NONE" fw_setenv -f sonic_dir_1 $image_dir fw_setenv -f sonic_dir_2 "NONE" @@ -37,9 +38,10 @@ bootloader_menu_config() { fi done + fw_setenv linuxargs "${extra_cmdline_linux}" fw_setenv nos_bootcmd "test -n \$boot_once && setenv do_boot_once \$boot_once && setenv boot_once && saveenv && run do_boot_once; run boot_next" - fw_setenv sonic_image_$idx "ext4load mmc 0:1 \$loadaddr \$sonic_dir_$idx/boot/sonic_arm64.fit && setenv bootargs quiet console=\$consoledev,\$baudrate root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 loopfstype=squashfs loop=\$sonic_dir_$idx/fs.squashfs systemd.unified_cgroup_hierarchy=0 && bootm \$loadaddr" + fw_setenv sonic_image_$idx "ext4load mmc 0:1 \$loadaddr \$sonic_dir_$idx/boot/sonic_arm64.fit && setenv bootargs quiet console=\$consoledev,\$baudrate root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 loopfstype=squashfs loop=\$sonic_dir_$idx/fs.squashfs systemd.unified_cgroup_hierarchy=0 \${linuxargs} && bootm \$loadaddr" fw_setenv sonic_dir_$idx $image_dir fw_setenv sonic_version_$idx `echo $image_dir | sed "s/^image-/SONiC-OS-/g"` diff --git a/platform/marvell-arm64/platform.conf b/platform/marvell-arm64/platform.conf index 8ecdfa317425..4ef62d36b87e 100644 --- a/platform/marvell-arm64/platform.conf +++ b/platform/marvell-arm64/platform.conf @@ -108,7 +108,7 @@ prepare_boot_menu() { BORDER='echo "---------------------------------------------------";echo;' fw_setenv ${FW_ARG} print_menu $BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER > /dev/null - fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG" > /dev/null + fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${extra_cmdline_linux}" > /dev/null fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG" > /dev/null sonic_bootargs_old='setenv bootargs root='$demo_dev' rw rootwait rootfstype=ext4 panic=1 console=ttyS0,115200 ${othbootargs} ${mtdparts} ${linuxargs_old}' fw_setenv ${FW_ARG} sonic_bootargs_old $sonic_bootargs_old > /dev/null || true diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index 6dd8e238f98e..df71c5d1b128 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -147,7 +147,7 @@ prepare_boot_menu() { BORDER='echo "---------------------------------------------------";echo;' fw_setenv ${FW_ARG} print_menu $BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER > /dev/null - fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4" > /dev/null + fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4 ${extra_cmdline_linux}" > /dev/null fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4" > /dev/null # Set boot configs From 0c9bbee735d7999cbe9b6188cbff14a2e375c2b5 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Thu, 2 Jun 2022 21:48:57 +0800 Subject: [PATCH 379/817] Update qos template to support SYSTEM_DEFAULT table (#10936) * Update qos template to support SYSTEM_DEFAULT table Signed-off-by: bingwang --- .../Arista-7050CX3-32S-D48C8/qos.json.j2 | 28 +- .../Arista-7260CX3-C64/qos.json.j2 | 25 +- files/build_templates/qos_config.j2 | 34 +- ...50cx3-dualtor-minigraph-remap-disabled.xml | 2369 +++++++++ ...ample-arista-7050cx3-dualtor-minigraph.xml | 8 + ...-7260-dualtor-minigraph-remap-disabled.xml | 4635 +++++++++++++++++ .../sample-arista-7260-dualtor-minigraph.xml | 8 + ...rista-7260-t1-minigraph-remap-disabled.xml | 2491 +++++++++ .../tests/sample-arista-7260-t1-minigraph.xml | 8 + ...-arista7050cx3-dualtor-remap-disabled.json | 1129 ++++ .../py3/qos-arista7050cx3-dualtor.json | 25 +- ...qos-arista7260-dualtor-remap-disabled.json | 2121 ++++++++ .../py3/qos-arista7260-dualtor.json | 25 +- .../py3/qos-arista7260-t1-remap-disabled.json | 1005 ++++ src/sonic-config-engine/tests/test_j2files.py | 13 +- 15 files changed, 13866 insertions(+), 58 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml create mode 100644 src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph-remap-disabled.xml create mode 100644 src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph-remap-disabled.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 index 413bd575413c..e0aca4f8dd8b 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 @@ -35,7 +35,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -101,7 +101,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -140,12 +140,13 @@ "AZURE": { "0": "0", "1": "0", - "2": "0", + "2": "2", "3": "3", "4": "4", "5": "0", - "6": "0", - "7": "7" + "6": "6", + "7": "7", + "8": "0" }, "AZURE_TUNNEL": { "0": "0", @@ -155,7 +156,8 @@ "4": "6", "5": "0", "6": "0", - "7": "0" + "7": "0", + "8": "0" } }, {%- endmacro %} @@ -164,12 +166,13 @@ "AZURE": { "0": "0", "1": "1", - "2": "1", + "2": "1", "3": "3", "4": "4", "5": "5", "6": "6", - "7": "7" + "7": "7", + "8": "1" }, "AZURE_TUNNEL": { "0": "0", @@ -179,7 +182,8 @@ "4": "6", "5": "5", "6": "1", - "7": "7" + "7": "7", + "8": "1" } }, {%- endmacro %} @@ -188,15 +192,15 @@ "AZURE_TUNNEL": { "0": "8", "1": "0", - "2": "33", + "2": "0", "3": "2", "4": "6", "5": "46", "6": "0", - "7": "48" + "7": "48", + "8": "33" } }, {%- endmacro %} {% endif %} - {%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 index 27f6b531cb08..4d82382817cb 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -120,7 +120,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -186,7 +186,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -225,12 +225,13 @@ "AZURE": { "0": "0", "1": "0", - "2": "0", + "2": "2", "3": "3", "4": "4", "5": "0", - "6": "0", - "7": "7" + "6": "6", + "7": "7", + "8": "0" }, "AZURE_TUNNEL": { "0": "0", @@ -240,7 +241,8 @@ "4": "6", "5": "0", "6": "0", - "7": "0" + "7": "0", + "8": "0" } }, {%- endmacro %} @@ -254,7 +256,8 @@ "4": "4", "5": "5", "6": "6", - "7": "7" + "7": "7", + "8": "1" }, "AZURE_TUNNEL": { "0": "0", @@ -264,7 +267,8 @@ "4": "6", "5": "5", "6": "1", - "7": "7" + "7": "7", + "8": "1" } }, {%- endmacro %} @@ -273,12 +277,13 @@ "AZURE_TUNNEL": { "0": "8", "1": "0", - "2": "33", + "2": "0", "3": "2", "4": "6", "5": "46", "6": "0", - "7": "48" + "7": "48", + "8": "33" } }, {%- endmacro %} diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 4062755827ab..3d95d333594b 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -29,12 +29,18 @@ {%- endfor %} {%- set port_names_active = port_names_list_active | join(',') -%} +{%- set tunnel_qos_remap_enable = false %} +{%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) %} +{%- set tunnel_qos_remap_enable = true %} +{%- endif %} + {%- set port_names_list_extra_queues = [] %} {%- for port in PORT_ACTIVE %} - {% if (generate_dscp_to_tc_map is defined) and ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'ToRRouter') or - ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'LeafRouter') %} +{% if ((generate_dscp_to_tc_map is defined) and tunnel_qos_remap_enable) and +(('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'ToRRouter') or +('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'LeafRouter')) %} {%- if port_names_list_extra_queues.append(port) %}{%- endif %} - {% endif %} +{% endif %} {%- endfor %} {%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%} @@ -43,7 +49,7 @@ { -{% if generate_tc_to_pg_map is defined %} +{% if (generate_tc_to_pg_map is defined) and tunnel_qos_remap_enable %} {{- generate_tc_to_pg_map() }} {% else %} "TC_TO_PRIORITY_GROUP_MAP": { @@ -71,7 +77,7 @@ "7": "7" } }, -{% if generate_tc_to_queue_map is defined %} +{% if (generate_tc_to_queue_map is defined) and tunnel_qos_remap_enable %} {{- generate_tc_to_queue_map() }} {% else %} "TC_TO_QUEUE_MAP": { @@ -100,7 +106,7 @@ "7": "7" } }, -{% elif generate_dscp_to_tc_map is defined %} +{% elif (generate_dscp_to_tc_map is defined) and tunnel_qos_remap_enable %} {{- generate_dscp_to_tc_map() }} {% else %} "DSCP_TO_TC_MAP": { @@ -172,7 +178,7 @@ } }, {% endif %} -{% if generate_tc_to_dscp_map is defined %} +{% if (generate_tc_to_dscp_map is defined) and tunnel_qos_remap_enable %} {{- generate_tc_to_dscp_map() }} {% endif %} {% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %} @@ -289,12 +295,12 @@ {% endfor %} {% for port in PORT_ACTIVE %} "{{ port }}|2": { - {% if port in port_names_list_extra_queues %} +{% if port in port_names_list_extra_queues %} "scheduler" : "scheduler.1", "wred_profile": "AZURE_LOSSLESS" - {% else %} +{% else %} "scheduler": "scheduler.0" - {% endif %} +{% endif %} }, {% endfor %} {% for port in PORT_ACTIVE %} @@ -304,12 +310,12 @@ {% endfor %} {% for port in PORT_ACTIVE %} "{{ port }}|6": { - {% if port in port_names_list_extra_queues %} +{% if port in port_names_list_extra_queues %} "scheduler" : "scheduler.1", - "wred_profile": "AZURE_LOSSLESS" - {% else %} + "wred_profile": "AZURE_LOSSLESS" +{% else %} "scheduler": "scheduler.0" - {% endif %} +{% endif %} }{% if not loop.last %},{% endif %} {% endfor %} diff --git a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml new file mode 100644 index 000000000000..9ffb8230a6bf --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml @@ -0,0 +1,2369 @@ + + + + + + false + str2-7050cx3-acs-10 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 10 + 3 + + + false + str2-7050cx3-acs-10 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 10 + 3 + + + str2-7050cx3-acs-10 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + str2-7050cx3-acs-10 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ + BGPPeer +
10.1.0.32
+ + + + BGPSLBPassive + 10.255.0.0/25 +
+ + BGPPeer +
10.1.0.32
+ + + + BGPVac + 192.168.0.0/21 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + HostIP2 + Loopback1 + + 10.1.0.34/32 + + 10.1.0.34/32 + + + HostIP3 + Loopback1 + + FC00:1::34/128 + + FC00:1::34/128 + + HostIP6 + Loopback3 + + 10.1.0.38/32 + + 10.1.0.38/32 + + + HostIP7 + Loopback3 + + FC00:1::38/128 + + FC00:1::38/128 + + HostIP4 + Loopback2 + + 10.1.0.36/32 + + 10.1.0.36/32 + + + HostIP5 + Loopback2 + + FC00:1::36/128 + + FC00:1::36/128 + + + + HostIP + eth0 + + 10.3.146.122/23 + + 10.3.146.122/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-7050cx3-acs-10 + + + PortChannel101 + Ethernet7/1;Ethernet8/1 + + + + PortChannel102 + Ethernet9/1;Ethernet10/1 + + + + PortChannel103 + Ethernet23/1;Ethernet24/1 + + + + PortChannel104 + Ethernet25/1;Ethernet26/1 + + + + + + + + + Vlan1000 + Ethernet1/1;Ethernet2/1;Ethernet3/1;Ethernet4/1;Ethernet5/1;Ethernet6/1;Ethernet11/1;Ethernet12/1;Ethernet13/1;Ethernet14/1;Ethernet15/1;Ethernet16/1;Ethernet17/1;Ethernet18/1;Ethernet19/1;Ethernet20/1;Ethernet21/1;Ethernet22/1;Ethernet27/1;Ethernet28/1;Ethernet29/1;Ethernet30/1;Ethernet31/1;Ethernet32/1 + False + 0.0.0.0/0 + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + fc02:2000::1;fc02:2000::2;fc02:2000::3;fc02:2000::4 + 1000 + 1000 + 192.168.0.0/21 + 00:aa:bb:cc:dd:ee + + + + + + PortChannel101 + 10.0.0.56/31 + + + + PortChannel101 + FC00::71/126 + + + + PortChannel102 + 10.0.0.58/31 + + + + PortChannel102 + FC00::75/126 + + + + PortChannel103 + 10.0.0.60/31 + + + + PortChannel103 + FC00::79/126 + + + + PortChannel104 + 10.0.0.62/31 + + + + PortChannel104 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/21 + + + + Vlan1000 + fc02:1000::1/64 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet7/1 + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet8/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet9/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet10/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet23/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet24/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1 + str2-7050cx3-acs-10 + Ethernet25/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet2 + str2-7050cx3-acs-10 + Ethernet26/1 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet1/1 + Servers0 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet2/1 + Servers1 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet3/1 + Servers2 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet4/1 + Servers3 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet5/1 + Servers4 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet6/1 + Servers5 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet11/1 + Servers6 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet12/1 + Servers7 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet13/1 + Servers8 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet14/1 + Servers9 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet15/1 + Servers10 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet16/1 + Servers11 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet17/1 + Servers12 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet18/1 + Servers13 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet19/1 + Servers14 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet20/1 + Servers15 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet21/1 + Servers16 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet22/1 + Servers17 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet27/1 + Servers18 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet28/1 + Servers19 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet29/1 + Servers20 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet30/1 + Servers21 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet31/1 + Servers22 + eth0 + + + DeviceInterfaceLink + str2-7050cx3-acs-10 + Ethernet32/1 + Servers23 + eth0 + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet1/1 + str2-7050cx3-acs-10-Servers0-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet2/1 + str2-7050cx3-acs-10-Servers1-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet3/1 + str2-7050cx3-acs-10-Servers2-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet4/1 + str2-7050cx3-acs-10-Servers3-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet5/1 + str2-7050cx3-acs-10-Servers4-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet6/1 + str2-7050cx3-acs-10-Servers5-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet11/1 + str2-7050cx3-acs-10-Servers6-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet12/1 + str2-7050cx3-acs-10-Servers7-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet13/1 + str2-7050cx3-acs-10-Servers8-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet14/1 + str2-7050cx3-acs-10-Servers9-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet15/1 + str2-7050cx3-acs-10-Servers10-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet16/1 + str2-7050cx3-acs-10-Servers11-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet17/1 + str2-7050cx3-acs-10-Servers12-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet18/1 + str2-7050cx3-acs-10-Servers13-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet19/1 + str2-7050cx3-acs-10-Servers14-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet20/1 + str2-7050cx3-acs-10-Servers15-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet21/1 + str2-7050cx3-acs-10-Servers16-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet22/1 + str2-7050cx3-acs-10-Servers17-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet27/1 + str2-7050cx3-acs-10-Servers18-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet28/1 + str2-7050cx3-acs-10-Servers19-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet29/1 + str2-7050cx3-acs-10-Servers20-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet30/1 + str2-7050cx3-acs-10-Servers21-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet31/1 + str2-7050cx3-acs-10-Servers22-SC + U + + + LogicalLink + str2-7050cx3-acs-10 + Ethernet32/1 + str2-7050cx3-acs-10-Servers23-SC + U + + + + + str2-7050cx3-acs-10 + Arista-7050CX3-32S-D48C8 +
+ 10.1.0.32/32 +
+ + FC00:1::32/128 + + + 10.3.146.122 + +
+ + str2-7050cx3-acs-11 + Arista-7050CX3-32S-D48C8 +
+ 10.1.0.33/32 +
+ + FC00:1::33/128 + + + 10.3.146.127 + +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers0-SC +
+ + Server +
+ 192.168.0.2/26 +
+ + fc02:1000::2/96 + + + 0.0.0.0/0 + + Servers0 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers1-SC +
+ + Server +
+ 192.168.0.3/26 +
+ + fc02:1000::3/96 + + + 0.0.0.0/0 + + Servers1 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers2-SC +
+ + Server +
+ 192.168.0.4/26 +
+ + fc02:1000::4/96 + + + 0.0.0.0/0 + + Servers2 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers3-SC +
+ + Server +
+ 192.168.0.5/26 +
+ + fc02:1000::5/96 + + + 0.0.0.0/0 + + Servers3 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers4-SC +
+ + Server +
+ 192.168.0.6/26 +
+ + fc02:1000::6/96 + + + 0.0.0.0/0 + + Servers4 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers5-SC +
+ + Server +
+ 192.168.0.7/26 +
+ + fc02:1000::7/96 + + + 0.0.0.0/0 + + Servers5 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers6-SC +
+ + Server +
+ 192.168.0.8/26 +
+ + fc02:1000::8/96 + + + 0.0.0.0/0 + + Servers6 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers7-SC +
+ + Server +
+ 192.168.0.9/26 +
+ + fc02:1000::9/96 + + + 0.0.0.0/0 + + Servers7 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers8-SC +
+ + Server +
+ 192.168.0.10/26 +
+ + fc02:1000::a/96 + + + 0.0.0.0/0 + + Servers8 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers9-SC +
+ + Server +
+ 192.168.0.11/26 +
+ + fc02:1000::b/96 + + + 0.0.0.0/0 + + Servers9 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers10-SC +
+ + Server +
+ 192.168.0.12/26 +
+ + fc02:1000::c/96 + + + 0.0.0.0/0 + + Servers10 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers11-SC +
+ + Server +
+ 192.168.0.13/26 +
+ + fc02:1000::d/96 + + + 0.0.0.0/0 + + Servers11 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers12-SC +
+ + Server +
+ 192.168.0.14/26 +
+ + fc02:1000::e/96 + + + 0.0.0.0/0 + + Servers12 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers13-SC +
+ + Server +
+ 192.168.0.15/26 +
+ + fc02:1000::f/96 + + + 0.0.0.0/0 + + Servers13 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers14-SC +
+ + Server +
+ 192.168.0.16/26 +
+ + fc02:1000::10/96 + + + 0.0.0.0/0 + + Servers14 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers15-SC +
+ + Server +
+ 192.168.0.17/26 +
+ + fc02:1000::11/96 + + + 0.0.0.0/0 + + Servers15 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers16-SC +
+ + Server +
+ 192.168.0.18/26 +
+ + fc02:1000::12/96 + + + 0.0.0.0/0 + + Servers16 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers17-SC +
+ + Server +
+ 192.168.0.19/26 +
+ + fc02:1000::13/96 + + + 0.0.0.0/0 + + Servers17 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers18-SC +
+ + Server +
+ 192.168.0.20/26 +
+ + fc02:1000::14/96 + + + 0.0.0.0/0 + + Servers18 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers19-SC +
+ + Server +
+ 192.168.0.21/26 +
+ + fc02:1000::15/96 + + + 0.0.0.0/0 + + Servers19 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers20-SC +
+ + Server +
+ 192.168.0.22/26 +
+ + fc02:1000::16/96 + + + 0.0.0.0/0 + + Servers20 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers21-SC +
+ + Server +
+ 192.168.0.23/26 +
+ + fc02:1000::17/96 + + + 0.0.0.0/0 + + Servers21 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers22-SC +
+ + Server +
+ 192.168.0.24/26 +
+ + fc02:1000::18/96 + + + 0.0.0.0/0 + + Servers22 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7050cx3-acs-10-Servers23-SC +
+ + Server +
+ 192.168.0.25/26 +
+ + fc02:1000::19/96 + + + 0.0.0.0/0 + + Servers23 +
+ + ARISTA04T1 + + 172.16.142.63 + + Arista-VM + + + ARISTA03T1 + + 172.16.142.62 + + Arista-VM + + + ARISTA02T1 + + 172.16.142.61 + + Arista-VM + + + ARISTA01T1 + + 172.16.142.60 + + Arista-VM + +
+
+ + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet1/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet14/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet15/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet16/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet17/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet18/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet19/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet20/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/3 + + false + 0 + 0 + 50000 + + + true + 0 + Arista-7050CX3-32S-D48C8 + + + + + + + str2-7050cx3-acs-10 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + GeminiEnabled + + True + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + str2-7050cx3-acs-10 + + + LowerTOR + + str2-7050cx3-acs-11 + + + str2-7050cx3-acs-11:MuxTunnel0;str2-7050cx3-acs-10:MuxTunnel0 + + + + str2-7050cx3-acs-10 + Arista-7050CX3-32S-D48C8 +
diff --git a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml index 9ffb8230a6bf..6ffea8427ddb 100644 --- a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml @@ -2339,6 +2339,14 @@
+ + + + TunnelQosRemapEnabled + True + + + diff --git a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph-remap-disabled.xml b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph-remap-disabled.xml new file mode 100644 index 000000000000..01a42f934726 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph-remap-disabled.xml @@ -0,0 +1,4635 @@ + + + + + + false + str2-7260cx3-acs-12 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 10 + 3 + + + false + str2-7260cx3-acs-12 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 10 + 3 + + + str2-7260cx3-acs-12 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + str2-7260cx3-acs-12 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ + BGPPeer +
10.1.0.32
+ + + + BGPSLBPassive + 10.255.0.0/25 +
+ + BGPPeer +
10.1.0.32
+ + + + BGPVac + 192.168.0.0/21 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + HostIP2 + Loopback1 + + 10.1.0.34/32 + + 10.1.0.34/32 + + + HostIP3 + Loopback1 + + FC00:1::34/128 + + FC00:1::34/128 + + HostIP6 + Loopback3 + + 10.1.0.38/32 + + 10.1.0.38/32 + + + HostIP7 + Loopback3 + + FC00:1::38/128 + + FC00:1::38/128 + + HostIP4 + Loopback2 + + 10.1.0.36/32 + + 10.1.0.36/32 + + + HostIP5 + Loopback2 + + FC00:1::36/128 + + FC00:1::36/128 + + + + HostIP + eth0 + + 10.3.147.165/23 + + 10.3.147.165/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-7260cx3-acs-12 + + + PortChannel101 + Ethernet13/1;Ethernet14/1 + + + + PortChannel102 + Ethernet15/1;Ethernet16/1 + + + + PortChannel103 + Ethernet17/1;Ethernet18/1 + + + + PortChannel104 + Ethernet19/1;Ethernet20/1 + + + + + + + + + Vlan1000 + Ethernet1/1;Ethernet2/1;Ethernet3/1;Ethernet4/1;Ethernet5/1;Ethernet6/1;Ethernet7/1;Ethernet8/1;Ethernet9/1;Ethernet10/1;Ethernet11/1;Ethernet12/1;Ethernet21/1;Ethernet22/1;Ethernet23/1;Ethernet24/1;Ethernet25/1;Ethernet26/1;Ethernet27/1;Ethernet28/1;Ethernet29/1;Ethernet30/1;Ethernet31/1;Ethernet32/1;Ethernet33/1;Ethernet34/1;Ethernet35/1;Ethernet36/1;Ethernet37/1;Ethernet38/1;Ethernet39/1;Ethernet40/1;Ethernet41/1;Ethernet42/1;Ethernet43/1;Ethernet44/1;Ethernet45/1;Ethernet46/1;Ethernet47/1;Ethernet48/1;Ethernet49/1;Ethernet50/1;Ethernet51/1;Ethernet52/1;Ethernet53/1;Ethernet54/1;Ethernet55/1;Ethernet56/1;Ethernet57/1;Ethernet58/1;Ethernet59/1;Ethernet60/1;Ethernet61/1;Ethernet62/1;Ethernet63/1;Ethernet64/1 + False + 0.0.0.0/0 + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + fc02:2000::1;fc02:2000::2;fc02:2000::3;fc02:2000::4 + 1000 + 1000 + 192.168.0.0/21 + 00:aa:bb:cc:dd:ee + + + + + + PortChannel101 + 10.0.0.56/31 + + + + PortChannel101 + FC00::71/126 + + + + PortChannel102 + 10.0.0.58/31 + + + + PortChannel102 + FC00::75/126 + + + + PortChannel103 + 10.0.0.60/31 + + + + PortChannel103 + FC00::79/126 + + + + PortChannel104 + 10.0.0.62/31 + + + + PortChannel104 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/21 + + + + Vlan1000 + fc02:1000::1/64 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet13/1 + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet14/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet15/1 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet16/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet17/1 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet18/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1 + str2-7260cx3-acs-12 + Ethernet19/1 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet2 + str2-7260cx3-acs-12 + Ethernet20/1 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet1/1 + Servers0 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet2/1 + Servers1 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet3/1 + Servers2 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet4/1 + Servers3 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet5/1 + Servers4 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet6/1 + Servers5 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet7/1 + Servers6 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet8/1 + Servers7 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet9/1 + Servers8 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet10/1 + Servers9 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet11/1 + Servers10 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet12/1 + Servers11 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet21/1 + Servers12 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet22/1 + Servers13 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet23/1 + Servers14 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet24/1 + Servers15 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet25/1 + Servers16 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet26/1 + Servers17 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet27/1 + Servers18 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet28/1 + Servers19 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet29/1 + Servers20 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet30/1 + Servers21 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet31/1 + Servers22 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet32/1 + Servers23 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet33/1 + Servers24 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet34/1 + Servers25 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet35/1 + Servers26 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet36/1 + Servers27 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet37/1 + Servers28 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet38/1 + Servers29 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet39/1 + Servers30 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet40/1 + Servers31 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet41/1 + Servers32 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet42/1 + Servers33 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet43/1 + Servers34 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet44/1 + Servers35 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet45/1 + Servers36 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet46/1 + Servers37 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet47/1 + Servers38 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet48/1 + Servers39 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet49/1 + Servers40 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet50/1 + Servers41 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet51/1 + Servers42 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet52/1 + Servers43 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet53/1 + Servers44 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet54/1 + Servers45 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet55/1 + Servers46 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet56/1 + Servers47 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet57/1 + Servers48 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet58/1 + Servers49 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet59/1 + Servers50 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet60/1 + Servers51 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet61/1 + Servers52 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet62/1 + Servers53 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet63/1 + Servers54 + eth0 + + + DeviceInterfaceLink + str2-7260cx3-acs-12 + Ethernet64/1 + Servers55 + eth0 + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet1/1 + str2-7260cx3-acs-12-Servers0-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet2/1 + str2-7260cx3-acs-12-Servers1-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet3/1 + str2-7260cx3-acs-12-Servers2-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet4/1 + str2-7260cx3-acs-12-Servers3-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet5/1 + str2-7260cx3-acs-12-Servers4-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet6/1 + str2-7260cx3-acs-12-Servers5-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet7/1 + str2-7260cx3-acs-12-Servers6-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet8/1 + str2-7260cx3-acs-12-Servers7-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet9/1 + str2-7260cx3-acs-12-Servers8-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet10/1 + str2-7260cx3-acs-12-Servers9-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet11/1 + str2-7260cx3-acs-12-Servers10-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet12/1 + str2-7260cx3-acs-12-Servers11-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet21/1 + str2-7260cx3-acs-12-Servers12-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet22/1 + str2-7260cx3-acs-12-Servers13-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet23/1 + str2-7260cx3-acs-12-Servers14-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet24/1 + str2-7260cx3-acs-12-Servers15-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet25/1 + str2-7260cx3-acs-12-Servers16-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet26/1 + str2-7260cx3-acs-12-Servers17-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet27/1 + str2-7260cx3-acs-12-Servers18-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet28/1 + str2-7260cx3-acs-12-Servers19-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet29/1 + str2-7260cx3-acs-12-Servers20-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet30/1 + str2-7260cx3-acs-12-Servers21-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet31/1 + str2-7260cx3-acs-12-Servers22-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet32/1 + str2-7260cx3-acs-12-Servers23-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet33/1 + str2-7260cx3-acs-12-Servers24-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet34/1 + str2-7260cx3-acs-12-Servers25-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet35/1 + str2-7260cx3-acs-12-Servers26-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet36/1 + str2-7260cx3-acs-12-Servers27-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet37/1 + str2-7260cx3-acs-12-Servers28-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet38/1 + str2-7260cx3-acs-12-Servers29-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet39/1 + str2-7260cx3-acs-12-Servers30-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet40/1 + str2-7260cx3-acs-12-Servers31-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet41/1 + str2-7260cx3-acs-12-Servers32-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet42/1 + str2-7260cx3-acs-12-Servers33-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet43/1 + str2-7260cx3-acs-12-Servers34-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet44/1 + str2-7260cx3-acs-12-Servers35-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet45/1 + str2-7260cx3-acs-12-Servers36-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet46/1 + str2-7260cx3-acs-12-Servers37-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet47/1 + str2-7260cx3-acs-12-Servers38-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet48/1 + str2-7260cx3-acs-12-Servers39-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet49/1 + str2-7260cx3-acs-12-Servers40-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet50/1 + str2-7260cx3-acs-12-Servers41-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet51/1 + str2-7260cx3-acs-12-Servers42-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet52/1 + str2-7260cx3-acs-12-Servers43-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet53/1 + str2-7260cx3-acs-12-Servers44-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet54/1 + str2-7260cx3-acs-12-Servers45-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet55/1 + str2-7260cx3-acs-12-Servers46-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet56/1 + str2-7260cx3-acs-12-Servers47-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet57/1 + str2-7260cx3-acs-12-Servers48-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet58/1 + str2-7260cx3-acs-12-Servers49-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet59/1 + str2-7260cx3-acs-12-Servers50-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet60/1 + str2-7260cx3-acs-12-Servers51-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet61/1 + str2-7260cx3-acs-12-Servers52-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet62/1 + str2-7260cx3-acs-12-Servers53-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet63/1 + str2-7260cx3-acs-12-Servers54-SC + U + + + LogicalLink + str2-7260cx3-acs-12 + Ethernet64/1 + str2-7260cx3-acs-12-Servers55-SC + U + + + + + str2-7260cx3-acs-12 + Arista-7260CX3-D108C8 +
+ 10.1.0.32/32 +
+ + FC00:1::32/128 + + + 10.3.147.165 + +
+ + str2-7260cx3-acs-13 + Arista-7260CX3-D108C8 +
+ 10.1.0.33/32 +
+ + FC00:1::33/128 + + + 10.3.147.167 + +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers0-SC +
+ + Server +
+ 192.168.0.2/26 +
+ + fc02:1000::2/96 + + + 0.0.0.0/0 + + Servers0 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers1-SC +
+ + Server +
+ 192.168.0.3/26 +
+ + fc02:1000::3/96 + + + 0.0.0.0/0 + + Servers1 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers2-SC +
+ + Server +
+ 192.168.0.4/26 +
+ + fc02:1000::4/96 + + + 0.0.0.0/0 + + Servers2 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers3-SC +
+ + Server +
+ 192.168.0.5/26 +
+ + fc02:1000::5/96 + + + 0.0.0.0/0 + + Servers3 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers4-SC +
+ + Server +
+ 192.168.0.6/26 +
+ + fc02:1000::6/96 + + + 0.0.0.0/0 + + Servers4 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers5-SC +
+ + Server +
+ 192.168.0.7/26 +
+ + fc02:1000::7/96 + + + 0.0.0.0/0 + + Servers5 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers6-SC +
+ + Server +
+ 192.168.0.8/26 +
+ + fc02:1000::8/96 + + + 0.0.0.0/0 + + Servers6 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers7-SC +
+ + Server +
+ 192.168.0.9/26 +
+ + fc02:1000::9/96 + + + 0.0.0.0/0 + + Servers7 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers8-SC +
+ + Server +
+ 192.168.0.10/26 +
+ + fc02:1000::a/96 + + + 0.0.0.0/0 + + Servers8 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers9-SC +
+ + Server +
+ 192.168.0.11/26 +
+ + fc02:1000::b/96 + + + 0.0.0.0/0 + + Servers9 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers10-SC +
+ + Server +
+ 192.168.0.12/26 +
+ + fc02:1000::c/96 + + + 0.0.0.0/0 + + Servers10 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers11-SC +
+ + Server +
+ 192.168.0.13/26 +
+ + fc02:1000::d/96 + + + 0.0.0.0/0 + + Servers11 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers12-SC +
+ + Server +
+ 192.168.0.14/26 +
+ + fc02:1000::e/96 + + + 0.0.0.0/0 + + Servers12 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers13-SC +
+ + Server +
+ 192.168.0.15/26 +
+ + fc02:1000::f/96 + + + 0.0.0.0/0 + + Servers13 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers14-SC +
+ + Server +
+ 192.168.0.16/26 +
+ + fc02:1000::10/96 + + + 0.0.0.0/0 + + Servers14 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers15-SC +
+ + Server +
+ 192.168.0.17/26 +
+ + fc02:1000::11/96 + + + 0.0.0.0/0 + + Servers15 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers16-SC +
+ + Server +
+ 192.168.0.18/26 +
+ + fc02:1000::12/96 + + + 0.0.0.0/0 + + Servers16 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers17-SC +
+ + Server +
+ 192.168.0.19/26 +
+ + fc02:1000::13/96 + + + 0.0.0.0/0 + + Servers17 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers18-SC +
+ + Server +
+ 192.168.0.20/26 +
+ + fc02:1000::14/96 + + + 0.0.0.0/0 + + Servers18 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers19-SC +
+ + Server +
+ 192.168.0.21/26 +
+ + fc02:1000::15/96 + + + 0.0.0.0/0 + + Servers19 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers20-SC +
+ + Server +
+ 192.168.0.22/26 +
+ + fc02:1000::16/96 + + + 0.0.0.0/0 + + Servers20 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers21-SC +
+ + Server +
+ 192.168.0.23/26 +
+ + fc02:1000::17/96 + + + 0.0.0.0/0 + + Servers21 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers22-SC +
+ + Server +
+ 192.168.0.24/26 +
+ + fc02:1000::18/96 + + + 0.0.0.0/0 + + Servers22 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers23-SC +
+ + Server +
+ 192.168.0.25/26 +
+ + fc02:1000::19/96 + + + 0.0.0.0/0 + + Servers23 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers24-SC +
+ + Server +
+ 192.168.0.26/26 +
+ + fc02:1000::1a/96 + + + 0.0.0.0/0 + + Servers24 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers25-SC +
+ + Server +
+ 192.168.0.27/26 +
+ + fc02:1000::1b/96 + + + 0.0.0.0/0 + + Servers25 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers26-SC +
+ + Server +
+ 192.168.0.28/26 +
+ + fc02:1000::1c/96 + + + 0.0.0.0/0 + + Servers26 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers27-SC +
+ + Server +
+ 192.168.0.29/26 +
+ + fc02:1000::1d/96 + + + 0.0.0.0/0 + + Servers27 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers28-SC +
+ + Server +
+ 192.168.0.30/26 +
+ + fc02:1000::1e/96 + + + 0.0.0.0/0 + + Servers28 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers29-SC +
+ + Server +
+ 192.168.0.31/26 +
+ + fc02:1000::1f/96 + + + 0.0.0.0/0 + + Servers29 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers30-SC +
+ + Server +
+ 192.168.0.32/26 +
+ + fc02:1000::20/96 + + + 0.0.0.0/0 + + Servers30 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers31-SC +
+ + Server +
+ 192.168.0.33/26 +
+ + fc02:1000::21/96 + + + 0.0.0.0/0 + + Servers31 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers32-SC +
+ + Server +
+ 192.168.0.34/26 +
+ + fc02:1000::22/96 + + + 0.0.0.0/0 + + Servers32 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers33-SC +
+ + Server +
+ 192.168.0.35/26 +
+ + fc02:1000::23/96 + + + 0.0.0.0/0 + + Servers33 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers34-SC +
+ + Server +
+ 192.168.0.36/26 +
+ + fc02:1000::24/96 + + + 0.0.0.0/0 + + Servers34 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers35-SC +
+ + Server +
+ 192.168.0.37/26 +
+ + fc02:1000::25/96 + + + 0.0.0.0/0 + + Servers35 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers36-SC +
+ + Server +
+ 192.168.0.38/26 +
+ + fc02:1000::26/96 + + + 0.0.0.0/0 + + Servers36 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers37-SC +
+ + Server +
+ 192.168.0.39/26 +
+ + fc02:1000::27/96 + + + 0.0.0.0/0 + + Servers37 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers38-SC +
+ + Server +
+ 192.168.0.40/26 +
+ + fc02:1000::28/96 + + + 0.0.0.0/0 + + Servers38 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers39-SC +
+ + Server +
+ 192.168.0.41/26 +
+ + fc02:1000::29/96 + + + 0.0.0.0/0 + + Servers39 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers40-SC +
+ + Server +
+ 192.168.0.42/26 +
+ + fc02:1000::2a/96 + + + 0.0.0.0/0 + + Servers40 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers41-SC +
+ + Server +
+ 192.168.0.43/26 +
+ + fc02:1000::2b/96 + + + 0.0.0.0/0 + + Servers41 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers42-SC +
+ + Server +
+ 192.168.0.44/26 +
+ + fc02:1000::2c/96 + + + 0.0.0.0/0 + + Servers42 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers43-SC +
+ + Server +
+ 192.168.0.45/26 +
+ + fc02:1000::2d/96 + + + 0.0.0.0/0 + + Servers43 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers44-SC +
+ + Server +
+ 192.168.0.46/26 +
+ + fc02:1000::2e/96 + + + 0.0.0.0/0 + + Servers44 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers45-SC +
+ + Server +
+ 192.168.0.47/26 +
+ + fc02:1000::2f/96 + + + 0.0.0.0/0 + + Servers45 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers46-SC +
+ + Server +
+ 192.168.0.48/26 +
+ + fc02:1000::30/96 + + + 0.0.0.0/0 + + Servers46 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers47-SC +
+ + Server +
+ 192.168.0.49/26 +
+ + fc02:1000::31/96 + + + 0.0.0.0/0 + + Servers47 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers48-SC +
+ + Server +
+ 192.168.0.50/26 +
+ + fc02:1000::32/96 + + + 0.0.0.0/0 + + Servers48 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers49-SC +
+ + Server +
+ 192.168.0.51/26 +
+ + fc02:1000::33/96 + + + 0.0.0.0/0 + + Servers49 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers50-SC +
+ + Server +
+ 192.168.0.52/26 +
+ + fc02:1000::34/96 + + + 0.0.0.0/0 + + Servers50 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers51-SC +
+ + Server +
+ 192.168.0.53/26 +
+ + fc02:1000::35/96 + + + 0.0.0.0/0 + + Servers51 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers52-SC +
+ + Server +
+ 192.168.0.54/26 +
+ + fc02:1000::36/96 + + + 0.0.0.0/0 + + Servers52 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers53-SC +
+ + Server +
+ 192.168.0.55/26 +
+ + fc02:1000::37/96 + + + 0.0.0.0/0 + + Servers53 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers54-SC +
+ + Server +
+ 192.168.0.56/26 +
+ + fc02:1000::38/96 + + + 0.0.0.0/0 + + Servers54 +
+ + SmartCable +
+ 0.0.0.0/0 +
+ + ::/0 + + + 0.0.0.0/0 + + + ::/0 + + + str2-7260cx3-acs-12-Servers55-SC +
+ + Server +
+ 192.168.0.57/26 +
+ + fc02:1000::39/96 + + + 0.0.0.0/0 + + Servers55 +
+ + ARISTA04T1 + + 172.16.147.75 + + Arista-VM + + + ARISTA03T1 + + 172.16.147.74 + + Arista-VM + + + ARISTA02T1 + + 172.16.147.73 + + Arista-VM + + + ARISTA01T1 + + 172.16.147.72 + + Arista-VM + +
+
+ + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet1/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet2/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet3/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet4/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet5/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet6/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet7/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet8/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet9/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet10/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet11/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet12/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet21/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet22/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet23/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet24/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet25/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet26/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet27/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet28/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet29/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet30/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet31/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet32/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet33/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet33/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet34/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet34/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet35/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet35/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet36/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet36/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet37/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet37/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet38/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet38/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet39/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet39/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet40/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet40/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet41/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet41/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet42/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet42/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet43/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet43/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet44/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet44/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet45/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet45/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet46/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet46/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet47/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet47/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet48/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet48/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet49/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet49/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet50/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet50/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet51/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet51/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet52/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet52/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet53/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet53/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet54/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet54/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet55/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet55/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet56/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet56/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet57/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet57/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet58/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet58/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet59/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet59/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet60/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet60/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet61/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet61/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet62/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet62/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet63/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet63/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet64/1 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet64/3 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + Ethernet65 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + Ethernet66 + + false + 0 + 0 + 10000 + + + true + 0 + Arista-7260CX3-D108C8 + + + + + + + str2-7260cx3-acs-12 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + GeminiEnabled + + True + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + str2-7260cx3-acs-12 + + + LowerTOR + + str2-7260cx3-acs-13 + + + str2-7260cx3-acs-13:MuxTunnel0;str2-7260cx3-acs-12:MuxTunnel0 + + + + str2-7260cx3-acs-12 + Arista-7260CX3-D108C8 +
diff --git a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml index 01a42f934726..e1a7d3580594 100644 --- a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml @@ -4605,6 +4605,14 @@
+ + + + TunnelQosRemapEnabled + True + + + diff --git a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph-remap-disabled.xml b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph-remap-disabled.xml new file mode 100644 index 000000000000..4367b705a11a --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph-remap-disabled.xml @@ -0,0 +1,2491 @@ + + + + + + false + str-7260cx3-acs-7 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::5 + ARISTA03T2 + FC00::6 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::9 + ARISTA05T2 + FC00::A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::D + ARISTA07T2 + FC00::E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.64 + ARISTA17T0 + 10.0.0.65 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::81 + ARISTA17T0 + FC00::82 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.66 + ARISTA18T0 + 10.0.0.67 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::85 + ARISTA18T0 + FC00::86 + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.68 + ARISTA19T0 + 10.0.0.69 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::89 + ARISTA19T0 + FC00::8A + 1 + 10 + 3 + + + false + str-7260cx3-acs-7 + 10.0.0.70 + ARISTA20T0 + 10.0.0.71 + 1 + 10 + 3 + + + str-7260cx3-acs-7 + FC00::8D + ARISTA20T0 + FC00::8E + 1 + 10 + 3 + + + + + 65100 + str-7260cx3-acs-7 + + +
10.0.0.33
+ + + +
+ +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.0.0.65
+ + + +
+ +
10.0.0.67
+ + + +
+ +
10.0.0.69
+ + + +
+ +
10.0.0.71
+ + + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 64016 + ARISTA16T0 + + + + 64017 + ARISTA17T0 + + + + 64018 + ARISTA18T0 + + + + 64019 + ARISTA19T0 + + + + 64020 + ARISTA20T0 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.64.246.78/23 + + 10.64.246.78/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str-7260cx3-acs-7 + + + PortChannel101 + Ethernet35/1 + + + + PortChannel102 + Ethernet1/1;Ethernet2/1 + + + + PortChannel103 + Ethernet37/1 + + + + PortChannel104 + Ethernet38/1 + + + + PortChannel105 + Ethernet5/1;Ethernet6/1 + + + + PortChannel106 + Ethernet39/1 + + + + PortChannel107 + Ethernet40/1 + + + + PortChannel108 + Ethernet17/1;Ethernet18/1 + + + + PortChannel109 + Ethernet43/1 + + + + PortChannel1010 + Ethernet45/1 + + + + PortChannel1011 + Ethernet21/1;Ethernet22/1 + + + + PortChannel1012 + Ethernet46/1 + + + + PortChannel1013 + Ethernet47/1 + + + + PortChannel1014 + Ethernet48/1 + + + + PortChannel1015 + Ethernet51/1 + + + + PortChannel1016 + Ethernet53/1 + + + + PortChannel1017 + Ethernet54/1 + + + + PortChannel1018 + Ethernet55/1 + + + + PortChannel1019 + Ethernet56/1 + + + + PortChannel1020 + Ethernet59/1 + + + + PortChannel1021 + Ethernet61/1 + + + + PortChannel1022 + Ethernet62/1 + + + + PortChannel1023 + Ethernet63/1 + + + + PortChannel1024 + Ethernet64/1 + + + + + + + + + PortChannel101 + 10.0.0.32/31 + + + + PortChannel101 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel103 + 10.0.0.34/31 + + + + PortChannel103 + FC00::45/126 + + + + PortChannel104 + 10.0.0.36/31 + + + + PortChannel104 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::5/126 + + + + PortChannel106 + 10.0.0.38/31 + + + + PortChannel106 + FC00::4D/126 + + + + PortChannel107 + 10.0.0.40/31 + + + + PortChannel107 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::9/126 + + + + PortChannel109 + 10.0.0.42/31 + + + + PortChannel109 + FC00::55/126 + + + + PortChannel1010 + 10.0.0.44/31 + + + + PortChannel1010 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::D/126 + + + + PortChannel1012 + 10.0.0.46/31 + + + + PortChannel1012 + FC00::5D/126 + + + + PortChannel1013 + 10.0.0.48/31 + + + + PortChannel1013 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.50/31 + + + + PortChannel1014 + FC00::65/126 + + + + PortChannel1015 + 10.0.0.52/31 + + + + PortChannel1015 + FC00::69/126 + + + + PortChannel1016 + 10.0.0.54/31 + + + + PortChannel1016 + FC00::6D/126 + + + + PortChannel1017 + 10.0.0.56/31 + + + + PortChannel1017 + FC00::71/126 + + + + PortChannel1018 + 10.0.0.58/31 + + + + PortChannel1018 + FC00::75/126 + + + + PortChannel1019 + 10.0.0.60/31 + + + + PortChannel1019 + FC00::79/126 + + + + PortChannel1020 + 10.0.0.62/31 + + + + PortChannel1020 + FC00::7D/126 + + + + PortChannel1021 + 10.0.0.64/31 + + + + PortChannel1021 + FC00::81/126 + + + + PortChannel1022 + 10.0.0.66/31 + + + + PortChannel1022 + FC00::85/126 + + + + PortChannel1023 + 10.0.0.68/31 + + + + PortChannel1023 + FC00::89/126 + + + + PortChannel1024 + 10.0.0.70/31 + + + + PortChannel1024 + FC00::8D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel101;PortChannel102;PortChannel103;PortChannel104;PortChannel105;PortChannel106;PortChannel107;PortChannel108;PortChannel109;PortChannel1010;PortChannel1011;PortChannel1012;PortChannel1013;PortChannel1014;PortChannel1015;PortChannel1016;PortChannel1017;PortChannel1018;PortChannel1019;PortChannel1020;PortChannel1021;PortChannel1022;PortChannel1023;PortChannel1024 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet35/1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet1/1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet2/1 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet37/1 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet38/1 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet5/1 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet6/1 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet39/1 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet40/1 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet17/1 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet18/1 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet43/1 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet45/1 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + str-7260cx3-acs-7 + Ethernet21/1 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + str-7260cx3-acs-7 + Ethernet22/1 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet46/1 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet47/1 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet48/1 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet51/1 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet53/1 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet54/1 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet55/1 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet56/1 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet59/1 + + + DeviceInterfaceLink + ARISTA17T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet61/1 + + + DeviceInterfaceLink + ARISTA18T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet62/1 + + + DeviceInterfaceLink + ARISTA19T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet63/1 + + + DeviceInterfaceLink + ARISTA20T0 + Ethernet1 + str-7260cx3-acs-7 + Ethernet64/1 + + + + + str-7260cx3-acs-7 + Arista-7260CX3-C64 + + 10.64.246.78 + + + + ARISTA16T0 + + 172.16.141.95 + + Arista-VM + + + ARISTA11T0 + + 172.16.141.90 + + Arista-VM + + + ARISTA10T0 + + 172.16.141.89 + + Arista-VM + + + ARISTA17T0 + + 172.16.141.96 + + Arista-VM + + + ARISTA09T0 + + 172.16.141.88 + + Arista-VM + + + ARISTA20T0 + + 172.16.141.99 + + Arista-VM + + + ARISTA08T0 + + 172.16.141.87 + + Arista-VM + + + ARISTA07T0 + + 172.16.141.86 + + Arista-VM + + + ARISTA07T2 + + 172.16.141.79 + + Arista-VM + + + ARISTA01T2 + + 172.16.141.76 + + Arista-VM + + + ARISTA01T0 + + 172.16.141.80 + + Arista-VM + + + ARISTA05T2 + + 172.16.141.78 + + Arista-VM + + + ARISTA05T0 + + 172.16.141.84 + + Arista-VM + + + ARISTA02T0 + + 172.16.141.81 + + Arista-VM + + + ARISTA03T0 + + 172.16.141.82 + + Arista-VM + + + ARISTA03T2 + + 172.16.141.77 + + Arista-VM + + + ARISTA04T0 + + 172.16.141.83 + + Arista-VM + + + ARISTA18T0 + + 172.16.141.97 + + Arista-VM + + + ARISTA15T0 + + 172.16.141.94 + + Arista-VM + + + ARISTA19T0 + + 172.16.141.98 + + Arista-VM + + + ARISTA14T0 + + 172.16.141.93 + + Arista-VM + + + ARISTA12T0 + + 172.16.141.91 + + Arista-VM + + + ARISTA13T0 + + 172.16.141.92 + + Arista-VM + + + ARISTA06T0 + + 172.16.141.85 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet33/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet34/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet35/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet36/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet37/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet38/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet39/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet40/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet41/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet42/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet43/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet44/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet45/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet46/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet47/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet48/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet49/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet50/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet51/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet52/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet53/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet54/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet55/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet56/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet57/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet58/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet59/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet60/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet61/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet62/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet63/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet64/1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet65 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + Ethernet66 + + false + 0 + 0 + 10000 + + + true + 0 + Arista-7260CX3-C64 + + + + + + + str-7260cx3-acs-7 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.64.247.0/24;10.64.5.5 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + + + + + str-7260cx3-acs-7 + Arista-7260CX3-C64 +
diff --git a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml index 4367b705a11a..f4f4a349e97e 100644 --- a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml @@ -2486,6 +2486,14 @@ + + + + TunnelQosRemapEnabled + True + + + str-7260cx3-acs-7 Arista-7260CX3-C64 diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json new file mode 100644 index 000000000000..68774f58563a --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json @@ -0,0 +1,1129 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json index dbab298bb76a..843e68a49c7d 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -20,7 +20,8 @@ "4": "4", "5": "5", "6": "6", - "7": "7" + "7": "7", + "8": "1" }, "AZURE_TUNNEL": { "0": "0", @@ -30,7 +31,8 @@ "4": "6", "5": "5", "6": "1", - "7": "7" + "7": "7", + "8": "1" } }, "DSCP_TO_TC_MAP": { @@ -68,7 +70,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -134,7 +136,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -171,12 +173,13 @@ "AZURE": { "0": "0", "1": "0", - "2": "0", + "2": "2", "3": "3", "4": "4", "5": "0", - "6": "0", - "7": "7" + "6": "6", + "7": "7", + "8": "0" }, "AZURE_TUNNEL": { "0": "0", @@ -186,19 +189,21 @@ "4": "6", "5": "0", "6": "0", - "7": "0" + "7": "0", + "8": "0" } }, "TC_TO_DSCP_MAP": { "AZURE_TUNNEL": { "0": "8", "1": "0", - "2": "33", + "2": "0", "3": "2", "4": "6", "5": "46", "6": "0", - "7": "48" + "7": "48", + "8": "33" } }, "SCHEDULER": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json new file mode 100644 index 000000000000..27b7ebd7e494 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json @@ -0,0 +1,2121 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet8": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet12": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet24": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet28": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet32": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet36": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet40": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet44": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet48": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet52": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet56": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet60": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet72": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet76": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet88": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet92": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet96": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet100": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet104": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet108": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet112": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet116": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet120": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet124": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet128": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet132": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet140": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet160": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet164": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet172": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet192": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet196": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet204": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet224": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet228": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet236": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet172|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet196|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet204|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet228|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet236|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet8|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet12|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet24|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet28|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet32|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet36|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet40|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet44|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet48|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet52|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet56|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet60|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet72|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet76|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet88|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet92|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet96|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet100|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet104|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet108|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet112|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet116|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet120|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet124|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet128|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet132|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet140|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet160|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet164|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet172|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet192|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet196|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet204|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet224|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet228|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet236|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet8|0": { + "scheduler": "scheduler.0" + }, + "Ethernet12|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet24|0": { + "scheduler": "scheduler.0" + }, + "Ethernet28|0": { + "scheduler": "scheduler.0" + }, + "Ethernet32|0": { + "scheduler": "scheduler.0" + }, + "Ethernet36|0": { + "scheduler": "scheduler.0" + }, + "Ethernet40|0": { + "scheduler": "scheduler.0" + }, + "Ethernet44|0": { + "scheduler": "scheduler.0" + }, + "Ethernet48|0": { + "scheduler": "scheduler.0" + }, + "Ethernet52|0": { + "scheduler": "scheduler.0" + }, + "Ethernet56|0": { + "scheduler": "scheduler.0" + }, + "Ethernet60|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet72|0": { + "scheduler": "scheduler.0" + }, + "Ethernet76|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet88|0": { + "scheduler": "scheduler.0" + }, + "Ethernet92|0": { + "scheduler": "scheduler.0" + }, + "Ethernet96|0": { + "scheduler": "scheduler.0" + }, + "Ethernet100|0": { + "scheduler": "scheduler.0" + }, + "Ethernet104|0": { + "scheduler": "scheduler.0" + }, + "Ethernet108|0": { + "scheduler": "scheduler.0" + }, + "Ethernet112|0": { + "scheduler": "scheduler.0" + }, + "Ethernet116|0": { + "scheduler": "scheduler.0" + }, + "Ethernet120|0": { + "scheduler": "scheduler.0" + }, + "Ethernet124|0": { + "scheduler": "scheduler.0" + }, + "Ethernet128|0": { + "scheduler": "scheduler.0" + }, + "Ethernet132|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet140|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet160|0": { + "scheduler": "scheduler.0" + }, + "Ethernet164|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet172|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet192|0": { + "scheduler": "scheduler.0" + }, + "Ethernet196|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet204|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet224|0": { + "scheduler": "scheduler.0" + }, + "Ethernet228|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet236|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet8|1": { + "scheduler": "scheduler.0" + }, + "Ethernet12|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet24|1": { + "scheduler": "scheduler.0" + }, + "Ethernet28|1": { + "scheduler": "scheduler.0" + }, + "Ethernet32|1": { + "scheduler": "scheduler.0" + }, + "Ethernet36|1": { + "scheduler": "scheduler.0" + }, + "Ethernet40|1": { + "scheduler": "scheduler.0" + }, + "Ethernet44|1": { + "scheduler": "scheduler.0" + }, + "Ethernet48|1": { + "scheduler": "scheduler.0" + }, + "Ethernet52|1": { + "scheduler": "scheduler.0" + }, + "Ethernet56|1": { + "scheduler": "scheduler.0" + }, + "Ethernet60|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet72|1": { + "scheduler": "scheduler.0" + }, + "Ethernet76|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet88|1": { + "scheduler": "scheduler.0" + }, + "Ethernet92|1": { + "scheduler": "scheduler.0" + }, + "Ethernet96|1": { + "scheduler": "scheduler.0" + }, + "Ethernet100|1": { + "scheduler": "scheduler.0" + }, + "Ethernet104|1": { + "scheduler": "scheduler.0" + }, + "Ethernet108|1": { + "scheduler": "scheduler.0" + }, + "Ethernet112|1": { + "scheduler": "scheduler.0" + }, + "Ethernet116|1": { + "scheduler": "scheduler.0" + }, + "Ethernet120|1": { + "scheduler": "scheduler.0" + }, + "Ethernet124|1": { + "scheduler": "scheduler.0" + }, + "Ethernet128|1": { + "scheduler": "scheduler.0" + }, + "Ethernet132|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet140|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet160|1": { + "scheduler": "scheduler.0" + }, + "Ethernet164|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet172|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet192|1": { + "scheduler": "scheduler.0" + }, + "Ethernet196|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet204|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet224|1": { + "scheduler": "scheduler.0" + }, + "Ethernet228|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet236|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet8|2": { + "scheduler": "scheduler.0" + }, + "Ethernet12|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet24|2": { + "scheduler": "scheduler.0" + }, + "Ethernet28|2": { + "scheduler": "scheduler.0" + }, + "Ethernet32|2": { + "scheduler": "scheduler.0" + }, + "Ethernet36|2": { + "scheduler": "scheduler.0" + }, + "Ethernet40|2": { + "scheduler": "scheduler.0" + }, + "Ethernet44|2": { + "scheduler": "scheduler.0" + }, + "Ethernet48|2": { + "scheduler": "scheduler.0" + }, + "Ethernet52|2": { + "scheduler": "scheduler.0" + }, + "Ethernet56|2": { + "scheduler": "scheduler.0" + }, + "Ethernet60|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet72|2": { + "scheduler": "scheduler.0" + }, + "Ethernet76|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet88|2": { + "scheduler": "scheduler.0" + }, + "Ethernet92|2": { + "scheduler": "scheduler.0" + }, + "Ethernet96|2": { + "scheduler": "scheduler.0" + }, + "Ethernet100|2": { + "scheduler": "scheduler.0" + }, + "Ethernet104|2": { + "scheduler": "scheduler.0" + }, + "Ethernet108|2": { + "scheduler": "scheduler.0" + }, + "Ethernet112|2": { + "scheduler": "scheduler.0" + }, + "Ethernet116|2": { + "scheduler": "scheduler.0" + }, + "Ethernet120|2": { + "scheduler": "scheduler.0" + }, + "Ethernet124|2": { + "scheduler": "scheduler.0" + }, + "Ethernet128|2": { + "scheduler": "scheduler.0" + }, + "Ethernet132|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet140|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet160|2": { + "scheduler": "scheduler.0" + }, + "Ethernet164|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet172|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet192|2": { + "scheduler": "scheduler.0" + }, + "Ethernet196|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet204|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet212|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet220|2": { + "scheduler": "scheduler.0" + }, + "Ethernet224|2": { + "scheduler": "scheduler.0" + }, + "Ethernet228|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet236|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet244|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet252|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet8|5": { + "scheduler": "scheduler.0" + }, + "Ethernet12|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet24|5": { + "scheduler": "scheduler.0" + }, + "Ethernet28|5": { + "scheduler": "scheduler.0" + }, + "Ethernet32|5": { + "scheduler": "scheduler.0" + }, + "Ethernet36|5": { + "scheduler": "scheduler.0" + }, + "Ethernet40|5": { + "scheduler": "scheduler.0" + }, + "Ethernet44|5": { + "scheduler": "scheduler.0" + }, + "Ethernet48|5": { + "scheduler": "scheduler.0" + }, + "Ethernet52|5": { + "scheduler": "scheduler.0" + }, + "Ethernet56|5": { + "scheduler": "scheduler.0" + }, + "Ethernet60|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet72|5": { + "scheduler": "scheduler.0" + }, + "Ethernet76|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet88|5": { + "scheduler": "scheduler.0" + }, + "Ethernet92|5": { + "scheduler": "scheduler.0" + }, + "Ethernet96|5": { + "scheduler": "scheduler.0" + }, + "Ethernet100|5": { + "scheduler": "scheduler.0" + }, + "Ethernet104|5": { + "scheduler": "scheduler.0" + }, + "Ethernet108|5": { + "scheduler": "scheduler.0" + }, + "Ethernet112|5": { + "scheduler": "scheduler.0" + }, + "Ethernet116|5": { + "scheduler": "scheduler.0" + }, + "Ethernet120|5": { + "scheduler": "scheduler.0" + }, + "Ethernet124|5": { + "scheduler": "scheduler.0" + }, + "Ethernet128|5": { + "scheduler": "scheduler.0" + }, + "Ethernet132|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet140|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet160|5": { + "scheduler": "scheduler.0" + }, + "Ethernet164|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet172|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet192|5": { + "scheduler": "scheduler.0" + }, + "Ethernet196|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet204|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet224|5": { + "scheduler": "scheduler.0" + }, + "Ethernet228|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet236|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet8|6": { + "scheduler": "scheduler.0" + }, + "Ethernet12|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet24|6": { + "scheduler": "scheduler.0" + }, + "Ethernet28|6": { + "scheduler": "scheduler.0" + }, + "Ethernet32|6": { + "scheduler": "scheduler.0" + }, + "Ethernet36|6": { + "scheduler": "scheduler.0" + }, + "Ethernet40|6": { + "scheduler": "scheduler.0" + }, + "Ethernet44|6": { + "scheduler": "scheduler.0" + }, + "Ethernet48|6": { + "scheduler": "scheduler.0" + }, + "Ethernet52|6": { + "scheduler": "scheduler.0" + }, + "Ethernet56|6": { + "scheduler": "scheduler.0" + }, + "Ethernet60|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet72|6": { + "scheduler": "scheduler.0" + }, + "Ethernet76|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet88|6": { + "scheduler": "scheduler.0" + }, + "Ethernet92|6": { + "scheduler": "scheduler.0" + }, + "Ethernet96|6": { + "scheduler": "scheduler.0" + }, + "Ethernet100|6": { + "scheduler": "scheduler.0" + }, + "Ethernet104|6": { + "scheduler": "scheduler.0" + }, + "Ethernet108|6": { + "scheduler": "scheduler.0" + }, + "Ethernet112|6": { + "scheduler": "scheduler.0" + }, + "Ethernet116|6": { + "scheduler": "scheduler.0" + }, + "Ethernet120|6": { + "scheduler": "scheduler.0" + }, + "Ethernet124|6": { + "scheduler": "scheduler.0" + }, + "Ethernet128|6": { + "scheduler": "scheduler.0" + }, + "Ethernet132|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet140|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet160|6": { + "scheduler": "scheduler.0" + }, + "Ethernet164|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet172|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "Ethernet192|6": { + "scheduler": "scheduler.0" + }, + "Ethernet196|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet204|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet212|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet220|6": { + "scheduler": "scheduler.0" + }, + "Ethernet224|6": { + "scheduler": "scheduler.0" + }, + "Ethernet228|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet236|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet244|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "Ethernet252|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index 41f36a273d06..1d8c2dbdfff6 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -20,7 +20,8 @@ "4": "4", "5": "5", "6": "6", - "7": "7" + "7": "7", + "8": "1" }, "AZURE_TUNNEL": { "0": "0", @@ -30,7 +31,8 @@ "4": "6", "5": "5", "6": "1", - "7": "7" + "7": "7", + "8": "1" } }, "DSCP_TO_TC_MAP": { @@ -68,7 +70,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -134,7 +136,7 @@ "30": "1", "31": "1", "32": "1", - "33": "2", + "33": "8", "34": "1", "35": "1", "36": "1", @@ -171,12 +173,13 @@ "AZURE": { "0": "0", "1": "0", - "2": "0", + "2": "2", "3": "3", "4": "4", "5": "0", - "6": "0", - "7": "7" + "6": "6", + "7": "7", + "8": "0" }, "AZURE_TUNNEL": { "0": "0", @@ -186,19 +189,21 @@ "4": "6", "5": "0", "6": "0", - "7": "0" + "7": "0", + "8": "0" } }, "TC_TO_DSCP_MAP": { "AZURE_TUNNEL": { "0": "8", "1": "0", - "2": "33", + "2": "0", "3": "2", "4": "6", "5": "46", "6": "0", - "7": "48" + "7": "48", + "8": "33" } }, "SCHEDULER": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json new file mode 100644 index 000000000000..ae9fa775dc62 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json @@ -0,0 +1,1005 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet212|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet220|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet244|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet252|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet212|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet220|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet244|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "Ethernet252|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index af66af8eb59e..e18f0e165eda 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -286,6 +286,9 @@ def test_qos_dscp_remapping_render_template(self): return dir_paths = [ + '../../../device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8', + '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8', + '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64', '../../../device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8', '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8', '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64' @@ -293,12 +296,18 @@ def test_qos_dscp_remapping_render_template(self): sample_outputs = [ 'qos-arista7050cx3-dualtor.json', 'qos-arista7260-dualtor.json', - 'qos-arista7260-t1.json' + 'qos-arista7260-t1.json', + 'qos-arista7050cx3-dualtor-remap-disabled.json', + 'qos-arista7260-dualtor-remap-disabled.json', + 'qos-arista7260-t1-remap-disabled.json' ] sample_minigraph_files = [ 'sample-arista-7050cx3-dualtor-minigraph.xml', 'sample-arista-7260-dualtor-minigraph.xml', - 'sample-arista-7260-t1-minigraph.xml' + 'sample-arista-7260-t1-minigraph.xml', + 'sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml', + 'sample-arista-7260-dualtor-minigraph-remap-disabled.xml', + 'sample-arista-7260-t1-minigraph-remap-disabled.xml' ] for i, path in enumerate(dir_paths): device_template_path = os.path.join(self.test_dir, path) From 1cc602c6af33b4ca9aa277c2b361b9cd11d76008 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 3 Jun 2022 04:03:27 +0800 Subject: [PATCH 380/817] Add two extra lossless queues for bounced back traffic (#10496) Signed-off-by: bingwang Why I did it This PR is to add two extra lossless queues for bounced back traffic. HLD sonic-net/SONiC#950 SKUs include Arista-7050CX3-32S-C32 Arista-7050CX3-32S-D48C8 Arista-7260CX3-D108C8 Arista-7260CX3-C64 Arista-7260CX3-Q64 How I did it Update the buffers.json.j2 template and buffers_config.j2 template to generate new BUFFER_QUEUE table. For T1 devices, queue 2 and queue 6 are set as lossless queues on T0 facing ports. For T0 devices, queue 2 and queue 6 are set as lossless queues on T1 facing ports. Queue 7 is added as a new lossy queue as DSCP 48 is mapped to TC 7, and then mapped into Queue 7 How to verify it Verified by UT Verified by coping the new template and generate buffer config with sonic-cfggen --- .../buffers_defaults_t0.j2 | 6 + .../buffers_extra_queues.j2 | 1 + .../buffers_defaults_t0.j2 | 6 + .../buffers_extra_queues.j2 | 37 + .../Arista-7260CX3-C64/buffers_defaults_t0.j2 | 6 + .../Arista-7260CX3-C64/buffers_defaults_t1.j2 | 6 + .../buffers_extra_queues.j2 | 38 + .../buffers_defaults_t0.j2 | 6 + .../buffers_extra_queues.j2 | 1 + .../Arista-7260CX3-Q64/buffers_defaults_t0.j2 | 6 + .../Arista-7260CX3-Q64/buffers_defaults_t1.j2 | 6 + .../buffers_extra_queues.j2 | 1 + files/build_templates/buffers_config.j2 | 14 + ...-arista7050cx3-dualtor-remap-disabled.json | 487 +++++++++ .../py3/buffer-arista7050cx3-dualtor.json | 537 ++++++++++ ...fer-arista7260-dualtor-remap-disabled.json | 937 +++++++++++++++++ .../py3/buffer-arista7260-dualtor.json | 987 ++++++++++++++++++ .../buffer-arista7260-t1-remap-disabled.json | 449 ++++++++ .../py3/buffer-arista7260-t1.json | 570 ++++++++++ src/sonic-config-engine/tests/test_j2files.py | 23 + 20 files changed, 4124 insertions(+) create mode 120000 device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_extra_queues.j2 create mode 100644 device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_extra_queues.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_queues.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_extra_queues.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_queues.j2 create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 index 6bea9e4a5be0..1a6187edbddd 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 @@ -44,3 +44,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_extra_queues.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_extra_queues.j2 new file mode 120000 index 000000000000..2c4dff993ce9 --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_extra_queues.j2 @@ -0,0 +1 @@ +../Arista-7050CX3-32S-D48C8/buffers_extra_queues.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 index a7441471e0cc..bfeb2185623a 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 @@ -45,3 +45,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_extra_queues.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_extra_queues.j2 new file mode 100644 index 000000000000..8ec4ad46d667 --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_extra_queues.j2 @@ -0,0 +1,37 @@ +{% if DEVICE_METADATA is defined and 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} +{% if port in port_names_require_extra_buffer.split(',') %} + "{{ port }}|0-1": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|2-4": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|5": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|6": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% else %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endif %} +{% endfor %} + } +{% endmacro %} +{% endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 index 241f0c9a9d25..625ca0ab119e 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 @@ -44,3 +44,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 index 9294691c2f5d..68af36a27518 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 @@ -50,3 +50,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_queues.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_queues.j2 new file mode 100644 index 000000000000..3ad6c5b9bc9e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_queues.j2 @@ -0,0 +1,38 @@ +{% if DEVICE_METADATA is defined and 'type' in DEVICE_METADATA['localhost'] and +(DEVICE_METADATA['localhost']['type'] == 'LeafRouter' or DEVICE_METADATA['localhost']['subtype'] == 'DualToR') %} +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} +{% if port in port_names_require_extra_buffer.split(',') %} + "{{ port }}|0-1": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|2-4": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|5": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|6": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% else %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endif %} +{% endfor %} + } +{% endmacro %} +{% endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 index e4377bd47ab1..10b9d70d24bf 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 @@ -52,3 +52,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_extra_queues.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_extra_queues.j2 new file mode 120000 index 000000000000..92b7e9ffbee5 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_extra_queues.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_extra_queues.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 index 241f0c9a9d25..01b5a1dd8b3e 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 @@ -44,3 +44,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 index 23a969c8755e..1d8fbb3e852f 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 @@ -44,3 +44,9 @@ } }, {%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_queues.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_queues.j2 new file mode 120000 index 000000000000..92b7e9ffbee5 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_queues.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_extra_queues.j2 \ No newline at end of file diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index a67316af5f3d..814e470d0211 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -128,6 +128,16 @@ def {%- endfor %} {%- set port_names_active = port_names_list_active | join(',') %} +{%- set port_names_list_extra_queues = [] %} +{%- for port in PORT_ACTIVE %} + {%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) and + (('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'ToRRouter') or + ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'LeafRouter')) %} + {%- if port_names_list_extra_queues.append(port) %}{%- endif %} + {%- endif %} +{%- endfor %} +{%- set port_names_extra_queues = port_names_list_extra_queues | join(',') %} + {%- set port_names_list_inactive = [] %} {%- for port in PORT_INACTIVE %} {%- if port_names_list_inactive.append(port) %}{%- endif %} @@ -182,6 +192,10 @@ def {{ defs.generate_queue_buffers(port_names_active) }} {% elif defs.generate_queue_buffers_with_inactive_ports is defined %} {{ defs.generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) }} +{% elif (defs.generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports is defined) and (port_names_extra_queues != '') %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }} +{% elif (defs.generate_queue_buffers_with_extra_lossless_queues is defined) and (port_names_extra_queues != '') %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names_active, port_names_extra_queues) }} {% else %} "BUFFER_QUEUE": { {% for port in PORT_ACTIVE %} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json new file mode 100644 index 000000000000..883757d621ad --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json @@ -0,0 +1,487 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "5m", + "Ethernet2": "300m", + "Ethernet4": "5m", + "Ethernet6": "300m", + "Ethernet8": "5m", + "Ethernet10": "300m", + "Ethernet12": "5m", + "Ethernet14": "300m", + "Ethernet16": "5m", + "Ethernet18": "300m", + "Ethernet20": "5m", + "Ethernet22": "300m", + "Ethernet24": "40m", + "Ethernet28": "40m", + "Ethernet32": "40m", + "Ethernet36": "40m", + "Ethernet40": "5m", + "Ethernet42": "300m", + "Ethernet44": "5m", + "Ethernet46": "300m", + "Ethernet48": "5m", + "Ethernet50": "300m", + "Ethernet52": "5m", + "Ethernet54": "300m", + "Ethernet56": "5m", + "Ethernet58": "300m", + "Ethernet60": "5m", + "Ethernet62": "300m", + "Ethernet64": "5m", + "Ethernet66": "300m", + "Ethernet68": "5m", + "Ethernet70": "300m", + "Ethernet72": "5m", + "Ethernet74": "300m", + "Ethernet76": "5m", + "Ethernet78": "300m", + "Ethernet80": "5m", + "Ethernet82": "300m", + "Ethernet84": "5m", + "Ethernet86": "300m", + "Ethernet88": "40m", + "Ethernet92": "40m", + "Ethernet96": "40m", + "Ethernet100": "40m", + "Ethernet104": "5m", + "Ethernet106": "300m", + "Ethernet108": "5m", + "Ethernet110": "300m", + "Ethernet112": "5m", + "Ethernet114": "300m", + "Ethernet116": "5m", + "Ethernet118": "300m", + "Ethernet120": "5m", + "Ethernet122": "300m", + "Ethernet124": "5m", + "Ethernet126": "300m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "32689152", + "type": "ingress", + "mode": "dynamic", + "xoff": "2058240" + }, + "egress_lossy_pool": { + "size": "24192256", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "32340992", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"32340992" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1792", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet24|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|5-6": { + "profile" : "egress_lossy_profile" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json new file mode 100644 index 000000000000..02c3a0c6e8df --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json @@ -0,0 +1,537 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "5m", + "Ethernet2": "300m", + "Ethernet4": "5m", + "Ethernet6": "300m", + "Ethernet8": "5m", + "Ethernet10": "300m", + "Ethernet12": "5m", + "Ethernet14": "300m", + "Ethernet16": "5m", + "Ethernet18": "300m", + "Ethernet20": "5m", + "Ethernet22": "300m", + "Ethernet24": "40m", + "Ethernet28": "40m", + "Ethernet32": "40m", + "Ethernet36": "40m", + "Ethernet40": "5m", + "Ethernet42": "300m", + "Ethernet44": "5m", + "Ethernet46": "300m", + "Ethernet48": "5m", + "Ethernet50": "300m", + "Ethernet52": "5m", + "Ethernet54": "300m", + "Ethernet56": "5m", + "Ethernet58": "300m", + "Ethernet60": "5m", + "Ethernet62": "300m", + "Ethernet64": "5m", + "Ethernet66": "300m", + "Ethernet68": "5m", + "Ethernet70": "300m", + "Ethernet72": "5m", + "Ethernet74": "300m", + "Ethernet76": "5m", + "Ethernet78": "300m", + "Ethernet80": "5m", + "Ethernet82": "300m", + "Ethernet84": "5m", + "Ethernet86": "300m", + "Ethernet88": "40m", + "Ethernet92": "40m", + "Ethernet96": "40m", + "Ethernet100": "40m", + "Ethernet104": "5m", + "Ethernet106": "300m", + "Ethernet108": "5m", + "Ethernet110": "300m", + "Ethernet112": "5m", + "Ethernet114": "300m", + "Ethernet116": "5m", + "Ethernet118": "300m", + "Ethernet120": "5m", + "Ethernet122": "300m", + "Ethernet124": "5m", + "Ethernet126": "300m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "32689152", + "type": "ingress", + "mode": "dynamic", + "xoff": "2058240" + }, + "egress_lossy_pool": { + "size": "24192256", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "32340992", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"32340992" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1792", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + } + }, + + + "BUFFER_QUEUE": { + "Ethernet24|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|5-7": { + "profile" : "egress_lossy_profile" + } + } + +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor-remap-disabled.json new file mode 100644 index 000000000000..f6bad8e11d1b --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor-remap-disabled.json @@ -0,0 +1,937 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "5m", + "Ethernet2": "5m", + "Ethernet4": "5m", + "Ethernet6": "5m", + "Ethernet8": "5m", + "Ethernet10": "5m", + "Ethernet12": "5m", + "Ethernet14": "5m", + "Ethernet16": "5m", + "Ethernet18": "5m", + "Ethernet20": "5m", + "Ethernet22": "5m", + "Ethernet24": "5m", + "Ethernet26": "5m", + "Ethernet28": "5m", + "Ethernet30": "5m", + "Ethernet32": "5m", + "Ethernet34": "5m", + "Ethernet36": "5m", + "Ethernet38": "5m", + "Ethernet40": "5m", + "Ethernet42": "5m", + "Ethernet44": "5m", + "Ethernet46": "5m", + "Ethernet48": "40m", + "Ethernet52": "40m", + "Ethernet56": "40m", + "Ethernet60": "40m", + "Ethernet64": "40m", + "Ethernet68": "40m", + "Ethernet72": "40m", + "Ethernet76": "40m", + "Ethernet80": "5m", + "Ethernet82": "5m", + "Ethernet84": "5m", + "Ethernet86": "5m", + "Ethernet88": "5m", + "Ethernet90": "5m", + "Ethernet92": "5m", + "Ethernet94": "5m", + "Ethernet96": "5m", + "Ethernet98": "5m", + "Ethernet100": "5m", + "Ethernet102": "5m", + "Ethernet104": "5m", + "Ethernet106": "5m", + "Ethernet108": "5m", + "Ethernet110": "5m", + "Ethernet112": "5m", + "Ethernet114": "5m", + "Ethernet116": "5m", + "Ethernet118": "5m", + "Ethernet120": "5m", + "Ethernet122": "5m", + "Ethernet124": "5m", + "Ethernet126": "5m", + "Ethernet128": "5m", + "Ethernet130": "5m", + "Ethernet132": "5m", + "Ethernet134": "5m", + "Ethernet136": "5m", + "Ethernet138": "5m", + "Ethernet140": "5m", + "Ethernet142": "5m", + "Ethernet144": "5m", + "Ethernet146": "5m", + "Ethernet148": "5m", + "Ethernet150": "5m", + "Ethernet152": "5m", + "Ethernet154": "5m", + "Ethernet156": "5m", + "Ethernet158": "5m", + "Ethernet160": "5m", + "Ethernet162": "5m", + "Ethernet164": "5m", + "Ethernet166": "5m", + "Ethernet168": "5m", + "Ethernet170": "5m", + "Ethernet172": "5m", + "Ethernet174": "5m", + "Ethernet176": "5m", + "Ethernet178": "5m", + "Ethernet180": "5m", + "Ethernet182": "5m", + "Ethernet184": "5m", + "Ethernet186": "5m", + "Ethernet188": "5m", + "Ethernet190": "5m", + "Ethernet192": "5m", + "Ethernet194": "5m", + "Ethernet196": "5m", + "Ethernet198": "5m", + "Ethernet200": "5m", + "Ethernet202": "5m", + "Ethernet204": "5m", + "Ethernet206": "5m", + "Ethernet208": "5m", + "Ethernet210": "5m", + "Ethernet212": "5m", + "Ethernet214": "5m", + "Ethernet216": "5m", + "Ethernet218": "5m", + "Ethernet220": "5m", + "Ethernet222": "5m", + "Ethernet224": "5m", + "Ethernet226": "5m", + "Ethernet228": "5m", + "Ethernet230": "5m", + "Ethernet232": "5m", + "Ethernet234": "5m", + "Ethernet236": "5m", + "Ethernet238": "5m", + "Ethernet240": "5m", + "Ethernet242": "5m", + "Ethernet244": "5m", + "Ethernet246": "5m", + "Ethernet248": "5m", + "Ethernet250": "5m", + "Ethernet252": "5m", + "Ethernet254": "5m", + "Ethernet256": "5m", + "Ethernet260": "5m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33329088", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "26663272", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet128|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet132|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet140|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet160|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet164|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet172|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet192|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet196|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet204|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet224|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet228|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet236|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet128|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet132|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet140|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet160|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet164|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet172|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet192|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet196|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet204|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet224|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet228|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet236|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|5-6": { + "profile" : "egress_lossy_profile" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json new file mode 100644 index 000000000000..32fbfe24370a --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json @@ -0,0 +1,987 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "5m", + "Ethernet2": "5m", + "Ethernet4": "5m", + "Ethernet6": "5m", + "Ethernet8": "5m", + "Ethernet10": "5m", + "Ethernet12": "5m", + "Ethernet14": "5m", + "Ethernet16": "5m", + "Ethernet18": "5m", + "Ethernet20": "5m", + "Ethernet22": "5m", + "Ethernet24": "5m", + "Ethernet26": "5m", + "Ethernet28": "5m", + "Ethernet30": "5m", + "Ethernet32": "5m", + "Ethernet34": "5m", + "Ethernet36": "5m", + "Ethernet38": "5m", + "Ethernet40": "5m", + "Ethernet42": "5m", + "Ethernet44": "5m", + "Ethernet46": "5m", + "Ethernet48": "40m", + "Ethernet52": "40m", + "Ethernet56": "40m", + "Ethernet60": "40m", + "Ethernet64": "40m", + "Ethernet68": "40m", + "Ethernet72": "40m", + "Ethernet76": "40m", + "Ethernet80": "5m", + "Ethernet82": "5m", + "Ethernet84": "5m", + "Ethernet86": "5m", + "Ethernet88": "5m", + "Ethernet90": "5m", + "Ethernet92": "5m", + "Ethernet94": "5m", + "Ethernet96": "5m", + "Ethernet98": "5m", + "Ethernet100": "5m", + "Ethernet102": "5m", + "Ethernet104": "5m", + "Ethernet106": "5m", + "Ethernet108": "5m", + "Ethernet110": "5m", + "Ethernet112": "5m", + "Ethernet114": "5m", + "Ethernet116": "5m", + "Ethernet118": "5m", + "Ethernet120": "5m", + "Ethernet122": "5m", + "Ethernet124": "5m", + "Ethernet126": "5m", + "Ethernet128": "5m", + "Ethernet130": "5m", + "Ethernet132": "5m", + "Ethernet134": "5m", + "Ethernet136": "5m", + "Ethernet138": "5m", + "Ethernet140": "5m", + "Ethernet142": "5m", + "Ethernet144": "5m", + "Ethernet146": "5m", + "Ethernet148": "5m", + "Ethernet150": "5m", + "Ethernet152": "5m", + "Ethernet154": "5m", + "Ethernet156": "5m", + "Ethernet158": "5m", + "Ethernet160": "5m", + "Ethernet162": "5m", + "Ethernet164": "5m", + "Ethernet166": "5m", + "Ethernet168": "5m", + "Ethernet170": "5m", + "Ethernet172": "5m", + "Ethernet174": "5m", + "Ethernet176": "5m", + "Ethernet178": "5m", + "Ethernet180": "5m", + "Ethernet182": "5m", + "Ethernet184": "5m", + "Ethernet186": "5m", + "Ethernet188": "5m", + "Ethernet190": "5m", + "Ethernet192": "5m", + "Ethernet194": "5m", + "Ethernet196": "5m", + "Ethernet198": "5m", + "Ethernet200": "5m", + "Ethernet202": "5m", + "Ethernet204": "5m", + "Ethernet206": "5m", + "Ethernet208": "5m", + "Ethernet210": "5m", + "Ethernet212": "5m", + "Ethernet214": "5m", + "Ethernet216": "5m", + "Ethernet218": "5m", + "Ethernet220": "5m", + "Ethernet222": "5m", + "Ethernet224": "5m", + "Ethernet226": "5m", + "Ethernet228": "5m", + "Ethernet230": "5m", + "Ethernet232": "5m", + "Ethernet234": "5m", + "Ethernet236": "5m", + "Ethernet238": "5m", + "Ethernet240": "5m", + "Ethernet242": "5m", + "Ethernet244": "5m", + "Ethernet246": "5m", + "Ethernet248": "5m", + "Ethernet250": "5m", + "Ethernet252": "5m", + "Ethernet254": "5m", + "Ethernet256": "5m", + "Ethernet260": "5m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33329088", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "26663272", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } + }, + + + "BUFFER_QUEUE": { + "Ethernet48|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet48|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet52|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet56|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet60|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet72|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet76|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet128|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet128|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet132|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet132|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet140|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet140|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet160|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet160|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet164|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet164|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet172|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet172|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet192|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet192|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet196|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet196|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet204|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet204|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet224|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet224|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet228|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet228|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet236|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet236|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5-7": { + "profile" : "egress_lossy_profile" + } + } + +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1-remap-disabled.json new file mode 100644 index 000000000000..9306b98e8134 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1-remap-disabled.json @@ -0,0 +1,449 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "300m", + "Ethernet12": "300m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "300m", + "Ethernet28": "300m", + "Ethernet32": "300m", + "Ethernet36": "300m", + "Ethernet40": "300m", + "Ethernet44": "300m", + "Ethernet48": "300m", + "Ethernet52": "300m", + "Ethernet56": "300m", + "Ethernet60": "300m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "300m", + "Ethernet76": "300m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "300m", + "Ethernet92": "300m", + "Ethernet96": "300m", + "Ethernet100": "300m", + "Ethernet104": "300m", + "Ethernet108": "300m", + "Ethernet112": "300m", + "Ethernet116": "300m", + "Ethernet120": "300m", + "Ethernet124": "300m", + "Ethernet128": "300m", + "Ethernet132": "300m", + "Ethernet136": "40m", + "Ethernet140": "300m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "300m", + "Ethernet164": "300m", + "Ethernet168": "40m", + "Ethernet172": "300m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "300m", + "Ethernet196": "300m", + "Ethernet200": "40m", + "Ethernet204": "300m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "300m", + "Ethernet228": "300m", + "Ethernet232": "40m", + "Ethernet236": "300m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m", + "Ethernet256": "300m", + "Ethernet260": "300m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33582016", + "type": "ingress", + "mode": "dynamic", + "xoff": "8965632" + }, + "egress_lossy_pool": { + "size": "26866112", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|5-6": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|5-6": { + "profile" : "egress_lossy_profile" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json new file mode 100644 index 000000000000..2491d376c771 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json @@ -0,0 +1,570 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "300m", + "Ethernet12": "300m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "300m", + "Ethernet28": "300m", + "Ethernet32": "300m", + "Ethernet36": "300m", + "Ethernet40": "300m", + "Ethernet44": "300m", + "Ethernet48": "300m", + "Ethernet52": "300m", + "Ethernet56": "300m", + "Ethernet60": "300m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "300m", + "Ethernet76": "300m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "300m", + "Ethernet92": "300m", + "Ethernet96": "300m", + "Ethernet100": "300m", + "Ethernet104": "300m", + "Ethernet108": "300m", + "Ethernet112": "300m", + "Ethernet116": "300m", + "Ethernet120": "300m", + "Ethernet124": "300m", + "Ethernet128": "300m", + "Ethernet132": "300m", + "Ethernet136": "40m", + "Ethernet140": "300m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "300m", + "Ethernet164": "300m", + "Ethernet168": "40m", + "Ethernet172": "300m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "300m", + "Ethernet196": "300m", + "Ethernet200": "40m", + "Ethernet204": "300m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "300m", + "Ethernet228": "300m", + "Ethernet232": "40m", + "Ethernet236": "300m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m", + "Ethernet256": "300m", + "Ethernet260": "300m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33582016", + "type": "ingress", + "mode": "dynamic", + "xoff": "8965632" + }, + "egress_lossy_pool": { + "size": "26866112", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, + "BUFFER_PG": { + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet136|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet136|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet144|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet148|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet152|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet156|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet168|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet176|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "egress_lossy_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|5-7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet180|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet184|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet188|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet200|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet208|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet212|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet216|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet220|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet232|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet240|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet244|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet248|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|7": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|0-1": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5": { + "profile" : "egress_lossy_profile" + }, + "Ethernet252|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|7": { + "profile" : "egress_lossy_profile" + } + } + +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index e18f0e165eda..a13669772133 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -364,6 +364,29 @@ def test_buffers_mellanox2410_render_template(self): def test_buffers_mellanox2410_dynamic_render_template(self): self._test_buffers_render_template('mellanox', 'x86_64-mlnx_msn2410-r0', 'ACS-MSN2410', 'sample-mellanox-2410-t1-minigraph.xml', 'buffers_dynamic.json.j2', 'buffers-mellanox2410-dynamic.json') + def test_extra_lossless_buffer_for_tunnel_remapping(self): + if utils.PYvX_DIR != 'py3': + # Skip on python2 as the change will not be backported to previous version + return + + TEST_DATA = [ + # (vendor, platform, sku, minigraph, buffer_template, sample_output ) + ('arista', 'x86_64-arista_7050cx3_32s', 'Arista-7050CX3-32S-D48C8', 'sample-arista-7050cx3-dualtor-minigraph.xml', 'buffers.json.j2', 'buffer-arista7050cx3-dualtor.json'), + ('arista', 'x86_64-arista_7050cx3_32s', 'Arista-7050CX3-32S-D48C8', 'sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7050cx3-dualtor-remap-disabled.json'), + ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-D108C8', 'sample-arista-7260-dualtor-minigraph.xml', 'buffers.json.j2', 'buffer-arista7260-dualtor.json'), + ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-D108C8', 'sample-arista-7260-dualtor-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-dualtor-remap-disabled.json'), + ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph.xml', 'buffers.json.j2', 'buffer-arista7260-t1.json'), + ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-t1-remap-disabled.json') + ] + + for test_data in TEST_DATA: + self._test_buffers_render_template(vendor=test_data[0], + platform=test_data[1], + sku=test_data[2], + minigraph=test_data[3], + buffer_template=test_data[4], + expected=test_data[5]) + def test_ipinip_multi_asic(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') argument = '-m ' + self.multi_asic_minigraph + ' -p ' + self.multi_asic_port_config + ' -t ' + ipinip_file + ' -n asic0 ' + ' > ' + self.output_file From 4ef8b38edb682cb09547eefa14b727fc762b670e Mon Sep 17 00:00:00 2001 From: yozhao101 <56170650+yozhao101@users.noreply.github.com> Date: Thu, 2 Jun 2022 15:59:36 -0700 Subject: [PATCH 381/817] [hostcfgd] Initialize `Restart=` in feature's systemd config by the value of `auto_restart` in `CONFIG_DB` (#10915) Why I did it Recently the nightly testing pipeline found that the autorestart test case was failed when it was run against master image. The reason is Restart= field in each container's systemd configuration file was set to Restart=no even the value of auto_restart field in FEATURE table of CONFIG_DB is enabled. This issue introduced by #10168 can be reproduced by the following steps: Issues the config command to disable the auto-restart feature of a container Runs command config reload or config reload minigraph to enable auto-restart of the container Checks Restart= field in the container's systemd config file mentioned in step 1 by running the command sudo systemctl cat .service Initially this PR (#10168) wants to revert the changes proposed by this: #8861. However, it did not fully revert all the changes. How I did it When hostcfgd started or was restarted, the Restart= field in each container's systemd configuration file should be initialized according to the value of auto_restart field in FEATURE table of CONFIG_DB. How to verify it I verified this change by running auto-restart test case against newly built master image and also ran the unittest: --- src/sonic-host-services/scripts/hostcfgd | 78 ++++--- .../tests/hostcfgd/hostcfgd_test.py | 196 +++++++++++------- .../tests/hostcfgd/test_vectors.py | 28 ++- 3 files changed, 188 insertions(+), 114 deletions(-) diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd index 7f8f4be0b2e7..41da37490be4 100755 --- a/src/sonic-host-services/scripts/hostcfgd +++ b/src/sonic-host-services/scripts/hostcfgd @@ -104,6 +104,7 @@ def obfuscate(data): else: return data + def get_pid(procname): for dirname in os.listdir('/proc'): if dirname == 'curproc': @@ -117,6 +118,7 @@ def get_pid(procname): return dirname return "" + class Feature(object): """ Represents a feature configuration from CONFIG_DB data. """ @@ -182,10 +184,10 @@ class FeatureHandler(object): self._cached_config = {} self.is_multi_npu = device_info.is_multi_npu() - def handle(self, feature_name, op, feature_cfg): + def handler(self, feature_name, op, feature_cfg): if not feature_cfg: syslog.syslog(syslog.LOG_INFO, "Deregistering feature {}".format(feature_name)) - self._cached_config.pop(feature_name) + self._cached_config.pop(feature_name, None) self._feature_state_table._del(feature_name) return @@ -197,7 +199,11 @@ class FeatureHandler(object): # the next called self.update_feature_state will start it again. If it will fail # again the auto restart will kick-in. Another order may leave it in failed state # and not auto restart. - self.update_feature_auto_restart(feature, feature_name) + if self._cached_config[feature_name].auto_restart != feature.auto_restart: + syslog.syslog(syslog.LOG_INFO, "Auto-restart status of feature '{}' is changed from '{}' to '{}' ..." + .format(feature_name, self._cached_config[feature_name].auto_restart, feature.auto_restart)) + self.update_systemd_config(feature) + self._cached_config[feature_name].auto_restart = feature.auto_restart # Enable/disable the container service if the feature state was changed from its previous state. if self._cached_config[feature_name].state != feature.state: @@ -220,7 +226,7 @@ class FeatureHandler(object): feature = Feature(feature_name, feature_table[feature_name], self._device_config) self._cached_config.setdefault(feature_name, feature) - self.update_feature_auto_restart(feature, feature_name) + self.update_systemd_config(feature) self.update_feature_state(feature) self.resync_feature_state(feature) @@ -265,41 +271,45 @@ class FeatureHandler(object): return True - def update_feature_auto_restart(self, feature, feature_name): - dir_name = self.SYSTEMD_SERVICE_CONF_DIR.format(feature_name) - auto_restart_conf = os.path.join(dir_name, 'auto_restart.conf') + def update_systemd_config(self, feature_config): + """Updates `Restart=` field in feature's systemd configuration file + according to the value of `auto_restart` field in `FEATURE` table of `CONFIG_DB`. - write_conf = False - if not os.path.exists(auto_restart_conf): # if the auto_restart_conf file is not found, set it - write_conf = True - - if self._cached_config[feature_name].auto_restart != feature.auto_restart: - write_conf = True + Args: + feature: An object represents a feature's configuration in `FEATURE` + table of `CONFIG_DB`. - if not write_conf: - return + Returns: + None. + """ + restart_field_str = "always" if "enabled" in feature_config.auto_restart else "no" + feature_systemd_config = "[Service]\nRestart={}\n".format(restart_field_str) + feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature_config) - self._cached_config[feature_name].auto_restart = feature.auto_restart # Update Cache + # On multi-ASIC device, creates systemd configuration file for each feature instance + # residing in difference namespace. + for feature_name in feature_names: + syslog.syslog(syslog.LOG_INFO, "Updating feature '{}' systemd config file related to auto-restart ..." + .format(feature_name)) + feature_systemd_config_dir_path = self.SYSTEMD_SERVICE_CONF_DIR.format(feature_name) + feature_systemd_config_file_path = os.path.join(feature_systemd_config_dir_path, 'auto_restart.conf') - restart_config = "always" if feature.auto_restart == "enabled" else "no" - service_conf = "[Service]\nRestart={}\n".format(restart_config) - feature_names, feature_suffixes = self.get_feature_attribute(feature) + if not os.path.exists(feature_systemd_config_dir_path): + os.mkdir(feature_systemd_config_dir_path) + with open(feature_systemd_config_file_path, 'w') as feature_systemd_config_file_handler: + feature_systemd_config_file_handler.write(feature_systemd_config) - for name in feature_names: - dir_name = self.SYSTEMD_SERVICE_CONF_DIR.format(name) - auto_restart_conf = os.path.join(dir_name, 'auto_restart.conf') - if not os.path.exists(dir_name): - os.mkdir(dir_name) - with open(auto_restart_conf, 'w') as cfgfile: - cfgfile.write(service_conf) + syslog.syslog(syslog.LOG_INFO, "Feautre '{}' systemd config file related to auto-restart is updated!" + .format(feature_name)) try: + syslog.syslog(syslog.LOG_INFO, "Reloading systemd configuration files ...") run_cmd("sudo systemctl daemon-reload", raise_exception=True) + syslog.syslog(syslog.LOG_INFO, "Systemd configuration files are reloaded!") except Exception as err: - syslog.syslog(syslog.LOG_ERR, "Feature '{}' failed to configure auto_restart".format(feature.name)) - return + syslog.syslog(syslog.LOG_ERR, "Failed to reload systemd configuration files!") - def get_feature_attribute(self, feature): + def get_multiasic_feature_instances(self, feature): # Create feature name suffix depending feature is running in host or namespace or in both feature_names = ( ([feature.name] if feature.has_global_scope or not self.is_multi_npu else []) + @@ -330,7 +340,7 @@ class FeatureHandler(object): def enable_feature(self, feature): cmds = [] - feature_names, feature_suffixes = self.get_feature_attribute(feature) + feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature) for feature_name in feature_names: # Check if it is already enabled, if yes skip the system call unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1])) @@ -352,7 +362,7 @@ class FeatureHandler(object): run_cmd(cmd, raise_exception=True) except Exception as err: syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be enabled and started" - .format(feature.name, feature_suffixes[-1])) + .format(feature.name, feature_suffixes[-1])) self.set_feature_state(feature, self.FEATURE_STATE_FAILED) return @@ -360,7 +370,7 @@ class FeatureHandler(object): def disable_feature(self, feature): cmds = [] - feature_names, feature_suffixes = self.get_feature_attribute(feature) + feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature) for feature_name in feature_names: # Check if it is already disabled, if yes skip the system call unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1])) @@ -377,7 +387,7 @@ class FeatureHandler(object): run_cmd(cmd, raise_exception=True) except Exception as err: syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be stopped and disabled" - .format(feature.name, feature_suffixes[-1])) + .format(feature.name, feature_suffixes[-1])) self.set_feature_state(feature, self.FEATURE_STATE_FAILED) return @@ -1212,7 +1222,7 @@ class HostConfigDaemon: self.config_db.subscribe('KDUMP', make_callback(self.kdump_handler)) # Handle FEATURE updates before other tables - self.config_db.subscribe('FEATURE', make_callback(self.feature_handler.handle)) + self.config_db.subscribe('FEATURE', make_callback(self.feature_handler.handler)) # Handle AAA, TACACS and RADIUS related tables self.config_db.subscribe('AAA', make_callback(self.aaa_handler)) self.config_db.subscribe('TACPLUS', make_callback(self.tacacs_global_handler)) diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py index 28d4f6f8a724..786bd1c8f2a9 100644 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py @@ -27,112 +27,162 @@ hostcfgd.Table = mock.Mock() -class TestHostcfgd(TestCase): +class TestFeatureHandler(TestCase): + """Test methods of `FeatureHandler` class. """ - Test hostcfd daemon - feature - """ - def __verify_table(self, table, feature_state_table, expected_table): + def checks_config_table(self, feature_table, expected_table): + """Compares `FEATURE` table in `CONFIG_DB` with expected output table. + + Args: + feature_table: A dictionary indicates current `FEATURE` table in `CONFIG_DB`. + expected_table A dictionary indicates the expected `FEATURE` table in `CONFIG_DB`. + + Returns: + Returns True if `FEATURE` table in `CONFIG_DB` was not modified unexpectedly; + otherwise, returns False. """ - verify config db tables + ddiff = DeepDiff(feature_table, expected_table, ignore_order=True) + + return True if not ddiff else False - Compares Config DB table (FEATURE) with expected output table. - Verifies that State DB table (FEATURE) is updated. + def checks_systemd_config_file(self, feature_table): + """Checks whether the systemd configuration file of each feature was created or not + and whether the `Restart=` field in the file is set correctly or not. - Args: - table(dict): Current Config Db table - feature_state_table(Mock): Mocked State DB FEATURE table - expected_table(dict): Expected Config Db table + Args: + feature_table: A dictionary indicates `Feature` table in `CONFIG_DB`. - Returns: - None + Returns: Boolean value indicates whether test passed or not. """ - ddiff = DeepDiff(table, expected_table, ignore_order=True) - print('DIFF:', ddiff) - - def get_state(cfg_state): - """ Translates CONFIG DB state field into STATE DB state field """ - if cfg_state == 'always_disabled': - return 'disabled' - elif cfg_state == 'always_enabled': - return 'enabled' - else: - return cfg_state - feature_state_table.set.assert_has_calls([ - mock.call(feature, [('state', get_state(table[feature]['state']))]) for feature in table - ]) - return True if not ddiff else False + truth_table = {'enabled': 'always', + 'disabled': 'no'} + + systemd_config_file_path = os.path.join(hostcfgd.FeatureHandler.SYSTEMD_SERVICE_CONF_DIR, + 'auto_restart.conf') + + for feature_name in feature_table: + auto_restart_status = feature_table[feature_name].get('auto_restart', 'disabled') + if "enabled" in auto_restart_status: + auto_restart_status = "enabled" + elif "disabled" in auto_restart_status: + auto_restart_status = "disabled" - def __verify_fs(self, table): + feature_systemd_config_file_path = systemd_config_file_path.format(feature_name) + is_config_file_existing = os.path.exists(feature_systemd_config_file_path) + assert is_config_file_existing, "Systemd configuration file of feature '{}' does not exist!".format(feature_name) + + with open(feature_systemd_config_file_path) as systemd_config_file: + status = systemd_config_file.read().strip() + assert status == '[Service]\nRestart={}'.format(truth_table[auto_restart_status]) + + def get_state_db_set_calls(self, feature_table): + """Returns a Mock call objects which recorded the `set` calls to `FEATURE` table in `STATE_DB`. + + Args: + feature_table: A dictionary indicates `FEATURE` table in `CONFIG_DB`. + + Returns: + set_call_list: A list indicates Mock call objects. """ - verify filesystem changes made by hostcfgd. + set_call_list = [] + + for feature_name in feature_table.keys(): + feature_state = "" + if "enabled" in feature_table[feature_name]["state"]: + feature_state = "enabled" + elif "disabled" in feature_table[feature_name]["state"]: + feature_state = "disabled" + else: + feature_state = feature_table[feature_name]["state"] + + set_call_list.append(mock.call(feature_name, [("state", feature_state)])) - Checks whether systemd override configuration files - were generated and Restart= for systemd unit is set - correctly + return set_call_list + + @parameterized.expand(HOSTCFGD_TEST_VECTOR) + @patchfs + def test_sync_state_field(self, test_scenario_name, config_data, fs): + """Tests the method `sync_state_field(...)` of `FeatureHandler` class. - Args: - table(dict): Current Config Db table + Args: + test_secnario_name: A string indicates different testing scenario. + config_data: A dictionary contains initial `CONFIG_DB` tables and expected results. - Returns: Boolean wether test passed. + Returns: + Boolean value indicates whether test will pass or not. """ + # add real path of sesscommon for database_config.json + fs.add_real_paths(swsscommon_package.__path__) + fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - exp_dict = { - 'enabled': 'always', - 'disabled': 'no', - } - auto_restart_conf = os.path.join(hostcfgd.FeatureHandler.SYSTEMD_SERVICE_CONF_DIR, 'auto_restart.conf') + MockConfigDb.set_config_db(config_data['config_db']) + feature_state_table_mock = mock.Mock() + with mock.patch('hostcfgd.subprocess') as mocked_subprocess: + popen_mock = mock.Mock() + attrs = config_data['popen_attributes'] + popen_mock.configure_mock(**attrs) + mocked_subprocess.Popen.return_value = popen_mock - for feature in table: - auto_restart = table[feature].get('auto_restart', 'disabled') - with open(auto_restart_conf.format(feature)) as conf: - conf = conf.read().strip() - assert conf == '[Service]\nRestart={}'.format(exp_dict[auto_restart]) + device_config = {} + device_config['DEVICE_METADATA'] = MockConfigDb.CONFIG_DB['DEVICE_METADATA'] + feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) + + feature_table = MockConfigDb.CONFIG_DB['FEATURE'] + feature_handler.sync_state_field(feature_table) + + is_any_difference = self.checks_config_table(MockConfigDb.get_config_db()['FEATURE'], + config_data['expected_config_db']['FEATURE']) + assert is_any_difference, "'FEATURE' table in 'CONFIG_DB' is modified unexpectedly!" + + feature_table_state_db_calls = self.get_state_db_set_calls(feature_table) + self.checks_systemd_config_file(config_data['config_db']['FEATURE']) + mocked_subprocess.check_call.assert_has_calls(config_data['enable_feature_subprocess_calls'], + any_order=True) + mocked_subprocess.check_call.assert_has_calls(config_data['daemon_reload_subprocess_call'], + any_order=True) + feature_state_table_mock.set.assert_has_calls(feature_table_state_db_calls) + self.checks_systemd_config_file(config_data['config_db']['FEATURE']) @parameterized.expand(HOSTCFGD_TEST_VECTOR) @patchfs - def test_hostcfgd_feature_handler(self, test_name, test_data, fs): - """ - Test feature config capability in the hostcfd + def test_handler(self, test_scenario_name, config_data, fs): + """Tests the method `handle(...)` of `FeatureHandler` class. - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results + Args: + test_secnario_name: A string indicates different testing scenario. + config_data: A dictionary contains initial `CONFIG_DB` tables and expected results. - Returns: - None + Returns: + Boolean value indicates whether test will pass or not. """ - fs.add_real_paths(swsscommon_package.__path__) # add real path of swsscommon for database_config.json + # add real path of sesscommon for database_config.json + fs.add_real_paths(swsscommon_package.__path__) fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - MockConfigDb.set_config_db(test_data['config_db']) + + MockConfigDb.set_config_db(config_data['config_db']) feature_state_table_mock = mock.Mock() with mock.patch('hostcfgd.subprocess') as mocked_subprocess: popen_mock = mock.Mock() - attrs = test_data['popen_attributes'] + attrs = config_data['popen_attributes'] popen_mock.configure_mock(**attrs) mocked_subprocess.Popen.return_value = popen_mock - # Initialize Feature Handler device_config = {} device_config['DEVICE_METADATA'] = MockConfigDb.CONFIG_DB['DEVICE_METADATA'] feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) - # sync the state field and Handle Feature Updates - features = MockConfigDb.CONFIG_DB['FEATURE'] - feature_handler.sync_state_field(features) - for key, fvs in features.items(): - feature_handler.handle(key, 'SET', fvs) - - # Verify if the updates are properly updated - assert self.__verify_table( - MockConfigDb.get_config_db()['FEATURE'], - feature_state_table_mock, - test_data['expected_config_db']['FEATURE'] - ), 'Test failed for test data: {0}'.format(test_data) - mocked_subprocess.check_call.assert_has_calls(test_data['expected_subprocess_calls'], any_order=True) - - self.__verify_fs(test_data['config_db']['FEATURE']) + feature_table = MockConfigDb.CONFIG_DB['FEATURE'] + + for feature_name, feature_config in feature_table.items(): + feature_handler.handler(feature_name, 'SET', feature_config) + + self.checks_systemd_config_file(config_data['config_db']['FEATURE']) + mocked_subprocess.check_call.assert_has_calls(config_data['enable_feature_subprocess_calls'], + any_order=True) + mocked_subprocess.check_call.assert_has_calls(config_data['daemon_reload_subprocess_call'], + any_order=True) def test_feature_config_parsing(self): swss_feature = hostcfgd.Feature('swss', { diff --git a/src/sonic-host-services/tests/hostcfgd/test_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_vectors.py index 28ffe89d841c..43754252c0e3 100644 --- a/src/sonic-host-services/tests/hostcfgd/test_vectors.py +++ b/src/sonic-host-services/tests/hostcfgd/test_vectors.py @@ -41,7 +41,7 @@ "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" }, "telemetry": { - "auto_restart": "disabled", + "auto_restart": "enabled", "has_global_scope": "True", "has_per_asic_scope": "False", "has_timer": "True", @@ -73,7 +73,7 @@ "state": "enabled" }, "telemetry": { - "auto_restart": "disabled", + "auto_restart": "enabled", "has_global_scope": "True", "has_per_asic_scope": "False", "has_timer": "True", @@ -84,7 +84,7 @@ }, }, }, - "expected_subprocess_calls": [ + "enable_feature_subprocess_calls": [ call("sudo systemctl unmask dhcp_relay.service", shell=True), call("sudo systemctl enable dhcp_relay.service", shell=True), call("sudo systemctl start dhcp_relay.service", shell=True), @@ -96,6 +96,9 @@ call("sudo systemctl enable telemetry.timer", shell=True), call("sudo systemctl start telemetry.timer", shell=True), ], + "daemon_reload_subprocess_call": [ + call("sudo systemctl daemon-reload", shell=True), + ], "popen_attributes": { 'communicate.return_value': ('output', 'error') }, @@ -198,7 +201,7 @@ }, }, }, - "expected_subprocess_calls": [ + "enable_feature_subprocess_calls": [ call("sudo systemctl stop mux.service", shell=True), call("sudo systemctl disable mux.service", shell=True), call("sudo systemctl mask mux.service", shell=True), @@ -210,6 +213,9 @@ call("sudo systemctl enable sflow.service", shell=True), call("sudo systemctl start sflow.service", shell=True), ], + "daemon_reload_subprocess_call": [ + call("sudo systemctl daemon-reload", shell=True), + ], "popen_attributes": { 'communicate.return_value': ('output', 'error') }, @@ -294,7 +300,7 @@ }, }, }, - "expected_subprocess_calls": [ + "enable_feature_subprocess_calls": [ call("sudo systemctl stop mux.service", shell=True), call("sudo systemctl disable mux.service", shell=True), call("sudo systemctl mask mux.service", shell=True), @@ -303,6 +309,9 @@ call("sudo systemctl enable telemetry.timer", shell=True), call("sudo systemctl start telemetry.timer", shell=True), ], + "daemon_reload_subprocess_call": [ + call("sudo systemctl daemon-reload", shell=True), + ], "popen_attributes": { 'communicate.return_value': ('output', 'error') }, @@ -387,7 +396,7 @@ }, }, }, - "expected_subprocess_calls": [ + "enable_feature_subprocess_calls": [ call("sudo systemctl unmask dhcp_relay.service", shell=True), call("sudo systemctl enable dhcp_relay.service", shell=True), call("sudo systemctl start dhcp_relay.service", shell=True), @@ -399,6 +408,9 @@ call("sudo systemctl enable telemetry.timer", shell=True), call("sudo systemctl start telemetry.timer", shell=True), ], + "daemon_reload_subprocess_call": [ + call("sudo systemctl daemon-reload", shell=True), + ], "popen_attributes": { 'communicate.return_value': ('output', 'error') }, @@ -484,7 +496,9 @@ }, }, }, - "expected_subprocess_calls": [ + "enable_feature_subprocess_calls": [], + "daemon_reload_subprocess_call": [ + call("sudo systemctl daemon-reload", shell=True), ], "popen_attributes": { 'communicate.return_value': ('enabled', 'error') From e4ed475fcde0d68abb3b2814a71b76296642a7ee Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 3 Jun 2022 14:30:09 +0800 Subject: [PATCH 382/817] Change pycommon to use swsscommon (#10099) #### Why I did it Switch py-common from swsssdk to swsscommon. #### How I did it Change code and make file to use swsscommon. #### How to verify it Pass all UT and E2E test. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- rules/sonic-py-common.mk | 3 +++ src/sonic-py-common/setup.py | 8 -------- src/sonic-py-common/sonic_py_common/device_info.py | 4 +--- src/sonic-py-common/tests/device_info_test.py | 2 +- .../tests/{mock_swsssdk.py => mock_swsscommon.py} | 0 5 files changed, 5 insertions(+), 12 deletions(-) rename src/sonic-py-common/tests/{mock_swsssdk.py => mock_swsscommon.py} (100%) diff --git a/rules/sonic-py-common.mk b/rules/sonic-py-common.mk index be5f5d8e696a..4d315c8b97c4 100644 --- a/rules/sonic-py-common.mk +++ b/rules/sonic-py-common.mk @@ -4,6 +4,8 @@ ifeq ($(ENABLE_PY2_MODULES), y) SONIC_PY_COMMON_PY2 = sonic_py_common-1.0-py2-none-any.whl $(SONIC_PY_COMMON_PY2)_SRC_PATH = $(SRC_PATH)/sonic-py-common $(SONIC_PY_COMMON_PY2)_DEPENDS += $(SWSSSDK_PY2) + $(SONIC_PY_COMMON_PY2)_DEBS_DEPENDS = $(LIBSWSSCOMMON) \ + $(PYTHON_SWSSCOMMON) $(SONIC_PY_COMMON_PY2)_PYTHON_VERSION = 2 SONIC_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY2) endif @@ -13,6 +15,7 @@ endif SONIC_PY_COMMON_PY3 = sonic_py_common-1.0-py3-none-any.whl $(SONIC_PY_COMMON_PY3)_SRC_PATH = $(SRC_PATH)/sonic-py-common $(SONIC_PY_COMMON_PY3)_DEPENDS += $(SWSSSDK_PY3) +$(SONIC_PY_COMMON_PY3)_DEBS_DEPENDS = $(PYTHON3_SWSSCOMMON) ifeq ($(ENABLE_PY2_MODULES), y) # Synthetic dependency to avoid building the Python 2 and 3 packages # simultaneously and any potential conflicts which may arise diff --git a/src/sonic-py-common/setup.py b/src/sonic-py-common/setup.py index bed64fe7fd22..f12c0d83cb77 100644 --- a/src/sonic-py-common/setup.py +++ b/src/sonic-py-common/setup.py @@ -3,11 +3,6 @@ dependencies = [ 'natsort==6.2.1', # 6.2.1 is the last version which supports Python 2 'pyyaml', - 'swsssdk>=2.0.1', -] - -high_performance_deps = [ - 'swsssdk[high_perf]>=2.0.1', ] setup( @@ -21,9 +16,6 @@ maintainer='Joe LeVeque', maintainer_email='jolevequ@microsoft.com', install_requires=dependencies, - extras_require={ - 'high_perf': high_performance_deps, - }, packages=[ 'sonic_py_common', ], diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index d57e08b3b5cb..73654b8819b8 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -7,8 +7,7 @@ import yaml from natsort import natsorted -# TODO: Replace with swsscommon -from swsssdk import ConfigDBConnector, SonicDBConfig, SonicV2Connector +from swsscommon.swsscommon import ConfigDBConnector, SonicV2Connector USR_SHARE_SONIC_PATH = "/usr/share/sonic" HOST_DEVICE_PATH = USR_SHARE_SONIC_PATH + "/device" @@ -485,7 +484,6 @@ def get_all_namespaces(config_db=None): front_ns = [] back_ns = [] num_npus = get_num_npus() - SonicDBConfig.load_sonic_global_db_config() if is_multi_npu(): for npu in range(num_npus): diff --git a/src/sonic-py-common/tests/device_info_test.py b/src/sonic-py-common/tests/device_info_test.py index bb7af40ad970..1256037ff560 100644 --- a/src/sonic-py-common/tests/device_info_test.py +++ b/src/sonic-py-common/tests/device_info_test.py @@ -13,7 +13,7 @@ from sonic_py_common import device_info -from .mock_swsssdk import SonicV2Connector +from .mock_swsscommon import SonicV2Connector # TODO: Remove this if/else block once we no longer support Python 2 if sys.version_info.major == 3: diff --git a/src/sonic-py-common/tests/mock_swsssdk.py b/src/sonic-py-common/tests/mock_swsscommon.py similarity index 100% rename from src/sonic-py-common/tests/mock_swsssdk.py rename to src/sonic-py-common/tests/mock_swsscommon.py From 80fb2e220c5bf56b810f5221b1041cf1a1b18ac6 Mon Sep 17 00:00:00 2001 From: youshcentec <63637102+youshcentec@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:31:34 +0800 Subject: [PATCH 383/817] update centec-sai reference to v1.10.1-0 (#10983) Co-authored-by: yoush --- platform/centec-arm64/sai.mk | 2 +- platform/centec/sdk.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/centec-arm64/sai.mk b/platform/centec-arm64/sai.mk index a6fd05c858c0..dbe94c5eb404 100755 --- a/platform/centec-arm64/sai.mk +++ b/platform/centec-arm64/sai.mk @@ -1,6 +1,6 @@ # Centec SAI -export CENTEC_SAI_VERSION = 1.9.1-0 +export CENTEC_SAI_VERSION = 1.10.1-0 export CENTEC_SAI = libsai_$(CENTEC_SAI_VERSION)_$(PLATFORM_ARCH).deb $(CENTEC_SAI)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI) diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk index 2f56265b4890..668fde39077a 100644 --- a/platform/centec/sdk.mk +++ b/platform/centec/sdk.mk @@ -1,5 +1,5 @@ # Centec SAI -CENTEC_SAI = libsai_1.9.1-0_amd64.deb +CENTEC_SAI = libsai_1.10.1-0_amd64.deb $(CENTEC_SAI)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/amd64/sai/$(CENTEC_SAI) $(eval $(call add_conflict_package,$(CENTEC_SAI),$(LIBSAIVS_DEV))) From 302d3c8f576bbc219327943cc4fd1e7ee97ca2aa Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Sat, 4 Jun 2022 09:43:48 +0300 Subject: [PATCH 384/817] [sonic-sairedis] don't try to build python-pysairedis (python2) on bullseye (#10950) To not try to build python2 bindings for sairedis for bullseye. The same solution was done for swss-common package. Releated changes Azure/sonic-sairedis#1050 Signed-off-by: Stepan Blyschak --- rules/sairedis.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 1d38a74b1433..fe77c98b86ab 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -45,6 +45,10 @@ $(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) $(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) +ifeq ($(ENABLE_PY2_MODULES), n) + $(LIBSWSSCOMMON)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 +endif + # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} # are archived into debug one image to facilitate debugging. # From 0b8e463db4b9518384dbeebba96af0f8731ffdf2 Mon Sep 17 00:00:00 2001 From: vdahiya12 <67608553+vdahiya12@users.noreply.github.com> Date: Sat, 4 Jun 2022 07:41:15 -0700 Subject: [PATCH 385/817] [sonic-platform-common][sonic-platform-daemons] submodule update; Remove python2 sonic-platform-common wheel (#10994) * [sonic-platform-common][sonic-platform-daemons] submodule update vdahiya@vdahiya-dev3:~/sonic-buildimage8/sonic-buildimage/src/sonic-platform-daemons$ git log --oneline 9ac12bf..master 0d90023 (HEAD -> master, origin/master, origin/HEAD, origin/202205) grpc client implementation for active-active dualtor (#248) 6b8bf69 [ycabled] Fix some syntax warnings in ycabled (#263) 2bcf936 [ycabled] fix the posting for mux_cable_static_info per downlink when ycabled is spawned; synchronizing executing Telemetry API (#257) ce217c0 Include changes from xcvr_api in transceiver_info table (#253) e0f8a35 Fix checkReplyType failed issue via recreating xcvr_table_helper on forking subprocess (#255) f575a40 (origin/master, origin/HEAD, origin/202205, master) [Credo][Ycable] changes for synchronizing executing Telemetry API's when mux toggle is inprogress (#280) b043372 [sonic_ssd] Nokia-7215: "show platform ssdhealth" not showing health percent (#279) d62d3d6 [CMIS]Fix low-power to high power mode transition (#268) f918125 [syseeprom] Enable display of vendor extension TLV content (#270) 4e08440 [Credo][Ycable] improve logging for Server Powered off/Faulty cables (#272) Signed-off-by: vaibhav-dahiya * remove python2 wheel for sonic-platform-common Signed-off-by: vaibhav-dahiya * remove python2 platform_common definitions Signed-off-by: vaibhav-dahiya --- platform/mellanox/mlnx-platform-api.mk | 11 ----------- rules/sonic-platform-common.dep | 8 -------- rules/sonic-platform-common.mk | 15 --------------- slave.mk | 2 -- src/sonic-platform-common | 2 +- src/sonic-platform-daemons | 2 +- 6 files changed, 2 insertions(+), 38 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api.mk b/platform/mellanox/mlnx-platform-api.mk index 496f393caa66..ecd8b8532e6d 100644 --- a/platform/mellanox/mlnx-platform-api.mk +++ b/platform/mellanox/mlnx-platform-api.mk @@ -14,17 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# SONIC_PLATFORM_API_PY2 package - -ifeq ($(ENABLE_PY2_MODULES), y) - SONIC_PLATFORM_API_PY2 = mlnx_platform_api-1.0-py2-none-any.whl - $(SONIC_PLATFORM_API_PY2)_SRC_PATH = $(PLATFORM_PATH)/mlnx-platform-api - $(SONIC_PLATFORM_API_PY2)_PYTHON_VERSION = 2 - $(SONIC_PLATFORM_API_PY2)_DEPENDS = $(SONIC_PY_COMMON_PY2) $(SONIC_PLATFORM_COMMON_PY2) $(SONIC_CONFIG_ENGINE_PY2) - SONIC_PYTHON_WHEELS += $(SONIC_PLATFORM_API_PY2) -endif - -export mlnx_platform_api_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2))" # SONIC_PLATFORM_API_PY3 package diff --git a/rules/sonic-platform-common.dep b/rules/sonic-platform-common.dep index 632c92c1ac78..e65222869c84 100644 --- a/rules/sonic-platform-common.dep +++ b/rules/sonic-platform-common.dep @@ -4,14 +4,6 @@ DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-platform-common.mk rules/s DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files|grep -Ev "^sonic_sfp|^sonic_eeprom")) -ifeq ($(ENABLE_PY2_MODULES), y) - $(SONIC_PLATFORM_COMMON_PY2)_CACHE_MODE := GIT_CONTENT_SHA - $(SONIC_PLATFORM_COMMON_PY2)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) - $(SONIC_PLATFORM_COMMON_PY2)_DEP_FILES := $(DEP_FILES) - $(SONIC_PLATFORM_COMMON_PY2)_SMDEP_FILES := $(SMDEP_FILES) - $(SONIC_PLATFORM_COMMON_PY2)_SMDEP_PATHS := $(SPATH) -endif - $(SONIC_PLATFORM_COMMON_PY3)_CACHE_MODE := GIT_CONTENT_SHA $(SONIC_PLATFORM_COMMON_PY3)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) diff --git a/rules/sonic-platform-common.mk b/rules/sonic-platform-common.mk index 09ce14faab15..bd5f14eaf902 100644 --- a/rules/sonic-platform-common.mk +++ b/rules/sonic-platform-common.mk @@ -1,22 +1,7 @@ -ifeq ($(ENABLE_PY2_MODULES), y) - # sonic-platform-common package - - SONIC_PLATFORM_COMMON_PY2 = sonic_platform_common-1.0-py2-none-any.whl - $(SONIC_PLATFORM_COMMON_PY2)_SRC_PATH = $(SRC_PATH)/sonic-platform-common - $(SONIC_PLATFORM_COMMON_PY2)_PYTHON_VERSION = 2 - $(SONIC_PLATFORM_COMMON_PY2)_DEPENDS += $(SONIC_PY_COMMON_PY2) $(SONIC_CONFIG_ENGINE_PY2) - $(SONIC_PLATFORM_COMMON_PY2)_DEBS_DEPENDS += $(PYTHON_SWSSCOMMON) - SONIC_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY2) -endif - # Als build sonic-platform-common into python3 wheel, so we can use PSU code in SNMP docker SONIC_PLATFORM_COMMON_PY3 = sonic_platform_common-1.0-py3-none-any.whl $(SONIC_PLATFORM_COMMON_PY3)_SRC_PATH = $(SRC_PATH)/sonic-platform-common $(SONIC_PLATFORM_COMMON_PY3)_PYTHON_VERSION = 3 $(SONIC_PLATFORM_COMMON_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) $(SONIC_CONFIG_ENGINE_PY3) $(SONIC_PLATFORM_COMMON_PY3)_DEBS_DEPENDS += $(PYTHON3_SWSSCOMMON) -ifeq ($(ENABLE_PY2_MODULES), y) - # Synthetic dependency just to avoid race condition - $(SONIC_PLATFORM_COMMON_PY3)_DEPENDS += $(SONIC_PLATFORM_COMMON_PY2) -endif SONIC_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY3) diff --git a/slave.mk b/slave.mk index c092ea0d2730..0924eab54d5c 100644 --- a/slave.mk +++ b/slave.mk @@ -1065,7 +1065,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY3)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE_PY2)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE_PY3)) \ - $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY2)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY3)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2)) \ $(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2)) \ @@ -1135,7 +1134,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export config_engine_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE_PY3))" export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" export swsssdk_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY3))" - export platform_common_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY2))" export platform_common_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY3))" export redis_dump_load_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2))" export redis_dump_load_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY3))" diff --git a/src/sonic-platform-common b/src/sonic-platform-common index b70e75979f70..f575a401b83b 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit b70e75979f704e980a3fb20732642ec99f32b0ee +Subproject commit f575a401b83bbd5d6b6d68824ff22eae8647be16 diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 9ac12bfb4064..0d90023b4ae9 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 9ac12bfb406416b0fb3b03a084d8179bdc53f3a6 +Subproject commit 0d90023b4ae973bd2fa01381d4d1ba4992b45025 From 6bdbe149751222aaa73a3920126e38fbb92021ea Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Sat, 4 Jun 2022 11:37:04 -0700 Subject: [PATCH 386/817] [dhcp_relay] Add "vlan missing ip helper" dhcp relay unittest (#10654) --- .../docker-dhcp-relay/dhcp-relay.monitors.j2 | 5 +- .../docker-dhcp-relay/dhcp-relay.programs.j2 | 10 +- .../docker-dhcp-relay/dhcpv6-relay.agents.j2 | 9 +- .../docker-dhcp-relay.supervisord.conf.j2 | 4 +- ...r-dhcp-relay-no-ip-helper.supervisord.conf | 80 ++ .../py2/docker-dhcp-relay.supervisord.conf | 30 +- ...r-dhcp-relay-no-ip-helper.supervisord.conf | 80 ++ .../py3/docker-dhcp-relay.supervisord.conf | 30 +- .../tests/t0-sample-graph.xml | 3 +- .../tests/t0-sample-no-ip-helper-graph.xml | 938 ++++++++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 9 +- 11 files changed, 1174 insertions(+), 24 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay-no-ip-helper.supervisord.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay-no-ip-helper.supervisord.conf create mode 100644 src/sonic-config-engine/tests/t0-sample-no-ip-helper-graph.xml diff --git a/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 index ae11105ae3ba..0928bac22d4d 100644 --- a/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 +++ b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 @@ -6,7 +6,7 @@ programs= {% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} {% set _dummy = monitor_instance.update({'flag': True}) %} {%- endif %} -{% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcpv6_servers']|length > 0 %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} {% set _dummy = monitor_instance.update({'flag': True}) %} {%- endif %} {% if monitor_instance.flag %} @@ -31,7 +31,7 @@ dhcpmon-{{ vlan_name }} {% endfor %} {% endif %} {# Check DHCPv6 agents #} -{% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcpv6_servers']|length > 0 %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} {% for dhcpv6_server in VLAN[vlan_name]['dhcpv6_servers'] %} {% if dhcpv6_server | ipv6 %} {% set _dummy = relay_for_ipv6.update({'flag': True}) %} @@ -68,7 +68,6 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for= {%- if relay_for_ipv4.flag %}isc-dhcpv4-relay-{{ vlan_name }}:running {% endif %} -{% if relay_for_ipv6.flag %}dhcp6relay:running{% endif %} {% set _dummy = relay_for_ipv4.update({'flag': False}) %} diff --git a/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 b/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 index 9cb0c03876d6..d539d895a5bb 100644 --- a/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 +++ b/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 @@ -1,5 +1,6 @@ [group:dhcp-relay] programs= +{%- set relay_for_ipv6 = { 'flag': False } %} {%- set add_preceding_comma = { 'flag': False } %} {% for vlan_name in VLAN_INTERFACE %} {# Append DHCPv4 agents #} @@ -8,10 +9,13 @@ programs= {% set _dummy = add_preceding_comma.update({'flag': True}) %} isc-dhcpv4-relay-{{ vlan_name }} {%- endif %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} +{% set _dummy = relay_for_ipv6.update({'flag': True}) %} +{%- endif %} +{% endfor %} {# Append DHCPv6 agents #} -{% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcpv6_servers']|length > 0 %} +{% if relay_for_ipv6.flag %} {% if add_preceding_comma.flag %},{% endif %} {% set _dummy = add_preceding_comma.update({'flag': True}) %} dhcp6relay -{%- endif %} -{% endfor %} +{% endif %} diff --git a/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 index 218c95320edc..cca0b1c4b21a 100644 --- a/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 +++ b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 @@ -1,15 +1,17 @@ {# Append DHCPv6 agents #} -{% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcpv6_servers']|length > 0 %} -{% for dhcpv6_server in VLAN[vlan_name]['dhcpv6_servers'] %} +{% for vlan_name in VLAN_INTERFACE %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} +{% for dhcpv6_server in DHCP_RELAY[vlan_name]['dhcpv6_servers'] %} {% if dhcpv6_server | ipv6 %} {% set _dummy = relay_for_ipv6.update({'flag': True}) %} {% endif %} {% endfor %} +{% endif %} +{% endfor %} {% if relay_for_ipv6.flag %} {% set _dummy = relay_for_ipv6.update({'flag': False}) %} [program:dhcp6relay] command=/usr/sbin/dhcp6relay - priority=3 autostart=false autorestart=false @@ -19,4 +21,3 @@ dependent_startup=true dependent_startup_wait_for=start:exited {% endif %} -{% endif %} diff --git a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 index 41a13dd496ad..ddd93bb28644 100644 --- a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 +++ b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 @@ -48,7 +48,7 @@ dependent_startup_wait_for=rsyslogd:running {% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} {% set _dummy = ipv4_num_relays.update({'count': ipv4_num_relays.count + 1}) %} {% endif %} -{% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcpv6_servers']|length > 0 %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} {% set _dummy = ipv6_num_relays.update({'count': ipv6_num_relays.count + 1}) %} {% endif %} {% endfor %} @@ -62,9 +62,9 @@ dependent_startup_wait_for=rsyslogd:running {% set relay_for_ipv6 = { 'flag': False } %} {% for vlan_name in VLAN_INTERFACE %} {% include 'dhcpv4-relay.agents.j2' %} -{% include 'dhcpv6-relay.agents.j2' %} {% endfor %} +{% include 'dhcpv6-relay.agents.j2' %} {% include 'dhcp-relay.monitors.j2' %} {% endif %} {% endif %} diff --git a/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay-no-ip-helper.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay-no-ip-helper.supervisord.conf new file mode 100644 index 000000000000..c36dbe22533b --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay-no-ip-helper.supervisord.conf @@ -0,0 +1,80 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name dhcp_relay +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + +[group:dhcp-relay] +programs=isc-dhcpv4-relay-Vlan1000,dhcp6relay + + +[program:isc-dhcpv4-relay-Vlan1000] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 192.0.0.1 192.0.0.2 +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + + +[program:dhcp6relay] +command=/usr/sbin/dhcp6relay +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +[group:dhcpmon] +programs=dhcpmon-Vlan1000 + +[program:dhcpmon-Vlan1000] +command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 -im eth0 +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running + + diff --git a/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf index 407ac2c80bc9..9d4a9d22de47 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf +++ b/src/sonic-config-engine/tests/sample_output/py2/docker-dhcp-relay.supervisord.conf @@ -40,7 +40,8 @@ dependent_startup=true dependent_startup_wait_for=rsyslogd:running [group:dhcp-relay] -programs=isc-dhcpv4-relay-Vlan1000,dhcp6relay +programs=isc-dhcpv4-relay-Vlan1000,isc-dhcpv4-relay-Vlan2000,dhcp6relay + [program:isc-dhcpv4-relay-Vlan1000] command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 192.0.0.1 192.0.0.2 @@ -52,9 +53,19 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=start:exited +[program:isc-dhcpv4-relay-Vlan2000] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan2000 -iu Vlan1000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 192.0.0.3 192.0.0.4 +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + + [program:dhcp6relay] command=/usr/sbin/dhcp6relay - priority=3 autostart=false autorestart=false @@ -63,9 +74,8 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=start:exited - [group:dhcpmon] -programs=dhcpmon-Vlan1000 +programs=dhcpmon-Vlan1000,dhcpmon-Vlan2000 [program:dhcpmon-Vlan1000] command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 -im eth0 @@ -75,6 +85,16 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true -dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running dhcp6relay:running +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running + +[program:dhcpmon-Vlan2000] +command=/usr/sbin/dhcpmon -id Vlan2000 -iu Vlan1000 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -iu PortChannel01 -im eth0 +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan2000:running diff --git a/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay-no-ip-helper.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay-no-ip-helper.supervisord.conf new file mode 100644 index 000000000000..35ad0c48b82f --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay-no-ip-helper.supervisord.conf @@ -0,0 +1,80 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name dhcp_relay +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + +[group:dhcp-relay] +programs=isc-dhcpv4-relay-Vlan1000,dhcp6relay + + +[program:isc-dhcpv4-relay-Vlan1000] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 192.0.0.1 192.0.0.2 +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + + +[program:dhcp6relay] +command=/usr/sbin/dhcp6relay +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +[group:dhcpmon] +programs=dhcpmon-Vlan1000 + +[program:dhcpmon-Vlan1000] +command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -im eth0 +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running + + diff --git a/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf index 5456409738e6..7ea29dfcd635 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf +++ b/src/sonic-config-engine/tests/sample_output/py3/docker-dhcp-relay.supervisord.conf @@ -40,7 +40,8 @@ dependent_startup=true dependent_startup_wait_for=rsyslogd:running [group:dhcp-relay] -programs=isc-dhcpv4-relay-Vlan1000,dhcp6relay +programs=isc-dhcpv4-relay-Vlan1000,isc-dhcpv4-relay-Vlan2000,dhcp6relay + [program:isc-dhcpv4-relay-Vlan1000] command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 192.0.0.1 192.0.0.2 @@ -52,9 +53,19 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=start:exited +[program:isc-dhcpv4-relay-Vlan2000] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id Vlan2000 -iu Vlan1000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 192.0.0.3 192.0.0.4 +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + + [program:dhcp6relay] command=/usr/sbin/dhcp6relay - priority=3 autostart=false autorestart=false @@ -63,9 +74,8 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=start:exited - [group:dhcpmon] -programs=dhcpmon-Vlan1000 +programs=dhcpmon-Vlan1000,dhcpmon-Vlan2000 [program:dhcpmon-Vlan1000] command=/usr/sbin/dhcpmon -id Vlan1000 -iu Vlan2000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -im eth0 @@ -75,6 +85,16 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true -dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running dhcp6relay:running +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan1000:running + +[program:dhcpmon-Vlan2000] +command=/usr/sbin/dhcpmon -id Vlan2000 -iu Vlan1000 -iu PortChannel01 -iu PortChannel02 -iu PortChannel03 -iu PortChannel04 -im eth0 +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=isc-dhcpv4-relay-Vlan2000:running diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 15fb1dc79210..05db8246ec0a 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -270,7 +270,8 @@ 0.0.0.0/0 - + 192.0.0.3;192.0.0.4 + fc02:2000::3;fc02:2000::4 2000 2000 192.168.200.0/27 diff --git a/src/sonic-config-engine/tests/t0-sample-no-ip-helper-graph.xml b/src/sonic-config-engine/tests/t0-sample-no-ip-helper-graph.xml new file mode 100644 index 000000000000..b02304a49e14 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-no-ip-helper-graph.xml @@ -0,0 +1,938 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 1 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
+ + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + LoopbackIP1 + Loopback1 + + 10.10.0.99/32 + + 10.10.0.99/32 + + + LoopbackIP2 + Loopback2 + + 10.21.0.64/32 + + 10.21.0.64/32 + + + LoopbackIP3 + Loopback3 + + 10.21.64.2/32 + + 10.21.64.2/32 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + HostIP + eth0 + + 2603:10e2:0:2902::8/64 + + 2603:10e2:0:2902::8/64 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + + + + + Vlan2000 + fortyGigE0/112;fortyGigE0/116;fortyGigE0/120 + False + 0.0.0.0/0 + + + + + 2000 + 2000 + 192.168.200.0/27 + + + + + Vlan99 + fortyGigE0/100 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 99 + 99 + + + + + + Vlan98 + fortyGigE0/100;PortChannel01;PortChannel03 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 98 + 98 + + + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + Vlan2000 + 192.168.200.1/27 + + + + + + ERSPAN + everflow + Everflow + + + ERSPANv6 + everflowV6 + Everflow + + + EGRESS_ERSPAN + everflow_egress + Everflow + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAclIngress + DataPlane + + + PortChannel01;PortChannel02;Vlan98 + DataAclEgress + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + NTP + NTP_ACL + NTP + + + SSH + SSH_ACL + SSH + + + SSH + ROUTER-PROTECT + SSH + + + SNMP + ROUTER-PROTECT + SNMP + + + NTP + NTP_ACL + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + 100000 + + + DeviceInterfaceLink + 100000 + switch-t0 + fortyGigE0/4 + true + ARISTA05T1 + Ethernet1/33 + true + + + DeviceInterfaceLink + Servers0 + eth0 + switch-t0 + fortyGigE0/4 + + + DeviceInterfaceLink + Servers100 + eth0 + switch-t0 + fortyGigE0/100 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + + + + + + + AutoNegotiation + + True + + + FECDisabled + + True + + + ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + False + + + FECDisabled + + True + + + ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index a13669772133..2d9ac9d8f474 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -27,6 +27,7 @@ def setUp(self): self.multi_asic_port_config = os.path.join(self.test_dir, 'multi_npu_data', 'sample_port_config-0.ini') self.dell9332_t1_minigraph = os.path.join(self.test_dir, 'sample-dell-9332-t1-minigraph.xml') self.radv_test_minigraph = os.path.join(self.test_dir, 'radv-test-sample-graph.xml') + self.no_ip_helper_minigraph = os.path.join(self.test_dir, 't0-sample-no-ip-helper-graph.xml') self.output_file = os.path.join(self.test_dir, 'output') os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -69,7 +70,13 @@ def test_dhcp_relay(self): template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'docker-dhcp-relay.supervisord.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file self.run_script(argument) - self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'docker-dhcp-relay.supervisord.conf'), self.output_file), self.output_file) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'docker-dhcp-relay.supervisord.conf'), self.output_file)) + + # Test generation of docker-dhcp-relay.supervisord.conf when a vlan is missing ip/ipv6 helpers + template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'docker-dhcp-relay.supervisord.conf.j2') + argument = '-m ' + self.no_ip_helper_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'docker-dhcp-relay-no-ip-helper.supervisord.conf'), self.output_file)) def test_radv(self): # Test generation of radvd.conf with multiple ipv6 prefixes From a6c9e195df4cda11893dce752cd9c313847f0d37 Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Sun, 5 Jun 2022 08:08:36 -0700 Subject: [PATCH 387/817] [Tunnel PFC] Add property for tunnel PFC (#10962) * [Tunnel PFC] Add property for tunnel PFC Replace the config.bcm file with j2 template file - Add 'sai_remap_prio_on_tnl_egress=1' property when device metadata local - Host subtype is 'dualtor' - Change sai.profile foe the new config.bcm.j2 --- ...td3-a7050cx3-32s-32x100G.config.bcm => config.bcm.j2} | 9 +++++++++ .../Arista-7050CX3-32S-C32/sai.profile | 2 +- ...050cx3-32s-48x50G+8x100G.config.bcm => config.bcm.j2} | 9 +++++++++ .../Arista-7050CX3-32S-D48C8/sai.profile | 2 +- .../Arista-7260CX3-C64/config.bcm.j2 | 3 +++ .../Arista-7260CX3-D108C8/config.bcm.j2 | 5 ++++- .../Arista-7260CX3-Q64/config.bcm.j2 | 3 +++ 7 files changed, 30 insertions(+), 3 deletions(-) rename device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/{td3-a7050cx3-32s-32x100G.config.bcm => config.bcm.j2} (97%) rename device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/{td3-a7050cx3-32s-48x50G+8x100G.config.bcm => config.bcm.j2} (97%) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 similarity index 97% rename from device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm rename to device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 index 3b37d661f403..89a55175edc8 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 @@ -1,6 +1,15 @@ +{# Construct config.bcm to include additional soc properties per specific device metadata requirement #} +{%- set map_prio = '' -%} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['subtype'] is defined -%} +{%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} +{%- if 'dualtor' in switch_subtype.lower() %} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} +{%- endif %} +{%- endif %} sai_load_hw_config=/etc/bcm/flex/bcm56870_a0_premium_issu/b870.6.4.1/ l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +{{ map_prio }} host_as_route_disable=1 use_all_splithorizon_groups=1 riot_enable=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile index 7d96f190de73..5163d6140f0e 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile @@ -1,2 +1,2 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-a7050cx3-32s-32x100G.config.bcm +SAI_INIT_CONFIG_FILE=/etc/sai.d/config.bcm SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 similarity index 97% rename from device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm rename to device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 index 267b3bb81a9a..9f523e506660 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 @@ -1,6 +1,15 @@ +{# Construct config.bcm to include additional soc properties per specific device metadata requirement #} +{%- set map_prio = '' -%} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['subtype'] is defined -%} +{%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} +{%- if 'dualtor' in switch_subtype.lower() %} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} +{%- endif %} +{%- endif %} sai_load_hw_config=/etc/bcm/flex/bcm56870_a0_premium_issu/b870.6.4.1/ l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +{{ map_prio }} host_as_route_disable=1 use_all_splithorizon_groups=1 riot_enable=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile index 1865041f8d9f..5163d6140f0e 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile @@ -1,2 +1,2 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-a7050cx3-32s-48x50G+8x100G.config.bcm +SAI_INIT_CONFIG_FILE=/etc/sai.d/config.bcm SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 index db5b2562cca2..90d57545c099 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 @@ -1,6 +1,7 @@ {# Construct config.bcm to include additional soc properties per specific device metadata requirement #} {%- set mmu_sock = 'mmu_init_config="MSFT-TH2-Tier1"' -%} {%- set IPinIP_sock = '' -%} +{%- set map_prio = '' -%} {%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined -%} {%- if DEVICE_METADATA['localhost']['type'] is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} @@ -15,6 +16,7 @@ sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} {%- endif %} {%- endif %} {%- endif %} @@ -22,6 +24,7 @@ l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +{{ map_prio }} PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 index 70512203f206..145426e05915 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 @@ -1,17 +1,20 @@ {# Construct config.bcm to include additional soc properties per specific device metadata requirement #} {%- set IPinIP_sock = '' -%} +{%- set map_prio = '' -%} {%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['subtype'] is defined -%} {%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} {%- if 'dualtor' in switch_subtype.lower() %} {%- set IPinIP_sock = 'sai_tunnel_support=1 sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 - l3_ecmp_levels=2' -%} + l3_ecmp_levels=2' -%} -%} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} {%- endif %} {%- endif %} {# The following is the common soc properties that used to be named "th2-a7260cx3-64-112x50G+8x100G.config.bcm" #} l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +{{ map_prio }} PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 index ce8efa8572b5..78194a75830e 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 @@ -1,6 +1,7 @@ {# Construct config.bcm to include additional soc properties per specific device metadata requirement #} {%- set mmu_sock = 'mmu_init_config="MSFT-TH2-Tier1"' -%} {%- set IPinIP_sock = '' -%} +{%- set map_prio = '' -%} {%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined -%} {%- if DEVICE_METADATA['localhost']['type'] is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} @@ -15,12 +16,14 @@ sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 l3_ecmp_levels=2' -%} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} {%- endif %} {%- endif %} {%- endif %} {# The following is the common soc properties that used to be named "th2-a7260cx3-64-64x40G.config.bcm" #} l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +{{ map_prio }} PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 From 8f47df6ae3b8fb54cee98976a22209a92345e5ec Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Sun, 5 Jun 2022 08:23:02 -0700 Subject: [PATCH 388/817] [pr test] increase T1-lag PR test timeout to 5 hours (#11029) Why I did it Some PR test are timing out on T1-lag kvm test. How I did it Increase the timeout to 5 hours. How to verify it Test on this PR. Signed-off-by: Ying Xie ying.xie@microsoft.com --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7936f8f4f6f2..a0b1cf54251e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -184,7 +184,7 @@ stages: - job: pool: sonictest-t1-lag displayName: "kvmtest-t1-lag" - timeoutInMinutes: 240 + timeoutInMinutes: 300 steps: - template: .azure-pipelines/run-test-template.yml From 453504f421234b3f5df935b64fa16e21983bda98 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Sun, 5 Jun 2022 22:20:26 -0700 Subject: [PATCH 389/817] [qos]: Adjust 7260 buffer sizes to accomodate extra lossless queues (#11018) Why I did it As part of PCBB changes, we need to enable 2 extra lossless queues. The changes in this PR are done to adjust only the reserved sizes on Th2 for the additional 2 lossless queues Calculations are done based on 40 downlinks for T1 and 16 uplinks for dual ToR How to verify it Verified that the rendering works fine on Th2 dut Unit tests have been updated to reflect the modified buffer sizes when pcbb is enabled. There are existing testcases that will test the original buffer sizes when pcbb is disabled. With these changes, was able to build sonic-config-engine wheel successfully Signed-off-by: Neetha John --- .../Arista-7260CX3-C64/buffers_defaults_t0.j2 | 10 +++++-- .../Arista-7260CX3-C64/buffers_defaults_t1.j2 | 8 +++-- .../buffers_pool_sizes_t0.j2 | 8 +++++ .../buffers_pool_sizes_t1.j2 | 8 +++++ .../buffers_defaults_t0.j2 | 8 +++-- .../buffers_pool_sizes_t0.j2 | 1 + .../Arista-7260CX3-Q64/buffers_defaults_t0.j2 | 8 +++-- .../Arista-7260CX3-Q64/buffers_defaults_t1.j2 | 8 +++-- .../buffers_pool_sizes_t0.j2 | 1 + .../py3/buffer-arista7260-dualtor.json | 4 +-- .../py3/buffer-arista7260-t1.json | 12 ++++---- src/sonic-config-engine/tests/test_j2files.py | 29 ++++++++++++++++++- 12 files changed, 85 insertions(+), 20 deletions(-) create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t1.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_pool_sizes_t0.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t0.j2 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 index 625ca0ab119e..bee86a9b3a85 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 @@ -7,16 +7,20 @@ {%- endfor %} {%- endmacro %} +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33329088", + "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", "mode": "dynamic", "xoff": "7827456" }, "egress_lossy_pool": { - "size": "26663272", + "size": "{{ egress_lossy_pool_size }}", "type": "egress", "mode": "dynamic" }, @@ -49,4 +53,4 @@ {%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} {{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} \ No newline at end of file +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 index 68af36a27518..c5d390668a33 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 @@ -7,11 +7,15 @@ {%- endfor %} {%- endmacro %} +{%- import 'buffers_pool_sizes_t1.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { {# SS Tab2 Row 71 #} - "size": "33582016", + "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", "mode": "dynamic", {# SS Tab2 Row 68 #} @@ -19,7 +23,7 @@ }, "egress_lossy_pool": { {# SS Tab2 Row 60 #} - "size": "26866112", + "size": "{{ egress_lossy_pool_size }}", "type": "egress", "mode": "dynamic" }, diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 new file mode 100644 index 000000000000..bd82c947e4fc --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 @@ -0,0 +1,8 @@ +{%- set ingress_lossless_pool_size = '33329088' %} +{%- set egress_lossy_pool_size = '26663272' %} + +{%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) and +((DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('subtype' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['subtype'] == 'DualToR')) %} + {%- set ingress_lossless_pool_size = '33169344' %} + {%- set egress_lossy_pool_size = '26535808' %} +{%- endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t1.j2 new file mode 100644 index 000000000000..43b31de8ad43 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_pool_sizes_t1.j2 @@ -0,0 +1,8 @@ +{%- set ingress_lossless_pool_size = '33582016' %} +{%- set egress_lossy_pool_size = '26866112' %} + +{%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) and +((DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('type' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['type'] == 'LeafRouter')) %} + {%- set ingress_lossless_pool_size = '33262528' %} + {%- set egress_lossy_pool_size = '26610688' %} +{%- endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 index 10b9d70d24bf..5ac1d2d2aef9 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 @@ -15,16 +15,20 @@ {%- endfor %} {%- endmacro %} +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33329088", + "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", "mode": "dynamic", "xoff": "7827456" }, "egress_lossy_pool": { - "size": "26663272", + "size": "{{ egress_lossy_pool_size }}", "type": "egress", "mode": "dynamic" }, diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_pool_sizes_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_pool_sizes_t0.j2 new file mode 120000 index 000000000000..72e16a608268 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_pool_sizes_t0.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 index 01b5a1dd8b3e..bee86a9b3a85 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 @@ -7,16 +7,20 @@ {%- endfor %} {%- endmacro %} +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33329088", + "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", "mode": "dynamic", "xoff": "7827456" }, "egress_lossy_pool": { - "size": "26663272", + "size": "{{ egress_lossy_pool_size }}", "type": "egress", "mode": "dynamic" }, diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 index 1d8fbb3e852f..f531b5e208e9 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 @@ -7,16 +7,20 @@ {%- endfor %} {%- endmacro %} +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33329088", + "size": "{{ ingress_lossless_pool_size }}", "type": "ingress", "mode": "dynamic", "xoff": "7827456" }, "egress_lossy_pool": { - "size": "26663272", + "size": "{{ egress_lossy_pool_size }}", "type": "egress", "mode": "dynamic" }, diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t0.j2 new file mode 120000 index 000000000000..72e16a608268 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t0.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_pool_sizes_t0.j2 \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json index 32fbfe24370a..6b1f4c433fa0 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-dualtor.json @@ -128,13 +128,13 @@ "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33329088", + "size": "33169344", "type": "ingress", "mode": "dynamic", "xoff": "7827456" }, "egress_lossy_pool": { - "size": "26663272", + "size": "26535808", "type": "egress", "mode": "dynamic" }, diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json index 2491d376c771..702076249ac6 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json @@ -72,18 +72,18 @@ "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33582016", + "size": "33262528", "type": "ingress", "mode": "dynamic", - "xoff": "8965632" + "xoff": "8965632" }, "egress_lossy_pool": { - "size": "26866112", + "size": "26610688", "type": "egress", "mode": "dynamic" }, "egress_lossless_pool": { - "size": "43481152", + "size": "43481152", "type": "egress", "mode": "static" } @@ -92,12 +92,12 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "static_th":"44302336" + "static_th":"44302336" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", "size":"0", - "static_th":"43481152" + "static_th":"43481152" }, "egress_lossy_profile": { "pool":"egress_lossy_pool", diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 2d9ac9d8f474..353dbaed41e1 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -43,6 +43,31 @@ def run_script(self, argument): def run_diff(self, file1, file2): return subprocess.check_output('diff -u {} {} || true'.format(file1, file2), shell=True) + def create_machine_conf(self, platform, vendor): + file_exist = True + dir_exist = True + mode = {'arista': 'aboot', + 'dell': 'onie', + 'mellanox': 'onie' + } + echo_cmd = "echo '{}_platform={}' | sudo tee -a /host/machine.conf > /dev/null".format(mode[vendor], platform) + if not os.path.exists('/host/machine.conf'): + file_exist = False + if not os.path.isdir('/host'): + dir_exist = False + os.system('sudo mkdir /host') + os.system('sudo touch /host/machine.conf') + os.system(echo_cmd) + + return file_exist, dir_exist + + def remove_machine_conf(self, file_exist, dir_exist): + if not file_exist: + os.system('sudo rm -f /host/machine.conf') + + if not dir_exist: + os.system('sudo rmdir /host') + def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file @@ -340,6 +365,7 @@ def test_qos_dscp_remapping_render_template(self): os.remove(test_output) def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer_template, expected): + file_exist, dir_exist = self.create_machine_conf(platform, vendor) dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) buffers_file = os.path.join(dir_path, buffer_template) port_config_ini_file = os.path.join(dir_path, 'port_config.ini') @@ -355,6 +381,7 @@ def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer # cleanup buffers_config_file_new = os.path.join(dir_path, 'buffers_config.j2') os.remove(buffers_config_file_new) + self.remove_machine_conf(file_exist, dir_exist) sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, expected) assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) @@ -385,7 +412,7 @@ def test_extra_lossless_buffer_for_tunnel_remapping(self): ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph.xml', 'buffers.json.j2', 'buffer-arista7260-t1.json'), ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-t1-remap-disabled.json') ] - + for test_data in TEST_DATA: self._test_buffers_render_template(vendor=test_data[0], platform=test_data[1], From 9ead1273072bad5fe48717fe2e8637520e466af0 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 6 Jun 2022 19:35:53 +0800 Subject: [PATCH 390/817] [Build]: Fix the version files for armhf/arm64 not used issue (#11021) Why I did it [Build]: Fix the version files in host-base-image for armhf/arm64 not used issue --- scripts/build_debian_base_system.sh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/scripts/build_debian_base_system.sh b/scripts/build_debian_base_system.sh index 72e3779ff3e2..0e00eeeac532 100755 --- a/scripts/build_debian_base_system.sh +++ b/scripts/build_debian_base_system.sh @@ -48,11 +48,20 @@ fi ARCH=$(dpkg --print-architecture) DISTRO=$(grep CODENAME /etc/os-release | cut -d= -f2) if [ "$ARCH" != "$CONFIGURED_ARCH" ] || [ "$DISTRO" != "$IMAGE_DISTRO" ]; then - "Not support to build different ARCH/DISTRO ${CONFIGURED_ARCH}:${$IMAGE_DISTRO} in ${ARCH}:${DISTRO}." + "Not support to build different ARCH/DISTRO ${CONFIGURED_ARCH}:${IMAGE_DISTRO} in ${ARCH}:${DISTRO}." exit 1 fi -BASE_VERSIONS=files/build/versions/host-base-image/versions-deb-${IMAGE_DISTRO} +# Generate the version files for the host base image +TEMP_DIR=$(mktemp -d) +./scripts/versions_manager.py generate -t $TEMP_DIR -n host-base-image -d $IMAGE_DISTRO -a $CONFIGURED_ARCH +PACKAGES=$(sed -E 's/=(=[^=]*)$/\1/' $TEMP_DIR/version-deb) +if [ -z "$PACKAGES" ]; then + echo "Not found host-base-image packages, please check the version files in files/build/versions/host-base-image" 2>&1 + exit 1 +fi +rm -rf $TEMP_DIR + BASEIMAGE_TARBALLPATH=$TARGET/baseimage BASEIMAGE_TARBALL=$(realpath -e $TARGET)/baseimage.tgz @@ -69,7 +78,6 @@ DEBOOTSTRAP_REQUIRED=$TARGET_DEBOOTSTRAP/required mkdir -p $ARCHIEVES mkdir -p $APTLIST mkdir -p $TARGET_DEBOOTSTRAP -PACKAGES=$(sed -E 's/=(=[^=]*)$/\1/' $BASE_VERSIONS) URL_ARR=$(apt-get download --print-uris $PACKAGES | cut -d" " -f1 | tr -d "'") PACKAGE_ARR=($PACKAGES) LENGTH=${#PACKAGE_ARR[@]} @@ -80,7 +88,7 @@ do encoded_packagename=$(urlencode $packagename) url=$(echo "$URL_ARR" | grep -i "/${packagename}_\|/${encoded_packagename}_") if [ -z "$url" ] || [[ $(echo "$url" | wc -l) -gt 1 ]]; then - echo "No found package or found multiple package for package $packagename, url: $url" 2>&1 + echo "No found package or found multiple package for package $packagename, url: $url" 1>&2 exit 1 fi filename=$(basename "$url") From 14f6f70ca3cb5a01fe3ce5030678eea16c6140b2 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 6 Jun 2022 08:51:04 -0700 Subject: [PATCH 391/817] [BGP]Adding configuration knob to allow advertise Loopback ipv6 /128 prefix (#10958) * [BGP]Adding configuration knob to allow advertise Loopback ipv6 /128 prefix By default when IPv6 address is configured with /128 as subnet mask in Loopback0 interface, it will be advertised as prefix with /64 subnet. To control this behavior a new field 'bgp_adv_lo_prefix_as_128' is introduced in DEVICE_METADATA table which when set to true will advertise prefix with /128 subnet as it is. --- .../docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 | 10 +++++++ .../staticd/staticd.loopback_route.conf.j2 | 8 +++++- .../bgpd.main.conf.j2/ipv6_lo.conf | 27 +++++++++++++++++++ .../bgpd.main.conf.j2/ipv6_lo.json | 18 +++++++++++++ .../staticd.loopback_ipv6_128_route.conf | 4 +++ .../staticd.loopback_ipv6_128_route.conf.json | 10 +++++++ .../staticd/staticd.loopback_route.conf.json | 4 +++ src/sonic-bgpcfgd/tests/test_sonic-cfggen.py | 12 +++++++++ src/sonic-yang-models/doc/Configuration.md | 4 +++ .../tests/files/sample_config_db.json | 3 ++- .../tests/device_metadata.json | 3 +++ .../tests_config/device_metadata.json | 10 +++++++ .../yang-models/sonic-device_metadata.yang | 6 +++++ 13 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.json create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf.json diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 index c6643f185742..b5891b9695ac 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 @@ -11,8 +11,13 @@ ip prefix-list PL_LoopbackV4 permit {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/32 ! {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") != 'None' %} +{% if ( ('localhost' in DEVICE_METADATA) and ('bgp_adv_lo_prefix_as_128' in DEVICE_METADATA['localhost']) and + (DEVICE_METADATA['localhost']['bgp_adv_lo_prefix_as_128'] == 'true') ) %} +ipv6 prefix-list PL_LoopbackV6 permit {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip_network }}/128 +{% else %} ipv6 prefix-list PL_LoopbackV6 permit {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | replace('/128', '/64') | ip_network }}/64 {% endif %} +{% endif %} ! {% if VLAN_INTERFACE is defined %} {% set vnet_intfs = get_vnet_interfaces(VLAN_INTERFACE) %} @@ -89,7 +94,12 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} ! {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") != 'None' %} address-family ipv6 +{% if ( ('localhost' in DEVICE_METADATA) and ('bgp_adv_lo_prefix_as_128' in DEVICE_METADATA['localhost']) and + (DEVICE_METADATA['localhost']['bgp_adv_lo_prefix_as_128'] == 'true') ) %} + network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/128 +{% else %} network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/64 +{% endif %} exit-address-family {% endif %} {% if ((multi_asic is defined and DEVICE_METADATA['localhost']['switch_type'] != 'chassis-packet') or (DEVICE_METADATA['localhost']['switch_type'] == 'voq')) %} diff --git a/dockers/docker-fpm-frr/frr/staticd/staticd.loopback_route.conf.j2 b/dockers/docker-fpm-frr/frr/staticd/staticd.loopback_route.conf.j2 index 95c2a901e4a3..35e7c49d575b 100644 --- a/dockers/docker-fpm-frr/frr/staticd/staticd.loopback_route.conf.j2 +++ b/dockers/docker-fpm-frr/frr/staticd/staticd.loopback_route.conf.j2 @@ -2,9 +2,15 @@ {% from "common/functions.conf.j2" import get_ipv4_loopback_address, get_ipv6_loopback_address, get_vnet_interfaces %} ! {% block loopback_route %} -! add static ipv6 /64 loopback route to allow bgpd to advertise the loopback route prefix {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") != 'None' %} +{% if ( ('localhost' in DEVICE_METADATA) and ('bgp_adv_lo_prefix_as_128' in DEVICE_METADATA['localhost']) and + (DEVICE_METADATA['localhost']['bgp_adv_lo_prefix_as_128'] == 'true') ) %} +! add static ipv6 /128 loopback route to allow bgpd to advertise the loopback route prefix +ipv6 route {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip_network }}/128 Loopback0 +{% else %} +! add static ipv6 /64 loopback route to allow bgpd to advertise the loopback route prefix ipv6 route {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | replace('/128', '/64') | ip_network }}/64 Loopback0 {% endif %} +{% endif %} {% endblock loopback_route %} ! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.conf new file mode 100644 index 000000000000..50414a89a389 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.conf @@ -0,0 +1,27 @@ +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00::1/128 +! +router bgp 55555 +! + bgp log-neighbor-changes + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp router-id 55.55.55.55 +! + network 55.55.55.55/32 +! + address-family ipv6 + network fc00::1/128 +! end of template: bgpd/bgpd.main.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.json new file mode 100644 index 000000000000..f34cc60b0c74 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/ipv6_lo.json @@ -0,0 +1,18 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_asn": "55555", + "bgp_adv_lo_prefix_as_128": "true" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|fc00::1/128": {} + }, + "constants": { + "bgp": { + "multipath_relax": {}, + "graceful_restart": {}, + "maximum_paths": {} + } + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf new file mode 100644 index 000000000000..a867c4c7309f --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf @@ -0,0 +1,4 @@ +! +! add static ipv6 /128 loopback route to allow bgpd to advertise the loopback route prefix +ipv6 route fc00:1::32/128 Loopback0 +!! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf.json new file mode 100644 index 000000000000..f825c03f2b9b --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_ipv6_128_route.conf.json @@ -0,0 +1,10 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_adv_lo_prefix_as_128": "true" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|FC00:1::32/128": {} + } +} diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_route.conf.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_route.conf.json index ffd3c2a2a117..b0c8f3176e5b 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_route.conf.json +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/staticd/staticd.loopback_route.conf.json @@ -1,4 +1,8 @@ { + "DEVICE_METADATA": { + "localhost": { + } + }, "LOOPBACK_INTERFACE": { "Loopback0|FC00:1::32/128": {} } diff --git a/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py b/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py index 498ce8f9ff7a..d18bbd058c90 100644 --- a/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py +++ b/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py @@ -57,6 +57,12 @@ def test_bgpd_main_conf_packet_chassis(): "bgpd.main.conf.j2/packet_chassis.json", "bgpd.main.conf.j2/packet_chassis.conf") +def test_bgpd_lo_ipv6_conf_base(): + run_test("IPv6 Loopback bgpd.main.conf.j2", + "bgpd/bgpd.main.conf.j2", + "bgpd.main.conf.j2/base.json", + "bgpd.main.conf.j2/base.conf") + def test_tsa_isolate(): run_test("tsa/bgpd.tsa.isolate.conf.j2", "bgpd/tsa/bgpd.tsa.isolate.conf.j2", @@ -87,6 +93,12 @@ def test_staticd_loopback_route(): "staticd/staticd.loopback_route.conf.json", "staticd/staticd.loopback_route.conf") +def test_staticd_loopback_ipv6_128_route(): + run_test("staticd.loopback_ipv6_128_route.conf.j2", + "staticd/staticd.loopback_route.conf.j2", + "staticd/staticd.loopback_ipv6_128_route.conf.json", + "staticd/staticd.loopback_ipv6_128_route.conf") + def test_staticd(): run_test("staticd.conf.j2", "staticd/staticd.conf.j2", diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 3d5bf91db542..dd3c702e630b 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -775,6 +775,7 @@ instance is supported in SONiC. "bgp_asn": "65100", "deployment_id": "1", "type": "ToRRouter", + "bgp_adv_lo_prefix_as_128" : "true", "buffer_model": "traditional" } } @@ -935,6 +936,9 @@ Loopback interface configuration lies in **LOOPBACK_INTERFACE** table and has similar schema with data plane interfaces. The loopback device name and loopback IP prefix act as multi-level key for loopback interface objects. +By default SONiC advertises Loopback interface IPv6 /128 subnet address +as prefix with /64 subnet. To overcome this set "bgp_adv_lo_prefix_as_128" +to true in DEVICE_METADATA ``` { diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 9be6d29e8922..8a2227ef0804 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -325,7 +325,8 @@ "switch_type": "voq", "max_cores": "8", "sub_role": "FrontEnd", - "dhcp_server": "disabled" + "dhcp_server": "disabled", + "bgp_adv_lo_prefix_as_128": "true" } }, "VLAN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json index 1c39661d056e..8a562ef536a5 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_metadata.json @@ -113,6 +113,9 @@ "DEVICE_METADATA_INVALID_DHCP_SERVER": { "desc": "Verifying invalid dhcp_server configuration.", "eStrKey": "InvalidValue" + }, + "DEVICE_METADATA_ADVERTISE_LO_PREFIX_AS_128": { + "desc": "Verifying advertising lo prefix as /128." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json index 687a745a24c6..ece046f2afb7 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_metadata.json @@ -311,5 +311,15 @@ } } } + }, + "DEVICE_METADATA_ADVERTISE_LO_PREFIX_AS_128": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "bgp_asn": "65001", + "bgp_adv_lo_prefix_as_128": "true" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang index 17241005861e..b04f929cddc9 100644 --- a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -188,6 +188,12 @@ module sonic-device_metadata { type stypes:admin_mode; description "Indicate whether enable the embedded DHCP server."; } + + leaf bgp_adv_lo_prefix_as_128 { + type boolean; + description "Advertise Loopback0 interface IPv6 /128 subnet address as it is with set to true. + By default SONiC advertises /128 subnet prefix in Loopback0 as /64 subnet route"; + } } /* end of container localhost */ } From a3895c31161d01dad4e3d68c27041bbc4292b77f Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 7 Jun 2022 20:05:54 +0800 Subject: [PATCH 392/817] [Mellanox] Update SN2201 sai profile and platform reboot script (#10978) - Why I did it 1. SN2201 sai profile needs to be updated according to the latest hardware. 2. In the reboot script, need to use the common symbol link of the power_cycle sysfs instead of directly accessing it due to SN2201 sysfs is different than other platforms. 3. echo 1 > $SYSFS_PWR_CYCLE will trigger the reboot immediately, the following sleep 3 and echo 0 > $SYSFS_PWR_CYCLE will never be executed, can be removed. - How I did it 1. Replace the SN2201 sai profile with the latest one. 2. In the platform_reboot script, replace the direct sysfs path with the symbol link path. 3. Remove the redundant code from platform_reboot - How to verify it Perform reboot on all the Nvidia platforms, and check all can be rebooted successfully. Signed-off-by: Kebo Liu --- .../x86_64-mlnx_msn2700-r0/platform_reboot | 4 +- .../ACS-SN2201/sai_2201.xml | 128 +++++++++--------- 2 files changed, 65 insertions(+), 67 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot index 7a38268ff09c..b2188fde6f5d 100755 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot @@ -5,7 +5,7 @@ declare -r EXIT_ERROR="1" declare -r PENDING_COMPONENT_FW="/usr/bin/install-pending-fw.py" declare -r FW_UPGRADE_SCRIPT="/usr/bin/mlnx-fw-upgrade.sh" -declare -r SYSFS_PWR_CYCLE="/sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/pwr_cycle" +declare -r SYSFS_PWR_CYCLE="/var/run/hw-management/system/pwr_cycle" FORCE_REBOOT="no" @@ -24,8 +24,6 @@ function SafePwrCycle() { sync ; sync umount -fa > /dev/null 2&>1 echo 1 > $SYSFS_PWR_CYCLE - sleep 3 - echo 0 > $SYSFS_PWR_CYCLE } ParseArguments "$@" diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/sai_2201.xml b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/sai_2201.xml index d50843270cfd..8c57d2f20b6e 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/sai_2201.xml +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/sai_2201.xml @@ -36,337 +36,337 @@ 0 0 - - 3 + + 131072 62 1 1 0 - 3 + 131072 63 1 2 0 - 3 + 131072 64 1 3 0 - 3 + 131072 57 1 4 0 - 3 + 131072 58 1 5 0 - 3 + 131072 59 1 6 0 - 3 + 131072 60 1 7 0 - 3 + 131072 53 1 8 0 - 3 + 131072 54 1 9 0 - 3 + 131072 55 1 10 0 - 3 + 131072 56 1 11 0 - 3 + 131072 49 1 12 0 - 3 + 131072 50 1 13 0 - 3 + 131072 51 1 14 0 - 3 + 131072 52 1 15 0 - 3 + 131072 45 1 16 0 - 3 + 131072 46 1 17 0 - 3 + 131072 47 1 18 0 - 3 + 131072 48 1 19 0 - 3 + 131072 41 1 20 0 - 3 + 131072 42 1 21 0 - 3 + 131072 43 1 22 0 - 3 + 131072 44 1 23 0 - 3 + 131072 37 1 24 0 - 3 + 131072 38 1 25 0 - 3 + 131072 39 1 26 0 - 3 + 131072 40 1 27 0 - 3 + 131072 33 1 28 0 - 3 + 131072 34 1 29 0 - 3 + 131072 35 1 30 0 - 3 + 131072 36 1 31 0 - 3 + 131072 1 1 32 0 - 3 + 131072 2 1 33 0 - 3 + 131072 3 1 34 0 - 3 + 131072 4 1 35 0 - 3 + 131072 - 5 + 21 1 36 0 - 3 + 131072 - 6 + 22 1 37 0 - 3 + 131072 - 17 + 23 1 38 0 - 3 + 131072 - 18 + 24 1 39 0 - 3 + 131072 - 19 + 25 1 40 0 - 3 + 131072 - 20 + 26 1 41 0 - 3 + 131072 - 21 + 27 1 42 0 - 3 + 131072 - 22 + 28 1 43 0 - 3 + 131072 - 23 + 29 1 44 0 - 3 + 131072 - 24 + 30 1 45 0 - 3 + 131072 - 25 + 31 1 46 0 - 3 + 131072 - 26 + 32 1 47 0 - 3 + 131072 9 @@ -376,21 +376,21 @@ 11534336 - 7 + 5 4 49 3 11534336 - 13 + 17 4 50 3 11534336 - 11 + 13 4 51 3 From 5c869492bda3ab78e30f3eb027521cfa9228b211 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Tue, 7 Jun 2022 15:11:25 +0300 Subject: [PATCH 393/817] [Mellanox] Update SDK/FW to 4.5.2262/xx.2010.2262 (#10882) - Why I did it To include latest fixes: 1. Warmboot | When trying to reconfigure the Flex Parser header and Flex transition parameters after ISSU, the switch will returned an error even if the configuration was identical to that done before performing the ISSU. 2. Link Up | When toggling many ports of the Spectrum devices while raising 10GbE link up and link maintenance is enabled, the switch may get stuck and may need to be rebooted. 3. Shared buffer | While moving from lossless to lossy while shared headroom was used, reduction of the shared headroom can only be done prior to pool type change and when shared headroom is not utilized. - How I did it Updated SDK submodule along with the relevant Makefiles - How to verify it Build an image and run tests from "sonic-mgmt". Signed-off-by: Volodymyr Samotiy --- platform/mellanox/fw.mk | 6 +++--- platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers | 2 +- platform/mellanox/sdk.mk | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index e2ccc2ad7dc8..0dc3800155ea 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -27,17 +27,17 @@ else FW_FROM_URL = n endif -MLNX_SPC_FW_VERSION = 13.2010.1500 +MLNX_SPC_FW_VERSION = 13.2010.2262 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2010.1500 +MLNX_SPC2_FW_VERSION = 29.2010.2262 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) -MLNX_SPC3_FW_VERSION = 30.2010.1500 +MLNX_SPC3_FW_VERSION = 30.2010.2262 MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) diff --git a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers index a0416e20a2b9..9f94bdfc2c7e 160000 --- a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers +++ b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers @@ -1 +1 @@ -Subproject commit a0416e20a2b9b304cb2c9b629c071f76db0ca2aa +Subproject commit 9f94bdfc2c7e3670b5b959138f9d61d40e7cc1ea diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index ba152c953808..0ecc6d6bf041 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -16,7 +16,7 @@ # MLNX_SDK_BASE_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel/Switch-SDK-drivers/bin/ MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/ -MLNX_SDK_VERSION = 4.5.1500 +MLNX_SDK_VERSION = 4.5.2262 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DEB_VERSION = $(subst -,.,$(subst _,.,$(MLNX_SDK_VERSION))) From f135f37a502d99c9c9fcbfd8c9c972e66089071c Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 7 Jun 2022 20:13:16 +0800 Subject: [PATCH 394/817] [Mellanox] optimize platform API import time (#10815) - Why I did it "import sonic_platform" takes about 600ms ~ 1000ms, it is kind of slow. After this optimization, the time is about 100ms. The benefit is that those CLIs which does not need the slow import sentence would be faster than before. - How I did it Find slow import and call them when need. - How to verify it Measure the import time. --- .../mellanox/mlnx-platform-api/sonic_platform/chassis.py | 7 ++++--- .../mlnx-platform-api/sonic_platform/device_data.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index c7bafc0d8921..f68d1033f019 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -30,7 +30,6 @@ from . import utils from .device_data import DeviceDataManager - from .sfp import SFP, deinitialize_sdk_handle except ImportError as e: raise ImportError (str(e) + "- required module not found") @@ -113,8 +112,10 @@ def __del__(self): if self.sfp_event: self.sfp_event.deinitialize() - if SFP.shared_sdk_handle: - deinitialize_sdk_handle(SFP.shared_sdk_handle) + if self._sfp_list: + from .sfp import SFP, deinitialize_sdk_handle + if SFP.shared_sdk_handle: + deinitialize_sdk_handle(SFP.shared_sdk_handle) ############################################## # PSU methods diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py index cd909231d1bc..17fe88037e06 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py @@ -17,7 +17,6 @@ import glob import os -from sonic_py_common import device_info from . import utils @@ -173,6 +172,7 @@ class DeviceDataManager: @classmethod @utils.read_only_cache() def get_platform_name(cls): + from sonic_py_common import device_info return device_info.get_platform() @classmethod From 6b70b448d2516cfec37a28cd5e5bf0c504c8f1e9 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Tue, 7 Jun 2022 07:52:13 -0700 Subject: [PATCH 395/817] [sonic-linkmgrd][master] Submodule Update (#11035) [sonic-linkmgrd][master] Submodule Update 9c8a16e Jing Zhang Sun Jun 5 08:27:07 2022 -0700 Separate I2C mux state probing and gRPC forwarding state probing (#86) 491c4ee Longxiang Lyu Sun Jun 5 23:26:19 2022 +0800 Fix peer mux wait back off factor (#84) a0b6b14 Jing Zhang Wed Jun 1 10:33:12 2022 -0700 Revert "Update log level for mux probing and mux state chance (#23)" (#85) 3c2b546 Jing Zhang Tue May 31 10:14:42 2022 -0700 Add default route support to active-active state machine (#78) 6fa892e Longxiang Lyu Fri May 27 09:15:06 2022 +0800 Degrade LinkProberStateMachineBase virtual function logging level (#80) 7b695ca Longxiang Lyu Fri May 27 09:14:02 2022 +0800 Fix mux wait timer and peer mux wait timer (#81) --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index d744bfb4a694..9c8a16eedbef 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit d744bfb4a6947cacfde744fc73550a7b99d8e0c8 +Subproject commit 9c8a16eedbef795c7d41fbd348152b43988dd6e0 From 36cdaa0c669a020d3d75382ea842640899fcd741 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 9 Jun 2022 06:49:49 +0800 Subject: [PATCH 396/817] [Bug]: fix the version file name issue (#11072) Why I did it [Bug]: fix the version file name issue --- scripts/build_debian_base_system.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build_debian_base_system.sh b/scripts/build_debian_base_system.sh index 0e00eeeac532..a403791e5242 100755 --- a/scripts/build_debian_base_system.sh +++ b/scripts/build_debian_base_system.sh @@ -21,7 +21,7 @@ generate_version_file() sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "dpkg-query -W -f '\${Package}==\${Version}\n'" > $TARGET_BASEIMAGE_PATH/versions-deb-${IMAGE_DISTRO}-${CONFIGURED_ARCH} } -if [ "$ENABLE_VERSION_CONTROL_DEB" != "y" ]; then +if [ "$ENABLE_VERSION_CONTROL_DEB" != "y" ] || [ ! -d files/build/versions/host-base-image ]; then if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then if [ $MULTIARCH_QEMU_ENVIRON == "y" ]; then # qemu arm bin executable for cross-building @@ -55,7 +55,7 @@ fi # Generate the version files for the host base image TEMP_DIR=$(mktemp -d) ./scripts/versions_manager.py generate -t $TEMP_DIR -n host-base-image -d $IMAGE_DISTRO -a $CONFIGURED_ARCH -PACKAGES=$(sed -E 's/=(=[^=]*)$/\1/' $TEMP_DIR/version-deb) +PACKAGES=$(sed -E 's/=(=[^=]*)$/\1/' $TEMP_DIR/versions-deb) if [ -z "$PACKAGES" ]; then echo "Not found host-base-image packages, please check the version files in files/build/versions/host-base-image" 2>&1 exit 1 From 67e89b837b9bf69263dc4e7473f86c370b2eb4b6 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 8 Jun 2022 18:00:37 -0700 Subject: [PATCH 397/817] [makefile] remove all fsroot folders (#11030) Why I did it Make reset didn't clean-up all fsroot folders. How I did it Remove all fsroot folders used during build. How to verify it Run local build and local make reset: sudo mkdir fsroot-test sudo touch fsroot-test/foo make reset (Without this change, make reset cannot remove fsroot-foo, with the change, the repo become clean after make reset.) Signed-off-by: Ying Xie ying.xie@microsoft.com --- Makefile.work | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.work b/Makefile.work index c1a6555cc5bc..ba01e27fd02d 100644 --- a/Makefile.work +++ b/Makefile.work @@ -463,7 +463,7 @@ reset : @read ans && ( if [ $$ans == y ]; then echo "Resetting local repository. Please wait..."; - $(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) sudo rm -rf fsroot; + sudo rm -rf fsroot*; if [ "$(MULTIARCH_QEMU_ENVIRON)" == y ] && [[ "$(CONFIGURED_ARCH)" == "armhf" || "$(CONFIGURED_ARCH)" == "arm64" ]]; then echo "Stopping march $(CONFIGURED_ARCH) docker" sudo kill -9 `sudo cat /var/run/march/docker.pid` || true From a07765ffea2df9300f026629a260dd97203d8525 Mon Sep 17 00:00:00 2001 From: Aravind Mani <53524901+aravindmani-1@users.noreply.github.com> Date: Thu, 9 Jun 2022 22:08:13 +0530 Subject: [PATCH 398/817] [DellEMC] Fix S5248f platform issues (#11076) * [DellEMC] Fix S5248f platform issues * update files Co-authored-by: Aravind Mani --- .../s5212f/sonic_platform/sfp.py | 2 + .../s5224f/sonic_platform/sfp.py | 2 + .../s5232f/sonic_platform/sfp.py | 2 + .../s5248f/scripts/s5248f_platform.sh | 72 ++++++++++--------- .../s5248f/sonic_platform/sfp.py | 2 + 5 files changed, 47 insertions(+), 33 deletions(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py index e08c2655277a..0b62c81bcb2f 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py @@ -13,6 +13,7 @@ import time import struct import mmap + import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -39,6 +40,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) self.sfp_type = sfp_type + self.port_type = sfp_type self.index = index self.eeprom_path = eeprom_path self._initialize_media(delay=False) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py index 5598f060a95d..e3c3ce02ab71 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py @@ -13,6 +13,7 @@ import time import struct import mmap + import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -39,6 +40,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) self.sfp_type = sfp_type + self.port_type = sfp_type self.index = index self.eeprom_path = eeprom_path self._initialize_media(delay=False) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py index 955e39d64297..7b2e9025bbd9 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py @@ -13,6 +13,7 @@ import time import struct import mmap + import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -39,6 +40,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) self.sfp_type = sfp_type + self.port_type = sfp_type self.index = index self.eeprom_path = eeprom_path self._initialize_media(delay=False) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/s5248f_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/s5248f_platform.sh index 84f236366702..7eea4c6511c8 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/s5248f_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/s5248f_platform.sh @@ -30,15 +30,14 @@ sys_eeprom() { switch_board_qsfp_mux() { case $1 in "new_device") - for ((i=603;i<=610;i++)); + for ((i=603;i<=609;i++)); do echo "Attaching PCA9548 @ 0x74" echo pca9548 0x74 > /sys/bus/i2c/devices/i2c-$i/$1 done - ;; "delete_device") - for ((i=603;i<=610;i++)); + for ((i=603;i<=609;i++)); do echo "Detaching PCA9548 @ 0x74" echo 0x74 > /sys/bus/i2c/devices/i2c-$i/$1 @@ -56,7 +55,11 @@ switch_board_qsfp_mux() { switch_board_qsfp() { case $1 in "new_device") - for ((i=2;i<=57;i++)); + for ((i=2;i<=49;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 + done + for ((i=50;i<=57;i++)); do echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 done @@ -86,20 +89,6 @@ switch_board_modsel() { done } -install_python_api_package() { - device="/usr/share/sonic/device" - platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) - - rv=$(pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl) -} - -remove_python_api_package() { - rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) - if [ $? -eq 0 ]; then - rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) - fi -} - platform_firmware_versions() { FIRMWARE_VERSION_FILE=/var/log/firmware_versions rm -rf ${FIRMWARE_VERSION_FILE} @@ -128,16 +117,6 @@ platform_firmware_versions() { r_min=`/usr/sbin/i2cget -y 600 0x31 0x0 | sed ' s/.*\(0x..\)$/\1/'` r_maj=`/usr/sbin/i2cget -y 600 0x31 0x1 | sed ' s/.*\(0x..\)$/\1/'` echo "Slave CPLD 2: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE - - #Slave CPLD 3 0x32 on i2c bus 600 ( physical FPGA I2C-1) - r_min=`/usr/sbin/i2cget -y 600 0x32 0x0 | sed ' s/.*\(0x..\)$/\1/'` - r_maj=`/usr/sbin/i2cget -y 600 0x32 0x1 | sed ' s/.*\(0x..\)$/\1/'` - echo "Slave CPLD 3: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE - - #Slave CPLD 3 0x32 on i2c bus 600 ( physical FPGA I2C-1) - r_min=`/usr/sbin/i2cget -y 600 0x33 0x0 | sed ' s/.*\(0x..\)$/\1/'` - r_maj=`/usr/sbin/i2cget -y 600 0x33 0x1 | sed ' s/.*\(0x..\)$/\1/'` - echo "Slave CPLD 4: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE } #This enables the led control for CPU and default states @@ -145,6 +124,36 @@ switch_board_led_default() { resource="/sys/bus/pci/devices/0000:04:00.0/resource0" /usr/bin/pcisysfs.py --set --offset 0x24 --val 0x194 --res $resource > /dev/null 2>&1 } + +install_python_api_package() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + + pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl +} + +remove_python_api_package() { + rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) + if [ $? -eq 0 ]; then + rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) + fi +} + +get_reboot_cause() { + REBOOT_REASON_FILE="/host/reboot-cause/platform/reboot_reason" + resource="/sys/bus/pci/devices/0000:04:00.0/resource0" + + mkdir -p $(dirname $REBOOT_REASON_FILE) + + # Handle First Boot into software version with reboot cause determination support + if [[ ! -e $REBOOT_REASON_FILE ]]; then + echo "0" > $REBOOT_REASON_FILE + else + /usr/bin/pcisysfs.py --get --offset 0x18 --res $resource | sed '1d; s/.*:\(.*\)$/\1/;' > $REBOOT_REASON_FILE + fi + /usr/bin/pcisysfs.py --set --val 0x0 --offset 0x18 --res $resource +} + init_devnum if [ "$1" == "init" ]; then @@ -155,6 +164,7 @@ if [ "$1" == "init" ]; then modprobe i2c_ocores modprobe dell_s5248f_fpga_ocores sys_eeprom "new_device" + get_reboot_cause switch_board_qsfp_mux "new_device" switch_board_qsfp "new_device" switch_board_modsel @@ -169,14 +179,11 @@ if [ "$1" == "init" ]; then echo -2 > /sys/bus/i2c/drivers/pca954x/607-0074/idle_state echo -2 > /sys/bus/i2c/drivers/pca954x/608-0074/idle_state echo -2 > /sys/bus/i2c/drivers/pca954x/609-0074/idle_state - echo -2 > /sys/bus/i2c/drivers/pca954x/610-0074/idle_state elif [ "$1" == "deinit" ]; then sys_eeprom "delete_device" switch_board_qsfp "delete_device" switch_board_qsfp_mux "delete_device" - - modprobe -r dell_s5248f_fpga_ocores modprobe -r i2c_ocores modprobe -r acpi_ipmi modprobe -r ipmi_si @@ -185,6 +192,5 @@ elif [ "$1" == "deinit" ]; then modprobe -r i2c-dev remove_python_api_package else - echo "s5248f_platform : Invalid option !" + echo "s5248f_platform : Invalid option !" fi - diff --git a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py index bc7f2bce9094..b568b6fa153e 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py @@ -13,6 +13,7 @@ import time import struct import mmap + import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -39,6 +40,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) self.sfp_type = sfp_type + self.port_type = sfp_type self.index = index self.eeprom_path = eeprom_path self._initialize_media(delay=False) From 77ad3ff19d74f0d78e2ea6c24dfe71288ae96cd0 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Thu, 9 Jun 2022 11:17:53 -0700 Subject: [PATCH 399/817] [portconfig]: Remove try exception during config_db initialization. (#10960) Why I did it Provide fix for comment: https://github.com/Azure/sonic-buildimage/pull/10475/files#r847753187; Move laoding database config to application code instead of portconfig as portconfig is used as a library. #10581 was raised for this fix, but had to be reverted due to issue with multi-asic platform. How I did it Remove try exception handing from portconfig.py during config_db intialization. Move loading of database config to application that uses portconfig.py. How to verify it unit-test passes. Verified that it does not cause issue during boot up of multi-asic VS image. Verified that config_db generation was successful in multi-asic VS. --- src/sonic-config-engine/portconfig.py | 7 +------ src/sonic-config-engine/sonic-cfggen | 11 ++++++++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/sonic-config-engine/portconfig.py b/src/sonic-config-engine/portconfig.py index 0c056d1cdab7..ea9985a3beb0 100644 --- a/src/sonic-config-engine/portconfig.py +++ b/src/sonic-config-engine/portconfig.py @@ -72,12 +72,7 @@ def db_connect_configdb(namespace=None): """ Connect to configdb """ - try: - if namespace is not None: - swsscommon.SonicDBConfig.load_sonic_global_db_config(namespace=namespace) - config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) - except Exception as e: - return None + config_db = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=namespace) if config_db is None: return None try: diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index bf93ad849fcb..ed7c3b616f3c 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -32,7 +32,7 @@ from functools import partial from minigraph import minigraph_encoder, parse_xml, parse_device_desc_xml, parse_asic_sub_role, parse_asic_switch_type from portconfig import get_port_config, get_breakout_mode from redis_bcc import RedisBytecodeCache -from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id +from sonic_py_common.multi_asic import get_asic_id_from_name, get_asic_device_id, is_multi_asic from sonic_py_common import device_info from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector, SonicDBConfig, ConfigDBPipeConnector @@ -138,6 +138,13 @@ def ip_network(value): return "Invalid ip address %s" % value return r_v.network +def load_namespace_config(asic_name): + if not SonicDBConfig.isInit(): + if is_multi_asic(): + SonicDBConfig.load_sonic_global_db_config(namespace=asic_name) + else: + SonicDBConfig.load_sonic_db_config() + class FormatConverter: """Convert config DB based schema to legacy minigraph based schema for backward capability. We will move to DB schema and remove this class when the config templates are modified. @@ -303,6 +310,7 @@ def main(): deep_update(data, hardware_data) if args.port_config is None: args.port_config = device_info.get_path_to_port_config_file(hwsku) + load_namespace_config(asic_name) (ports, _, _) = get_port_config(hwsku, platform, args.port_config, asic_id) if ports is None: print('Failed to get port config', file=sys.stderr) @@ -328,6 +336,7 @@ def main(): if args.minigraph is not None: minigraph = args.minigraph + load_namespace_config(asic_name) if platform: if args.port_config is not None: deep_update(data, parse_xml(minigraph, platform, args.port_config, asic_name=asic_name, hwsku_config_file=args.hwsku_config)) From 26436e34de585435281eece0126ddb1028c34456 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 9 Jun 2022 12:43:07 -0700 Subject: [PATCH 400/817] [submodule][swss] advance swss submodule head (#11015) To included: * ad8f5e4 2022-06-08 | Revert "[Counters] Improve performance by polling only configured ports buffer queue/pg counters (#2143)" (#2315) (HEAD -> master, origin/master, origin/HEAD) [Ying Xie] * 2ff763f 2022-06-08 | Fix test_warm_reboot issues blocking PR merge (#2309) [Vaibhav Hemant Dixit] * 05d19ea 2022-06-02 | Purge package sonic-db-cli which depends on libswsscommon (#2308) [Qi Luo] * a0c3238 2022-06-03 | Add port counter sanity check (#2300) [Junhua Zhai] * 4944f0f 2022-06-03 | Revert "[portsorch]: Prevent LAG member configuration when port has active ACL binding (#2165)" (#2306) [bingwang-ms] * eba212d 2022-05-31 | [Counters] Improve performance by polling only configured ports buffer queue/pg counters (#2143) [shlomibitton] * 9999dae 2022-05-28 | [counter] Support gearbox counters (#2218) [Junhua Zhai] * c73cf10 2022-05-28 | Support mock_test infra for dynamic buffer manager and fix issues found during mock test (#2234) [Stephen Sun] Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 910bfd4d1778..ad8f5e43951d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 910bfd4d17782a059daf2d81deb87673ae6ca58e +Subproject commit ad8f5e43951d6ab8cb2e777f45f4da5a9245a982 From 0b1ae9c43c15c1e4a47a566cfb5b53f185a8ab47 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Thu, 9 Jun 2022 15:32:24 -0700 Subject: [PATCH 401/817] Cleanup macsec stateDB tables on restart (#11066) Clean macsec tables in STATE_DB on start --- files/scripts/swss.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 000790c6d051..5b2772eafac4 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -176,7 +176,7 @@ start() { $SONIC_DB_CLI GB_ASIC_DB FLUSHDB $SONIC_DB_CLI GB_COUNTERS_DB FLUSHDB $SONIC_DB_CLI RESTAPI_DB FLUSHDB - clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*'" + clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*', 'MACSEC_PORT_TABLE*', 'MACSEC_INGRESS_SA_TABLE*', 'MACSEC_EGRESS_SA_TABLE*', 'MACSEC_INGRESS_SC_TABLE*', 'MACSEC_EGRESS_SC_TABLE*'" $SONIC_DB_CLI APPL_STATE_DB FLUSHDB fi From ead106eda86741235347d42c0d15ab1fc37fd017 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 10 Jun 2022 07:40:37 -0700 Subject: [PATCH 402/817] Add ping to swss-layer docker (#11093) Signed-off-by: Saikrishna Arcot --- dockers/docker-swss-layer-bullseye/Dockerfile.j2 | 2 ++ dockers/docker-swss-layer-buster/Dockerfile.j2 | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dockers/docker-swss-layer-bullseye/Dockerfile.j2 b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 index 15f0e0edcc4a..cd250698dace 100644 --- a/dockers/docker-swss-layer-bullseye/Dockerfile.j2 +++ b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 @@ -6,6 +6,8 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update +RUN apt-get install iputils-ping + {% if docker_swss_layer_bullseye_debs.strip() -%} # Copy locally-built Debian package dependencies {{ copy_files("debs/", docker_swss_layer_bullseye_debs.split(' '), "/debs/") }} diff --git a/dockers/docker-swss-layer-buster/Dockerfile.j2 b/dockers/docker-swss-layer-buster/Dockerfile.j2 index 36f085936dcf..a86b72941858 100644 --- a/dockers/docker-swss-layer-buster/Dockerfile.j2 +++ b/dockers/docker-swss-layer-buster/Dockerfile.j2 @@ -6,6 +6,8 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update +RUN apt-get install iputils-ping + {% if docker_swss_layer_buster_debs.strip() -%} # Copy locally-built Debian package dependencies {{ copy_files("debs/", docker_swss_layer_buster_debs.split(' '), "/debs/") }} From 245884a97f0f506d17930ac65d56e898b31398fe Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Fri, 10 Jun 2022 11:03:36 -0700 Subject: [PATCH 403/817] [submodule]: update sonic-swss (#11094) * b12af41 2022-06-09 | [fpmsyncd] don't manipulate route weight (#2320) (HEAD, origin/master, origin/HEAD) [Ying Xie] * a3f4fbb 2022-06-09 | Combine PGs in buffermgrd (#2281) [bingwang-ms] Signed-off-by: Guohan Lu --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index ad8f5e43951d..b12af413e9a6 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit ad8f5e43951d6ab8cb2e777f45f4da5a9245a982 +Subproject commit b12af413e9a66094101f3c57aa4bc62001d520e1 From 356b51f4d6c903e5a40c9a3ab01feae5182e0724 Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Sat, 11 Jun 2022 02:14:45 +0800 Subject: [PATCH 404/817] [Tunnel PFC][Fix bug] Fix bug and Tests for adding property 'sai_remap_prio_on_tnl_egress' (#11027) * [Tunnel PFC] Tests for adding property 'sai_remap_prio_on_tnl_egress' Add tests for adding property 'sai_remap_prio_on_tnl_egress', this property should only be added in dual tor environment. Test done: Run test test_j2files.py Co-authored-by: richardyu --- .../Arista-7260CX3-D108C8/config.bcm.j2 | 2 +- .../tests/data/j2_template/config.bcm.j2 | 28 ++++++++ .../tests/data/j2_template/port_config.ini | 67 +++++++++++++++++++ .../py3/arista7050cx3-dualtor.config.bcm | 8 +++ .../py3/arista7260-dualtor.config.bcm | 8 +++ .../py3/arista7260-t1.config.bcm | 5 ++ src/sonic-config-engine/tests/test_j2files.py | 31 +++++++++ 7 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 create mode 100644 src/sonic-config-engine/tests/data/j2_template/port_config.ini create mode 100644 src/sonic-config-engine/tests/sample_output/py3/arista7050cx3-dualtor.config.bcm create mode 100644 src/sonic-config-engine/tests/sample_output/py3/arista7260-dualtor.config.bcm create mode 100644 src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 index 145426e05915..1221cdc6691e 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 @@ -7,7 +7,7 @@ {%- set IPinIP_sock = 'sai_tunnel_support=1 sai_tunnel_underlay_route_mode=1 host_as_route_disable=1 - l3_ecmp_levels=2' -%} -%} + l3_ecmp_levels=2' -%} {%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} {%- endif %} {%- endif %} diff --git a/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 b/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 new file mode 100644 index 000000000000..187d40af2d4e --- /dev/null +++ b/src/sonic-config-engine/tests/data/j2_template/config.bcm.j2 @@ -0,0 +1,28 @@ +{# Construct config.bcm to include additional soc properties per specific device metadata requirement #} +{%- set mmu_sock = 'mmu_init_config="MSFT-TH2-Tier1"' -%} +{%- set IPinIP_sock = '' -%} +{%- set map_prio = '' -%} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined -%} +{%- if DEVICE_METADATA['localhost']['type'] is defined -%} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} +{%- if 'torrouter' in switch_role.lower() or 'torswitch' in switch_role.lower() %} +{%- set mmu_sock = 'mmu_init_config="MSFT-TH2-Tier0"' -%} +{%- endif %} +{%- endif %} +{%- if DEVICE_METADATA['localhost']['subtype'] is defined -%} +{%- set switch_subtype = DEVICE_METADATA['localhost']['subtype'] -%} +{%- if 'dualtor' in switch_subtype.lower() %} +{%- set IPinIP_sock = 'sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 + host_as_route_disable=1 + l3_ecmp_levels=2' -%} +{%- set map_prio = 'sai_remap_prio_on_tnl_egress=1' -%} +{%- endif %} +{%- endif %} +{%- endif %} +{# The following is the common soc properties that used to be named "th2-a7260cx3-64-64x100G-t1.config.bcm" #} + +l3_alpm_hit_skip=1 +{{ map_prio }} +{{ mmu_sock }} +{{ IPinIP_sock }} diff --git a/src/sonic-config-engine/tests/data/j2_template/port_config.ini b/src/sonic-config-engine/tests/data/j2_template/port_config.ini new file mode 100644 index 000000000000..3940948a3541 --- /dev/null +++ b/src/sonic-config-engine/tests/data/j2_template/port_config.ini @@ -0,0 +1,67 @@ +# name lanes alias index speed +Ethernet0 77,78,79,80 Ethernet1/1 1 100000 +Ethernet4 65,66,67,68 Ethernet2/1 2 100000 +Ethernet8 85,86,87,88 Ethernet3/1 3 100000 +Ethernet12 89,90,91,92 Ethernet4/1 4 100000 +Ethernet16 109,110,111,112 Ethernet5/1 5 100000 +Ethernet20 97,98,99,100 Ethernet6/1 6 100000 +Ethernet24 5,6,7,8 Ethernet7/1 7 100000 +Ethernet28 13,14,15,16 Ethernet8/1 8 100000 +Ethernet32 25,26,27,28 Ethernet9/1 9 100000 +Ethernet36 21,22,23,24 Ethernet10/1 10 100000 +Ethernet40 37,38,39,40 Ethernet11/1 11 100000 +Ethernet44 45,46,47,48 Ethernet12/1 12 100000 +Ethernet48 57,58,59,60 Ethernet13/1 13 100000 +Ethernet52 53,54,55,56 Ethernet14/1 14 100000 +Ethernet56 117,118,119,120 Ethernet15/1 15 100000 +Ethernet60 121,122,123,124 Ethernet16/1 16 100000 +Ethernet64 141,142,143,144 Ethernet17/1 17 100000 +Ethernet68 133,134,135,136 Ethernet18/1 18 100000 +Ethernet72 197,198,199,200 Ethernet19/1 19 100000 +Ethernet76 205,206,207,208 Ethernet20/1 20 100000 +Ethernet80 217,218,219,220 Ethernet21/1 21 100000 +Ethernet84 213,214,215,216 Ethernet22/1 22 100000 +Ethernet88 229,230,231,232 Ethernet23/1 23 100000 +Ethernet92 237,238,239,240 Ethernet24/1 24 100000 +Ethernet96 249,250,251,252 Ethernet25/1 25 100000 +Ethernet100 245,246,247,248 Ethernet26/1 26 100000 +Ethernet104 149,150,151,152 Ethernet27/1 27 100000 +Ethernet108 153,154,155,156 Ethernet28/1 28 100000 +Ethernet112 173,174,175,176 Ethernet29/1 29 100000 +Ethernet116 161,162,163,164 Ethernet30/1 30 100000 +Ethernet120 181,182,183,184 Ethernet31/1 31 100000 +Ethernet124 185,186,187,188 Ethernet32/1 32 100000 +Ethernet128 69,70,71,72 Ethernet33/1 33 100000 +Ethernet132 73,74,75,76 Ethernet34/1 34 100000 +Ethernet136 93,94,95,96 Ethernet35/1 35 100000 +Ethernet140 81,82,83,84 Ethernet36/1 36 100000 +Ethernet144 101,102,103,104 Ethernet37/1 37 100000 +Ethernet148 105,106,107,108 Ethernet38/1 38 100000 +Ethernet152 9,10,11,12 Ethernet39/1 39 100000 +Ethernet156 1,2,3,4 Ethernet40/1 40 100000 +Ethernet160 17,18,19,20 Ethernet41/1 41 100000 +Ethernet164 29,30,31,32 Ethernet42/1 42 100000 +Ethernet168 41,42,43,44 Ethernet43/1 43 100000 +Ethernet172 33,34,35,36 Ethernet44/1 44 100000 +Ethernet176 49,50,51,52 Ethernet45/1 45 100000 +Ethernet180 61,62,63,64 Ethernet46/1 46 100000 +Ethernet184 125,126,127,128 Ethernet47/1 47 100000 +Ethernet188 113,114,115,116 Ethernet48/1 48 100000 +Ethernet192 129,130,131,132 Ethernet49/1 49 100000 +Ethernet196 137,138,139,140 Ethernet50/1 50 100000 +Ethernet200 201,202,203,204 Ethernet51/1 51 100000 +Ethernet204 193,194,195,196 Ethernet52/1 52 100000 +Ethernet208 209,210,211,212 Ethernet53/1 53 100000 +Ethernet212 221,222,223,224 Ethernet54/1 54 100000 +Ethernet216 233,234,235,236 Ethernet55/1 55 100000 +Ethernet220 225,226,227,228 Ethernet56/1 56 100000 +Ethernet224 241,242,243,244 Ethernet57/1 57 100000 +Ethernet228 253,254,255,256 Ethernet58/1 58 100000 +Ethernet232 157,158,159,160 Ethernet59/1 59 100000 +Ethernet236 145,146,147,148 Ethernet60/1 60 100000 +Ethernet240 165,166,167,168 Ethernet61/1 61 100000 +Ethernet244 169,170,171,172 Ethernet62/1 62 100000 +Ethernet248 189,190,191,192 Ethernet63/1 63 100000 +Ethernet252 177,178,179,180 Ethernet64/1 64 100000 +Ethernet256 257 Ethernet65 65 10000 +Ethernet260 259 Ethernet66 66 10000 diff --git a/src/sonic-config-engine/tests/sample_output/py3/arista7050cx3-dualtor.config.bcm b/src/sonic-config-engine/tests/sample_output/py3/arista7050cx3-dualtor.config.bcm new file mode 100644 index 000000000000..7d21ac82f120 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/arista7050cx3-dualtor.config.bcm @@ -0,0 +1,8 @@ + +l3_alpm_hit_skip=1 +sai_remap_prio_on_tnl_egress=1 +mmu_init_config="MSFT-TH2-Tier0" +sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 + host_as_route_disable=1 + l3_ecmp_levels=2 diff --git a/src/sonic-config-engine/tests/sample_output/py3/arista7260-dualtor.config.bcm b/src/sonic-config-engine/tests/sample_output/py3/arista7260-dualtor.config.bcm new file mode 100644 index 000000000000..7d21ac82f120 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/arista7260-dualtor.config.bcm @@ -0,0 +1,8 @@ + +l3_alpm_hit_skip=1 +sai_remap_prio_on_tnl_egress=1 +mmu_init_config="MSFT-TH2-Tier0" +sai_tunnel_support=1 + sai_tunnel_underlay_route_mode=1 + host_as_route_disable=1 + l3_ecmp_levels=2 diff --git a/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm b/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm new file mode 100644 index 000000000000..84a917290f24 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/arista7260-t1.config.bcm @@ -0,0 +1,5 @@ + +l3_alpm_hit_skip=1 + +mmu_init_config="MSFT-TH2-Tier1" + diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 353dbaed41e1..e16ab6e7bec2 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -364,6 +364,37 @@ def test_qos_dscp_remapping_render_template(self): assert utils.cmp(sample_output_file, test_output) os.remove(test_output) + def test_config_brcm_render_template(self): + if utils.PYvX_DIR != 'py3': + #Skip on python2 as the change will not be backported to previous version + return + + config_bcm_sample_outputs = [ + 'arista7050cx3-dualtor.config.bcm', + 'arista7260-dualtor.config.bcm', + 'arista7260-t1.config.bcm' + ] + sample_minigraph_files = [ + 'sample-arista-7050cx3-dualtor-minigraph.xml', + 'sample-arista-7260-dualtor-minigraph.xml', + 'sample-arista-7260-t1-minigraph.xml' + ] + for i, config in enumerate(config_bcm_sample_outputs): + device_template_path = os.path.join(self.test_dir, './data/j2_template') + config_sample_output = config_bcm_sample_outputs[i] + sample_minigraph_file = os.path.join(self.test_dir,sample_minigraph_files[i]) + port_config_ini_file = os.path.join(device_template_path, 'port_config.ini') + config_bcm_file = os.path.join(device_template_path, 'config.bcm.j2') + config_test_output = os.path.join(self.test_dir, 'config_output.bcm') + + argument = '-m ' + sample_minigraph_file + ' -p ' + port_config_ini_file + ' -t ' + config_bcm_file + ' > ' + config_test_output + self.run_script(argument) + + #check output config.bcm + config_sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, config_sample_output) + assert utils.cmp(config_sample_output_file, config_test_output) + os.remove(config_test_output) + def _test_buffers_render_template(self, vendor, platform, sku, minigraph, buffer_template, expected): file_exist, dir_exist = self.create_machine_conf(platform, vendor) dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) From 201792f3cd79e349a37e33611154d638cf842b6a Mon Sep 17 00:00:00 2001 From: Prince George <45705344+prgeor@users.noreply.github.com> Date: Sun, 12 Jun 2022 09:14:35 -0700 Subject: [PATCH 405/817] Yang model for xcvr tx power and frequency configuration (#11053) * Yang model for xcvr tx power and frequency configuration * Add unit test cases * Addressed review comments --- src/sonic-yang-models/doc/Configuration.md | 12 +++- .../tests/files/sample_config_db.json | 8 ++- .../tests/yang_model_tests/tests/port.json | 16 +++++ .../yang_model_tests/tests_config/port.json | 68 +++++++++++++++++++ .../yang-models/sonic-port.yang | 12 ++++ 5 files changed, 111 insertions(+), 5 deletions(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index dd3c702e630b..2339a7859171 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1176,7 +1176,9 @@ optional attributes. "mtu": "9100", "alias": "fortyGigE1/1/1", "speed": "40000", - "link_training": "off" + "link_training": "off", + "laser_freq": "191300", + "tx_power": "-27.3" }, "Ethernet1": { "index": "1", @@ -1186,7 +1188,9 @@ optional attributes. "alias": "fortyGigE1/1/2", "admin_status": "up", "speed": "40000", - "link_training": "on" + "link_training": "on", + "laser_freq": "191300", + "tx_power": "-27.3" }, "Ethernet63": { "index": "63", @@ -1194,7 +1198,9 @@ optional attributes. "description": "fortyGigE1/4/16", "mtu": "9100", "alias": "fortyGigE1/4/16", - "speed": "40000" + "speed": "40000", + "laser_freq": "191300", + "tx_power": "-27.3" } } } diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 8a2227ef0804..a042bc6a9473 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -446,7 +446,9 @@ "asic_port_name": "Eth0-ASIC1", "role": "Ext", "macsec": "test", - "link_training": "off" + "link_training": "off", + "laser_freq": "191600", + "tx_power": "-26.6" }, "Ethernet1": { "alias": "Eth1/2", @@ -458,7 +460,9 @@ "autoneg": "on", "adv_speeds": "100000,50000", "adv_interface_types": "CR,CR4", - "link_training": "on" + "link_training": "on", + "laser_freq": "191300", + "tx_power": "-27.3" }, "Ethernet2": { "alias": "Eth1/3", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json index 0d67a73148b3..3b94cedab4d9 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/port.json @@ -69,6 +69,22 @@ "desc": "PORT_INVALID_ADVTYPES_TEST_2 must condition failure.", "eStrKey" : "Must" }, + "PORT_VALID_XCVR_FREQ_TEST": { + "desc": "PORT_VALID_XCVR_FREQ_TEST no failure" + }, + "PORT_VALID_XCVR_TX_POWER_TEST": { + "desc": "PORT_VALID_XCVR_TX_POWER_TEST no failure" + }, + "PORT_INVALID_XCVR_FREQ_TEST": { + "desc": "PORT_INVALID_XCVR_FREQ_TEST non-integer value, expect failure", + "eStrKey": "InvalidValue", + "eStr": ["laser_freq"] + }, + "PORT_INVALID_XCVR_TX_POWER_TEST": { + "desc": "PORT_INVALID_XCVR_TX_POWER_TEST non-float value, expect failure", + "eStrKey": "InvalidValue", + "eStr": ["tx_power"] + }, "PORT_VALID_LINK_TRAINING_TEST_1": { "desc": "PORT_VALID_LINK_TRAINING_TEST_1 no failure." }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json index 7f5c91230df8..b6ccf9ec8780 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/port.json @@ -311,6 +311,74 @@ } }, + "PORT_VALID_XCVR_FREQ_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "laser_freq": 193100 + } + ] + } + } + }, + + "PORT_VALID_XCVR_TX_POWER_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "tx_power": "27.3" + } + ] + } + } + }, + + "PORT_INVALID_XCVR_FREQ_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "laser_freq": "27.3" + } + ] + } + } + }, + + "PORT_INVALID_XCVR_TX_POWER_TEST": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "alias": "eth8", + "lanes": "65", + "speed": 25000, + "tpid": "0x8100", + "tx_power": "27/4" + } + ] + } + } + }, + "PORT_VALID_LINK_TRAINING_TEST_1": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index 6921613624ff..6e03f777a859 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -171,6 +171,18 @@ module sonic-port{ } } + leaf tx_power { + description "Target output power(dBm) for the 400G ZR transceiver"; + type decimal64 { + fraction-digits 1; + } + } + + leaf laser_freq { + description "Target laser frequency(GHz) for the 400G ZR transceiver"; + type int32; + } + } /* end of list PORT_LIST */ } /* end of container PORT */ From 6a4105ad17de526383efd8982f55a7e7129e46b1 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Mon, 13 Jun 2022 15:56:18 -0700 Subject: [PATCH 406/817] [sonic-utilities] update submodule (#11090) 29503ab [portchannel] Added ACL/PBH binding checks to the port before getting added to portchannel (#2151) ac89489 Modify override testcase to cover PORT admin_status (#2165) d7953d2 [GCU] Validate peer_group_range ip_range are correct (#2145) aa81b97 [auto-ts] add memory check (#2116) b370290 support new interface types CR8/SR8/KR8/LR8 which are brougnt by SAI V.1.10.2 (#2167) 87fc0a4 [scripts/fast-reboot] Add option to include ssd-upgrader-part boot option with SONiC partition (#2150) 90abc07 [config reload] Fix invalid rstrip. (#2157) fac1769 Accept 0 for queue and dscp (#2162) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 288c2d8d9328..29503aba7d61 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 288c2d8d932899c71c34d360983cee640a9694fd +Subproject commit 29503aba7d610224237371d1d190a2bcbd7aec65 From cca3b5be5be3458a5eac8e5d66081542c96c916e Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Tue, 14 Jun 2022 07:18:47 -0700 Subject: [PATCH 407/817] Reduce logic in updategraph (#11010) Why I did it The dhcp_graph_url used by internal service is always set as "N/A". So we can make the updategraph logic short. How I did it Shorten 'if statement' logic for /tmp/dhcp_graph_url --- files/image_config/updategraph/updategraph | 110 ++++----------------- 1 file changed, 18 insertions(+), 92 deletions(-) diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 5c767b83d95c..061d8e1133c4 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -35,100 +35,26 @@ if [ -e /usr/bin/ztp ] && [ "$(ztp status -c)" != "0:DISABLED" ]; then exit 0 fi -ACL_URL=$acl_src - -if [ "$src" = "dhcp" ]; then - # Enable dhcp client on management port eth0 - /sbin/dhclient -4 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0 & - disown - - while [ ! -f /tmp/dhcp_graph_url ]; do - echo "Waiting for DHCP response..." - sleep 1 - done - - if [ "`cat /tmp/dhcp_graph_url`" = "N/A" ]; then - echo "No graph_url option in DHCP response. Skipping graph update and generating an empty configuration." - PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} - if [ -f /etc/sonic/minigraph.xml ]; then - sonic-cfggen -H -m /etc/sonic/minigraph.xml --preset empty > /tmp/device_meta.json - else - PRESET=(`head -n 1 /usr/share/sonic/device/$PLATFORM/default_sku`) - sonic-cfggen -H -k ${PRESET[0]} --preset empty > /tmp/device_meta.json - fi - if [ -f /etc/sonic/init_cfg.json ]; then - sonic-cfggen -j /tmp/device_meta.json -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json - else - cp -f /tmp/device_meta.json /etc/sonic/config_db.json - fi - sonic-db-cli CONFIG_DB FLUSHDB - sonic-cfggen -j /etc/sonic/config_db.json --write-to-db - sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" - if [ "$dhcp_as_static" = "true" ]; then - sed -i "/enabled=/d" /etc/sonic/updategraph.conf - echo "enabled=false" >> /etc/sonic/updategraph.conf - fi - exit 0 - fi - - - HOSTNAME=`hostname -s` - GRAPH_URL=`sonic-cfggen -t /tmp/dhcp_graph_url -a "{\"hostname\": \"$HOSTNAME\"}"` - URL_REGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$' - if [[ ! $GRAPH_URL =~ $URL_REGEX ]]; then - echo "\"$GRAPH_URL\" is not a valid url. Skipping graph update." - exit 0 - fi - if [ "$dhcp_as_static" = "true" ]; then - sed -i "/src=/d" /etc/sonic/updategraph.conf - echo "src=\"$GRAPH_URL\"" >> /etc/sonic/updategraph.conf - fi - - if [ -f /tmp/dhcp_acl_url ]; then - ACL_URL=`sonic-cfggen -t /tmp/dhcp_acl_url -a "{\"hostname\": \"$HOSTNAME\"}"` - if [[ ! $ACL_URL =~ $URL_REGEX ]]; then - echo "\"$ACL_URL\" is not a valid url. Skipping acl update." - ACL_URL="" - fi - if [ "$dhcp_as_static" = "true" ]; then - sed -i "/acl_src=/d" /etc/sonic/updategraph.conf - echo "acl_src=\"$ACL_URL\"" >> /etc/sonic/updategraph.conf - fi - fi -else - GRAPH_URL=$src -fi - +# "`cat /tmp/dhcp_graph_url`" is always "N/A" +echo "No graph_url option in DHCP response. Skipping graph update and generating an empty configuration." +PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} if [ -f /etc/sonic/minigraph.xml ]; then - echo "Renaming minigraph.xml to minigraph.old" - mv /etc/sonic/minigraph.xml /etc/sonic/minigraph.old + sonic-cfggen -H -m /etc/sonic/minigraph.xml --preset empty > /tmp/device_meta.json +else + PRESET=(`head -n 1 /usr/share/sonic/device/$PLATFORM/default_sku`) + sonic-cfggen -H -k ${PRESET[0]} --preset empty > /tmp/device_meta.json fi - -echo "Getting minigraph from $GRAPH_URL" - -while true; do - curl -f $GRAPH_URL -o /etc/sonic/minigraph.xml --connect-timeout 15 && break - sleep 5 -done - -if [ -n "$ACL_URL" ]; then - if [ -f /etc/sonic/acl.json ]; then - echo "Renaming acl.json to acl.json.old" - mv /etc/sonic/acl.json /etc/sonic/acl.json.old - fi - echo "Getting ACL config from $ACL_URL" - - while true; do - curl -f $ACL_URL -o /etc/sonic/acl.json --connect-timeout 15 && break - sleep 5 - done +if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -j /tmp/device_meta.json -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json else - echo "Skip ACL config download." + cp -f /tmp/device_meta.json /etc/sonic/config_db.json fi - -reload_minigraph - -# Mark as disabled after graph is successfully downloaded -sed -i "/enabled=/d" /etc/sonic/updategraph.conf -echo "enabled=false" >> /etc/sonic/updategraph.conf +sonic-db-cli CONFIG_DB FLUSHDB +sonic-cfggen -j /etc/sonic/config_db.json --write-to-db +sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1" +if [ "$dhcp_as_static" = "true" ]; then + sed -i "/enabled=/d" /etc/sonic/updategraph.conf + echo "enabled=false" >> /etc/sonic/updategraph.conf +fi +exit 0 From 63c7c5b4e6c5f55225539039c78b2d1bc7095c7e Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Tue, 14 Jun 2022 23:52:40 +0800 Subject: [PATCH 408/817] [submodule]: update sonic-swss-common (#11127) 2022-06-14 92f5411: [counter] Add counter table (Azure/sonic-swss-common#622) (Junhua Zhai) 2022-06-03 38c04dd: Purge package sonic-db-cli which depends on libswsscommon (Azure/sonic-swss-common#628) (Qi Luo) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 33afb9bee18e..92f541111721 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 33afb9bee18ea116665f231b396cab32258c98d8 +Subproject commit 92f54111172138a3c1b2ed2dfbdda23e84d9ae9d From 9cdde8576c1f125a1a177159d43b5374895232b8 Mon Sep 17 00:00:00 2001 From: Jon Goldberg <63672455+jon-nokia@users.noreply.github.com> Date: Tue, 14 Jun 2022 11:56:27 -0400 Subject: [PATCH 409/817] [installer]: fix armhf for installer.conf usage (#11121) This fixes the build for armhf to be able to use '/device///installer.conf' files. Specifically, armhf needs support to be able to change the size of /var/log/ directory. It is hardcoded to 512 bytes on all armhf platforms currently. This change will allow any armhf platform to be able to use an installer.conf file to customize the installed image. --- build_image.sh | 8 ++++---- platform/marvell-armhf/platform.conf | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/build_image.sh b/build_image.sh index 0963ff4a4843..69ea4ddf56ca 100755 --- a/build_image.sh +++ b/build_image.sh @@ -71,12 +71,12 @@ generate_onie_installer_image() output_file=$OUTPUT_ONIE_IMAGE [ -n "$1" ] && output_file=$1 # Copy platform-specific ONIE installer config files where onie-mk-demo.sh expects them - rm -rf ./installer/x86_64/platforms/ - mkdir -p ./installer/x86_64/platforms/ + rm -rf ./installer/${TARGET_PLATFORM}/platforms/ + mkdir -p ./installer/${TARGET_PLATFORM}/platforms/ for VENDOR in `ls ./device`; do - for PLATFORM in `ls ./device/$VENDOR`; do + for PLATFORM in `ls ./device/$VENDOR | grep ^${TARGET_PLATFORM}`; do if [ -f ./device/$VENDOR/$PLATFORM/installer.conf ]; then - cp ./device/$VENDOR/$PLATFORM/installer.conf ./installer/x86_64/platforms/$PLATFORM + cp ./device/$VENDOR/$PLATFORM/installer.conf ./installer/${TARGET_PLATFORM}/platforms/$PLATFORM fi done diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index df71c5d1b128..2f2a22cd8640 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -9,7 +9,6 @@ kernel_addr=0x1100000 fdt_addr=0x1000000 fdt_high=0x10fffff initrd_addr=0x2000000 -VAR_LOG=512 kernel_fname="/boot/vmlinuz-5.10.0-12-2-armmp" initrd_fname="/boot/initrd.img-5.10.0-12-2-armmp" @@ -147,8 +146,8 @@ prepare_boot_menu() { BORDER='echo "---------------------------------------------------";echo;' fw_setenv ${FW_ARG} print_menu $BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER > /dev/null - fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4 ${extra_cmdline_linux}" > /dev/null - fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4" > /dev/null + fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG_SIZE loglevel=4 ${extra_cmdline_linux}" > /dev/null + fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG_SIZE loglevel=4" > /dev/null # Set boot configs fw_setenv ${FW_ARG} kernel_addr $kernel_addr > /dev/null From b655cd49a3fdf0996aa4ff040ffcdf6872dffa8a Mon Sep 17 00:00:00 2001 From: Jon Goldberg <63672455+jon-nokia@users.noreply.github.com> Date: Tue, 14 Jun 2022 11:57:33 -0400 Subject: [PATCH 410/817] [Nokia ixs7215] change var/log size to 4GB (#11122) This makes use of #11121 to add support for configuration of VAR_LOG_SIZE on Nokia IXS7215 --- device/nokia/armhf-nokia_ixs7215_52x-r0/installer.conf | 1 + 1 file changed, 1 insertion(+) create mode 100644 device/nokia/armhf-nokia_ixs7215_52x-r0/installer.conf diff --git a/device/nokia/armhf-nokia_ixs7215_52x-r0/installer.conf b/device/nokia/armhf-nokia_ixs7215_52x-r0/installer.conf new file mode 100644 index 000000000000..b138f294e1ea --- /dev/null +++ b/device/nokia/armhf-nokia_ixs7215_52x-r0/installer.conf @@ -0,0 +1 @@ +VAR_LOG_SIZE=4096 From 957285236a517df5b8152386ca5c0e46bd303997 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Tue, 14 Jun 2022 11:48:59 -0700 Subject: [PATCH 411/817] [github]: update pr template to include 202205 backport option (#11139) Signed-off-by: Guohan Lu --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 62b8d0b2afca..1ff6883573d2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -31,6 +31,7 @@ - [ ] 202012 - [ ] 202106 - [ ] 202111 +- [ ] 202205 #### Description for the changelog LED Port (1-based indexing) +# QSFPDD [17-24] Ethernet0-7 Eth1/1/1-8 +config add sai_led_portmap_17=1 +config add sai_led_portmap_18=1 +config add sai_led_portmap_19=1 +config add sai_led_portmap_20=1 +config add sai_led_portmap_21=1 +config add sai_led_portmap_22=1 +config add sai_led_portmap_23=1 +config add sai_led_portmap_24=1 +# QSFPDD [25-32] Ethernet8-15 Eth1/2/1-8 +config add sai_led_portmap_25=2 +config add sai_led_portmap_26=2 +config add sai_led_portmap_27=2 +config add sai_led_portmap_28=2 +config add sai_led_portmap_29=2 +config add sai_led_portmap_30=2 +config add sai_led_portmap_31=2 +config add sai_led_portmap_32=2 +# QSFPDD [1-8] Ethernet16-23 Eth1/3/1-8 +config add sai_led_portmap_1=3 +config add sai_led_portmap_2=3 +config add sai_led_portmap_3=3 +config add sai_led_portmap_4=3 +config add sai_led_portmap_5=3 +config add sai_led_portmap_6=3 +config add sai_led_portmap_7=3 +config add sai_led_portmap_8=3 +# QSFPDD [9-16] Ethernet24-31 Eth1/4/1-8 +config add sai_led_portmap_9=4 +config add sai_led_portmap_10=4 +config add sai_led_portmap_11=4 +config add sai_led_portmap_12=4 +config add sai_led_portmap_13=4 +config add sai_led_portmap_14=4 +config add sai_led_portmap_15=4 +config add sai_led_portmap_16=4 +# QSFPDD [49-56] Ethernet32-39 Eth1/5/1-8 +config add sai_led_portmap_49=5 +config add sai_led_portmap_50=5 +config add sai_led_portmap_51=5 +config add sai_led_portmap_52=5 +config add sai_led_portmap_53=5 +config add sai_led_portmap_54=5 +config add sai_led_portmap_55=5 +config add sai_led_portmap_56=5 +# QSFPDD [57-64] Ethernet40-47 Eth1/6/1-8 +config add sai_led_portmap_57=6 +config add sai_led_portmap_58=6 +config add sai_led_portmap_59=6 +config add sai_led_portmap_60=6 +config add sai_led_portmap_61=6 +config add sai_led_portmap_62=6 +config add sai_led_portmap_63=6 +config add sai_led_portmap_64=6 +# QSFPDD [33-40] Ethernet48-55 Eth1/7/1-8 +config add sai_led_portmap_33=7 +config add sai_led_portmap_34=7 +config add sai_led_portmap_35=7 +config add sai_led_portmap_36=7 +config add sai_led_portmap_37=7 +config add sai_led_portmap_38=7 +config add sai_led_portmap_39=7 +config add sai_led_portmap_40=7 +# QSFPDD [41-48] Ethernet56-63 Eth1/8/1-8 +config add sai_led_portmap_41=8 +config add sai_led_portmap_42=8 +config add sai_led_portmap_43=8 +config add sai_led_portmap_44=8 +config add sai_led_portmap_45=8 +config add sai_led_portmap_46=8 +config add sai_led_portmap_47=8 +config add sai_led_portmap_48=8 +# QSFPDD [81-88] Ethernet64-71 Eth1/9/1-8 +config add sai_led_portmap_81=9 +config add sai_led_portmap_82=9 +config add sai_led_portmap_83=9 +config add sai_led_portmap_84=9 +config add sai_led_portmap_85=9 +config add sai_led_portmap_86=9 +config add sai_led_portmap_87=9 +config add sai_led_portmap_88=9 +# QSFPDD [89-96] Ethernet72-79 Eth1/10/1-8 +config add sai_led_portmap_89=10 +config add sai_led_portmap_90=10 +config add sai_led_portmap_91=10 +config add sai_led_portmap_92=10 +config add sai_led_portmap_93=10 +config add sai_led_portmap_94=10 +config add sai_led_portmap_95=10 +config add sai_led_portmap_96=10 +# QSFPDD [65-72] Ethernet80-87 Eth1/11/1-8 +config add sai_led_portmap_65=11 +config add sai_led_portmap_66=11 +config add sai_led_portmap_67=11 +config add sai_led_portmap_68=11 +config add sai_led_portmap_69=11 +config add sai_led_portmap_70=11 +config add sai_led_portmap_71=11 +config add sai_led_portmap_72=11 +# QSFPDD [73-80] Ethernet88-95 Eth1/12/1-8 +config add sai_led_portmap_73=12 +config add sai_led_portmap_74=12 +config add sai_led_portmap_75=12 +config add sai_led_portmap_76=12 +config add sai_led_portmap_77=12 +config add sai_led_portmap_78=12 +config add sai_led_portmap_79=12 +config add sai_led_portmap_80=12 +# QSFPDD [113-120] Ethernet96-103 Eth1/13/1-8 +config add sai_led_portmap_113=13 +config add sai_led_portmap_114=13 +config add sai_led_portmap_115=13 +config add sai_led_portmap_116=13 +config add sai_led_portmap_117=13 +config add sai_led_portmap_118=13 +config add sai_led_portmap_119=13 +config add sai_led_portmap_120=13 +# QSFPDD [121-128] Ethernet104-111 Eth1/14/1-8 +config add sai_led_portmap_121=14 +config add sai_led_portmap_122=14 +config add sai_led_portmap_123=14 +config add sai_led_portmap_124=14 +config add sai_led_portmap_125=14 +config add sai_led_portmap_126=14 +config add sai_led_portmap_127=14 +config add sai_led_portmap_128=14 +# QSFPDD [97-104] Ethernet112-119 Eth1/15/1-8 +config add sai_led_portmap_97=15 +config add sai_led_portmap_98=15 +config add sai_led_portmap_99=15 +config add sai_led_portmap_100=15 +config add sai_led_portmap_101=15 +config add sai_led_portmap_102=15 +config add sai_led_portmap_103=15 +config add sai_led_portmap_104=15 +# QSFPDD [105-112] Ethernet120-127 Eth1/16/1-8 +config add sai_led_portmap_105=16 +config add sai_led_portmap_106=16 +config add sai_led_portmap_107=16 +config add sai_led_portmap_108=16 +config add sai_led_portmap_109=16 +config add sai_led_portmap_110=16 +config add sai_led_portmap_111=16 +config add sai_led_portmap_112=16 +# QSFPDD [129-136] Ethernet128-135 Eth1/17/1-8 +config add sai_led_portmap_129=17 +config add sai_led_portmap_130=17 +config add sai_led_portmap_131=17 +config add sai_led_portmap_132=17 +config add sai_led_portmap_133=17 +config add sai_led_portmap_134=17 +config add sai_led_portmap_135=17 +config add sai_led_portmap_136=17 +# QSFPDD [137-144] Ethernet136-143 Eth1/18/1-8 +config add sai_led_portmap_137=18 +config add sai_led_portmap_138=18 +config add sai_led_portmap_139=18 +config add sai_led_portmap_140=18 +config add sai_led_portmap_141=18 +config add sai_led_portmap_142=18 +config add sai_led_portmap_143=18 +config add sai_led_portmap_144=18 +# QSFPDD [145-152] Ethernet144-151 Eth1/19/1-8 +config add sai_led_portmap_145=19 +config add sai_led_portmap_146=19 +config add sai_led_portmap_147=19 +config add sai_led_portmap_148=19 +config add sai_led_portmap_149=19 +config add sai_led_portmap_150=19 +config add sai_led_portmap_151=19 +config add sai_led_portmap_152=19 +# QSFPDD [153-160] Ethernet152-159 Eth1/20/1-8 +config add sai_led_portmap_153=20 +config add sai_led_portmap_154=20 +config add sai_led_portmap_155=20 +config add sai_led_portmap_156=20 +config add sai_led_portmap_157=20 +config add sai_led_portmap_158=20 +config add sai_led_portmap_159=20 +config add sai_led_portmap_160=20 +# QSFPDD [161-168] Ethernet160-167 Eth1/21/1-8 +config add sai_led_portmap_161=21 +config add sai_led_portmap_162=21 +config add sai_led_portmap_163=21 +config add sai_led_portmap_164=21 +config add sai_led_portmap_165=21 +config add sai_led_portmap_166=21 +config add sai_led_portmap_167=21 +config add sai_led_portmap_168=21 +# QSFPDD [169-176] Ethernet168-175 Eth1/22/1-8 +config add sai_led_portmap_169=22 +config add sai_led_portmap_170=22 +config add sai_led_portmap_171=22 +config add sai_led_portmap_172=22 +config add sai_led_portmap_173=22 +config add sai_led_portmap_174=22 +config add sai_led_portmap_175=22 +config add sai_led_portmap_176=22 +# QSFPDD [177-184] Ethernet176-183 Eth1/23/1-8 +config add sai_led_portmap_177=23 +config add sai_led_portmap_178=23 +config add sai_led_portmap_179=23 +config add sai_led_portmap_180=23 +config add sai_led_portmap_181=23 +config add sai_led_portmap_182=23 +config add sai_led_portmap_183=23 +config add sai_led_portmap_184=23 +# QSFPDD [185-192] Ethernet184-191 Eth1/24/1-8 +config add sai_led_portmap_185=24 +config add sai_led_portmap_186=24 +config add sai_led_portmap_187=24 +config add sai_led_portmap_188=24 +config add sai_led_portmap_189=24 +config add sai_led_portmap_190=24 +config add sai_led_portmap_191=24 +config add sai_led_portmap_192=24 +# QSFPDD [193-200] Ethernet192-199 Eth1/25/1-8 +config add sai_led_portmap_193=25 +config add sai_led_portmap_194=25 +config add sai_led_portmap_195=25 +config add sai_led_portmap_196=25 +config add sai_led_portmap_197=25 +config add sai_led_portmap_198=25 +config add sai_led_portmap_199=25 +config add sai_led_portmap_200=25 +# QSFPDD [201-208] Ethernet200-207 Eth1/26/1-8 +config add sai_led_portmap_201=26 +config add sai_led_portmap_202=26 +config add sai_led_portmap_203=26 +config add sai_led_portmap_204=26 +config add sai_led_portmap_205=26 +config add sai_led_portmap_206=26 +config add sai_led_portmap_207=26 +config add sai_led_portmap_208=26 +# QSFPDD [209-216] Ethernet208-215 Eth1/27/1-8 +config add sai_led_portmap_209=27 +config add sai_led_portmap_210=27 +config add sai_led_portmap_211=27 +config add sai_led_portmap_212=27 +config add sai_led_portmap_213=27 +config add sai_led_portmap_214=27 +config add sai_led_portmap_215=27 +config add sai_led_portmap_216=27 +# QSFPDD [217-224] Ethernet216-223 Eth1/28/1-8 +config add sai_led_portmap_217=28 +config add sai_led_portmap_218=28 +config add sai_led_portmap_219=28 +config add sai_led_portmap_220=28 +config add sai_led_portmap_221=28 +config add sai_led_portmap_222=28 +config add sai_led_portmap_223=28 +config add sai_led_portmap_224=28 +# QSFPDD [225-232] Ethernet224-231 Eth1/29/1-8 +config add sai_led_portmap_225=29 +config add sai_led_portmap_226=29 +config add sai_led_portmap_227=29 +config add sai_led_portmap_228=29 +config add sai_led_portmap_229=29 +config add sai_led_portmap_230=29 +config add sai_led_portmap_231=29 +config add sai_led_portmap_232=29 +# QSFPDD [233-240] Ethernet232-239 Eth1/30/1-8 +config add sai_led_portmap_233=30 +config add sai_led_portmap_234=30 +config add sai_led_portmap_235=30 +config add sai_led_portmap_236=30 +config add sai_led_portmap_237=30 +config add sai_led_portmap_238=30 +config add sai_led_portmap_239=30 +config add sai_led_portmap_240=30 +# QSFPDD [241-248] Ethernet240-247 Eth1/31/1-8 +config add sai_led_portmap_241=31 +config add sai_led_portmap_242=31 +config add sai_led_portmap_243=31 +config add sai_led_portmap_244=31 +config add sai_led_portmap_245=31 +config add sai_led_portmap_246=31 +config add sai_led_portmap_247=31 +config add sai_led_portmap_248=31 +# QSFPDD [249-256] Ethernet248-255 Eth1/32/1-8 +config add sai_led_portmap_249=32 +config add sai_led_portmap_250=32 +config add sai_led_portmap_251=32 +config add sai_led_portmap_252=32 +config add sai_led_portmap_253=32 +config add sai_led_portmap_254=32 +config add sai_led_portmap_255=32 +config add sai_led_portmap_256=32 +# 1-lane port [257-257] Ethernet256 Eth1/33 +config add sai_led_portmap_257=33 +# 1-lane port [259-259] Ethernet257 Eth1/34 +config add sai_led_portmap_259=34 diff --git a/device/dell/x86_64-dellemc_z9432f_c3758-r0/system_health_monitoring_config.json b/device/dell/x86_64-dellemc_z9432f_c3758-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..dc20d412147f --- /dev/null +++ b/device/dell/x86_64-dellemc_z9432f_c3758-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["fan.speed","psu.temperature","psu.voltage","asic"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault" : "blink_yellow", + "normal" : "green", + "booting": "blink_green" + } +} diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 00b3716c06eb..bde6b9da0ecc 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -14,6 +14,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_S5232F_PLATFORM_MODULE) \ $(DELL_S5248F_PLATFORM_MODULE) \ $(DELL_Z9332F_PLATFORM_MODULE) \ + $(DELL_Z9432F_PLATFORM_MODULE) \ $(DELL_S5296F_PLATFORM_MODULE) \ $(DELL_Z9100_PLATFORM_MODULE) \ $(DELL_S6100_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index 3f17b16fbc53..a9d2a1880b28 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -8,6 +8,7 @@ DELL_S5212F_PLATFORM_MODULE_VERSION = 1.1 DELL_S5224F_PLATFORM_MODULE_VERSION = 1.1 DELL_S5232F_PLATFORM_MODULE_VERSION = 1.1 DELL_Z9332F_PLATFORM_MODULE_VERSION = 1.1 +DELL_Z9432F_PLATFORM_MODULE_VERSION = 1.1 DELL_S5248F_PLATFORM_MODULE_VERSION = 1.1 DELL_S5296F_PLATFORM_MODULE_VERSION = 1.1 DELL_N3248PXE_PLATFORM_MODULE_VERSION = 1.1 @@ -21,6 +22,7 @@ export DELL_S5212F_PLATFORM_MODULE_VERSION export DELL_S5224F_PLATFORM_MODULE_VERSION export DELL_S5232F_PLATFORM_MODULE_VERSION export DELL_Z9332F_PLATFORM_MODULE_VERSION +export DELL_Z9432F_PLATFORM_MODULE_VERSION export DELL_S5248F_PLATFORM_MODULE_VERSION export DELL_S5296F_PLATFORM_MODULE_VERSION export DELL_N3248PXE_PLATFORM_MODULE_VERSION @@ -61,6 +63,10 @@ DELL_Z9332F_PLATFORM_MODULE = platform-modules-z9332f_$(DELL_Z9332F_PLATFORM_MOD $(DELL_Z9332F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_z9332f_d1508-r0 $(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_Z9332F_PLATFORM_MODULE))) +DELL_Z9432F_PLATFORM_MODULE = platform-modules-z9432f_$(DELL_Z9432F_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELL_Z9432F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_z9432f_c3758-r0 +$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_Z9432F_PLATFORM_MODULE))) + DELL_S5248F_PLATFORM_MODULE = platform-modules-s5248f_$(DELL_S5248F_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_S5248F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_s5248f_c3538-r0 $(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S5248F_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/control b/platform/broadcom/sonic-platform-modules-dell/debian/control index b16a3d790462..7821dbd4f21b 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/control +++ b/platform/broadcom/sonic-platform-modules-dell/debian/control @@ -55,6 +55,11 @@ Architecture: amd64 Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp +Package: platform-modules-z9432f +Architecture: amd64 +Depends: linux-image-5.10.0-8-2-amd64-unsigned +Description: kernel modules for platform devices such as fan, led, sfp + Package: platform-modules-n3248pxe Architecture: amd64 Depends: linux-image-5.10.0-12-2-amd64-unsigned diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.init b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.init new file mode 100755 index 000000000000..26c44fca61f8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.init @@ -0,0 +1,40 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup Z9432f board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + # /usr/local/bin/iom_power_on.sh + /usr/local/bin/z9432f_platform.sh init + + echo "done." + ;; + +stop) + /usr/local/bin/z9432f_platform.sh deinit + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-z9432f.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.install new file mode 100644 index 000000000000..b42c7f362a5b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.install @@ -0,0 +1,12 @@ +z9432f/scripts/z9432f_platform.sh usr/local/bin +z9432f/scripts/check_qsfp.sh usr/local/bin +z9432f/scripts/platform_sensors.py usr/local/bin +z9432f/scripts/sensors usr/bin +z9432f/scripts/pcisysfs.py usr/bin +z9432f/scripts/qsfp_irq_enable.py usr/bin +z9432f/cfg/z9432f-modules.conf etc/modules-load.d +z9432f/systemd/platform-modules-z9432f.service etc/systemd/system +z9432f/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dellemc_z9432f_c3758-r0 +common/platform_reboot usr/share/sonic/device/x86_64-dellemc_z9432f_c3758-r0 +common/fw-updater usr/local/bin +common/onie_mode_set usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.postinst b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.postinst new file mode 100644 index 000000000000..4f5bf4dc4d6d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9432f.postinst @@ -0,0 +1,10 @@ +# postinst script for Z9432f + +# Enable Dell-Z9432f-platform-service +depmod -a +systemctl enable platform-modules-z9432f.service +systemctl start platform-modules-z9432f.service + + +#DEBHELPER# + diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/rules b/platform/broadcom/sonic-platform-modules-dell/debian/rules index 8baafa14076a..9904cce52b6b 100755 --- a/platform/broadcom/sonic-platform-modules-dell/debian/rules +++ b/platform/broadcom/sonic-platform-modules-dell/debian/rules @@ -5,7 +5,7 @@ export INSTALL_MOD_DIR:=extra KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f s5296f n3248pxe n3248te +MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f z9432f s5296f n3248pxe n3248te COMMON_DIR := common %: @@ -64,6 +64,11 @@ override_dh_auto_build: cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ cd $(MOD_SRC_DIR); \ + elif [ $$mod = "z9432f" ]; then \ + cp $(COMMON_DIR)/ipmihelper.py $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ elif [ $$mod = "n3248pxe" ]; then \ cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ @@ -140,6 +145,11 @@ override_dh_clean: rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ + elif [ $$mod = "z9432f" ]; then \ + rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ + rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ elif [ $$mod = "n3248pxe" ]; then \ rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/cfg/z9432f-modules.conf b/platform/broadcom/sonic-platform-modules-dell/z9432f/cfg/z9432f-modules.conf new file mode 100644 index 000000000000..13746785c2ea --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/cfg/z9432f-modules.conf @@ -0,0 +1,16 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-i801 +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus + +i2c-mux-pca954x + +ipmi_devintf +ipmi_si diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/Makefile b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/Makefile new file mode 100644 index 000000000000..0625bd0d57ae --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/Makefile @@ -0,0 +1,2 @@ +obj-m := dell_z9432f_fpga_ocores.o mc24lc64t.o + diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/dell_z9432f_fpga_ocores.c b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/dell_z9432f_fpga_ocores.c new file mode 100644 index 000000000000..f86f10c071f9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/dell_z9432f_fpga_ocores.c @@ -0,0 +1,1485 @@ +/* +* Copyright (C) 2018 Dell Inc +* +* Licensed under the GNU General Public License Version 2 +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +/** +* @file fpga_i2ccore.c +* @brief This is a driver to interface with Linux Open Cores drivber for FPGA i2c access +* +************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include //siginfo +#include //rcu_read_lock +#include //kernel_version +#include +#include +#include +#include +#include + + +void __iomem * fpga_base_addr = NULL; +void __iomem * fpga_ctl_addr = NULL; + +#define DRIVER_NAME "fpgapci" +#define PCI_NUM_BARS 4 + +#ifdef DEBUG +# define PRINT(fmt, ...) printk(fmt, ##__VA_ARGS__) +#else +# define PRINT(fmt, ...) +#endif + +/* Maximum size of driver buffer (allocated with kalloc()). + * Needed to copy data from user to kernel space, among other + * things. */ +static const size_t BUF_SIZE = PAGE_SIZE; + +/* Device data used by this driver. */ +struct fpgapci_dev { + /* the kernel pci device data structure */ + struct pci_dev *pci_dev; + + /* upstream root node */ + struct pci_dev *upstream; + + /* kernels virtual addr. for the mapped BARs */ + void * __iomem bar[PCI_NUM_BARS]; + + /* length of each memory region. Used for error checking. */ + size_t bar_length[PCI_NUM_BARS]; + + /* Debug data */ + /* number of hw interrupts handled. */ + int num_handled_interrupts; + int num_undelivered_signals; + int pci_gen; + int pci_num_lanes; + + unsigned int irq_first; + unsigned int irq_length; + unsigned int irq_assigned; + +}; + +static int use_irq = 1; +module_param(use_irq, int, 0644); +MODULE_PARM_DESC(use_irq, "Get an use_irq value from user...\n"); + +static uint32_t num_bus = 0; +module_param(num_bus, int, 0); +MODULE_PARM_DESC(num_bus, + "Number of i2c busses supported by the FPGA on this platform."); + + +/* Xilinx FPGA PCIE info: */ +/* Non-VGA unclassified device: Xilinx Corporation Device 7021*/ +/* Subsystem: Xilinx Corporation Device 0007 */ +//#define VENDOR 0x10EE +#define DEVICE 0x7021 + +/* Altera FPGA PCIE info: + Unassigned class [ff00]: Altera Corporation Device 0004 (rev 01) + Subsystem: Altera Corporation Device 0004 */ +#define PCI_VENDOR_ID_ALTERA 0x1172 +#define PCI_DEVICE_ID_ALTERA 0x0004 + +static phys_addr_t fpga_phys_addr; + +typedef signed char s8; +typedef unsigned char u8; + +typedef signed short s16; +typedef unsigned short u16; + +typedef signed int s32; +typedef unsigned int u32; + +typedef signed long long s64; +typedef unsigned long long u64; + + +/* struct to hold data related to the pcie device */ +struct pci_data_struct{ + struct pci_dev* dev; + unsigned long long phy_addr_bar0; + unsigned long long phy_len_bar0; + unsigned long long phy_flags_bar0; + unsigned int irq_first; + unsigned int irq_length; + unsigned int irq_assigned; + void * kvirt_addr_bar0; +}; + +/* global variable declarations */ + +/* Static function declarations */ +static int fpgapci_probe(struct pci_dev *dev, const struct pci_device_id *id); +static void fpgapci_remove(struct pci_dev *dev); + +static int scan_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev); +static int map_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev); +static void free_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev); + + +struct fpgalogic_i2c { + void __iomem *base; + u32 reg_shift; + u32 reg_io_width; + wait_queue_head_t wait; + struct i2c_msg *msg; + int pos; + int nmsgs; + int state; /* see STATE_ */ + int ip_clock_khz; + int bus_clock_khz; + void (*reg_set)(struct fpgalogic_i2c *i2c, int reg, u8 value); + u8 (*reg_get)(struct fpgalogic_i2c *i2c, int reg); + u32 timeout; + struct mutex lock; +}; +/* registers */ +#define FPGAI2C_REG_PRELOW 0 +#define FPGAI2C_REG_PREHIGH 1 +#define FPGAI2C_REG_CONTROL 2 +#define FPGAI2C_REG_DATA 3 +#define FPGAI2C_REG_CMD 4 /* write only */ +#define FPGAI2C_REG_STATUS 4 /* read only, same address as FPGAI2C_REG_CMD */ +#define FPGAI2C_REG_VER 5 + + + +#define FPGAI2C_REG_CTRL_IEN 0x40 +#define FPGAI2C_REG_CTRL_EN 0x80 + +#define FPGAI2C_REG_CMD_START 0x91 +#define FPGAI2C_REG_CMD_STOP 0x41 +#define FPGAI2C_REG_CMD_READ 0x21 +#define FPGAI2C_REG_CMD_WRITE 0x11 +#define FPGAI2C_REG_CMD_READ_ACK 0x21 +#define FPGAI2C_REG_CMD_READ_NACK 0x29 +#define FPGAI2C_REG_CMD_IACK 0x01 + +#define FPGAI2C_REG_STAT_IF 0x01 +#define FPGAI2C_REG_STAT_TIP 0x02 +#define FPGAI2C_REG_STAT_ARBLOST 0x20 +#define FPGAI2C_REG_STAT_BUSY 0x40 +#define FPGAI2C_REG_STAT_NACK 0x80 + +/* SR[7:0] - Status register */ +#define FPGAI2C_REG_SR_RXACK (1 << 7) /* Receive acknowledge from secondary �1� = No acknowledge received*/ +#define FPGAI2C_REG_SR_BUSY (1 << 6) /* Busy, I2C bus busy (as defined by start / stop bits) */ +#define FPGAI2C_REG_SR_AL (1 << 5) /* Arbitration lost - fpga i2c logic lost arbitration */ +#define FPGAI2C_REG_SR_TIP (1 << 1) /* Transfer in progress */ +#define FPGAI2C_REG_SR_IF (1 << 0) /* Interrupt flag */ + +enum { + STATE_DONE = 0, + STATE_INIT, + STATE_ADDR, + STATE_ADDR10, + STATE_START, + STATE_WRITE, + STATE_READ, + STATE_STOP, + STATE_ERROR, +}; + +#define TYPE_FPGALOGIC 0 +#define TYPE_GRLIB 1 + +/*I2C_CH1 Offset address from PCIE BAR 0*/ +#define FPGALOGIC_I2C_BASE 0x00006000 +#define FPGALOGIC_CH_OFFSET 0x10 + +#define i2c_bus_controller_numb 1 +#define I2C_PCI_MAX_BUS (16) +#define I2C_PCI_MAX_BUS_REV00 (7) +#define DELL_I2C_CLOCK_LEGACY 0 +#define DELL_I2C_CLOCK_PRESERVE (~0U) +#define I2C_PCI_BUS_NUM_5 5 +#define I2C_PCI_BUS_NUM_7 7 +#define I2C_PCI_BUS_NUM_8 8 +#define I2C_PCI_BUS_NUM_10 10 +#define I2C_PCI_BUS_NUM_12 12 +#define I2C_PCI_BUS_NUM_16 16 + +#define MB_BRD_REV_TYPE 0x0008 +#define MB_BRD_REV_MASK 0x00f0 +#define MB_BRD_REV_00 0x0000 +#define MB_BRD_REV_01 0x0010 +#define MB_BRD_REV_02 0x0020 +#define MB_BRD_REV_03 0x0030 +#define MB_BRD_TYPE_MASK 0x000f +#define BRD_TYPE_Z9232_NON_NEBS 0x0 +#define BRD_TYPE_Z9232_NEBS 0x1 +#define BRD_TYPE_Z9264_NON_NEBS 0x2 +#define BRD_TYPE_Z9264_NEBS 0x3 +#define BRD_TYPE_S5212_NON_NEBS 0x4 +#define BRD_TYPE_S5212_NEBS 0x5 +#define BRD_TYPE_S5224_NON_NEBS 0x6 +#define BRD_TYPE_S5224_NEBS 0x7 +#define BRD_TYPE_S5248_NON_NEBS 0x8 +#define BRD_TYPE_S5248_NEBS 0x9 +#define BRD_TYPE_S5296_NON_NEBS 0xa +#define BRD_TYPE_S5296_NEBS 0xb +#define BRD_TYPE_S5232_NON_NEBS 0xc +#define BRD_TYPE_S5232_NEBS 0xd + +#define FPGA_CTL_REG_SIZE 0x60 +#define MSI_VECTOR_MAP_MASK 0x1f +#define MSI_VECTOR_MAP1 0x58 +#define I2C_CH1_MSI_MAP_VECT_8 0x00000008 +#define I2C_CH2_MSI_MAP_VECT_9 0x00000120 +#define I2C_CH3_MSI_MAP_VECT_10 0x00002800 +#define I2C_CH4_MSI_MAP_VECT_11 0x00058000 +#define I2C_CH5_MSI_MAP_VECT_12 0x00c00000 +#define I2C_CH6_MSI_MAP_VECT_13 0x15000000 +#define MSI_VECTOR_MAP2 0x5c +#define I2C_CH7_MSI_MAP_VECT_14 0x0000000e +#define MSI_VECTOR_MAP3 0x9c +#define I2C_CH8_MSI_MAP_VECT_8 0x00800000 +#define I2C_CH8_MSI_MAP_VECT_16 0x01100000 +#define I2C_CH9_MSI_MAP_VECT_9 0x12000000 +#define I2C_CH9_MSI_MAP_VECT_17 0x24000000 +#define MSI_VECTOR_MAP4 0xa0 +#define I2C_CH10_MSI_MAP_VECT_10 0x0000000a +#define I2C_CH10_MSI_MAP_VECT_18 0x00000012 +#define I2C_CH11_MSI_MAP_VECT_11 0x00000120 +#define I2C_CH11_MSI_MAP_VECT_19 0x00000260 +#define I2C_CH12_MSI_MAP_VECT_12 0x00002800 +#define I2C_CH12_MSI_MAP_VECT_20 0x00005000 +#define I2C_CH13_MSI_MAP_VECT_13 0x00058000 +#define I2C_CH13_MSI_MAP_VECT_21 0x000a8000 +#define I2C_CH14_MSI_MAP_VECT_14 0x00c00000 +#define I2C_CH14_MSI_MAP_VECT_22 0x01600000 +#define I2C_CH15_MSI_MAP_VECT_8 0x10000000 +#define I2C_CH15_MSI_MAP_VECT_23 0x2e000000 +#define MSI_VECTOR_MAP5 0xa4 +#define I2C_CH16_MSI_MAP_VECT_9 0x00000009 +#define I2C_CH16_MSI_MAP_VECT_24 0x00000018 + +#define MSI_VECTOR_REV_00 16 +#define MSI_VECTOR_REV_01 32 + +#define FPGA_MSI_VECTOR_ID_8 8 +#define FPGA_MSI_VECTOR_ID_9 9 +#define FPGA_MSI_VECTOR_ID_10 10 +#define FPGA_MSI_VECTOR_ID_11 11 +#define FPGA_MSI_VECTOR_ID_12 12 +#define FPGA_MSI_VECTOR_ID_13 13 +#define FPGA_MSI_VECTOR_ID_14 14 +#define FPGA_MSI_VECTOR_ID_15 15 /*Note: this is external MSI vector id */ +#define FPGA_MSI_VECTOR_ID_16 16 +#define FPGA_MSI_VECTOR_ID_17 17 +#define FPGA_MSI_VECTOR_ID_18 18 +#define FPGA_MSI_VECTOR_ID_19 19 +#define FPGA_MSI_VECTOR_ID_20 20 +#define FPGA_MSI_VECTOR_ID_21 21 +#define FPGA_MSI_VECTOR_ID_22 22 +#define FPGA_MSI_VECTOR_ID_23 23 +#define FPGA_MSI_VECTOR_ID_24 24 + +#define MAX_WAIT_LOOP 10 + +static int total_i2c_pci_bus = 0; +static uint32_t board_rev_type = 0; +static struct fpgalogic_i2c fpgalogic_i2c[I2C_PCI_MAX_BUS]; +static struct i2c_adapter i2c_pci_adap[I2C_PCI_MAX_BUS]; +static struct mutex i2c_xfer_lock[I2C_PCI_MAX_BUS]; + +static void fpgai2c_reg_set_8(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + iowrite8(value, i2c->base + (reg << i2c->reg_shift)); +} + +static void fpgai2c_reg_set_16(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + iowrite16(value, i2c->base + (reg << i2c->reg_shift)); +} + +static void fpgai2c_reg_set_32(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + iowrite32(value, i2c->base + (reg << i2c->reg_shift)); +} + +static void fpgai2c_reg_set_16be(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + iowrite16be(value, i2c->base + (reg << i2c->reg_shift)); +} + +static void fpgai2c_reg_set_32be(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + iowrite32be(value, i2c->base + (reg << i2c->reg_shift)); +} + +static inline u8 fpgai2c_reg_get_8(struct fpgalogic_i2c *i2c, int reg) +{ + return ioread8(i2c->base + (reg << i2c->reg_shift)); +} + +static inline u8 fpgai2c_reg_get_16(struct fpgalogic_i2c *i2c, int reg) +{ + return ioread16(i2c->base + (reg << i2c->reg_shift)); +} + +static inline u8 fpgai2c_reg_get_32(struct fpgalogic_i2c *i2c, int reg) +{ + return ioread32(i2c->base + (reg << i2c->reg_shift)); +} + +static inline u8 fpgai2c_reg_get_16be(struct fpgalogic_i2c *i2c, int reg) +{ + return ioread16be(i2c->base + (reg << i2c->reg_shift)); +} + +static inline u8 fpgai2c_reg_get_32be(struct fpgalogic_i2c *i2c, int reg) +{ + return ioread32be(i2c->base + (reg << i2c->reg_shift)); +} + +static inline void fpgai2c_reg_set(struct fpgalogic_i2c *i2c, int reg, u8 value) +{ + i2c->reg_set(i2c, reg, value); + udelay(100); +} + +static inline u8 fpgai2c_reg_get(struct fpgalogic_i2c *i2c, int reg) +{ + udelay(100); + return i2c->reg_get(i2c, reg); +} + +static void fpgai2c_dump(struct fpgalogic_i2c *i2c) +{ + u8 tmp; + + PRINT("Logic register dump:\n"); + + tmp = fpgai2c_reg_get(i2c, FPGAI2C_REG_PRELOW); + PRINT("FPGAI2C_REG_PRELOW (%d) = 0x%x\n",FPGAI2C_REG_PRELOW,tmp); + + tmp = fpgai2c_reg_get(i2c, FPGAI2C_REG_PREHIGH); + PRINT("FPGAI2C_REG_PREHIGH(%d) = 0x%x\n",FPGAI2C_REG_PREHIGH,tmp); + + tmp = fpgai2c_reg_get(i2c, FPGAI2C_REG_CONTROL); + PRINT("FPGAI2C_REG_CONTROL(%d) = 0x%x\n",FPGAI2C_REG_CONTROL,tmp); + + tmp = fpgai2c_reg_get(i2c, FPGAI2C_REG_DATA); + PRINT("FPGAI2C_REG_DATA (%d) = 0x%x\n",FPGAI2C_REG_DATA,tmp); + + tmp = fpgai2c_reg_get(i2c, FPGAI2C_REG_CMD); + PRINT("FPGAI2C_REG_CMD (%d) = 0x%x\n",FPGAI2C_REG_CMD,tmp); +} + +static void fpgai2c_stop(struct fpgalogic_i2c *i2c) +{ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_STOP); +} + +/* + * dell_get_mutex must be called prior to calling this function. + */ +static int fpgai2c_poll(struct fpgalogic_i2c *i2c) +{ + u8 stat = fpgai2c_reg_get(i2c, FPGAI2C_REG_STATUS); + struct i2c_msg *msg = i2c->msg; + u8 addr; + + /* Ready? */ + if (stat & FPGAI2C_REG_STAT_TIP) + return -EBUSY; + + if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { + /* Stop has been sent */ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); + if (i2c->state == STATE_ERROR) + return -EIO; + return 0; + } + + /* Error? */ + if ((stat & FPGAI2C_REG_STAT_ARBLOST) || ( i2c->msg == NULL) || ( i2c->msg->buf == NULL)) { + i2c->state = STATE_ERROR; + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_STOP); + return -EAGAIN; + } + + if (i2c->state == STATE_INIT) { + if (stat & FPGAI2C_REG_STAT_BUSY) + return -EBUSY; + + i2c->state = STATE_ADDR; + } + + if (i2c->state == STATE_ADDR) { + /* 10 bit address? */ + if (i2c->msg->flags & I2C_M_TEN) { + addr = 0xf0 | ((i2c->msg->addr >> 7) & 0x6); + i2c->state = STATE_ADDR10; + } else { + addr = (i2c->msg->addr << 1); + i2c->state = STATE_START; + } + + /* Set read bit if necessary */ + addr |= (i2c->msg->flags & I2C_M_RD) ? 1 : 0; + + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, addr); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_START); + + return 0; + } + + /* Second part of 10 bit addressing */ + if (i2c->state == STATE_ADDR10) { + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, i2c->msg->addr & 0xff); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_WRITE); + + i2c->state = STATE_START; + return 0; + } + + if (i2c->state == STATE_START || i2c->state == STATE_WRITE) { + i2c->state = (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; + + if (stat & FPGAI2C_REG_STAT_NACK) { + i2c->state = STATE_ERROR; + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_STOP); + return -ENXIO; + } + } else { + msg->buf[i2c->pos++] = fpgai2c_reg_get(i2c, FPGAI2C_REG_DATA); + } + + if (i2c->pos >= msg->len) { + i2c->nmsgs--; + i2c->msg++; + i2c->pos = 0; + msg = i2c->msg; + + if (i2c->nmsgs) { + if (!(msg->flags & I2C_M_NOSTART)) { + i2c->state = STATE_ADDR; + return 0; + } else { + i2c->state = (msg->flags & I2C_M_RD) + ? STATE_READ : STATE_WRITE; + } + } else { + i2c->state = STATE_DONE; + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_STOP); + return 0; + } + } + + if (i2c->state == STATE_READ) { + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, i2c->pos == (msg->len - 1) ? + FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); + } else { + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, msg->buf[i2c->pos++]); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_WRITE); + } + + return 0; +} + +static void fpgai2c_process(struct fpgalogic_i2c *i2c) +{ + struct i2c_msg *msg = i2c->msg; + u8 stat = fpgai2c_reg_get(i2c, FPGAI2C_REG_STATUS); + + PRINT("fpgai2c_process in. status reg :0x%x\n", stat); + + if ((i2c->state == STATE_STOP) || (i2c->state == STATE_ERROR)) { + /* stop has been sent */ + PRINT("fpgai2c_process FPGAI2C_REG_CMD_IACK stat = 0x%x Set FPGAI2C_REG_CMD(0%x) FPGAI2C_REG_CMD_IACK = 0x%x\n" \ + ,stat, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); + if(i2c->state == STATE_STOP) { + i2c->state = STATE_DONE; + } + wake_up(&i2c->wait); + return; + } + + + /* error? */ + if (stat & FPGAI2C_REG_STAT_ARBLOST) { + i2c->state = STATE_ERROR; + PRINT("fpgai2c_process FPGAI2C_REG_STAT_ARBLOST FPGAI2C_REG_CMD_STOP\n"); + fpgai2c_stop(i2c); + return; + } + + /* Spurious IRQs would lead to invocation of handler with msg being NULL. + * Skip handling them. + */ + if (msg == NULL) + return; + + if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { + i2c->state = + (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; + + if (stat & FPGAI2C_REG_STAT_NACK) { + i2c->state = STATE_ERROR; + fpgai2c_stop(i2c); + return; + } + } else + { + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..1 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + + msg->buf[i2c->pos++] = fpgai2c_reg_get(i2c, FPGAI2C_REG_DATA); + } + + /* end of msg? */ + if (i2c->pos == msg->len) { + i2c->nmsgs--; + i2c->msg++; + i2c->pos = 0; + msg = i2c->msg; + + if (i2c->nmsgs) { /* end? */ + /* send start? */ + if (!(msg->flags & I2C_M_NOSTART)) { + + u8 addr = (msg->addr << 1); + + if (msg->flags & I2C_M_RD) + addr |= 1; + + i2c->state = STATE_START; + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, addr); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_START); + return; + } else + { + i2c->state = (msg->flags & I2C_M_RD) + ? STATE_READ : STATE_WRITE; + } + } else { + i2c->state = STATE_STOP; + fpgai2c_stop(i2c); + return; + } + } + + if (i2c->state == STATE_READ) { + + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..2 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + + + PRINT("fpgai2c_poll STATE_READ i2c->pos=%d msg->len-1 = 0x%x set FPGAI2C_REG_CMD = 0x%x\n",i2c->pos, msg->len-1, + i2c->pos == (msg->len-1) ? FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, i2c->pos == (msg->len-1) ? + FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); + } else { + PRINT("fpgai2c_process set FPGAI2C_REG_DATA(0x%x)\n",FPGAI2C_REG_DATA); + + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..3 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, msg->buf[i2c->pos++]); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_WRITE); + } +} + +static irqreturn_t fpgai2c_isr(int irq, void *dev_id) +{ + struct fpgalogic_i2c *i2c = dev_id; + fpgai2c_process(i2c); + + return IRQ_HANDLED; +} +void dell_get_mutex(struct fpgalogic_i2c *i2c) +{ + mutex_lock(&i2c->lock); +} + +/** + * dell_release_mutex - release mutex + */ +void dell_release_mutex(struct fpgalogic_i2c *i2c) +{ + mutex_unlock(&i2c->lock); +} + +static int fpgai2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) +{ + struct fpgalogic_i2c *i2c = i2c_get_adapdata(adap); + int ret; + unsigned long timeout = jiffies + msecs_to_jiffies(1000); + + i2c->msg = msgs; + i2c->pos = 0; + i2c->nmsgs = num; + i2c->state = (use_irq == 1) ? STATE_START : STATE_INIT; + + PRINT("i2c->msg->addr = 0x%x i2c->msg->flags = 0x%x\n",i2c->msg->addr,i2c->msg->flags); + PRINT("I2C_M_RD = 0x%x i2c->msg->addr << 1 = 0x%x\n",I2C_M_RD,i2c->msg->addr << 1); + + if (!use_irq) { + /* Handle the transfer */ + while (time_before(jiffies, timeout)) { + dell_get_mutex(i2c); + ret = fpgai2c_poll(i2c); + dell_release_mutex(i2c); + + if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) + return (i2c->state == STATE_DONE) ? num : ret; + + if (ret == 0) + timeout = jiffies + HZ; + + usleep_range(5, 15); + } + + i2c->state = STATE_ERROR; + + return -ETIMEDOUT; + + + } else { + ret = -ETIMEDOUT; + PRINT("Set FPGAI2C_REG_DATA(0%x) val = 0x%x\n",FPGAI2C_REG_DATA, + (i2c->msg->addr << 1) | ((i2c->msg->flags & I2C_M_RD) ? 1:0)); + + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, + (i2c->msg->addr << 1) | + ((i2c->msg->flags & I2C_M_RD) ? 1:0)); + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_START); + + /* Interrupt mode */ + if (wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) || + (i2c->state == STATE_DONE), HZ)) + ret = (i2c->state == STATE_DONE) ? num : -EIO; + return ret; + } +} + +static int fpgai2c_init(struct fpgalogic_i2c *i2c) +{ + int prescale; + int diff; + u8 ctrl = 0, stat, loop = 0; + + if (i2c->reg_io_width == 0) + i2c->reg_io_width = 1; /* Set to default value */ + + if (!i2c->reg_set || !i2c->reg_get) { + bool be = 0; //1:big_endian 0:little_endian + + switch (i2c->reg_io_width) { + case 1: + i2c->reg_set = fpgai2c_reg_set_8; + i2c->reg_get = fpgai2c_reg_get_8; + break; + + case 2: + i2c->reg_set = be ? fpgai2c_reg_set_16be : fpgai2c_reg_set_16; + i2c->reg_get = be ? fpgai2c_reg_get_16be : fpgai2c_reg_get_16; + break; + + case 4: + i2c->reg_set = be ? fpgai2c_reg_set_32be : fpgai2c_reg_set_32; + i2c->reg_get = be ? fpgai2c_reg_get_32be : fpgai2c_reg_get_32; + break; + + default: + PRINT("Unsupported I/O width (%d)\n", + i2c->reg_io_width); + return -EINVAL; + } + } + + PRINT("%s(), line:%d\n", __func__, __LINE__); + PRINT("i2c->base = 0x%p\n",i2c->base); + + PRINT("ctrl = 0x%x\n",ctrl); + PRINT("set ctrl = 0x%x\n",ctrl & ~(FPGAI2C_REG_CTRL_EN|FPGAI2C_REG_CTRL_IEN)); + + /* make sure the device is disabled */ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CONTROL, ctrl & ~(FPGAI2C_REG_CTRL_EN|FPGAI2C_REG_CTRL_IEN)); + + /* + * I2C Frequency depends on host clock + * input clock of 100MHz + * prescale to 100MHz / ( 5*100kHz) -1 = 199 = 0x4F 100000/(5*100)-1=199=0xc7 + */ + prescale = (i2c->ip_clock_khz / (5 * i2c->bus_clock_khz)) - 1; + prescale = clamp(prescale, 0, 0xffff); + + diff = i2c->ip_clock_khz / (5 * (prescale + 1)) - i2c->bus_clock_khz; + if (abs(diff) > i2c->bus_clock_khz / 10) { + PRINT("Unsupported clock settings: core: %d KHz, bus: %d KHz\n", + i2c->ip_clock_khz, i2c->bus_clock_khz); + return -EINVAL; + } + + fpgai2c_reg_set(i2c, FPGAI2C_REG_PRELOW, prescale & 0xff); + fpgai2c_reg_set(i2c, FPGAI2C_REG_PREHIGH, prescale >> 8); + + /* Init the device */ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_EN); + if (use_irq) { + /* Clear any pending interrupts */ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); + while (loop < MAX_WAIT_LOOP) { + stat = fpgai2c_reg_get(i2c, FPGAI2C_REG_STATUS); + if (stat & FPGAI2C_REG_STAT_IF) { + udelay(100); + loop++; + } else { + break; + } + } + if (loop >=10) { + printk("interrupts can't be cleared: loop %d\n", loop); + } + } + fpgai2c_dump(i2c); + + /* Initialize interrupt handlers if not already done */ + init_waitqueue_head(&i2c->wait); + + return 0; +} + +static int fpgai2c_interrupt_enable(struct fpgapci_dev *fpgapci) +{ + int i; + u8 ctrl = 0; + + /* Enable Interrupts */ + for (i = 0 ; i < total_i2c_pci_bus; i ++) { + fpgai2c_reg_set(&fpgalogic_i2c[i], FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_IEN | FPGAI2C_REG_CTRL_EN); + } + return 0; +} + +static u32 fpgai2c_func(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; +} + +static const struct i2c_algorithm fpgai2c_algorithm = { + .master_xfer = fpgai2c_xfer, + .functionality = fpgai2c_func, +}; + +static int i2c_pci_add_bus (struct i2c_adapter *adap) +{ + int ret = 0; + /* Register new adapter */ + adap->algo = &fpgai2c_algorithm; + ret = i2c_add_numbered_adapter(adap); + return ret; +} + +static int i2c_init_internal_data(void) +{ + int i; + PRINT("%s(), line:%d\n", __func__, __LINE__); + + for( i = 0; i < total_i2c_pci_bus; i++ ) + { + fpgalogic_i2c[i].reg_shift = 0; /* 8 bit registers */ + fpgalogic_i2c[i].reg_io_width = 1; /* 8 bit read/write */ + fpgalogic_i2c[i].timeout = 500;//1000;//1ms + fpgalogic_i2c[i].ip_clock_khz = 100000;//100000;/* input clock of 100MHz */ + fpgalogic_i2c[i].bus_clock_khz = 100; + fpgalogic_i2c[i].base = fpga_base_addr + i*FPGALOGIC_CH_OFFSET; + mutex_init(&fpgalogic_i2c[i].lock); + fpgai2c_init(&fpgalogic_i2c[i]); + } + + return 0; +} + + +static int i2c_pci_init (struct fpgapci_dev *fpgapci) +{ + int i; + + if ((fpgapci != NULL) && (fpgapci->pci_dev->vendor == PCI_VENDOR_ID_ALTERA)) { + num_bus = I2C_PCI_BUS_NUM_10; + } else { + num_bus = I2C_PCI_MAX_BUS; + } + + printk("vendor 0x%x, num_bus 0x%x\n", fpgapci->pci_dev->vendor, num_bus); + total_i2c_pci_bus = num_bus; + + memset (&i2c_pci_adap, 0, sizeof(i2c_pci_adap)); + memset (&fpgalogic_i2c, 0, sizeof(fpgalogic_i2c)); + for(i=0; i < i2c_bus_controller_numb; i++) + mutex_init(&i2c_xfer_lock[i]); + + /* Initialize driver's itnernal data structures */ + i2c_init_internal_data(); + + for (i = 0 ; i < total_i2c_pci_bus; i ++) { + + i2c_pci_adap[i].owner = THIS_MODULE; + i2c_pci_adap[i].class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + + i2c_pci_adap[i].algo_data = &fpgalogic_i2c[i]; + /* /dev/i2c-600 ~ /dev/i2c-615 for FPGA LOGIC I2C channel controller 1-7 */ + i2c_pci_adap[i].nr = i+600; + sprintf( i2c_pci_adap[ i ].name, "i2c-pci-%d", i ); + /* Add the bus via the algorithm code */ + if( i2c_pci_add_bus( &i2c_pci_adap[ i ] ) != 0 ) + { + PRINT("Cannot add bus %d to algorithm layer\n", i ); + return( -ENODEV ); + } + i2c_set_adapdata(&i2c_pci_adap[i], &fpgalogic_i2c[i]); + + PRINT( "Registered bus id: %s\n", kobject_name(&i2c_pci_adap[ i ].dev.kobj)); + } + + return 0; +} + +static void i2c_pci_deinit(void) +{ + int i; + for( i = 0; i < total_i2c_pci_bus; i++ ){ + i2c_del_adapter(&i2c_pci_adap[i]); + } + +} + +/* Find upstream PCIe root node. + * Used for re-training and disabling AER. */ +static struct pci_dev* find_upstream_dev (struct pci_dev *dev) +{ + struct pci_bus *bus = 0; + struct pci_dev *bridge = 0; + struct pci_dev *cur = 0; + int found_dev = 0; + + bus = dev->bus; + if (bus == 0) { + PRINT ( "Device doesn't have an associated bus!\n"); + return 0; + } + + bridge = bus->self; + if (bridge == 0) { + PRINT ( "Can't get the bridge for the bus!\n"); + return 0; + } + + PRINT ( "Upstream device %x/%x, bus:slot.func %02x:%02x.%02x\n", + bridge->vendor, bridge->device, + bridge->bus->number, PCI_SLOT(bridge->devfn), PCI_FUNC(bridge->devfn)); + + PRINT ( "List of downstream devices:"); + list_for_each_entry (cur, &bus->devices, bus_list) { + if (cur != 0) { + PRINT ( " %x/%x", cur->vendor, cur->device); + if (cur == dev) { + found_dev = 1; + } + } + } + PRINT ( "\n"); + if (found_dev) { + return bridge; + } else { + PRINT ( "Couldn't find upstream device!\n"); + return 0; + } +} + + +static int scan_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev) +{ + int i; + + for (i = 0; i < PCI_NUM_BARS; i++) { + //unsigned long bar_start = pci_resource_start(dev, i); + //if (bar_start) { + //unsigned long bar_end = pci_resource_end(dev, i); + //unsigned long bar_flags = pci_resource_flags(dev, i); + //PRINT ( "BAR[%d] 0x%08lx-0x%08lx flags 0x%08lx", + //i, bar_start, bar_end, bar_flags); + //} + } + + return 0; +} + + +/** + * Map the device memory regions into kernel virtual address space + * after verifying their sizes respect the minimum sizes needed, given + * by the bar_min_len[] array. + */ +static int map_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev) +{ + int i; + + for (i = 0; i < PCI_NUM_BARS; i++){ + phys_addr_t bar_start = pci_resource_start(dev, i); + phys_addr_t bar_end = pci_resource_end(dev, i); + unsigned long bar_length = bar_end - bar_start + 1; + fpgapci->bar_length[i] = bar_length; + + + if (!bar_start || !bar_end) { + fpgapci->bar_length[i] = 0; + continue; + } + + if (bar_length < 1) { + PRINT ( "BAR #%d length is less than 1 byte\n", i); + continue; + } + + PRINT ( "bar_start=%llx, bar_end=%llx, bar_length=%lx, flag=%lx\n", bar_start, + bar_end, bar_length, pci_resource_flags(dev, i)); + + /* map the device memory or IO region into kernel virtual + * address space */ + fpgapci->bar[i] = ioremap_cache (bar_start + FPGALOGIC_I2C_BASE, I2C_PCI_MAX_BUS * FPGALOGIC_CH_OFFSET); + + if (!fpgapci->bar[i]) { + PRINT ( "Could not map BAR #%d.\n", i); + return -1; + } + + PRINT ( "BAR[%d] mapped at 0x%p with length %lu.", i, + fpgapci->bar[i], bar_length); + + if(i == 0) //FPGA register is in the BAR[0] + { + + fpga_phys_addr = bar_start; + fpga_ctl_addr = ioremap_cache (bar_start, FPGA_CTL_REG_SIZE); + fpga_base_addr = fpgapci->bar[i]; + } + + PRINT ( "BAR[%d] mapped at 0x%p with length %lu.\n", i, + fpgapci->bar[i], bar_length); + } + return 0; +} + +static void free_bars(struct fpgapci_dev *fpgapci, struct pci_dev *dev) +{ + int i; + + for (i = 0; i < PCI_NUM_BARS; i++) { + if (fpgapci->bar[i]) { + pci_iounmap(dev, fpgapci->bar[i]); + fpgapci->bar[i] = NULL; + } + } +} + +#define FPGA_PCI_NAME "FPGA_PCI" + +/** + * @brief Register specific function with msi interrupt line + * @param dev Pointer to pci-device, which should be allocated + * @param int interrupt number relative to global interrupt number + * @return Returns error code or zero if success + * */ +static int register_intr_handler(struct pci_dev *dev, int irq_num_id) +{ + int err = 0; + struct fpgapci_dev *fpgapci = 0; + + fpgapci = (struct fpgapci_dev*) dev_get_drvdata(&dev->dev); + if (fpgapci == 0) { + PRINT ( ": fpgapci_dev is 0\n"); + return err; + } + /* FPGA SPEC 4.3.1.34, First i2c channel mapped to vector 8 */ + switch (irq_num_id) { + case FPGA_MSI_VECTOR_ID_8: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + FPGA_PCI_NAME, &fpgalogic_i2c[0]); + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_9: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + FPGA_PCI_NAME, &fpgalogic_i2c[1]); + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_10: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + FPGA_PCI_NAME, &fpgalogic_i2c[2]); + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_11: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + FPGA_PCI_NAME, &fpgalogic_i2c[3]); + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_12: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + FPGA_PCI_NAME, &fpgalogic_i2c[4]); + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_13: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[5]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_14: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[6]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_15: + /*it is an external interrupt number. Ignore this case */ + break; + case FPGA_MSI_VECTOR_ID_16: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_7) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[7]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_17: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[8]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_18: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[9]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_19: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[10]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_20: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[11]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_21: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[12]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_22: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[13]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_23: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[14]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_24: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[15]); + fpgapci->irq_assigned++; + } + break; + + default: + PRINT("No more interrupt handler for number (%d)\n", + dev->irq + irq_num_id); + break; + } + + return err; +} +/* Mask for MSI Multi message enable bits */ +#define MSI_MME 0x70 +/** + * These enums define the type of interrupt scheme that the overall + * system uses. + */ +enum fpga_irq_type { + INT_MSI_SINGLE, + INT_MSI_MULTI, + INT_MSIX, + INT_NONE, + INT_FENCE /* Last item to guard from loop run-overs */ +}; +/** + * @def PCI_DEVICE_STATUS + * define the offset for STS register + * from the start of PCI config space as specified in the + * NVME_Comliance 1.0b. offset 06h:STS - Device status. + * This register has error status for NVME PCI Exress + * Card. After reading data from this reagister, the driver + * will identify if any error is set during the operation and + * report as kernel alert message. + */ +#define PCI_DEVICE_STATUS 0x6 +/** + * @def NEXT_MASK + * This indicates the location of the next capability item + * in the list. + */ +#define NEXT_MASK 0xFF00 +/** + * @def MSIXCAP_ID + * This bit indicates if the pointer leading to this position + * is a capability. + */ +#define MSIXCAP_ID 0x11 +/** + * @def MSICAP_ID + * This bit indicates if the pointer leading to this position + * is a capability. + */ +#define MSICAP_ID 0x5 + +/** + * @def CL_MASK + * This bit position indicates Capabilities List of the controller + * The controller should support the PCI Power Management cap as a + * minimum. + */ +#define CL_MASK 0x0010 + +/** + * @def CAP_REG + * Set to offset defined in NVME Spec 1.0b. + */ +#define CAP_REG 0x34 +static void msi_set_enable(struct pci_dev *dev, int enable) +{ + int pos,maxvec; + u16 control; + int request_private_bits = 4; + + pos = pci_find_capability(dev, PCI_CAP_ID_MSI); + + if (pos) { + pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); + maxvec = 1 << ((control & PCI_MSI_FLAGS_QMASK) >> 1); + PRINT("control = 0x%x maxvec = 0x%x\n", control, maxvec); + control &= ~PCI_MSI_FLAGS_ENABLE; + + + /* + * The PCI 2.3 spec mandates that there are at most 32 + * interrupts. If this device asks for more, only give it one. + */ + if (request_private_bits > 5) { + request_private_bits = 0; + } + + /* Update the number of IRQs the device has available to it */ + control &= ~PCI_MSI_FLAGS_QSIZE; + control |= (request_private_bits << 4); + + pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); + } +} +/** + * @brief Enables pcie-device and claims/remaps neccessary bar resources + * @param dev Pointer to pci-device, which should be allocated + * @return Returns error code or zero if success + * */ +static int fpgapci_setup_device(struct fpgapci_dev *fpgapci,struct pci_dev *dev) +{ + int err = 0; + + /* wake up the pci device */ + err = pci_enable_device(dev); + if(err) { + PRINT("failed to enable pci device %d\n", err); + goto error_pci_en; + } + + /* on platforms with buggy ACPI, pdev->msi_enabled may be set to + * allow pci_enable_device to work. This indicates INTx was not routed + * and only MSI should be used + */ + + pci_set_master(dev); + + /* Setup the BAR memory regions */ + err = pci_request_regions(dev, DRIVER_NAME); + if (err) { + PRINT("failed to enable pci device %d\n", err); + goto error_pci_req; + } + + scan_bars(fpgapci, dev); + + if (map_bars(fpgapci, dev)) { + goto fail_map_bars; + } + + i2c_pci_init(fpgapci); + + return 0; + /* ERROR HANDLING */ +fail_map_bars: + pci_release_regions(dev); +error_pci_req: + pci_disable_device(dev); +error_pci_en: + return -ENODEV; +} + +static int fpgapci_configure_msi(struct fpgapci_dev *fpgapci,struct pci_dev *dev) +{ + int err = 0, i; + int request_vec; + + msi_set_enable(dev,1); + PRINT("Check MSI capability after msi_set_enable\n"); + + + /*Above 4.1.12*/ + request_vec = total_i2c_pci_bus; + err = pci_alloc_irq_vectors(dev, request_vec, pci_msi_vec_count(dev), + PCI_IRQ_MSI);//PCI_IRQ_AFFINITY | PCI_IRQ_MSI); + + if (err <= 0) { + PRINT("Cannot set MSI vector (%d)\n", err); + goto error_no_msi; + } else { + PRINT("Got %d MSI vectors starting at %d\n", err, dev->irq); + if ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_00) { + if (err < MSI_VECTOR_REV_00) { + goto error_disable_msi; + } + } else if (((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_01) || + ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_02) || + ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_03)) { + if (err < MSI_VECTOR_REV_01) { + goto error_disable_msi; + } + } + } + fpgapci->irq_first = dev->irq; + fpgapci->irq_length = err; + fpgapci->irq_assigned = 0; + + + for(i = 0; i < fpgapci->irq_length; i++) { + err = register_intr_handler(dev, i); + if (err) { + PRINT("Cannot request Interrupt number %d\n", i); + goto error_pci_req_irq; + } + } + + return 0; + +error_pci_req_irq: + for(i = 0; i < fpgapci->irq_assigned; i++) + { + PRINT("free_irq %d i =%d\n",fpgapci->irq_first + i,i); + if (i < 7) + free_irq(fpgapci->irq_first + 8 + i, &fpgalogic_i2c[i]); + else + free_irq(fpgapci->irq_first + 8 + i + 1, &fpgalogic_i2c[i]); + } +error_disable_msi: + pci_disable_msi(fpgapci->pci_dev); +error_no_msi: + return -ENOSPC; +} + +static int fpgapci_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + struct fpgapci_dev *fpgapci = 0; + +#ifdef TEST + PRINT ( " vendor = 0x%x, device = 0x%x, class = 0x%x, bus:slot.func = %02x:%02x.%02x\n", + dev->vendor, dev->device, dev->class, + dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); +#endif + fpgapci = kzalloc(sizeof(struct fpgapci_dev), GFP_KERNEL); + + if (!fpgapci) { + PRINT( "Couldn't allocate memory!\n"); + goto fail_kzalloc; + } + + fpgapci->pci_dev = dev; + dev_set_drvdata(&dev->dev, (void*)fpgapci); + + fpgapci->upstream = find_upstream_dev (dev); + + if(fpgapci_setup_device(fpgapci,dev)) { + goto error_no_device; + } + + if (use_irq) { + if(fpgapci_configure_msi(fpgapci,dev)) { + goto error_cannot_configure; + } + /* Enable interrupt after config msi */ + fpgai2c_interrupt_enable(fpgapci); + + } + + + return 0; + /* ERROR HANDLING */ +error_cannot_configure: + printk("error_cannot_configure\n"); + free_bars (fpgapci, dev); + pci_release_regions(dev); + pci_disable_device(dev); +error_no_device: + i2c_pci_deinit(); + printk("error_no_device\n"); +fail_kzalloc: + return -1; + + +} + +static void fpgapci_remove(struct pci_dev *dev) +{ + struct fpgapci_dev *fpgapci = 0; + int i; + PRINT (": dev is %p\n", dev); + + if (dev == 0) { + PRINT ( ": dev is 0\n"); + return; + } + + fpgapci = (struct fpgapci_dev*) dev_get_drvdata(&dev->dev); + if (fpgapci == 0) { + PRINT ( ": fpgapci_dev is 0\n"); + return; + } + i2c_pci_deinit(); + // + if (use_irq) + { + for(i = 0; i < fpgapci->irq_assigned; i++) + { + PRINT("free_irq %d i =%d\n",fpgapci->irq_first + i,i); + if (i < 7) + free_irq(fpgapci->irq_first + 8 + i, &fpgalogic_i2c[i]); + else + free_irq(fpgapci->irq_first + 8 + i + 1, &fpgalogic_i2c[i]); + } + } + pci_disable_msi(fpgapci->pci_dev); + free_bars (fpgapci, dev); + pci_disable_device(dev); + pci_release_regions(dev); + + kfree (fpgapci); +} + +static const struct pci_device_id fpgapci_ids[] = { + {PCI_DEVICE(PCI_VENDOR_ID_XILINX, DEVICE)}, + {PCI_DEVICE(PCI_VENDOR_ID_ALTERA, PCI_DEVICE_ID_ALTERA)}, + {0, }, +}; + +MODULE_DEVICE_TABLE(pci, fpgapci_ids); + +static struct pci_driver fpgapci_driver = { + .name = DRIVER_NAME, + .id_table = fpgapci_ids, + .probe = fpgapci_probe, + .remove = fpgapci_remove, + /* resume, suspend are optional */ +}; + +/* Initialize the driver module (but not any device) and register + * the module with the kernel PCI subsystem. */ +static int __init fpgapci_init(void) +{ + + if (pci_register_driver(&fpgapci_driver)) { + PRINT("pci_unregister_driver\n"); + pci_unregister_driver(&fpgapci_driver); + return -ENODEV; + } + + return 0; +} + +static void __exit fpgapci_exit(void) +{ + PRINT ("fpgapci_exit"); + + /* unregister this driver from the PCI bus driver */ + pci_unregister_driver(&fpgapci_driver); + +} + + +module_init (fpgapci_init); +module_exit (fpgapci_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("joyce_yu@dell.com"); +MODULE_DESCRIPTION ("Driver for FPGA Logic I2C bus"); +MODULE_SUPPORTED_DEVICE ("FPGA Logic I2C bus"); +MODULE_VERSION ("01.01"); diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/mc24lc64t.c b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/mc24lc64t.c new file mode 100644 index 000000000000..002172f587e8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/modules/mc24lc64t.c @@ -0,0 +1,142 @@ +/* + * mc24lc64t.c - driver for Microchip 24LC64T + * + * Copyright (C) 2017 Celestica Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct mc24lc64t_data { + struct i2c_client *fake_client; + struct mutex update_lock; +}; + +static ssize_t mc24lc64t_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = kobj_to_i2c_client(kobj); + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + unsigned long timeout, read_time, i = 0; + int status; + + mutex_lock(&drvdata->update_lock); + + if (i2c_smbus_write_byte_data(client, off>>8, off)) + { + status = -EIO; + goto exit; + } + + msleep(1); + +begin: + + if (i < count) + { + timeout = jiffies + msecs_to_jiffies(25); /* 25 mS timeout*/ + do { + read_time = jiffies; + + status = i2c_smbus_read_byte(client); + if (status >= 0) + { + buf[i++] = status; + goto begin; + } + } while (time_before(read_time, timeout)); + + status = -ETIMEDOUT; + goto exit; + } + + status = count; + +exit: + mutex_unlock(&drvdata->update_lock); + + return status; +} + +static struct bin_attribute mc24lc64t_bit_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO, + }, + .size = 65536, + .read = mc24lc64t_read, +}; + +static int mc24lc64t_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = client->adapter; + struct mc24lc64t_data *drvdata; + int err; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA + | I2C_FUNC_SMBUS_READ_BYTE)) + return -EPFNOSUPPORT; + + if (!(drvdata = devm_kzalloc(&client->dev, + sizeof(struct mc24lc64t_data), GFP_KERNEL))) + return -ENOMEM; + + drvdata->fake_client = i2c_new_dummy_device(client->adapter, client->addr + 1); + if (!drvdata->fake_client) + return -ENOMEM; + + i2c_set_clientdata(client, drvdata); + mutex_init(&drvdata->update_lock); + + err = sysfs_create_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + if (err) + i2c_unregister_device(drvdata->fake_client); + + return err; +} + +static int mc24lc64t_remove(struct i2c_client *client) +{ + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + + i2c_unregister_device(drvdata->fake_client); + + sysfs_remove_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + + return 0; +} + +static const struct i2c_device_id mc24lc64t_id[] = { + { "24lc64t", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mc24lc64t_id); + +static struct i2c_driver mc24lc64t_driver = { + .driver = { + .name = "mc24lc64t", + .owner = THIS_MODULE, + }, + .probe = mc24lc64t_probe, + .remove = mc24lc64t_remove, + .id_table = mc24lc64t_id, +}; + +module_i2c_driver(mc24lc64t_driver); + +MODULE_AUTHOR("Abhisit Sangjan "); +MODULE_DESCRIPTION("Microchip 24LC64T Driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/check_qsfp.sh b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/check_qsfp.sh new file mode 100755 index 000000000000..4bde690b7229 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/check_qsfp.sh @@ -0,0 +1,3 @@ +# Temporary dummy file for Z9432F. +# Will be updated soon. + diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/pcisysfs.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/pcisysfs.py new file mode 100755 index 000000000000..047618e057c8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/pcisysfs.py @@ -0,0 +1,102 @@ +#!/usr/bin/python +# Copyright (c) 2015 Dell Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT +# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS +# FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. +# +# See the Apache Version 2.0 License for specific language governing +# permissions and limitations under the License. + +import struct +import sys +import getopt +from os import * +from mmap import * + +def usage(): + ''' This is the Usage Method ''' + + print '\t\t pcisysfs.py --get --offset --res ' + print '\t\t pcisysfs.py --set --val --offset --res ' + sys.exit(1) + +def pci_mem_read(mm,offset): + mm.seek(offset) + read_data_stream=mm.read(4) + print "" + reg_val=struct.unpack('I',read_data_stream) + print "reg_val read:%x"%reg_val + return reg_val + +def pci_mem_write(mm,offset,data): + mm.seek(offset) + print "data to write:%x"%data + mm.write(struct.pack('I',data)) + +def pci_set_value(resource,val,offset): + fd=open(resource,O_RDWR) + mm=mmap(fd,0) + pci_mem_write(mm,offset,val) + +def pci_get_value(resource,offset): + fd=open(resource,O_RDWR) + mm=mmap(fd,0) + pci_mem_read(mm,offset) + +def main(argv): + + ''' The main function will read the user input from the + command line argument and process the request ''' + + opts = '' + val = '' + choice = '' + resource = '' + offset = '' + + try: + opts, args = getopt.getopt(argv, "hgsv:" , \ + ["val=","res=","offset=","help", "get", "set"]) + + except getopt.GetoptError: + usage() + + for opt,arg in opts: + + if opt in ('-h','--help'): + choice = 'help' + + elif opt in ('-g', '--get'): + choice = 'get' + + elif opt in ('-s', '--set'): + choice = 'set' + + elif opt == '--res': + resource = arg + + elif opt == '--val': + val = int(arg,16) + + elif opt == '--offset': + offset = int(arg,16) + + if choice == 'set' and val != '' and offset !='' and resource !='': + pci_set_value(resource,val,offset) + + elif choice == 'get' and offset != '' and resource !='': + pci_get_value(resource,offset) + + else: + usage() + +#Calling the main method +if __name__ == "__main__": + main(sys.argv[1:]) + diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py new file mode 100755 index 000000000000..3446a09321de --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py @@ -0,0 +1,254 @@ +#!/usr/bin/python +""" +# Module on Z9432F, the BaseBoard Management Controller is an +# autonomous subsystem provides monitoring and management +# facility independent of the host CPU. IPMI standard +# protocol is used with ipmitool to fetch sensor details. +# This provies support for the following objects: +# * Onboard temperature sensors +# * FAN trays +# * PSU +""" + +import sys +import logging +import commands + +Z9432F_MAX_FAN_TRAYS = 7 +Z9432F_MAX_PSUS = 2 +IPMI_SENSOR_DATA = "ipmitool sdr elist" + +IPMI_RAW_STORAGE_READ = "ipmitool raw 0x0a 0x11 {0} {1} 0 1" + +# Dump sensor registers +class SdrStatus(object): + """ Contains IPMI SDR List """ + def __init__(self): + ipmi_cmd = IPMI_SENSOR_DATA + status, resp = commands.getstatusoutput(ipmi_cmd) + if status: + logging.error('Failed to execute: ' + ipmi_cmd) + sys.exit(0) + self.ipmi_sdr_dict = {} + for sdr_status in resp.split('\n'): + sdr_status_l = sdr_status.split('|') + sensor = sdr_status_l[0].strip() + value = sdr_status_l[4].strip() + self.ipmi_sdr_dict[sensor] = value + + + def get(self): + """ Returns SDR List """ + return self.ipmi_sdr_dict + +# Fetch a Fan Status +SDR_STATUS = SdrStatus() +def get_fan_status(fan_id): + """ Get Fan Status of give Id """ + status, cmd_ret = commands.getstatusoutput(IPMI_FAN_PRESENCE.format(fan_id)) + if status: + logging.error('Failed to execute : %s', IPMI_FAN_PRESENCE.format(fan_id)) + sys.exit(0) + return ' ' + cmd_ret.splitlines()[5].strip(' ').strip('[]') + +# Fetch a BMC register + + +def get_pmc_register(reg_name): + """ Returns the value of BMC Regster """ + + output = None + sdr_status = SDR_STATUS.get() + if reg_name in sdr_status: + output = sdr_status[reg_name] + else: + print '\nFailed to fetch: ' + reg_name + ' sensor ' + sys.exit(0) + + logging.basicConfig(level=logging.DEBUG) + return output + +# Fetch FRU on given offset +def fetch_raw_fru(dev_id, offset): + """ Fetch RAW value from FRU (dev_id) @ given offset """ + status, cmd_ret = commands.getstatusoutput(IPMI_RAW_STORAGE_READ.format(dev_id, offset)) + if status: + logging.error('Failed to execute ipmitool :' + IPMI_RAW_STORAGE_READ.format(dev_id, offset)) + return -1 + return int(cmd_ret.strip().split(' ')[1]) + + + + +def get_fan_airflow(fan_id): + """ Return Airflow of direction of FANTRAY(fan_id) """ + airflow_direction = ['Exhaust', 'Intake'] + dir_idx = fetch_raw_fru(fan_id+2, 0x45) + if dir_idx == -1: + return 'N/A' + return airflow_direction[dir_idx] + +#Fetch FRU Data for given fruid +def get_psu_airflow(psu_id): + """ Return Airflow Direction of psu_id """ + airflow_direction = ['Exhaust', 'Intake'] + dir_idx = fetch_raw_fru(psu_id, 0x2F) + if dir_idx == -1: + return 'N/A' + return airflow_direction[dir_idx] + +# Print the information for temperature sensors + + +def print_temperature_sensors(): + """ Prints Temperature Sensor """ + + print "\nOnboard Temperature Sensors:" + + print ' PT Left Temp: ',\ + (get_pmc_register('PT_Left_temp')) + print ' NPU Rear Temp: ',\ + (get_pmc_register('NPU_Rear_temp')) + print ' PT Right Temp: ',\ + (get_pmc_register('PT_Right_temp')) + print ' NPU Front Temp: ',\ + (get_pmc_register('NPU_Front_temp')) + print ' FAN Right Temp: ',\ + (get_pmc_register('FAN_Right_temp')) + print ' NPU Temp: ',\ + (get_pmc_register('NPU_temp')) + print ' CPU Temp: ',\ + (get_pmc_register('CPU_temp')) + print ' PSU1 AF Temp: ',\ + (get_pmc_register('PSU1_AF_temp')) + print ' PSU1 Mid Temp: ',\ + (get_pmc_register('PSU1_Mid_temp')) + print ' PSU1 Rear Temp: ',\ + (get_pmc_register('PSU1_Rear_temp')) + print ' PSU2 AF Temp: ',\ + (get_pmc_register('PSU2_AF_temp')) + print ' PSU2 Mid Temp: ',\ + (get_pmc_register('PSU2_Mid_temp')) + print ' PSU2 Rear Temp: ',\ + (get_pmc_register('PSU2_Rear_temp')) + + + commands.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') + +print_temperature_sensors() + +# Print the information for 1 Fan Tray + + +def print_fan_tray(fan_tray): + """ Prints given Fan Tray information """ + fan_status = ['Abnormal', 'Normal'] + + print ' Fan Tray ' + str(fan_tray) + ':' + + fan_front_status = (get_pmc_register('Fan{0}_Front_state'.format(str(fan_tray))) == '') + fan_rear_status = (get_pmc_register('Fan{0}_Rear_state'.format(str(fan_tray))) == '') + print ' Fan1 Speed: ', \ + get_pmc_register('FAN{0}_Front_rpm'.format(str(fan_tray))) + print ' Fan2 Speed: ',\ + get_pmc_register('FAN{0}_Rear_rpm'.format(str(fan_tray))) + print ' Fan1 State: ', fan_status[fan_front_status] + print ' Fan2 State: ', fan_status[fan_rear_status] + print ' Airflow: ', get_fan_airflow(fan_tray) + + +print '\nFan Trays:' + +for tray in range(1, Z9432F_MAX_FAN_TRAYS + 1): + if get_pmc_register('FAN{0}_prsnt'.format(str(tray))) == 'Present': + print_fan_tray(tray) + else: + print ' Fan Tray {}: NOT PRESENT'.format(str(tray)) + +def get_psu_status(index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + + status = get_pmc_register('PSU{0}_state'.format(str(index))) + if len(status.split(',')) > 1: + return 'NOT OK' + elif 'Presence' not in status: + return 'NOT PRESENT' + return None + + +# Print the information for PSU1, PSU2 +def print_psu(psu_id): + """ Print PSU information od psu_id """ + + + # PSU FAN details + if psu_id == 1: + print ' PSU1:' + print ' AF Temperature: ',\ + get_pmc_register('PSU1_AF_temp') + print ' Mid Temperature: ',\ + get_pmc_register('PSU1_Mid_temp') + print ' Rear Temperature: ',\ + get_pmc_register('PSU1_Rear_temp') + print ' FAN RPM: ',\ + get_pmc_register('PSU1_rpm') + + # PSU input & output monitors + print ' Input Voltage: ',\ + get_pmc_register('PSU1_In_volt') + print ' Output Voltage: ',\ + get_pmc_register('PSU1_Out_volt') + print ' Input Power: ',\ + get_pmc_register('PSU1_In_watt') + print ' Output Power: ',\ + get_pmc_register('PSU1_Out_watt') + print ' Input Current: ',\ + get_pmc_register('PSU1_In_amp') + print ' Output Current: ',\ + get_pmc_register('PSU1_Out_amp') + + else: + + print ' PSU2:' + print ' AF Temperature: ',\ + get_pmc_register('PSU2_AF_temp') + print ' Mid Temperature: ',\ + get_pmc_register('PSU2_Mid_temp') + print ' Rear Temperature: ',\ + get_pmc_register('PSU2_Rear_temp') + print ' FAN RPM: ',\ + get_pmc_register('PSU2_rpm') + + # PSU input & output monitors + print ' Input Voltage: ',\ + get_pmc_register('PSU2_In_volt') + print ' Output Voltage: ',\ + get_pmc_register('PSU2_Out_volt') + print ' Input Power: ',\ + get_pmc_register('PSU2_In_watt') + print ' Output Power: ',\ + get_pmc_register('PSU2_Out_watt') + print ' Input Current: ',\ + get_pmc_register('PSU2_In_amp') + print ' Output Current: ',\ + get_pmc_register('PSU2_Out_amp') + print ' Airflow: ',\ + get_psu_airflow(psu_id) + + +print '\nPSUs:' +for psu in range(1, Z9432F_MAX_PSUS + 1): + psu_status = get_psu_status(psu) + if psu_status is not None: + print ' PSU{0}: {1}'.format(psu, psu_status) + else: + print_psu(psu) + +print '\n Total Power: ',\ + get_pmc_register('PSU_Total_watt') + commands.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/qsfp_irq_enable.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/qsfp_irq_enable.py new file mode 100755 index 000000000000..77eac10ec3a1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/qsfp_irq_enable.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +try: + import struct + from os import * + from mmap import * + +except ImportError as e: + raise ImportError("%s - required module no found" % str(e)) + +BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0" +PORT_START = 0 +PORT_END = 32 + + +def pci_mem_write(mm, offset, data): + mm.seek(offset) + mm.write(struct.pack('I', data)) + + +def pci_set_value(resource, val, offset): + fd = open(resource, O_RDWR) + mm = mmap(fd, 0) + pci_mem_write(mm, offset, val) + mm.close() + close(fd) + +for port_num in range(PORT_START, PORT_END+1): + port_offset = 0x400c + ((port_num) * 16) + pci_set_value(BASE_RES_PATH, 0x30, port_offset) diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/sensors b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/sensors new file mode 100755 index 000000000000..ee53f2b0f325 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/sensors @@ -0,0 +1,8 @@ +#!/bin/bash +docker exec -i pmon sensors "$@" +docker exec -i pmon /usr/bin/platform_sensors.py "$@" + +#To probe sensors not part of lm-sensors +#if [ -r /usr/local/bin/platform_sensors.py ]; then +# python /usr/local/bin/platform_sensors.py +#fi diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/z9432f_platform.sh b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/z9432f_platform.sh new file mode 100755 index 000000000000..99cf5371b7f4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/z9432f_platform.sh @@ -0,0 +1,212 @@ +#!/bin/bash + +init_devnum() { + found=0 + for devnum in 0 1; do + devname=`cat /sys/bus/i2c/devices/i2c-${devnum}/name` + # iSMT adapter can be at either dffd0000 or dfff0000 + if [[ $devname == 'SMBus iSMT adapter at '* ]]; then + found=1 + break + fi + done + + [ $found -eq 0 ] && echo "cannot find iSMT" && exit 1 +} + +# Attach/Detach syseeprom on CPU board +sys_eeprom() { + case $1 in + "new_device") echo 24c16 0x50 > /sys/bus/i2c/devices/i2c-${devnum}/$1 + ;; + "delete_device") echo 0x50 > /sys/bus/i2c/devices/i2c-${devnum}/$1 + ;; + *) echo "z9432f_platform: sys_eeprom : invalid command !" + ;; + esac +} + +#Attach/Detach the MUX connecting all QSFPs +switch_board_qsfp_sfp_mux() { + case $1 in + "new_device") + for ((j=0x70,i=603;i<=607;i++,j++)); + do + sleep 0.1 + echo "Attaching PCA9548 @ $j" + echo pca9548 $j > /sys/bus/i2c/devices/i2c-$i/$1 + done + ;; + "delete_device") + for ((j=0x70,i=603;i<=607;i++,j++)); + do + echo "Detaching PCA9548 @ $j" + echo $j > /sys/bus/i2c/devices/i2c-$i/$1 + done + + ;; + *) echo "z9432f_platform: switch_board_qsfp_sfp_mux: invalid command !" + ;; + esac + sleep 2 +} + +#Attach/Detach 2 instances of EEPROM driver SFP+ ports +#eeprom can dump data using below command +switch_board_sfp() { + case $1 in + "new_device") + for ((i=34;i<=35;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 + done + ;; + + "delete_device") + for ((i=34;i<=35;i++)); + do + echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 + done + ;; + + *) echo "z9332f_platform: switch_board_qsfp: invalid command !" + ;; + esac +} + +#Attach/Detach 32 instances of EEPROM driver QSFP ports +#eeprom can dump data using below command +switch_board_qsfp() { + case $1 in + "new_device") + for ((i=2;i<=33;i++)); + do + echo optoe3 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 + done + ;; + + "delete_device") + for ((i=2;i<=33;i++)); + do + echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1 + done + ;; + + *) echo "z9432f_platform: switch_board_qsfp: invalid command !" + ;; + esac +} + +#Modsel 64 ports to applicable QSFP type modules +#This enables the adapter to respond for i2c commands +switch_board_modsel() { + resource="/sys/bus/pci/devices/0000:04:00.0/resource0" + for ((i=1;i<=34;i++)); + do + port_addr=$(( 16384 + ((i - 1) * 16))) + hex=$( printf "0x%x" $port_addr ) + python /usr/bin/pcisysfs.py --set --offset $hex --val 0x10 --res $resource > /dev/null 2>&1 + done +} + +platform_firmware_versions() { + FIRMWARE_VERSION_FILE=/var/log/firmware_versions + rm -rf ${FIRMWARE_VERSION_FILE} + echo "BIOS: `dmidecode -s system-version `" > $FIRMWARE_VERSION_FILE + ## Get FPGA version + r=`/usr/bin/pcisysfs.py --get --offset 0x00 --res /sys/bus/pci/devices/0000\:04\:00.0/resource0 | sed '1d; s/.*\(....\)$/\1/; s/\(..\{1\}\)/\1./'` + r_min=$(echo $r | sed 's/.*\(..\)$/0x\1/') + r_maj=$(echo $r | sed 's/^\(..\).*/0x\1/') + echo "FPGA: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE + + ## Get BMC Firmware Revision + r=`cat /sys/class/ipmi/ipmi0/device/bmc/firmware_revision` + echo "BMC: $r" >> $FIRMWARE_VERSION_FILE + + #System CPLD 0x31 on i2c bus 601 ( physical FPGA I2C-2) + r_min=`/usr/sbin/i2cget -y 601 0x31 0x0 | sed ' s/.*\(0x..\)$/\1/'` + r_maj=`/usr/sbin/i2cget -y 601 0x31 0x1 | sed ' s/.*\(0x..\)$/\1/'` + echo "System CPLD: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE + + #Slave CPLD 1 0x30 on i2c bus 600 ( physical FPGA I2C-1) + r_min=`/usr/sbin/i2cget -y 600 0x30 0x0 | sed ' s/.*\(0x..\)$/\1/'` + r_maj=`/usr/sbin/i2cget -y 600 0x30 0x1 | sed ' s/.*\(0x..\)$/\1/'` + echo "Slave CPLD 1: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE + + #Slave CPLD 2 0x31 on i2c bus 600 ( physical FPGA I2C-1) + r_min=`/usr/sbin/i2cget -y 600 0x31 0x0 | sed ' s/.*\(0x..\)$/\1/'` + r_maj=`/usr/sbin/i2cget -y 600 0x31 0x1 | sed ' s/.*\(0x..\)$/\1/'` + echo "Slave CPLD 2: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE +} + +#This enables the led control for CPU and default states +switch_board_led_default() { + resource="/sys/bus/pci/devices/0000:04:00.0/resource0" + python /usr/bin/pcisysfs.py --set --offset 0x24 --val 0x194 --res $resource > /dev/null 2>&1 +} + +install_python_api_package() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + + pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl +} + +remove_python_api_package() { + rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null) + if [ $? -eq 0 ]; then + rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null) + fi +} + +get_reboot_cause() { + REBOOT_REASON_FILE="/host/reboot-cause/platform/reboot_reason" + resource="/sys/bus/pci/devices/0000:04:00.0/resource0" + + mkdir -p $(dirname $REBOOT_REASON_FILE) + + # Handle First Boot into software version with reboot cause determination support + if [[ ! -e $REBOOT_REASON_FILE ]]; then + echo "0" > $REBOOT_REASON_FILE + else + /usr/bin/pcisysfs.py --get --offset 0x18 --res $resource | sed '1d; s/.*:\(.*\)$/\1/;' > $REBOOT_REASON_FILE + fi + /usr/bin/pcisysfs.py --set --val 0x0 --offset 0x18 --res $resource +} + +init_devnum + +if [ "$1" == "init" ]; then + modprobe i2c-dev + modprobe i2c-mux-pca954x force_deselect_on_exit=1 + modprobe ipmi_devintf + modprobe ipmi_si kipmid_max_busy_us=1000 + modprobe i2c_ocores + modprobe dell_z9432f_fpga_ocores + modprobe mc24lc64t + sys_eeprom "new_device" + switch_board_qsfp_sfp_mux "new_device" + switch_board_qsfp "new_device" + switch_board_sfp "new_device" + switch_board_modsel + switch_board_led_default + install_python_api_package + #python /usr/bin/qsfp_irq_enable.py + platform_firmware_versions + get_reboot_cause + echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us + +elif [ "$1" == "deinit" ]; then + sys_eeprom "delete_device" + switch_board_sfp "delete_device" + switch_board_qsfp "delete_device" + switch_board_qsfp_sfp_mux "delete_device" + + modprobe -r mc24lc64t + modprobe -r i2c-mux-pca954x + modprobe -r i2c-dev + remove_python_api_package +else + echo "z9432f_platform : Invalid option !" +fi + diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/setup.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/setup.py new file mode 120000 index 000000000000..4f6de9941d96 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/setup.py @@ -0,0 +1 @@ +../s6100/setup.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/__init__.py new file mode 100644 index 000000000000..4f5d4f6e473d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer"] +from sonic_platform import * diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/chassis.py new file mode 100644 index 000000000000..bb2446445f5d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/chassis.py @@ -0,0 +1,425 @@ +#!/usr/bin/env python +""" +############################################################################# +# DELLEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# +""" +try: + import time + import sys + import os + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp + from sonic_platform.eeprom import Eeprom + from sonic_platform.component import Component + from sonic_platform.psu import Psu + from sonic_platform.thermal import Thermal + from sonic_platform.watchdog import Watchdog + from sonic_platform.fan_drawer import FanDrawer + import sonic_platform.hwaccess as hwaccess +except ImportError as err: + raise ImportError(str(err) + "- required module not found") + +MAX_Z9432F_COMPONENT = 6 # BIOS,BMC,FPGA,SYSTEM CPLD,2 SLAVE CPLDs +MAX_Z9432F_FANTRAY = 7 +MAX_Z9432F_FAN = 2 +MAX_Z9432F_PSU = 2 +MAX_Z9432F_THERMAL = 13 +SYSTEM_LED_REG = 0x24 +SYSTEM_BEACON_LED_SET = 0x8 +SYSTEM_BEACON_LED_CLEAR = 0xFFFFFFF7 + +MEDIA_PART_NUM_LIST = set([ \ +"8T47V", "XTY28", "MHVPK", "GF76J", "J6FGD", "F1KMV", "9DN5J", "H4DHD", "6MCNV", "0WRX0", "X7F70", +"5R2PT", "WTRD1", "WTRD1", "WTRD1", "WTRD1", "5250G", "WTRD1", "C5RNH", "C5RNH", "FTLX8571D3BCL-FC", +"C5RNH", "5250G", "N8TDR", "7D64H", "7D64H", "RN84N", "RN84N", "HMTNW", "6K3Y6", "6K3Y6", "TY5FM", +"50M0R", "PGYJT", "WP2PP", "85Y13", "1HCGH", "FP9R1", "FYD0M", "C6Y7M", "C6Y7M", "V250M", "V250M", +"5CWK6", "5CWK6", "53HVN", "53HVN", "358VV", "358VV", "MV799", "MV799", "YJF03", "P9GND", "T1KCN", +"1DXKP", "MT7R2", "K0T7R", "W5G04", "7TCDN", "7TCDN", "7TCDN", "7TCDN", "7TCDN", "V3XJK", "0MV31", +"5FVP7", "N6KM9", "C41MF", "77KC3", "XW7J0", "V4NJV", "2XJHY", "H93DH", "H93DH", "F8CG0", "F8CG0", +"F8CG0", "119N6", "WFMF5", "794RX", "288F6", "1M31V", "1M31V", "5NP8R", "5NP8R", "4TC09", "4TC09", +"FC6KV", "FC6KV", "J90VN", "J90VN", "05RH0", "05RH0", "YDN52", "0C2YV", "YDN52", "0C2YV", "9JT65", +"D7M6H", "6GW14", "FYVFW", "0VF5H", "P4YPY", "P4YPY", "TCPM2", "TCPM2", "JNPF8", "JNPF8", "27GG5", +"27GG5", "P8T4W", "P8T4W", "JR54Y", "M6N0J", "XJYD0", "K44H9", "035KG", "P7C7N", "76V43", "3CC35", +"FN4FC", "26FN3", "YFNDD", "YFNDD", "7R9N9", "035KG", "P7C7N", "76V43", "3CC35", "PLRXPLSCS43811", +"FN4FC", "26FN3", "YFNDD", "YFNDD", "7R9N9", "G86YJ", "V407F", "V407F", "9KH6T", "G86YJ", "V407F", +"9KH6T", "2JVDD", "D0R73", "VXFJY", "9X8JP", "2JVDD", "D0R73", "VXFJY", "9X8JP", "2JVDD", "D0R73", +"VXFJY", "9X8JP", "GMFC5", "GMFC5", "GMFC5", "D7P80", "3MFXG", "3MFXG", "0GWXJ", "THPF3", "PJ62G", +"3XCX1", "JJYKG", "RRRTK", "16K56", "86JM2", "K5R6C", "7MG2C", "WTPPN", "9HTT2", "NKM4F", "VXGGG", +"JC9W6", "6MR8M", "RP3GV", "M5PPJ", "XKY55", "TKCXT", "05J8P", "5WGKD", "XFDRT", "NW8DM", "YPKH3", +"5WGKD", "XFDRT", "NW8DM", "YPKH3", "71XXK", "MVCX6", "0XYP6", "HPPVW", "3GHRT", "71XXK", "MVCX6", +"0XYP6", "HPPVW", "3GHRT", "2X5T6", "135V2", "KD5MV", "2X5T6", "KD5MV", "HHFK0", "3YWG7", "5CMT2", +"RCVP5", "X5DH4", "HHFK0", "3YWG7", "5CMT2", "RCVP5", "X5DH4", "3YWG7", "5CMT2", "RCVP5", "X5DH4", +"4WJ41", "4WJ41", "14NV5", "14NV5", "14NV5", "4WGYD", "YKMH7", "X7CCC", "X7CCC", "0X9CT", "0CY8V", +"P7D7R", "W4GPP", "W4GPP", "W4GPP", "HHHCHC", "07RN7", "07RN7", "0YR96", "0YR96", "JCYM9", +"FTLX8571D3BCL", "DDW0X", "VPFDJ", "229KM", "9FC7D", "DDW0X", "VPFDJ", "6FMR5", "J7K20", "N3K9W", +"6FMR5", "8R4VM", "7VN5T", "D9YM8", "8R4VM", "VYXPW", "87TPX", "WY6FK", "VYXPW", "87TPX", "WY6FK", +"WG8C4", "N8K82", "2DV6Y", "77C3C", "RC0HM", "77C3C", "RC0HM", "JHXTN", "3P3PG", "92YVM", "4VX5M", +"4VX5M", "6RRGD", "W4JWV", "22V6R", "XR11M", "9GMDY", "JMCWK", "TP2F0", "6MGDY", "78RHK", "C0TP5", +"0WDNV", "FCLF8522P2BTL"]) + +PORT_START = 1 +PORT_END = 34 +PORTS_IN_BLOCK = (PORT_END + 1) +REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason" +PCI_RES = "/sys/bus/pci/devices/0000:04:00.0/resource0" + +class Chassis(ChassisBase): + """ + DELLEMC Platform-specific Chassis class + """ + + + sysled_offset = 0x0024 + + SYSLED_COLOR_TO_REG = { + "blinking_green": 0x0, + "green" : 0x10, + "amber" : 0x20, + "blinking_amber": 0x30 + } + + REG_TO_SYSLED_COLOR = { + 0x0 : "blinking_green", + 0x10 : "green", + 0x20 : "amber", + 0x30 : "blinking_amber" + } + + _global_port_pres_dict = {} + + def __init__(self): + ChassisBase.__init__(self) + # sfp.py will read eeprom contents and retrive the eeprom data. + # We pass the eeprom path from chassis.py + _sfp_port = list(range(33, PORTS_IN_BLOCK)) + i2c_bus_for_port = 2 + i2c_mux_to_populate = 603 + i2c_mux_address = 70 + i2c_mux_is_good = False + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + mux_channel = "/sys/class/i2c-adapter/i2c-{0}/{0}-00{1}/channel-0" + for index in range(PORT_START, PORTS_IN_BLOCK): + eeprom_path = "" + if index%8 == 1: # 8 buses per i2c mux + i2c_mux_is_good = True if os.path.exists(mux_channel.format(i2c_mux_to_populate, i2c_mux_address)) else False + i2c_mux_to_populate += 1 + i2c_mux_address += 1 + if i2c_mux_is_good: + eeprom_path = eeprom_base.format(i2c_bus_for_port) + i2c_bus_for_port += 1 + port_type = 'QSFP_DD' if index not in _sfp_port else 'SFP' + sfp_node = Sfp(index, port_type, eeprom_path) + self._sfp_list.append(sfp_node) + + self._eeprom = Eeprom() + self._watchdog = Watchdog() + self._num_sfps = PORT_END + self._num_fans = MAX_Z9432F_FANTRAY * MAX_Z9432F_FAN + + for i in range(MAX_Z9432F_FANTRAY): + fandrawer = FanDrawer(i) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + self._psu_list = [Psu(i) for i in range(MAX_Z9432F_PSU)] + self._thermal_list = [Thermal(i) for i in range(MAX_Z9432F_THERMAL)] + self._component_list = [Component(i) for i in range(MAX_Z9432F_COMPONENT)] + for port_num in range(PORT_START, PORTS_IN_BLOCK): + presence = self.get_sfp(port_num).get_presence() + self._global_port_pres_dict[port_num] = '1' if presence else '0' + + self._watchdog = Watchdog() + #self.LOCATOR_LED_ON = self.STATUS_LED_COLOR_BLUE_BLINK + #self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF + #ext_media_override() + +# check for this event change for sfp / do we need to handle timeout/sleep + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + """ + start_ms = time.time() * 1000 + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + while True: + time.sleep(0.5) + for port_num in range(PORT_START, (PORT_END + 1)): + presence = self.get_sfp(port_num).get_presence() + if presence and self._global_port_pres_dict[port_num] == '0': + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and + self._global_port_pres_dict[port_num] == '1'): + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + + if len(port_dict) > 0: + return True, change_dict + + if timeout: + now_ms = time.time() * 1000 + if now_ms - start_ms >= timeout: + return True, change_dict + + + def get_status_led(self): + """ + Gets the state of the system LED + Returns: + A string, one of the valid LED color strings which could be + vendor specified. + """ + val = hwaccess.pci_get_value(PCI_RES, self.sysled_offset) + if val != -1: + val = val & 0x30 + return self.REG_TO_SYSLED_COLOR.get(val) + return self.sys_ledcolor + + def initizalize_system_led(self): + self.sys_ledcolor = "green" + + def set_status_led(self, color): + """ + Sets the state of the system LED + Args: + color: A string representing the color with which to set the + system LED + Returns: + bool: True if system LED state is set successfully, False if not + """ + if color not in list(self.SYSLED_COLOR_TO_REG.keys()): + return False + + val = hwaccess.pci_get_value(PCI_RES, self.sysled_offset) + val = (val & 0xFFCF) | self.SYSLED_COLOR_TO_REG[color] + + hwaccess.pci_set_value(PCI_RES, val, self.sysled_offset) + self.sys_ledcolor = color + return True + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 0. + For example, 0 for Ethernet0, 1 for Ethernet4 and so on. + + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + + try: + # The 'index' is 1-based + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + return self._eeprom.modelstr() + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + return self._eeprom.part_number_str() + + def get_serial(self): + """ + Retrieves the serial number of the chassis (Service tag) + Returns: + string: Serial number of chassis + """ + return self._eeprom.serial_str() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.base_mac_addr() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.serial_number_str() + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + return self._eeprom.revision_str() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.system_eeprom_info() + + def get_eeprom(self): + """ + Retrieves the Sys Eeprom instance for the chassis. + Returns : + The instance of the Sys Eeprom + """ + return self._eeprom + + def get_num_fans(self): + """ + Retrives the number of Fans on the chassis. + Returns : + An integer represents the number of Fans on the chassis. + """ + return self._num_fans + + def get_num_sfps(self): + """ + Retrives the numnber of Media on the chassis. + Returns: + An integer represences the number of SFPs on the chassis. + """ + return self._num_sfps + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + try: + with open(REBOOT_CAUSE_PATH) as filed: + reboot_cause = int(filed.read(), 16) + except EnvironmentError: + return (self.REBOOT_CAUSE_NON_HARDWARE, None) + + if reboot_cause & 0x1: + retval = (self.REBOOT_CAUSE_POWER_LOSS, None) + elif reboot_cause & 0x2: + retval = (self.REBOOT_CAUSE_NON_HARDWARE, None) + elif reboot_cause & 0x4: + retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "PSU Shutdown") + elif reboot_cause & 0x8: + retval = (self.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU, None) + elif reboot_cause & 0x10: + retval = (self.REBOOT_CAUSE_WATCHDOG, None) + elif reboot_cause & 0x20: + retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "BMC Shutdown") + elif reboot_cause & 0x40: + retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Hot-Swap Shutdown") + elif reboot_cause & 0x80: + retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Shutdown") + elif reboot_cause & 0x100: + retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Cold Reboot") + else: + retval = (self.REBOOT_CAUSE_NON_HARDWARE, None) + return retval + + @staticmethod + def get_qualified_media_list(): + """ Returns Dell Qualified Media List """ + return MEDIA_PART_NUM_LIST + + def set_locator_led(self, color): + """ + Sets the state of the Chassis Locator LED + + Args: + color: A string representing the color with which to set the Chassis Locator LED + + Returns: + bool: True if the Chassis Locator LED state is set successfully, False if not + + """ + val = hwaccess.pci_get_value(PCI_RES, SYSTEM_LED_REG) + if self.LOCATOR_LED_ON == color: + val = int(val) | SYSTEM_BEACON_LED_SET + elif self.LOCATOR_LED_OFF == color: + val = int(val) & SYSTEM_BEACON_LED_CLEAR + else: + return False + hwaccess.pci_set_value(PCI_RES, val, SYSTEM_LED_REG) + return True + + def get_locator_led(self): + """ + Gets the state of the Chassis Locator LED + + Returns: + LOCATOR_LED_ON or LOCATOR_LED_OFF + """ + val = hwaccess.pci_get_value(PCI_RES, SYSTEM_LED_REG) + val = int(val) & SYSTEM_BEACON_LED_SET + if not val: + return self.LOCATOR_LED_OFF + else: + return self.LOCATOR_LED_ON + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py new file mode 100644 index 000000000000..763db39f5ecc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py @@ -0,0 +1,428 @@ +#!/usr/bin/env python + +######################################################################## +# DELLEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, BMC etc.) available in +# the platform +# +######################################################################## + +try: + import json + import os + import re + import subprocess + import tarfile + import tempfile + from sonic_platform_base.component_base import ComponentBase + import sonic_platform.hwaccess as hwaccess +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +def get_bios_version(): + return subprocess.check_output( + ['dmidecode', '-s', 'bios-version']).decode('utf-8').strip() + +def get_fpga_version(): + val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:04:00.0/resource0', 0) + return '{}.{}'.format((val >> 8) & 0xff, val & 0xff) + +def get_bmc_version(): + return subprocess.check_output( + ['cat', '/sys/class/ipmi/ipmi0/device/bmc/firmware_revision'] + ).decode('utf-8').strip() + +def get_cpld_version(bus, i2caddr): + return '{}.{}'.format(hwaccess.i2c_get(bus, i2caddr, 1), + hwaccess.i2c_get(bus, i2caddr, 0)) + +def get_cpld0_version(): + return get_cpld_version(601, 0x31) + +def get_cpld1_version(): + return get_cpld_version(600, 0x30) + +def get_cpld2_version(): + return get_cpld_version(600, 0x31) + +def get_ssd_version(): + val = 'NA' + try: + ssd_ver = subprocess.check_output(['ssdutil', '-v'], + stderr=subprocess.STDOUT, text=True) + except (FileNotFoundError, subprocess.CalledProcessError): + pass + else: + version = re.search(r'Firmware\s*:(.*)',ssd_ver) + if version: + val = version.group(1).strip() + + return val + +def get_pciephy_version(): + val = 'NA' + try: + pcie_ver = subprocess.check_output(['bcmcmd', 'pciephy fw version'], + stderr=subprocess.STDOUT, text=True) + except (FileNotFoundError, subprocess.CalledProcessError): + pass + else: + version = re.search(r'PCIe FW loader version:\s(.*)', pcie_ver) + if version: + val = version.group(1).strip() + + return val + + +class Component(ComponentBase): + """DellEMC Platform-specific Component class""" + + CHASSIS_COMPONENTS = [ + ['BIOS', + 'Performs initialization of hardware components during booting', + get_bios_version + ], + + ['FPGA', + 'Used for managing the system LEDs', + get_fpga_version + ], + + ['BMC', + 'Platform management controller for on-board temperature monitoring,in-chassis power, Fan and LED control', + get_bmc_version + ], + + ['Baseboard CPLD', + 'Used for managing the CPU power sequence and CPU states', + get_cpld0_version + ], + + ['Switch CPLD 1', + 'Used for managing QSFP-DD/QSFP28/SFP port transceivers ', + get_cpld1_version + ], + + ['Switch CPLD 2', + 'Used for managing QSFP-DD/QSFP28/SFP port transceivers', + get_cpld2_version + ], + + ['SSD', + 'Solid State Drive that stores data persistently', + get_ssd_version + ], + + ['PCIe', + 'ASIC PCIe firmware', + get_pciephy_version + ] + ] + + def __init__(self, component_index=0): + ComponentBase.__init__(self) + self.index = component_index + self.name = self.CHASSIS_COMPONENTS[self.index][0] + self.description = self.CHASSIS_COMPONENTS[self.index][1] + self.version = self.CHASSIS_COMPONENTS[self.index][2]() + + @staticmethod + def _get_available_firmware_version(image_path): + if not os.path.isfile(image_path): + return False, "ERROR: File not found" + + with tempfile.TemporaryDirectory() as tmpdir: + cmd = "sed -e '1,/^exit_marker$/d' {} | tar -x -C {} installer/onie-update.tar.xz".format(image_path, tmpdir) + try: + subprocess.check_call(cmd, stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, shell=True) + except subprocess.CalledProcessError: + return False, "ERROR: Unable to extract firmware updater" + + try: + updater = tarfile.open(os.path.join(tmpdir, "installer/onie-update.tar.xz"), "r") + except tarfile.ReadError: + return False, "ERROR: Unable to extract firmware updater" + + try: + ver_info_fd = updater.extractfile("firmware/fw-component-version") + except KeyError: + updater.close() + return False, "ERROR: Version info not available" + + ver_info = json.load(ver_info_fd) + ver_info_fd.close() + updater.close() + + ver_info = ver_info.get("x86_64-dellemc_z9432f_c3758-r0") + if ver_info: + return True, ver_info + else: + return False, "ERROR: Version info not available" + + @staticmethod + def _stage_firmware_package(image_path): + stage_msg = None + cmd = "onie_stage_fwpkg -a {}".format(image_path) + try: + subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + except subprocess.CalledProcessError as e: + if e.returncode != 2: + return False, e.output.strip() + else: + stage_msg = e.output.strip() + + cmd = "onie_mode_set -o update" + try: + subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + except subprocess.CalledProcessError as e: + return False, e.output.strip() + + if stage_msg: + return True, stage_msg + else: + return True, "INFO: Firmware upgrade staged" + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return self.name + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + Returns: + A string containing the firmware version of the component + """ + return self.version + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + + Note: the firmware version will be read from image + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the available firmware version of the component + """ + avail_ver = None + valid, version = self._get_available_firmware_version(image_path) + if valid: + avail_ver = version.get(self.name) + if avail_ver: + avail_ver = avail_ver.get("version") + else: + print(version) + + return avail_ver if avail_ver else "NA" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + valid, version = self._get_available_firmware_version(image_path) + if valid: + avail_ver = version.get(self.name) + if avail_ver: + avail_ver = avail_ver.get("version") + if avail_ver and avail_ver != self.get_firmware_version(): + return "Cold reboot is required to perform firmware upgrade" + else: + print(version) + + return None + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + This API performs firmware installation only: this may/may not be the same as firmware update. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this must be done manually by user + + Note: in case immediate actions are required to complete the component firmware update + (e.g., reboot, power cycle, etc.) - will be done automatically by API and no return value provided + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + valid, version = self._get_available_firmware_version(image_path) + if valid: + avail_ver = version.get(self.name) + if avail_ver: + avail_ver = avail_ver.get("version") + if avail_ver and avail_ver != self.get_firmware_version(): + status, msg = self._stage_firmware_package(image_path) + print(msg) + if status: + return True + else: + return False + + print("INFO: Firmware version up-to-date") + return True + else: + print(version) + + return False + + def update_firmware(self, image_path): + """ + Updates firmware of the component + + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + + Args: + image_path: A string, path to firmware image + + Raises: + RuntimeError: update failed + """ + valid, version = self._get_available_firmware_version(image_path) + if valid: + avail_ver = version.get(self.name) + if avail_ver: + avail_ver = avail_ver.get("version") + if avail_ver and avail_ver != self.get_firmware_version(): + status, msg = self._stage_firmware_package(image_path) + if status: + print(msg) + subprocess.call("reboot") + else: + raise RuntimeError(msg) + + print("INFO: Firmware version up-to-date") + return None + else: + raise RuntimeError(version) + + def auto_update_firmware(self, image_path, boot_type): + """ + Updates firmware of the component + + This API performs firmware update automatically based on boot_type: it assumes firmware installation + and/or creating a loading task during the reboot, if needed, in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically during the reboot. + The loading task will be created by API. + + Args: + image_path: A string, path to firmware image + boot_type: A string, reboot type following the upgrade + - none/fast/warm/cold + + Returns: + Output: A return code + return_code: An integer number, status of component firmware auto-update + - return code of a positive number indicates successful auto-update + - status_installed = 1 + - status_updated = 2 + - status_scheduled = 3 + - return_code of a negative number indicates failed auto-update + - status_err_boot_type = -1 + - status_err_image = -2 + - status_err_unknown = -3 + + Raises: + RuntimeError: auto-update failure cause + """ + valid, version = self._get_available_firmware_version(image_path) + if valid: + avail_ver = version.get(self.name) + if avail_ver: + avail_ver = avail_ver.get("version") + if avail_ver and avail_ver != self.get_firmware_version(): + if boot_type != "cold": + return -1 + + status, msg = self._stage_firmware_package(image_path) + if status: + print(msg) + return 3 + else: + raise RuntimeError(msg) + + print("INFO: Firmware version up-to-date") + return 1 + else: + print(version) + return -2 diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/eeprom.py new file mode 100644 index 000000000000..2f9c50166687 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/eeprom.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +############################################################################# +# DellEmc Z9432F +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os.path + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self): + self.eeprom_path = None + for b in (0, 1): + f = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom'.format(b) + if os.path.exists(f): + self.eeprom_path = f + break + if self.eeprom_path is None: + return + super(Eeprom, self).__init__(self.eeprom_path, 0, '', True) + self.eeprom_tlv_dict = dict() + try: + self.eeprom_data = self.read_eeprom() + except: + self.eeprom_data = "N/A" + raise RuntimeError("Eeprom is not Programmed") + else: + eeprom = self.eeprom_data + + if not self.is_valid_tlvinfo_header(eeprom): + return + + total_length = (eeprom[9] << 8) | eeprom[10] + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_length + + while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: + if not self.is_valid_tlv(eeprom[tlv_index:]): + break + + tlv = eeprom[tlv_index:tlv_index + 2 + + eeprom[tlv_index + 1]] + code = "0x%02X" % tlv[0] + name, value = self.decoder(None, tlv) + + self.eeprom_tlv_dict[code] = value + if eeprom[tlv_index] == self._TLV_CODE_CRC_32: + break + + tlv_index += eeprom[tlv_index+1] + 2 + + def serial_number_str(self): + """ + Returns the serial number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERIAL_NUMBER) + if not is_valid: + return "N/A" + return results[2].decode('ascii') + + def base_mac_addr(self): + """ + Returns the base mac address found in the system EEPROM + """ + (is_valid, t) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_MAC_BASE) + if not is_valid or t[1] != 6: + return super(TlvInfoDecoder, self).switchaddrstr(e) + + return ":".join(["{:02x}".format(T) for T in t[2]]).upper() + + def modelstr(self): + """ + Returns the Model name + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PRODUCT_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def part_number_str(self): + """ + Returns the part number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PART_NUMBER) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def serial_str(self): + """ + Returns the servicetag number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERVICE_TAG) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def revision_str(self): + """ + Returns the device revision + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_LABEL_REVISION) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def system_eeprom_info(self): + """ + Returns a dictionary, where keys are the type code defined in + ONIE EEPROM format and values are their corresponding values + found in the system EEPROM. + """ + return self.eeprom_tlv_dict diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py new file mode 100644 index 000000000000..b95b4d070ae0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fans' information which are available in the platform. +# +######################################################################## +try: + from sonic_platform_base.fan_base import FanBase + from sonic_platform.ipmihelper import IpmiSensor, IpmiFru +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN1_MAX_SPEED_OFFSET = 71 +FAN2_MAX_SPEED_OFFSET = 73 +PSU_FAN_MAX_SPEED_OFFSET = 50 +FAN_DIRECTION_OFFSET = 69 +PSU_FAN_DIRECTION_OFFSET = 47 + +class Fan(FanBase): + """DellEMC Platform-specific Fan class""" + # { FAN-ID: { Sensor-Name: Sensor-ID } } + FAN_SENSOR_MAPPING = {1: {"Prsnt": 0x57, "State": 0x20, "Speed": 0x1c}, + 2: {"Prsnt": 0x57, "State": 0x21, "Speed": 0x1d}, + 3: {"Prsnt": 0x56, "State": 0x22, "Speed": 0x1a}, + 4: {"Prsnt": 0x56, "State": 0x23, "Speed": 0x1b}, + 5: {"Prsnt": 0x55, "State": 0x24, "Speed": 0x18}, + 6: {"Prsnt": 0x55, "State": 0x25, "Speed": 0x19}, + 7: {"Prsnt": 0x54, "State": 0x26, "Speed": 0x16}, + 8: {"Prsnt": 0x54, "State": 0x27, "Speed": 0x17}, + 9: {"Prsnt": 0x53, "State": 0x28, "Speed": 0x14}, + 10: {"Prsnt": 0x53, "State": 0x29, "Speed": 0x15}, + 11: {"Prsnt": 0x52, "State": 0x2a, "Speed": 0x12}, + 12: {"Prsnt": 0x52, "State": 0x2b, "Speed": 0x13}, + 13: {"Prsnt": 0x51, "State": 0x2c, "Speed": 0x10}, + 14: {"Prsnt": 0x51, "State": 0x2d, "Speed": 0x11}} + PSU_FAN_SENSOR_MAPPING = {1: {"State": 0x40, "Speed": 0x45}, + 2: {"State": 0x30, "Speed": 0x35}} + + # { FANTRAY-ID: FRU-ID } + FAN_FRU_MAPPING = {1: 3, 2: 4, 3: 5, 4: 6, 5: 7, 6: 8, 7: 9} + PSU_FRU_MAPPING = {1: 1, 2: 2} + + def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, dependency=None): + FanBase.__init__(self) + self.is_psu_fan = psu_fan + if not self.is_psu_fan: + # API index is starting from 0, DellEMC platform index is + # starting from 1 + self.fantrayindex = fantray_index + 1 + self.fanindex = fan_index + 1 + self.index = (self.fantrayindex - 1) * 2 + self.fanindex + self.prsnt_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Prsnt"], + is_discrete=True) + self.state_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["State"], + is_discrete=True) + self.speed_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Speed"]) + self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex]) + if self.fanindex == 1: + self.max_speed_offset = FAN1_MAX_SPEED_OFFSET + else: + self.max_speed_offset = FAN2_MAX_SPEED_OFFSET + self.fan_direction_offset = FAN_DIRECTION_OFFSET + else: + self.dependency = dependency + self.fanindex = fan_index + self.state_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["State"], + is_discrete=True) + self.speed_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["Speed"]) + self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) + self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET + self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET + #self.fan_dir_raw_cmd = "0x3a 0x0a {}".format(7+(fan_index-1)) + self.max_speed = 18000 + + def get_name(self): + """ + Retrieves the name of the device + Returns: + String: The name of the device + """ + if self.is_psu_fan: + return "PSU{} Fan".format(self.fanindex) + else: + return "FanTray{}-Fan{}".format(self.fantrayindex, self.fanindex) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + String: Part number of FAN + """ + if self.is_psu_fan: + return 'NA' + else: + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + String: Serial number of FAN + """ + if self.is_psu_fan: + return 'NA' + else: + return self.fru.get_board_serial() + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + presence = False + if self.is_psu_fan: + return self.dependency.get_presence() + else: + is_valid, state = self.prsnt_sensor.get_reading() + if is_valid: + if state & 0b1: + presence = True + return presence + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if state <= 1: + status = True + return status + + def get_direction(self): + """ + Retrieves the fan airfow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + In DellEMC platforms, + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + direction = [self.FAN_DIRECTION_EXHAUST, self.FAN_DIRECTION_INTAKE] + fan_status = self.get_status() + if not fan_status: + return None + is_valid, fan_direction = self.fru.get_fru_data(self.fan_direction_offset) + if is_valid: + return direction[fan_direction[0]] + return None + + def get_speed(self): + """ + Retrieves the speed of the fan + Returns: + int: percentage of the max fan speed + """ + if self.max_speed == 0: + self.max_speed = self.fru.get_fru_data(self.max_speed_offset, 2)[1] + self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] + is_valid, fan_speed = self.speed_sensor.get_reading() + if not is_valid or self.max_speed == 0: + return None + else: + speed = (100 * fan_speed)//self.max_speed + return speed + + def get_speed_rpm(self): + """ + Retrieves the speed of the fan + Returns: + int: percentage of the max fan speed + """ + is_valid, fan_speed = self.speed_sensor.get_reading() + return fan_speed if is_valid else None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fanindex + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by HW + # Return True to avoid thermalctld alarm + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..970c49f70019 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/fan_drawer.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan + from sonic_platform.ipmihelper import IpmiFru +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +Z9432F_FANS_PER_FANTRAY = 2 + + +class FanDrawer(FanDrawerBase): + """DellEMC Platform-specific Fan class""" + + FAN_FRU_MAPPING = { 1: 6, 2: 7, 3: 8, 4: 9, 5: 10, 6: 11, 7: 12 } + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 1-based in DellEMC platforms + self.fantrayindex = fantray_index + 1 + for i in range(Z9432F_FANS_PER_FANTRAY): + self._fan_list.append(Fan(fantray_index, i)) + self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex]) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex) + + def get_presence(self): + """ + Retrieves the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return self.fru.get_board_serial() + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + status = True + for fan in self.get_all_fans(): + status &= fan.get_status() + return status + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return True + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by BMC + # Return True to avoid thermalctld alarm + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 36.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/hwaccess.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/hwaccess.py new file mode 120000 index 000000000000..e8fa340a444d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/hwaccess.py @@ -0,0 +1 @@ +../../common/sonic_platform/hwaccess.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/platform.py new file mode 100644 index 000000000000..996d94cf5a6e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/platform.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """ + DELLEMC Platform-specific class + """ + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/psu.py new file mode 100644 index 000000000000..613e5b36107e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/psu.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs' information which are available in the platform +# +######################################################################## + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.ipmihelper import IpmiSensor, IpmiFru + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_TYPE_OFFSET = 48 + +class Psu(PsuBase): + """DellEMC Platform-specific PSU class""" + + # { PSU-ID: { Sensor-Name: Sensor-ID } } + SENSOR_MAPPING = {1: {"State": 0x40, "Current": 0x4a, + "Power": 0x4b, "Voltage": 0x49, + "InCurrent": 0x43, "InPower": 0x44, + "InVoltage": 0x42, "Temperature": 0x48 }, + 2: {"State": 0x30, "Current": 0x3a, + "Power": 0x3b, "Voltage": 0x39, + "InCurrent": 0x33, "InPower": 0x34, + "InVoltage": 0x32, "Temperature": 0x38 } } + # ( PSU-ID: FRU-ID } + FRU_MAPPING = {1: 1, 2: 2} + + def __init__(self, psu_index): + PsuBase.__init__(self) + # PSU is 1-based in DellEMC platforms + self.index = psu_index + 1 + self.state_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["State"], + is_discrete=True) + self.voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Voltage"]) + self.current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Current"]) + self.power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Power"]) + self.input_voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InVoltage"]) + self.input_current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InCurrent"]) + self.input_power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InPower"]) + self.temp_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Temperature"]) + self.psu_type_offset = PSU_TYPE_OFFSET + self.fru = IpmiFru(self.FRU_MAPPING[self.index]) + + self._fan_list.append(Fan(fan_index=self.index, psu_fan=True, + dependency=self)) + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return "PSU{}".format(self.index) + + def get_presence(self): + """ + Retrieves the presence of the Power Supply Unit (PSU) + + Returns: + bool: True if PSU is present, False if not + """ + presence = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if state & 0b1: + presence = True + + return presence + + def get_model(self): + """ + Retrieves the part number of the PSU + + Returns: + string: Part number of PSU + """ + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + return self.fru.get_board_serial() + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + serial = self.fru.get_board_serial() + if serial != "NA" and len(serial) == 23: + return serial[-3:] + else: + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the PSU + + Returns: + bool: True if PSU is operating properly, False if not + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if state <= 0x01: + status = True + + return status + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + is_valid, voltage = self.voltage_sensor.get_reading() + if not is_valid: + return None + + return float(voltage) + + def get_voltage_low_threshold(self): + """ + Returns PSU low threshold in Volts + """ + is_valid, low_threshold = self.voltage_sensor.get_threshold("LowerCritical") + if not is_valid: + low_threshold = 11.4 + low_threshold = "{:.2f}".format(low_threshold) + + return float(low_threshold) + + + def get_voltage_high_threshold(self): + """ + Returns PSU high threshold in Volts + """ + is_valid, high_threshold = self.voltage_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 12.6 + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to + nearest thousandth of one degree Celsius, e.g. 30.125 + """ + is_valid, temperature = self.temp_sensor.get_reading() + if not is_valid: + temperature = 0 + + return float(temperature) + + def get_temperature_high_threshold(self): + """ + Returns the high temperature threshold for PSU in Celsius + """ + is_valid, high_threshold = self.temp_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 113 + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) + + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + is_valid, current = self.current_sensor.get_reading() + if not is_valid: + return None + + return float(current) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + is_valid, power = self.power_sensor.get_reading() + if not is_valid: + return None + + return float(power) + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + is_valid, power = self.power_sensor.get_threshold("UpperCritical") + if not is_valid: + return None + + return float(power) + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and + passed all its internal self-tests, False if not. + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if state == 0x01: + status = True + + return status + + def get_mfr_id(self): + """ + Retrives the Manufacturer Id of PSU + + Returns: + A string, the manunfacturer id. + """ + return self.fru.get_board_mfr_id() + + def get_type(self): + """ + Retrives the Power Type of PSU + + Returns : + A string, PSU power type + """ + psu_type = ['AC', 'DC'] + is_valid , ct_psu_type = self.fru.get_fru_data(self.psu_type_offset) + if is_valid: + return psu_type[ct_psu_type[0]] + return None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py new file mode 100644 index 000000000000..eaff8e9b1d44 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py @@ -0,0 +1,390 @@ +#!/usr/bin/env python +""" +############################################################################# +# DELLEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# +""" + +try: + import os + import time + import subprocess + import mmap + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + +except ImportError as err: + raise ImportError(str(err) + "- required module not found") + +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + +SFP_TYPE_LIST = [ + '0x3' # SFP/SFP+/SFP28 and later +] +QSFP_TYPE_LIST = [ + '0x0c', # QSFP + '0x0d', # QSFP+ or later + '0x11' # QSFP28 or later +] +QSFP_DD_TYPE_LIST = [ + '0x18' #QSFP_DD Type +] + +OSFP_TYPE_LIST = [ + '0x19' # OSFP 8X Type +] + +class Sfp(SfpOptoeBase): + """ + DELLEMC Platform-specific Sfp class + """ + BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0" + + def __init__(self, index, sfp_type, eeprom_path): + """ + SFP Dunder init + """ + SfpOptoeBase.__init__(self) + self.index = index + self.eeprom_path = eeprom_path + self.sfp_eeprom_path = eeprom_path + #port_type is the native port type and sfp_type is the transceiver type + #sfp_type will be detected in get_transceiver_info + self.port_type = sfp_type + self.sfp_type = self.port_type + self._initialize_media(delay=False) + + def get_eeprom_path(self): + """ + Returns SFP eeprom path + """ + return self.eeprom_path + + def get_name(self): + """ + Returns native transceiver type + """ + return "QSFP-DD Double Density 8X Pluggable Transceiver" if self.index < 33 else "SFP/SFP+/SFP28" + + @staticmethod + def pci_mem_read(mem, offset): + """ + Returns the desired byte in PCI memory space + """ + mem.seek(offset) + return mem.read_byte() + + @staticmethod + def pci_mem_write(mem, offset, data): + """ + Writes the desired byte in PCI memory space + """ + mem.seek(offset) + # print "data to write:%x"%data + mem.write_byte(data) + + def pci_set_value(self, resource, val, offset): + """ + Sets the value in PCI memory space + """ + filed = os.open(resource, os.O_RDWR) + mem = mmap.mmap(filed, 0) + self.pci_mem_write(mem, offset, val) + mem.close() + os.close(filed) + return val + + def pci_get_value(self, resource, offset): + """ + Retrieves the value from PCI memory space + """ + filed = os.open(resource, os.O_RDWR) + mem = mmap.mmap(filed, 0) + val = self.pci_mem_read(mem, offset) + mem.close() + os.close(filed) + return val + + def _initialize_media(self, delay=False): + """ + Initialize the media type and eeprom driver for SFP + """ + if delay: + time.sleep(1) + self._xcvr_api = None + self.get_xcvr_api() + + self.set_media_type() + self.reinit_sfp_driver() + + def get_presence(self): + """ + Retrieves the presence of the sfp + Returns : True if sfp is present and false if it is absent + """ + # Check for invalid port_num + mask = {'QSFP_DD' : (1 << 4), 'SFP' : (1 << 0)} + # Port offset starts with 0x4004 + port_offset = 16388 + ((self.index-1) * 16) + + try: + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + # ModPrsL is active low + if reg_value & mask[self.port_type] == 0: + return True + except ValueError: + pass + + return False + + def get_reset_status(self): + """ + Retrives the reset status of SFP + """ + reset_status = False + try: + if self.port_type == 'QSFP_DD': + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + + # Mask off 4th bit for reset status + mask = (1 << 4) + reset_status = not (reg_value & mask) + except ValueError: + pass + + return reset_status + + def get_lpmode(self): + """ + Retrieves the lpmode(low power mode) of this SFP + """ + lpmode_state = False + try: + if self.sfp_type == 'QSFP_DD': + return SfpOptoeBase.get_lpmode(self) + else: + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + + # Mask off 6th bit for lpmode + mask = (1 << 6) + + lpmode_state = (reg_value & mask) + except ValueError: + pass + return bool(lpmode_state) + + def reset(self): + """ + Reset the SFP and returns all user settings to their default state + """ + try: + if self.port_type == 'QSFP_DD': + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + + # Mask off 4th bit for reset + mask = (1 << 4) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + + # Sleep 1 second to allow it to settle + time.sleep(1) + + reg_value = reg_value | mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + else: + return False + except ValueError: + return False + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode(low power mode) of this SFP + """ + try: + if self.sfp_type == 'QSFP_DD': + return SfpOptoeBase.set_lpmode(self, lpmode) + else: + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + + # Mask off 6th bit for lowpower mode + mask = (1 << 6) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + except ValueError: + return False + return True + + def get_intl_state(self): + """ + Sets the intL (interrupt; active low) pin of this SFP + """ + intl_state = True + try: + if self.port_type == 'QSFP_DD': + # Port offset starts with 0x4004 + port_offset = 16388 + ((self.index-1) * 16) + + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) + + # Mask off 4th bit for intL + mask = (1 << 4) + + intl_state = (reg_value & mask) + except ValueError: + pass + return intl_state + + def set_media_type(self): + """ + Reads optic eeprom byte to determine media type inserted + """ + eeprom_raw = [] + eeprom_raw = self._xcvr_api_factory._get_id() + if eeprom_raw is not None: + eeprom_raw = hex(eeprom_raw) + if eeprom_raw in SFP_TYPE_LIST: + self.sfp_type = 'SFP' + elif eeprom_raw in QSFP_TYPE_LIST: + self.sfp_type = 'QSFP' + elif eeprom_raw in QSFP_DD_TYPE_LIST: + self.sfp_type = 'QSFP_DD' + else: + #Set native port type if EEPROM type is not recognized/readable + self.sfp_type = self.port_type + else: + self.sfp_type = self.port_type + + return self.sfp_type + + def reinit_sfp_driver(self): + """ + Changes the driver based on media type detected + """ + + i2c_bus = self.sfp_eeprom_path[27:].split('/')[0] + del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(i2c_bus) + new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(i2c_bus) + driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(i2c_bus) + delete_device = "echo 0x50 >" + del_sfp_path + + if not os.path.isfile(driver_path): + print(driver_path, "does not exist") + return False + + try: + with os.fdopen(os.open(driver_path, os.O_RDONLY)) as filed: + driver_name = filed.read() + driver_name = driver_name.rstrip('\r\n') + driver_name = driver_name.lstrip(" ") + + #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. + if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe2 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe1 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe3 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + + except IOError as err: + print("Error: Unable to open file: %s" %str(err)) + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + @staticmethod + def is_replaceable(): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/thermal.py new file mode 100644 index 000000000000..6503787af83b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/thermal.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC Z9432F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## + + +try: + from sonic_platform_base.thermal_base import ThermalBase + from sonic_platform.ipmihelper import IpmiSensor +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """DellEMC Platform-specific Thermal class""" + + # [ Sensor-Name, Sensor-ID, high threshold, high critical_threshold ] + # TBD : + # high thershold/hich crit threshold + # need to be modified as True in case if it is supported + # + SENSOR_MAPPING = [ + ['CPU Temp', 0xd, True, True], + ['FAN Right Temp', 0x0, True, True], + ['NPU Front Temp', 0x1, True, True], + ['NPU Rear Temp', 0x3, True, True], + ['NPU Temp', 0x8, True, True], + ['PSU1 AF Temp', 0x46, False, True], + ['PSU1 Mid Temp', 0x47, False, True], + ['PSU1 Rear Temp', 0x48, False, True], + ['PSU2 AF Temp', 0x36, False, True], + ['PSU2 Mid Temp', 0x37, False, True], + ['PSU2 Rear Temp', 0x38, False, True], + ['PT Left Temp', 0x2, True, True], + ['PT Right Temp', 0x4, True, True] + ] + + def __init__(self, thermal_index=0): + ThermalBase.__init__(self) + self.index = thermal_index + 1 + self.sensor = IpmiSensor(self.SENSOR_MAPPING[self.index - 1][1]) + self.has_high_threshold = self.SENSOR_MAPPING[self.index - 1][2] + self.has_high_crit_threshold = self.SENSOR_MAPPING[self.index - 1][3] + + def get_name(self): + """ + Retrieves the name of the thermal + + Returns: + string: The name of the thermal + """ + return self.SENSOR_MAPPING[self.index - 1][0] + + def get_presence(self): + """ + Retrieves the presence of the thermal + + Returns: + bool: True if thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the Thermal + + Returns: + string: Model/part number of Thermal + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the Thermal + + Returns: + string: Serial number of Thermal + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the thermal + + Returns: + A boolean value, True if thermal is operating properly, + False if not + """ + return True + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to + nearest thousandth of one degree Celsius, e.g. 30.125 + """ + is_valid, temperature = self.sensor.get_reading() + if not is_valid: + temperature = 0 + + return float(temperature) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + if self.has_high_threshold: + is_valid, high_threshold = self.sensor.get_threshold("UpperNonCritical") + if is_valid: + return float(high_threshold) + + return super(Thermal, self).get_high_threshold() + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + return 0.0 + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + Returns: + A float number, the high critical threshold temperature of + thermal in Celsius up to nearest thousandth of one degree + Celsius, e.g. 30.125 + """ + if self.has_high_crit_threshold: + is_valid, high_crit_threshold = self.sensor.get_threshold("UpperCritical") + if is_valid: + return float(high_crit_threshold) + + return super(Thermal, self).get_high_critical_threshold() + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/watchdog.py new file mode 100644 index 000000000000..0efc925a9259 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/watchdog.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python + +######################################################################## +# +# DELLEMC Z9432F +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + import ctypes + import subprocess + import syslog + import sonic_platform.component as Component + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class _timespec(ctypes.Structure): + _fields_ = [ + ('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long) + ] + + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240] + + armed_time = 0 + timeout = 0 + CLOCK_MONOTONIC = 1 + + def __init__(self): + self._librt = ctypes.CDLL('librt.so.1', use_errno=True) + self._clock_gettime = self._librt.clock_gettime + self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)] + + def _get_command_result(self, cmdline): + try: + proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + result = stdout.rstrip('\n'.encode()) + except OSError: + result = None + + return result + + def _get_reg_val(self): + # 0x31 = CPLD I2C Base Address + # 0x07 = Watchdog Function Register + value = self._get_command_result("/usr/sbin/i2cget -y 601 0x31 0x07") + if not value: + return None + else: + return int(value, 16) + + def _set_reg_val(self,val): + # 0x31 = CPLD I2C Base Address + # 0x07 = Watchdog Function Register + value = self._get_command_result("/usr/sbin/i2cset -y 601 0x31 0x07 %s" + % (val)) + return value + + def _get_time(self): + """ + To get clock monotonic time + """ + ts = _timespec() + if self._clock_gettime(self.CLOCK_MONOTONIC, ctypes.pointer(ts)) != 0: + self._errno = ctypes.get_errno() + return 0 + return ts.tv_sec + ts.tv_nsec * 1e-9 + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + timer_offset = -1 + for key,timer_seconds in enumerate(self.TIMERS): + if seconds > 0 and seconds <= timer_seconds: + timer_offset = key + seconds = timer_seconds + break + + if timer_offset == -1: + return -1 + + cpld_version = Component.get_cpld0_version() + wd_enabled_version = "0.8" + + if cpld_version < wd_enabled_version: + syslog.syslog(syslog.LOG_ERR, + 'Older System CPLD ver, Update to 0.8 to support watchdog ') + return -1 + + # Extracting 5th to 8th bits for WD timer values + reg_val = self._get_reg_val() + wd_timer_offset = (reg_val >> 4) & 0xf + + if wd_timer_offset != timer_offset: + # Setting 5th to 7th bits + # value from timer_offset + self.disarm() + self._set_reg_val((reg_val & 0x07) | (timer_offset << 4)) + + if self.is_armed(): + # Setting last bit to WD Timer punch + # Last bit = WD Timer punch + self._set_reg_val(reg_val & 0xFE) + + self.armed_time = self._get_time() + self.timeout = seconds + return seconds + else: + # Setting 4th bit to enable WD + # 4th bit = Enable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val | 0x8) + + self.armed_time = self._get_time() + self.timeout = seconds + return seconds + + def disarm(self): + """ + Disarm the hardware watchdog + + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + if self.is_armed(): + # Setting 4th bit to disable WD + # 4th bit = Disable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val & 0xF7) + + self.armed_time = 0 + self.timeout = 0 + return True + + return False + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + + Returns: + A boolean, True if watchdog is armed, False if not + """ + + # Extracting 4th bit to get WD Enable/Disable status + # 0 - Disabled WD + # 1 - Enabled WD + reg_val = self._get_reg_val() + wd_offset = (reg_val >> 3) & 1 + + return bool(wd_offset) + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + + Z9432F doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + if not self.is_armed(): + return -1 + + if self.armed_time > 0 and self.timeout != 0: + cur_time = self._get_time() + + if cur_time <= 0: + return 0 + + diff_time = int(cur_time - self.armed_time) + + if diff_time > self.timeout: + return self.timeout + else: + return self.timeout - diff_time + + return 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/systemd/platform-modules-z9432f.service b/platform/broadcom/sonic-platform-modules-dell/z9432f/systemd/platform-modules-z9432f.service new file mode 100644 index 000000000000..8ae1d6526445 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/systemd/platform-modules-z9432f.service @@ -0,0 +1,14 @@ +[Unit] +Description=Dell Z9432F Platform modules +Before=pmon.service +After=platform-init.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/z9432f_platform.sh init +ExecStop=/usr/local/bin/z9432f_platform.sh deinit +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target From 762fad624fecbc37b6caed7aedca1d7fe32cb4c0 Mon Sep 17 00:00:00 2001 From: Taras Keryk Date: Thu, 16 Jun 2022 02:31:40 +0300 Subject: [PATCH 416/817] [BFN] Fixed settings for BMC interface (#10940) * Fixed ipv6 settings for BMC interface Signed-off-by: Taras Keryk * Added ip6 setting Signed-off-by: Taras Keryk --- .../configs/network/interfaces.d/usb0 | 1 + .../configs/network/interfaces.d/usb0 | 1 + .../sonic-platform-modules-bfn/configs/network/interfaces.d/usb0 | 1 + 3 files changed, 3 insertions(+) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/configs/network/interfaces.d/usb0 b/platform/barefoot/sonic-platform-modules-bfn-montara/configs/network/interfaces.d/usb0 index f1dd054cc6f6..03547eafea08 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/configs/network/interfaces.d/usb0 +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/configs/network/interfaces.d/usb0 @@ -2,4 +2,5 @@ auto usb0 allow-hotplug usb0 iface usb0 inet6 +up sysctl net.ipv6.neigh.usb0.base_reachable_time_ms=30000 up ifconfig usb0 txqueuelen 64 diff --git a/platform/barefoot/sonic-platform-modules-bfn-newport/configs/network/interfaces.d/usb0 b/platform/barefoot/sonic-platform-modules-bfn-newport/configs/network/interfaces.d/usb0 index f1dd054cc6f6..03547eafea08 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-newport/configs/network/interfaces.d/usb0 +++ b/platform/barefoot/sonic-platform-modules-bfn-newport/configs/network/interfaces.d/usb0 @@ -2,4 +2,5 @@ auto usb0 allow-hotplug usb0 iface usb0 inet6 +up sysctl net.ipv6.neigh.usb0.base_reachable_time_ms=30000 up ifconfig usb0 txqueuelen 64 diff --git a/platform/barefoot/sonic-platform-modules-bfn/configs/network/interfaces.d/usb0 b/platform/barefoot/sonic-platform-modules-bfn/configs/network/interfaces.d/usb0 index f1dd054cc6f6..03547eafea08 100644 --- a/platform/barefoot/sonic-platform-modules-bfn/configs/network/interfaces.d/usb0 +++ b/platform/barefoot/sonic-platform-modules-bfn/configs/network/interfaces.d/usb0 @@ -2,4 +2,5 @@ auto usb0 allow-hotplug usb0 iface usb0 inet6 +up sysctl net.ipv6.neigh.usb0.base_reachable_time_ms=30000 up ifconfig usb0 txqueuelen 64 From b2bc90e34b3c20f0b6e0ae8f73ae7dbfa9de6bc2 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 16 Jun 2022 07:33:08 +0800 Subject: [PATCH 417/817] add flag skip_xcvrd_cmis_mgr to skip cmis task on Nvidia platform (#11120) Signed-off-by: Kebo Liu --- .../mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json b/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json index 86910af29e89..dbc19c9baabf 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json @@ -1,6 +1,7 @@ { "skip_ledd": true, "skip_fancontrol": true, - "delay_xcvrd": true + "delay_xcvrd": true, + "skip_xcvrd_cmis_mgr": true } From e2078627c72e70c20c97db6c4fe3c322baeb5279 Mon Sep 17 00:00:00 2001 From: zitingguo-ms <736034564@qq.com> Date: Thu, 16 Jun 2022 08:29:45 +0800 Subject: [PATCH 418/817] [AN/LT][Fix bug]:enable phy_an_lt_msft attribute on some platforms (#11147) --- .../Arista-7050CX3-32S-C32/config.bcm.j2 | 1 + .../Arista-7050CX3-32S-D48C8/config.bcm.j2 | 1 + .../Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm | 1 + .../th-a7060-cx32s-8x100G+48x50G.config.bcm | 1 + .../th-a7060-cx32s-8x100G+24x40G.config.bcm | 1 + .../Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm | 1 + .../Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm | 1 + .../th-a7060-cx32s-8x100G+96x25G.config.bcm | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 | 1 + .../x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 | 1 + .../Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm | 1 + .../Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm | 1 + .../th-seastone-dx010-48x50G+8x100G.config.bcm | 1 + src/sonic-device-data/tests/permitted_list | 1 + 15 files changed, 15 insertions(+) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 index 89a55175edc8..3f81bfcc9951 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 @@ -527,3 +527,4 @@ serdes_preemphasis_123=0x14410a serdes_preemphasis_127=0x14410a serdes_driver_current_130=0xe serdes_preemphasis_130=0x102804 +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 index 9f523e506660..da09c09b167e 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 @@ -570,3 +570,4 @@ serdes_preemphasis_123=0x85804 serdes_preemphasis_125=0x85804 serdes_preemphasis_127=0x85804 serdes_preemphasis_129=0x85804 +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm index 63846c22b3fe..f082229dc5e4 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm @@ -450,3 +450,4 @@ serdes_driver_current_109=0xa serdes_preemphasis_109=0x284008 mmu_init_config="MSFT-TH-Tier1" +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm index f7460e8b23f7..932fb369df13 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm @@ -551,3 +551,4 @@ serdes_driver_current_115=0xa serdes_preemphasis_115=0x284008 mmu_init_config="MSFT-TH-Tier0" +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm index 2be9e3187ea8..3d9d632178e6 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm @@ -450,3 +450,4 @@ serdes_driver_current_109=0x4 serdes_preemphasis_109=0x145c00 mmu_init_config="MSFT-TH-Tier1" +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm index e82627d6086a..568457ac6e79 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm @@ -448,3 +448,4 @@ serdes_driver_current_109=0x4 serdes_preemphasis_109=0x145c00 mmu_init_config="MSFT-TH-Tier0" +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm index 90061ce680c8..9b0dc219307f 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm @@ -448,3 +448,4 @@ serdes_driver_current_109=0x4 serdes_preemphasis_109=0x145c00 mmu_init_config="MSFT-TH-Tier1" +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm index 6827156a1c7e..a9be3a5cae5d 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm @@ -784,3 +784,4 @@ serdes_driver_current_126=0xa serdes_preemphasis_126=0x284008 serdes_driver_current_127=0xa serdes_preemphasis_127=0x284008 +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 index 90d57545c099..7ad0311ab888 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/config.bcm.j2 @@ -1041,3 +1041,4 @@ serdes_preemphasis_117=0x133c06 {{ mmu_sock }} {{ IPinIP_sock }} +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 index 1221cdc6691e..642b36312d5c 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/config.bcm.j2 @@ -952,3 +952,4 @@ serdes_preemphasis_131=0x580c mmu_init_config="MSFT-TH2-Tier0" {{ IPinIP_sock }} +phy_an_lt_msft=1 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 index 78194a75830e..5ff359e06b72 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/config.bcm.j2 @@ -1040,3 +1040,4 @@ serdes_preemphasis_117=0x105004 {{ mmu_sock }} {{ IPinIP_sock }} +phy_an_lt_msft=1 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm index f3a381563349..e5e60d51b326 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm @@ -380,3 +380,4 @@ phy_xaui_tx_polarity_flip_130=0x0006 phy_xaui_rx_polarity_flip_130=0x0000 mmu_init_config="MSFT-TH-Tier0" +phy_an_lt_msft=1 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm index c3c755f4e446..3ff49d672fc2 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm @@ -700,3 +700,4 @@ serdes_preemphasis_lane2_130=0x2b4104 serdes_preemphasis_lane3_130=0x2b4104 mmu_init_config="MSFT-TH-Tier1" +phy_an_lt_msft=1 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm index 2cb58079f423..787cce0d986c 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm @@ -652,3 +652,4 @@ serdes_preemphasis_lane1_5=0x244a02 serdes_preemphasis_lane2_5=0x244a02 serdes_preemphasis_lane3_5=0x254902 +phy_an_lt_msft=1 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index e1a651569b84..74f24bc537e0 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -313,3 +313,4 @@ port_gmii_mode phy_force_firmware_load phy_pcs_repeater l3_alpm_hit_skip +phy_an_lt_msft From a035b2c3cd111b4e219c490bd99b83384189e7a7 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:29:38 +0800 Subject: [PATCH 419/817] Update YANG for PORT_QOS_MAP to support switch level mapping (#11089) Signed-off-by: bingwang Co-authored-by: Neetha John --- .../tests/yang_model_tests/tests/qosmaps.json | 6 +++- .../tests_config/qosmaps.json | 33 +++++++++++++++++++ .../yang-models/sonic-port-qos-map.yang | 15 ++++++--- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json index 90344d8f119d..0528e0e3fe89 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json @@ -86,6 +86,10 @@ "PORT_QOS_MAP_APPLY_MAPS": { "desc": "Configure qos maps on port." }, + + "PORT_QOS_MAP_APPLY_MAP_TO_GLOBAL": { + "desc": "Configure qos maps on switch level." + }, "PORT_QOS_MAP_APPLY_NON_EXISTS_MAPS": { "desc": "Configure non exists qos maps on port.", @@ -94,7 +98,7 @@ "PORT_QOS_MAP_APPLY_NON_EXISTS_PORT": { "desc": "Configure port qos map entry on non exists port.", - "eStrKey": "LeafRef" + "eStr": "Invalid value" }, "PORT_QOS_MAP_APPLY_INVALID_PFC": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json index 991675bc3979..f5e5701938c3 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json @@ -629,6 +629,39 @@ } }, + "PORT_QOS_MAP_APPLY_MAP_TO_GLOBAL": { + "sonic-dscp-tc-map:sonic-dscp-tc-map": { + "sonic-dscp-tc-map:DSCP_TO_TC_MAP": { + "DSCP_TO_TC_MAP_LIST": [ + { + "name": "map1", + "DSCP_TO_TC_MAP": [ + { + "dscp": "1", + "tc": "1" + }, + { + "dscp":"2", + "tc":"2" + } + ] + } + ] + } + }, + + "sonic-port-qos-map:sonic-port-qos-map": { + "sonic-port-qos-map:PORT_QOS_MAP": { + "PORT_QOS_MAP_LIST": [ + { + "ifname": "global", + "dscp_to_tc_map": "map1" + } + ] + } + } + }, + "PORT_QOS_MAP_APPLY_NON_EXISTS_MAPS": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang index 8f4c2d88f4ed..53ef7f48f5b7 100644 --- a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang @@ -56,11 +56,16 @@ module sonic-port-qos-map { key "ifname"; leaf ifname { - type leafref { - path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:name"; - } - description - "Reference of port on which QOS MAPS to be configured."; + type union { + type string { + pattern "global"; + } + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:name"; + } + } + description + "Reference of port or global on which QOS MAPS to be configured."; } leaf tc_to_pg_map { From 1dbfc66cef9db195389fef3fdaf5e25c508d5fb6 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 16 Jun 2022 13:27:07 +0800 Subject: [PATCH 420/817] [SSHD] Enable SSHD keepalive timeout feature (#11115) #### Why I did it SSHD keepalive timeout feature not enabled on sonic. #### How I did it Enable SSHD keepalive timeout feature by set ClientAliveCountMax to 1. #### How to verify it Pass All E2E test case. Manually test with following steps: 1. Change config and restart sshd 2. Connect a ssh with -vvv option to show debug message 3. Get running ssh by command and stop it: ``` azureuser@liuh-dev-vm-02:~$ ps -auxww | grep vvv azureus+ 1614153 0.0 0.0 12244 6004 pts/1S+ 15:48 0:00 ssh admin@10.250.0.101 -vvv azureus+ 1615570 0.0 0.0 8168 2424 pts/3S+ 15:49 0:00 grep --color=auto vvv azureuser@liuh-dev-vm-02:~$ kill -Stop 1614153 ``` 4. Check TCP status from server side with ss command: https://man7.org/linux/man-pages/man8/ss.8.html ``` admin@vlab-01:~$ ss | grep -i ssh tcp ESTAB 0 010.250.0.101:ssh 10.250.0.1:58150 tcp FIN-WAIT-2 0 010.250.0.101:ssh 10.250.0.1:58164 tcp ESTAB 0 010.250.0.101:ssh 10.250.0.1:57978 ``` FIN-WAIT-2 means server already terminate the connection and wait for client response: https://kb.iu.edu/d/ajmi . FIN-WAIT-2 <-- <-- CLOSE-WAIT 5. Check again later will show the session been complete closed: ``` admin@vlab-01:~$ ss | grep -i ssh tcp ESTAB 0 010.250.0.101:ssh 10.250.0.1:58150 tcp ESTAB 0 010.250.0.101:ssh 10.250.0.1:57978 ``` --- build_debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 25f039c90697..dbf39949c329 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -422,7 +422,7 @@ rm /files/etc/ssh/sshd_config/ClientAliveCountMax touch /files/etc/ssh/sshd_config/EmptyLineHack rename /files/etc/ssh/sshd_config/EmptyLineHack "" set /files/etc/ssh/sshd_config/ClientAliveInterval 900 -set /files/etc/ssh/sshd_config/ClientAliveCountMax 0 +set /files/etc/ssh/sshd_config/ClientAliveCountMax 1 ins #comment before /files/etc/ssh/sshd_config/ClientAliveInterval set /files/etc/ssh/sshd_config/#comment[following-sibling::*[1][self::ClientAliveInterval]] "Close inactive client sessions after 15 minutes" save From b6811a58cf59d9cbf8dbe55051a4cec746a9f464 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 16 Jun 2022 14:13:01 +0800 Subject: [PATCH 421/817] [Build] Improve docker build performance (#11111) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why I did it The docker storage driver vfs is not a good option for build, it uses the “deep copy” when building a new layer, leads to lower performance and more space used on disk than other storage drivers. A better docker storage driver is the default one overlay2, it is a modern union filesystem. --- .azure-pipelines/template-variables.yml | 1 + Makefile.work | 8 ++++++++ rules/config | 3 +++ slave.mk | 1 + 4 files changed, 13 insertions(+) diff --git a/.azure-pipelines/template-variables.yml b/.azure-pipelines/template-variables.yml index 9f192d35bd5e..462a417c0173 100644 --- a/.azure-pipelines/template-variables.yml +++ b/.azure-pipelines/template-variables.yml @@ -1,3 +1,4 @@ variables: DEFAULT_CONTAINER_REGISTRY: 'publicmirror.azurecr.io' COMMON_LIB_BUILD_ENVS: 'bullseye' + SONIC_SLAVE_DOCKER_DRIVER: 'overlay2' diff --git a/Makefile.work b/Makefile.work index ba01e27fd02d..0428c3cbc553 100644 --- a/Makefile.work +++ b/Makefile.work @@ -137,6 +137,7 @@ MULTIARCH_QEMU_ENVIRON = y endif endif SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER_LC) +DOCKER_ROOT = $(PWD)/fsroot.docker.$(BLDENV) # Support FIPS feature, armhf not supported yet ifeq ($(PLATFORM_ARCH),armhf) @@ -181,6 +182,7 @@ endif DOCKER_LOCKFILE_SAVE := $(DOCKER_LOCKDIR)/docker_save.lock $(shell mkdir -m 0777 -p $(DOCKER_LOCKDIR)) $(shell [ -f $(DOCKER_LOCKFILE_SAVE) ] || (touch $(DOCKER_LOCKFILE_SAVE) && chmod 0777 $(DOCKER_LOCKFILE_SAVE))) +$(shell sudo rm -rf $(DOCKER_ROOT) && mkdir -p $(DOCKER_ROOT)) ifeq ($(DOCKER_BUILDER_MOUNT),) override DOCKER_BUILDER_MOUNT := "$(PWD):/sonic" @@ -200,6 +202,11 @@ DOCKER_RUN := docker run --rm=true --privileged --init \ -i$(shell { if [ -t 0 ]; then echo t; fi }) \ $(SONIC_BUILDER_EXTRA_CMDLINE) +# Mount the $(DOCKER_ROOT) to /var/lib/docker in the slave container, the overlay fs is not supported as dockerd root folder. +ifneq ($(filter $(SONIC_SLAVE_DOCKER_DRIVER),overlay overlay2),) + DOCKER_RUN += -v $(DOCKER_ROOT):/var/lib/docker +endif + ifneq ($(DOCKER_BUILDER_USER_MOUNT),) DOCKER_RUN += $(foreach mount,$(subst $(comma), ,$(DOCKER_BUILDER_USER_MOUNT)), $(addprefix -v , $(mount))) endif @@ -376,6 +383,7 @@ SONIC_BUILD_INSTRUCTION := make \ ENABLE_ASAN=$(ENABLE_ASAN) \ ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) \ ENABLE_FIPS=$(ENABLE_FIPS) \ + SONIC_SLAVE_DOCKER_DRIVER=$(SONIC_SLAVE_DOCKER_DRIVER) \ $(SONIC_OVERRIDE_BUILD_VARS) .PHONY: sonic-slave-build sonic-slave-bash init reset diff --git a/rules/config b/rules/config index 415aa795e767..0fdbc2b59e9b 100644 --- a/rules/config +++ b/rules/config @@ -229,3 +229,6 @@ DEFAULT_CONTAINER_REGISTRY ?= # ENABLE_FIPS - support FIPS flag, if enabled, no additional config requred for the image to support FIPS ENABLE_FIPS_FEATURE ?= y ENABLE_FIPS ?= n + +# SONIC_SLAVE_DOCKER_DRIVER - set the sonic slave docker storage driver +SONIC_SLAVE_DOCKER_DRIVER ?= vfs diff --git a/slave.mk b/slave.mk index 0924eab54d5c..9263bf8bede4 100644 --- a/slave.mk +++ b/slave.mk @@ -791,6 +791,7 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # start docker daemon docker-start : + @sudo sed -i 's/--storage-driver=vfs/--storage-driver=$(SONIC_SLAVE_DOCKER_DRIVER)/' /etc/default/docker @sudo sed -i -e '/http_proxy/d' -e '/https_proxy/d' /etc/default/docker @sudo bash -c "{ echo \"export http_proxy=$$http_proxy\"; \ echo \"export https_proxy=$$https_proxy\"; \ From 1474ad76d89d051a9fef5dca1ebff16bdf797974 Mon Sep 17 00:00:00 2001 From: shlomibitton <60430976+shlomibitton@users.noreply.github.com> Date: Thu, 16 Jun 2022 12:15:09 +0300 Subject: [PATCH 422/817] [Mellanox] [pmon] Fix for PMON service not starting when restarting SWSS service after fast/warm reboot (#10901) - Why I did it Recent change to delay PMON service in case of fast/warm reboot introduce an issue when restarting only SWSS service after fast/warm reboot for Nvidia platform. Since the timer is triggered only when the system boot, in a scenario when the system is after a fast/warm reboot and the user restart SWSS service, as part of syncd.sh script, PMON service will stop but the timer will not start again. - How I did it On syncd.sh script, in case of fast/warm indication, check if pmon.timer is running. If it is running it means we are at the first boot and continue normally. If it is not running, meaning the service was restarted, start the timer to keep the system behavior consistent. - How to verify it Run fast/warm reboot. service swss restart. Observe PMON service starting. Signed-off-by: Shlomi Bitton --- files/scripts/syncd.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 628609e0a5f0..065574e501bf 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -48,7 +48,12 @@ function waitplatform() { BOOT_TYPE=`getBootType` if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then - debug "PMON service is delayed by a timer for better fast/warm boot performance" + PMON_TIMER_STATUS=$(systemctl is-active pmon.timer) + if [[ x"$PMON_TIMER_STATUS" = x"inactive" ]]; then + systemctl start pmon.timer + else + debug "PMON service is delayed by a timer for better fast/warm boot performance" + fi else debug "Starting pmon service..." /bin/systemctl start pmon From 30bfed92fddc06e30c9735d668f0ca080c0565bb Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 16 Jun 2022 09:42:10 -0700 Subject: [PATCH 423/817] [Arista] Add configuration files for 7050X4-32S platform (#10799) Add most configuration files for the DCS-7050PX4-32S and DCS-7050DX4-32S. This review only contains platform configuration files, dataplane ones will follow in future change. Co-authored-by: Zhi Yuan (Carl) Zhao --- .../Arista-7050DX4-32S/port_config.ini | 35 +++ .../x86_64-arista_7050dx4_32s/default_sku | 1 + .../x86_64-arista_7050dx4_32s/pcie.yaml | 237 ++++++++++++++++++ .../x86_64-arista_7050dx4_32s/platform_asic | 1 + .../x86_64-arista_7050dx4_32s/platform_reboot | 1 + .../arista/x86_64-arista_7050dx4_32s/plugins | 1 + .../pmon_daemon_control.json | 1 + .../x86_64-arista_7050dx4_32s/sensors.conf | 26 ++ .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + .../Arista-7050PX4-32S/port_config.ini | 35 +++ .../x86_64-arista_7050px4_32s/default_sku | 1 + .../x86_64-arista_7050px4_32s/pcie.yaml | 237 ++++++++++++++++++ .../x86_64-arista_7050px4_32s/platform_asic | 1 + .../x86_64-arista_7050px4_32s/platform_reboot | 1 + .../arista/x86_64-arista_7050px4_32s/plugins | 1 + .../pmon_daemon_control.json | 1 + .../x86_64-arista_7050px4_32s/sensors.conf | 26 ++ .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + files/Aboot/boot0.j2 | 6 + 21 files changed, 616 insertions(+) create mode 100644 device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/port_config.ini create mode 100644 device/arista/x86_64-arista_7050dx4_32s/default_sku create mode 100644 device/arista/x86_64-arista_7050dx4_32s/pcie.yaml create mode 100644 device/arista/x86_64-arista_7050dx4_32s/platform_asic create mode 120000 device/arista/x86_64-arista_7050dx4_32s/platform_reboot create mode 120000 device/arista/x86_64-arista_7050dx4_32s/plugins create mode 120000 device/arista/x86_64-arista_7050dx4_32s/pmon_daemon_control.json create mode 100644 device/arista/x86_64-arista_7050dx4_32s/sensors.conf create mode 120000 device/arista/x86_64-arista_7050dx4_32s/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7050dx4_32s/thermal_policy.json create mode 100644 device/arista/x86_64-arista_7050px4_32s/Arista-7050PX4-32S/port_config.ini create mode 100644 device/arista/x86_64-arista_7050px4_32s/default_sku create mode 100644 device/arista/x86_64-arista_7050px4_32s/pcie.yaml create mode 100644 device/arista/x86_64-arista_7050px4_32s/platform_asic create mode 120000 device/arista/x86_64-arista_7050px4_32s/platform_reboot create mode 120000 device/arista/x86_64-arista_7050px4_32s/plugins create mode 120000 device/arista/x86_64-arista_7050px4_32s/pmon_daemon_control.json create mode 100644 device/arista/x86_64-arista_7050px4_32s/sensors.conf create mode 120000 device/arista/x86_64-arista_7050px4_32s/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7050px4_32s/thermal_policy.json diff --git a/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/port_config.ini b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/port_config.ini new file mode 100644 index 000000000000..e9c373a790e2 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/port_config.ini @@ -0,0 +1,35 @@ +# name lanes alias index speed +Ethernet0 1,2,3,4,5,6,7,8 Ethernet1/1 1 400000 +Ethernet8 9,10,11,12,13,14,15,16 Ethernet2/1 2 400000 +Ethernet16 17,18,19,20,21,22,23,24 Ethernet3/1 3 400000 +Ethernet24 25,26,27,28,29,30,31,32 Ethernet4/1 4 400000 +Ethernet32 33,34,35,36,37,38,39,40 Ethernet5/1 5 400000 +Ethernet40 41,42,43,44,45,46,47,48 Ethernet6/1 6 400000 +Ethernet48 49,50,51,52,53,54,55,56 Ethernet7/1 7 400000 +Ethernet56 57,58,59,60,61,62,63,64 Ethernet8/1 8 400000 +Ethernet64 65,66,67,68,69,70,71,72 Ethernet9/1 9 400000 +Ethernet72 73,74,75,76,77,78,79,80 Ethernet10/1 10 400000 +Ethernet80 81,82,83,84,85,86,87,88 Ethernet11/1 11 400000 +Ethernet88 89,90,91,92,93,94,95,96 Ethernet12/1 12 400000 +Ethernet96 97,98,99,100,101,102,103,104 Ethernet13/1 13 400000 +Ethernet104 105,106,107,108,109,110,111,112 Ethernet14/1 14 400000 +Ethernet112 113,114,115,116,117,118,119,120 Ethernet15/1 15 400000 +Ethernet120 121,122,123,124,125,126,127,128 Ethernet16/1 16 400000 +Ethernet128 129,130,131,132,133,134,135,136 Ethernet17/1 17 400000 +Ethernet136 137,138,139,140,141,142,143,144 Ethernet18/1 18 400000 +Ethernet144 145,146,147,148,149,150,151,152 Ethernet19/1 19 400000 +Ethernet152 153,154,155,156,157,158,159,160 Ethernet20/1 20 400000 +Ethernet160 161,162,163,164,165,166,167,168 Ethernet21/1 21 400000 +Ethernet168 169,170,171,172,173,174,175,176 Ethernet22/1 22 400000 +Ethernet176 177,178,179,180,181,182,183,184 Ethernet23/1 23 400000 +Ethernet184 185,186,187,188,189,190,191,192 Ethernet24/1 24 400000 +Ethernet192 193,194,195,196,197,198,199,200 Ethernet25/1 25 400000 +Ethernet200 201,202,203,204,205,206,207,208 Ethernet26/1 26 400000 +Ethernet208 209,210,211,212,213,214,215,216 Ethernet27/1 27 400000 +Ethernet216 217,218,219,220,221,222,223,224 Ethernet28/1 28 400000 +Ethernet224 225,226,227,228,229,230,231,232 Ethernet29/1 29 400000 +Ethernet232 233,234,235,236,237,238,239,240 Ethernet30/1 30 400000 +Ethernet240 241,242,243,244,245,246,247,248 Ethernet31/1 31 400000 +Ethernet248 249,250,251,252,253,254,255,256 Ethernet32/1 32 400000 +Ethernet256 258 Ethernet33 33 10000 +Ethernet257 257 Ethernet34 34 10000 diff --git a/device/arista/x86_64-arista_7050dx4_32s/default_sku b/device/arista/x86_64-arista_7050dx4_32s/default_sku new file mode 100644 index 000000000000..7b324400651f --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/default_sku @@ -0,0 +1 @@ +Arista-7050DX4-32S t1 diff --git a/device/arista/x86_64-arista_7050dx4_32s/pcie.yaml b/device/arista/x86_64-arista_7050dx4_32s/pcie.yaml new file mode 100644 index 000000000000..0085590fe348 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/pcie.yaml @@ -0,0 +1,237 @@ +- bus: '00' + dev: '00' + fn: '0' + id: '1450' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: '1451' + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O + Memory Management Unit' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '02' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '04' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 59)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: '1460' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 0' +- bus: '00' + dev: '18' + fn: '1' + id: '1461' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 1' +- bus: '00' + dev: '18' + fn: '2' + id: '1462' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 2' +- bus: '00' + dev: '18' + fn: '3' + id: '1463' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 3' +- bus: '00' + dev: '18' + fn: '4' + id: '1464' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 4' +- bus: '00' + dev: '18' + fn: '5' + id: '1465' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 5' +- bus: '00' + dev: '18' + fn: '6' + id: '1466' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arastra Inc. Device 0001' +- bus: '01' + dev: '00' + fn: '0' + id: '0001' + name: 'System peripheral: Arastra Inc. Device 0001 (rev 01)' +- bus: '04' + dev: '00' + fn: '0' + id: b881 + name: 'Ethernet controller: Broadcom Limited Device b881 (rev 11)' +- bus: '07' + dev: '00' + fn: '0' + id: '1682' + name: 'Ethernet controller: Broadcom Limited NetXtreme BCM57762 Gigabit Ethernet + PCIe (rev 01)' +- bus: 08 + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: 08 + dev: '00' + fn: '2' + id: '1456' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 00h-0fh) Platform Security Processor' +- bus: 08 + dev: '00' + fn: '3' + id: 145f + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Zeppelin USB 3.0 Host + controller' +- bus: 09 + dev: '00' + fn: '0' + id: '1455' + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Renoir PCIe Dummy Function' +- bus: 09 + dev: '00' + fn: '1' + id: '1468' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Zeppelin Cryptographic + Coprocessor NTBCCP' +- bus: 09 + dev: '00' + fn: '2' + id: '7901' + name: 'SATA controller: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI + mode] (rev 51)' +- bus: 09 + dev: '00' + fn: '3' + id: '1457' + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + HD Audio Controller' +- bus: 09 + dev: '00' + fn: '4' + id: '1458' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1458' +- bus: 09 + dev: '00' + fn: '5' + id: '1458' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1458' +- bus: 09 + dev: '00' + fn: '6' + id: '1459' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1459' +- bus: 09 + dev: '00' + fn: '7' + id: '1459' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1459' diff --git a/device/arista/x86_64-arista_7050dx4_32s/platform_asic b/device/arista/x86_64-arista_7050dx4_32s/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_7050dx4_32s/platform_reboot b/device/arista/x86_64-arista_7050dx4_32s/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050dx4_32s/plugins b/device/arista/x86_64-arista_7050dx4_32s/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050dx4_32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7050dx4_32s/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050dx4_32s/sensors.conf b/device/arista/x86_64-arista_7050dx4_32s/sensors.conf new file mode 100644 index 000000000000..0ababa2cd65b --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/sensors.conf @@ -0,0 +1,26 @@ +# libsensors configuration file for DCS-7050X4-32S +# ------------------------------------------------# + +bus "i2c-19" "SCD 0000:01:00.0 SMBus master 1 bus 0" +bus "i2c-22" "SCD 0000:01:00.0 SMBus master 1 bus 3" +bus "i2c-23" "SCD 0000:01:00.0 SMBus master 1 bus 4" + +chip "tmp468-i2c-19-48" + label temp1 "Center Rear" + label temp2 "Switch board middle sensor" + label temp3 "Switch board left sensor" + label temp4 "Front-panel temp sensor" + ignore temp5 + ignore temp6 + label temp7 "Switch chip diode 1 sensor" + label temp8 "Switch chip diode 2 sensor" + +chip "pmbus-i2c-22-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 exhaust temp sensor" + +chip "pmbus-i2c-23-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 exhaust temp sensor" diff --git a/device/arista/x86_64-arista_7050dx4_32s/system_health_monitoring_config.json b/device/arista/x86_64-arista_7050dx4_32s/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050dx4_32s/thermal_policy.json b/device/arista/x86_64-arista_7050dx4_32s/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050px4_32s/Arista-7050PX4-32S/port_config.ini b/device/arista/x86_64-arista_7050px4_32s/Arista-7050PX4-32S/port_config.ini new file mode 100644 index 000000000000..e9c373a790e2 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/Arista-7050PX4-32S/port_config.ini @@ -0,0 +1,35 @@ +# name lanes alias index speed +Ethernet0 1,2,3,4,5,6,7,8 Ethernet1/1 1 400000 +Ethernet8 9,10,11,12,13,14,15,16 Ethernet2/1 2 400000 +Ethernet16 17,18,19,20,21,22,23,24 Ethernet3/1 3 400000 +Ethernet24 25,26,27,28,29,30,31,32 Ethernet4/1 4 400000 +Ethernet32 33,34,35,36,37,38,39,40 Ethernet5/1 5 400000 +Ethernet40 41,42,43,44,45,46,47,48 Ethernet6/1 6 400000 +Ethernet48 49,50,51,52,53,54,55,56 Ethernet7/1 7 400000 +Ethernet56 57,58,59,60,61,62,63,64 Ethernet8/1 8 400000 +Ethernet64 65,66,67,68,69,70,71,72 Ethernet9/1 9 400000 +Ethernet72 73,74,75,76,77,78,79,80 Ethernet10/1 10 400000 +Ethernet80 81,82,83,84,85,86,87,88 Ethernet11/1 11 400000 +Ethernet88 89,90,91,92,93,94,95,96 Ethernet12/1 12 400000 +Ethernet96 97,98,99,100,101,102,103,104 Ethernet13/1 13 400000 +Ethernet104 105,106,107,108,109,110,111,112 Ethernet14/1 14 400000 +Ethernet112 113,114,115,116,117,118,119,120 Ethernet15/1 15 400000 +Ethernet120 121,122,123,124,125,126,127,128 Ethernet16/1 16 400000 +Ethernet128 129,130,131,132,133,134,135,136 Ethernet17/1 17 400000 +Ethernet136 137,138,139,140,141,142,143,144 Ethernet18/1 18 400000 +Ethernet144 145,146,147,148,149,150,151,152 Ethernet19/1 19 400000 +Ethernet152 153,154,155,156,157,158,159,160 Ethernet20/1 20 400000 +Ethernet160 161,162,163,164,165,166,167,168 Ethernet21/1 21 400000 +Ethernet168 169,170,171,172,173,174,175,176 Ethernet22/1 22 400000 +Ethernet176 177,178,179,180,181,182,183,184 Ethernet23/1 23 400000 +Ethernet184 185,186,187,188,189,190,191,192 Ethernet24/1 24 400000 +Ethernet192 193,194,195,196,197,198,199,200 Ethernet25/1 25 400000 +Ethernet200 201,202,203,204,205,206,207,208 Ethernet26/1 26 400000 +Ethernet208 209,210,211,212,213,214,215,216 Ethernet27/1 27 400000 +Ethernet216 217,218,219,220,221,222,223,224 Ethernet28/1 28 400000 +Ethernet224 225,226,227,228,229,230,231,232 Ethernet29/1 29 400000 +Ethernet232 233,234,235,236,237,238,239,240 Ethernet30/1 30 400000 +Ethernet240 241,242,243,244,245,246,247,248 Ethernet31/1 31 400000 +Ethernet248 249,250,251,252,253,254,255,256 Ethernet32/1 32 400000 +Ethernet256 258 Ethernet33 33 10000 +Ethernet257 257 Ethernet34 34 10000 diff --git a/device/arista/x86_64-arista_7050px4_32s/default_sku b/device/arista/x86_64-arista_7050px4_32s/default_sku new file mode 100644 index 000000000000..ae9a45f88e01 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/default_sku @@ -0,0 +1 @@ +Arista-7050PX4-32S t1 diff --git a/device/arista/x86_64-arista_7050px4_32s/pcie.yaml b/device/arista/x86_64-arista_7050px4_32s/pcie.yaml new file mode 100644 index 000000000000..0085590fe348 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/pcie.yaml @@ -0,0 +1,237 @@ +- bus: '00' + dev: '00' + fn: '0' + id: '1450' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: '1451' + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) I/O + Memory Management Unit' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '01' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '02' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '03' + fn: '1' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '2' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '3' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '03' + fn: '4' + id: '1453' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + PCIe GPP Bridge' +- bus: '00' + dev: '04' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '07' + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: '1454' + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Internal PCIe GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 59)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: '1460' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 0' +- bus: '00' + dev: '18' + fn: '1' + id: '1461' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 1' +- bus: '00' + dev: '18' + fn: '2' + id: '1462' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 2' +- bus: '00' + dev: '18' + fn: '3' + id: '1463' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 3' +- bus: '00' + dev: '18' + fn: '4' + id: '1464' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 4' +- bus: '00' + dev: '18' + fn: '5' + id: '1465' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 5' +- bus: '00' + dev: '18' + fn: '6' + id: '1466' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + Data Fabric: Device 18h; Function 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arastra Inc. Device 0001' +- bus: '01' + dev: '00' + fn: '0' + id: '0001' + name: 'System peripheral: Arastra Inc. Device 0001 (rev 01)' +- bus: '04' + dev: '00' + fn: '0' + id: b881 + name: 'Ethernet controller: Broadcom Limited Device b881 (rev 11)' +- bus: '07' + dev: '00' + fn: '0' + id: '1682' + name: 'Ethernet controller: Broadcom Limited NetXtreme BCM57762 Gigabit Ethernet + PCIe (rev 01)' +- bus: 08 + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: 08 + dev: '00' + fn: '2' + id: '1456' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 00h-0fh) Platform Security Processor' +- bus: 08 + dev: '00' + fn: '3' + id: 145f + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Zeppelin USB 3.0 Host + controller' +- bus: 09 + dev: '00' + fn: '0' + id: '1455' + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Renoir PCIe Dummy Function' +- bus: 09 + dev: '00' + fn: '1' + id: '1468' + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Zeppelin Cryptographic + Coprocessor NTBCCP' +- bus: 09 + dev: '00' + fn: '2' + id: '7901' + name: 'SATA controller: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI + mode] (rev 51)' +- bus: 09 + dev: '00' + fn: '3' + id: '1457' + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) + HD Audio Controller' +- bus: 09 + dev: '00' + fn: '4' + id: '1458' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1458' +- bus: 09 + dev: '00' + fn: '5' + id: '1458' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1458' +- bus: 09 + dev: '00' + fn: '6' + id: '1459' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1459' +- bus: 09 + dev: '00' + fn: '7' + id: '1459' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1459' diff --git a/device/arista/x86_64-arista_7050px4_32s/platform_asic b/device/arista/x86_64-arista_7050px4_32s/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_7050px4_32s/platform_reboot b/device/arista/x86_64-arista_7050px4_32s/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050px4_32s/plugins b/device/arista/x86_64-arista_7050px4_32s/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050px4_32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7050px4_32s/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050px4_32s/sensors.conf b/device/arista/x86_64-arista_7050px4_32s/sensors.conf new file mode 100644 index 000000000000..0ababa2cd65b --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/sensors.conf @@ -0,0 +1,26 @@ +# libsensors configuration file for DCS-7050X4-32S +# ------------------------------------------------# + +bus "i2c-19" "SCD 0000:01:00.0 SMBus master 1 bus 0" +bus "i2c-22" "SCD 0000:01:00.0 SMBus master 1 bus 3" +bus "i2c-23" "SCD 0000:01:00.0 SMBus master 1 bus 4" + +chip "tmp468-i2c-19-48" + label temp1 "Center Rear" + label temp2 "Switch board middle sensor" + label temp3 "Switch board left sensor" + label temp4 "Front-panel temp sensor" + ignore temp5 + ignore temp6 + label temp7 "Switch chip diode 1 sensor" + label temp8 "Switch chip diode 2 sensor" + +chip "pmbus-i2c-22-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 exhaust temp sensor" + +chip "pmbus-i2c-23-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 exhaust temp sensor" diff --git a/device/arista/x86_64-arista_7050px4_32s/system_health_monitoring_config.json b/device/arista/x86_64-arista_7050px4_32s/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050px4_32s/thermal_policy.json b/device/arista/x86_64-arista_7050px4_32s/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index ad7540df0946..a3c3d8ebca06 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -532,6 +532,12 @@ write_platform_specific_cmdline() { aboot_machine=arista_7060dx4_32 flash_size=28000 fi + if [ "$sid" = "BlackhawkT4O" ]; then + aboot_machine=arista_7050px4_32s + fi + if [ "$sid" = "BlackhawkT4DD" ]; then + aboot_machine=arista_7050dx4_32s + fi if [ "$sid" = "Smartsville" ]; then aboot_machine=arista_7280cr3_32p4 fi From 89020f53e4977535d8d3a4ea2450b11a6fa436be Mon Sep 17 00:00:00 2001 From: byu343 Date: Thu, 16 Jun 2022 09:51:42 -0700 Subject: [PATCH 424/817] [Arista] Add support support for 7060dx5_64s and 7060px5_64s (#10888) Why I did it This change adds the support for Arista 7060dx5_64s and 7060px5_64s How I did it How to verify it We verified the platform driver is working and the ports are up on 7060dx5_64s and 7060px5_64s. --- .../Arista-7060DX5-64S/blackhawk.xml | 1 + .../Arista-7060DX5-64S/context_config.json | 1 + .../Arista-7060DX5-64S/gearbox_config.json | 1 + .../Arista-7060DX5-64S/hwsku.json | 260 ++ .../Arista-7060DX5-64S/phy1_config.json | 1 + .../Arista-7060DX5-64S/phy2_config.json | 1 + .../Arista-7060DX5-64S/phy3_config.json | 1 + .../Arista-7060DX5-64S/phy4_config.json | 1 + .../Arista-7060DX5-64S/phy5_config.json | 1 + .../Arista-7060DX5-64S/phy6_config.json | 1 + .../Arista-7060DX5-64S/phy7_config.json | 1 + .../Arista-7060DX5-64S/phy8_config.json | 1 + .../Arista-7060DX5-64S/port_config.ini | 65 + .../Arista-7060DX5-64S/psai.profile | 1 + .../Arista-7060DX5-64S/sai.profile | 1 + .../th4-a7060dx5-64s.config.bcm | 1132 +++++++++ .../x86_64-arista_7060dx5_64s/default_sku | 1 + .../x86_64-arista_7060dx5_64s/gbsyncd.ini | 1 + .../x86_64-arista_7060dx5_64s/platform.json | 2159 +++++++++++++++++ .../x86_64-arista_7060dx5_64s/platform_asic | 1 + .../platform_env.conf | 2 + .../x86_64-arista_7060dx5_64s/platform_reboot | 1 + .../arista/x86_64-arista_7060dx5_64s/plugins | 1 + .../pmon_daemon_control.json | 1 + .../x86_64-arista_7060dx5_64s/sensors.conf | 1 + .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + .../Arista-7060PX5-64S/blackhawk.xml | 29 + .../Arista-7060PX5-64S/context_config.json | 66 + .../Arista-7060PX5-64S/gearbox_config.json | 166 ++ .../Arista-7060PX5-64S/phy1_config.json | 38 + .../Arista-7060PX5-64S/phy2_config.json | 38 + .../Arista-7060PX5-64S/phy3_config.json | 38 + .../Arista-7060PX5-64S/phy4_config.json | 38 + .../Arista-7060PX5-64S/phy5_config.json | 38 + .../Arista-7060PX5-64S/phy6_config.json | 38 + .../Arista-7060PX5-64S/phy7_config.json | 38 + .../Arista-7060PX5-64S/phy8_config.json | 38 + .../Arista-7060PX5-64S/port_config.ini | 65 + .../Arista-7060PX5-64S/psai.profile | 1 + .../Arista-7060PX5-64S/sai.profile | 1 + .../x86_64-arista_7060px5_64s/default_sku | 1 + .../x86_64-arista_7060px5_64s/gbsyncd.ini | 1 + .../x86_64-arista_7060px5_64s/platform_asic | 1 + .../platform_env.conf | 2 + .../x86_64-arista_7060px5_64s/platform_reboot | 1 + .../arista/x86_64-arista_7060px5_64s/plugins | 1 + .../pmon_daemon_control.json | 1 + .../x86_64-arista_7060px5_64s/sensors.conf | 35 + .../system_health_monitoring_config.json | 1 + .../thermal_policy.json | 1 + files/Aboot/boot0.j2 | 6 + 52 files changed, 4323 insertions(+) create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/blackhawk.xml create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/context_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/gearbox_config.json create mode 100644 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy1_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy2_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy3_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy4_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy5_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy6_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy7_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy8_config.json create mode 100644 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini create mode 120000 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/psai.profile create mode 100644 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/sai.profile create mode 100644 device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm create mode 100644 device/arista/x86_64-arista_7060dx5_64s/default_sku create mode 100644 device/arista/x86_64-arista_7060dx5_64s/gbsyncd.ini create mode 100644 device/arista/x86_64-arista_7060dx5_64s/platform.json create mode 100644 device/arista/x86_64-arista_7060dx5_64s/platform_asic create mode 100644 device/arista/x86_64-arista_7060dx5_64s/platform_env.conf create mode 120000 device/arista/x86_64-arista_7060dx5_64s/platform_reboot create mode 120000 device/arista/x86_64-arista_7060dx5_64s/plugins create mode 120000 device/arista/x86_64-arista_7060dx5_64s/pmon_daemon_control.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/sensors.conf create mode 120000 device/arista/x86_64-arista_7060dx5_64s/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7060dx5_64s/thermal_policy.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/context_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/gearbox_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy1_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy2_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy3_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy4_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy5_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy6_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy7_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy8_config.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/port_config.ini create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/psai.profile create mode 100644 device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/sai.profile create mode 100644 device/arista/x86_64-arista_7060px5_64s/default_sku create mode 100644 device/arista/x86_64-arista_7060px5_64s/gbsyncd.ini create mode 100644 device/arista/x86_64-arista_7060px5_64s/platform_asic create mode 100644 device/arista/x86_64-arista_7060px5_64s/platform_env.conf create mode 120000 device/arista/x86_64-arista_7060px5_64s/platform_reboot create mode 120000 device/arista/x86_64-arista_7060px5_64s/plugins create mode 120000 device/arista/x86_64-arista_7060px5_64s/pmon_daemon_control.json create mode 100644 device/arista/x86_64-arista_7060px5_64s/sensors.conf create mode 120000 device/arista/x86_64-arista_7060px5_64s/system_health_monitoring_config.json create mode 120000 device/arista/x86_64-arista_7060px5_64s/thermal_policy.json diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/blackhawk.xml b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/blackhawk.xml new file mode 120000 index 000000000000..d8e2cb69d236 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/blackhawk.xml @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/context_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/context_config.json new file mode 120000 index 000000000000..95c818e0d36a --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/context_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/context_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/gearbox_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/gearbox_config.json new file mode 120000 index 000000000000..29d41fabe645 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/gearbox_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/gearbox_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json new file mode 100644 index 000000000000..7862b2cd4667 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/hwsku.json @@ -0,0 +1,260 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet256": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet264": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet272": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet280": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet288": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet296": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet304": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet312": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet320": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet328": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet336": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet344": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet352": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet360": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet368": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet376": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet384": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet392": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet400": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet408": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet416": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet424": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet432": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet440": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet448": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet456": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet464": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet472": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet480": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet488": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet496": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + }, + "Ethernet504": { + "default_brkout_mode": "1x400G[200G,100G,50G,40G,25G,10G]", + "fec": "rs" + } + } +} diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy1_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy1_config.json new file mode 120000 index 000000000000..dff7aa0667df --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy1_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy1_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy2_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy2_config.json new file mode 120000 index 000000000000..d74988b1b343 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy2_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy2_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy3_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy3_config.json new file mode 120000 index 000000000000..bdaf13a614a9 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy3_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy3_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy4_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy4_config.json new file mode 120000 index 000000000000..b657f6e8e85f --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy4_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy4_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy5_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy5_config.json new file mode 120000 index 000000000000..c4b33666282d --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy5_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy5_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy6_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy6_config.json new file mode 120000 index 000000000000..3a0a2588b45c --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy6_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy6_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy7_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy7_config.json new file mode 120000 index 000000000000..b1d1a13c940c --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy7_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy7_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy8_config.json b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy8_config.json new file mode 120000 index 000000000000..aa932668e1d4 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/phy8_config.json @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy8_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini new file mode 100644 index 000000000000..1aaf907498e2 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias index speed fec +Ethernet0 9,10,11,12,13,14,15,16 Ethernet1/1 1 400000 rs +Ethernet8 5,6,7,8,9,10,11,12 Ethernet2/1 2 400000 rs +Ethernet16 25,26,27,28,29,30,31,32 Ethernet3/1 3 400000 rs +Ethernet24 17,18,19,20,21,22,23,24 Ethernet4/1 4 400000 rs +Ethernet32 41,42,43,44,45,46,47,48 Ethernet5/1 5 400000 rs +Ethernet40 33,34,35,36,37,38,39,40 Ethernet6/1 6 400000 rs +Ethernet48 57,58,59,60,61,62,63,64 Ethernet7/1 7 400000 rs +Ethernet56 49,50,51,52,53,54,55,56 Ethernet8/1 8 400000 rs +Ethernet64 73,74,75,76,77,78,79,80 Ethernet9/1 9 400000 rs +Ethernet72 65,66,67,68,69,70,71,72 Ethernet10/1 10 400000 rs +Ethernet80 89,90,91,92,93,94,95,96 Ethernet11/1 11 400000 rs +Ethernet88 81,82,83,84,85,86,87,88 Ethernet12/1 12 400000 rs +Ethernet96 105,106,107,108,109,110,111,112 Ethernet13/1 13 400000 rs +Ethernet104 97,98,99,100,101,102,103,104 Ethernet14/1 14 400000 rs +Ethernet112 121,122,123,124,125,126,127,128 Ethernet15/1 15 400000 rs +Ethernet120 117,118,119,120,121,122,123,124 Ethernet16/1 16 400000 rs +Ethernet128 141,142,143,144,145,146,147,148 Ethernet17/1 17 400000 rs +Ethernet136 129,130,131,132,133,134,135,136 Ethernet18/1 18 400000 rs +Ethernet144 153,154,155,156,157,158,159,160 Ethernet19/1 19 400000 rs +Ethernet152 145,146,147,148,149,150,151,152 Ethernet20/1 20 400000 rs +Ethernet160 169,170,171,172,173,174,175,176 Ethernet21/1 21 400000 rs +Ethernet168 161,162,163,164,165,166,167,168 Ethernet22/1 22 400000 rs +Ethernet176 185,186,187,188,189,190,191,192 Ethernet23/1 23 400000 rs +Ethernet184 177,178,179,180,181,182,183,184 Ethernet24/1 24 400000 rs +Ethernet192 201,202,203,204,205,206,207,208 Ethernet25/1 25 400000 rs +Ethernet200 193,194,195,196,197,198,199,200 Ethernet26/1 26 400000 rs +Ethernet208 217,218,219,220,221,222,223,224 Ethernet27/1 27 400000 rs +Ethernet216 209,210,211,212,213,214,215,216 Ethernet28/1 28 400000 rs +Ethernet224 233,234,235,236,237,238,239,240 Ethernet29/1 29 400000 rs +Ethernet232 225,226,227,228,229,230,231,232 Ethernet30/1 30 400000 rs +Ethernet240 241,242,243,244,245,246,247,248 Ethernet31/1 31 400000 rs +Ethernet248 253,254,255,256,257,258,259,260 Ethernet32/1 32 400000 rs +Ethernet256 1,2,3,4,5,6,7,8 Ethernet33/1 33 400000 rs +Ethernet264 13,14,15,16,17,18,19,20 Ethernet34/1 34 400000 rs +Ethernet272 29,30,31,32,33,34,35,36 Ethernet35/1 35 400000 rs +Ethernet280 21,22,23,24,25,26,27,28 Ethernet36/1 36 400000 rs +Ethernet288 45,46,47,48,49,50,51,52 Ethernet37/1 37 400000 rs +Ethernet296 37,38,39,40,41,42,43,44 Ethernet38/1 38 400000 rs +Ethernet304 61,62,63,64,65,66,67,68 Ethernet39/1 39 400000 rs +Ethernet312 53,54,55,56,57,58,59,60 Ethernet40/1 40 400000 rs +Ethernet320 77,78,79,80,81,82,83,84 Ethernet41/1 41 400000 rs +Ethernet328 69,70,71,72,73,74,75,76 Ethernet42/1 42 400000 rs +Ethernet336 93,94,95,96,97,98,99,100 Ethernet43/1 43 400000 rs +Ethernet344 85,86,87,88,89,90,91,92 Ethernet44/1 44 400000 rs +Ethernet352 109,110,111,112,113,114,115,116 Ethernet45/1 45 400000 rs +Ethernet360 101,102,103,104,105,106,107,108 Ethernet46/1 46 400000 rs +Ethernet368 125,126,127,128,129,130,131,132 Ethernet47/1 47 400000 rs +Ethernet376 113,114,115,116,117,118,119,120 Ethernet48/1 48 400000 rs +Ethernet384 137,138,139,140,141,142,143,144 Ethernet49/1 49 400000 rs +Ethernet392 133,134,135,136,137,138,139,140 Ethernet50/1 50 400000 rs +Ethernet400 157,158,159,160,161,162,163,164 Ethernet51/1 51 400000 rs +Ethernet408 149,150,151,152,153,154,155,156 Ethernet52/1 52 400000 rs +Ethernet416 173,174,175,176,177,178,179,180 Ethernet53/1 53 400000 rs +Ethernet424 165,166,167,168,169,170,171,172 Ethernet54/1 54 400000 rs +Ethernet432 189,190,191,192,193,194,195,196 Ethernet55/1 55 400000 rs +Ethernet440 181,182,183,184,185,186,187,188 Ethernet56/1 56 400000 rs +Ethernet448 205,206,207,208,209,210,211,212 Ethernet57/1 57 400000 rs +Ethernet456 197,198,199,200,201,202,203,204 Ethernet58/1 58 400000 rs +Ethernet464 221,222,223,224,225,226,227,228 Ethernet59/1 59 400000 rs +Ethernet472 213,214,215,216,217,218,219,220 Ethernet60/1 60 400000 rs +Ethernet480 237,238,239,240,241,242,243,244 Ethernet61/1 61 400000 rs +Ethernet488 229,230,231,232,233,234,235,236 Ethernet62/1 62 400000 rs +Ethernet496 249,250,251,252,253,254,255,256 Ethernet63/1 63 400000 rs +Ethernet504 245,246,247,248,249,250,251,252 Ethernet64/1 64 400000 rs diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/psai.profile b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/psai.profile new file mode 120000 index 000000000000..cca6c42d1413 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/psai.profile @@ -0,0 +1 @@ +../../x86_64-arista_7060px5_64s/Arista-7060PX5-64S/psai.profile \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/sai.profile b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/sai.profile new file mode 100644 index 000000000000..b3745a4fb4bd --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th4-a7060dx5-64s.config.bcm diff --git a/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm new file mode 100644 index 000000000000..12225a79ce74 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/Arista-7060DX5-64S/th4-a7060dx5-64s.config.bcm @@ -0,0 +1,1132 @@ +# $Copyright: Broadcom Ltd.$ +# +# BCM56990 64x400g port configuration. +# +# configuration yaml file +# device: +# : +# : +# ? +# : +# : +# ... +# : +# : +# : +# : +# ... +# : +# + +--- +bcm_device: + 0: + global: + pktio_mode: 1 + vlan_flooding_l2mc_num_reserved: 0 + ipv6_lpm_128b_enable: 1 + shared_block_mask_section: uc_bc + skip_protocol_default_entries: 1 + # LTSW uses value 1 for ALPM combined mode + l3_alpm_template: 1 + l3_alpm_hit_skip: 1 + sai_feat_tail_timestamp : 1 + sai_field_group_auto_prioritize: 1 + #l3_intf_vlan_split_egress for MTU at L3IF + l3_intf_vlan_split_egress : 1 + +--- +device: + 0: + PC_PM_CORE: + ? + PC_PM_ID: 1 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 2 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 3 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 4 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 5 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x26043715 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x88 + ? + PC_PM_ID: 6 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73526140 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 7 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 8 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73526140 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 9 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x16240735 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x22 + ? + PC_PM_ID: 10 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73546120 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 11 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x45320716 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 12 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73526140 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 13 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x24350716 + TX_LANE_MAP: 0x16240735 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x22 + ? + PC_PM_ID: 14 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73416250 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 15 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x14350726 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 16 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x73516240 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 17 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43527160 + TX_LANE_MAP: 0x53714260 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 18 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 19 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 20 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 21 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x53714260 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 22 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 23 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 24 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 25 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x53714260 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 26 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 27 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 28 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x54320716 + RX_POLARITY_FLIP: 0xd5 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 29 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x24061735 + TX_LANE_MAP: 0x64201735 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x05 + ? + PC_PM_ID: 30 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x17352406 + TX_LANE_MAP: 0x16073425 + RX_POLARITY_FLIP: 0x0a + TX_POLARITY_FLIP: 0xbb + ? + PC_PM_ID: 31 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53716042 + TX_LANE_MAP: 0x75201634 + RX_POLARITY_FLIP: 0xfa + TX_POLARITY_FLIP: 0x05 + ? + PC_PM_ID: 32 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53716042 + TX_LANE_MAP: 0x13567042 + RX_POLARITY_FLIP: 0xfa + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 33 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53716042 + TX_LANE_MAP: 0x52437061 + RX_POLARITY_FLIP: 0xfa + TX_POLARITY_FLIP: 0x22 + ? + PC_PM_ID: 34 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53716042 + TX_LANE_MAP: 0x64201735 + RX_POLARITY_FLIP: 0x0a + TX_POLARITY_FLIP: 0x05 + ? + PC_PM_ID: 35 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x17352406 + TX_LANE_MAP: 0x57132406 + RX_POLARITY_FLIP: 0x0a + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 36 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x24061735 + TX_LANE_MAP: 0x64201735 + RX_POLARITY_FLIP: 0xf5 + TX_POLARITY_FLIP: 0xf5 + ? + PC_PM_ID: 37 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x36142705 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 38 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 39 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 40 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 41 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x6241735 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 42 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 43 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x15340726 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 44 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 45 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x6241735 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xaa + ? + PC_PM_ID: 46 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 47 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25340716 + TX_LANE_MAP: 0x54013726 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 48 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x34517260 + TX_LANE_MAP: 0x1546273 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x3a + ? + PC_PM_ID: 49 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43516270 + TX_LANE_MAP: 0x53704261 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xbb + ? + PC_PM_ID: 50 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x14370526 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 51 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53416270 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 52 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x24370516 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 53 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x53704261 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xbb + ? + PC_PM_ID: 54 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x45370216 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 55 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x23546170 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 56 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25370416 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 57 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x53704261 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xbb + ? + PC_PM_ID: 58 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25370416 + TX_LANE_MAP: 0x54103726 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x0a + ? + PC_PM_ID: 59 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x43526170 + TX_LANE_MAP: 0x10546273 + RX_POLARITY_FLIP: 0x55 + TX_POLARITY_FLIP: 0xfa + ? + PC_PM_ID: 60 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x25370416 + TX_LANE_MAP: 0x54231706 + RX_POLARITY_FLIP: 0x45 + TX_POLARITY_FLIP: 0x30 + ? + PC_PM_ID: 61 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 62 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 63 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 + ? + PC_PM_ID: 64 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x76543210 + TX_LANE_MAP: 0x76543210 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x00 +... +--- +device: + 0: + PC_PORT_PHYS_MAP: + ? + # CPU port + PORT_ID: 0 + : + PC_PHYS_PORT_ID: 0 + ? + PORT_ID: 1 + : + PC_PHYS_PORT_ID: 1 + ? + PORT_ID: 2 + : + PC_PHYS_PORT_ID: 5 + ? + PORT_ID: 3 + : + PC_PHYS_PORT_ID: 9 + ? + PORT_ID: 4 + : + PC_PHYS_PORT_ID: 13 + ? + PORT_ID: 17 + : + PC_PHYS_PORT_ID: 17 + ? + PORT_ID: 18 + : + PC_PHYS_PORT_ID: 21 + ? + PORT_ID: 19 + : + PC_PHYS_PORT_ID: 25 + ? + PORT_ID: 20 + : + PC_PHYS_PORT_ID: 29 + ? + PORT_ID: 34 + : + PC_PHYS_PORT_ID: 33 + ? + PORT_ID: 35 + : + PC_PHYS_PORT_ID: 37 + ? + PORT_ID: 36 + : + PC_PHYS_PORT_ID: 41 + ? + PORT_ID: 37 + : + PC_PHYS_PORT_ID: 45 + ? + PORT_ID: 51 + : + PC_PHYS_PORT_ID: 49 + ? + PORT_ID: 52 + : + PC_PHYS_PORT_ID: 53 + ? + PORT_ID: 53 + : + PC_PHYS_PORT_ID: 57 + ? + PORT_ID: 54 + : + PC_PHYS_PORT_ID: 61 + ? + PORT_ID: 68 + : + PC_PHYS_PORT_ID: 65 + ? + PORT_ID: 69 + : + PC_PHYS_PORT_ID: 69 + ? + PORT_ID: 70 + : + PC_PHYS_PORT_ID: 73 + ? + PORT_ID: 71 + : + PC_PHYS_PORT_ID: 77 + ? + PORT_ID: 85 + : + PC_PHYS_PORT_ID: 81 + ? + PORT_ID: 86 + : + PC_PHYS_PORT_ID: 85 + ? + PORT_ID: 87 + : + PC_PHYS_PORT_ID: 89 + ? + PORT_ID: 88 + : + PC_PHYS_PORT_ID: 93 + ? + PORT_ID: 102 + : + PC_PHYS_PORT_ID: 97 + ? + PORT_ID: 103 + : + PC_PHYS_PORT_ID: 101 + ? + PORT_ID: 104 + : + PC_PHYS_PORT_ID: 105 + ? + PORT_ID: 105 + : + PC_PHYS_PORT_ID: 109 + ? + PORT_ID: 119 + : + PC_PHYS_PORT_ID: 113 + ? + PORT_ID: 120 + : + PC_PHYS_PORT_ID: 117 + ? + PORT_ID: 121 + : + PC_PHYS_PORT_ID: 121 + ? + PORT_ID: 122 + : + PC_PHYS_PORT_ID: 125 + ? + PORT_ID: 136 + : + PC_PHYS_PORT_ID: 129 + ? + PORT_ID: 137 + : + PC_PHYS_PORT_ID: 133 + ? + PORT_ID: 138 + : + PC_PHYS_PORT_ID: 137 + ? + PORT_ID: 139 + : + PC_PHYS_PORT_ID: 141 + ? + PORT_ID: 153 + : + PC_PHYS_PORT_ID: 145 + ? + PORT_ID: 154 + : + PC_PHYS_PORT_ID: 149 + ? + PORT_ID: 155 + : + PC_PHYS_PORT_ID: 153 + ? + PORT_ID: 156 + : + PC_PHYS_PORT_ID: 157 + ? + PORT_ID: 170 + : + PC_PHYS_PORT_ID: 161 + ? + PORT_ID: 171 + : + PC_PHYS_PORT_ID: 165 + ? + PORT_ID: 172 + : + PC_PHYS_PORT_ID: 169 + ? + PORT_ID: 173 + : + PC_PHYS_PORT_ID: 173 + ? + PORT_ID: 187 + : + PC_PHYS_PORT_ID: 177 + ? + PORT_ID: 188 + : + PC_PHYS_PORT_ID: 181 + ? + PORT_ID: 189 + : + PC_PHYS_PORT_ID: 185 + ? + PORT_ID: 190 + : + PC_PHYS_PORT_ID: 189 + ? + PORT_ID: 204 + : + PC_PHYS_PORT_ID: 193 + ? + PORT_ID: 205 + : + PC_PHYS_PORT_ID: 197 + ? + PORT_ID: 206 + : + PC_PHYS_PORT_ID: 201 + ? + PORT_ID: 207 + : + PC_PHYS_PORT_ID: 205 + ? + PORT_ID: 221 + : + PC_PHYS_PORT_ID: 209 + ? + PORT_ID: 222 + : + PC_PHYS_PORT_ID: 213 + ? + PORT_ID: 223 + : + PC_PHYS_PORT_ID: 217 + ? + PORT_ID: 224 + : + PC_PHYS_PORT_ID: 221 + ? + PORT_ID: 238 + : + PC_PHYS_PORT_ID: 225 + ? + PORT_ID: 239 + : + PC_PHYS_PORT_ID: 229 + ? + PORT_ID: 240 + : + PC_PHYS_PORT_ID: 233 + ? + PORT_ID: 241 + : + PC_PHYS_PORT_ID: 237 + ? + PORT_ID: 255 + : + PC_PHYS_PORT_ID: 241 + ? + PORT_ID: 256 + : + PC_PHYS_PORT_ID: 245 + ? + PORT_ID: 257 + : + PC_PHYS_PORT_ID: 249 + ? + PORT_ID: 258 + : + PC_PHYS_PORT_ID: 253 +... +--- +device: + 0: + PC_PORT: + ? + PORT_ID: 0 + : + &port_mode_10g + ENABLE: 1 + SPEED: 10000 + NUM_LANES: 1 + ? + PORT_ID: [[1, 4], + [17, 20], + [34, 37], + [51, 54], + [68, 71], + [85, 88], + [102, 105], + [119, 122], + [136, 139], + [153, 156], + [170, 173], + [187, 190], + [204, 207], + [221, 224], + [238, 241], + [255, 258]] + : + ENABLE: 1 + SPEED: 400000 + NUM_LANES: 8 + FEC_MODE: PC_FEC_RS544_2XN + MAX_FRAME_SIZE: 9416 +... +--- +device: + 0: + # Per pipe flex counter configuration + CTR_EFLEX_CONFIG: + CTR_ING_EFLEX_OPERMODE_PIPEUNIQUE: 0 + CTR_EGR_EFLEX_OPERMODE_PIPEUNIQUE: 0 + + # Per pipe flex state configuration + #FLEX_STATE_CONFIG: + # FLEX_STATE_ING_OPERMODE_PIPEUNIQUE: 0 + # FLEX_STATE_EGR_OPERMODE_PIPEUNIQUE: 1 + + # Lossy vs Lossless mode + TM_THD_CONFIG: + THRESHOLD_MODE: LOSSLESS + + # IFP mode + FP_CONFIG: + FP_ING_OPERMODE: GLOBAL_PIPE_AWARE +... diff --git a/device/arista/x86_64-arista_7060dx5_64s/default_sku b/device/arista/x86_64-arista_7060dx5_64s/default_sku new file mode 100644 index 000000000000..e3df5d2f9184 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/default_sku @@ -0,0 +1 @@ +Arista-7060DX5-64S t1 diff --git a/device/arista/x86_64-arista_7060dx5_64s/gbsyncd.ini b/device/arista/x86_64-arista_7060dx5_64s/gbsyncd.ini new file mode 100644 index 000000000000..9bd130dff9ef --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/gbsyncd.ini @@ -0,0 +1 @@ +platform=gbsyncd-credo diff --git a/device/arista/x86_64-arista_7060dx5_64s/platform.json b/device/arista/x86_64-arista_7060dx5_64s/platform.json new file mode 100644 index 000000000000..6442500a35d2 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/platform.json @@ -0,0 +1,2159 @@ +{ + "chassis": { + "name": "DCS-7060DX5-64S", + "components": [], + "fans": [], + "fan_drawers": [ + { + "name": "slot1", + "fans": [ + { + "name": "fan1" + } + ] + }, + { + "name": "slot2", + "fans": [ + { + "name": "fan2" + } + ] + }, + { + "name": "slot3", + "fans": [ + { + "name": "fan3" + } + ] + }, + { + "name": "slot4", + "fans": [ + { + "name": "fan4" + } + ] + } + ], + "psus": [ + { + "name": "psu1", + "fans": [] + }, + { + "name": "psu2", + "fans": [] + } + ], + "thermals": [ + { + "name": "Cpu temp sensor" + }, + { + "name": "CPU board temp sensor" + }, + { + "name": "Back-panel temp sensor" + }, + { + "name": "Board sensor" + }, + { + "name": "Switch board middle sensor" + }, + { + "name": "Switch board left sensor" + }, + { + "name": "Front-panel temp sensor" + }, + { + "name": "Switch chip diode 1 sensor" + }, + { + "name": "Switch chip diode 2 sensor" + }, + { + "name": "Front-panel temp sensor" + }, + { + "name": "Power supply 1 inlet temp sensor" + }, + { + "name": "Power supply 1 secondary hotspot sensor" + }, + { + "name": "Power supply 1 primary hotspot sensor" + }, + { + "name": "Power supply 2 inlet temp sensor" + }, + { + "name": "Power supply 2 secondary hotspot sensor" + }, + { + "name": "Power supply 2 primary hotspot sensor" + } + ], + "sfps": [ + { + "name": "osfp1" + }, + { + "name": "osfp2" + }, + { + "name": "osfp3" + }, + { + "name": "osfp4" + }, + { + "name": "osfp5" + }, + { + "name": "osfp6" + }, + { + "name": "osfp7" + }, + { + "name": "osfp8" + }, + { + "name": "osfp9" + }, + { + "name": "osfp10" + }, + { + "name": "osfp11" + }, + { + "name": "osfp12" + }, + { + "name": "osfp13" + }, + { + "name": "osfp14" + }, + { + "name": "osfp15" + }, + { + "name": "osfp16" + }, + { + "name": "osfp17" + }, + { + "name": "osfp18" + }, + { + "name": "osfp19" + }, + { + "name": "osfp20" + }, + { + "name": "osfp21" + }, + { + "name": "osfp22" + }, + { + "name": "osfp23" + }, + { + "name": "osfp24" + }, + { + "name": "osfp25" + }, + { + "name": "osfp26" + }, + { + "name": "osfp27" + }, + { + "name": "osfp28" + }, + { + "name": "osfp29" + }, + { + "name": "osfp30" + }, + { + "name": "osfp31" + }, + { + "name": "osfp32" + }, + { + "name": "osfp33" + }, + { + "name": "osfp34" + }, + { + "name": "osfp35" + }, + { + "name": "osfp36" + }, + { + "name": "osfp37" + }, + { + "name": "osfp38" + }, + { + "name": "osfp39" + }, + { + "name": "osfp40" + }, + { + "name": "osfp41" + }, + { + "name": "osfp42" + }, + { + "name": "osfp43" + }, + { + "name": "osfp44" + }, + { + "name": "osfp45" + }, + { + "name": "osfp46" + }, + { + "name": "osfp47" + }, + { + "name": "osfp48" + }, + { + "name": "osfp49" + }, + { + "name": "osfp50" + }, + { + "name": "osfp51" + }, + { + "name": "osfp52" + }, + { + "name": "osfp53" + }, + { + "name": "osfp54" + }, + { + "name": "osfp55" + }, + { + "name": "osfp56" + }, + { + "name": "osfp57" + }, + { + "name": "osfp58" + }, + { + "name": "osfp59" + }, + { + "name": "osfp60" + }, + { + "name": "osfp61" + }, + { + "name": "osfp62" + }, + { + "name": "osfp63" + }, + { + "name": "osfp64" + }, + { + "name": "sfp65" + }, + { + "name": "sfp66" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "1,1,1,1,1,1,1,1", + "lanes": "9,10,11,12,13,14,15,16", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet1/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet1/1", + "Ethernet1/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet1/1", + "Ethernet1/3", + "Ethernet1/5", + "Ethernet1/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet1/1", + "Ethernet1/2", + "Ethernet1/3", + "Ethernet1/4", + "Ethernet1/5", + "Ethernet1/6", + "Ethernet1/7", + "Ethernet1/8" + ] + } + }, + "Ethernet8": { + "index": "2,2,2,2,2,2,2,2", + "lanes": "5,6,7,8,9,10,11,12", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet2/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet2/1", + "Ethernet2/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet2/1", + "Ethernet2/3", + "Ethernet2/5", + "Ethernet2/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet2/1", + "Ethernet2/2", + "Ethernet2/3", + "Ethernet2/4", + "Ethernet2/5", + "Ethernet2/6", + "Ethernet2/7", + "Ethernet2/8" + ] + } + }, + "Ethernet16": { + "index": "3,3,3,3,3,3,3,3", + "lanes": "25,26,27,28,29,30,31,32", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet3/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet3/1", + "Ethernet3/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet3/1", + "Ethernet3/3", + "Ethernet3/5", + "Ethernet3/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet3/1", + "Ethernet3/2", + "Ethernet3/3", + "Ethernet3/4", + "Ethernet3/5", + "Ethernet3/6", + "Ethernet3/7", + "Ethernet3/8" + ] + } + }, + "Ethernet24": { + "index": "4,4,4,4,4,4,4,4", + "lanes": "17,18,19,20,21,22,23,24", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet4/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet4/1", + "Ethernet4/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet4/1", + "Ethernet4/3", + "Ethernet4/5", + "Ethernet4/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet4/1", + "Ethernet4/2", + "Ethernet4/3", + "Ethernet4/4", + "Ethernet4/5", + "Ethernet4/6", + "Ethernet4/7", + "Ethernet4/8" + ] + } + }, + "Ethernet32": { + "index": "5,5,5,5,5,5,5,5", + "lanes": "41,42,43,44,45,46,47,48", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet5/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet5/1", + "Ethernet5/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet5/1", + "Ethernet5/3", + "Ethernet5/5", + "Ethernet5/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet5/1", + "Ethernet5/2", + "Ethernet5/3", + "Ethernet5/4", + "Ethernet5/5", + "Ethernet5/6", + "Ethernet5/7", + "Ethernet5/8" + ] + } + }, + "Ethernet40": { + "index": "6,6,6,6,6,6,6,6", + "lanes": "33,34,35,36,37,38,39,40", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet6/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet6/1", + "Ethernet6/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet6/1", + "Ethernet6/3", + "Ethernet6/5", + "Ethernet6/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet6/1", + "Ethernet6/2", + "Ethernet6/3", + "Ethernet6/4", + "Ethernet6/5", + "Ethernet6/6", + "Ethernet6/7", + "Ethernet6/8" + ] + } + }, + "Ethernet48": { + "index": "7,7,7,7,7,7,7,7", + "lanes": "57,58,59,60,61,62,63,64", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet7/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet7/1", + "Ethernet7/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet7/1", + "Ethernet7/3", + "Ethernet7/5", + "Ethernet7/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet7/1", + "Ethernet7/2", + "Ethernet7/3", + "Ethernet7/4", + "Ethernet7/5", + "Ethernet7/6", + "Ethernet7/7", + "Ethernet7/8" + ] + } + }, + "Ethernet56": { + "index": "8,8,8,8,8,8,8,8", + "lanes": "49,50,51,52,53,54,55,56", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet8/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet8/1", + "Ethernet8/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet8/1", + "Ethernet8/3", + "Ethernet8/5", + "Ethernet8/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet8/1", + "Ethernet8/2", + "Ethernet8/3", + "Ethernet8/4", + "Ethernet8/5", + "Ethernet8/6", + "Ethernet8/7", + "Ethernet8/8" + ] + } + }, + "Ethernet64": { + "index": "9,9,9,9,9,9,9,9", + "lanes": "73,74,75,76,77,78,79,80", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet9/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet9/1", + "Ethernet9/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet9/1", + "Ethernet9/3", + "Ethernet9/5", + "Ethernet9/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet9/1", + "Ethernet9/2", + "Ethernet9/3", + "Ethernet9/4", + "Ethernet9/5", + "Ethernet9/6", + "Ethernet9/7", + "Ethernet9/8" + ] + } + }, + "Ethernet72": { + "index": "10,10,10,10,10,10,10,10", + "lanes": "65,66,67,68,69,70,71,72", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet10/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet10/1", + "Ethernet10/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet10/1", + "Ethernet10/3", + "Ethernet10/5", + "Ethernet10/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet10/1", + "Ethernet10/2", + "Ethernet10/3", + "Ethernet10/4", + "Ethernet10/5", + "Ethernet10/6", + "Ethernet10/7", + "Ethernet10/8" + ] + } + }, + "Ethernet80": { + "index": "11,11,11,11,11,11,11,11", + "lanes": "89,90,91,92,93,94,95,96", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet11/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet11/1", + "Ethernet11/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet11/1", + "Ethernet11/3", + "Ethernet11/5", + "Ethernet11/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet11/1", + "Ethernet11/2", + "Ethernet11/3", + "Ethernet11/4", + "Ethernet11/5", + "Ethernet11/6", + "Ethernet11/7", + "Ethernet11/8" + ] + } + }, + "Ethernet88": { + "index": "12,12,12,12,12,12,12,12", + "lanes": "81,82,83,84,85,86,87,88", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet12/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet12/1", + "Ethernet12/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet12/1", + "Ethernet12/3", + "Ethernet12/5", + "Ethernet12/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet12/1", + "Ethernet12/2", + "Ethernet12/3", + "Ethernet12/4", + "Ethernet12/5", + "Ethernet12/6", + "Ethernet12/7", + "Ethernet12/8" + ] + } + }, + "Ethernet96": { + "index": "13,13,13,13,13,13,13,13", + "lanes": "105,106,107,108,109,110,111,112", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet13/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet13/1", + "Ethernet13/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet13/1", + "Ethernet13/3", + "Ethernet13/5", + "Ethernet13/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet13/1", + "Ethernet13/2", + "Ethernet13/3", + "Ethernet13/4", + "Ethernet13/5", + "Ethernet13/6", + "Ethernet13/7", + "Ethernet13/8" + ] + } + }, + "Ethernet104": { + "index": "14,14,14,14,14,14,14,14", + "lanes": "97,98,99,100,101,102,103,104", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet14/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet14/1", + "Ethernet14/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet14/1", + "Ethernet14/3", + "Ethernet14/5", + "Ethernet14/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet14/1", + "Ethernet14/2", + "Ethernet14/3", + "Ethernet14/4", + "Ethernet14/5", + "Ethernet14/6", + "Ethernet14/7", + "Ethernet14/8" + ] + } + }, + "Ethernet112": { + "index": "15,15,15,15,15,15,15,15", + "lanes": "121,122,123,124,125,126,127,128", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet15/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet15/1", + "Ethernet15/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet15/1", + "Ethernet15/3", + "Ethernet15/5", + "Ethernet15/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet15/1", + "Ethernet15/2", + "Ethernet15/3", + "Ethernet15/4", + "Ethernet15/5", + "Ethernet15/6", + "Ethernet15/7", + "Ethernet15/8" + ] + } + }, + "Ethernet120": { + "index": "16,16,16,16,16,16,16,16", + "lanes": "117,118,119,120,121,122,123,124", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet16/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet16/1", + "Ethernet16/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet16/1", + "Ethernet16/3", + "Ethernet16/5", + "Ethernet16/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet16/1", + "Ethernet16/2", + "Ethernet16/3", + "Ethernet16/4", + "Ethernet16/5", + "Ethernet16/6", + "Ethernet16/7", + "Ethernet16/8" + ] + } + }, + "Ethernet128": { + "index": "17,17,17,17,17,17,17,17", + "lanes": "141,142,143,144,145,146,147,148", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet17/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet17/1", + "Ethernet17/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet17/1", + "Ethernet17/3", + "Ethernet17/5", + "Ethernet17/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet17/1", + "Ethernet17/2", + "Ethernet17/3", + "Ethernet17/4", + "Ethernet17/5", + "Ethernet17/6", + "Ethernet17/7", + "Ethernet17/8" + ] + } + }, + "Ethernet136": { + "index": "18,18,18,18,18,18,18,18", + "lanes": "129,130,131,132,133,134,135,136", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet18/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet18/1", + "Ethernet18/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet18/1", + "Ethernet18/3", + "Ethernet18/5", + "Ethernet18/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet18/1", + "Ethernet18/2", + "Ethernet18/3", + "Ethernet18/4", + "Ethernet18/5", + "Ethernet18/6", + "Ethernet18/7", + "Ethernet18/8" + ] + } + }, + "Ethernet144": { + "index": "19,19,19,19,19,19,19,19", + "lanes": "153,154,155,156,157,158,159,160", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet19/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet19/1", + "Ethernet19/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet19/1", + "Ethernet19/3", + "Ethernet19/5", + "Ethernet19/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet19/1", + "Ethernet19/2", + "Ethernet19/3", + "Ethernet19/4", + "Ethernet19/5", + "Ethernet19/6", + "Ethernet19/7", + "Ethernet19/8" + ] + } + }, + "Ethernet152": { + "index": "20,20,20,20,20,20,20,20", + "lanes": "145,146,147,148,149,150,151,152", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet20/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet20/1", + "Ethernet20/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet20/1", + "Ethernet20/3", + "Ethernet20/5", + "Ethernet20/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet20/1", + "Ethernet20/2", + "Ethernet20/3", + "Ethernet20/4", + "Ethernet20/5", + "Ethernet20/6", + "Ethernet20/7", + "Ethernet20/8" + ] + } + }, + "Ethernet160": { + "index": "21,21,21,21,21,21,21,21", + "lanes": "169,170,171,172,173,174,175,176", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet21/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet21/1", + "Ethernet21/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet21/1", + "Ethernet21/3", + "Ethernet21/5", + "Ethernet21/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet21/1", + "Ethernet21/2", + "Ethernet21/3", + "Ethernet21/4", + "Ethernet21/5", + "Ethernet21/6", + "Ethernet21/7", + "Ethernet21/8" + ] + } + }, + "Ethernet168": { + "index": "22,22,22,22,22,22,22,22", + "lanes": "161,162,163,164,165,166,167,168", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet22/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet22/1", + "Ethernet22/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet22/1", + "Ethernet22/3", + "Ethernet22/5", + "Ethernet22/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet22/1", + "Ethernet22/2", + "Ethernet22/3", + "Ethernet22/4", + "Ethernet22/5", + "Ethernet22/6", + "Ethernet22/7", + "Ethernet22/8" + ] + } + }, + "Ethernet176": { + "index": "23,23,23,23,23,23,23,23", + "lanes": "185,186,187,188,189,190,191,192", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet23/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet23/1", + "Ethernet23/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet23/1", + "Ethernet23/3", + "Ethernet23/5", + "Ethernet23/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet23/1", + "Ethernet23/2", + "Ethernet23/3", + "Ethernet23/4", + "Ethernet23/5", + "Ethernet23/6", + "Ethernet23/7", + "Ethernet23/8" + ] + } + }, + "Ethernet184": { + "index": "24,24,24,24,24,24,24,24", + "lanes": "177,178,179,180,181,182,183,184", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet24/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet24/1", + "Ethernet24/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet24/1", + "Ethernet24/3", + "Ethernet24/5", + "Ethernet24/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet24/1", + "Ethernet24/2", + "Ethernet24/3", + "Ethernet24/4", + "Ethernet24/5", + "Ethernet24/6", + "Ethernet24/7", + "Ethernet24/8" + ] + } + }, + "Ethernet192": { + "index": "25,25,25,25,25,25,25,25", + "lanes": "201,202,203,204,205,206,207,208", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet25/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet25/1", + "Ethernet25/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet25/1", + "Ethernet25/3", + "Ethernet25/5", + "Ethernet25/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet25/1", + "Ethernet25/2", + "Ethernet25/3", + "Ethernet25/4", + "Ethernet25/5", + "Ethernet25/6", + "Ethernet25/7", + "Ethernet25/8" + ] + } + }, + "Ethernet200": { + "index": "26,26,26,26,26,26,26,26", + "lanes": "193,194,195,196,197,198,199,200", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet26/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet26/1", + "Ethernet26/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet26/1", + "Ethernet26/3", + "Ethernet26/5", + "Ethernet26/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet26/1", + "Ethernet26/2", + "Ethernet26/3", + "Ethernet26/4", + "Ethernet26/5", + "Ethernet26/6", + "Ethernet26/7", + "Ethernet26/8" + ] + } + }, + "Ethernet208": { + "index": "27,27,27,27,27,27,27,27", + "lanes": "217,218,219,220,221,222,223,224", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet27/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet27/1", + "Ethernet27/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet27/1", + "Ethernet27/3", + "Ethernet27/5", + "Ethernet27/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet27/1", + "Ethernet27/2", + "Ethernet27/3", + "Ethernet27/4", + "Ethernet27/5", + "Ethernet27/6", + "Ethernet27/7", + "Ethernet27/8" + ] + } + }, + "Ethernet216": { + "index": "28,28,28,28,28,28,28,28", + "lanes": "209,210,211,212,213,214,215,216", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet28/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet28/1", + "Ethernet28/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet28/1", + "Ethernet28/3", + "Ethernet28/5", + "Ethernet28/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet28/1", + "Ethernet28/2", + "Ethernet28/3", + "Ethernet28/4", + "Ethernet28/5", + "Ethernet28/6", + "Ethernet28/7", + "Ethernet28/8" + ] + } + }, + "Ethernet224": { + "index": "29,29,29,29,29,29,29,29", + "lanes": "233,234,235,236,237,238,239,240", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet29/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet29/1", + "Ethernet29/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet29/1", + "Ethernet29/3", + "Ethernet29/5", + "Ethernet29/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet29/1", + "Ethernet29/2", + "Ethernet29/3", + "Ethernet29/4", + "Ethernet29/5", + "Ethernet29/6", + "Ethernet29/7", + "Ethernet29/8" + ] + } + }, + "Ethernet232": { + "index": "30,30,30,30,30,30,30,30", + "lanes": "225,226,227,228,229,230,231,232", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet30/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet30/1", + "Ethernet30/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet30/1", + "Ethernet30/3", + "Ethernet30/5", + "Ethernet30/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet30/1", + "Ethernet30/2", + "Ethernet30/3", + "Ethernet30/4", + "Ethernet30/5", + "Ethernet30/6", + "Ethernet30/7", + "Ethernet30/8" + ] + } + }, + "Ethernet240": { + "index": "31,31,31,31,31,31,31,31", + "lanes": "241,242,243,244,245,246,247,248", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet31/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet31/1", + "Ethernet31/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet31/1", + "Ethernet31/3", + "Ethernet31/5", + "Ethernet31/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet31/1", + "Ethernet31/2", + "Ethernet31/3", + "Ethernet31/4", + "Ethernet31/5", + "Ethernet31/6", + "Ethernet31/7", + "Ethernet31/8" + ] + } + }, + "Ethernet248": { + "index": "32,32,32,32,32,32,32,32", + "lanes": "253,254,255,256,257,258,259,260", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet32/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet32/1", + "Ethernet32/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet32/1", + "Ethernet32/3", + "Ethernet32/5", + "Ethernet32/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet32/1", + "Ethernet32/2", + "Ethernet32/3", + "Ethernet32/4", + "Ethernet32/5", + "Ethernet32/6", + "Ethernet32/7", + "Ethernet32/8" + ] + } + }, + "Ethernet256": { + "index": "33,33,33,33,33,33,33,33", + "lanes": "1,2,3,4,5,6,7,8", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet33/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet33/1", + "Ethernet33/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet33/1", + "Ethernet33/3", + "Ethernet33/5", + "Ethernet33/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet33/1", + "Ethernet33/2", + "Ethernet33/3", + "Ethernet33/4", + "Ethernet33/5", + "Ethernet33/6", + "Ethernet33/7", + "Ethernet33/8" + ] + } + }, + "Ethernet264": { + "index": "34,34,34,34,34,34,34,34", + "lanes": "13,14,15,16,17,18,19,20", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet34/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet34/1", + "Ethernet34/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet34/1", + "Ethernet34/3", + "Ethernet34/5", + "Ethernet34/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet34/1", + "Ethernet34/2", + "Ethernet34/3", + "Ethernet34/4", + "Ethernet34/5", + "Ethernet34/6", + "Ethernet34/7", + "Ethernet34/8" + ] + } + }, + "Ethernet272": { + "index": "35,35,35,35,35,35,35,35", + "lanes": "29,30,31,32,33,34,35,36", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet35/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet35/1", + "Ethernet35/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet35/1", + "Ethernet35/3", + "Ethernet35/5", + "Ethernet35/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet35/1", + "Ethernet35/2", + "Ethernet35/3", + "Ethernet35/4", + "Ethernet35/5", + "Ethernet35/6", + "Ethernet35/7", + "Ethernet35/8" + ] + } + }, + "Ethernet280": { + "index": "36,36,36,36,36,36,36,36", + "lanes": "21,22,23,24,25,26,27,28", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet36/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet36/1", + "Ethernet36/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet36/1", + "Ethernet36/3", + "Ethernet36/5", + "Ethernet36/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet36/1", + "Ethernet36/2", + "Ethernet36/3", + "Ethernet36/4", + "Ethernet36/5", + "Ethernet36/6", + "Ethernet36/7", + "Ethernet36/8" + ] + } + }, + "Ethernet288": { + "index": "37,37,37,37,37,37,37,37", + "lanes": "45,46,47,48,49,50,51,52", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet37/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet37/1", + "Ethernet37/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet37/1", + "Ethernet37/3", + "Ethernet37/5", + "Ethernet37/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet37/1", + "Ethernet37/2", + "Ethernet37/3", + "Ethernet37/4", + "Ethernet37/5", + "Ethernet37/6", + "Ethernet37/7", + "Ethernet37/8" + ] + } + }, + "Ethernet296": { + "index": "38,38,38,38,38,38,38,38", + "lanes": "37,38,39,40,41,42,43,44", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet38/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet38/1", + "Ethernet38/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet38/1", + "Ethernet38/3", + "Ethernet38/5", + "Ethernet38/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet38/1", + "Ethernet38/2", + "Ethernet38/3", + "Ethernet38/4", + "Ethernet38/5", + "Ethernet38/6", + "Ethernet38/7", + "Ethernet38/8" + ] + } + }, + "Ethernet304": { + "index": "39,39,39,39,39,39,39,39", + "lanes": "61,62,63,64,65,66,67,68", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet39/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet39/1", + "Ethernet39/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet39/1", + "Ethernet39/3", + "Ethernet39/5", + "Ethernet39/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet39/1", + "Ethernet39/2", + "Ethernet39/3", + "Ethernet39/4", + "Ethernet39/5", + "Ethernet39/6", + "Ethernet39/7", + "Ethernet39/8" + ] + } + }, + "Ethernet312": { + "index": "40,40,40,40,40,40,40,40", + "lanes": "53,54,55,56,57,58,59,60", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet40/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet40/1", + "Ethernet40/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet40/1", + "Ethernet40/3", + "Ethernet40/5", + "Ethernet40/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet40/1", + "Ethernet40/2", + "Ethernet40/3", + "Ethernet40/4", + "Ethernet40/5", + "Ethernet40/6", + "Ethernet40/7", + "Ethernet40/8" + ] + } + }, + "Ethernet320": { + "index": "41,41,41,41,41,41,41,41", + "lanes": "77,78,79,80,81,82,83,84", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet41/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet41/1", + "Ethernet41/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet41/1", + "Ethernet41/3", + "Ethernet41/5", + "Ethernet41/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet41/1", + "Ethernet41/2", + "Ethernet41/3", + "Ethernet41/4", + "Ethernet41/5", + "Ethernet41/6", + "Ethernet41/7", + "Ethernet41/8" + ] + } + }, + "Ethernet328": { + "index": "42,42,42,42,42,42,42,42", + "lanes": "69,70,71,72,73,74,75,76", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet42/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet42/1", + "Ethernet42/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet42/1", + "Ethernet42/3", + "Ethernet42/5", + "Ethernet42/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet42/1", + "Ethernet42/2", + "Ethernet42/3", + "Ethernet42/4", + "Ethernet42/5", + "Ethernet42/6", + "Ethernet42/7", + "Ethernet42/8" + ] + } + }, + "Ethernet336": { + "index": "43,43,43,43,43,43,43,43", + "lanes": "93,94,95,96,97,98,99,100", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet43/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet43/1", + "Ethernet43/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet43/1", + "Ethernet43/3", + "Ethernet43/5", + "Ethernet43/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet43/1", + "Ethernet43/2", + "Ethernet43/3", + "Ethernet43/4", + "Ethernet43/5", + "Ethernet43/6", + "Ethernet43/7", + "Ethernet43/8" + ] + } + }, + "Ethernet344": { + "index": "44,44,44,44,44,44,44,44", + "lanes": "85,86,87,88,89,90,91,92", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet44/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet44/1", + "Ethernet44/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet44/1", + "Ethernet44/3", + "Ethernet44/5", + "Ethernet44/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet44/1", + "Ethernet44/2", + "Ethernet44/3", + "Ethernet44/4", + "Ethernet44/5", + "Ethernet44/6", + "Ethernet44/7", + "Ethernet44/8" + ] + } + }, + "Ethernet352": { + "index": "45,45,45,45,45,45,45,45", + "lanes": "109,110,111,112,113,114,115,116", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet45/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet45/1", + "Ethernet45/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet45/1", + "Ethernet45/3", + "Ethernet45/5", + "Ethernet45/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet45/1", + "Ethernet45/2", + "Ethernet45/3", + "Ethernet45/4", + "Ethernet45/5", + "Ethernet45/6", + "Ethernet45/7", + "Ethernet45/8" + ] + } + }, + "Ethernet360": { + "index": "46,46,46,46,46,46,46,46", + "lanes": "101,102,103,104,105,106,107,108", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet46/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet46/1", + "Ethernet46/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet46/1", + "Ethernet46/3", + "Ethernet46/5", + "Ethernet46/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet46/1", + "Ethernet46/2", + "Ethernet46/3", + "Ethernet46/4", + "Ethernet46/5", + "Ethernet46/6", + "Ethernet46/7", + "Ethernet46/8" + ] + } + }, + "Ethernet368": { + "index": "47,47,47,47,47,47,47,47", + "lanes": "125,126,127,128,129,130,131,132", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet47/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet47/1", + "Ethernet47/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet47/1", + "Ethernet47/3", + "Ethernet47/5", + "Ethernet47/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet47/1", + "Ethernet47/2", + "Ethernet47/3", + "Ethernet47/4", + "Ethernet47/5", + "Ethernet47/6", + "Ethernet47/7", + "Ethernet47/8" + ] + } + }, + "Ethernet376": { + "index": "48,48,48,48,48,48,48,48", + "lanes": "113,114,115,116,117,118,119,120", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet48/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet48/1", + "Ethernet48/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet48/1", + "Ethernet48/3", + "Ethernet48/5", + "Ethernet48/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet48/1", + "Ethernet48/2", + "Ethernet48/3", + "Ethernet48/4", + "Ethernet48/5", + "Ethernet48/6", + "Ethernet48/7", + "Ethernet48/8" + ] + } + }, + "Ethernet384": { + "index": "49,49,49,49,49,49,49,49", + "lanes": "137,138,139,140,141,142,143,144", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet49/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet49/1", + "Ethernet49/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet49/1", + "Ethernet49/3", + "Ethernet49/5", + "Ethernet49/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet49/1", + "Ethernet49/2", + "Ethernet49/3", + "Ethernet49/4", + "Ethernet49/5", + "Ethernet49/6", + "Ethernet49/7", + "Ethernet49/8" + ] + } + }, + "Ethernet392": { + "index": "50,50,50,50,50,50,50,50", + "lanes": "133,134,135,136,137,138,139,140", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet50/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet50/1", + "Ethernet50/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet50/1", + "Ethernet50/3", + "Ethernet50/5", + "Ethernet50/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet50/1", + "Ethernet50/2", + "Ethernet50/3", + "Ethernet50/4", + "Ethernet50/5", + "Ethernet50/6", + "Ethernet50/7", + "Ethernet50/8" + ] + } + }, + "Ethernet400": { + "index": "51,51,51,51,51,51,51,51", + "lanes": "157,158,159,160,161,162,163,164", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet51/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet51/1", + "Ethernet51/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet51/1", + "Ethernet51/3", + "Ethernet51/5", + "Ethernet51/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet51/1", + "Ethernet51/2", + "Ethernet51/3", + "Ethernet51/4", + "Ethernet51/5", + "Ethernet51/6", + "Ethernet51/7", + "Ethernet51/8" + ] + } + }, + "Ethernet408": { + "index": "52,52,52,52,52,52,52,52", + "lanes": "149,150,151,152,153,154,155,156", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet52/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet52/1", + "Ethernet52/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet52/1", + "Ethernet52/3", + "Ethernet52/5", + "Ethernet52/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet52/1", + "Ethernet52/2", + "Ethernet52/3", + "Ethernet52/4", + "Ethernet52/5", + "Ethernet52/6", + "Ethernet52/7", + "Ethernet52/8" + ] + } + }, + "Ethernet416": { + "index": "53,53,53,53,53,53,53,53", + "lanes": "173,174,175,176,177,178,179,180", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet53/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet53/1", + "Ethernet53/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet53/1", + "Ethernet53/3", + "Ethernet53/5", + "Ethernet53/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet53/1", + "Ethernet53/2", + "Ethernet53/3", + "Ethernet53/4", + "Ethernet53/5", + "Ethernet53/6", + "Ethernet53/7", + "Ethernet53/8" + ] + } + }, + "Ethernet424": { + "index": "54,54,54,54,54,54,54,54", + "lanes": "165,166,167,168,169,170,171,172", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet54/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet54/1", + "Ethernet54/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet54/1", + "Ethernet54/3", + "Ethernet54/5", + "Ethernet54/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet54/1", + "Ethernet54/2", + "Ethernet54/3", + "Ethernet54/4", + "Ethernet54/5", + "Ethernet54/6", + "Ethernet54/7", + "Ethernet54/8" + ] + } + }, + "Ethernet432": { + "index": "55,55,55,55,55,55,55,55", + "lanes": "189,190,191,192,193,194,195,196", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet55/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet55/1", + "Ethernet55/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet55/1", + "Ethernet55/3", + "Ethernet55/5", + "Ethernet55/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet55/1", + "Ethernet55/2", + "Ethernet55/3", + "Ethernet55/4", + "Ethernet55/5", + "Ethernet55/6", + "Ethernet55/7", + "Ethernet55/8" + ] + } + }, + "Ethernet440": { + "index": "56,56,56,56,56,56,56,56", + "lanes": "181,182,183,184,185,186,187,188", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet56/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet56/1", + "Ethernet56/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet56/1", + "Ethernet56/3", + "Ethernet56/5", + "Ethernet56/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet56/1", + "Ethernet56/2", + "Ethernet56/3", + "Ethernet56/4", + "Ethernet56/5", + "Ethernet56/6", + "Ethernet56/7", + "Ethernet56/8" + ] + } + }, + "Ethernet448": { + "index": "57,57,57,57,57,57,57,57", + "lanes": "205,206,207,208,209,210,211,212", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet57/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet57/1", + "Ethernet57/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet57/1", + "Ethernet57/3", + "Ethernet57/5", + "Ethernet57/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet57/1", + "Ethernet57/2", + "Ethernet57/3", + "Ethernet57/4", + "Ethernet57/5", + "Ethernet57/6", + "Ethernet57/7", + "Ethernet57/8" + ] + } + }, + "Ethernet456": { + "index": "58,58,58,58,58,58,58,58", + "lanes": "197,198,199,200,201,202,203,204", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet58/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet58/1", + "Ethernet58/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet58/1", + "Ethernet58/3", + "Ethernet58/5", + "Ethernet58/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet58/1", + "Ethernet58/2", + "Ethernet58/3", + "Ethernet58/4", + "Ethernet58/5", + "Ethernet58/6", + "Ethernet58/7", + "Ethernet58/8" + ] + } + }, + "Ethernet464": { + "index": "59,59,59,59,59,59,59,59", + "lanes": "221,222,223,224,225,226,227,228", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet59/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet59/1", + "Ethernet59/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet59/1", + "Ethernet59/3", + "Ethernet59/5", + "Ethernet59/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet59/1", + "Ethernet59/2", + "Ethernet59/3", + "Ethernet59/4", + "Ethernet59/5", + "Ethernet59/6", + "Ethernet59/7", + "Ethernet59/8" + ] + } + }, + "Ethernet472": { + "index": "60,60,60,60,60,60,60,60", + "lanes": "213,214,215,216,217,218,219,220", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet60/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet60/1", + "Ethernet60/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet60/1", + "Ethernet60/3", + "Ethernet60/5", + "Ethernet60/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet60/1", + "Ethernet60/2", + "Ethernet60/3", + "Ethernet60/4", + "Ethernet60/5", + "Ethernet60/6", + "Ethernet60/7", + "Ethernet60/8" + ] + } + }, + "Ethernet480": { + "index": "61,61,61,61,61,61,61,61", + "lanes": "237,238,239,240,241,242,243,244", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet61/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet61/1", + "Ethernet61/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet61/1", + "Ethernet61/3", + "Ethernet61/5", + "Ethernet61/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet61/1", + "Ethernet61/2", + "Ethernet61/3", + "Ethernet61/4", + "Ethernet61/5", + "Ethernet61/6", + "Ethernet61/7", + "Ethernet61/8" + ] + } + }, + "Ethernet488": { + "index": "62,62,62,62,62,62,62,62", + "lanes": "229,230,231,232,233,234,235,236", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet62/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet62/1", + "Ethernet62/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet62/1", + "Ethernet62/3", + "Ethernet62/5", + "Ethernet62/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet62/1", + "Ethernet62/2", + "Ethernet62/3", + "Ethernet62/4", + "Ethernet62/5", + "Ethernet62/6", + "Ethernet62/7", + "Ethernet62/8" + ] + } + }, + "Ethernet496": { + "index": "63,63,63,63,63,63,63,63", + "lanes": "249,250,251,252,253,254,255,256", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet63/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet63/1", + "Ethernet63/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet63/1", + "Ethernet63/3", + "Ethernet63/5", + "Ethernet63/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet63/1", + "Ethernet63/2", + "Ethernet63/3", + "Ethernet63/4", + "Ethernet63/5", + "Ethernet63/6", + "Ethernet63/7", + "Ethernet63/8" + ] + } + }, + "Ethernet504": { + "index": "64,64,64,64,64,64,64,64", + "lanes": "245,246,247,248,249,250,251,252", + "breakout_modes": { + "1x400G[200G,100G,50G,40G,25G,10G]": [ + "Ethernet64/1" + ], + "2x200G[100G,50G,40G,25G,10G]": [ + "Ethernet64/1", + "Ethernet64/5" + ], + "4x100G[50G,40G,25G,10G]": [ + "Ethernet64/1", + "Ethernet64/3", + "Ethernet64/5", + "Ethernet64/7" + ], + "8x50G[40G,25G,10G]": [ + "Ethernet64/1", + "Ethernet64/2", + "Ethernet64/3", + "Ethernet64/4", + "Ethernet64/5", + "Ethernet64/6", + "Ethernet64/7", + "Ethernet64/8" + ] + } + } + } +} diff --git a/device/arista/x86_64-arista_7060dx5_64s/platform_asic b/device/arista/x86_64-arista_7060dx5_64s/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_7060dx5_64s/platform_env.conf b/device/arista/x86_64-arista_7060dx5_64s/platform_env.conf new file mode 100644 index 000000000000..77174634dce9 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/platform_env.conf @@ -0,0 +1,2 @@ +SYNCD_SHM_SIZE=128m +is_ltsw_chip=1 diff --git a/device/arista/x86_64-arista_7060dx5_64s/platform_reboot b/device/arista/x86_64-arista_7060dx5_64s/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/plugins b/device/arista/x86_64-arista_7060dx5_64s/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/pmon_daemon_control.json b/device/arista/x86_64-arista_7060dx5_64s/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/sensors.conf b/device/arista/x86_64-arista_7060dx5_64s/sensors.conf new file mode 120000 index 000000000000..540c66689653 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/sensors.conf @@ -0,0 +1 @@ +../x86_64-arista_7060px5_64s/sensors.conf \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/system_health_monitoring_config.json b/device/arista/x86_64-arista_7060dx5_64s/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060dx5_64s/thermal_policy.json b/device/arista/x86_64-arista_7060dx5_64s/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_7060dx5_64s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml new file mode 100644 index 000000000000..5db2840cef95 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/blackhawk.xml @@ -0,0 +1,29 @@ + + + CSDK-BH + 0 + retimer + 1 + + 2,-8,17,0,0 + 0,-8,17,0,0 + + 0,0,1,0,0 + + + + + + + + + + + + + + + + + + diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/context_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/context_config.json new file mode 100644 index 000000000000..4941751bfc19 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/context_config.json @@ -0,0 +1,66 @@ +{ + "CONTEXTS": [ + { + "guid" : 0, + "name" : "asic0", + "dbAsic" : "ASIC_DB", + "dbCounters" : "COUNTERS_DB", + "dbFlex": "FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable" : false, + "zmq_endpoint": "tcp://127.0.0.1:5555", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5556", + "switches": [ + { + "index" : 0, + "hwinfo" : "" + } + ] + }, + { + "guid" : 1, + "name" : "phys", + "dbAsic" : "GB_ASIC_DB", + "dbCounters" : "GB_COUNTERS_DB", + "dbFlex": "GB_FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable" : false, + "zmq_endpoint": "tcp://127.0.0.1:5565", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5566", + "switches": [ + { + "index" : 0, + "hwinfo" : "mdio0_0_0/0" + }, + { + "index" : 1, + "hwinfo" : "mdio0_0_1/0" + }, + { + "index" : 2, + "hwinfo" : "mdio1_0_0/0" + }, + { + "index" : 3, + "hwinfo" : "mdio1_0_1/0" + }, + { + "index" : 4, + "hwinfo" : "mdio2_0_0/0" + }, + { + "index" : 5, + "hwinfo" : "mdio2_0_1/0" + }, + { + "index" : 6, + "hwinfo" : "mdio3_0_0/0" + }, + { + "index" : 7, + "hwinfo" : "mdio3_0_1/0" + } + ] + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/gearbox_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/gearbox_config.json new file mode 100644 index 000000000000..b6d090ec6ef0 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/gearbox_config.json @@ -0,0 +1,166 @@ +{ + "phys": [ + { + "phy_id": 1, + "name": "phy1_1", + "address": "1", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy1_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio0_0_0/0" + }, + { + "phy_id": 2, + "name": "phy1_2", + "address": "2", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy2_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio0_0_1/0" + }, + { + "phy_id": 3, + "name": "phy2_1", + "address": "3", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy3_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio1_0_0/0" + }, + { + "phy_id": 4, + "name": "phy2_2", + "address": "4", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy4_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio1_0_1/0" + }, + { + "phy_id": 5, + "name": "phy3_1", + "address": "5", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy5_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio2_0_0/0" + }, + { + "phy_id": 6, + "name": "phy3_2", + "address": "6", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy6_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio2_0_1/0" + }, + { + "phy_id": 7, + "name": "phy4_1", + "address": "7", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy7_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio3_0_0/0" + }, + { + "phy_id": 8, + "name": "phy4_2", + "address": "8", + "lib_name": "", + "firmware_path": "/usr/etc/credo/firmware/blackhawk.lz4.fw.0.1.17.bin", + "config_file": "/usr/share/sonic/hwsku/phy8_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "mdio3_0_1/0" + } + ], + "interfaces": [ + { + "name": "Ethernet0", + "index": 1, + "phy_id": 1, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet4", + "index": 2, + "phy_id": 2, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet128", + "index": 33, + "phy_id": 3, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet132", + "index": 34, + "phy_id": 4, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet120", + "index": 31, + "phy_id": 5, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet124", + "index": 32, + "phy_id": 6, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet248", + "index": 63, + "phy_id": 7, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + }, + { + "name": "Ethernet252", + "index": 64, + "phy_id": 8, + "system_lanes": [0,1,2,3,4,5,6,7], + "line_lanes": [8,9,10,11,12,13,14,15] + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy1_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy1_config.json new file mode 100644 index 000000000000..5af904cc23ae --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy1_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 1, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy2_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy2_config.json new file mode 100644 index 000000000000..2940ee64fbb9 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy2_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 2, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy3_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy3_config.json new file mode 100644 index 000000000000..b6359f1f5918 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy3_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 33, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy4_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy4_config.json new file mode 100644 index 000000000000..16786572f36e --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy4_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 34, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy5_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy5_config.json new file mode 100644 index 000000000000..c6228e7616c9 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy5_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 31, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy6_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy6_config.json new file mode 100644 index 000000000000..369622a957a4 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy6_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 32, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy7_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy7_config.json new file mode 100644 index 000000000000..eff40ae7dd47 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy7_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 63, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy8_config.json b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy8_config.json new file mode 100644 index 000000000000..bc0a89e48d5c --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/phy8_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 64, + "mdio_addr": "", + "system_speed": 50000, + "system_fec": "rs", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 50000, + "line_fec": "rs", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "fiber", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "fiber" + } + ] +} diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/port_config.ini b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/port_config.ini new file mode 100644 index 000000000000..085b8af85b75 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias index speed +Ethernet0 1,2,3,4,5,6,7,8 Ethernet1/1 1 400000 +Ethernet8 9,10,11,12,13,14,15,16 Ethernet2/1 2 400000 +Ethernet16 17,18,19,20,21,22,23,24 Ethernet3/1 3 400000 +Ethernet24 25,26,27,28,29,30,31,32 Ethernet4/1 4 400000 +Ethernet32 33,34,35,36,37,38,39,40 Ethernet5/1 5 400000 +Ethernet40 41,42,43,44,45,46,47,48 Ethernet6/1 6 400000 +Ethernet48 49,50,51,52,53,54,55,56 Ethernet7/1 7 400000 +Ethernet56 57,58,59,60,61,62,63,64 Ethernet8/1 8 400000 +Ethernet64 65,66,67,68,69,70,71,72 Ethernet9/1 9 400000 +Ethernet72 73,74,75,76,77,78,79,80 Ethernet10/1 10 400000 +Ethernet80 81,82,83,84,85,86,87,88 Ethernet11/1 11 400000 +Ethernet88 89,90,91,92,93,94,95,96 Ethernet12/1 12 400000 +Ethernet96 97,98,99,100,101,102,103,104 Ethernet13/1 13 400000 +Ethernet104 105,106,107,108,109,110,111,112 Ethernet14/1 14 400000 +Ethernet112 113,114,115,116,117,118,119,120 Ethernet15/1 15 400000 +Ethernet120 121,122,123,124,125,126,127,128 Ethernet16/1 16 400000 +Ethernet128 129,130,131,132,133,134,135,136 Ethernet17/1 17 400000 +Ethernet136 137,138,139,140,141,142,143,144 Ethernet18/1 18 400000 +Ethernet144 145,146,147,148,149,150,151,152 Ethernet19/1 19 400000 +Ethernet152 153,154,155,156,157,158,159,160 Ethernet20/1 20 400000 +Ethernet160 161,162,163,164,165,166,167,168 Ethernet21/1 21 400000 +Ethernet168 169,170,171,172,173,174,175,176 Ethernet22/1 22 400000 +Ethernet176 177,178,179,180,181,182,183,184 Ethernet23/1 23 400000 +Ethernet184 185,186,187,188,189,190,191,192 Ethernet24/1 24 400000 +Ethernet192 193,194,195,196,197,198,199,200 Ethernet25/1 25 400000 +Ethernet200 201,202,203,204,205,206,207,208 Ethernet26/1 26 400000 +Ethernet208 209,210,211,212,213,214,215,216 Ethernet27/1 27 400000 +Ethernet216 217,218,219,220,221,222,223,224 Ethernet28/1 28 400000 +Ethernet224 225,226,227,228,229,230,231,232 Ethernet29/1 29 400000 +Ethernet232 233,234,235,236,237,238,239,240 Ethernet30/1 30 400000 +Ethernet240 241,242,243,244,245,246,247,248 Ethernet31/1 31 400000 +Ethernet248 249,250,251,252,253,254,255,256 Ethernet32/1 32 400000 +Ethernet256 257,258,259,260,261,262,263,264 Ethernet33/1 33 400000 +Ethernet264 265,266,267,268,269,270,271,272 Ethernet34/1 34 400000 +Ethernet272 273,274,275,276,277,278,279,280 Ethernet35/1 35 400000 +Ethernet280 281,282,283,284,285,286,287,288 Ethernet36/1 36 400000 +Ethernet288 289,290,291,292,293,294,295,296 Ethernet37/1 37 400000 +Ethernet296 297,298,299,300,301,302,303,304 Ethernet38/1 38 400000 +Ethernet304 305,306,307,308,309,310,311,312 Ethernet39/1 39 400000 +Ethernet312 313,314,315,316,317,318,319,320 Ethernet40/1 40 400000 +Ethernet320 321,322,323,324,325,326,327,328 Ethernet41/1 41 400000 +Ethernet328 329,330,331,332,333,334,335,336 Ethernet42/1 42 400000 +Ethernet336 337,338,339,340,341,342,343,344 Ethernet43/1 43 400000 +Ethernet344 345,346,347,348,349,350,351,352 Ethernet44/1 44 400000 +Ethernet352 353,354,355,356,357,358,359,360 Ethernet45/1 45 400000 +Ethernet360 361,362,363,364,365,366,367,368 Ethernet46/1 46 400000 +Ethernet368 369,370,371,372,373,374,375,376 Ethernet47/1 47 400000 +Ethernet376 377,378,379,380,381,382,383,384 Ethernet48/1 48 400000 +Ethernet384 385,386,387,388,389,390,391,392 Ethernet49/1 49 400000 +Ethernet392 393,394,395,396,397,398,399,400 Ethernet50/1 50 400000 +Ethernet400 401,402,403,404,405,406,407,408 Ethernet51/1 51 400000 +Ethernet408 409,410,411,412,413,414,415,416 Ethernet52/1 52 400000 +Ethernet416 417,418,419,420,421,422,423,424 Ethernet53/1 53 400000 +Ethernet424 425,426,427,428,429,430,431,432 Ethernet54/1 54 400000 +Ethernet432 433,434,435,436,437,438,439,440 Ethernet55/1 55 400000 +Ethernet440 441,442,443,444,445,446,447,448 Ethernet56/1 56 400000 +Ethernet448 449,450,451,452,453,454,455,456 Ethernet57/1 57 400000 +Ethernet456 457,458,459,460,461,462,463,464 Ethernet58/1 58 400000 +Ethernet464 465,466,467,468,469,470,471,472 Ethernet59/1 59 400000 +Ethernet472 473,474,475,476,477,478,479,480 Ethernet60/1 60 400000 +Ethernet480 481,482,483,484,485,486,487,488 Ethernet61/1 61 400000 +Ethernet488 489,490,491,492,493,494,495,496 Ethernet62/1 62 400000 +Ethernet496 497,498,499,500,501,502,503,504 Ethernet63/1 63 400000 +Ethernet504 505,506,507,508,509,510,511,512 Ethernet64/1 64 400000 diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/psai.profile b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/psai.profile new file mode 100644 index 000000000000..c4d6b362ecf1 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/psai.profile @@ -0,0 +1 @@ +SAI_KEY_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/blackhawk.xml diff --git a/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/sai.profile b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/sai.profile new file mode 100644 index 000000000000..4f4dbfc44667 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/Arista-7060PX5-64S/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th4-a7060px5-64s.config.bcm diff --git a/device/arista/x86_64-arista_7060px5_64s/default_sku b/device/arista/x86_64-arista_7060px5_64s/default_sku new file mode 100644 index 000000000000..d38cdd1e112e --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/default_sku @@ -0,0 +1 @@ +Arista-7060PX5-64S t1 diff --git a/device/arista/x86_64-arista_7060px5_64s/gbsyncd.ini b/device/arista/x86_64-arista_7060px5_64s/gbsyncd.ini new file mode 100644 index 000000000000..9bd130dff9ef --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/gbsyncd.ini @@ -0,0 +1 @@ +platform=gbsyncd-credo diff --git a/device/arista/x86_64-arista_7060px5_64s/platform_asic b/device/arista/x86_64-arista_7060px5_64s/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_7060px5_64s/platform_env.conf b/device/arista/x86_64-arista_7060px5_64s/platform_env.conf new file mode 100644 index 000000000000..77174634dce9 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/platform_env.conf @@ -0,0 +1,2 @@ +SYNCD_SHM_SIZE=128m +is_ltsw_chip=1 diff --git a/device/arista/x86_64-arista_7060px5_64s/platform_reboot b/device/arista/x86_64-arista_7060px5_64s/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px5_64s/plugins b/device/arista/x86_64-arista_7060px5_64s/plugins new file mode 120000 index 000000000000..5fbbf98a6284 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px5_64s/pmon_daemon_control.json b/device/arista/x86_64-arista_7060px5_64s/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px5_64s/sensors.conf b/device/arista/x86_64-arista_7060px5_64s/sensors.conf new file mode 100644 index 000000000000..e9f43494d6a9 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/sensors.conf @@ -0,0 +1,35 @@ +# libsensors configuration file for DCS-7060DX5-64S +# ------------------------------------------------# + +bus "i2c-19" "SCD 0000:01:00.0 SMBus master 1 bus 0" +bus "i2c-22" "SCD 0000:01:00.0 SMBus master 1 bus 3" +bus "i2c-23" "SCD 0000:01:00.0 SMBus master 1 bus 4" +bus "i2c-24" "SCD 0000:01:00.0 SMBus master 1 bus 5" +bus "i2c-107" "SCD 0000:00:18.7 SMBus master 0 bus 0" + +chip "max6581-i2c-19-4d" + label temp1 "Board sensor" + label temp2 "TH4 exhaust temp sensor" + label temp3 "Left edge PCB rear temp sensor" + label temp4 "Inlet temp sensor" + ignore temp5 + ignore temp6 + label temp7 "Diode temp sensor 1" + label temp8 "Diode temp sensor 2" + +chip "dps800-i2c-22-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 exhaust temp sensor" + +chip "dps800-i2c-23-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 exhaust temp sensor" + +chip "lm73-i2c-24-48" + label temp1 "Front panel temp sensor" + +chip "max6658-i2c-107-4c" + label temp1 "CPU board temp sensor" + label temp2 "Back panel temp sensor" diff --git a/device/arista/x86_64-arista_7060px5_64s/system_health_monitoring_config.json b/device/arista/x86_64-arista_7060px5_64s/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px5_64s/thermal_policy.json b/device/arista/x86_64-arista_7060px5_64s/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_7060px5_64s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index a3c3d8ebca06..2638df932940 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -556,6 +556,12 @@ write_platform_specific_cmdline() { if [ "$sid" = "SmartsvilleDDBkMs" ] || [ "$sid" = "SmartsvilleDDBkMsTpm" ]; then aboot_machine=arista_7280cr3mk_32d4 fi + if [ "$sid" = "CatalinaP" ]; then + aboot_machine=arista_7060px5_64s + fi + if [ "$sid" = "CatalinaDD" ]; then + aboot_machine=arista_7060dx5_64s + fi if [ "$sid" = "Clearwater2" ]; then aboot_machine=arista_7800r3_48cq2_lc sonic_mode="$linecard_mode" From 1d68efe671a4df281b6b5a41759c67627ba052aa Mon Sep 17 00:00:00 2001 From: youshcentec <63637102+youshcentec@users.noreply.github.com> Date: Fri, 17 Jun 2022 06:27:57 +0800 Subject: [PATCH 425/817] [centec]: fix docker syncd rpc compile(#11097) Change makefile to reference to new SAI dev for docker-syncd-centec-rpc compile Co-authored-by: yoush --- platform/centec-arm64/libsaithrift-dev.mk | 2 +- platform/centec-arm64/rules.mk | 4 ++-- platform/centec-arm64/sai.mk | 6 +++++- platform/centec/libsaithrift-dev.mk | 2 +- platform/centec/rules.mk | 4 ++-- platform/centec/sdk.mk | 6 +++++- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/platform/centec-arm64/libsaithrift-dev.mk b/platform/centec-arm64/libsaithrift-dev.mk index ff7fd9bc70ec..b742fda99d6f 100755 --- a/platform/centec-arm64/libsaithrift-dev.mk +++ b/platform/centec-arm64/libsaithrift-dev.mk @@ -4,7 +4,7 @@ SAI_VER = 0.9.4 LIBSAITHRIFT_DEV = libsaithrift-dev_$(SAI_VER)_$(CONFIGURED_ARCH).deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI -$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(CENTEC_SAI) $(LIBHIREDIS) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) +$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(CENTEC_SAI) $(CENTEC_SAI_DEV) $(LIBHIREDIS) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) $(CENTEC_SAI) SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) diff --git a/platform/centec-arm64/rules.mk b/platform/centec-arm64/rules.mk index 9873e8b31ceb..fe047bc48452 100755 --- a/platform/centec-arm64/rules.mk +++ b/platform/centec-arm64/rules.mk @@ -12,8 +12,8 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) \ # $(DOCKER_SYNCD_CENTEC_RPC) # Inject centec sai into syncd -$(SYNCD)_DEPENDS += $(CENTEC_SAI) -$(SYNCD)_UNINSTALLS += $(CENTEC_SAI) +$(SYNCD)_DEPENDS += $(CENTEC_SAI) $(CENTEC_SAI_DEV) +$(SYNCD)_UNINSTALLS += $(CENTEC_SAI_DEV) $(CENTEC_SAI) ifeq ($(ENABLE_SYNCD_RPC),y) $(SYNCD)_DEPENDS += $(LIBSAITHRIFT_DEV) diff --git a/platform/centec-arm64/sai.mk b/platform/centec-arm64/sai.mk index dbe94c5eb404..82dc1de5eadf 100755 --- a/platform/centec-arm64/sai.mk +++ b/platform/centec-arm64/sai.mk @@ -2,8 +2,12 @@ export CENTEC_SAI_VERSION = 1.10.1-0 export CENTEC_SAI = libsai_$(CENTEC_SAI_VERSION)_$(PLATFORM_ARCH).deb +export CENTEC_SAI_DEV = libsai-dev_$(CENTEC_SAI_VERSION)_$(PLATFORM_ARCH).deb $(CENTEC_SAI)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI) -$(eval $(call add_conflict_package,$(CENTEC_SAI),$(LIBSAIVS_DEV))) +$(CENTEC_SAI)_DEV_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI_DEV) +$(eval $(call add_conflict_package,$(CENTEC_SAI_DEV),$(LIBSAIVS_DEV))) + SONIC_ONLINE_DEBS += $(CENTEC_SAI) +SONIC_ONLINE_DEBS += $(CENTEC_SAI_DEV) diff --git a/platform/centec/libsaithrift-dev.mk b/platform/centec/libsaithrift-dev.mk index a58befacfe43..eccd730018b5 100644 --- a/platform/centec/libsaithrift-dev.mk +++ b/platform/centec/libsaithrift-dev.mk @@ -4,7 +4,7 @@ SAI_VER = 0.9.4 LIBSAITHRIFT_DEV = libsaithrift-dev_$(SAI_VER)_amd64.deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI -$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(CENTEC_SAI) $(LIBHIREDIS) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) +$(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(CENTEC_SAI) $(CENTEC_SAI_DEV) $(LIBHIREDIS) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) $(CENTEC_SAI) SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk index 5e207846f49a..2e8cdb0af9f6 100644 --- a/platform/centec/rules.mk +++ b/platform/centec/rules.mk @@ -11,8 +11,8 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk SONIC_ALL += $(SONIC_ONE_IMAGE) # Inject centec sai into syncd -$(SYNCD)_DEPENDS += $(CENTEC_SAI) -$(SYNCD)_UNINSTALLS += $(CENTEC_SAI) +$(SYNCD)_DEPENDS += $(CENTEC_SAI) $(CENTEC_SAI_DEV) +$(SYNCD)_UNINSTALLS += $(CENTEC_SAI_DEV) $(CENTEC_SAI) ifeq ($(ENABLE_SYNCD_RPC),y) $(SYNCD)_DEPENDS += $(LIBSAITHRIFT_DEV) diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk index 668fde39077a..7fe7122a4bf9 100644 --- a/platform/centec/sdk.mk +++ b/platform/centec/sdk.mk @@ -1,6 +1,10 @@ # Centec SAI CENTEC_SAI = libsai_1.10.1-0_amd64.deb $(CENTEC_SAI)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/amd64/sai/$(CENTEC_SAI) -$(eval $(call add_conflict_package,$(CENTEC_SAI),$(LIBSAIVS_DEV))) + +CENTEC_SAI_DEV = libsai-dev_1.10.1-0_amd64.deb +$(CENTEC_SAI_DEV)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/amd64/sai/$(CENTEC_SAI_DEV) +$(eval $(call add_conflict_package,$(CENTEC_SAI_DEV),$(LIBSAIVS_DEV))) SONIC_ONLINE_DEBS += $(CENTEC_SAI) +SONIC_ONLINE_DEBS += $(CENTEC_SAI_DEV) From faecf384177a4769a86b058e20a2affcef468093 Mon Sep 17 00:00:00 2001 From: Santhosh Kumar T <53558409+santhosh-kt@users.noreply.github.com> Date: Fri, 17 Jun 2022 05:20:11 +0530 Subject: [PATCH 426/817] [DellEMC] S5212F and S5224F 2.0 API changes (#10315) Why I did it S5212F - Platform API 2.0 changes S5224F - Platform API 2.0 changes How I did it Implemented the functional API's needed for Platform API 2.0 Added media_settings.json, pcie.yaml, platform.json, system_health_monitoring_config.json files. How to verify it Used the API 2.0 test suite to validate the test cases. --- .../media_settings.json | 313 ++++++++++++++ .../x86_64-dellemc_s5212f_c3538-r0/pcie.yaml | 36 ++ .../platform.json | 342 +++++++++++++++ .../plugins/eeprom.py | 7 +- .../plugins/psuutil.py | 52 ++- .../plugins/sfputil.py | 207 ++++----- .../system_health_monitoring_config.json | 11 + .../x86_64-dellemc_s5224f_c3538-r0/pcie.yaml | 41 ++ .../platform.json | 397 ++++++++++++++++++ .../plugins/pcie.yaml | 21 - .../plugins/sfputil.py | 15 +- .../system_health_monitoring_config.json | 11 + .../s5212f/sonic_platform/chassis.py | 152 ++++++- .../s5212f/sonic_platform/component.py | 95 ++++- .../s5212f/sonic_platform/eeprom.py | 44 +- .../s5212f/sonic_platform/fan.py | 71 +++- .../s5212f/sonic_platform/fan_drawer.py | 75 ++++ .../s5212f/sonic_platform/psu.py | 132 +++++- .../s5212f/sonic_platform/sfp.py | 52 +++ .../s5212f/sonic_platform/thermal.py | 41 +- .../s5212f/sonic_platform/watchdog.py | 15 +- .../s5224f/sonic_platform/chassis.py | 145 ++++++- .../s5224f/sonic_platform/component.py | 90 +++- .../s5224f/sonic_platform/eeprom.py | 9 +- .../s5224f/sonic_platform/fan.py | 63 ++- .../s5224f/sonic_platform/fan_drawer.py | 89 ++++ .../s5224f/sonic_platform/psu.py | 130 +++++- .../s5224f/sonic_platform/sfp.py | 52 +++ .../s5224f/sonic_platform/thermal.py | 21 +- .../s5224f/sonic_platform/watchdog.py | 11 +- 30 files changed, 2471 insertions(+), 269 deletions(-) create mode 100644 device/dell/x86_64-dellemc_s5212f_c3538-r0/media_settings.json create mode 100644 device/dell/x86_64-dellemc_s5212f_c3538-r0/pcie.yaml create mode 100644 device/dell/x86_64-dellemc_s5212f_c3538-r0/platform.json create mode 100644 device/dell/x86_64-dellemc_s5212f_c3538-r0/system_health_monitoring_config.json create mode 100644 device/dell/x86_64-dellemc_s5224f_c3538-r0/pcie.yaml create mode 100644 device/dell/x86_64-dellemc_s5224f_c3538-r0/platform.json delete mode 100644 device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/pcie.yaml create mode 100644 device/dell/x86_64-dellemc_s5224f_c3538-r0/system_health_monitoring_config.json diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/media_settings.json b/device/dell/x86_64-dellemc_s5212f_c3538-r0/media_settings.json new file mode 100644 index 000000000000..f91cb63ac877 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/media_settings.json @@ -0,0 +1,313 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-12": { + "(.*-C6Y7M)|(.*-V250M)|(.*-05CWK6)|(.*-53HVN)|(.*-358VV)|(.*-MV799)|(.*-59970000.)|(.*-P4YPY)|(.*-TCPM2)|(.*-JNPF8)|(.*-27GG5)|(.*-P8T4W)|(.*-JR54Y)|(.*-L56[SQ]F0..-SD-R)|(.*-61676000.)|(.*-74752.*)|(SFP\\+-CR-.*)": { + "preemphasis": { + "lane0": "0x19410a" + } + }, + "(.*-58KM3)|(.*-2JVDD)|(.*-26FN3)|(SFP28-CR-((0\\.5)|(1\\.0)|(0\\.0)|(N/A)))": { + "preemphasis": { + "lane0": "0x16440a" + } + }, + + "(.*-D0R73)|(.*-YFNDD)|(SFP28-CR-2\\.0)": { + "preemphasis": { + "lane0": "0x15430c" + } + }, + + "(.*-VXFJY)|(.*-7R9N9)|(SFP28-CR-3\\.0)": { + "preemphasis": { + "lane0": "0x17400d" + } + }, + + "(.*-9X8JP)|(SFP28-CR-.*)": { + "preemphasis": { + "lane0": "0x173f0e" + } + } + }, + + "13-15": { + "(.*-035KG)|(.*-P7C7N)|(QSFP28-CR-((0\\.5)|(1\\.0)|(0\\.0)|(N/A)))": { + "preemphasis": { + "lane0": "0x16440a", + "lane1": "0x16440a", + "lane2": "0x16440a", + "lane3": "0x16440a" + } + }, + + ".*-76V43|(QSFP28-CR-2\\.0)": { + "preemphasis": { + "lane0": "0x15430c", + "lane1": "0x15430c", + "lane2": "0x15430c", + "lane3": "0x15430c" + } + }, + + ".*-3CC35|(QSFP28-CR-3\\.0)": { + "preemphasis": { + "lane0": "0x15430c", + "lane1": "0x15430c", + "lane2": "0x15430c", + "lane3": "0x15430c" + } + }, + + ".*-FN4FC|(QSFP28-CR-.*)": { + "preemphasis": { + "lane0": "0x10460e", + "lane1": "0x10460e", + "lane2": "0x10460e", + "lane3": "0x10460e" + } + } + } + }, + + "PORT_MEDIA_SETTINGS": { + "1": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "2": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x14460a" + } + } + }, + + "3": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x063602" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "4": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x16440a" + } + } + }, + + "5": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x063602" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "6": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "7": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x063602" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "8": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x16440a" + } + } + }, + + "9": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x063602" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "10": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "11": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + "preemphasis": { + "lane0": "0x063602" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x15450a" + } + } + }, + + "12": { + "(.*-WTRD1)|(.*-RN84N)|(.*-DT87G)|(.*-HMTNW)|(.*-1F80G)|(.*-6K3Y6)|(.*-YJF03)|(.*-P9GND)|(.*-T1KCN)|(.*-1DXKP)|(.*-MT7R2)|(.*-C4DD6)|(.*-8JHPY)|(.*-PGYJT)|(.*-FCBG110SD1C)|(.*-FCCG125SD1C)|(SFP\\+-.*)": { + + "preemphasis": { + "lane0": "0x073702" + } + }, + + "(.*-P7D7R)|(.*-W4GPP)|(.*-07RN7)|(.*-3YWG7)|(.*-5CMT2)|(.*-FTLF8540P4BCL)|(SFP28-.*)": { + "preemphasis": { + "lane0": "0x16440a" + } + } + }, + + "13": { + "(.*-14NV5)|(.*-D7P80)|(.*-THPF3)|(.*-X7CCC)|(.*-YKMH7)|(.*-0X9CT)|(.*-05J8P)|(.*-5WGKD)|(.*-XFDRT)|(.*-1002971101)|(QSFP28-.*)": { + "preemphasis": { + "lane0": "0x134809", + "lane1": "0x134809", + "lane2": "0x134809", + "lane3": "0x134809" + } + }, + + "QSFP\\+-.*": { + "preemphasis": { + "lane0": "0x134809", + "lane1": "0x134809", + "lane2": "0x134809", + "lane3": "0x134809" + } + } + }, + + "14": { + "(.*-14NV5)|(.*-D7P80)|(.*-THPF3)|(.*-X7CCC)|(.*-YKMH7)|(.*-0X9CT)|(.*-05J8P)|(.*-5WGKD)|(.*-XFDRT)|(.*-1002971101)|(QSFP28-.*)": { + "preemphasis": { + "lane0": "0x134809", + "lane1": "0x134809", + "lane2": "0x134809", + "lane3": "0x134809" + } + }, + + "QSFP\\+-.*": { + "preemphasis": { + "lane0": "0x134809", + "lane1": "0x134809", + "lane2": "0x134809", + "lane3": "0x134809" + } + } + }, + + "15": { + "(.*-14NV5)|(.*-D7P80)|(.*-THPF3)|(.*-X7CCC)|(.*-YKMH7)|(.*-0X9CT)|(.*-05J8P)|(.*-5WGKD)|(.*-XFDRT)|(.*-1002971101)|(QSFP28-.*)": { + "preemphasis": { + "lane0": "0x13470a", + "lane1": "0x13470a", + "lane2": "0x13470a", + "lane3": "0x13470a" + } + }, + + "QSFP\\+-.*": { + "preemphasis": { + "lane0": "0x13470a", + "lane1": "0x13470a", + "lane2": "0x13470a", + "lane3": "0x13470a" + } + } + } + } +} diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/pcie.yaml b/device/dell/x86_64-dellemc_s5212f_c3538-r0/pcie.yaml new file mode 100644 index 000000000000..10a596d51275 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/pcie.yaml @@ -0,0 +1,36 @@ +- bus: '00' + dev: '09' + fn: '0' + id: '19a4' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #0 (rev 11)' +- bus: '00' + dev: '0b' + fn: '0' + id: '19a6' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #2 (rev 11)' +- bus: '00' + dev: '0c' + fn: '0' + id: '19a7' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #3 (rev 11)' +- bus: '02' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: '01' + dev: '00' + fn: '0' + id: 'b771' + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device b771 (rev 01)' +- bus: '03' + dev: '00' + fn: '0' + id: '7021' + name: 'Non-VGA unclassified device: Xilinx Corporation Device 7021' +- bus: '00' + dev: '14' + fn: '0' + id: '19c2' + name: 'SATA controller: Intel Corporation DNV SATA Controller 1 (rev 11)' diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/platform.json b/device/dell/x86_64-dellemc_s5212f_c3538-r0/platform.json new file mode 100644 index 000000000000..47a0722823f1 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/platform.json @@ -0,0 +1,342 @@ +{ + "chassis": { + "name": "S5212F-ON", + "status_led": { + "controllable": true, + "colors": ["blinking_green", "green", "amber", "blinking_amber"] + }, + "thermal_manager": false, + "components": [ + { + "name": "BIOS" + }, + { + "name": "FPGA" + }, + { + "name": "BMC" + }, + { + "name": "System CPLD" + }, + { + "name": "Slave CPLD 1" + } + ], + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray3", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray4", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "PSU2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "CPU On-board", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "ASIC On-board", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Left", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Middle", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Right", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Inlet Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + } + ], + "modules": [], + "sfps": [ + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "QSFP28 or later" + }, + { + "name": "QSFP28 or later" + }, + { + "name": "QSFP28 or later" + } + ] + }, + "interfaces": {} +} diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/eeprom.py b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/eeprom.py index a09ce7f3ef41..336bf3a9bf51 100644 --- a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/eeprom.py +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/eeprom.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# DellEMC S5248f +# DellEMC S5212f # # Platform and model specific eeprom subclass, inherits from the base class, # and provides the followings: @@ -9,10 +9,11 @@ # - specific encoder/decoder if there is special need ############################################################################# +import os.path + try: - import os.path from sonic_eeprom import eeprom_tlvinfo -except ImportError, e: +except ImportError as e: raise ImportError (str(e) + "- required module not found") diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py index ede68a22905f..9a71f7b91144 100644 --- a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py @@ -3,6 +3,19 @@ # Platform-specific PSU status interface for SONiC # +import logging +import sys +import subprocess + +S5212F_MAX_PSUS = 2 +IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" +IPMI_PSU_DATA_DOCKER = "ipmitool sdr list" +PSU_PRESENCE = "PSU{0}_stat" +# Use this for older firmware +# PSU_PRESENCE="PSU{0}_prsnt" +ipmi_sdr_list = "" + + try: from sonic_psu.psu_base import PsuBase except ImportError as e: @@ -17,7 +30,38 @@ def __init__(self): def isDockerEnv(self): num_docker = open('/proc/self/cgroup', 'r').read().count(":/docker") - return (num_docker > 0) + if num_docker > 0: + return True + else: + return False + + # Fetch a BMC register + def get_pmc_register(self, reg_name): + + global ipmi_sdr_list + ipmi_cmd = IPMI_PSU_DATA + dockerenv = self.isDockerEnv() + if dockerenv == True: + ipmi_cmd = IPMI_PSU_DATA_DOCKER + + status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + + if status: + logging.error('Failed to execute:' + ipmi_sdr_list) + sys.exit(0) + + for item in ipmi_sdr_list.split("\n"): + if reg_name in item: + output = item.strip() + + if not output: + print('\nFailed to fetch: ' + reg_name + ' sensor ') + sys.exit(0) + + output = output.split('|')[1] + + logging.basicConfig(level=logging.DEBUG) + return output def get_num_psus(self): """ @@ -37,7 +81,8 @@ def get_psu_status(self, index): """ # Until psu_status is implemented this is hardcoded temporarily - return 1 + status = 1 + return status def get_psu_presence(self, index): """ @@ -46,5 +91,6 @@ def get_psu_presence(self, index): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - return 1 + cmd_status, psu_status = subprocess.getstatusoutput('ipmitool raw 0x04 0x2d ' + hex(0x30 + index) + " | awk '{print substr($0,9,1)}'") + return 1 if psu_status == '1' else 0 diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/sfputil.py b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/sfputil.py index ee52d90111e6..0b93eb87f986 100644 --- a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/sfputil.py @@ -45,7 +45,7 @@ XCVR_DOM_CAPABILITY_OFFSET = 92 XCVR_DOM_CAPABILITY_WIDTH = 1 -XCVR_EEPROM_TYPE_SFP = 1 + class SfpUtil(SfpUtilBase): """Platform-specific SfpUtil class""" @@ -147,10 +147,10 @@ def get_presence(self, port_num): return False # Port offset starts with 0x4004 - port_offset = 16388 + ((port_num-1) * 16) + port_offset = 16388 + ((port_num-1) * 16) - status = self.pci_get_value(self.BASE_RES_PATH, port_offset) - reg_value = int(status) + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) # Absence of status throws error if (reg_value == "" ): @@ -161,7 +161,6 @@ def get_presence(self, port_num): if (port_num > 12): mask = (1 << 4) - # ModPrsL is active low if reg_value & mask == 0: return True @@ -174,17 +173,17 @@ def get_low_power_mode(self, port_num): if port_num < self.port_start or port_num > self.port_end: return False - # Port offset starts with 0x4000 - port_offset = 16384 + ((port_num-1) * 16) + # Port offset starts with 0x4000 + port_offset = 16384 + ((port_num-1) * 16) - status = self.pci_get_value(self.BASE_RES_PATH, port_offset) - reg_value = int(status) + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) # Absence of status throws error if (reg_value == "" ): return False - # Mask off 4th bit for presence + # Mask off 6th bit for lpmode status mask = (1 << 6) # LPMode is active high @@ -199,62 +198,68 @@ def set_low_power_mode(self, port_num, lpmode): if port_num < self.port_start or port_num > self.port_end: return False - # Port offset starts with 0x4000 - port_offset = 16384 + ((port_num-1) * 16) + # Port offset starts with 0x4000 + port_offset = 16384 + ((port_num-1) * 16) - status = self.pci_get_value(self.BASE_RES_PATH, port_offset) - reg_value = int(status) + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) # Absence of status throws error if (reg_value == "" ): return False - # Mask off 4th bit for presence + # Mask off 6th bit for lpmode status mask = (1 << 6) - # LPMode is active high; set or clear the bit accordingly + # LPMode is active high; set or clear the bit accordingly if lpmode is True: reg_value = reg_value | mask else: reg_value = reg_value & ~mask # Convert our register value back to a hex string and write back - self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + status = self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + if status != reg_value: + print ("Error: Set LP mode status %d", status) return True def reset(self, port_num): - # Check for invalid port_num + # Check for invalid port_num if port_num < self.port_start or port_num > self.port_end: return False - # Port offset starts with 0x4000 - port_offset = 16384 + ((port_num-1) * 16) + # Port offset starts with 0x4000 + port_offset = 16384 + ((port_num-1) * 16) - status = self.pci_get_value(self.BASE_RES_PATH, port_offset) - reg_value = int(status) + status = self.pci_get_value(self.BASE_RES_PATH, port_offset) + reg_value = int(status) # Absence of status throws error if (reg_value == "" ): return False - # Mask off 4th bit for presence - mask = (1 << 6) + # Mask off 4th bit for reset status + mask = (1 << 4) # ResetL is active low reg_value = reg_value & ~mask - # Convert our register value back to a hex string and write back - self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + # Convert our register value back to a hex string and write back + status = self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + if status != reg_value: + print ("Error: pci_set_value reset status %d", status) # Sleep 1 second to allow it to settle time.sleep(1) reg_value = reg_value | mask - # Convert our register value back to a hex string and write back - self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + # Convert our register value back to a hex string and write back + status = self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + if status != reg_value: + print ("Error: pci_set_value reset status %d", status) return True @@ -276,7 +281,6 @@ def get_transceiver_change_event(self, timeout=0): time.sleep(0.5) - def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict = {} @@ -288,8 +292,8 @@ def get_transceiver_dom_info_dict(self, port_num): ] transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') - if port_num in self.qsfp_ports: - offset = 0 + if port_num in self.qsfp_ports: + offset = 0 offset_xcvr = 128 file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): @@ -320,7 +324,7 @@ def get_transceiver_dom_info_dict(self, port_num): return transceiver_dom_info_dict dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: + if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) else: return transceiver_dom_info_dict @@ -352,11 +356,11 @@ def get_transceiver_dom_info_dict(self, port_num): else: return transceiver_dom_info_dict - transceiver_dom_info_dict['tx1power'] = 'N/A' + transceiver_dom_info_dict['tx1power'] = 'N/A' transceiver_dom_info_dict['tx2power'] = 'N/A' transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' - try: + try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) @@ -374,7 +378,7 @@ def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] else: - offset = 256 + offset = 256 file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None @@ -387,10 +391,10 @@ def get_transceiver_dom_info_dict(self, port_num): sfpd_obj = sff8472Dom(None,1) if sfpd_obj is None: - return transceiver_dom_info_dict + return None dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), - SFP_TEMPE_WIDTH) + SFP_TEMPE_WIDTH) if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) @@ -432,7 +436,7 @@ def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' - return transceiver_dom_info_dict + return transceiver_dom_info_dict def get_transceiver_dom_threshold_info_dict(self, port_num): transceiver_dom_threshold_info_dict = {} @@ -450,115 +454,116 @@ def get_transceiver_dom_threshold_info_dict(self, port_num): transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') if port_num in self.qsfp_ports: - file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) - if not self._sfp_eeprom_present(file_path, 0): + file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) + if not self._sfp_eeprom_present(file_path, 0): return None - try: + try: sysfsfile_eeprom = io.open(file_path, mode="rb", buffering=0) - except IOError: + except IOError: print("Error: reading sysfs file %s" % file_path) return None - sfpd_obj = sff8436Dom() - if sfpd_obj is None: + sfpd_obj = sff8436Dom() + if sfpd_obj is None: return transceiver_dom_threshold_info_dict # Dom Threshold data starts from offset 384 # Revert offset back to 0 once data is retrieved - offset = 384 - dom_module_threshold_raw = self._read_eeprom_specific_bytes( + offset = 384 + dom_module_threshold_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is not None: + if dom_module_threshold_raw is not None: dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) - else: + else: return transceiver_dom_threshold_info_dict - dom_channel_threshold_raw = self._read_eeprom_specific_bytes( + dom_channel_threshold_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_CHANNL_THRESHOLD_OFFSET), QSFP_CHANNL_THRESHOLD_WIDTH) - if dom_channel_threshold_raw is not None: + if dom_channel_threshold_raw is not None: dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) - else: + else: return transceiver_dom_threshold_info_dict - try: + try: sysfsfile_eeprom.close() - except IOError: + except IOError: print("Error: closing sysfs file %s" % file_path) return None # Threshold Data - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] else: - offset = 256 - file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) - if not self._sfp_eeprom_present(file_path, 0): + offset = 256 + file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) + if not self._sfp_eeprom_present(file_path, 0): return None - try: + try: sysfsfile_eeprom = io.open(file_path,"rb",0) - except IOError: + except IOError: print("Error: reading sysfs file %s" % file_path) return None - sfpd_obj = sff8472Dom(None,1) - if sfpd_obj is None: + sfpd_obj = sff8472Dom(None,1) + if sfpd_obj is None: return transceiver_dom_threshold_info_dict - dom_module_threshold_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, + dom_module_threshold_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) - if dom_module_threshold_raw is not None: + if dom_module_threshold_raw is not None: dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold(dom_module_threshold_raw, 0) - else: + else: return transceiver_dom_threshold_info_dict - try: + try: sysfsfile_eeprom.close() - except IOError: + except IOError: print("Error: closing sysfs file %s" % file_path) return None #Threshold Data - transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] - transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] - transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] - transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] - transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] - transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] - transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VoltageHighWarning']['value'] - transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] - transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] - transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] - transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] - transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VoltageHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] return transceiver_dom_threshold_info_dict + diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/system_health_monitoring_config.json b/device/dell/x86_64-dellemc_s5212f_c3538-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..2fdb993a6449 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["fan.speed"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "amber", + "normal": "green", + "booting": "blinking_green" + } +} diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/pcie.yaml b/device/dell/x86_64-dellemc_s5224f_c3538-r0/pcie.yaml new file mode 100644 index 000000000000..de3221081857 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5224f_c3538-r0/pcie.yaml @@ -0,0 +1,41 @@ +- bus: '00' + dev: '09' + fn: '0' + id: '19a4' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #0 (rev 11)' +- bus: '00' + dev: '0b' + fn: '0' + id: '19a6' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #2 (rev 11)' +- bus: '00' + dev: '0c' + fn: '0' + id: '19a7' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #3 (rev 11)' +- bus: '00' + dev: '0e' + fn: '0' + id: '19a8' + name: 'Intel Corporation Atom Processor C3000 Series PCI Express Root Port #4 (rev 11)' +- bus: '03' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: '02' + dev: '00' + fn: '0' + id: b771 + name: 'Ethernet controller: Broadcom Limited Device b771 (rev 01)' +- bus: '04' + dev: '00' + fn: '0' + id: '7021' + name: 'Non-VGA unclassified device: Xilinx Corporation Device 7021' +- bus: '00' + dev: '14' + fn: '0' + id: 19c2 + name: 'SATA controller: Intel Corporation DNV SATA Controller 1 (rev 11)' diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/platform.json b/device/dell/x86_64-dellemc_s5224f_c3538-r0/platform.json new file mode 100644 index 000000000000..54823f6c31e5 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5224f_c3538-r0/platform.json @@ -0,0 +1,397 @@ +{ + "chassis": { + "name": "S5224F-ON", + "status_led": { + "controllable": true, + "colors": ["blinking_green", "green", "amber", "blinking_amber"] + }, + "thermal_manager": false, + "components": [ + { + "name": "BIOS" + }, + { + "name": "FPGA" + }, + { + "name": "BMC" + }, + { + "name": "System CPLD" + }, + { + "name": "Slave CPLD 1" + } + ], + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray3", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray4", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan2", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "PSU2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "CPU On-board", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "ASIC On-board", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Left", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Middle", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "System Front Right", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Inlet Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU1 Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU2 Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + } + ], + "modules": [], + "sfps": [ + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "QSFP28 or later" + }, + { + "name": "QSFP28 or later" + }, + { + "name": "QSFP28 or later" + }, + { + "name": "QSFP28 or later" + } + ] + }, + "interfaces": {} +} diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/pcie.yaml b/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/pcie.yaml deleted file mode 100644 index c9c41d889ebd..000000000000 --- a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/pcie.yaml +++ /dev/null @@ -1,21 +0,0 @@ -- bus: '03' - dev: '00' - fn: '0' - id: '1533' - name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev - 03)' -- bus: '02' - dev: '00' - fn: '0' - id: b771 - name: 'Ethernet controller: Broadcom Limited Device b771 (rev 01)' -- bus: '04' - dev: '00' - fn: '0' - id: '7021' - name: 'Non-VGA unclassified device: Xilinx Corporation Device 7021' -- bus: '00' - dev: '14' - fn: '0' - id: 19c2 - name: 'SATA controller: Intel Corporation DNV SATA Controller 1 (rev 11)' diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/sfputil.py b/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/sfputil.py index b0fb250b0bb7..b6e787f5085c 100644 --- a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/sfputil.py @@ -48,7 +48,6 @@ XCVR_DOM_CAPABILITY_WIDTH = 1 - class SfpUtil(SfpUtilBase): """Platform-specific SfpUtil class""" @@ -166,7 +165,7 @@ def get_low_power_mode(self, port_num): if (reg_value == "" ): return False - # Mask off 4th bit for presence + # Mask off 6th bit for lpmode status mask = (1 << 6) # LPMode is active high @@ -191,7 +190,7 @@ def set_low_power_mode(self, port_num, lpmode): if (reg_value == "" ): return False - # Mask off 4th bit for presence + # Mask off 6th bit for lpmode status mask = (1 << 6) # LPMode is active high; set or clear the bit accordingly @@ -223,8 +222,8 @@ def reset(self, port_num): if (reg_value == "" ): return False - # Mask off 4th bit for presence - mask = (1 << 6) + # Mask off 4th bit for reset status + mask = (1 << 4) # ResetL is active low reg_value = reg_value & ~mask @@ -375,8 +374,10 @@ def get_transceiver_dom_info_dict(self, port_num): sfpd_obj = sff8472Dom(None,1) if sfpd_obj is None: return None + dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), - SFP_TEMPE_WIDTH) + SFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) else: @@ -417,7 +418,7 @@ def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' - return transceiver_dom_info_dict + return transceiver_dom_info_dict def get_transceiver_dom_threshold_info_dict(self, port_num): transceiver_dom_threshold_info_dict = {} diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/system_health_monitoring_config.json b/device/dell/x86_64-dellemc_s5224f_c3538-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..2fdb993a6449 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5224f_c3538-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["fan.speed"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "amber", + "normal": "green", + "booting": "blinking_green" + } +} diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/chassis.py index 629f4e73f7b7..eb99821ae8a7 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/chassis.py @@ -20,7 +20,7 @@ from sonic_platform.thermal import Thermal from sonic_platform.fan_drawer import FanDrawer from sonic_platform.watchdog import Watchdog - from sonic_platform.fan import Fan + from sonic_platform.hwaccess import pci_get_value, pci_set_value except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -29,6 +29,9 @@ MAX_S5212F_FAN = 2 MAX_S5212F_PSU = 2 MAX_S5212F_THERMAL = 6 +SYSTEM_LED_REG = 0x24 +SYSTEM_BEACON_LED_SET = 0x8 +SYSTEM_BEACON_LED_CLEAR = 0xFFFFFFF7 media_part_num_list = set([ \ "8T47V","XTY28","MHVPK","GF76J","J6FGD","F1KMV","9DN5J","H4DHD","6MCNV","0WRX0","X7F70","5R2PT","WTRD1","WTRD1","WTRD1","WTRD1","5250G","WTRD1","C5RNH","C5RNH","FTLX8571D3BCL-FC", @@ -53,14 +56,32 @@ class Chassis(ChassisBase): REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason" OIR_FD_PATH = "/sys/bus/pci/devices/0000:03:00.0/port_msi" + pci_res = "/sys/bus/pci/devices/0000:03:00.0/resource0" oir_fd = -1 epoll = -1 + sysled_offset = 0x0024 + SYSLED_COLOR_TO_REG = { + "blinking_green": 0x0, + "green" : 0x10, + "amber" : 0x20, + "blinking_amber": 0x30 + } + + REG_TO_SYSLED_COLOR = { + 0x0 : "blinking_green", + 0x10 : "green", + 0x20 : "amber", + 0x30 : "blinking_amber" + } + _global_port_pres_dict = {} def __init__(self): ChassisBase.__init__(self) + self.STATUS_LED_COLOR_BLUE_BLINK = "blinking blue" + self.STATUS_LED_COLOR_OFF = "off" # sfp.py will read eeprom contents and retrive the eeprom data. # We pass the eeprom path from chassis.py self.PORT_START = 1 @@ -79,6 +100,9 @@ def __init__(self): self._sfp_list.append(sfp_node) self._eeprom = Eeprom() + self._watchdog = Watchdog() + self._num_sfps = self.PORT_END + self._num_fans = MAX_S5212F_FAN * MAX_S5212F_FANTRAY for i in range(MAX_S5212F_THERMAL): thermal = Thermal(i) @@ -92,12 +116,6 @@ def __init__(self): psu = Psu(i) self._psu_list.append(psu) - - for i in range(MAX_S5212F_FANTRAY): - for j in range(MAX_S5212F_FAN): - fan = Fan(i,j) - self._fan_list.append(fan) - for i in range(MAX_S5212F_FANTRAY): fandrawer = FanDrawer(i) self._fan_drawer_list.append(fandrawer) @@ -105,13 +123,15 @@ def __init__(self): for port_num in range(self.PORT_START, (self.PORT_END + 1)): # sfp get uses zero-indexing, but port numbers start from 1 - presence = self.get_sfp(port_num).get_presence() + presence = self.get_sfp(port_num-1).get_presence() if presence: self._global_port_pres_dict[port_num] = '1' else: self._global_port_pres_dict[port_num] = '0' - self._watchdog = Watchdog() + self.LOCATOR_LED_ON = self.STATUS_LED_COLOR_BLUE_BLINK + self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF + def __del__(self): if self.oir_fd != -1: @@ -180,12 +200,12 @@ def get_change_event(self, timeout=0): port_dict[port_num] = '0' if(len(port_dict) > 0): - return True, change_dict + return True, change_dict if timeout: now_ms = time.time() * 1000 if (now_ms - start_ms >= timeout): - return True, change_dict + return True, change_dict def get_sfp(self, index): @@ -286,6 +306,34 @@ def get_system_eeprom_info(self): values. """ return self._eeprom.system_eeprom_info() + + def get_eeprom(self): + """ + Retrieves the Sys Eeprom instance for the chassis. + Returns : + The instance of the Sys Eeprom + """ + return self._eeprom + + def get_num_fans(self): + """ + Retrives the number of Fans on the chassis. + Returns : + An integer represents the number of Fans on the chassis. + """ + return self._num_fans + + def get_num_sfps(self): + """ + Retrives the numnber of Media on the chassis. + Returns: + An integer represences the number of SFPs on the chassis. + """ + return self._num_sfps + + def initizalize_system_led(self): + self.sys_ledcolor = "green" + def get_reboot_cause(self): """ Retrieves the cause of the previous reboot @@ -325,3 +373,85 @@ def get_reboot_cause(self): def get_qualified_media_list(self): return media_part_num_list + + def set_locator_led(self, color): + """ + Sets the state of the Chassis Locator LED + Args: + color: A string representing the color with which to set the Chassis Locator LED + Returns: + bool: True if the Chassis Locator LED state is set successfully, False if not + """ + resource = "/sys/bus/pci/devices/0000:04:00.0/resource0" + val = pci_get_value(resource, SYSTEM_LED_REG) + if self.LOCATOR_LED_ON == color: + val = int(val) | SYSTEM_BEACON_LED_SET + elif self.LOCATOR_LED_OFF == color: + val = int(val) & SYSTEM_BEACON_LED_CLEAR + else: + return False + pci_set_value(resource, val, SYSTEM_LED_REG) + return True + + def get_locator_led(self): + """ + Gets the state of the Chassis Locator LED + Returns: + LOCATOR_LED_ON or LOCATOR_LED_OFF + """ + resource = "/sys/bus/pci/devices/0000:04:00.0/resource0" + val = pci_get_value(resource, SYSTEM_LED_REG) + val = int(val) & SYSTEM_BEACON_LED_SET + if not val: + return self.LOCATOR_LED_OFF + else: + return self.LOCATOR_LED_ON + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the system LED + Args: + color: A string representing the color with which to set the + system LED + Returns: + bool: True if system LED state is set successfully, False if not + """ + if color not in list(self.SYSLED_COLOR_TO_REG.keys()): + return False + + val = pci_get_value(self.pci_res, self.sysled_offset) + val = (val & 0xFFCF) | self.SYSLED_COLOR_TO_REG[color] + + pci_set_value(self.pci_res, val, self.sysled_offset) + self.sys_ledcolor = color + return True + + def get_status_led(self): + """ + Gets the state of the system LED + Returns: + A string, one of the valid LED color strings which could be + vendor specified. + """ + val = pci_get_value(self.pci_res, self.sysled_offset) + if val != -1: + val = val & 0x30 + return self.REG_TO_SYSLED_COLOR.get(val) + return self.sys_ledcolor diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/component.py index a1bba0c9d372..fba51283565a 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/component.py @@ -9,26 +9,28 @@ # ######################################################################## + try: import subprocess from sonic_platform_base.component_base import ComponentBase import sonic_platform.hwaccess as hwaccess - + except ImportError as e: raise ImportError(str(e) + "- required module not found") def get_bios_version(): - return subprocess.check_output(['dmidecode', '-s', 'system-version']).strip() + return subprocess.check_output(['dmidecode', '-s', + 'system-version']).decode('utf-8').strip() def get_fpga_version(): val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:03:00.0/resource0', 0) return '{}.{}'.format((val >> 8) & 0xff, val & 0xff) - + def get_bmc_version(): return subprocess.check_output( ['cat', '/sys/class/ipmi/ipmi0/device/bmc/firmware_revision'] - ).strip() + ).decode('utf-8').strip() def get_cpld_version(bus, i2caddr): return '{}.{}'.format(hwaccess.i2c_get(bus, i2caddr, 1), @@ -102,6 +104,55 @@ def get_firmware_version(self): """ return self.version + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + def install_firmware(self, image_path): """ Installs firmware to the component @@ -111,3 +162,39 @@ def install_firmware(self, image_path): A boolean, True if install was successful, False if not """ return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + Note: the firmware version will be read from image + Args: + image_path: A string, path to firmware image + Returns: + A string containing the available firmware version of the component + """ + return "N/A" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + Args: + image_path: A string, path to firmware image + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return "None" + + def update_firmware(self, image_path): + """ + Updates firmware of the component + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + Args: + image_path: A string, path to firmware image + Raises: + RuntimeError: update failed + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/eeprom.py index d8293704e678..ba7ef95d8eaf 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/eeprom.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/eeprom.py @@ -32,34 +32,34 @@ def __init__(self): self.eeprom_tlv_dict = dict() try: self.eeprom_data = self.read_eeprom() - except: + except Exception: self.eeprom_data = "N/A" raise RuntimeError("Eeprom is not Programmed") - else: - eeprom = self.eeprom_data - if not self.is_valid_tlvinfo_header(eeprom): - return + eeprom = self.eeprom_data - total_length = eeprom[9] << 8 | eeprom[10] - tlv_index = self._TLV_INFO_HDR_LEN - tlv_end = self._TLV_INFO_HDR_LEN + total_length + if not self.is_valid_tlvinfo_header(eeprom): + return + + total_length = (eeprom[9] << 8) | eeprom[10] + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_length - while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: - if not self.is_valid_tlv(eeprom[tlv_index:]): - break + while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: + if not self.is_valid_tlv(eeprom[tlv_index:]): + break - tlv = eeprom[tlv_index:tlv_index + 2 - + eeprom[tlv_index + 1]] - code = "0x%02X" % tlv[0] + tlv = eeprom[tlv_index:tlv_index + 2 + + eeprom[tlv_index + 1]] + code = "0x%02X" % tlv[0] - name, value = self.decoder(None, tlv) + name, value = self.decoder(None, tlv) - self.eeprom_tlv_dict[code] = value - if eeprom[tlv_index] == self._TLV_CODE_CRC_32: - break + self.eeprom_tlv_dict[code] = value + if eeprom[tlv_index] == self._TLV_CODE_CRC_32: + break - tlv_index += eeprom[tlv_index+1] + 2 + tlv_index += eeprom[tlv_index+1] + 2 def serial_number_str(self): """ @@ -80,7 +80,7 @@ def base_mac_addr(self, e=None): if not is_valid or t[1] != 6: return super(TlvInfoDecoder, self).switchaddrstr(e) - return ":".join([binascii.b2a_hex(T) for T in t[2]]) + return ":".join(["{:02x}".format(T) for T in t[2]]).upper() def modelstr(self): """ @@ -133,7 +133,3 @@ def system_eeprom_info(self): found in the system EEPROM. """ return self.eeprom_tlv_dict - - - - diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan.py index 3b3e5e3e58a8..95ad6b95c05a 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ######################################################################## -# DellEMC SS5212F +# DellEMC S5212F # # Module contains an implementation of SONiC Platform Base API and # provides the Fans' information which are available in the platform. @@ -46,8 +46,8 @@ class Fan(FanBase): 2: {"Prsnt": 0x5b, "State": 0x5b, "Speed": 0x20}, 3: {"Prsnt": 0x58, "State": 0x58, "Speed": 0x25}, 4: {"Prsnt": 0x5c, "State": 0x5c, "Speed": 0x21}, - 5: {"Prsnt": 0x59, "State": 0x59, "Speed": 0x26}, - 6: {"Prsnt": 0x5d, "State": 0x5d, "Speed": 0x22}, + 5: {"Prsnt": 0x57, "State": 0x59, "Speed": 0x26}, + 6: {"Prsnt": 0x59, "State": 0x5d, "Speed": 0x22}, 7: {"Prsnt": 0x5a, "State": 0x5a, "Speed": 0x27}, 8: {"Prsnt": 0x5e, "State": 0x5e, "Speed": 0x23} } PSU_FAN_SENSOR_MAPPING = { 1: {"State": 0x31, "Speed": 0x2e}, @@ -119,7 +119,11 @@ def get_presence(self): Returns: bool: True if fan is present, False if not """ - return True + if self.is_psu_fan: + return self.dependency.get_presence() + else: + # In S5212F, Fans are fixed + return True def get_status(self): """ @@ -130,8 +134,12 @@ def get_status(self): status = False is_valid, state = self.state_sensor.get_reading() if is_valid: - if (state == 0x00): - status = True + if self.is_psu_fan: + if not state > 1: + status = True + else: + if state == 0x00: + status = True return status def get_direction(self): @@ -160,13 +168,13 @@ def get_speed(self): int: percentage of the max fan speed """ speed = None - if not self.is_psu_fan : + if not self.is_psu_fan: if self.max_speed == 0: self.max_speed = self.fru.get_fru_data(self.max_speed_offset,2)[1] self.max_speed = self.max_speed[1] << 8 | self.max_speed[0] is_valid, fan_speed = self.speed_sensor.get_reading() if is_valid and self.max_speed > 0: - speed = (100 * fan_speed)/self.max_speed + speed = (100 * fan_speed)//self.max_speed return speed def get_speed_rpm(self): @@ -178,4 +186,49 @@ def get_speed_rpm(self): fan_speed = None if not self.is_psu_fan : is_valid, fan_speed = self.speed_sensor.get_reading() - return fan_speed + return fan_speed if is_valid else None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fanindex + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by HW + # Return True to avoid thermalctld alarm + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan_drawer.py index 3f3c18fe0a93..e846f7b8be18 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/fan_drawer.py @@ -35,3 +35,78 @@ def get_name(self): string: The name of the device """ return "FanTray{}".format(self.fantrayindex) + + + def get_presence(self): + """ + Retrives the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return "NA" + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + status = True + for fan in self.get_all_fans(): + status &= fan.get_status() + return status + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return False + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by BMC + # Return True to avoid thermalctld alarm + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 0.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/psu.py index 9ef5625dea31..36aaec8b1db6 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/psu.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ######################################################################## -# DellEMC S5212F +# DellEMC S5212F # # Module contains an implementation of SONiC Platform Base API and # provides the PSUs' information which are available in the platform @@ -83,6 +83,15 @@ def get_presence(self): return presence + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celcius up to + nearest thousandth of one degree celcius, e.g. 30.125 + """ + return 0.0 + def get_model(self): """ Retrieves the part number of the PSU @@ -101,6 +110,26 @@ def get_serial(self): """ return self.fru.get_board_serial() + def get_revision(self): + """ + Retrives thehardware revision of the device + Returns: + String: revision value of device + """ + serial = self.fru.get_board_serial() + if serial != "NA" and len(serial) == 23: + return serial[-3:] + else: + return "NA" + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + def get_status(self): """ Retrieves the operational status of the PSU @@ -124,7 +153,7 @@ def get_voltage(self): A float number, the output voltage in volts, e.g. 12.1 """ - return None + return 0.0 def get_current(self): """ @@ -134,7 +163,7 @@ def get_current(self): A float number, electric current in amperes, e.g. 15.4 """ - return None + return 0.0 def get_power(self): """ @@ -144,7 +173,37 @@ def get_power(self): A float number, the power in watts, e.g. 302.6 """ - return None + return 0.0 + + def get_input_voltage(self): + """ + Retrieves current PSU voltage input + + Returns: + A float number, the input voltage in volts, + e.g. 12.1 + """ + return 0.0 + + def get_input_current(self): + """ + Retrieves present electric current supplied to PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + return 0.0 + + def get_input_power(self): + """ + Retrieves current energy supplied to PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + return 0.0 def get_powergood_status(self): """ @@ -162,6 +221,15 @@ def get_powergood_status(self): return status + def get_mfr_id(self): + """ + Retrives the Manufacturer Id of PSU + + Returns: + A string, the manunfacturer id. + """ + return self.fru.get_board_mfr_id() + def get_type(self): """ Retrives the Power Type of PSU @@ -169,12 +237,54 @@ def get_type(self): Returns : A string, PSU power type """ - board_info = self.fru.get_board_part_number() - if board_info is not None : - board_part_no = board_info[0:6] - if board_part_no in switch_sku: - return switch_sku[board_part_no][0] + board_product = self.fru.get_board_product() + if board_product is not None : + info = board_product.split(',') + if 'AC' in info : return 'AC' + if 'DC' in info : return 'DC' return None - def get_mfr_id(self): - return self.fru.get_board_mfr_id() + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return 0.0 + + def get_voltage_high_threshold(self): + """ + Returns PSU high threshold in Volts + """ + return 0.0 + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(750) + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py index 0b62c81bcb2f..6b8b6c92870b 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py @@ -19,6 +19,10 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + SFP_TYPE_LIST = [ '0x3' # SFP/SFP+/SFP28 and later ] @@ -39,6 +43,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) + self.port_type = sfp_type self.sfp_type = sfp_type self.port_type = sfp_type self.index = index @@ -92,6 +97,23 @@ def _initialize_media(self,delay=False): self.set_media_type() self.reinit_sfp_driver() + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + def get_presence(self): """ Retrieves the presence of the sfp @@ -313,3 +335,33 @@ def reinit_sfp_driver(self): except IOError as e: print("Error: Unable to open file: %s" % str(e)) return False + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/thermal.py index b1dc553d499f..280d31c31e1d 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/thermal.py @@ -21,12 +21,12 @@ class Thermal(ThermalBase): # [ Sensor-Name, Sensor-ID ] SENSOR_MAPPING = [ - ['Port Mid', 0x1], - ['NPU Near', 0x2], - ['Port Left', 0x3], - ['Port Right', 0x4], - ['Inlet Airflow Sensor', 0x5], - ['CPU', 0xe], + ['CPU On-board', 0xe], + ['ASIC On-board', 0x2], + ['System Front Left', 0x3], + ['System Front Middle', 0x1], + ['System Front Right', 0x4], + ['Inlet Airflow Sensor', 0x5] ] def __init__(self, thermal_index): @@ -92,7 +92,7 @@ def get_temperature(self): if not is_valid: temperature = 0 - return "{:.3f}".format(temperature) + return float(temperature) def get_high_threshold(self): """ @@ -105,9 +105,9 @@ def get_high_threshold(self): """ is_valid, high_threshold = self.sensor.get_threshold("UpperNonCritical") if not is_valid: - high_threshold = 0 + return 0.0 - return "{:.3f}".format(high_threshold) + return float(high_threshold) def get_high_critical_threshold(self): """ @@ -120,9 +120,9 @@ def get_high_critical_threshold(self): """ is_valid, high_crit_threshold = self.sensor.get_threshold("UpperCritical") if not is_valid: - high_crit_threshold = 0 + return 0.0 - return "{:.3f}".format(high_crit_threshold) + return float(high_crit_threshold) def get_low_threshold(self): """ @@ -137,7 +137,7 @@ def get_low_threshold(self): if not is_valid: low_threshold = 0 - return "{:.3f}".format(low_threshold) + return float(low_threshold) def set_high_threshold(self, temperature): """ @@ -166,3 +166,20 @@ def set_low_threshold(self, temperature): """ # Thermal threshold values are pre-defined based on HW. return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/watchdog.py index fd3ace892387..317a78e98f74 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/watchdog.py @@ -13,7 +13,7 @@ import ctypes import subprocess import syslog - import sonic_platform.component as Component + import sonic_platform.component as Component from sonic_platform_base.watchdog_base import WatchdogBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -48,7 +48,7 @@ def _get_command_result(self, cmdline): stderr=subprocess.STDOUT) stdout = proc.communicate()[0] proc.wait() - result = stdout.rstrip('\n') + result = stdout.rstrip('\n'.encode()) except OSError: result = None @@ -95,7 +95,7 @@ def arm(self, seconds): """ timer_offset = -1 for key,timer_seconds in enumerate(self.TIMERS): - if seconds <= timer_seconds: + if seconds > 0 and seconds <= timer_seconds: timer_offset = key seconds = timer_seconds break @@ -126,18 +126,15 @@ def arm(self, seconds): # Last bit = WD Timer punch self._set_reg_val(reg_val & 0xFE) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds else: # Setting 4th bit to enable WD # 4th bit = Enable WD reg_val = self._get_reg_val() self._set_reg_val(reg_val | 0x8) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds + self.armed_time = self._get_time() + self.timeout = seconds + return seconds def disarm(self): """ diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/chassis.py index 1f85dd80b259..02ebfbc3b7b8 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/chassis.py @@ -9,6 +9,7 @@ ############################################################################# try: + import os import time import sys from sonic_platform_base.chassis_base import ChassisBase @@ -17,9 +18,8 @@ from sonic_platform.component import Component from sonic_platform.psu import Psu from sonic_platform.thermal import Thermal - from sonic_platform.watchdog import Watchdog - from sonic_platform.fan import Fan from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.watchdog import Watchdog from sonic_platform.hwaccess import pci_get_value, pci_set_value except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -56,11 +56,32 @@ class Chassis(ChassisBase): REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason" OIR_FD_PATH = "/sys/bus/pci/devices/0000:04:00.0/port_msi" + pci_res = "/sys/bus/pci/devices/0000:04:00.0/resource0" + + oir_fd = -1 + epoll = -1 + + sysled_offset = 0x0024 + SYSLED_COLOR_TO_REG = { + "blinking_green": 0x0, + "green" : 0x10, + "amber" : 0x20, + "blinking_amber": 0x30 + } + + REG_TO_SYSLED_COLOR = { + 0x0 : "blinking_green", + 0x10 : "green", + 0x20 : "amber", + 0x30 : "blinking_amber" + } _global_port_pres_dict = {} def __init__(self): ChassisBase.__init__(self) + self.STATUS_LED_COLOR_BLUE_BLINK = "blinking blue" + self.STATUS_LED_COLOR_OFF = "off" # sfp.py will read eeprom contents and retrive the eeprom data. # We pass the eeprom path from chassis.py self.PORT_START = 1 @@ -97,11 +118,6 @@ def __init__(self): psu = Psu(i) self._psu_list.append(psu) - for i in range(MAX_S5224F_FANTRAY): - for j in range(MAX_S5224F_FAN): - fan = Fan(i,j) - self._fan_list.append(fan) - for i in range(MAX_S5224F_FANTRAY): fandrawer = FanDrawer(i) self._fan_drawer_list.append(fandrawer) @@ -115,6 +131,52 @@ def __init__(self): else: self._global_port_pres_dict[port_num] = '0' + self.LOCATOR_LED_ON = self.STATUS_LED_COLOR_BLUE_BLINK + self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF + + + def __del__(self): + if self.oir_fd != -1: + self.epoll.unregister(self.oir_fd.fileno()) + self.epoll.close() + self.oir_fd.close() + +# not needed /delete after validation + + def _get_register(self, reg_file): + retval = 'ERR' + if (not os.path.isfile(reg_file)): + print(reg_file, 'not found !') + return retval + + try: + with os.fdopen(os.open(reg_file, os.O_RDONLY)) as fd: + retval = fd.read() + except Exception: + pass + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + return retval + +# not needed /delete after validation + + def _check_interrupts(self, port_dict): + retval = 0 + is_port_dict_updated = False + for port_num in range(self.PORT_START, (self.PORT_END + 1)): + # sfp get uses zero-indexing, but port numbers start from 1 + sfp = self.get_sfp(port_num-1) + presence = sfp.get_presence() + if(presence and (self._global_port_pres_dict[port_num] == '0')): + is_port_dict_updated = True + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and (self._global_port_pres_dict[port_num] == '1')): + is_port_dict_updated = True + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + return retval, is_port_dict_updated + # check for this event change for sfp / do we need to handle timeout/sleep def get_change_event(self, timeout=0): @@ -167,8 +229,8 @@ def get_sfp(self, index): # The index will start from 0 sfp = self._sfp_list[index-1] except IndexError: - sys.stderr.write("SFP index {} out of range (1-{})\n".format( - index, len(self._sfp_list))) + sys.stderr.write("SFP index {} out of range (0-{})\n".format( + index, len(self._sfp_list)-1)) return sfp def get_name(self): @@ -203,6 +265,14 @@ def get_serial(self): """ return self._eeprom.serial_str() + def get_revision(self): + """ + Retrieves the revision number of the chassis (Service tag) + Returns: + string: Revision number of chassis + """ + return self._eeprom.revision_str() + def get_status(self): """ Retrieves the operational status of the chassis @@ -263,6 +333,9 @@ def get_num_sfps(self): """ return self._num_sfps + def initizalize_system_led(self): + self.sys_ledcolor = "green" + def get_reboot_cause(self): """ Retrieves the cause of the previous reboot @@ -276,7 +349,7 @@ def get_reboot_cause(self): try: with open(self.REBOOT_CAUSE_PATH) as fd: reboot_cause = int(fd.read(), 16) - except EnvironmentError: + except Exception: return (self.REBOOT_CAUSE_NON_HARDWARE, None) if reboot_cause & 0x1: @@ -306,13 +379,10 @@ def get_qualified_media_list(self): def set_locator_led(self, color): """ Sets the state of the Chassis Locator LED - Args: color: A string representing the color with which to set the Chassis Locator LED - Returns: bool: True if the Chassis Locator LED state is set successfully, False if not - """ resource = "/sys/bus/pci/devices/0000:04:00.0/resource0" val = pci_get_value(resource, SYSTEM_LED_REG) @@ -328,7 +398,6 @@ def set_locator_led(self, color): def get_locator_led(self): """ Gets the state of the Chassis Locator LED - Returns: LOCATOR_LED_ON or LOCATOR_LED_OFF """ @@ -340,3 +409,51 @@ def get_locator_led(self): else: return self.LOCATOR_LED_ON + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the system LED + Args: + color: A string representing the color with which to set the + system LED + Returns: + bool: True if system LED state is set successfully, False if not + """ + if color not in list(self.SYSLED_COLOR_TO_REG.keys()): + return False + + val = pci_get_value(self.pci_res, self.sysled_offset) + val = (val & 0xFFCF) | self.SYSLED_COLOR_TO_REG[color] + + pci_set_value(self.pci_res, val, self.sysled_offset) + self.sys_ledcolor = color + return True + + def get_status_led(self): + """ + Gets the state of the system LED + Returns: + A string, one of the valid LED color strings which could be + vendor specified. + """ + val = pci_get_value(self.pci_res, self.sysled_offset) + if val != -1: + val = val & 0x30 + return self.REG_TO_SYSLED_COLOR.get(val) + return self.sys_ledcolor diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/component.py index 282a323f2583..b0dabc1398b4 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/component.py @@ -19,7 +19,8 @@ def get_bios_version(): - return subprocess.check_output(['dmidecode', '-s', 'system-version']).strip() + return subprocess.check_output(['dmidecode', '-s', + 'system-version']).decode('utf-8').strip() def get_fpga_version(): val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:03:00.0/resource0', 0) @@ -28,7 +29,7 @@ def get_fpga_version(): def get_bmc_version(): return subprocess.check_output( ['cat', '/sys/class/ipmi/ipmi0/device/bmc/firmware_revision'] - ).strip() + ).decode('utf-8').strip() def get_cpld_version(bus, i2caddr): return '{}.{}'.format(hwaccess.i2c_get(bus, i2caddr, 1), @@ -111,3 +112,88 @@ def install_firmware(self, image_path): A boolean, True if install was successful, False if not """ return False + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + Note: the firmware version will be read from image + Args: + image_path: A string, path to firmware image + Returns: + A string containing the available firmware version of the component + """ + return "N/A" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + Args: + image_path: A string, path to firmware image + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return "None" + + def update_firmware(self, image_path): + """ + Updates firmware of the component + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + Args: + image_path: A string, path to firmware image + Raises: + RuntimeError: update failed + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/eeprom.py index 953423bbb64e..591f5e1787cd 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/eeprom.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/eeprom.py @@ -11,6 +11,7 @@ try: import os.path from sonic_eeprom import eeprom_tlvinfo + import binascii except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -48,7 +49,7 @@ def __init__(self): break tlv = eeprom[tlv_index:tlv_index + 2 - + eeprom[tlv_index + 1]] + + eeprom[tlv_index + 1]] code = "0x%02X" % tlv[0] name, value = self.decoder(None, tlv) @@ -69,14 +70,14 @@ def serial_number_str(self): return "N/A" return results[2].decode('ascii') - def base_mac_addr(self, e): + def base_mac_addr(self, e=None): """ Returns the base mac address found in the system EEPROM """ (is_valid, t) = self.get_tlv_field( self.eeprom_data, self._TLV_CODE_MAC_BASE) if not is_valid or t[1] != 6: - return super(eeprom_tlvinfo.TlvInfoDecoder, self).switchaddrstr(t) + return super(TlvInfoDecoder, self).switchaddrstr(e) return ":".join(["{:02x}".format(T) for T in t[2]]).upper() @@ -122,7 +123,7 @@ def revision_str(self): if not is_valid: return "N/A" - return results[2].decode('ascii') + return (binascii.b2a_hex(results[2])).decode('ascii') def system_eeprom_info(self): """ diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py index bf248a03846f..57e163469a95 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan.py @@ -91,10 +91,7 @@ def get_model(self): Returns: String: Part number of FAN """ - if self.is_psu_fan: - return None - else: - return self.fru.get_board_part_number() + return self.fru.get_board_part_number() def get_serial(self): """ @@ -102,10 +99,7 @@ def get_serial(self): Returns: String: Serial number of FAN """ - if self.is_psu_fan: - return None - else: - return self.fru.get_board_serial() + return self.fru.get_board_serial() def get_presence(self): """ @@ -132,8 +126,12 @@ def get_status(self): status = False is_valid, state = self.state_sensor.get_reading() if is_valid: - if not state > 1: - status = True + if self.is_psu_fan: + if not state > 1: + status = True + else: + if state == 0x00: + status = True return status def get_direction(self): @@ -183,3 +181,48 @@ def get_speed_rpm(self): fan_speed = 0 is_valid, fan_speed = self.speed_sensor.get_reading() return fan_speed if is_valid else None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fanindex + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by HW + # Return True to avoid thermalctld alarm + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan_drawer.py index 2233a9c73a81..c11d5a7cf82f 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/fan_drawer.py @@ -11,6 +11,7 @@ try: from sonic_platform_base.fan_drawer_base import FanDrawerBase from sonic_platform.fan import Fan + from sonic_platform.ipmihelper import IpmiFru except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -20,6 +21,8 @@ class FanDrawer(FanDrawerBase): """DellEMC Platform-specific Fan class""" + FAN_FRU_MAPPING = { 1: 3, 2: 4, 3: 5, 4: 6 } + def __init__(self, fantray_index): FanDrawerBase.__init__(self) @@ -27,6 +30,7 @@ def __init__(self, fantray_index): self.fantrayindex = fantray_index + 1 for i in range(S5224F_FANS_PER_FANTRAY): self._fan_list.append(Fan(fantray_index, i)) + self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex]) def get_name(self): """ @@ -35,3 +39,88 @@ def get_name(self): string: The name of the device """ return "FanTray{}".format(self.fantrayindex) + + + def get_presence(self): + """ + Retrives the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return self.fru.get_board_serial() + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + status = True + for fan in self.get_all_fans(): + status &= fan.get_status() + return status + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return True + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by BMC + # Return True to avoid thermalctld alarm + return True + + def get_status_led(self, color): + """ + Gets the state of the fan drawer LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + # Fan tray status LED controlled by BMC + # Return True to avoid thermalctld alarm + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return 0.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/psu.py index 5e4dafc9b931..3d7cc30a7968 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/psu.py @@ -24,11 +24,11 @@ class Psu(PsuBase): SENSOR_MAPPING = { 1: { "State": 0x31, "Current": 0x39, "Power": 0x37, "Voltage": 0x38, "InCurrent": 0x36, "InPower": 0x34, - "InVoltage": 0x35 }, + "InVoltage": 0x35, "Temperature": 0xc }, 2: { "State": 0x32, "Current": 0x3F, "Power": 0x3D, "Voltage": 0x3E, "InCurrent": 0x3C, "InPower": 0x3A, - "InVoltage": 0x3B } } + "InVoltage": 0x3B, "Temperature": 0xd } } # ( PSU-ID: FRU-ID } FRU_MAPPING = { 1: 1, 2: 2 } @@ -44,6 +44,7 @@ def __init__(self, psu_index): self.input_voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InVoltage"]) self.input_current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InCurrent"]) self.input_power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InPower"]) + self.temp_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Temperature"]) self.fru = IpmiFru(self.FRU_MAPPING[self.index]) self._fan_list.append(Fan(fan_index=self.index, psu_fan=True, @@ -68,11 +69,36 @@ def get_presence(self): presence = False is_valid, state = self.state_sensor.get_reading() if is_valid: - if (state & 0b1): + if (state == 0x01): presence = True return presence + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celcius up to + nearest thousandth of one degree celcius, e.g. 30.125 + """ + is_valid, temperature = self.temp_sensor.get_reading() + if not is_valid: + temperature = 0 + + return float(temperature) + + def get_temperature_high_threshold(self): + """ + Returns the high temperature threshold for PSU in Celsius + """ + + is_valid, high_threshold = self.temp_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 105 + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) + def get_model(self): """ Retrieves the part number of the PSU @@ -91,6 +117,26 @@ def get_serial(self): """ return self.fru.get_board_serial() + def get_revision(self): + """ + Retrives thehardware revision of the device + Returns: + String: revision value of device + """ + serial = self.fru.get_board_serial() + if serial != "NA" and len(serial) == 23: + return serial[-3:] + else: + return "NA" + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + def get_status(self): """ Retrieves the operational status of the PSU @@ -116,9 +162,33 @@ def get_voltage(self): """ is_valid, voltage = self.voltage_sensor.get_reading() if not is_valid: - return None + return 0.0 + + return float(voltage) - return "{:.1f}".format(voltage) + def get_voltage_low_threshold(self): + """ + Returns PSU low threshold in Volts + """ + + is_valid, low_threshold = self.voltage_sensor.get_threshold("LowerCritical") + if not is_valid: + low_threshold = 11.6 + low_threshold = "{:.2f}".format(low_threshold) + + return float(low_threshold) + + def get_voltage_high_threshold(self): + """ + Returns PSU high threshold in Volts + """ + + is_valid, high_threshold = self.voltage_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 12.8 + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) def get_current(self): """ @@ -130,9 +200,9 @@ def get_current(self): """ is_valid, current = self.current_sensor.get_reading() if not is_valid: - return None + return 0.0 - return "{:.1f}".format(current) + return float(current) def get_power(self): """ @@ -144,9 +214,9 @@ def get_power(self): """ is_valid, power = self.power_sensor.get_reading() if not is_valid: - return None + return 0.0 - return "{:.1f}".format(power) + return float(power) def get_input_voltage(self): """ @@ -158,9 +228,9 @@ def get_input_voltage(self): """ is_valid, input_voltage = self.input_voltage_sensor.get_reading() if not is_valid: - return None + return 0.0 - return "{:.1f}".format(input_voltage) + return float(input_voltage) def get_input_current(self): """ @@ -172,9 +242,9 @@ def get_input_current(self): """ is_valid, input_current = self.input_current_sensor.get_reading() if not is_valid: - return None + return 0.0 - return "{:.1f}".format(input_current) + return float(input_current) def get_input_power(self): """ @@ -188,7 +258,7 @@ def get_input_power(self): if not is_valid: return None - return "{:.1f}".format(input_power) + return float(input_power) def get_powergood_status(self): """ @@ -201,7 +271,7 @@ def get_powergood_status(self): status = False is_valid, state = self.state_sensor.get_reading() if is_valid: - if (state == 0x01): + if (state == 0x01): status = True return status @@ -228,3 +298,33 @@ def get_type(self): if 'AC' in info : return 'AC' if 'DC' in info : return 'DC' return None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(750) + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py index e3c3ce02ab71..65eca4926107 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py @@ -19,6 +19,10 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + SFP_TYPE_LIST = [ '0x3' # SFP/SFP+/SFP28 and later ] @@ -39,6 +43,7 @@ class Sfp(SfpOptoeBase): def __init__(self, index, sfp_type, eeprom_path): SfpOptoeBase.__init__(self) + self.port_type = sfp_type self.sfp_type = sfp_type self.port_type = sfp_type self.index = index @@ -92,6 +97,23 @@ def _initialize_media(self,delay=False): self.set_media_type() self.reinit_sfp_driver() + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + def get_presence(self): """ Retrieves the presence of the sfp @@ -313,3 +335,33 @@ def reinit_sfp_driver(self): except IOError as e: print("Error: Unable to open file: %s" % str(e)) return False + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/thermal.py index 6634a6982eb8..f6c096026505 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/thermal.py @@ -107,7 +107,7 @@ def get_high_threshold(self): """ is_valid, high_threshold = self.sensor.get_threshold("UpperNonCritical") if not is_valid: - return super(Thermal, self).get_high_threshold() + return 0.0 return float(high_threshold) @@ -122,7 +122,7 @@ def get_high_critical_threshold(self): """ is_valid, high_crit_threshold = self.sensor.get_threshold("UpperCritical") if not is_valid: - return super(Thermal, self).get_high_critical_threshold() + return 0.0 return float(high_crit_threshold) @@ -168,3 +168,20 @@ def set_low_threshold(self, temperature): """ # Thermal threshold values are pre-defined based on HW. return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/watchdog.py index b7e96546569a..47c072594978 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/watchdog.py @@ -95,7 +95,7 @@ def arm(self, seconds): """ timer_offset = -1 for key,timer_seconds in enumerate(self.TIMERS): - if seconds <= timer_seconds: + if seconds > 0 and seconds <= timer_seconds: timer_offset = key seconds = timer_seconds break @@ -126,18 +126,15 @@ def arm(self, seconds): # Last bit = WD Timer punch self._set_reg_val(reg_val & 0xFE) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds else: # Setting 4th bit to enable WD # 4th bit = Enable WD reg_val = self._get_reg_val() self._set_reg_val(reg_val | 0x8) - self.armed_time = self._get_time() - self.timeout = seconds - return seconds + self.armed_time = self._get_time() + self.timeout = seconds + return seconds def disarm(self): """ From 83f23e26ffde7f6019b8b874a847baf1661a337b Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 17 Jun 2022 08:44:30 +0800 Subject: [PATCH 427/817] Generate switch level dscp_to_tc_map entry from qos_config template (#11087) * Generate switch level dscp_to_tc_map Signed-off-by: bingwang --- files/build_templates/qos_config.j2 | 7 +++++++ .../tests/sample_output/py2/qos-arista7050.json | 3 +++ .../tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json | 3 +++ .../tests/sample_output/py2/qos-dell6100.json | 3 +++ .../tests/sample_output/py2/qos-dell9332.json | 3 +++ .../tests/sample_output/py3/qos-arista7050.json | 3 +++ .../py3/qos-arista7050cx3-dualtor-remap-disabled.json | 3 +++ .../tests/sample_output/py3/qos-arista7050cx3-dualtor.json | 3 +++ .../py3/qos-arista7260-dualtor-remap-disabled.json | 3 +++ .../tests/sample_output/py3/qos-arista7260-dualtor.json | 3 +++ .../py3/qos-arista7260-t1-remap-disabled.json | 3 +++ .../tests/sample_output/py3/qos-arista7260-t1.json | 3 +++ .../tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json | 3 +++ .../tests/sample_output/py3/qos-dell6100.json | 3 +++ .../tests/sample_output/py3/qos-dell9332.json | 3 +++ 15 files changed, 49 insertions(+) diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 3d95d333594b..46cebb6e32d1 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -217,6 +217,13 @@ }, {% endif %} "PORT_QOS_MAP": { +{% if generate_global_dscp_to_tc_map is defined %} + {{- generate_global_dscp_to_tc_map() }} +{% else %} + "global": { + "dscp_to_tc_map" : "AZURE" + }{% if PORT_ACTIVE %},{% endif %} +{% endif %} {% for port in PORT_ACTIVE %} "{{ port }}": { {% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %} diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json index b15fcf7a36c1..6a09e605c3f2 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7050.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json index 92ba2caf8d17..48b3a293e02b 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json b/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json index 27bea8cd32d3..bf28af765e17 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-dell6100.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json index 8130a455497a..a3dd5cbeea2b 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-dell9332.json @@ -118,6 +118,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json index b15fcf7a36c1..6a09e605c3f2 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet4": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json index 68774f58563a..67669c169b16 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor-remap-disabled.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json index 843e68a49c7d..a48656d57c0c 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -217,6 +217,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json index 27b7ebd7e494..49ed2038e71b 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index 1d8c2dbdfff6..cad403c93d2e 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -217,6 +217,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json index ae9fa775dc62..f4e639b3ddfe 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json index 9db828a759e4..f850e3285bef 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json index 92ba2caf8d17..48b3a293e02b 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json b/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json index 27bea8cd32d3..bf28af765e17 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-dell6100.json @@ -114,6 +114,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json index 8130a455497a..a3dd5cbeea2b 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-dell9332.json @@ -118,6 +118,9 @@ } }, "PORT_QOS_MAP": { + "global": { + "dscp_to_tc_map" : "AZURE" + }, "Ethernet0": { "dscp_to_tc_map" : "AZURE", "tc_to_queue_map" : "AZURE", From 2851884c8bb96752ebf5057cf124dbe582eb31f4 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Fri, 17 Jun 2022 15:39:41 +0800 Subject: [PATCH 428/817] [ci] Support to skip vstest using include/exclude config file. (#11086) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit example: ├── folderA │ ├── fileA (skip vstest) │ ├── fileB │ └── fileC If we want to skip vstest when changing /folderA/fileA, and not skip vstest when changing fileB or fileC. vstest-include: ^folderA/fileA vstest-exclude: ^folderA --- .azure-pipelines/azure-pipelines-build.yml | 1 + .azure-pipelines/template-skipvstest.yml | 12 ++++++++++++ .azure-pipelines/vstest-exclude | 3 +++ .azure-pipelines/vstest-include | 2 ++ azure-pipelines.yml | 1 + 5 files changed, 19 insertions(+) create mode 100644 .azure-pipelines/template-skipvstest.yml create mode 100644 .azure-pipelines/vstest-exclude create mode 100644 .azure-pipelines/vstest-include diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index c84c91441806..f7eeb8c95d9b 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -98,6 +98,7 @@ jobs: platform_rpc: nephos buildSteps: + - template: template-skipvstest.yml - bash: | set -ex if [ $(GROUP_NAME) == vs ]; then diff --git a/.azure-pipelines/template-skipvstest.yml b/.azure-pipelines/template-skipvstest.yml new file mode 100644 index 000000000000..b47f17ce6e81 --- /dev/null +++ b/.azure-pipelines/template-skipvstest.yml @@ -0,0 +1,12 @@ +steps: +- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: + - script: | + set -ex + tar_branch=origin/$(System.PullRequest.TargetBranch) + git diff $tar_branch..HEAD --name-only | grep -v -f .azure-pipelines/vstest-exclude && exit 0 + git diff $tar_branch..HEAD --name-only | grep -f .azure-pipelines/vstest-include && exit 0 + set +x + echo "Skip vstest jobs" + echo "##vso[task.setvariable variable=SKIP_VSTEST;isOutput=true]YES" + name: SetVar + displayName: "Check if vstest is needed." diff --git a/.azure-pipelines/vstest-exclude b/.azure-pipelines/vstest-exclude new file mode 100644 index 000000000000..71616704707a --- /dev/null +++ b/.azure-pipelines/vstest-exclude @@ -0,0 +1,3 @@ +^platform +^.azure-pipelines +^files/build/versions diff --git a/.azure-pipelines/vstest-include b/.azure-pipelines/vstest-include new file mode 100644 index 000000000000..86fb3a9d88ba --- /dev/null +++ b/.azure-pipelines/vstest-include @@ -0,0 +1,2 @@ +^platform/vs +^.azure-pipelines/run-test-template.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a0b1cf54251e..345fb9b57a5f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -77,6 +77,7 @@ stages: - stage: Test dependsOn: BuildVS + condition: and(ne(stageDependencies.BuildVS.outputs['vs.SetVar.SKIP_VSTEST'], 'YES'), succeeded()) variables: - name: inventory value: veos_vtb From 25bb47153933f939713119f25830d83bf9b722cf Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Fri, 17 Jun 2022 10:00:46 -0700 Subject: [PATCH 429/817] [sonic-swss] Advance submodule (#11170) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index b12af413e9a6..59f77eae01ee 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit b12af413e9a66094101f3c57aa4bc62001d520e1 +Subproject commit 59f77eae01ee2b906244c1323014be0b1c649b40 From 241f4454b459bd9c4871d887e1168a5a443903c2 Mon Sep 17 00:00:00 2001 From: yozhao101 <56170650+yozhao101@users.noreply.github.com> Date: Fri, 17 Jun 2022 12:13:18 -0700 Subject: [PATCH 430/817] [memory_checker] Do not check memory usage of containers which are not created (#11129) Signed-off-by: Yong Zhao yozhao@microsoft.com Why I did it This PR aims to fix an issue (#10088) by enhancing the script memory_checker. Specifically, if container is not created successfully during device is booted/rebooted, then memory_checker do not need check its memory usage. How I did it In the script memory_checker, a function is added to get names of running containers. If the specified container name is not in current running container list, then this script will exit without checking its memory usage. How to verify it I tested on a lab device by following the steps: Stops telemetry container with command sudo systemctl stop telemetry.service Removes telemetry container with command docker rm telemetry Checks whether the script memory_checker ran by Monit will generate the syslog message saying it will exit without checking memory usage of telemetry. --- files/image_config/monit/memory_checker | 34 +++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/files/image_config/monit/memory_checker b/files/image_config/monit/memory_checker index 3cd0f2d80225..dfe270e79524 100755 --- a/files/image_config/monit/memory_checker +++ b/files/image_config/monit/memory_checker @@ -25,6 +25,8 @@ import sys import syslog import re +import docker + def get_command_result(command): """Executes the command and return the resulting output. @@ -86,7 +88,7 @@ def check_memory_usage(container_name, threshold_value): print("[{}]: Memory usage ({} Bytes) is larger than the threshold ({} Bytes)!" .format(container_name, mem_usage_bytes, threshold_value)) syslog.syslog(syslog.LOG_INFO, "[{}]: Memory usage ({} Bytes) is larger than the threshold ({} Bytes)!" - .format(container_name, mem_usage_bytes, threshold_value)) + .format(container_name, mem_usage_bytes, threshold_value)) sys.exit(3) else: syslog.syslog(syslog.LOG_ERR, "[memory_checker] Failed to retrieve memory value from '{}'" @@ -94,6 +96,28 @@ def check_memory_usage(container_name, threshold_value): sys.exit(4) +def get_running_container_names(): + """Retrieves names of running containers by talking to the docker daemon. + + Args: + None. + + Returns: + running_container_names: A list indicates names of running containers. + """ + try: + docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock') + running_container_list = docker_client.containers.list(filters={"status": "running"}) + running_container_names = [ container.name for container in running_container_list ] + except (docker.errors.APIError, docker.errors.DockerException) as err: + syslog.syslog(syslog.LOG_ERR, + "Failed to retrieve the running container list from docker daemon! Error message is: '{}'" + .format(err)) + sys.exit(5) + + return running_container_names + + def main(): parser = argparse.ArgumentParser(description="Check memory usage of a container \ and an alerting message will be written into syslog if memory usage \ @@ -104,7 +128,13 @@ def main(): parser.add_argument("threshold_value", type=int, help="threshold value in bytes") args = parser.parse_args() - check_memory_usage(args.container_name, args.threshold_value) + running_container_names = get_running_container_names() + if args.container_name in running_container_names: + check_memory_usage(args.container_name, args.threshold_value) + else: + syslog.syslog(syslog.LOG_INFO, + "[memory_checker] Exits without checking memory usage since container '{}' is not running!" + .format(args.container_name)) if __name__ == "__main__": From c1ba71b251e4b1bdd5128a9ff796348885e77c5e Mon Sep 17 00:00:00 2001 From: byu343 Date: Fri, 17 Jun 2022 12:50:47 -0700 Subject: [PATCH 431/817] [Arista] Add ASIC configs for blackhawktd4 (#10885) Why I did it Add ASIC configs for blackhawktd4 How to verify it Verified that 400G ports of 400GBASE-CR8 are up and traffic can pass --- .../Arista-7050DX4-32S/sai.profile | 2 + .../td4-a7050dx4-32s-32x400G.config.bcm | 612 ++++++++++++++++++ .../platform_env.conf | 2 + .../platform_env.conf | 2 + 4 files changed, 618 insertions(+) create mode 100644 device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/sai.profile create mode 100644 device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/td4-a7050dx4-32s-32x400G.config.bcm create mode 100644 device/arista/x86_64-arista_7050dx4_32s/platform_env.conf create mode 100644 device/arista/x86_64-arista_7050px4_32s/platform_env.conf diff --git a/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/sai.profile b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/sai.profile new file mode 100644 index 000000000000..7b4402ddde37 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td4-a7050dx4-32s-32x400G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/td4-a7050dx4-32s-32x400G.config.bcm b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/td4-a7050dx4-32s-32x400G.config.bcm new file mode 100644 index 000000000000..b4dd47d74fc2 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/Arista-7050DX4-32S/td4-a7050dx4-32s-32x400G.config.bcm @@ -0,0 +1,612 @@ + +--- +device: + 0: + DEVICE_CONFIG: + # CORE CLOCK FREQUENCY + CORE_CLK_FREQ: CLK_1350MHZ + # PP CLOCK FREQUENCY + PP_CLK_FREQ: CLK_1350MHZ + VARIANT: DNA_4_10_5_0 +... +--- +bcm_device: + 0: + global: + # uft_mode: 1 + pktio_mode: 1 + # l3_aplm_template: 1 + # l2_learn_enable: 1 + vlan_flooding_l2mc_num_reserved: 0 + ipv6_lpm_128b_enable: 1 + shared_block_mask_section: uc_bc + skip_protocol_default_entries: 1 + # cls_cmd_daemon: 1 + sai_feat_tail_timestamp: 1 + sai_field_group_auto_prioritize: 1 + sai_tunnel_support: 1 + multi_network_groups: 1 + l3_alpm_template: 1 + l3_alpm_hit_skip: 1 + sai_nbr_bcast_ifp_optimized: 1 + use_all_splithorizon_groups: 1 + riot_enable: 1 + riot_overlay_l3_intf_mem_size: 8192 + riot_overlay_l3_egress_mem_size: 32768 + l3_ecmp_levels: 2 + riot_overlay_ecmp_resilient_hash_size: 16384 + sai_port_queue_ecn_counter: 1 +... +--- +device: + 0: + # Per pipe flex counter configuration + CTR_EFLEX_CONFIG: + CTR_ING_EFLEX_OPERMODE_PIPEUNIQUE: 0 + CTR_EGR_EFLEX_OPERMODE_PIPEUNIQUE: 0 + TM_THD_CONFIG: + THRESHOLD_MODE: LOSSLESS + FP_CONFIG: + FP_ING_OPERMODE: GLOBAL_PIPE_AWARE +... +--- +device: + 0: + PC_PM_CORE: + ? + PC_PM_ID: 1 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x5143627 + TX_LANE_MAP: 0x74325160 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 2 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53426071 + TX_LANE_MAP: 0x74532610 + RX_POLARITY_FLIP: 0xf7 + TX_POLARITY_FLIP: 0xea + ? + PC_PM_ID: 3 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x40517362 + TX_LANE_MAP: 0x26370415 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x40 + ? + PC_PM_ID: 4 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x62734051 + TX_LANE_MAP: 0x17263405 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xef + ? + PC_PM_ID: 5 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x63504172 + TX_LANE_MAP: 0x12730465 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x02 + ? + PC_PM_ID: 6 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x26371405 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xbf + ? + PC_PM_ID: 7 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x63504172 + TX_LANE_MAP: 0x2561374 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x10 + ? + PC_PM_ID: 8 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x16372405 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xbf + ? + PC_PM_ID: 9 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x27140536 + TX_LANE_MAP: 0x75316402 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xf7 + ? + PC_PM_ID: 10 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46025713 + TX_LANE_MAP: 0x61405372 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x80 + ? + PC_PM_ID: 11 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x27140536 + TX_LANE_MAP: 0x75316402 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xf7 + ? + PC_PM_ID: 12 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46025713 + TX_LANE_MAP: 0x61405372 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x80 + ? + PC_PM_ID: 13 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x30746512 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0x3f + ? + PC_PM_ID: 14 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46215730 + TX_LANE_MAP: 0x71635042 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x75 + ? + PC_PM_ID: 15 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x17243506 + TX_LANE_MAP: 0x56237014 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xab + ? + PC_PM_ID: 16 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x45361702 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 17 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x37140526 + TX_LANE_MAP: 0x56107324 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 18 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x31462057 + TX_LANE_MAP: 0x45062731 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xcd + ? + PC_PM_ID: 19 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x60534271 + TX_LANE_MAP: 0x21670453 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x20 + ? + PC_PM_ID: 20 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x50271463 + TX_LANE_MAP: 0x56321407 + RX_POLARITY_FLIP: 0x96 + TX_POLARITY_FLIP: 0xff + ? + PC_PM_ID: 21 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x75316420 + TX_LANE_MAP: 0x1652374 + RX_POLARITY_FLIP: 0xcc + TX_POLARITY_FLIP: 0x20 + ? + PC_PM_ID: 22 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x57061423 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xef + ? + PC_PM_ID: 23 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x63504172 + TX_LANE_MAP: 0x1652374 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x20 + ? + PC_PM_ID: 24 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x2461357 + TX_LANE_MAP: 0x57061423 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xef + ? + PC_PM_ID: 25 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x27140536 + TX_LANE_MAP: 0x76125403 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xbf + ? + PC_PM_ID: 26 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46025713 + TX_LANE_MAP: 0x20716354 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x08 + ? + PC_PM_ID: 27 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x27140536 + TX_LANE_MAP: 0x76125403 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xbf + ? + PC_PM_ID: 28 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x46025713 + TX_LANE_MAP: 0x20615374 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x20 + ? + PC_PM_ID: 29 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x40536271 + TX_LANE_MAP: 0x65127403 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0x7f + ? + PC_PM_ID: 30 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x75316420 + TX_LANE_MAP: 0x32417065 + RX_POLARITY_FLIP: 0x00 + TX_POLARITY_FLIP: 0x02 + ? + PC_PM_ID: 31 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x53426071 + TX_LANE_MAP: 0x75126430 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xf4 + ? + PC_PM_ID: 32 + CORE_INDEX: 0 + : + RX_LANE_MAP_AUTO: 0 + TX_LANE_MAP_AUTO: 0 + RX_POLARITY_FLIP_AUTO: 0 + TX_POLARITY_FLIP_AUTO: 0 + RX_LANE_MAP: 0x41562703 + TX_LANE_MAP: 0x13602574 + RX_POLARITY_FLIP: 0xff + TX_POLARITY_FLIP: 0xff +... +--- +device: + 0: + PC_PORT_PHYS_MAP: + ? + PORT_ID: 0 + : + PC_PHYS_PORT_ID: 0 + ? + PORT_ID: 1 + : + PC_PHYS_PORT_ID: 1 + ? + PORT_ID: 2 + : + PC_PHYS_PORT_ID: 9 + ? + PORT_ID: 3 + : + PC_PHYS_PORT_ID: 17 + ? + PORT_ID: 4 + : + PC_PHYS_PORT_ID: 25 + ? + PORT_ID: 21 + : + PC_PHYS_PORT_ID: 33 + ? + PORT_ID: 22 + : + PC_PHYS_PORT_ID: 41 + ? + PORT_ID: 23 + : + PC_PHYS_PORT_ID: 49 + ? + PORT_ID: 24 + : + PC_PHYS_PORT_ID: 57 + ? + PORT_ID: 41 + : + PC_PHYS_PORT_ID: 65 + ? + PORT_ID: 42 + : + PC_PHYS_PORT_ID: 73 + ? + PORT_ID: 43 + : + PC_PHYS_PORT_ID: 81 + ? + PORT_ID: 44 + : + PC_PHYS_PORT_ID: 89 + ? + PORT_ID: 61 + : + PC_PHYS_PORT_ID: 97 + ? + PORT_ID: 62 + : + PC_PHYS_PORT_ID: 105 + ? + PORT_ID: 63 + : + PC_PHYS_PORT_ID: 113 + ? + PORT_ID: 64 + : + PC_PHYS_PORT_ID: 121 + ? + PORT_ID: 81 + : + PC_PHYS_PORT_ID: 129 + ? + PORT_ID: 82 + : + PC_PHYS_PORT_ID: 137 + ? + PORT_ID: 83 + : + PC_PHYS_PORT_ID: 145 + ? + PORT_ID: 84 + : + PC_PHYS_PORT_ID: 153 + ? + PORT_ID: 101 + : + PC_PHYS_PORT_ID: 161 + ? + PORT_ID: 102 + : + PC_PHYS_PORT_ID: 169 + ? + PORT_ID: 103 + : + PC_PHYS_PORT_ID: 177 + ? + PORT_ID: 104 + : + PC_PHYS_PORT_ID: 185 + ? + PORT_ID: 121 + : + PC_PHYS_PORT_ID: 193 + ? + PORT_ID: 122 + : + PC_PHYS_PORT_ID: 201 + ? + PORT_ID: 123 + : + PC_PHYS_PORT_ID: 209 + ? + PORT_ID: 124 + : + PC_PHYS_PORT_ID: 217 + ? + PORT_ID: 141 + : + PC_PHYS_PORT_ID: 225 + ? + PORT_ID: 142 + : + PC_PHYS_PORT_ID: 233 + ? + PORT_ID: 143 + : + PC_PHYS_PORT_ID: 241 + ? + PORT_ID: 144 + : + PC_PHYS_PORT_ID: 249 + ? + PORT_ID: 38 + : + PC_PHYS_PORT_ID: 257 + ? + PORT_ID: 78 + : + PC_PHYS_PORT_ID: 258 +... +--- +device: + 0: + PC_PORT: + ? + PORT_ID: 0 + : + ENABLE: 1 + MAX_FRAME_SIZE: 9416 + SPEED: 10000 + NUM_LANES: 1 + ? + PORT_ID: [[38, 38], [78, 78]] + : + ENABLE: 1 + MAX_FRAME_SIZE: 9416 + SPEED: 10000 + NUM_LANES: 1 + ? + PORT_ID: [[1, 4], [21, 24], [41, 44], [61, 64], [81, 84], [101, 104], [121, 124], [141, 144]] + : + ENABLE: 1 + FEC_MODE: PC_FEC_RS544_2XN + MAX_FRAME_SIZE: 9416 + SPEED: 400000 + NUM_LANES: 8 +... diff --git a/device/arista/x86_64-arista_7050dx4_32s/platform_env.conf b/device/arista/x86_64-arista_7050dx4_32s/platform_env.conf new file mode 100644 index 000000000000..d72ffde2f262 --- /dev/null +++ b/device/arista/x86_64-arista_7050dx4_32s/platform_env.conf @@ -0,0 +1,2 @@ +SYNCD_SHM_SIZE=256m +is_ltsw_chip=1 diff --git a/device/arista/x86_64-arista_7050px4_32s/platform_env.conf b/device/arista/x86_64-arista_7050px4_32s/platform_env.conf new file mode 100644 index 000000000000..d72ffde2f262 --- /dev/null +++ b/device/arista/x86_64-arista_7050px4_32s/platform_env.conf @@ -0,0 +1,2 @@ +SYNCD_SHM_SIZE=256m +is_ltsw_chip=1 From 04ea32b0c2c15c569fc2efc802f72b2a1cd27236 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Sat, 18 Jun 2022 19:17:05 +0800 Subject: [PATCH 432/817] [macsec] CLI Supports display of gearbox macsec counter (#11113) Why I did it To support gearbox macsec counter display, following Azure/sonic-swss-common#622. How I did it Use swsscommon CounterTable API --- .../cli-plugin-tests/mock_tables.py | 15 +++++++++++++++ .../cli/show/plugins/show_macsec.py | 18 ++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/dockers/docker-macsec/cli-plugin-tests/mock_tables.py b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py index 2e88297597b3..3708644bfba2 100644 --- a/dockers/docker-macsec/cli-plugin-tests/mock_tables.py +++ b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py @@ -115,6 +115,19 @@ def keys(self, pattern='*'): return [key for key in self.redis if regex.match(key)] +class MacsecCounter: + pass + + +class CounterTable: + def __init__(self, db): + self.db = db + + def get(self, macsec, name): + key = self.db.hget("COUNTERS_MACSEC_NAME_MAP", name) + return self.db.get("COUNTERS:" + key) + + swsssdk.interface.DBInterface._subscribe_keyspace_notification = _subscribe_keyspace_notification mockredis.MockRedis.config_set = config_set redis.StrictRedis = SwssSyncClient @@ -122,3 +135,5 @@ def keys(self, pattern='*'): swsscommon.SonicV2Connector = SonicV2Connector swsscommon.ConfigDBConnector = ConfigDBConnector swsscommon.ConfigDBPipeConnector = ConfigDBPipeConnector +swsscommon.CounterTable = CounterTable +swsscommon.MacsecCounter = MacsecCounter diff --git a/dockers/docker-macsec/cli/show/plugins/show_macsec.py b/dockers/docker-macsec/cli/show/plugins/show_macsec.py index 538b8947f91d..0d32f7e96249 100644 --- a/dockers/docker-macsec/cli/show/plugins/show_macsec.py +++ b/dockers/docker-macsec/cli/show/plugins/show_macsec.py @@ -5,11 +5,13 @@ from tabulate import tabulate from swsscommon.swsscommon import SonicV2Connector +from swsscommon.swsscommon import CounterTable, MacsecCounter DB_CONNECTOR = SonicV2Connector(use_unix_socket_path=False) DB_CONNECTOR.connect(DB_CONNECTOR.APPL_DB) DB_CONNECTOR.connect(DB_CONNECTOR.COUNTERS_DB) +COUNTER_TABLE = CounterTable(DB_CONNECTOR.get_redis_client(DB_CONNECTOR.COUNTERS_DB)) class MACsecAppMeta(object): @@ -28,12 +30,8 @@ def __init__(self, *args) -> None: class MACsecCounters(object): def __init__(self, *args) -> None: - key = ":".join(args) - counters_id = DB_CONNECTOR.get( - DB_CONNECTOR.COUNTERS_DB, self.__class__.get_counter_table_name(), key) - counter_key = "COUNTERS:" + counters_id - self.counters = DB_CONNECTOR.get_all( - DB_CONNECTOR.COUNTERS_DB, counter_key) + _, fvs = COUNTER_TABLE.get(MacsecCounter(), ":".join(args)) + self.counters = dict(fvs) class MACsecSA(MACsecAppMeta, MACsecCounters): @@ -61,10 +59,6 @@ def __init__(self, port_name: str, sci: str, an: str) -> None: def get_appl_table_name(cls) -> str: return "MACSEC_INGRESS_SA_TABLE" - @classmethod - def get_counter_table_name(cls) -> str: - return "COUNTERS_MACSEC_SA_RX_NAME_MAP" - def get_header(self): return "MACsec Ingress SA ({})\n".format(self.an) @@ -77,10 +71,6 @@ def __init__(self, port_name: str, sci: str, an: str) -> None: def get_appl_table_name(cls) -> str: return "MACSEC_EGRESS_SA_TABLE" - @classmethod - def get_counter_table_name(cls) -> str: - return "COUNTERS_MACSEC_SA_TX_NAME_MAP" - def get_header(self): return "MACsec Egress SA ({})\n".format(self.an) From 875e20f99c7ab105416662136fec592fadbf8e45 Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Sat, 18 Jun 2022 13:47:13 -0400 Subject: [PATCH 433/817] Update platform/broadcom/sonic-platform-modules-nokia (#11107) --- platform/broadcom/sonic-platform-modules-nokia | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-nokia b/platform/broadcom/sonic-platform-modules-nokia index b67d4795e691..0f27485ea43b 160000 --- a/platform/broadcom/sonic-platform-modules-nokia +++ b/platform/broadcom/sonic-platform-modules-nokia @@ -1 +1 @@ -Subproject commit b67d4795e691cccd4321b196ba92942f5e8fe395 +Subproject commit 0f27485ea43b98e4382aae12f3c4780b44e02c05 From d42a95ce0b3b44b599f81086ec6e7df9b0ef07de Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Sat, 18 Jun 2022 13:47:49 -0400 Subject: [PATCH 434/817] Updated Nokia device BCM and platform config (#11106) --- .../0/jr2cp-nokia-18x400g-config.bcm | 9 +- .../0/sai_postinit_cmd.soc | 45 ++-- .../1/jr2cp-nokia-18x400g-config.bcm | 3 + .../1/sai_postinit_cmd.soc | 8 + .../platform.json | 207 +++++++++++------- .../platform_ndk.json | 8 + .../platform_reboot | 2 + .../system_health_monitoring_config.json | 1 - .../Nokia-IXR7250E-SUP-10/platform.json | 7 +- .../platform_ndk.json | 10 +- .../platform_reboot | 2 + 11 files changed, 199 insertions(+), 103 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index bbafccdc377e..264cfb30a310 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -1641,9 +1641,9 @@ port_fec.18.BCM8885x=9 serdes_tx_taps_1.BCM8885X=pam4:-8:128:-8:0:0:0 serdes_tx_taps_2.BCM8885X=pam4:-8:128:-8:0:0:0 -serdes_tx_taps_3.BCM8885X=pam4:-8:132:-12:4:0:0 +serdes_tx_taps_3.BCM8885X=pam4:-12:128:-12:2:0:0 serdes_tx_taps_4.BCM8885X=pam4:-8:128:-4:4:0:0 -serdes_tx_taps_5.BCM8885X=pam4:-8:128:-4:4:0:0 +serdes_tx_taps_5.BCM8885X=pam4:-4:152:0:0:0:0 serdes_tx_taps_6.BCM8885X=pam4:-8:136:0:0:0:0 serdes_tx_taps_7.BCM8885X=pam4:-8:132:-4:0:-4:0 serdes_tx_taps_8.BCM8885X=pam4:-4:144:0:0:0:0 @@ -1651,7 +1651,7 @@ serdes_tx_taps_9.BCM8885X=pam4:-8:132:-4:2:-4:0 serdes_tx_taps_10.BCM8885X=pam4:-4:144:0:0:0:0 serdes_tx_taps_11.BCM8885X=pam4:-8:132:-4:0:-4:0 serdes_tx_taps_12.BCM8885X=pam4:-4:144:0:0:0:0 -serdes_tx_taps_13.BCM8885X=pam4:-8:128:-8:4:0:0 +serdes_tx_taps_13.BCM8885X=pam4:-4:132:-4:0:0:0 serdes_tx_taps_14.BCM8885X=pam4:-4:144:0:0:0:0 serdes_tx_taps_15.BCM8885X=pam4:-8:128:-8:4:0:0 serdes_tx_taps_16.BCM8885X=pam4:-8:136:-4:4:-4:0 @@ -2052,3 +2052,6 @@ sai_recycle_port_lane_base=96 appl_param_nof_ports_per_modid=64 udh_exists=1 modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 + +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc index 26466f89ae44..650134e7e589 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc @@ -1,25 +1,3 @@ -phy set 3 reg=0xd134 data=-8 lane=0 -phy set 3 reg=0xd135 data=132 lane=0 -phy set 3 reg=0xd136 data=-8 lane=0 -phy set 3 reg=0xd137 data=0 lane=0 -phy set 3 reg=0xd138 data=0 lane=0 -phy set 3 reg=0xd133 data=0x1802 lane=0 - -phy set 3 reg=0xd134 data=-8 lane=1 -phy set 3 reg=0xd135 data=132 lane=1 -phy set 3 reg=0xd136 data=-12 lane=1 -phy set 3 reg=0xd137 data=0 lane=1 -phy set 3 reg=0xd138 data=0 lane=1 -phy set 3 reg=0xd133 data=0x1800 lane=1 - -phy set 3 reg=0xd134 data=-8 lane=7 -phy set 3 reg=0xd135 data=132 lane=7 -phy set 3 reg=0xd136 data=-8 lane=7 -phy set 3 reg=0xd137 data=0 lane=7 -phy set 3 reg=0xd138 data=0 lane=7 -phy set 3 reg=0xd133 data=0x1804 lane=7 - - phy set 6 reg=0xd134 data=-8 lane=1 phy set 6 reg=0xd135 data=132 lane=1 phy set 6 reg=0xd136 data=-8 lane=1 @@ -34,3 +12,26 @@ phy set 8 reg=0xd136 data=-8 lane=1 phy set 8 reg=0xd137 data=0 lane=1 phy set 8 reg=0xd138 data=0 lane=1 phy set 8 reg=0xd133 data=0x1802 lane=1 + + +phy set 15 reg=0xd134 data=-8 lane=0 +phy set 15 reg=0xd135 data=144 lane=0 +phy set 15 reg=0xd136 data=-8 lane=0 +phy set 15 reg=0xd137 data=0 lane=0 +phy set 15 reg=0xd138 data=0 lane=0 +phy set 15 reg=0xd133 data=0x1800 lane=0 + +phy set 15 reg=0xd134 data=-8 lane=3 +phy set 15 reg=0xd135 data=144 lane=3 +phy set 15 reg=0xd136 data=-8 lane=3 +phy set 15 reg=0xd137 data=0 lane=3 +phy set 15 reg=0xd138 data=0 lane=3 +phy set 15 reg=0xd133 data=0x1800 lane=3 + + +phy set 17 reg=0xd134 data=-8 lane=2 +phy set 17 reg=0xd135 data=132 lane=2 +phy set 17 reg=0xd136 data=-16 lane=2 +phy set 17 reg=0xd137 data=0 lane=2 +phy set 17 reg=0xd138 data=0 lane=2 +phy set 17 reg=0xd133 data=0x1804 lane=2 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index ce7f77de5bb2..733ab75004e4 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -2054,3 +2054,6 @@ sai_recycle_port_lane_base=96 appl_param_nof_ports_per_modid=64 udh_exists=1 modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 + +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc index db5ad5ebb264..b22dde093132 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc @@ -1,3 +1,11 @@ +phy set 3 reg=0xd134 data=-8 lane=4 +phy set 3 reg=0xd135 data=132 lane=4 +phy set 3 reg=0xd136 data=0 lane=4 +phy set 3 reg=0xd137 data=0 lane=4 +phy set 3 reg=0xd138 data=0 lane=4 +phy set 3 reg=0xd133 data=0x1800 lane=4 + + phy set 8 reg=0xd134 data=-8 lane=1 phy set 8 reg=0xd135 data=132 lane=1 phy set 8 reg=0xd136 data=-8 lane=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json index 55630de1126a..3980c99648bc 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform.json @@ -19,7 +19,8 @@ "model": false, "serial": false, "base_mac": false, - "system_eeprom_info": false + "system_eeprom_info": false, + "reboot_other_modules": false }, "thermal_temperature": { "minimum": 0, @@ -30,6 +31,94 @@ "master_psu_led_color": [], "psus": [], "thermals": [ + { + "name": "ASIC0_0--FAB0", + "controllable": false + }, + { + "name": "ASIC0_1--FAB1", + "controllable": false + }, + { + "name": "ASIC0_2--FAB2", + "controllable": false + }, + { + "name": "ASIC0_3--FAB3", + "controllable": false + }, + { + "name": "ASIC0_4--NIF0", + "controllable": false + }, + { + "name": "ASIC0_5--NIF1", + "controllable": false + }, + { + "name": "ASIC0_6--PRM", + "controllable": false + }, + { + "name": "ASIC0_7--EMI0", + "controllable": false + }, + { + "name": "ASIC0_8--EMI1", + "controllable": false + }, + { + "name": "ASIC0_dram-0x0", + "controllable": false + }, + { + "name": "ASIC0_dram-0x1", + "controllable": false + }, + { + "name": "ASIC1_0--FAB0", + "controllable": false + }, + { + "name": "ASIC1_1--FAB1", + "controllable": false + }, + { + "name": "ASIC1_2--FAB2", + "controllable": false + }, + { + "name": "ASIC1_3--FAB3", + "controllable": false + }, + { + "name": "ASIC1_4--NIF0", + "controllable": false + }, + { + "name": "ASIC1_5--NIF1", + "controllable": false + }, + { + "name": "ASIC1_6--PRM", + "controllable": false + }, + { + "name": "ASIC1_7--EMI0", + "controllable": false + }, + { + "name": "ASIC1_8--EMI1", + "controllable": false + }, + { + "name": "ASIC1_dram-0x0", + "controllable": false + }, + { + "name": "ASIC1_dram-0x1", + "controllable": false + }, { "name": "temp_1(fan)", "controllable": false @@ -43,7 +132,7 @@ "controllable": false }, { - "name": "temp_4", + "name": "temp_4(fan)", "controllable": false }, { @@ -51,7 +140,7 @@ "controllable": false }, { - "name": "temp_6(fan)", + "name": "temp_6", "controllable": false }, { @@ -69,152 +158,120 @@ { "name": "temp_10(fan)", "controllable": false + }, + { + "name": "temp_11(fan)", + "controllable": false } ], "sfps": [ { - "name": "QSFPDD_1", - "tx_disable_channel": false + "name": "QSFPDD_1" }, { - "name": "QSFPDD_2", - "tx_disable_channel": false + "name": "QSFPDD_2" }, { - "name": "QSFPDD_3", - "tx_disable_channel": false + "name": "QSFPDD_3" }, { - "name": "QSFPDD_4", - "tx_disable_channel": false + "name": "QSFPDD_4" }, { - "name": "QSFPDD_5", - "tx_disable_channel": false + "name": "QSFPDD_5" }, { - "name": "QSFPDD_6", - "tx_disable_channel": false + "name": "QSFPDD_6" }, { - "name": "QSFPDD_7", - "tx_disable_channel": false + "name": "QSFPDD_7" }, { - "name": "QSFPDD_8", - "tx_disable_channel": false + "name": "QSFPDD_8" }, { - "name": "QSFPDD_9", - "tx_disable_channel": false + "name": "QSFPDD_9" }, { - "name": "QSFPDD_10", - "tx_disable_channel": false + "name": "QSFPDD_10" }, { - "name": "QSFPDD_11", - "tx_disable_channel": false + "name": "QSFPDD_11" }, { - "name": "QSFPDD_12", - "tx_disable_channel": false + "name": "QSFPDD_12" }, { - "name": "QSFPDD_13", - "tx_disable_channel": false + "name": "QSFPDD_13" }, { - "name": "QSFPDD_14", - "tx_disable_channel": false + "name": "QSFPDD_14" }, { - "name": "QSFPDD_15", - "tx_disable_channel": false + "name": "QSFPDD_15" }, { - "name": "QSFPDD_16", - "tx_disable_channel": false + "name": "QSFPDD_16" }, { - "name": "QSFPDD_17", - "tx_disable_channel": false + "name": "QSFPDD_17" }, { - "name": "QSFPDD_18", - "tx_disable_channel": false + "name": "QSFPDD_18" }, { - "name": "QSFPDD_19", - "tx_disable_channel": false + "name": "QSFPDD_19" }, { - "name": "QSFPDD_20", - "tx_disable_channel": false + "name": "QSFPDD_20" }, { - "name": "QSFPDD_21", - "tx_disable_channel": false + "name": "QSFPDD_21" }, { - "name": "QSFPDD_22", - "tx_disable_channel": false + "name": "QSFPDD_22" }, { - "name": "QSFPDD_23", - "tx_disable_channel": false + "name": "QSFPDD_23" }, { - "name": "QSFPDD_24", - "tx_disable_channel": false + "name": "QSFPDD_24" }, { - "name": "QSFPDD_25", - "tx_disable_channel": false + "name": "QSFPDD_25" }, { - "name": "QSFPDD_26", - "tx_disable_channel": false + "name": "QSFPDD_26" }, { - "name": "QSFPDD_27", - "tx_disable_channel": false + "name": "QSFPDD_27" }, { - "name": "QSFPDD_28", - "tx_disable_channel": false + "name": "QSFPDD_28" }, { - "name": "QSFPDD_29", - "tx_disable_channel": false + "name": "QSFPDD_29" }, { - "name": "QSFPDD_30", - "tx_disable_channel": false + "name": "QSFPDD_30" }, { - "name": "QSFPDD_31", - "tx_disable_channel": false + "name": "QSFPDD_31" }, { - "name": "QSFPDD_32", - "tx_disable_channel": false + "name": "QSFPDD_32" }, { - "name": "QSFPDD_33", - "tx_disable_channel": false + "name": "QSFPDD_33" }, { - "name": "QSFPDD_34", - "tx_disable_channel": false + "name": "QSFPDD_34" }, { - "name": "QSFPDD_35", - "tx_disable_channel": false + "name": "QSFPDD_35" }, { - "name": "QSFPDD_36", - "tx_disable_channel": false + "name": "QSFPDD_36" } ] }, diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_ndk.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_ndk.json index 039b950f03ba..2220f8747894 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_ndk.json +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_ndk.json @@ -31,6 +31,14 @@ { "key": "update_asic_pvt", "intval": 10 + }, + { + "key": "amd_pcon", + "intval": 4 + }, + { + "key": "enable_firmware_update", + "intval": 0 } ] } diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot index d128455d40fc..a32a3549bc35 100755 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/platform_reboot @@ -6,5 +6,7 @@ echo "w" > /dev/watchdog kick_date=`date -u` echo "last watchdog kick $kick_date" > /var/log/nokia-watchdog-last.log rm -f /sys/firmware/efi/efivars/dump-* +touch /etc/opt/srlinux/devmgr_reboot_cause.done +rm -f /etc/opt/srlinux/reboot-cause.txt sync /sbin/reboot diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/system_health_monitoring_config.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/system_health_monitoring_config.json index 57006d67ecf5..1375bd80c3f8 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/system_health_monitoring_config.json +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/system_health_monitoring_config.json @@ -1,7 +1,6 @@ { "services_to_ignore": [], "devices_to_ignore": [ - "asic", "fan", "psu" ], diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json index 4e24bb3e8d92..e41b6fc8e5e4 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/Nokia-IXR7250E-SUP-10/platform.json @@ -16,7 +16,8 @@ "model": false, "serial": false, "base_mac": false, - "system_eeprom_info": false + "system_eeprom_info": false, + "reboot_other_modules": false }, "thermal_temperature": { "minimum": 0, @@ -149,6 +150,10 @@ "name": "temp_5(fan)", "controllable": false }, + { + "name": "temp_6(fan)", + "controllable": false + }, { "name": "sfm1_1(fan)", "controllable": false diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_ndk.json b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_ndk.json index 10a09a91e0e5..a6d6bbf8a45a 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_ndk.json +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_ndk.json @@ -19,6 +19,14 @@ { "intval": 1, "key": "disable_vfio" - } + }, + { + "key": "amd_pcon", + "intval": 1 + }, + { + "key": "enable_firmware_update", + "intval": 0 + } ] } diff --git a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot index c5ff45d1848e..ba47829674a4 100755 --- a/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot +++ b/device/nokia/x86_64-nokia_ixr7250e_sup-r0/platform_reboot @@ -6,6 +6,8 @@ echo "w" > /dev/watchdog kick_date=`date -u` echo "last watchdog kick $kick_date" > /var/log/nokia-watchdog-last.log rm -f /sys/firmware/efi/efivars/dump-* +touch /etc/opt/srlinux/devmgr_reboot_cause.done +rm -f /etc/opt/srlinux/reboot-cause.txt sync echo "Rebooting all Linecards" python3 -c 'import sonic_platform.platform; platform_chassis = sonic_platform.platform.Platform().get_chassis(); platform_chassis.reboot_imms()' From f4a9f7edaac11a9985fc99870bb68d34e386d122 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Sun, 19 Jun 2022 14:14:01 +0300 Subject: [PATCH 435/817] [sonic-feature.yang] fix check_up_status field type (#10986) - Why I did it An issue is encountered when a value "False" is written for a feature in "check_up_status" field, which does not pass YANG validation. - How I did it We usually use stypes::boolean_type for such fields, even in this YANG model. This custom type, supports "False" value. - How to verify it Write "False" in "check_up_status" field and see if YANG validation passes. Signed-off-by: Stepan Blyschak --- src/sonic-yang-models/yang-models/sonic-feature.yang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-yang-models/yang-models/sonic-feature.yang b/src/sonic-yang-models/yang-models/sonic-feature.yang index 54133ef10612..f27411788e8d 100644 --- a/src/sonic-yang-models/yang-models/sonic-feature.yang +++ b/src/sonic-yang-models/yang-models/sonic-feature.yang @@ -90,8 +90,8 @@ module sonic-feature{ leaf check_up_status { description "This configuration controls the system ready tool to check the app ready/up status"; - type boolean; - default false; + type stypes:boolean_type; + default "false"; } } } From ed99ce0ae0395d45027a76b729caf617ebaa32e9 Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Sun, 19 Jun 2022 14:16:09 +0300 Subject: [PATCH 436/817] [Mellanox] Install MFT package on platform monitor (pmon) container (#10932) - Why I did it Need to execute mlxreg inside pmon docker - How I did it Add MFT package to pmon Makefile - How to verify it Install image, go to pmon : docker exec -it pmon bash, exec mlxreg Verifiy warm, fast and cold reboot while MFT is being called in pmon constantly Signed-off-by: Andriy Yurkiv --- rules/docker-platform-monitor.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index bcfd6000fa00..cb9be990e61b 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -6,7 +6,7 @@ DOCKER_PLATFORM_MONITOR_DBG = $(DOCKER_PLATFORM_MONITOR_STEM)-$(DBG_IMAGE_MARK). $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/$(DOCKER_PLATFORM_MONITOR_STEM) -$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(LIBSENSORS) $(LM_SENSORS) $(FANCONTROL) $(SENSORD) $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(ETHTOOL) +$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(LIBSENSORS) $(LM_SENSORS) $(FANCONTROL) $(SENSORD) $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(ETHTOOL) $(MFT) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY3) From ad1e20fbc714f0a872043e2e1a8c4ac0eee13074 Mon Sep 17 00:00:00 2001 From: Shilong Liu Date: Mon, 20 Jun 2022 18:09:00 +0800 Subject: [PATCH 437/817] [build] Add version files to docker image dependencies (#11179) * [build] Add version files to docker image dependencies --- Makefile.cache | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile.cache b/Makefile.cache index 50fac768a599..9b6d6175780e 100644 --- a/Makefile.cache +++ b/Makefile.cache @@ -561,6 +561,12 @@ define SHA_DEP_RULES ALL_DEP_FILES_LIST += $(foreach pkg,$(2), $($(filter none,$($(1)_CACHE_MODE)), \ $(addsuffix .$(3),$(addprefix $(pkg)/, $(1))) \ $(addsuffix .$(3).sha,$(addprefix $(pkg)/, $(1))))) +$(foreach docker, $(filter $(SONIC_DOCKER_IMAGES), $(1)), \ + $(eval $(docker)_DEP_FILES+=$(wildcard files/build/versions/default/*) \ + $(wildcard files/build/versions/dockers/$(basename $(docker))/*))) +$(foreach docker, $(filter $(SONIC_DOCKER_DBG_IMAGES), $(1)), \ + $(eval $(docker)_DEP_FILES+=$(wildcard files/build/versions/default/*) \ + $(wildcard files/build/versions/dockers/$(patsubst %-$(DBG_IMAGE_MARK).gz,%,$(docker))/*))) $(addsuffix .$(3),$(addprefix $(2)/, $(1))) : $(2)/%.$(3) : \ $(2)/%.flags $$$$($$$$*_DEP_FILES) $$$$(if $$$$($$$$*_SMDEP_FILES), $(2)/%.smdep) @$$(eval $$*_DEP_FILES_MODIFIED := $$? ) From 42576d2664ecb128c65feffa135134a2fdf4716a Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Mon, 20 Jun 2022 19:39:05 +0300 Subject: [PATCH 438/817] [auto-ts] add memory check (#10433) #### Why I did it To support automatic techsupport invokation in case memory usage is too high. #### How I did it Implemented according to https://github.com/Azure/SONiC/pull/939 #### How to verify it UT, manual test on the switch. *DEPENDS* on https://github.com/Azure/sonic-utilities/pull/2116 --- files/build_templates/init_cfg.json.j2 | 5 +- files/image_config/monit/conf.d/sonic-host | 3 + .../tests/auto_techsupport.json | 18 ++++- .../tests_config/auto_techsupport.json | 69 +++++++++++++++++-- .../yang-models/sonic-auto_techsupport.yang | 18 +++++ 5 files changed, 103 insertions(+), 10 deletions(-) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index a197c22a9020..ca5a0756f954 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -79,6 +79,8 @@ "rate_limit_interval" : "180", "max_techsupport_limit" : "10.0", "max_core_limit" : "5.0", + "available_mem_threshold": "10.0", + "min_available_mem": "200", "since" : "2 days ago" } }, @@ -88,7 +90,8 @@ {%- if enable_auto_tech_support == "y" %} "state" : "enabled", {% else %} "state" : "disabled", {% endif %} - "rate_limit_interval" : "600" + "rate_limit_interval" : "600", + "available_mem_threshold": "10.0" }{%if not loop.last %},{% endif -%} {% endfor %} }, diff --git a/files/image_config/monit/conf.d/sonic-host b/files/image_config/monit/conf.d/sonic-host index ceebf1003eb2..d65325207543 100644 --- a/files/image_config/monit/conf.d/sonic-host +++ b/files/image_config/monit/conf.d/sonic-host @@ -46,3 +46,6 @@ check program vnetRouteCheck with path "/usr/local/bin/vnet_route_check.py" every 5 cycles if status != 0 for 3 cycle then alert repeat every 1 cycles +# memory_check tool that verifies that memory usage does not cross the threshold or invokes techsupport. +check program memory_check with path "/usr/local/bin/memory_threshold_check.py" + if status == 2 for 10 times within 20 cycles then exec "/usr/local/bin/memory_threshold_check_handler.py" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/auto_techsupport.json b/src/sonic-yang-models/tests/yang_model_tests/tests/auto_techsupport.json index 8a65fec2b6d0..a335dcfd389c 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/auto_techsupport.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/auto_techsupport.json @@ -8,7 +8,7 @@ }, "AUTO_TECHSUPPORT_INVALID_RATE_LIMIT_FORMAT": { "desc" : "Configure cooloff with a value of invalid format", - "eStrKey": "InvalidValue" + "eStrKey": "InvalidValue" }, "AUTO_TECHSUPPORT_OUT_OF_RANGE_DECIMAL": { "desc" : "Configure a value for core-uage outside the range [0, 100)", @@ -19,9 +19,23 @@ }, "AUTO_TECHSUPPORT_INVALID_FRACTION_DIGITS": { "desc" : "Configure a value for max_techsupport_size inside the range [0, 100) but with 3 fractional digits", - "eStrKey": "InvalidValue" + "eStrKey": "InvalidValue" }, "AUTO_TECHSUPPORT_RATE_LIMIT_INTERVAL_TEST": { "desc" : "Configure and test the valid configuration" + }, + "AUTO_TECHSUPPORT_AVAILABLE_MEM_THRESHOLD": { + "desc" : "Configure and test the valid configuration" + }, + "AUTO_TECHSUPPORT_INVALID_AVAILABLE_MEM_THRESHOLD": { + "desc" : "Configure a value for available_mem_threshold inside the range [0, 100) but with 3 fractional digits", + "eStrKey": "InvalidValue" + }, + "AUTO_TECHSUPPORT_GLOBAL_MEM_THRESHOLD_VALID": { + "desc" : "Configure and test the valid configuration" + }, + "AUTO_TECHSUPPORT_GLOBAL_MEM_THRESHOLD_INVALID_THRESHOLD": { + "desc" : "Configure a value for available_mem_threshold inside the range [0, 100) but with 3 fractional digits", + "eStrKey": "InvalidValue" } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/auto_techsupport.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/auto_techsupport.json index 43ac4ce82391..c8933bfe42fa 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/auto_techsupport.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/auto_techsupport.json @@ -8,7 +8,7 @@ "max_techsupport_limit" : "10.0", "max_core_limit" : "5.0", "since" : "2 days ago" - } + } } } }, @@ -20,8 +20,8 @@ "rate_limit_interval" : "180", "max_techsupport_limit" : "10.0", "max_core_limit" : "5.0", - "since" : "2 days ago" - } + "since" : "2 days ago" + } } } }, @@ -30,7 +30,7 @@ "sonic-auto_techsupport:AUTO_TECHSUPPORT": { "sonic-auto_techsupport:GLOBAL": { "rate_limit_interval" : "whatever" - } + } } } }, @@ -40,7 +40,7 @@ "sonic-auto_techsupport:GLOBAL": { "max_core_limit" : "100.00", "rate_limit_interval" : "180" - } + } } } }, @@ -50,7 +50,7 @@ "sonic-auto_techsupport:GLOBAL": { "max_techsupport_limit" : "11.23", "max_core_limit" : "99.99" - } + } } } }, @@ -60,7 +60,7 @@ "sonic-auto_techsupport:GLOBAL": { "max_techsupport_limit" : "11.111", "max_core_limit" : "99.99" - } + } } } }, @@ -81,5 +81,60 @@ ] } } + }, + "AUTO_TECHSUPPORT_GLOBAL_MEM_THRESHOLD_VALID": { + "sonic-auto_techsupport:sonic-auto_techsupport": { + "sonic-auto_techsupport:AUTO_TECHSUPPORT": { + "sonic-auto_techsupport:GLOBAL": { + "available_mem_threshold": "10.0", + "min_available_mem": "900" + } + } + } + }, + "AUTO_TECHSUPPORT_GLOBAL_MEM_THRESHOLD_INVALID_THRESHOLD": { + "sonic-auto_techsupport:sonic-auto_techsupport": { + "sonic-auto_techsupport:AUTO_TECHSUPPORT": { + "sonic-auto_techsupport:GLOBAL": { + "available_mem_threshold": "11.111" + } + } + } + }, + "AUTO_TECHSUPPORT_AVAILABLE_MEM_THRESHOLD": { + "sonic-auto_techsupport:sonic-auto_techsupport": { + "sonic-auto_techsupport:AUTO_TECHSUPPORT_FEATURE": { + "AUTO_TECHSUPPORT_FEATURE_LIST": [ + { + "feature_name" : "bgp", + "state" : "enabled", + "available_mem_threshold": "10.0" + }, + { + "feature_name" : "swss", + "state" : "disabled", + "available_mem_threshold": "10.0" + } + ] + } + } + }, + "AUTO_TECHSUPPORT_INVALID_AVAILABLE_MEM_THRESHOLD": { + "sonic-auto_techsupport:sonic-auto_techsupport": { + "sonic-auto_techsupport:AUTO_TECHSUPPORT_FEATURE": { + "AUTO_TECHSUPPORT_FEATURE_LIST": [ + { + "feature_name" : "bgp", + "state" : "enabled", + "available_mem_threshold": "11.111" + }, + { + "feature_name" : "swss", + "state" : "disabled", + "available_mem_threshold": "10.0" + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-auto_techsupport.yang b/src/sonic-yang-models/yang-models/sonic-auto_techsupport.yang index 94934d7ab201..02e29463d594 100644 --- a/src/sonic-yang-models/yang-models/sonic-auto_techsupport.yang +++ b/src/sonic-yang-models/yang-models/sonic-auto_techsupport.yang @@ -59,6 +59,18 @@ module sonic-auto_techsupport { description "Max Limit in percentage for the cummulative size of core dumps. No cleanup is performed if the value isn't congiured or is 0.0"; type decimal-repr; } + + leaf available_mem_threshold { + description "Memory threshold; 0 to disable techsupport invocation on memory usage threshold crossing"; + type decimal-repr; + default 10.0; + } + + leaf min_available_mem { + description "Minimum Free memory (in MB) that should be available for the techsupport execution to start"; + type uint32; + default 200; + } leaf since { /* @@ -96,6 +108,12 @@ module sonic-auto_techsupport { type stypes:admin_mode; } + leaf available_mem_threshold { + description "Memory threshold; 0 to disable techsupport invocation on memory usage threshold crossing"; + type decimal-repr; + default 10.0; + } + leaf rate_limit_interval { description "Rate limit interval for the corresponding feature. Configure 0 to explicitly disable"; type uint16; From 467e005b4c58705b9904999e13491fc18cff3262 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Mon, 20 Jun 2022 21:45:08 +0300 Subject: [PATCH 439/817] Add IP interface loopback action related content to YANG models. (#11012) *Add IP interface loopback action related content to the required YANG models. --- src/sonic-yang-models/doc/Configuration.md | 29 +++++++++----- .../tests/files/sample_config_db.json | 12 ++++-- .../yang_model_tests/tests/interface.json | 5 +++ .../yang_model_tests/tests/portchannel.json | 5 +++ .../tests/yang_model_tests/tests/vlan.json | 5 +++ .../tests/vlan_sub_interface.json | 5 +++ .../tests_config/interface.json | 28 +++++++++++++ .../tests_config/portchannel.json | 40 +++++++++++++++++++ .../yang_model_tests/tests_config/vlan.json | 12 ++++++ .../tests_config/vlan_sub_interface.json | 27 +++++++++++++ .../yang-models/sonic-interface.yang | 6 +++ .../yang-models/sonic-portchannel.yang | 5 +++ .../yang-models/sonic-vlan-sub-interface.yang | 5 +++ .../yang-models/sonic-vlan.yang | 5 +++ .../yang-templates/sonic-types.yang.j2 | 6 +++ 15 files changed, 181 insertions(+), 14 deletions(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 2339a7859171..d0f4b3cb6e67 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -707,12 +707,13 @@ This kind of profiles will be handled by buffer manager and won't be applied to ### Data Plane L3 Interfaces -IP configuration for data plane are defined in **INTERFACE**, -**PORTCHANNEL_INTERFACE**, and **VLAN_INTERFACE** table. The objects -in all three tables have the interface (could be physical port, port -channel, or vlan) that IP address is attached to as first-level key, and -IP prefix as second-level key. IP interface objects don't have any -attributes. +IP configuration for data plane are defined in **INTERFACE**, **VLAN_SUB_INTERFACE**, +**PORTCHANNEL_INTERFACE** and **VLAN_INTERFACE** table. The objects +in all four tables have the interface (could be physical port, port +channel, vlan or vlan sub interface) that IP address is attached to as first-level key, and +IP prefix as second-level key. IP interface address objects don't have any attributes. +IP interface attributes, resides in those tables as well, key is the interface name +and value is a list of field-values representing the interface attributes, e.g. loopback action. ``` { @@ -720,21 +721,29 @@ attributes. "Ethernet0|10.0.0.0/31": {}, "Ethernet4|10.0.0.2/31": {}, "Ethernet8|10.0.0.4/31": {} - ... + "Ethernet8": { + "loopback_action": "drop" + } }, - + "PORTCHANNEL_INTERFACE": { "PortChannel01|10.0.0.56/31": {}, "PortChannel01|FC00::71/126": {}, "PortChannel02|10.0.0.58/31": {}, "PortChannel02|FC00::75/126": {} - ... }, + "VLAN_INTERFACE": { "Vlan1000|192.168.0.1/27": {} + }, + +"VLAN_SUB_INTERFACE": { + "Ethernet4.1|10.0.0.2/31": {}, + "Ethernet4.1": { + "loopback_action": "drop" + } } } - ``` diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index a042bc6a9473..cb2b9ee567bd 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -117,7 +117,8 @@ }, "PORTCHANNEL_INTERFACE": { "PortChannel0003": { - "nat_zone": "1" + "nat_zone": "1", + "loopback_action": "drop" }, "PortChannel0004": {"vrf_name": "Vrf_blue"}, "PortChannel42|10.1.0.1/31": {}, @@ -132,7 +133,8 @@ }, "VLAN_INTERFACE": { "Vlan111": { - "nat_zone": "0" + "nat_zone": "0", + "loopback_action": "forward" }, "Vlan777": {}, "Vlan111|2a04:5555:45:6709::1/64": { @@ -930,7 +932,8 @@ "Ethernet14": {}, "Ethernet16": {}, "Ethernet18": { - "nat_zone": "1" + "nat_zone": "1", + "loopback_action": "forward" }, "Ethernet112|2a04:5555:40:a709::2/126": { "scope": "global", @@ -967,7 +970,8 @@ }, "VLAN_SUB_INTERFACE": { "Ethernet12.10": { - "admin_status": "up" + "admin_status": "up", + "loopback_action": "drop" }, "Ethernet12.10|10.0.1.56/31": {}, "Ethernet12.10|fc00::1:71/126": {}, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests/interface.json index 1c93238c1889..ed561f25bc2a 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/interface.json @@ -17,5 +17,10 @@ }, "INTERFACE_VALID_NAT_ZONE_RANGE": { "desc": "Configure valid value for nat zone." + }, + "INTERFACE_INVALID_LOOPBACK_ACTION": { + "desc": "INCORRECT LOOPBACK ACTION IN INTERFACE TABLE.", + "eStrKey" : "Pattern", + "eStr": ["drop|forward"] } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/portchannel.json b/src/sonic-yang-models/tests/yang_model_tests/tests/portchannel.json index 693b0fd47b75..e69074bdfbf6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/portchannel.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/portchannel.json @@ -58,5 +58,10 @@ }, "PORTCHANNEL_INTERFACE_VALID_NAT_ZONE_RANGE": { "desc": "Configure valid value for nat zone." + }, + "PORTCHANNEL_INTERFACE_INVALID_LOOPBACK_ACTION": { + "desc": "INCORRECT LOOPBACK ACTION IN PORTCHANNEL_INTERFACE TABLE.", + "eStrKey" : "Pattern", + "eStr": ["drop|forward"] } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan.json index a872784ff236..cf5fccf02bc0 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan.json @@ -74,5 +74,10 @@ "VLAN_INTERFACE_INVALID_PROXY_ARP": { "desc": "VLAN_INTERFACE with invalid proxy_arp value", "eStrKey": "Pattern" + }, + "VLAN_INTERFACE_INVALID_LOOPBACK_ACTION": { + "desc": "INCORRECT LOOPBACK ACTION IN VLAN_INTERFACE TABLE.", + "eStrKey" : "Pattern", + "eStr": ["drop|forward"] } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json index d112587307e4..b91c8a94f386 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vlan_sub_interface.json @@ -50,5 +50,10 @@ "VLAN_SUB_INTERFACE_INVALID_NAME_TEST": { "desc": "Configure invalid vlan sub interface name with no separator.", "eStrKey": "Pattern" + }, + "VLAN_SUB_INTERFACE_INVALID_LOOPBACK_ACTION": { + "desc": "INCORRECT LOOPBACK ACTION IN VLAN_SUB_INTERFACE TABLE.", + "eStrKey" : "Pattern", + "eStr": ["drop|forward"] } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/interface.json index db4763870d1d..2f20f8475b64 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/interface.json @@ -181,5 +181,33 @@ ] } } + }, + "INTERFACE_INVALID_LOOPBACK_ACTION": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_LIST": [ + { + "name": "Ethernet8", + "loopback_action": "trap" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + } } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json index d9a54b885958..6c26e9ce83e6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json @@ -374,5 +374,45 @@ ] } } + }, + "PORTCHANNEL_INTERFACE_INVALID_LOOPBACK_ACTION": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-portchannel:sonic-portchannel": { + "sonic-portchannel:PORTCHANNEL": { + "PORTCHANNEL_LIST": [ + { + "admin_status": "up", + "members": [ + "Ethernet0" + ], + "min_links": "1", + "mtu": "9100", + "name": "PortChannel0001" + } + ] + }, + "sonic-portchannel:PORTCHANNEL_INTERFACE": { + "PORTCHANNEL_INTERFACE_LIST": [ + { + "name": "PortChannel0001", + "loopback_action": "trap" + } + ] + } + } } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan.json index 2ae87a7b822e..c5934bc39c93 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan.json @@ -614,5 +614,17 @@ ] } } + }, + "VLAN_INTERFACE_INVALID_LOOPBACK_ACTION": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN_INTERFACE": { + "VLAN_INTERFACE_LIST": [ + { + "name": "Vlan1000", + "loopback_action": "trap" + } + ] + } + } } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json index 860de64ba663..b249510f4370 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json @@ -518,5 +518,32 @@ ] } } + }, + "VLAN_SUB_INTERFACE_INVALID_LOOPBACK_ACTION": { + "sonic-vlan-sub-interface:sonic-vlan-sub-interface": { + "sonic-vlan-sub-interface:VLAN_SUB_INTERFACE": { + "VLAN_SUB_INTERFACE_LIST": [ + { + "name": "Ethernet8.10", + "loopback_action": "trap" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "name": "Ethernet8", + "admin_status": "up", + "alias": "Ethernet8/1", + "description": "Ethernet8", + "lanes": "45,46,47,48", + "mtu": 9000, + "speed": 100000 + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-interface.yang b/src/sonic-yang-models/yang-models/sonic-interface.yang index 746dbba46b7b..74f241fed0d4 100644 --- a/src/sonic-yang-models/yang-models/sonic-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-interface.yang @@ -66,6 +66,7 @@ module sonic-interface { } default "0"; } + leaf mpls { description "Enable/disable MPLS routing for the interface"; type enumeration { @@ -73,6 +74,11 @@ module sonic-interface { enum disable; } } + + leaf loopback_action { + description "Packet action when a packet ingress and gets routed on the same IP interface"; + type stypes:loopback_action; + } } /* end of INTERFACE_LIST */ diff --git a/src/sonic-yang-models/yang-models/sonic-portchannel.yang b/src/sonic-yang-models/yang-models/sonic-portchannel.yang index 083a413527ec..27df0625dfee 100644 --- a/src/sonic-yang-models/yang-models/sonic-portchannel.yang +++ b/src/sonic-yang-models/yang-models/sonic-portchannel.yang @@ -167,6 +167,11 @@ module sonic-portchannel { } } + leaf loopback_action { + description "Packet action when a packet ingress and gets routed on the same IP interface"; + type stypes:loopback_action; + } + leaf nat_zone { description "NAT Zone for the portchannel interface"; type uint8 { diff --git a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang index 212fb5533c3b..bc13113ef53e 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan-sub-interface.yang @@ -65,6 +65,11 @@ module sonic-vlan-sub-interface { path "/vrf:sonic-vrf/vrf:VRF/vrf:VRF_LIST/vrf:name"; } } + + leaf loopback_action { + description "Packet action when a packet ingress and gets routed on the same IP interface"; + type stypes:loopback_action; + } } list VLAN_SUB_INTERFACE_IPPREFIX_LIST { diff --git a/src/sonic-yang-models/yang-models/sonic-vlan.yang b/src/sonic-yang-models/yang-models/sonic-vlan.yang index 960f4b44c0d0..48ec466b825b 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan.yang @@ -101,6 +101,11 @@ module sonic-vlan { pattern "enabled|disabled"; } } + + leaf loopback_action { + description "Packet action when a packet ingress and gets routed on the same IP interface"; + type stypes:loopback_action; + } } /* end of VLAN_INTERFACE_LIST */ diff --git a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 index 29be032e8876..6d8bd198d216 100644 --- a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 @@ -117,6 +117,12 @@ module sonic-types { } } + typedef loopback_action { + type string { + pattern "drop|forward"; + } + } + typedef admin_mode { type enumeration { enum enabled; From 87425a5b2b02ecd75f3de7e5174e37e053e31790 Mon Sep 17 00:00:00 2001 From: Vadym Hlushko <62022266+vadymhlushko-mlnx@users.noreply.github.com> Date: Tue, 21 Jun 2022 03:07:02 +0300 Subject: [PATCH 440/817] [sflow + dropmon] added the ENABLE_SFLOW_DROPMON build flag. Added patches for sflow repo. (#10370) * [sflow + dropmon] added INCLUDE_SFLOW_DROPMON flag, added patches for hsflowd *Added a capability of monitoring dropped packets for the sFlow daemon in order to improve network - monitoring, diagnostic, and troubleshooting. The drop monitor service allows the sFlow daemon to export another type of sample - dropped packets as Discard samples alongside Counter samples and Packet Flow samples. Signed-off-by: Vadym Hlushko --- rules/config | 3 + rules/sflow.mk | 4 +- slave.mk | 1 + src/sflow/hsflowd/Makefile | 5 + ...ated-local-copy-of-linux-net_dropmon.patch | 172 ++++++++++++++++++ ...abled-drop-monitor-support-for-SONiC.patch | 60 ++++++ src/sflow/hsflowd/patch/dropmon/series | 2 + 7 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 src/sflow/hsflowd/patch/dropmon/0001-dropmon-workaround-created-local-copy-of-linux-net_dropmon.patch create mode 100644 src/sflow/hsflowd/patch/dropmon/0001-sflow-enabled-drop-monitor-support-for-SONiC.patch create mode 100644 src/sflow/hsflowd/patch/dropmon/series diff --git a/rules/config b/rules/config index 0fdbc2b59e9b..dc973cbd12da 100644 --- a/rules/config +++ b/rules/config @@ -131,6 +131,9 @@ INCLUDE_ICCPD = n # INCLUDE_SFLOW - build docker-sflow for sFlow support INCLUDE_SFLOW = y +# ENABLE_SFLOW_DROPMON - support of drop packets monitoring feature for sFlow deamon +ENABLE_SFLOW_DROPMON = n + # INCLUDE_MGMT_FRAMEWORK - build docker-sonic-mgmt-framework for CLI and REST server support INCLUDE_MGMT_FRAMEWORK = y diff --git a/rules/sflow.mk b/rules/sflow.mk index 1942a9106598..78b917535bb6 100644 --- a/rules/sflow.mk +++ b/rules/sflow.mk @@ -1,7 +1,9 @@ # host-sflow package -HSFLOWD_VERSION = 2.0.34 +HSFLOWD_VERSION = 2.0.35 HSFLOWD_SUBVERSION = 1 + +export ENABLE_SFLOW_DROPMON export HSFLOWD_VERSION HSFLOWD_SUBVERSION HSFLOWD = hsflowd_$(HSFLOWD_VERSION)-$(HSFLOWD_SUBVERSION)_$(CONFIGURED_ARCH).deb diff --git a/slave.mk b/slave.mk index 9263bf8bede4..76274b21b39e 100644 --- a/slave.mk +++ b/slave.mk @@ -328,6 +328,7 @@ $(info "INCLUDE_SYSTEM_TELEMETRY" : "$(INCLUDE_SYSTEM_TELEMETRY)") $(info "ENABLE_HOST_SERVICE_ON_START" : "$(ENABLE_HOST_SERVICE_ON_START)") $(info "INCLUDE_RESTAPI" : "$(INCLUDE_RESTAPI)") $(info "INCLUDE_SFLOW" : "$(INCLUDE_SFLOW)") +$(info "ENABLE_SFLOW_DROPMON" : "$(ENABLE_SFLOW_DROPMON)") $(info "INCLUDE_NAT" : "$(INCLUDE_NAT)") $(info "INCLUDE_DHCP_RELAY" : "$(INCLUDE_DHCP_RELAY)") $(info "INCLUDE_P4RT" : "$(INCLUDE_P4RT)") diff --git a/src/sflow/hsflowd/Makefile b/src/sflow/hsflowd/Makefile index e29dbcc199bb..d4312b30c267 100644 --- a/src/sflow/hsflowd/Makefile +++ b/src/sflow/hsflowd/Makefile @@ -16,6 +16,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg init stg import -s ../patch/series + if [[ $(ENABLE_SFLOW_DROPMON) == y ]]; then + stg repair + stg import -s ../patch/dropmon/series + fi + mkdir -p debian cp -r DEBIAN_build/* debian chmod u+x debian/rules diff --git a/src/sflow/hsflowd/patch/dropmon/0001-dropmon-workaround-created-local-copy-of-linux-net_dropmon.patch b/src/sflow/hsflowd/patch/dropmon/0001-dropmon-workaround-created-local-copy-of-linux-net_dropmon.patch new file mode 100644 index 000000000000..80a2a20aa8eb --- /dev/null +++ b/src/sflow/hsflowd/patch/dropmon/0001-dropmon-workaround-created-local-copy-of-linux-net_dropmon.patch @@ -0,0 +1,172 @@ +From 6ad3a8ef0339041a800a41dac96370c11b72d814 Mon Sep 17 00:00:00 2001 +From: Vadym Hlushko +Date: Fri, 4 Feb 2022 15:11:48 +0000 +Subject: [PATCH] [dropmon] workaround - created local copy of +TDB: this patch will be removed when we update docker-sflow to bullseye kernel. + +Signed-off-by: Vadym Hlushko +--- + src/Linux/mod_dropmon.c | 2 +- + src/Linux/my_dropmon.h | 132 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 133 insertions(+), 1 deletion(-) + create mode 100644 src/Linux/my_dropmon.h + +diff --git a/src/Linux/mod_dropmon.c b/src/Linux/mod_dropmon.c +index 6b8ec6d..a37b157 100644 +--- a/src/Linux/mod_dropmon.c ++++ b/src/Linux/mod_dropmon.c +@@ -7,12 +7,12 @@ extern "C" { + #endif + + #include "hsflowd.h" ++#include "my_dropmon.h" + #include + #include + #include + #include + #include +-#include + #include + #include + +diff --git a/src/Linux/my_dropmon.h b/src/Linux/my_dropmon.h +new file mode 100644 +index 0000000..66048cc +--- /dev/null ++++ b/src/Linux/my_dropmon.h +@@ -0,0 +1,132 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++#ifndef __NET_DROPMON_H ++#define __NET_DROPMON_H ++ ++#include ++#include ++ ++struct net_dm_drop_point { ++ __u8 pc[8]; ++ __u32 count; ++}; ++ ++#define is_drop_point_hw(x) do {\ ++ int ____i, ____j;\ ++ for (____i = 0; ____i < 8; i ____i++)\ ++ ____j |= x[____i];\ ++ ____j;\ ++} while (0) ++ ++#define NET_DM_CFG_VERSION 0 ++#define NET_DM_CFG_ALERT_COUNT 1 ++#define NET_DM_CFG_ALERT_DELAY 2 ++#define NET_DM_CFG_MAX 3 ++ ++struct net_dm_config_entry { ++ __u32 type; ++ __u64 data __attribute__((aligned(8))); ++}; ++ ++struct net_dm_config_msg { ++ __u32 entries; ++ struct net_dm_config_entry options[0]; ++}; ++ ++struct net_dm_alert_msg { ++ __u32 entries; ++ struct net_dm_drop_point points[0]; ++}; ++ ++struct net_dm_user_msg { ++ union { ++ struct net_dm_config_msg user; ++ struct net_dm_alert_msg alert; ++ } u; ++}; ++ ++ ++/* These are the netlink message types for this protocol */ ++ ++enum { ++ NET_DM_CMD_UNSPEC = 0, ++ NET_DM_CMD_ALERT, ++ NET_DM_CMD_CONFIG, ++ NET_DM_CMD_START, ++ NET_DM_CMD_STOP, ++ NET_DM_CMD_PACKET_ALERT, ++ NET_DM_CMD_CONFIG_GET, ++ NET_DM_CMD_CONFIG_NEW, ++ NET_DM_CMD_STATS_GET, ++ NET_DM_CMD_STATS_NEW, ++ _NET_DM_CMD_MAX, ++}; ++ ++#define NET_DM_CMD_MAX (_NET_DM_CMD_MAX - 1) ++ ++/* ++ * Our group identifiers ++ */ ++#define NET_DM_GRP_ALERT 1 ++ ++enum net_dm_attr { ++ NET_DM_ATTR_UNSPEC, ++ ++ NET_DM_ATTR_ALERT_MODE, /* u8 */ ++ NET_DM_ATTR_PC, /* u64 */ ++ NET_DM_ATTR_SYMBOL, /* string */ ++ NET_DM_ATTR_IN_PORT, /* nested */ ++ NET_DM_ATTR_TIMESTAMP, /* u64 */ ++ NET_DM_ATTR_PROTO, /* u16 */ ++ NET_DM_ATTR_PAYLOAD, /* binary */ ++ NET_DM_ATTR_PAD, ++ NET_DM_ATTR_TRUNC_LEN, /* u32 */ ++ NET_DM_ATTR_ORIG_LEN, /* u32 */ ++ NET_DM_ATTR_QUEUE_LEN, /* u32 */ ++ NET_DM_ATTR_STATS, /* nested */ ++ NET_DM_ATTR_HW_STATS, /* nested */ ++ NET_DM_ATTR_ORIGIN, /* u16 */ ++ NET_DM_ATTR_HW_TRAP_GROUP_NAME, /* string */ ++ NET_DM_ATTR_HW_TRAP_NAME, /* string */ ++ NET_DM_ATTR_HW_ENTRIES, /* nested */ ++ NET_DM_ATTR_HW_ENTRY, /* nested */ ++ NET_DM_ATTR_HW_TRAP_COUNT, /* u32 */ ++ NET_DM_ATTR_SW_DROPS, /* flag */ ++ NET_DM_ATTR_HW_DROPS, /* flag */ ++ NET_DM_ATTR_FLOW_ACTION_COOKIE, /* binary */ ++ ++ __NET_DM_ATTR_MAX, ++ NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1 ++}; ++ ++/** ++ * enum net_dm_alert_mode - Alert mode. ++ * @NET_DM_ALERT_MODE_SUMMARY: A summary of recent drops is sent to user space. ++ * @NET_DM_ALERT_MODE_PACKET: Each dropped packet is sent to user space along ++ * with metadata. ++ */ ++enum net_dm_alert_mode { ++ NET_DM_ALERT_MODE_SUMMARY, ++ NET_DM_ALERT_MODE_PACKET, ++}; ++ ++enum { ++ NET_DM_ATTR_PORT_NETDEV_IFINDEX, /* u32 */ ++ NET_DM_ATTR_PORT_NETDEV_NAME, /* string */ ++ ++ __NET_DM_ATTR_PORT_MAX, ++ NET_DM_ATTR_PORT_MAX = __NET_DM_ATTR_PORT_MAX - 1 ++}; ++ ++enum { ++ NET_DM_ATTR_STATS_DROPPED, /* u64 */ ++ ++ __NET_DM_ATTR_STATS_MAX, ++ NET_DM_ATTR_STATS_MAX = __NET_DM_ATTR_STATS_MAX - 1 ++}; ++ ++enum net_dm_origin { ++ NET_DM_ORIGIN_SW, ++ NET_DM_ORIGIN_HW, ++}; ++ ++#endif +-- +2.17.1 + diff --git a/src/sflow/hsflowd/patch/dropmon/0001-sflow-enabled-drop-monitor-support-for-SONiC.patch b/src/sflow/hsflowd/patch/dropmon/0001-sflow-enabled-drop-monitor-support-for-SONiC.patch new file mode 100644 index 000000000000..7a3561fd7d4c --- /dev/null +++ b/src/sflow/hsflowd/patch/dropmon/0001-sflow-enabled-drop-monitor-support-for-SONiC.patch @@ -0,0 +1,60 @@ +From 4bdd892662c08a396066ba6a1c55eac3f8aa0a5f Mon Sep 17 00:00:00 2001 +From: Vadym Hlushko +Date: Tue, 25 Jan 2022 12:59:40 +0000 +Subject: [PATCH] [sflow] enabled drop monitor support for SONiC + +Signed-off-by: Vadym Hlushko +--- + src/Linux/Makefile | 2 +- + src/Linux/hsflowd.c | 8 ++++++++ + src/Linux/scripts/hsflowd.conf.sonic | 2 ++ + 3 files changed, 11 insertions(+), 1 deletion(-) + +diff --git a/src/Linux/Makefile b/src/Linux/Makefile +index 8128cf2..cf538e7 100644 +--- a/src/Linux/Makefile ++++ b/src/Linux/Makefile +@@ -34,7 +34,7 @@ FEATURES_DENT= DENT PSAMPLE SYSTEMD DROPMON + FEATURES_EOS= EAPI + FEATURES_OS10= OS10 DBUS SYSTEMD + FEATURES_OPX= OPX DBUS SYSTEMD +-FEATURES_SONIC= SONIC PSAMPLE DOCKER ++FEATURES_SONIC= SONIC PSAMPLE DOCKER DROPMON + FEATURES_XEN= XEN OVS + FEATURES_HOST= NFLOG PCAP TCP DOCKER KVM OVS DBUS SYSTEMD + +diff --git a/src/Linux/hsflowd.c b/src/Linux/hsflowd.c +index 5d94e79..25031d1 100644 +--- a/src/Linux/hsflowd.c ++++ b/src/Linux/hsflowd.c +@@ -1877,6 +1877,14 @@ extern "C" { + sp->psample.ingress = YES; + sp->psample.egress = NO; + sp->psample.group = 1; ++ // drop-monitor support ++ myLog(LOG_INFO, "drop-monitor support for SONiC"); ++ sp->dropmon.dropmon = YES; ++ sp->dropmon.group = 1; ++ sp->dropmon.start = NO; ++ sp->dropmon.limit = 1000; ++ sp->dropmon.sw = NO; ++ sp->dropmon.hw = YES; + #endif /* HSP_LOAD_SONIC */ + + #ifdef HSP_LOAD_XEN +diff --git a/src/Linux/scripts/hsflowd.conf.sonic b/src/Linux/scripts/hsflowd.conf.sonic +index e675730..fb52a54 100644 +--- a/src/Linux/scripts/hsflowd.conf.sonic ++++ b/src/Linux/scripts/hsflowd.conf.sonic +@@ -4,6 +4,8 @@ + sflow { + # sonic {} loaded automatically + # psample {} loaded automatically ++ # packet drop monitoring: ++ dropmon { group=1 start=on limit=1000 sw=off hw=on } + # ====== detect new interfaces ====== + refreshAdaptors=60 + # ====== Agent IP selection ====== +-- +2.17.1 + diff --git a/src/sflow/hsflowd/patch/dropmon/series b/src/sflow/hsflowd/patch/dropmon/series new file mode 100644 index 000000000000..1a4bb1772ac3 --- /dev/null +++ b/src/sflow/hsflowd/patch/dropmon/series @@ -0,0 +1,2 @@ +0001-dropmon-workaround-created-local-copy-of-linux-net_dropmon.patch +0001-sflow-enabled-drop-monitor-support-for-SONiC.patch \ No newline at end of file From fdc65d7600ed401bc0344fb4bf5a11847e07927d Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Mon, 20 Jun 2022 17:57:57 -0700 Subject: [PATCH 441/817] Remove minigraph loading in updategraph script (#11146) Why I did it Minigraph will be deprecated in the future. So minigraph related reload should be deleted. How I did it Remove unused load_minigraph --- files/image_config/updategraph/updategraph | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 061d8e1133c4..905831ae75c4 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -1,12 +1,5 @@ #!/bin/bash -reload_minigraph() -{ - echo "Reloading minigraph..." - config load_minigraph -y -n - config save -y -} - # read SONiC immutable variables [ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment @@ -18,10 +11,8 @@ fi . /etc/sonic/updategraph.conf if [ "$enabled" = "reload_only" ]; then - reload_minigraph - sed -i "/enabled=/d" /etc/sonic/updategraph.conf - echo "enabled=false" >> /etc/sonic/updategraph.conf - exit 0 + echo "reload_only will not be supported in file updategraph.conf" + exit 1 fi if [ "$enabled" != "true" ]; then From 7ac590b5c5e3ebca608566d9440c0b6afe6b51f0 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Tue, 21 Jun 2022 10:12:20 +0800 Subject: [PATCH 442/817] [Mellanox] Enhance Platform API to support SN2201 - RJ45 ports and new components mgmt. (#10377) * Support new platform SN2201 and RJ45 port Signed-off-by: Kebo Liu * remove unused import and redundant function Signed-off-by: Kebo Liu * fix error introduced by rebase Signed-off-by: Kebo Liu * Revert the special handling of RJ45 ports (#56) * Revert the special handling of RJ45 ports sfp.py sfp_event.py chassis.py Signed-off-by: Stephen Sun * Remove deadcode Signed-off-by: Stephen Sun * Support CPLD update for SN2201 A new class is introduced, deriving from ComponentCPLD and overloading _install_firmware Change _install_firmware from private (starting with __) to protected, making it overloadable Signed-off-by: Stephen Sun * Initialize component BIOS/CPLD Signed-off-by: Stephen Sun * Remove swb_amb which doesn't on DVT board any more Signed-off-by: Stephen Sun * Remove the unexisted sensor - switch board ambient - from platform.json Signed-off-by: Stephen Sun * Do not report error on receiving unknown status on RJ45 ports Translate it to disconnect for RJ45 ports Report error for xSFP ports Signed-off-by: Stephen Sun * Add reinit for RJ45 to avoid exception Signed-off-by: Stephen Sun Co-authored-by: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Co-authored-by: Stephen Sun --- .../x86_64-nvidia_sn2201-r0/platform.json | 3 - .../platform_components.json | 1 + .../sonic_platform/chassis.py | 33 +- .../sonic_platform/component.py | 71 +++- .../sonic_platform/device_data.py | 21 +- .../mlnx-platform-api/sonic_platform/sfp.py | 355 ++++++++++++++++-- .../sonic_platform/sfp_event.py | 19 +- .../mlnx-platform-api/sonic_platform/utils.py | 59 ++- .../mlnx-platform-api/tests/test_chassis.py | 2 + .../mlnx-platform-api/tests/test_eeprom.py | 6 +- .../mlnx-platform-api/tests/test_led.py | 1 + .../mlnx-platform-api/tests/test_module.py | 2 + .../mlnx-platform-api/tests/test_sfp.py | 4 +- .../mlnx-platform-api/tests/test_thermal.py | 4 +- platform/mellanox/mlnx-ssd-fw-update.sh | 54 ++- 15 files changed, 570 insertions(+), 65 deletions(-) diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json index f600f26293ce..83250c75f74e 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json @@ -90,9 +90,6 @@ { "name": "Ambient CPU Board Temp" }, - { - "name": "Ambient Switch Board Temp" - }, { "name": "CPU Pack Temp" }, diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json b/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json index e28c19087875..88d4851f7176 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/platform_components.json @@ -4,6 +4,7 @@ "component": { "ONIE": { }, "SSD": { }, + "BIOS": { }, "CPLD1": { }, "CPLD2": { } } diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index f68d1033f019..dc48e11da272 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -27,14 +27,17 @@ from sonic_py_common.logger import Logger import os from functools import reduce - + from .utils import extract_RJ45_ports_index from . import utils from .device_data import DeviceDataManager + from .sfp import SFP, RJ45Port, deinitialize_sdk_handle except ImportError as e: raise ImportError (str(e) + "- required module not found") MAX_SELECT_DELAY = 3600 +RJ45_TYPE = "RJ45" + DMI_FILE = '/sys/firmware/dmi/entries/2-0/raw' DMI_HEADER_LEN = 15 DMI_PRODUCT_NAME = "Product Name" @@ -106,6 +109,10 @@ def __init__(self): self.sfp_initialized_count = 0 self.sfp_event = None self.reboot_cause_initialized = False + + # Build the RJ45 port list from platform.json and hwsku.json + self.RJ45_port_list = extract_RJ45_ports_index() + logger.log_info("Chassis loaded successfully") def __del__(self): @@ -242,7 +249,10 @@ def initialize_single_sfp(self, index): if not self._sfp_list[index]: from .sfp import SFP - self._sfp_list[index] = SFP(index) + if self.RJ45_port_list and index in self.RJ45_port_list: + self._sfp_list[index] = RJ45Port(index) + else: + self._sfp_list[index] = SFP(index) self.sfp_initialized_count += 1 def initialize_sfp(self): @@ -250,14 +260,20 @@ def initialize_sfp(self): from .sfp import SFP sfp_count = self.get_num_sfps() for index in range(sfp_count): - sfp_module = SFP(index) + if self.RJ45_port_list and index in self.RJ45_port_list: + sfp_module = RJ45Port(index) + else: + sfp_module = SFP(index) self._sfp_list.append(sfp_module) self.sfp_initialized_count = sfp_count elif self.sfp_initialized_count != len(self._sfp_list): from .sfp import SFP for index in range(len(self._sfp_list)): if self._sfp_list[index] is None: - self._sfp_list[index] = SFP(index) + if self.RJ45_port_list and index in self.RJ45_port_list: + self._sfp_list[index] = RJ45Port(index) + else: + self._sfp_list[index] = SFP(index) self.sfp_initialized_count = len(self._sfp_list) def get_num_sfps(self): @@ -324,7 +340,7 @@ def get_change_event(self, timeout=0): # Initialize SFP event first if not self.sfp_event: from .sfp_event import sfp_event - self.sfp_event = sfp_event() + self.sfp_event = sfp_event(self.RJ45_port_list) self.sfp_event.initialize() wait_for_ever = (timeout == 0) @@ -340,7 +356,8 @@ def get_change_event(self, timeout=0): status = self.sfp_event.check_sfp_status(port_dict, error_dict, timeout) if status: - self.reinit_sfps(port_dict) + if port_dict: + self.reinit_sfps(port_dict) result_dict = {'sfp':port_dict} if error_dict: result_dict['sfp_error'] = error_dict @@ -515,8 +532,8 @@ def initialize_components(self): from .component import ComponentONIE, ComponentSSD, ComponentBIOS, ComponentCPLD self._component_list.append(ComponentONIE()) self._component_list.append(ComponentSSD()) - self._component_list.append(ComponentBIOS()) - self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(DeviceDataManager.get_bios_component()) + self._component_list.extend(DeviceDataManager.get_cpld_component_list()) def get_num_components(self): """ diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py index d2820090798b..6f482f497194 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/component.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/component.py @@ -29,6 +29,7 @@ import glob import tempfile import subprocess + from sonic_py_common import device_info if sys.version_info[0] > 2: import configparser else: @@ -136,7 +137,17 @@ class ONIEUpdater(object): ONIE_IMAGE_INFO_COMMAND = '/bin/bash {} -q -i' + # Upgrading fireware from ONIE is not supported from the beginning on some platforms, like SN2700. + # There is a logic to check the ONIE version in order to know whether it is supported. + # If it is not supported, we will not proceed and print some error message. + # For SN2201, upgrading fireware from ONIE is supported from day one so we do not need to check it. + PLATFORM_ALWAYS_SUPPORT_UPGRADE = ['x86_64-nvidia_sn2201-r0'] + BIOS_UPDATE_FILE_EXT = '.rom' + + + def __init__(self): + self.platform = device_info.get_platform() def __add_prefix(self, image_path): if self.BIOS_UPDATE_FILE_EXT not in image_path: @@ -336,6 +347,9 @@ def update_firmware(self, image_path, allow_reboot=True): raise def is_non_onie_firmware_update_supported(self): + if self.platform in self.PLATFORM_ALWAYS_SUPPORT_UPGRADE: + return True + current_version = self.get_onie_version() _, _, major1, minor1, release1, _ = self.parse_onie_version(current_version) version1 = int("{}{}{}".format(major1, minor1, release1)) @@ -698,6 +712,37 @@ def update_firmware(self, image_path): self.__install_firmware(image_path) +class ComponentBIOSSN2201(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_VERSION_COMMAND = 'dmidecode -t0' + + def __init__(self): + super(ComponentBIOSSN2201, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + cmd = self.BIOS_VERSION_COMMAND + + try: + output = subprocess.check_output(cmd.split(), + stderr=subprocess.STDOUT, + universal_newlines=True).rstrip('\n') + except subprocess.CalledProcessError as e: + raise RuntimeError("Failed to get {} version: {}".format(self.name, str(e))) + + match = re.search('Version: (.*)', output) + if match: + version = match.group(1) + else: + version = 'Unknown version' + + return version + + class ComponentCPLD(Component): COMPONENT_NAME = 'CPLD{}' COMPONENT_DESCRIPTION = 'CPLD - Complex Programmable Logic Device' @@ -744,7 +789,7 @@ def __get_mst_device(self): return mst_dev_list[0] - def __install_firmware(self, image_path): + def _install_firmware(self, image_path): if not self._check_file_validity(image_path): return False @@ -830,9 +875,9 @@ def install_firmware(self, image_path): burn_firmware = mpfa.get_metadata().get('firmware', 'burn') print("INFO: Processing {} burn file: firmware install".format(self.name)) - return self.__install_firmware(os.path.join(mpfa.get_path(), burn_firmware)) + return self._install_firmware(os.path.join(mpfa.get_path(), burn_firmware)) else: - return self.__install_firmware(image_path) + return self._install_firmware(image_path) def update_firmware(self, image_path): with MPFAManager(image_path) as mpfa: @@ -845,11 +890,11 @@ def update_firmware(self, image_path): refresh_firmware = mpfa.get_metadata().get('firmware', 'refresh') print("INFO: Processing {} burn file: firmware install".format(self.name)) - if not self.__install_firmware(os.path.join(mpfa.get_path(), burn_firmware)): + if not self._install_firmware(os.path.join(mpfa.get_path(), burn_firmware)): return print("INFO: Processing {} refresh file: firmware update".format(self.name)) - self.__install_firmware(os.path.join(mpfa.get_path(), refresh_firmware)) + self._install_firmware(os.path.join(mpfa.get_path(), refresh_firmware)) @classmethod def get_component_list(cls): @@ -862,3 +907,19 @@ def get_component_list(cls): component_list.append(cls(cpld_idx)) return component_list + + +class ComponentCPLDSN2201(ComponentCPLD): + CPLD_FIRMWARE_UPDATE_COMMAND = 'cpldupdate --gpio {} --uncustomized --print-progress' + + def _install_firmware(self, image_path): + cmd = self.CPLD_FIRMWARE_UPDATE_COMMAND.format(image_path) + + try: + print("INFO: Installing {} firmware update: path={}".format(self.name, image_path)) + subprocess.check_call(cmd.split(), universal_newlines=True) + except subprocess.CalledProcessError as e: + print("ERROR: Failed to update {} firmware: {}".format(self.name, str(e))) + return False + + return True diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py index 17fe88037e06..94ed64d7d380 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/device_data.py @@ -158,8 +158,7 @@ 'thermal': { "capability": { "comex_amb": False, - "cpu_amb": True, - "swb_amb": True + "cpu_amb": True } } }, @@ -281,3 +280,21 @@ def get_cpu_thermal_threshold(cls): return None, None return thermal_data.get('cpu_threshold', (None, None)) + + @classmethod + def get_bios_component(cls): + from .component import ComponentBIOS, ComponentBIOSSN2201 + if cls.get_platform_name() in ['x86_64-nvidia_sn2201-r0']: + # For SN2201, special chass is required for handle BIOS + # Currently, only fetching BIOS version is supported + return ComponentBIOSSN2201() + return ComponentBIOS() + + @classmethod + def get_cpld_component_list(cls): + from .component import ComponentCPLD, ComponentCPLDSN2201 + if cls.get_platform_name() in ['x86_64-nvidia_sn2201-r0']: + # For SN2201, special chass is required for handle BIOS + # Currently, only fetching BIOS version is supported + return ComponentCPLDSN2201.get_component_list() + return ComponentCPLD.get_component_list() diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index efaf3479b6ed..3ee8b348ce00 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -80,6 +80,8 @@ '18' # QSFP-DD Double Density 8X Pluggable Transceiver ] +RJ45_TYPE = "RJ45" + #variables for sdk REGISTER_NUM = 1 DEVICE_ID = 1 @@ -235,7 +237,44 @@ def __exit__(self, exc_type, exc_val, exc_tb): deinitialize_sdk_handle(self.sdk_handle) -class SFP(SfpOptoeBase): +class NvidiaSFPCommon(SfpOptoeBase): + def __init__(self, sfp_index): + super(NvidiaSFPCommon, self).__init__() + self.index = sfp_index + 1 + self.sdk_index = sfp_index + + @property + def sdk_handle(self): + if not SFP.shared_sdk_handle: + SFP.shared_sdk_handle = initialize_sdk_handle() + if not SFP.shared_sdk_handle: + logger.log_error('Failed to open SDK handle') + return SFP.shared_sdk_handle + + @classmethod + def _get_module_info(self, sdk_handle, sdk_index): + """ + Get error code of the SFP module + + Returns: + The error code fetch from SDK API + """ + module_id_info_list = new_sx_mgmt_module_id_info_t_arr(1) + module_info_list = new_sx_mgmt_phy_module_info_t_arr(1) + + module_id_info = sx_mgmt_module_id_info_t() + module_id_info.slot_id = 0 + module_id_info.module_id = sdk_index + sx_mgmt_module_id_info_t_arr_setitem(module_id_info_list, 0, module_id_info) + + rc = sx_mgmt_phy_module_info_get(sdk_handle, module_id_info_list, 1, module_info_list) + assert SX_STATUS_SUCCESS == rc, "sx_mgmt_phy_module_info_get failed, error code {}".format(rc) + + mod_info = sx_mgmt_phy_module_info_t_arr_getitem(module_info_list, 0) + return mod_info.module_state.oper_state, mod_info.module_state.error_type + + +class SFP(NvidiaSFPCommon): """Platform-specific SFP class""" shared_sdk_handle = None SFP_MLNX_ERROR_DESCRIPTION_LONGRANGE_NON_MLNX_CABLE = 'Long range for non-Mellanox cable or module' @@ -250,13 +289,11 @@ class SFP(SfpOptoeBase): SFP_MLNX_ERROR_BIT_PCIE_POWER_SLOT_EXCEEDED = 0x00080000 SFP_MLNX_ERROR_BIT_RESERVED = 0x80000000 - def __init__(self, sfp_index, slot_id=0, linecard_port_count=0, lc_name=None): - super(SFP, self).__init__() + def __init__(self, sfp_index, sfp_type=None, slot_id=0, linecard_port_count=0, lc_name=None): + super(SFP, self).__init__(sfp_index) + self._sfp_type = sfp_type if slot_id == 0: # For non-modular chassis - self.index = sfp_index + 1 - self.sdk_index = sfp_index - from .thermal import initialize_sfp_thermal self._thermal_list = initialize_sfp_thermal(sfp_index) else: # For modular chassis @@ -281,6 +318,7 @@ def get_mst_pci_device(self): logger.log_error("Failed to find mst PCI device rc={} err.msg={}".format(e.returncode, e.output)) return device_name + ''' @property def sdk_handle(self): if not SFP.shared_sdk_handle: @@ -288,6 +326,7 @@ def sdk_handle(self): if not SFP.shared_sdk_handle: logger.log_error('Failed to open SDK handle') return SFP.shared_sdk_handle + ''' def reinit(self): """ @@ -512,7 +551,7 @@ def is_cpu(cls, port): @classmethod - def is_port_admin_status_up(cls, sdk_handle, log_port): + def _fetch_port_status(cls, sdk_handle, log_port): oper_state_p = new_sx_port_oper_state_t_p() admin_state_p = new_sx_port_admin_state_t_p() module_state_p = new_sx_port_module_state_t_p() @@ -520,12 +559,19 @@ def is_port_admin_status_up(cls, sdk_handle, log_port): assert rc == SXD_STATUS_SUCCESS, "sx_api_port_state_get failed, rc = %d" % rc admin_state = sx_port_admin_state_t_p_value(admin_state_p) + oper_state = sx_port_oper_state_t_p_value(oper_state_p) delete_sx_port_oper_state_t_p(oper_state_p) delete_sx_port_admin_state_t_p(admin_state_p) delete_sx_port_module_state_t_p(module_state_p) - return admin_state == SX_PORT_ADMIN_STATUS_UP + return oper_state, admin_state + + + @classmethod + def is_port_admin_status_up(cls, sdk_handle, log_port): + _, admin_state = cls._fetch_port_status(sdk_handle, log_port); + admin_state == SX_PORT_ADMIN_STATUS_UP @classmethod @@ -663,27 +709,6 @@ def is_replaceable(self): """ return True - def _get_error_code(self): - """ - Get error code of the SFP module - - Returns: - The error code fetch from SDK API - """ - module_id_info_list = new_sx_mgmt_module_id_info_t_arr(1) - module_info_list = new_sx_mgmt_phy_module_info_t_arr(1) - - module_id_info = sx_mgmt_module_id_info_t() - module_id_info.slot_id = 0 - module_id_info.module_id = self.sdk_index - sx_mgmt_module_id_info_t_arr_setitem(module_id_info_list, 0, module_id_info) - - rc = sx_mgmt_phy_module_info_get(self.sdk_handle, module_id_info_list, 1, module_info_list) - assert SX_STATUS_SUCCESS == rc, "sx_mgmt_phy_module_info_get failed, error code {}".format(rc) - - mod_info = sx_mgmt_phy_module_info_t_arr_getitem(module_info_list, 0) - return mod_info.module_state.oper_state, mod_info.module_state.error_type - @classmethod def _get_error_description_dict(cls): return {0: cls.SFP_ERROR_DESCRIPTION_POWER_BUDGET_EXCEEDED, @@ -704,12 +729,12 @@ def get_error_description(self): Get error description Args: - error_code: The error code returned by _get_error_code + error_code: The error code returned by _get_module_info Returns: The error description """ - oper_status, error_code = self._get_error_code() + oper_status, error_code = self._get_module_info(self.sdk_handle, self.sdk_index) if oper_status == SX_PORT_MODULE_STATUS_INITIALIZING: error_description = self.SFP_STATUS_INITIALIZING elif oper_status == SX_PORT_MODULE_STATUS_PLUGGED: @@ -727,3 +752,271 @@ def get_error_description(self): else: error_description = "Unknow SFP module status ({})".format(oper_status) return error_description + + +class RJ45Port(NvidiaSFPCommon): + """class derived from SFP, representing RJ45 ports""" + + def __init__(self, sfp_index): + super(RJ45Port, self).__init__(sfp_index) + self.sfp_type = RJ45_TYPE + + @classmethod + def _get_presence(cls, sdk_handle, sdk_index): + """Class level method to get low power mode. + + Args: + sdk_handle: SDK handle + sdk_index (integer): SDK port index + slot_id (integer): Slot ID + + Returns: + [boolean]: True if low power mode is on else off + """ + oper_status, _ = cls._get_module_info(sdk_handle, sdk_index) + return print(oper_status == SX_PORT_MODULE_STATUS_PLUGGED) + + def get_presence(self): + """ + Retrieves the presence of the device + For RJ45 ports, it always return True + + Returns: + bool: True if device is present, False if not + """ + if utils.is_host(): + # To avoid performance issue, + # call class level method to avoid initialize the whole sonic platform API + get_presence_code = 'from sonic_platform import sfp;\n' \ + 'with sfp.SdkHandleContext() as sdk_handle:' \ + 'print(sfp.RJ45Port._get_presence(sdk_handle, {}))'.format(self.sdk_index) + presence_cmd = "docker exec pmon python3 -c \"{}\"".format(get_presence_code) + try: + output = subprocess.check_output(presence_cmd, shell=True, universal_newlines=True) + return 'True' in output + except subprocess.CalledProcessError as e: + print("Error! Unable to get presence for {}, rc = {}, err msg: {}".format(self.sdk_index, e.returncode, e.output)) + return False + else: + oper_status, _ = self._get_module_info(self.sdk_handle, self.sdk_index); + return (oper_status == SX_PORT_MODULE_STATUS_PLUGGED) + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this port. + For RJ45, all fields are N/A + + Returns: + A dict which contains following keys/values : + ================================================================================ + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + vendor_rev |1*255VCHAR |vendor revision of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + application_advertisement |1*255VCHAR |supported applications advertisement + ================================================================================ + """ + transceiver_info_keys = ['manufacturer', + 'model', + 'vendor_rev', + 'serial', + 'vendor_oui', + 'vendor_date', + 'connector', + 'encoding', + 'ext_identifier', + 'ext_rateselect_compliance', + 'cable_type', + 'cable_length', + 'specification_compliance', + 'nominal_bit_rate', + 'application_advertisement'] + transceiver_info_dict = dict.fromkeys(transceiver_info_keys, 'N/A') + transceiver_info_dict['type'] = self.sfp_type + + return transceiver_info_dict + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + return False + + def reset(self): + """ + Reset SFP and return all user module settings to their default state. + + Returns: + A boolean, True if successful, False if not + + refer plugins/sfpreset.py + """ + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + return False + + def get_error_description(self): + """ + Get error description + + Args: + error_code: Always false on SN2201 + + Returns: + The error description + """ + return False + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = {} + + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'rx5power', 'rx6power', + 'rx7power', 'rx8power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx5bias', 'tx6bias', + 'tx7bias', 'tx8bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power', + 'tx5power', 'tx6power', + 'tx7power', 'tx8power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + return transceiver_dom_info_dict + + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = {} + + dom_info_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning' + ] + transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + + Returns: + A Boolean, True if reset enabled, False if disabled + + for QSFP, originally I would like to make use of Initialization complete flag bit + which is at Page a0 offset 6 bit 0 to test whether reset is complete. + However as unit testing was carried out I find this approach may fail because: + 1. we make use of ethtool to read data on I2C bus rather than to read directly + 2. ethtool is unable to access I2C during QSFP module being reset + In other words, whenever the flag is able to be retrived, the value is always be 1 + As a result, it doesn't make sense to retrieve that flag. Just treat successfully + retrieving data as "data ready". + for SFP it seems that there is not flag indicating whether reset succeed. However, + we can also do it in the way for QSFP. + """ + return False + + def read_eeprom(self, offset, num_bytes): + return None + + def reinit(self): + """ + Nothing to do for RJ45. Just provide it to avoid exception + :return: + """ + return diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py index 4749a6fbe710..eec88e1786df 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py @@ -50,6 +50,7 @@ class MockSxFd(object): SDK_SFP_STATE_OUT = 0x2 SDK_SFP_STATE_ERR = 0x3 SDK_SFP_STATE_DIS = 0x4 +SDK_SFP_STATE_UNKNOWN = 0x5 # SFP status used in this file only, will not expose to XCVRD # STATUS_ERROR will be mapped to different status according to the error code @@ -134,13 +135,17 @@ class sfp_event: SX_OPEN_TIMEOUT = 5 SELECT_TIMEOUT = 1 - def __init__(self): + def __init__(self, rj45_port_list=None): self.swid = 0 self.handle = None # Allocate SDK fd and user channel structures self.rx_fd_p = new_sx_fd_t_p() self.user_channel_p = new_sx_user_channel_t_p() + if rj45_port_list: + self.RJ45_port_set = set(rj45_port_list) + else: + self.RJ45_port_set = set() def initialize(self): swid_cnt_p = None @@ -340,6 +345,7 @@ def on_pmpe(self, fd_p): status = False else: status = True + unknown = False pmpe_t = recv_info_p.event_info.pmpe port_list_size = pmpe_t.list_size logical_port_list = pmpe_t.log_port_list @@ -354,8 +360,11 @@ def on_pmpe(self, fd_p): logger.log_info("Receive PMPE disable event on module {}: status {}".format(module_id, module_state)) elif module_state == SDK_SFP_STATE_IN or module_state == SDK_SFP_STATE_OUT: logger.log_info("Receive PMPE plug in/out event on module {}: status {}".format(module_id, module_state)) + elif module_state == SDK_SFP_STATE_UNKNOWN: + unknown = True else: logger.log_error("Receive PMPE unknown event on module {}: status {}".format(module_id, module_state)) + for i in range(port_list_size): logical_port = sx_port_log_id_t_arr_getitem(logical_port_list, i) rc = sx_api_port_device_get(self.handle, 1 , 0, port_attributes_list, port_cnt_p) @@ -369,6 +378,14 @@ def on_pmpe(self, fd_p): if label_port is not None: label_port_list.append(label_port) + if unknown: + SFP_ports_with_unknown_event = set(label_port_list) - self.RJ45_port_set + if SFP_ports_with_unknown_event: + logger.log_error("Receive PMPE unknown event on module {}: status {}".format(module_id, module_state)) + else: + # For RJ45 ports, we treat unknown as disconnect + module_state = SDK_SFP_STATE_DIS + delete_uint32_t_p(pkt_size_p) delete_uint8_t_arr(pkt) delete_sx_receive_info_t_p(recv_info_p) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py index 22ef4bb1f27d..b35ef313dfcd 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py @@ -16,8 +16,18 @@ # import functools import subprocess +import json +import sys +import os +from sonic_py_common import device_info from sonic_py_common.logger import Logger +HWSKU_JSON = 'hwsku.json' + +PORT_INDEX_KEY = "index" +PORT_TYPE_KEY = "port_type" +RJ45_PORT_TYPE = "RJ45" + logger = Logger() @@ -206,4 +216,51 @@ def run_command(command): process = subprocess.Popen(command, shell=True, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return process.communicate()[0].strip() except Exception: - return None \ No newline at end of file + return None + + +def load_json_file(filename, log_func=logger.log_error): + # load 'platform.json' or 'hwsku.json' file + data = None + try: + with open(filename) as fp: + try: + data = json.load(fp) + except json.JSONDecodeError: + if log_func: + log_func("failed to decode Json file.") + return data + except Exception as e: + if log_func: + log_func("error occurred while parsing json file: {}".format(sys.exc_info()[1])) + return None + + +def extract_RJ45_ports_index(): + # Cross check 'platform.json' and 'hwsku.json' to extract the RJ45 port index if exists. + hwsku_path = device_info.get_path_to_hwsku_dir() + platform_file = device_info.get_path_to_port_config_file() + platform_dict = load_json_file(platform_file)['interfaces'] + hwsku_file = os.path.join(hwsku_path, HWSKU_JSON) + hwsku_dict = load_json_file(hwsku_file)['interfaces'] + port_name_to_index_map_dict = {} + RJ45_port_index_list = [] + + # Compose a interface name to index mapping from 'platform.json' + for i, (key, value) in enumerate(platform_dict.items()): + if PORT_INDEX_KEY in value: + index_raw = value[PORT_INDEX_KEY] + # The index could be "1" or "1, 1, 1, 1" + index = index_raw.split(',')[0] + port_name_to_index_map_dict[key] = index + + if not bool(port_name_to_index_map_dict): + return None + + # Check if "port_type" specified as "RJ45", if yes, add the port index to the list. + for i, (key, value) in enumerate(hwsku_dict.items()): + if key in port_name_to_index_map_dict and PORT_TYPE_KEY in value and value[PORT_TYPE_KEY] == RJ45_PORT_TYPE: + RJ45_port_index_list.append(int(port_name_to_index_map_dict[key])-1) + + return RJ45_port_index_list if bool(RJ45_port_index_list) else None + diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index a7eff5b08625..7b153813460b 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -28,9 +28,11 @@ modules_path = os.path.dirname(test_path) sys.path.insert(0, modules_path) +import sonic_platform.chassis from sonic_platform.chassis import Chassis from sonic_platform.device_data import DeviceDataManager +sonic_platform.chassis.extract_RJ45_ports_index = mock.MagicMock(return_value=[]) class TestChassis: """Test class to test chassis.py. The test cases covers: diff --git a/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py b/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py index 2797d62a70f3..5f0a30dbf519 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py @@ -30,11 +30,11 @@ from sonic_platform.chassis import Chassis from sonic_platform.eeprom import Eeprom, EepromContentVisitor - class TestEeprom: @patch('os.path.exists', MagicMock(return_value=True)) @patch('os.path.islink', MagicMock(return_value=True)) @patch('sonic_platform.eeprom.Eeprom.get_system_eeprom_info') + @patch('sonic_platform.chassis.extract_RJ45_ports_index', MagicMock(return_value=[])) def test_chassis_eeprom(self, mock_eeprom_info): mock_eeprom_info.return_value = { hex(Eeprom._TLV_CODE_PRODUCT_NAME): 'MSN3420', @@ -102,7 +102,3 @@ def test_eeprom_content_visitor(self): v.visit_tlv('tlv3', Eeprom._TLV_CODE_VENDOR_EXT, 4, 'ext2') assert content[hex(Eeprom._TLV_CODE_PRODUCT_NAME)] == 'MSN3420' assert content[hex(Eeprom._TLV_CODE_VENDOR_EXT)] == ['ext1', 'ext2'] - - - - diff --git a/platform/mellanox/mlnx-platform-api/tests/test_led.py b/platform/mellanox/mlnx-platform-api/tests/test_led.py index 7a9ebaf056a5..1544ae35fb70 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_led.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_led.py @@ -35,6 +35,7 @@ class TestLed: @mock.patch('sonic_platform.led.Led._wait_files_ready', mock.MagicMock(return_value=True)) + @mock.patch('sonic_platform.chassis.extract_RJ45_ports_index', mock.MagicMock(return_value=True)) def test_chassis_led(self): chassis = Chassis() assert chassis._led is None diff --git a/platform/mellanox/mlnx-platform-api/tests/test_module.py b/platform/mellanox/mlnx-platform-api/tests/test_module.py index 8213aa5a986a..4cba90ac95f4 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_module.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_module.py @@ -26,6 +26,7 @@ modules_path = os.path.dirname(test_path) sys.path.insert(0, modules_path) +import sonic_platform.chassis from sonic_platform import utils from sonic_platform.chassis import ModularChassis from sonic_platform.device_data import DeviceDataManager @@ -37,6 +38,7 @@ class TestModule: def setup_class(cls): DeviceDataManager.get_linecard_sfp_count = mock.MagicMock(return_value=2) DeviceDataManager.get_linecard_count = mock.MagicMock(return_value=2) + sonic_platform.chassis.extract_RJ45_ports_index = mock.MagicMock(return_value=[]) def test_chassis_get_num_sfp(self): chassis = ModularChassis() diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index dcb3953ded88..b932856fa38c 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -53,8 +53,10 @@ def test_sfp_index(self, mock_max_port): assert sfp.index == 5 @mock.patch('sonic_platform.sfp.SFP.read_eeprom', mock.MagicMock(return_value=None)) - @mock.patch('sonic_platform.sfp.SFP._get_error_code') + @mock.patch('sonic_platform.sfp.SFP.shared_sdk_handle', mock.MagicMock(return_value=2)) + @mock.patch('sonic_platform.sfp.SFP._get_module_info') @mock.patch('sonic_platform.chassis.Chassis.get_num_sfps', mock.MagicMock(return_value=2)) + @mock.patch('sonic_platform.chassis.extract_RJ45_ports_index', mock.MagicMock(return_value=[])) def test_sfp_get_error_status(self, mock_get_error_code): chassis = Chassis() diff --git a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py index 9c1526479a9b..a7fdc4d0bafe 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_thermal.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_thermal.py @@ -28,9 +28,11 @@ modules_path = os.path.dirname(test_path) sys.path.insert(0, modules_path) +import sonic_platform.chassis from sonic_platform.chassis import Chassis from sonic_platform.device_data import DeviceDataManager +sonic_platform.chassis.extract_RJ45_ports_index = mock.MagicMock(return_value=[]) class TestThermal: @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) @@ -334,4 +336,4 @@ def test_get_cooling_level(self, mock_read_file): mock_read_file.side_effect = ValueError('') with pytest.raises(RuntimeError): - Thermal.get_cooling_level() \ No newline at end of file + Thermal.get_cooling_level() diff --git a/platform/mellanox/mlnx-ssd-fw-update.sh b/platform/mellanox/mlnx-ssd-fw-update.sh index 07ec9ce103ea..819f02ddd3a8 100755 --- a/platform/mellanox/mlnx-ssd-fw-update.sh +++ b/platform/mellanox/mlnx-ssd-fw-update.sh @@ -21,9 +21,8 @@ #= Global variable # #= #===== -VERSION="1.5" +VERSION="1.6" #===== -SWITCH_SSD_DEV="/dev/sda" UTIL_TITLE="This is MLNX SSD firmware update utility to read and write SSD FW. Version ${VERSION}" DEPENDECIES=("smartctl" "sha256sum" "tar" "/bin/bash" "gpg" "sed" "realpath" "dirname") TRUE="0" @@ -37,6 +36,7 @@ DEBUG_MSG="DEBUG" # remove all instance after script is ready. #===== PKG_EXTRACTED=$FALSE LOGGER_UTIL=$FALSE +SSD_DEV_NAME="" SSD_FW_VER="" SSD_DEVICE_MODEL="" SSD_SERIAL="" @@ -230,7 +230,7 @@ function get_ssd_fw_version() { [ $1 ] || { LOG_MSG_AND_EXIT "Wrong usage - ${FUNCNAME[0]}()"; } local device_fw_version - device_fw_version=$(smartctl -i $SWITCH_SSD_DEV | grep -Po "Firmware Version: +\K[^,]+") + device_fw_version=$(smartctl -i $SSD_DEV_NAME | grep -Po "Firmware Version: +\K[^,]+") LOG_MSG "device_fw_version: $device_fw_version" ${DEBUG_MSG} eval $1='$device_fw_version' } @@ -242,7 +242,7 @@ function get_ssd_device_model() { [ $1 ] || { LOG_MSG_AND_EXIT "Wrong usage - ${FUNCNAME[0]}()"; } local device_model_name - device_model_name=$(smartctl -i $SWITCH_SSD_DEV | grep -Po "Device Model: +\K[^,]+") + device_model_name=$(smartctl -i $SSD_DEV_NAME | grep -E "Device Model:|Model Number:" | awk '{$1=$2="";print $0}'| sed 's/^ *//g') LOG_MSG "device_model_name: $device_model_name" ${DEBUG_MSG} eval $1='$device_model_name' } @@ -254,7 +254,7 @@ function get_ssd_size() { [ $1 ] || { LOG_MSG_AND_EXIT "Wrong usage - ${FUNCNAME[0]}()"; } local device_size - device_size=$(smartctl -i $SWITCH_SSD_DEV | grep -Po "User Capacity:.+bytes \[\K[^ ]+") + device_size=$(smartctl -i $SSD_DEV_NAME | grep -E "User Capacity:|Size/Capacity" | awk -F '\[|\]' '{print $2}' | awk '{print $1}') LOG_MSG "device_size: $device_size" ${DEBUG_MSG} eval $1='$device_size' } @@ -266,16 +266,56 @@ function get_ssd_serial() { [ $1 ] || { LOG_MSG_AND_EXIT "Wrong usage - ${FUNCNAME[0]}()"; } local device_serial - device_serial=$(smartctl -i $SWITCH_SSD_DEV | grep -Po "Serial Number: +\K[^,]+") + device_serial=$(smartctl -i $SSD_DEV_NAME | grep -Po "Serial Number: +\K[^,]+") LOG_MSG "device_serial: $device_serial" ${DEBUG_MSG} eval $1='$device_serial' } #==============================================================================# -#= This function check if given argument is valid and return boolean result. # +# This function check SSD device name # +# +function get_ssd_device_name() { + [ $1 ] || { LOG_MSG_AND_EXIT "Wrong usage - ${FUNCNAME[0]}()"; } + + non_rem_mount_disks="" + non_rem_mount_disks_count=0 + mount_parts=$(cat /proc/partitions | grep -v "^major" | grep -v ram | awk '{{print $4}}') + for blk_dev_name in ${mount_parts} + do + blk_dev_link=$(find /sys/bus /sys/class /sys/block/ -name ${blk_dev_name}) + for first_blk_dev_link in ${blk_dev_link} + do + if ls -l ${first_blk_dev_link} | grep -q virtual; then + continue + fi + if [ -e ${first_blk_dev_link}/removable ] ; then + if [ "0" = $(cat ${first_blk_dev_link}/removable) ] ; then + let non_rem_mount_disks_count=${non_rem_mount_disks_count}+1 + if [ "1" == "${non_rem_mount_disks_count}" ] ; then + non_rem_mount_disks="${blk_dev_name}" + else + non_rem_mount_disks="${non_rem_mount_disks} ${blk_dev_name}" + fi + fi + fi + break + done + done + if [ "1" == "${non_rem_mount_disks_count}" ] ; then + device_name="/dev/${non_rem_mount_disks}" + else + $1="/dev/sda" + fi + LOG_MSG "device_name: $device_name" ${DEBUG_MSG} + eval $1='$device_name' +} + +#==============================================================================# +#= This function check if given argument. # #= function get_ssd_info() { LOG_MSG "func: ${FUNCNAME[0]}()" ${DEBUG_MSG} + get_ssd_device_name SSD_DEV_NAME get_ssd_fw_version SSD_FW_VER get_ssd_device_model SSD_DEVICE_MODEL get_ssd_serial SSD_SERIAL From fdef1f03420aad830e83770dbf6108c80f465571 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 21 Jun 2022 13:03:55 +0800 Subject: [PATCH 443/817] [Build]: Support to use symbol links for lazy installation targets to reduce the image size (#10923) Why I did it Support to use symbol links in platform folder to reduce the image size. The current solution is to copy each lazy installation targets (xxx.deb files) to each of the folders in the platform folder. The size will keep growing when more and more packages added in the platform folder. For cisco-8000 as an example, the size will be up to 2G, while most of them are duplicate packages in the platform folder. How I did it Create a new folder in platform/common, all the deb packages are copied to the folder, any other folders where use the packages are the symbol links to the common folder. Why platform.tar? We have implemented a patch for it, see #10775, but the problem is the the onie use really old unzip version, cannot support the symbol links. The current solution is similar to the PR 10775, but make the platform folder into a tar package, which can be supported by onie. During the installation, the package.tar will be extracted to the original folder and removed. --- build_debian.sh | 2 +- files/Aboot/boot0.j2 | 7 ++++++- files/build_templates/sonic_debian_extension.j2 | 4 +++- installer/arm64/install.sh | 6 ++++-- installer/armhf/install.sh | 6 ++++-- installer/x86_64/install.sh | 7 +++++-- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index dbf39949c329..a4c1fddca1b8 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -647,5 +647,5 @@ fi pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd ## Compress together with /boot, /var/lib/docker and $PLATFORM_DIR as an installer payload zip file -pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd +pushd $FILESYSTEM_ROOT && sudo tar czf platform.tar.gz -C $PLATFORM_DIR . && sudo zip -n .gz $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ platform.tar.gz; popd sudo zip -g -n .squashfs:.gz $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 2638df932940..4998fea98fc7 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -348,7 +348,12 @@ extract_image() { info "Extracting swi content" ## Unzip the image except boot0 and dockerfs archive - unzip -oq "$swipath" -x boot0 "$dockerfs" -d "$image_path" + unzip -oq "$swipath" -x boot0 "$dockerfs" "platform.tar.gz" -d "$image_path" + + ## Extract the platform.tar.gz + info "Extracting platform.tar.gz" + mkdir -p "$image_path/platform" + unzip -oqp "$swipath" "platform.tar.gz" | tar xzf - -C "$image_path/platform" $TAR_EXTRA_OPTION ## detect rootfs type local mountstr="$(grep " $target_path " /proc/mounts)" diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index fc66c74f8655..760ef2ebc422 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -614,7 +614,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT depmod -a {{kversion}} sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f --download-only sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}} -sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ +sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/common +sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/common/ +sudo ln -sf "../common/{{ debfilename }}" "$FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/{{ debfilename }}" for f in $(find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"); do sudo mv $f $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ done diff --git a/installer/arm64/install.sh b/installer/arm64/install.sh index 445b2007faeb..54ce1dda934e 100755 --- a/installer/arm64/install.sh +++ b/installer/arm64/install.sh @@ -155,9 +155,9 @@ fi # Decompress the file for the file system directly to the partition if [ x"$docker_inram" = x"on" ]; then # when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd - unzip -o $ONIE_INSTALLER_PAYLOAD -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "platform.tar.gz" -d $demo_mnt/$image_dir else - unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $demo_mnt/$image_dir if [ "$install_env" = "onie" ]; then TAR_EXTRA_OPTION="--numeric-owner" @@ -168,6 +168,8 @@ else unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR fi +mkdir -p $demo_mnt/$image_dir/platform +unzip -op $ONIE_INSTALLER_PAYLOAD "platform.tar.gz" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/platform if [ "$install_env" = "onie" ]; then # Store machine description in target file system diff --git a/installer/armhf/install.sh b/installer/armhf/install.sh index 0dd6e48a08e7..4ced27f48fa6 100755 --- a/installer/armhf/install.sh +++ b/installer/armhf/install.sh @@ -155,9 +155,9 @@ fi # Decompress the file for the file system directly to the partition if [ x"$docker_inram" = x"on" ]; then # when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd - unzip -o $ONIE_INSTALLER_PAYLOAD -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "platform.tar.gz" -d $demo_mnt/$image_dir else - unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $demo_mnt/$image_dir if [ "$install_env" = "onie" ]; then TAR_EXTRA_OPTION="--numeric-owner" @@ -168,6 +168,8 @@ else unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR fi +mkdir -p $demo_mnt/$image_dir/platform +unzip -op $ONIE_INSTALLER_PAYLOAD "platform.tar.gz" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/platform if [ "$install_env" = "onie" ]; then # Store machine description in target file system diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index f41a671543e8..926c54683a9e 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -536,9 +536,9 @@ fi # Decompress the file for the file system directly to the partition if [ x"$docker_inram" = x"on" ]; then # when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd - unzip -o $ONIE_INSTALLER_PAYLOAD -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "platform.tar.gz" -d $demo_mnt/$image_dir else - unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" -d $demo_mnt/$image_dir + unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $demo_mnt/$image_dir if [ "$install_env" = "onie" ]; then TAR_EXTRA_OPTION="--numeric-owner" @@ -549,6 +549,9 @@ else unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR fi +mkdir -p $demo_mnt/$image_dir/platform +unzip -op $ONIE_INSTALLER_PAYLOAD "platform.tar.gz" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/platform + if [ "$install_env" = "onie" ]; then # Store machine description in target file system if [ -f /etc/machine-build.conf ]; then From 0ae4903ef9c659de8e587880a664ac086640c477 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Tue, 21 Jun 2022 15:47:06 +0800 Subject: [PATCH 444/817] [azurepipeline]: Add t0-sonic pool back to Azp checker (#11181) Why I did it The t0-sonic pool has been fixed, so add it back to azp checker. How I did it Remove continueOnError in run-test-template.yml. Signed-off-by: Ze Gan --- .azure-pipelines/run-test-template.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index 7d3a6c8dd612..2a75d1bc32dc 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -51,8 +51,6 @@ steps: rm -rf $(Build.ArtifactStagingDirectory)/* docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }} ${{ parameters.section }}" displayName: "Run tests" - ${{ if eq(parameters.tbtype, 't0-sonic') }}: - continueOnError: true - script: | # save dut state if test fails From 90a849ea85fd3b95b2d59511e3121227a19c6b5e Mon Sep 17 00:00:00 2001 From: geogchen <106694330+geogchen@users.noreply.github.com> Date: Tue, 21 Jun 2022 10:16:10 -0700 Subject: [PATCH 445/817] Add support for generating interface configuration in /etc/network/interfaces for multiple management interfaces (#11204) * [Interfaces] Modify template to support multiple management interfaces * Modify minigraph to process interfaces in sorted order Signed-off-by: Ubuntu * Add UT minigraph Signed-off-by: Ubuntu * make case insensitve comparison Signed-off-by: George Chen * Use natural sort Signed-off-by: George Chen Co-authored-by: Ubuntu --- files/image_config/interfaces/interfaces.j2 | 30 +- src/sonic-config-engine/minigraph.py | 4 +- .../sample_output/py2/two_mgmt_interfaces | 76 ++ .../sample_output/py3/two_mgmt_interfaces | 76 ++ .../tests/t0-sample-graph-two-mgmt.xml | 953 ++++++++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 5 + 6 files changed, 1132 insertions(+), 12 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces create mode 100644 src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces create mode 100644 src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 1e554e4ed716..f308527856cd 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -30,19 +30,27 @@ iface lo inet loopback {% block mgmt_interface %} # The management network interface -auto eth0 +{% if MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE|pfx_filter|unique(attribute=0) %} +auto {{ name }} +{% endfor %} +{% endif %} {% if (ZTP_DHCP_DISABLED is not defined) and (ZTP is defined) and (ZTP['mode'] is defined and ZTP['mode']['profile'] == 'active') %} # ZTP out-of-band interface -allow-hotplug eth0 +{% if MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE|pfx_filter|unique(attribute=0) %} +allow-hotplug {{ name }} {% if ZTP['mode']['ipv4'] == 'true' %} -iface eth0 inet dhcp +iface {{ name }} inet dhcp {% endif %} {% if ZTP['mode']['ipv6'] == 'true' %} -iface eth0 inet6 dhcp - up sysctl net.ipv6.conf.eth0.accept_ra=1 - down sysctl net.ipv6.conf.eth0.accept_ra=0 +iface {{ name }} inet6 dhcp + up sysctl net.ipv6.conf.{{ name }}.accept_ra=1 + down sysctl net.ipv6.conf.{{ name }}.accept_ra=0 +{% endif %} +{% endfor %} {% endif %} {% if ZTP['mode']['inband'] == 'true' %} @@ -65,7 +73,7 @@ iface {{ port }} inet6 dhcp {% else %} {% if MGMT_INTERFACE %} {% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} -iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static +iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} network {{ prefix | network }} @@ -77,15 +85,15 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static {% endif %} ########## management network policy routing rules # management port up rules - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} metric 201 - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} metric 201 + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} up ip {{ '-4' if prefix | ipv4 else '-6' }} rule add pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} up ip rule add pref 32764 to {{ route }} table {{ vrf_table }} {% endfor %} # management port down rules - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} rule delete pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} pre-down ip rule delete pref 32764 to {{ route }} table {{ vrf_table }} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index b1ad117d255c..5a044c8f9ea3 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -10,6 +10,7 @@ from lxml import etree as ET from lxml.etree import QName +from natsort import natsorted from portconfig import get_port_config from sonic_py_common.interface import backplane_prefix @@ -1432,7 +1433,8 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['MGMT_INTERFACE'] = {} mgmt_intf_count = 0 mgmt_alias_reverse_mapping = {} - for key in mgmt_intf: + sorted_keys = natsorted(mgmt_intf.keys(), key=lambda x : x[0].lower()) + for key in sorted_keys: alias = key[0] if alias in mgmt_alias_reverse_mapping: name = mgmt_alias_reverse_mapping[alias] diff --git a/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces new file mode 100644 index 000000000000..12136a316acb --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces @@ -0,0 +1,76 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth1 +auto eth0 +iface eth1 inet static + address 10.0.10.100 + netmask 255.255.255.0 + network 10.0.10.0 + broadcast 10.0.10.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 + up ip -4 route add 10.0.10.0/24 dev eth1 table default + up ip -4 rule add pref 32765 from 10.0.10.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default + pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default + pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default +iface eth0 inet static + address 10.0.0.100 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 + up ip -4 route add 10.0.0.0/24 dev eth0 table default + up ip -4 rule add pref 32765 from 10.0.0.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default + pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default + pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default +iface eth1 inet6 static + address 2603:10e2:0:abcd::8 + netmask 64 + network 2603:10e2:0:abcd:: + broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 + up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default + pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default +iface eth0 inet6 static + address 2603:10e2:0:2902::8 + netmask 64 + network 2603:10e2:0:2902:: + broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 + up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces new file mode 100644 index 000000000000..7fa99896e8c2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces @@ -0,0 +1,76 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +auto eth1 +iface eth0 inet static + address 10.0.0.100 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 + up ip -4 route add 10.0.0.0/24 dev eth0 table default + up ip -4 rule add pref 32765 from 10.0.0.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default + pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default + pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default +iface eth0 inet6 static + address 2603:10e2:0:2902::8 + netmask 64 + network 2603:10e2:0:2902:: + broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 + up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default +iface eth1 inet static + address 10.0.10.100 + netmask 255.255.255.0 + network 10.0.10.0 + broadcast 10.0.10.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 + up ip -4 route add 10.0.10.0/24 dev eth1 table default + up ip -4 rule add pref 32765 from 10.0.10.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default + pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default + pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default +iface eth1 inet6 static + address 2603:10e2:0:abcd::8 + netmask 64 + network 2603:10e2:0:abcd:: + broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 + up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default + pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml b/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml new file mode 100644 index 000000000000..da1b56fe1309 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml @@ -0,0 +1,953 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 1 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
+ + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + LoopbackIP1 + Loopback1 + + 10.10.0.99/32 + + 10.10.0.99/32 + + + LoopbackIP2 + Loopback2 + + 10.21.0.64/32 + + 10.21.0.64/32 + + + LoopbackIP3 + Loopback3 + + 10.21.64.2/32 + + 10.21.64.2/32 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + HostIP + eth0 + + 2603:10e2:0:2902::8/64 + + 2603:10e2:0:2902::8/64 + + + HostIP1 + eth1 + + 10.0.10.100/24 + + 10.0.10.100/24 + + + HostIP1 + eth1 + + 2603:10e2:0:abcd::8/64 + + 2603:10e2:0:abcd::8/64 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + + + + + Vlan2000 + fortyGigE0/112;fortyGigE0/116;fortyGigE0/120 + False + 0.0.0.0/0 + + + + 2000 + 2000 + 192.168.200.0/27 + + + + + Vlan99 + fortyGigE0/100 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 99 + 99 + + + + + + Vlan98 + fortyGigE0/100;PortChannel01;PortChannel03 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 98 + 98 + + + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + Vlan2000 + 192.168.200.1/27 + + + + + + ERSPAN + everflow + Everflow + + + ERSPANv6 + everflowV6 + Everflow + + + EGRESS_ERSPAN + everflow_egress + Everflow + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAclIngress + DataPlane + + + PortChannel01;PortChannel02;Vlan98 + DataAclEgress + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + NTP + NTP_ACL + NTP + + + SSH + SSH_ACL + SSH + + + SSH + ROUTER-PROTECT + SSH + + + SNMP + ROUTER-PROTECT + SNMP + + + NTP + NTP_ACL + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + 100000 + + + DeviceInterfaceLink + 100000 + switch-t0 + fortyGigE0/4 + true + ARISTA05T1 + Ethernet1/33 + true + + + DeviceInterfaceLink + Servers0 + eth0 + switch-t0 + fortyGigE0/4 + + + DeviceInterfaceLink + Servers100 + eth0 + switch-t0 + fortyGigE0/100 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + + + + + + + AutoNegotiation + + True + + + FECDisabled + + True + + + ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + False + + + FECDisabled + + True + + + ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index a82e108f6871..fc8eb3fb024c 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -14,6 +14,7 @@ def setUp(self): self.simple_minigraph = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.t0_mvrf_minigraph = os.path.join(self.test_dir, 't0-sample-graph-mvrf.xml') + self.t0_two_mgmt_minigraph = os.path.join(self.test_dir, 't0-sample-graph-two-mgmt.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') self.l1_l3_port_config = os.path.join(self.test_dir, 'l1-l3-sample-port-config.ini') @@ -92,6 +93,10 @@ def test_interfaces(self): self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) + argument = '-m ' + self.t0_two_mgmt_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'two_mgmt_interfaces'), self.output_file), self.output_file) + def test_ports_json(self): ports_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ports.json.j2') argument = '-m ' + self.simple_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ports_template + ' > ' + self.output_file From 9452095e250865d8bf3821c27615064c54d3cbab Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Tue, 21 Jun 2022 17:11:41 -0700 Subject: [PATCH 446/817] [lldp]Fix lldp spawned after reboot when disabled (#11080) - Why I did it When LLDP is disabled through feature command, it gets spawned after reboot. - How I did it In syncd.sh check if the service is enabled before spawning automatically during cold reboot. - How to verify it Disable lldp feature. Perform cold reboot and verify its not spawned. --- files/scripts/syncd.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 065574e501bf..10535a8ff448 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -63,9 +63,13 @@ function waitplatform() { if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then debug "LLDP service is delayed by a timer for better fast/warm boot performance" else - debug "Starting lldp service..." - /bin/systemctl start lldp - debug "Started lldp service" + lldp_state=$(systemctl is-enabled lldp.timer) + if [[ $lldp_state == "enabled" ]] + then + debug "Starting lldp service..." + /bin/systemctl start lldp + debug "Started lldp service" + fi fi } From c1d0d2e0234a5e8adb921f8978fd3a6760fea967 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Wed, 22 Jun 2022 18:53:26 +0800 Subject: [PATCH 447/817] [sonic-utilities] Advance submodule head (#11177) 05c79ef Fix header for the output table following 'show ipv6 interface' command (#2219) fc5633f increase coverage to 80% (#2214) c0dffba [config][muxcable] fix minor config DB logic issue (#2210) a50eca0 [generic-config-updater] Add NTP validator (#2212) a3d1345 [gendump] Add Support to dump BCM-DNX commands (#1813) bb185d5 [yang] remove mistakenly added parameter for 'get_module_name' (#2193) 2cccf26 [counters] skip showing counters that are not enabled (#2199) ff05bc8 [config][muxcable] Add support for displaying soc_ipv4 and cable_type in config/show muxcable commands (#2189) 3197f39 Add check to not allow deleting PO if its member of vlan. (#2141) 2513da1 [dump] Optimized dump state cli and modified tests to not use common data (#2175) 9e310e5 Fix sonic-installer and 'show version' command crash when database docker not running issue. (#2183) 4ad70b9 [sonic-installer] use host docker startup arguments when running dockerd in chroot (#2179) 3d3c89b fix for non-coherent cmis modules (#2163) 2054680 [subinterface] Fix route add command to accept subinterface as dev (#2180) 5383e92 [subinterface]Avoid removing the subinterface when last configured ip is removed (#2181) f5af780 [GCU] Handling type1 lists (#2171) 4516179 [yang] extend ConfigMgmt constructor to pass YANG options (#2118) 2f53bd4 [dump] implement ACL modules (#2153) 494dd62 show commands for SYSTEM READY (#1851) 4fc09b1 [GCU] Handling non-compliant leaf-list with string values (#2174) 675c7b6 Add sonic-delayed.target to Application Extension .timer file generator (#2176) c587933 [portconfig] Allow to configure interface mtu for physical ports only 9881f3e Broadcast Unknown-multicast and Unknown-unicast Storm-control (#928) 88286cb sonic-utils: initial support for link-training (#2071) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 29503aba7d61..05c79ef0842d 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 29503aba7d610224237371d1d190a2bcbd7aec65 +Subproject commit 05c79ef0842deb93e05e3947c4179cb6e0c486e6 From 31dd0b3bf1ece9886a9f8491d4ac635b510ebb52 Mon Sep 17 00:00:00 2001 From: Long Ou Date: Wed, 22 Jun 2022 23:57:17 +0800 Subject: [PATCH 448/817] [iccpd] Fix missing semicolon. (#11197) The return statement does not end with a semicolon in function scheduler_csm_socket_cleanup, which generates a compilation warning and may cause unexpected problems. Signed-off-by: ouxiaolong --- src/iccpd/src/scheduler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iccpd/src/scheduler.c b/src/iccpd/src/scheduler.c index 865f79b0da6b..fb2c7f5937f0 100644 --- a/src/iccpd/src/scheduler.c +++ b/src/iccpd/src/scheduler.c @@ -871,7 +871,7 @@ void scheduler_csm_socket_cleanup(struct CSM* csm, int location) return; if (csm->sock_fd <= 0) - return + return; event.data.fd = csm->sock_fd; event.events = EPOLLIN; From 11ff80b786db2821b7899c7c05943cc394682b77 Mon Sep 17 00:00:00 2001 From: Prince George <45705344+prgeor@users.noreply.github.com> Date: Wed, 22 Jun 2022 10:14:06 -0700 Subject: [PATCH 449/817] Skip CMIS manager (#10907) * Removed unwanted changes * Fix j2 compilation error * Address review comment * Add newline --- .../docker-platform-monitor/docker-pmon.supervisord.conf.j2 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 index 4a13d76edb0a..d8769097f091 100644 --- a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 +++ b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 @@ -96,9 +96,11 @@ dependent_startup_wait_for=rsyslogd:running {% if not skip_xcvrd %} [program:xcvrd] {% if delay_xcvrd %} -command=bash -c "sleep 30 && {% if API_VERSION == 3 and 'xcvrd' not in python2_daemons %}python3 {% else %} python2 {% endif %}/usr/local/bin/xcvrd" +command={% if skip_xcvrd_cmis_mgr %} bash -c "sleep 30 && python3 /usr/local/bin/xcvrd --skip_cmis_mgr" {% else %} bash -c "sleep 30 && python3 /usr/local/bin/xcvrd" {% endif %} + {% else %} -command={% if API_VERSION == 3 and 'xcvrd' not in python2_daemons %}python3 {% else %} python2 {% endif %}/usr/local/bin/xcvrd +command={% if skip_xcvrd_cmis_mgr %} python3 /usr/local/bin/xcvrd --skip_cmis_mgr {% else %} python3 /usr/local/bin/xcvrd {% endif %} + {% endif %} priority=6 autostart=false From afd3c635611e5b7681da53951eb59a423a79ae92 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Thu, 23 Jun 2022 00:54:14 +0300 Subject: [PATCH 450/817] Change severity of log messages for cases where docker container was stopped during service checker operation (#11188) #### Why I did it There might be a case where service checker periodic operation determined that specific container is running but when it tries to perform an operation on it, it was already closed by the user. This is a valid flow and we should not log an error message, informative warning is enough. #### How I did it I reduce log severity. #### How to verify it I verified it manually. --- src/system-health/health_checker/service_checker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system-health/health_checker/service_checker.py b/src/system-health/health_checker/service_checker.py index 6918da0b9f0e..33eeb4dfb707 100644 --- a/src/system-health/health_checker/service_checker.py +++ b/src/system-health/health_checker/service_checker.py @@ -144,11 +144,11 @@ def fill_critical_process_by_container(self, container): # Get container volumn folder container_folder = self._get_container_folder(container) if not container_folder: - logger.log_error('Failed to get container folder for {}'.format(container_folder)) + logger.log_warning('Could not find MergedDir of container {}, was container stopped?'.format(container)) return if not os.path.exists(container_folder): - logger.log_error('Container folder does not exist: {}'.format(container_folder)) + logger.log_warning('MergedDir {} of container {} not found in filesystem, was container stopped?'.format(container_folder, container)) return # Get critical_processes file path From b8707f7a6ddc54e21ace6c6bab8c0818354e12bd Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Wed, 22 Jun 2022 21:55:17 -0700 Subject: [PATCH 451/817] Updated buffer profile settings for TD3 based HWSKUs (Arista-7050CX3-32S-C32, Arista-7050CX3-32S-D48C8) (#11202) * Updated buffer profile settings for TD3 based HWSKUs (Arista-7050CX3-32S-C32, Arista-7050CX3-32S-D48C8) --- .../Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 | 4 ++-- .../Arista-7050CX3-32S-C32/buffers_defaults_t1.j2 | 4 ++-- .../Arista-7050CX3-32S-C32/pg_profile_lookup.ini | 12 ++++++------ .../Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 | 4 ++-- .../Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini | 12 ++++++------ .../buffer-arista7050cx3-dualtor-remap-disabled.json | 4 ++-- .../py3/buffer-arista7050cx3-dualtor.json | 4 ++-- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 index 1a6187edbddd..d71cdcb265f6 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t0.j2 @@ -30,7 +30,7 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "dynamic_th":"3" + "static_th":"32732160" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", @@ -40,7 +40,7 @@ "egress_lossy_profile": { "pool":"egress_lossy_pool", "size":"1792", - "dynamic_th":"-1" + "dynamic_th":"3" } }, {%- endmacro %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t1.j2 index cb5c8ade6372..eb1dc510e91b 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/buffers_defaults_t1.j2 @@ -30,7 +30,7 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "dynamic_th":"3" + "static_th":"32712448" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", @@ -40,7 +40,7 @@ "egress_lossy_profile": { "pool":"egress_lossy_pool", "size":"1792", - "dynamic_th":"-1" + "dynamic_th":"3" } }, {%- endmacro %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini index e30c3aeae2e0..dd405301f720 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 50000 5m 4608 4608 33792 -3 4608 - 100000 5m 4608 4608 49408 -3 4608 - 50000 40m 4608 4608 36352 -3 4608 - 100000 40m 4608 4608 54528 -3 4608 - 50000 300m 4608 4608 55296 -3 4608 - 100000 300m 4608 4608 92672 -3 4608 + 50000 5m 4608 4608 33792 0 4608 + 100000 5m 4608 4608 49408 0 4608 + 50000 40m 4608 4608 36352 0 4608 + 100000 40m 4608 4608 54528 0 4608 + 50000 300m 4608 4608 55296 0 4608 + 100000 300m 4608 4608 92672 0 4608 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 index bfeb2185623a..57a7fb131466 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/buffers_defaults_t0.j2 @@ -31,7 +31,7 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "dynamic_th":"3" + "static_th":"32689152" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", @@ -41,7 +41,7 @@ "egress_lossy_profile": { "pool":"egress_lossy_pool", "size":"1792", - "dynamic_th":"-1" + "dynamic_th":"3" } }, {%- endmacro %} diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini index 44880400d0f6..8ee7a6714b1e 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 50000 5m 4608 4608 79872 -3 4608 - 100000 5m 4608 4608 54528 -3 4608 - 50000 40m 4608 4608 39936 -3 4608 - 100000 40m 4608 4608 60416 -3 4608 - 50000 300m 4608 4608 61440 -3 4608 - 100000 300m 4608 4608 103680 -3 4608 + 50000 5m 4608 4608 79872 0 4608 + 100000 5m 4608 4608 54528 0 4608 + 50000 40m 4608 4608 39936 0 4608 + 100000 40m 4608 4608 60416 0 4608 + 50000 300m 4608 4608 61440 0 4608 + 100000 300m 4608 4608 103680 0 4608 diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json index 883757d621ad..54e7e8167b45 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor-remap-disabled.json @@ -82,7 +82,7 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "dynamic_th":"3" + "static_th":"32689152" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", @@ -92,7 +92,7 @@ "egress_lossy_profile": { "pool":"egress_lossy_pool", "size":"1792", - "dynamic_th":"-1" + "dynamic_th":"3" } }, "BUFFER_PG": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json index 02c3a0c6e8df..4b55f2bbe82e 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7050cx3-dualtor.json @@ -82,7 +82,7 @@ "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"0", - "dynamic_th":"3" + "static_th":"32689152" }, "egress_lossless_profile": { "pool":"egress_lossless_pool", @@ -92,7 +92,7 @@ "egress_lossy_profile": { "pool":"egress_lossy_pool", "size":"1792", - "dynamic_th":"-1" + "dynamic_th":"3" } }, "BUFFER_PG": { From 699c4e5bbf8985163c14fe698e9485bb6fb76234 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian <63021927+skbarista@users.noreply.github.com> Date: Thu, 23 Jun 2022 08:03:08 -0700 Subject: [PATCH 452/817] [chassis][voq]Update bcm config file system_ref_core_clock_khz param for j2cplus linecards (#11212) Update the bcm config file system_ref_core_clock_khz param to handlesystems with J2cplus linecards. We need system_ref_core_clock_khz to be set to 1600000 for supporting j2 and j2cplus linecards on the same chassis. --- .../Arista-7804R3-FM/0/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/1/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/10/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/11/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/2/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/3/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/4/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/5/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/6/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/7/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/8/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7804R3-FM/9/ramon-a7800-7804r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/0/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/1/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/10/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/11/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/12/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/13/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/14/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/15/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/16/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/17/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/2/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/3/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/4/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/5/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/6/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/7/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/8/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3-FM/9/ramon-a7800-7808r3-fm.config.bcm | 1 + .../Arista-7808R3A-FM/0/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/1/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/10/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/11/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/2/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/3/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/4/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/5/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/6/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/7/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/8/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7808R3A-FM/9/ramon-a7800-7808r3a-fm.config.bcm | 1 + .../Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm | 1 + .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 1 + src/sonic-device-data/tests/permitted_list | 1 + 45 files changed, 45 insertions(+) diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/ramon-a7800-7804r3-fm.config.bcm index e5e17e3b6ae9..5cb0d250f3ab 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/0/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=300 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/ramon-a7800-7804r3-fm.config.bcm index 256a1703954b..c6f3ccc0bfa6 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/1/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=301 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/ramon-a7800-7804r3-fm.config.bcm index 9017f8bfec8f..45df9ea89f42 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/10/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=310 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/ramon-a7800-7804r3-fm.config.bcm index 1cefd991316e..de756a7feb41 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/11/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=311 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/ramon-a7800-7804r3-fm.config.bcm index 2312bc47e2d0..5b9d0fd741ae 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/2/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=302 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/ramon-a7800-7804r3-fm.config.bcm index b8fbf3041af3..871f154a10fc 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/3/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=303 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/ramon-a7800-7804r3-fm.config.bcm index 55772daf4c40..ae10492b703f 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/4/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=304 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/ramon-a7800-7804r3-fm.config.bcm index 5e3505ccacb8..22f1106dff0c 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/5/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=305 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/ramon-a7800-7804r3-fm.config.bcm index 6be28dd404f6..89e7c0cb54af 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/6/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=306 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/ramon-a7800-7804r3-fm.config.bcm index 6c88175d329b..48a685a0b26d 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/7/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=307 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/ramon-a7800-7804r3-fm.config.bcm index c4f8ee04da71..29447d393bcc 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/8/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=308 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/ramon-a7800-7804r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/ramon-a7800-7804r3-fm.config.bcm index 7b93cf10159e..b5bdef729fa6 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/ramon-a7800-7804r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7804R3-FM/9/ramon-a7800-7804r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=309 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/ramon-a7800-7808r3-fm.config.bcm index 470130f1b654..cdb16f58ba2a 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/0/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=300 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/ramon-a7800-7808r3-fm.config.bcm index da6bd74f39c7..2776e67b5813 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/1/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=301 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/ramon-a7800-7808r3-fm.config.bcm index 2d8151106648..bb5036077d8a 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/10/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=310 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/ramon-a7800-7808r3-fm.config.bcm index 6ed6bac4ef83..ce67659354ce 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/11/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=311 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/ramon-a7800-7808r3-fm.config.bcm index 28f304845048..3b6ffba4d1ff 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/12/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=312 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/ramon-a7800-7808r3-fm.config.bcm index 18cd196ce7a4..a49289333d0a 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/13/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=313 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/ramon-a7800-7808r3-fm.config.bcm index e8046fa39a74..acacc0e2a960 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/14/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=314 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/ramon-a7800-7808r3-fm.config.bcm index 381a34753801..4054797541b6 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/15/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=315 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/ramon-a7800-7808r3-fm.config.bcm index f3ca3801d121..b87db6fcd484 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/16/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=316 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/ramon-a7800-7808r3-fm.config.bcm index 35ec8049d7ec..7566a13b3a1c 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/17/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=317 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/ramon-a7800-7808r3-fm.config.bcm index dd03f42dc90e..8eb45b6dec32 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/2/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=302 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/ramon-a7800-7808r3-fm.config.bcm index 8a90ad23c656..40ca2d753f1c 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/3/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=303 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/ramon-a7800-7808r3-fm.config.bcm index 6563663be874..e81c4906a20f 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/4/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=304 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/ramon-a7800-7808r3-fm.config.bcm index 3b063fdc0838..645783d29c25 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/5/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=305 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/ramon-a7800-7808r3-fm.config.bcm index 6363c9a4e5b3..856f607b9f75 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/6/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=306 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/ramon-a7800-7808r3-fm.config.bcm index c8e3d0655565..5d01b2381620 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/7/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=307 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/ramon-a7800-7808r3-fm.config.bcm index f941e2d6c008..d201b4af9444 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/8/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=308 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/ramon-a7800-7808r3-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/ramon-a7800-7808r3-fm.config.bcm index 44911e45d40b..359ea39c227b 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/ramon-a7800-7808r3-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3-FM/9/ramon-a7800-7808r3-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=309 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/ramon-a7800-7808r3a-fm.config.bcm index 05d64a051002..01b653e52a83 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/0/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=300 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/ramon-a7800-7808r3a-fm.config.bcm index da6bd74f39c7..2776e67b5813 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/1/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=301 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/ramon-a7800-7808r3a-fm.config.bcm index ff78061473a1..5467983f8f50 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/10/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=310 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/ramon-a7800-7808r3a-fm.config.bcm index d9b56745a313..066dd04c288e 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/11/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=311 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/ramon-a7800-7808r3a-fm.config.bcm index b8364c931151..ec0d99829a6e 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/2/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=302 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/ramon-a7800-7808r3a-fm.config.bcm index f2b392c4f341..929ab1ab6381 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/3/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=303 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/ramon-a7800-7808r3a-fm.config.bcm index 04f53d298aa2..73bf6dcae666 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/4/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=304 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/ramon-a7800-7808r3a-fm.config.bcm index 05dcb837b81a..332c1b57ba5a 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/5/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=305 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/ramon-a7800-7808r3a-fm.config.bcm index 607772474b13..cd79977d24bf 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/6/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=306 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/ramon-a7800-7808r3a-fm.config.bcm index c8e3d0655565..5d01b2381620 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/7/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=307 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/ramon-a7800-7808r3a-fm.config.bcm index 7c3350573170..7b96a3b05262 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/8/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=308 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/ramon-a7800-7808r3a-fm.config.bcm b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/ramon-a7800-7808r3a-fm.config.bcm index 2d1eed939047..a13ce4c460af 100644 --- a/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/ramon-a7800-7808r3a-fm.config.bcm +++ b/device/arista/x86_64-arista_7800_sup/Arista-7808R3A-FM/9/ramon-a7800-7808r3a-fm.config.bcm @@ -1,4 +1,5 @@ appl_param_module_id=309 +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db port_init_cl72=1 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm index f6f1774d8ee2..f995ec79c769 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm @@ -1,4 +1,5 @@ soc_family.BCM8869X=BCM8869X +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db custom_feature_ucode_path=u_code_db2pem.txt diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm index 8d13e2ca43f3..84da5b8ab7a4 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -1,4 +1,5 @@ soc_family=BCM8885X +system_ref_core_clock_khz=1600000 dpp_db_path=/usr/share/bcm/db diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 74f24bc537e0..29f18c772337 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -314,3 +314,4 @@ phy_force_firmware_load phy_pcs_repeater l3_alpm_hit_skip phy_an_lt_msft +system_ref_core_clock_khz From 981454767dac780f8ada47c588f62600633764cf Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Thu, 23 Jun 2022 10:03:59 -0700 Subject: [PATCH 453/817] Updated Chassis MMU settings for 40G/100G/400G line cards (#11108) * Updated Chassis MMU settings for 40G/100G/400G line cards --- .../buffers_defaults_t2.j2 | 102 ++- .../pg_profile_lookup.ini | 40 +- .../Arista-7800R3-48CQ2-C48/qos.json.j2 | 20 - .../buffers_defaults_t2.j2 | 102 ++- .../pg_profile_lookup.ini | 40 +- .../Arista-7800R3-48CQM2-C48/qos.json.j2 | 20 - .../Arista-7800R3A-36D2-C72/0/buffers.json.j2 | 2 + .../0/buffers_defaults_t2.j2 | 37 ++ .../0/pg_profile_lookup.ini | 17 + .../Arista-7800R3A-36D2-C72/0/qos.json.j2 | 1 + .../Arista-7800R3A-36D2-C72/1/buffers.json.j2 | 2 + .../1/buffers_defaults_t2.j2 | 37 ++ .../1/pg_profile_lookup.ini | 17 + .../Arista-7800R3A-36D2-C72/1/qos.json.j2 | 1 + .../Nokia-IXR7250E-36x400G/0/buffers.json.j2 | 2 + .../0/buffers_defaults_t2.j2 | 37 ++ .../0/pg_profile_lookup.ini | 17 + .../Nokia-IXR7250E-36x400G/0/qos.json.j2 | 1 + .../Nokia-IXR7250E-36x400G/1/buffers.json.j2 | 2 + .../1/buffers_defaults_t2.j2 | 37 ++ .../1/pg_profile_lookup.ini | 17 + .../Nokia-IXR7250E-36x400G/1/qos.json.j2 | 1 + .../py2/buffer-arista7800r3-48cq2-lc.json | 334 +++++----- .../py2/qos-arista7800r3-48cq2-lc.json | 2 +- .../py3/buffer-arista7800r3-48cq2-lc.json | 594 ++++++++++-------- .../py3/qos-arista7800r3-48cq2-lc.json | 2 +- 26 files changed, 838 insertions(+), 646 deletions(-) create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers.json.j2 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers_defaults_t2.j2 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/pg_profile_lookup.ini create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/qos.json.j2 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers.json.j2 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers_defaults_t2.j2 create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/pg_profile_lookup.ini create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/qos.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers_defaults_t2.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/pg_profile_lookup.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/qos.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers_defaults_t2.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/pg_profile_lookup.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/qos.json.j2 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 index b292a354b55a..278315fb3ee7 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/buffers_defaults_t2.j2 @@ -1,65 +1,37 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,192,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "3220805000", - "type": "both", - "mode": "dynamic", - "xoff": "2102272" - } - }, - "BUFFER_PROFILE": { - "ingress_lossless_profile": { - "pool":"ingress_lossless_pool", - "size":"1280", - "dynamic_th":"-2", - "xon_offset":"2560", - "xon":"0", - "xoff":"66048" - }, - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "xon_offset":"0", - "static_th":"30535680" - }, - "egress_lossless_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"33030144" - }, - "egress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{%- macro generate_queue_buffers(port_names) %} - "BUFFER_QUEUE": { -{% for port in port_names.split(',') %} - "{{ port }}|3-4": { - "profile" : "ingress_lossless_profile" - }, -{% endfor %} -{% for port in port_names.split(',') %} - "{{ port }}|0-2": { - "profile" : "egress_lossy_profile" - }, -{% endfor %} -{% for port in port_names.split(',') %} - "{{ port }}|5-6": { - "profile" : "egress_lossy_profile" - }{% if not loop.last %},{% endif %} -{% endfor %} - } -{%- endmacro %} +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,192,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11678515" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/pg_profile_lookup.ini b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/pg_profile_lookup.ini index 887b6a493291..e8289ab03112 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/pg_profile_lookup.ini @@ -1,23 +1,17 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1280 2560 45506 0 1280 - 25000 5m 1280 2560 49152 0 1280 - 40000 5m 1280 2560 49152 0 1280 - 50000 5m 1280 2560 53248 0 1280 - 100000 5m 1280 2560 65536 0 1280 - 200000 5m 1280 2560 90112 0 1280 - 400000 5m 1280 2560 135168 0 1280 - 10000 40m 1280 2560 45506 0 1280 - 25000 40m 1280 2560 49152 0 1280 - 40000 40m 1280 2560 53248 0 1280 - 50000 40m 1280 2560 57344 0 1280 - 100000 40m 1280 2560 69632 0 1280 - 200000 40m 1280 2560 102400 0 1280 - 400000 40m 1280 2560 159744 0 1280 - 10000 300m 1280 2560 49152 0 1280 - 25000 300m 1280 2560 61440 0 1280 - 40000 300m 1280 2560 69632 0 1280 - 50000 300m 1280 2560 77824 0 1280 - 100000 300m 1280 2560 114688 0 1280 - 200000 300m 1280 2560 188416 0 1280 - 400000 300m 1280 2560 331776 0 1280 +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/qos.json.j2 b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/qos.json.j2 index 34002048afdb..3e548325ea30 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/qos.json.j2 +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/qos.json.j2 @@ -1,21 +1 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - {%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 index b292a354b55a..278315fb3ee7 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/buffers_defaults_t2.j2 @@ -1,65 +1,37 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,192,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "3220805000", - "type": "both", - "mode": "dynamic", - "xoff": "2102272" - } - }, - "BUFFER_PROFILE": { - "ingress_lossless_profile": { - "pool":"ingress_lossless_pool", - "size":"1280", - "dynamic_th":"-2", - "xon_offset":"2560", - "xon":"0", - "xoff":"66048" - }, - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "xon_offset":"0", - "static_th":"30535680" - }, - "egress_lossless_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"33030144" - }, - "egress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{%- macro generate_queue_buffers(port_names) %} - "BUFFER_QUEUE": { -{% for port in port_names.split(',') %} - "{{ port }}|3-4": { - "profile" : "ingress_lossless_profile" - }, -{% endfor %} -{% for port in port_names.split(',') %} - "{{ port }}|0-2": { - "profile" : "egress_lossy_profile" - }, -{% endfor %} -{% for port in port_names.split(',') %} - "{{ port }}|5-6": { - "profile" : "egress_lossy_profile" - }{% if not loop.last %},{% endif %} -{% endfor %} - } -{%- endmacro %} +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,192,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11678515" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini index 887b6a493291..e8289ab03112 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/pg_profile_lookup.ini @@ -1,23 +1,17 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1280 2560 45506 0 1280 - 25000 5m 1280 2560 49152 0 1280 - 40000 5m 1280 2560 49152 0 1280 - 50000 5m 1280 2560 53248 0 1280 - 100000 5m 1280 2560 65536 0 1280 - 200000 5m 1280 2560 90112 0 1280 - 400000 5m 1280 2560 135168 0 1280 - 10000 40m 1280 2560 45506 0 1280 - 25000 40m 1280 2560 49152 0 1280 - 40000 40m 1280 2560 53248 0 1280 - 50000 40m 1280 2560 57344 0 1280 - 100000 40m 1280 2560 69632 0 1280 - 200000 40m 1280 2560 102400 0 1280 - 400000 40m 1280 2560 159744 0 1280 - 10000 300m 1280 2560 49152 0 1280 - 25000 300m 1280 2560 61440 0 1280 - 40000 300m 1280 2560 69632 0 1280 - 50000 300m 1280 2560 77824 0 1280 - 100000 300m 1280 2560 114688 0 1280 - 200000 300m 1280 2560 188416 0 1280 - 400000 300m 1280 2560 331776 0 1280 +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 index 34002048afdb..3e548325ea30 100644 --- a/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 +++ b/device/arista/x86_64-arista_7800r3_48cqm2_lc/Arista-7800R3-48CQM2-C48/qos.json.j2 @@ -1,21 +1 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - {%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers.json.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..b64d225389d0 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,144,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11354112" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/pg_profile_lookup.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/pg_profile_lookup.ini new file mode 100644 index 000000000000..e8289ab03112 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/qos.json.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers.json.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers_defaults_t2.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..b64d225389d0 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,144,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11354112" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/pg_profile_lookup.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/pg_profile_lookup.ini new file mode 100644 index 000000000000..e8289ab03112 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/qos.json.j2 b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers_defaults_t2.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..7eb92f11ca7f --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,36) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11354112" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/pg_profile_lookup.ini new file mode 100644 index 000000000000..e8289ab03112 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/qos.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers_defaults_t2.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..7eb92f11ca7f --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,36) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "11354112" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/pg_profile_lookup.ini new file mode 100644 index 000000000000..e8289ab03112 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 40000 300m 1280 2560 69632 0 1280 + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 40000 1000m 1280 2560 114688 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 40000 2000m 1280 2560 184320 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 40000 80000m 1280 2560 5369856 0 1280 + 100000 80000m 1280 2560 13357056 0 1280 + 400000 80000m 1280 2560 53305344 0 1280 + 40000 120000m 1280 2560 8028160 0 1280 + 100000 120000m 1280 2560 20004864 0 1280 + 400000 120000m 1280 2560 79900672 0 1280 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/qos.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json index 8ec9e0747110..fd9984e42083 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/buffer-arista7800r3-48cq2-lc.json @@ -1,79 +1,71 @@ { "CABLE_LENGTH": { "AZURE": { - "Ethernet180": "5m", - "Ethernet8": "5m", - "Ethernet184": "5m", - "Ethernet188": "5m", - "Ethernet0": "5m", - "Ethernet4": "5m", - "Ethernet108": "5m", - "Ethernet100": "5m", - "Ethernet128": "5m", - "Ethernet104": "5m", - "Ethernet68": "5m", - "Ethernet96": "5m", - "Ethernet124": "5m", - "Ethernet148": "5m", - "Ethernet92": "5m", - "Ethernet120": "5m", - "Ethernet144": "5m", - "Ethernet52": "5m", - "Ethernet160": "5m", - "Ethernet140": "5m", - "Ethernet56": "5m", - "Ethernet164": "5m", - "Ethernet76": "5m", - "Ethernet72": "5m", - "Ethernet64": "5m", - "Ethernet32": "5m", - "Ethernet16": "5m", - "Ethernet36": "5m", - "Ethernet12": "5m", - "Ethernet168": "5m", - "Ethernet116": "5m", - "Ethernet80": "5m", - "Ethernet112": "5m", - "Ethernet84": "5m", - "Ethernet152": "5m", - "Ethernet136": "5m", - "Ethernet156": "5m", - "Ethernet132": "5m", - "Ethernet48": "5m", - "Ethernet172": "5m", - "Ethernet44": "5m", - "Ethernet176": "5m", - "Ethernet40": "5m", - "Ethernet28": "5m", - "Ethernet88": "5m", - "Ethernet60": "5m", - "Ethernet20": "5m", - "Ethernet24": "5m" + "Ethernet180": "300m", + "Ethernet8": "300m", + "Ethernet184": "300m", + "Ethernet188": "300m", + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet108": "300m", + "Ethernet100": "300m", + "Ethernet128": "300m", + "Ethernet104": "300m", + "Ethernet68": "300m", + "Ethernet96": "300m", + "Ethernet124": "300m", + "Ethernet148": "300m", + "Ethernet92": "300m", + "Ethernet120": "300m", + "Ethernet144": "300m", + "Ethernet52": "300m", + "Ethernet160": "300m", + "Ethernet140": "300m", + "Ethernet56": "300m", + "Ethernet164": "300m", + "Ethernet76": "300m", + "Ethernet72": "300m", + "Ethernet64": "300m", + "Ethernet32": "300m", + "Ethernet16": "300m", + "Ethernet36": "300m", + "Ethernet12": "300m", + "Ethernet168": "300m", + "Ethernet116": "300m", + "Ethernet80": "300m", + "Ethernet112": "300m", + "Ethernet84": "300m", + "Ethernet152": "300m", + "Ethernet136": "300m", + "Ethernet156": "300m", + "Ethernet132": "300m", + "Ethernet48": "300m", + "Ethernet172": "300m", + "Ethernet44": "300m", + "Ethernet176": "300m", + "Ethernet40": "300m", + "Ethernet28": "300m", + "Ethernet88": "300m", + "Ethernet60": "300m", + "Ethernet20": "300m", + "Ethernet24": "300m" } }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "3220805000", + "size": "6441610000", "type": "both", "mode": "dynamic", - "xoff": "2102272" + "xoff": "11678515" } }, "BUFFER_PROFILE": { - "ingress_lossless_profile": { + "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"1280", - "dynamic_th":"-2", "xon_offset":"2560", - "xon":"0", - "xoff":"66048" - }, - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "xon_offset":"0", - "static_th":"30535680" + "dynamic_th":"0" }, "egress_lossless_profile": { "pool":"ingress_lossless_pool", @@ -226,139 +218,139 @@ "BUFFER_QUEUE": { "Ethernet180|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet8|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet184|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet188|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet0|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet4|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet108|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet100|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet128|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet104|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet68|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet96|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet124|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet148|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet92|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet120|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet144|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet52|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet140|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet56|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet164|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet76|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet72|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet64|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet32|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet16|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet36|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet12|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet88|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet116|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet80|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet112|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet84|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet152|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet136|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet156|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet132|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet48|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet44|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet176|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet40|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet28|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet60|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet20|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet24|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet180|0-2": { "profile" : "egress_lossy_profile" @@ -497,93 +489,137 @@ }, "Ethernet180|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet8|5-6": { + }, + "Ethernet8|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet184|5-6": { + }, + "Ethernet184|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet188|5-6": { + }, + "Ethernet188|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet0|5-6": { + }, + "Ethernet0|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet4|5-6": { + }, + "Ethernet4|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet108|5-6": { + }, + "Ethernet108|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet100|5-6": { + }, + "Ethernet100|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet128|5-6": { + }, + "Ethernet128|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet104|5-6": { + }, + "Ethernet104|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet68|5-6": { + }, + "Ethernet68|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet96|5-6": { + }, + "Ethernet96|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet124|5-6": { + }, + "Ethernet124|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet148|5-6": { + }, + "Ethernet148|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet92|5-6": { + }, + "Ethernet92|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet120|5-6": { + }, + "Ethernet120|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet144|5-6": { + }, + "Ethernet144|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet52|5-6": { + }, + "Ethernet52|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet140|5-6": { + }, + "Ethernet140|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet56|5-6": { + }, + "Ethernet56|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet164|5-6": { + }, + "Ethernet164|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet76|5-6": { + }, + "Ethernet76|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet72|5-6": { + }, + "Ethernet72|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet64|5-6": { + }, + "Ethernet64|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet32|5-6": { + }, + "Ethernet32|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet16|5-6": { + }, + "Ethernet16|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet36|5-6": { + }, + "Ethernet36|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet12|5-6": { + }, + "Ethernet12|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet88|5-6": { + }, + "Ethernet88|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet116|5-6": { + }, + "Ethernet116|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet80|5-6": { + }, + "Ethernet80|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet112|5-6": { + }, + "Ethernet112|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet84|5-6": { + }, + "Ethernet84|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet152|5-6": { + }, + "Ethernet152|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet136|5-6": { + }, + "Ethernet136|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet156|5-6": { + }, + "Ethernet156|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet132|5-6": { + }, + "Ethernet132|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet48|5-6": { + }, + "Ethernet48|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet44|5-6": { + }, + "Ethernet44|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet176|5-6": { + }, + "Ethernet176|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet40|5-6": { + }, + "Ethernet40|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet28|5-6": { + }, + "Ethernet28|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet60|5-6": { + }, + "Ethernet60|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet20|5-6": { + }, + "Ethernet20|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet24|5-6": { + }, + "Ethernet24|5-6": { "profile" : "egress_lossy_profile" } } diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json index 48b3a293e02b..bd8f5a22a9f5 100644 --- a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7800r3-48cq2-lc.json @@ -485,7 +485,7 @@ "wred_red_enable" : "true", "ecn" : "ecn_all", "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", + "green_min_threshold" : "1048576", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json index 5301516178b2..fd9984e42083 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7800r3-48cq2-lc.json @@ -1,79 +1,71 @@ { "CABLE_LENGTH": { "AZURE": { - "Ethernet0": "5m", - "Ethernet4": "5m", - "Ethernet8": "5m", - "Ethernet12": "5m", - "Ethernet16": "5m", - "Ethernet20": "5m", - "Ethernet24": "5m", - "Ethernet28": "5m", - "Ethernet32": "5m", - "Ethernet36": "5m", - "Ethernet40": "5m", - "Ethernet44": "5m", - "Ethernet48": "5m", - "Ethernet52": "5m", - "Ethernet56": "5m", - "Ethernet60": "5m", - "Ethernet64": "5m", - "Ethernet68": "5m", - "Ethernet72": "5m", - "Ethernet76": "5m", - "Ethernet80": "5m", - "Ethernet84": "5m", - "Ethernet88": "5m", - "Ethernet92": "5m", - "Ethernet96": "5m", - "Ethernet100": "5m", - "Ethernet104": "5m", - "Ethernet108": "5m", - "Ethernet112": "5m", - "Ethernet116": "5m", - "Ethernet120": "5m", - "Ethernet124": "5m", - "Ethernet128": "5m", - "Ethernet132": "5m", - "Ethernet136": "5m", - "Ethernet140": "5m", - "Ethernet144": "5m", - "Ethernet148": "5m", - "Ethernet152": "5m", - "Ethernet156": "5m", - "Ethernet160": "5m", - "Ethernet164": "5m", - "Ethernet168": "5m", - "Ethernet172": "5m", - "Ethernet176": "5m", - "Ethernet180": "5m", - "Ethernet184": "5m", - "Ethernet188": "5m" + "Ethernet180": "300m", + "Ethernet8": "300m", + "Ethernet184": "300m", + "Ethernet188": "300m", + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet108": "300m", + "Ethernet100": "300m", + "Ethernet128": "300m", + "Ethernet104": "300m", + "Ethernet68": "300m", + "Ethernet96": "300m", + "Ethernet124": "300m", + "Ethernet148": "300m", + "Ethernet92": "300m", + "Ethernet120": "300m", + "Ethernet144": "300m", + "Ethernet52": "300m", + "Ethernet160": "300m", + "Ethernet140": "300m", + "Ethernet56": "300m", + "Ethernet164": "300m", + "Ethernet76": "300m", + "Ethernet72": "300m", + "Ethernet64": "300m", + "Ethernet32": "300m", + "Ethernet16": "300m", + "Ethernet36": "300m", + "Ethernet12": "300m", + "Ethernet168": "300m", + "Ethernet116": "300m", + "Ethernet80": "300m", + "Ethernet112": "300m", + "Ethernet84": "300m", + "Ethernet152": "300m", + "Ethernet136": "300m", + "Ethernet156": "300m", + "Ethernet132": "300m", + "Ethernet48": "300m", + "Ethernet172": "300m", + "Ethernet44": "300m", + "Ethernet176": "300m", + "Ethernet40": "300m", + "Ethernet28": "300m", + "Ethernet88": "300m", + "Ethernet60": "300m", + "Ethernet20": "300m", + "Ethernet24": "300m" } }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "3220805000", + "size": "6441610000", "type": "both", "mode": "dynamic", - "xoff": "2102272" + "xoff": "11678515" } }, "BUFFER_PROFILE": { - "ingress_lossless_profile": { + "ingress_lossy_profile": { "pool":"ingress_lossless_pool", "size":"1280", - "dynamic_th":"-2", "xon_offset":"2560", - "xon":"0", - "xoff":"66048" - }, - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "xon_offset":"0", - "static_th":"30535680" + "dynamic_th":"0" }, "egress_lossless_profile": { "pool":"ingress_lossless_pool", @@ -87,503 +79,547 @@ } }, "BUFFER_PG": { - "Ethernet0|0": { + "Ethernet180|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet36|0": { + "Ethernet8|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet40|0": { + "Ethernet184|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet44|0": { + "Ethernet188|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet48|0": { + "Ethernet0|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet52|0": { + "Ethernet4|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet56|0": { + "Ethernet108|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet60|0": { + "Ethernet100|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet64|0": { + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|0": { "profile" : "ingress_lossy_profile" }, "Ethernet68|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet72|0": { + "Ethernet96|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet4|0": { + "Ethernet124|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet76|0": { + "Ethernet148|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet80|0": { + "Ethernet92|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet84|0": { + "Ethernet120|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet88|0": { + "Ethernet144|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet92|0": { + "Ethernet52|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet96|0": { + "Ethernet140|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet100|0": { + "Ethernet56|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet104|0": { + "Ethernet164|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet108|0": { + "Ethernet76|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet112|0": { + "Ethernet72|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet8|0": { + "Ethernet64|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet116|0": { + "Ethernet32|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet120|0": { + "Ethernet16|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet124|0": { + "Ethernet36|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet128|0": { + "Ethernet12|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet132|0": { + "Ethernet88|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet136|0": { + "Ethernet116|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet140|0": { + "Ethernet80|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet144|0": { + "Ethernet112|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet148|0": { + "Ethernet84|0": { "profile" : "ingress_lossy_profile" }, "Ethernet152|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet12|0": { + "Ethernet136|0": { "profile" : "ingress_lossy_profile" }, "Ethernet156|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet164|0": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet176|0": { + "Ethernet132|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet180|0": { + "Ethernet48|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet184|0": { + "Ethernet44|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet188|0": { + "Ethernet176|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet16|0": { + "Ethernet40|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet20|0": { + "Ethernet28|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet24|0": { + "Ethernet60|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet28|0": { + "Ethernet20|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet32|0": { + "Ethernet24|0": { "profile" : "ingress_lossy_profile" } }, "BUFFER_QUEUE": { - "Ethernet0|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet36|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet40|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet44|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet48|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet52|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet56|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet60|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet64|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet128|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" }, "Ethernet68|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, - "Ethernet72|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet4|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet76|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet80|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet84|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet88|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet92|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet96|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet140|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet100|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet104|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet164|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet108|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet112|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet8|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet116|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet120|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet124|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet128|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet132|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet136|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet140|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet144|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet148|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" }, "Ethernet152|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, - "Ethernet12|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" }, "Ethernet156|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, - "Ethernet164|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet132|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet176|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet180|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet184|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet188|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" }, - "Ethernet16|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" }, "Ethernet20|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, "Ethernet24|3-4": { - "profile" : "ingress_lossless_profile" - }, - "Ethernet28|3-4": { - "profile" : "ingress_lossless_profile" + "profile" : "egress_lossless_profile" }, - "Ethernet32|3-4": { - "profile" : "ingress_lossless_profile" + "Ethernet180|0-2": { + "profile" : "egress_lossy_profile" }, - "Ethernet0|0-2": { + "Ethernet8|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet36|0-2": { + "Ethernet184|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet40|0-2": { + "Ethernet188|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet44|0-2": { + "Ethernet0|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet48|0-2": { + "Ethernet4|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet52|0-2": { + "Ethernet108|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet56|0-2": { + "Ethernet100|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet60|0-2": { + "Ethernet128|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet64|0-2": { + "Ethernet104|0-2": { "profile" : "egress_lossy_profile" }, "Ethernet68|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet72|0-2": { + "Ethernet96|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet4|0-2": { + "Ethernet124|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet76|0-2": { + "Ethernet148|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet80|0-2": { + "Ethernet92|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet84|0-2": { + "Ethernet120|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet88|0-2": { + "Ethernet144|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet92|0-2": { + "Ethernet52|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet96|0-2": { + "Ethernet140|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet100|0-2": { + "Ethernet56|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet104|0-2": { + "Ethernet164|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet108|0-2": { + "Ethernet76|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet112|0-2": { + "Ethernet72|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet8|0-2": { + "Ethernet64|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet116|0-2": { + "Ethernet32|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet120|0-2": { + "Ethernet16|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet124|0-2": { + "Ethernet36|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet128|0-2": { + "Ethernet12|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet132|0-2": { + "Ethernet88|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet136|0-2": { + "Ethernet116|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet140|0-2": { + "Ethernet80|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet144|0-2": { + "Ethernet112|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet148|0-2": { + "Ethernet84|0-2": { "profile" : "egress_lossy_profile" }, "Ethernet152|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet12|0-2": { + "Ethernet136|0-2": { "profile" : "egress_lossy_profile" }, "Ethernet156|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet164|0-2": { - "profile" : "egress_lossy_profile" - }, - "Ethernet176|0-2": { + "Ethernet132|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet180|0-2": { + "Ethernet48|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet184|0-2": { + "Ethernet44|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet188|0-2": { + "Ethernet176|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet16|0-2": { + "Ethernet40|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet20|0-2": { + "Ethernet28|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet24|0-2": { + "Ethernet60|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet28|0-2": { + "Ethernet20|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet32|0-2": { + "Ethernet24|0-2": { "profile" : "egress_lossy_profile" }, - "Ethernet0|5-6": { + "Ethernet180|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet36|5-6": { + }, + "Ethernet8|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet40|5-6": { + }, + "Ethernet184|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet44|5-6": { + }, + "Ethernet188|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet48|5-6": { + }, + "Ethernet0|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet52|5-6": { + }, + "Ethernet4|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet56|5-6": { + }, + "Ethernet108|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet60|5-6": { + }, + "Ethernet100|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet64|5-6": { + }, + "Ethernet128|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet68|5-6": { + }, + "Ethernet104|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet72|5-6": { + }, + "Ethernet68|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet4|5-6": { + }, + "Ethernet96|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet76|5-6": { + }, + "Ethernet124|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet80|5-6": { + }, + "Ethernet148|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet84|5-6": { + }, + "Ethernet92|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet88|5-6": { + }, + "Ethernet120|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet92|5-6": { + }, + "Ethernet144|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet96|5-6": { + }, + "Ethernet52|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet100|5-6": { + }, + "Ethernet140|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet104|5-6": { + }, + "Ethernet56|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet108|5-6": { + }, + "Ethernet164|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet112|5-6": { + }, + "Ethernet76|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet8|5-6": { + }, + "Ethernet72|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet116|5-6": { + }, + "Ethernet64|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet120|5-6": { + }, + "Ethernet32|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet124|5-6": { + }, + "Ethernet16|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet128|5-6": { + }, + "Ethernet36|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet132|5-6": { + }, + "Ethernet12|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet136|5-6": { + }, + "Ethernet88|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet140|5-6": { + }, + "Ethernet116|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet144|5-6": { + }, + "Ethernet80|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet148|5-6": { + }, + "Ethernet112|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet152|5-6": { + }, + "Ethernet84|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet12|5-6": { + }, + "Ethernet152|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet156|5-6": { + }, + "Ethernet136|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet164|5-6": { + }, + "Ethernet156|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet176|5-6": { + }, + "Ethernet132|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet180|5-6": { + }, + "Ethernet48|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet184|5-6": { + }, + "Ethernet44|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet188|5-6": { + }, + "Ethernet176|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet16|5-6": { + }, + "Ethernet40|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet20|5-6": { + }, + "Ethernet28|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet24|5-6": { + }, + "Ethernet60|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet28|5-6": { + }, + "Ethernet20|5-6": { "profile" : "egress_lossy_profile" - }, "Ethernet32|5-6": { + }, + "Ethernet24|5-6": { "profile" : "egress_lossy_profile" } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json index 48b3a293e02b..bd8f5a22a9f5 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7800r3-48cq2-lc.json @@ -485,7 +485,7 @@ "wred_red_enable" : "true", "ecn" : "ecn_all", "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", + "green_min_threshold" : "1048576", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", From e9fee8635c2600b5673d936ead5baa9a942232d2 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Fri, 24 Jun 2022 02:29:50 +0800 Subject: [PATCH 454/817] Support LOSSLESS_TRAFFIC_PATTERN and DEFAULT_LOSSLESS_BUFFER_PARAMETER (#11058) #### Why I did it Support the following tables which were introduced during dynamic buffer calculation - LOSSLESS_TRAFFIC_PATTERN - DEFAULT_LOSSLESS_BUFFER_PARAMETER #### How I did it - LOSSLESS_TRAFFIC_PATTERN |name|type|range|mandatory|description| |---|---|---|---|---| |mtu|uint16|64~10240|true|The maximum packet size of a lossless packet| |small_packet_percentage|uint8|0~100|true|The percentage of small packet| - DEFAULT_LOSSLESS_BUFFER_PARAMETER |name|type|range|mandatory|description| |---|---|---|---|---| |default_dynamic_th|int8|-8~7|true|The default dynamic_th for all buffer profiles that are dynamically generated for lossless PG| |over_subscribe_ratio|uint16|-|false|The oversubscribe ratio for shared headroom pool.| |||||Semantically, the upper bound is the number of physical ports but it can not be represented in the yang module. So we keep the upper bound open. As the type is (signed) integer whose lower bound is 0 by nature, we do not need to specify the range.| #### How to verify it Run unit test --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 14 ++ .../default_lossless_buffer_parameter.json | 33 +++++ .../tests/lossless_traffic_pattern.json | 41 ++++++ .../default_lossless_buffer_parameter.json | 105 ++++++++++++++ .../lossless_traffic_pattern.json | 130 ++++++++++++++++++ ...nic-default-lossless-buffer-parameter.yang | 53 +++++++ .../sonic-lossless-traffic-pattern.yang | 58 ++++++++ 8 files changed, 436 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/default_lossless_buffer_parameter.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/lossless_traffic_pattern.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/default_lossless_buffer_parameter.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/lossless_traffic_pattern.json create mode 100644 src/sonic-yang-models/yang-models/sonic-default-lossless-buffer-parameter.yang create mode 100644 src/sonic-yang-models/yang-models/sonic-lossless-traffic-pattern.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 3dfdde1cef89..4d61be960c3b 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -98,6 +98,7 @@ def run(self): './yang-models/sonic-cable-length.yang', './yang-models/sonic-copp.yang', './yang-models/sonic-crm.yang', + './yang-models/sonic-default-lossless-buffer-parameter.yang', './yang-models/sonic-device_metadata.yang', './yang-models/sonic-device_neighbor.yang', './yang-models/sonic-dhcpv6-relay.yang', @@ -107,6 +108,7 @@ def run(self): './yang-models/sonic-interface.yang', './yang-models/sonic-kdump.yang', './yang-models/sonic-loopback-interface.yang', + './yang-models/sonic-lossless-traffic-pattern.yang', './yang-models/sonic-mgmt_interface.yang', './yang-models/sonic-mgmt_port.yang', './yang-models/sonic-mgmt_vrf.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index cb2b9ee567bd..be7816e506c4 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1878,6 +1878,20 @@ "LAG" ] } + }, + + "LOSSLESS_TRAFFIC_PATTERN": { + "AZURE": { + "mtu": "1024", + "small_packet_percentage": "100" + } + }, + + "DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "AZURE": { + "default_dynamic_th": "0", + "over_subscribe_ratio": "0" + } } }, "SAMPLE_CONFIG_DB_UNKNOWN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/default_lossless_buffer_parameter.json b/src/sonic-yang-models/tests/yang_model_tests/tests/default_lossless_buffer_parameter.json new file mode 100644 index 000000000000..058d0f021a99 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/default_lossless_buffer_parameter.json @@ -0,0 +1,33 @@ +{ + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table." + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_NAME_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with invalid character.", + "eStr": "Invalid default lossless buffer parameter list name." + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_LONG_NAME_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with too long name.", + "eStr": "Invalid length for the default lossless buffer parameter list name." + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_SMALL_DYNAMIC_TH_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with a dynamic_th exceeding the lowerbound.", + "eStr": "Invalid default dynamic_th which should be a number in the range [-8, 7]." + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_LARGE_DYNAMIC_TH_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with a dynamic_th exceeding the upperbound.", + "eStr": "Invalid default dynamic_th which should be a number in the range [-8, 7]." + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_FORMAT_DYNAMIC_TH_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with an invalid dynamic_th", + "eStr": "Invalid" + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LACK_DYNAMIC_TH_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table without dynamic_th", + "eStrKey" : "Mandatory" + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_FORMAT_OVER_SUBSCRIBE_RATIO_TEST": { + "desc": "Configure DEFAULT_LOSSLESS_BUFFER_PARAMETER table with an invalid over subscribe ratio.", + "eStr": "Invalid" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/lossless_traffic_pattern.json b/src/sonic-yang-models/tests/yang_model_tests/tests/lossless_traffic_pattern.json new file mode 100644 index 000000000000..6f7fc517d361 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/lossless_traffic_pattern.json @@ -0,0 +1,41 @@ +{ + "LOSSLESS_TRAFFIC_PATTERN_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table." + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_NAME_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with invalid character.", + "eStr": "Invalid lossless traffic pattern list name." + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LONG_NAME_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with too long name.", + "eStr": "Invalid length for the lossless traffic pattern list name." + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_SMALL_MTU_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with an MTU exceeding the lowerbound.", + "eStr": "Invaild MTU which should be in [1, 9216]." + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LARGE_MTU_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with an MTU exceeding the upperbound.", + "eStr": "Invaild MTU which should be in [1, 9216]." + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_FORMAT_MTU_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with an invalid MTU", + "eStr": "Invalid" + }, + "LOSSLESS_TRAFFIC_PATTERN_LACK_MTU_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table without MTU", + "eStrKey": "Mandatory" + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LARGE_SMALL_PACKET_PERCENTAGE_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with a small packet percentage exceeding the upperbound.", + "eStr": "Invalid small packets percentage which should be in [0, 100]." + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_FORMAT_SMALL_PACKET_PERCENTAGE_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table with an invalid small packet percentage", + "eStr": "Invalid" + }, + "LOSSLESS_TRAFFIC_PATTERN_LACK_SMALL_PACKET_PERCENTAGE_TEST": { + "desc": "Configure LOSSLESS_TRAFFIC_PATTERN table without small packet percentage", + "eStrKey": "Mandatory" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/default_lossless_buffer_parameter.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/default_lossless_buffer_parameter.json new file mode 100644 index 000000000000..2557950df4ce --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/default_lossless_buffer_parameter.json @@ -0,0 +1,105 @@ +{ + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "default_dynamic_th": "0", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_NAME_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "Invalid$", + "default_dynamic_th": "0", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_LONG_NAME_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "Long_name_which_exceeds_the_limit", + "default_dynamic_th": "0", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_SMALL_DYNAMIC_TH_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "default_dynamic_th": "-9", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_TOO_LARGE_DYNAMIC_TH_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "default_dynamic_th": "8", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_FORMAT_DYNAMIC_TH_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "default_dynamic_th": "NaN", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LACK_DYNAMIC_TH_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "over_subscribe_ratio": "0" + } + ] + } + } + }, + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_INVALID_FORMAT_OVER_SUBSCRIBE_RATIO_TEST": { + "sonic-default-lossless-buffer-parameter:sonic-default-lossless-buffer-parameter": { + "sonic-default-lossless-buffer-parameter:DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST": [ + { + "name": "AZURE", + "default_dynamic_th": "0", + "over_subscribe_ratio": "NaN" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/lossless_traffic_pattern.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/lossless_traffic_pattern.json new file mode 100644 index 000000000000..9f4f347aa3a6 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/lossless_traffic_pattern.json @@ -0,0 +1,130 @@ +{ + "LOSSLESS_TRAFFIC_PATTERN_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "1024", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_NAME_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "Invalid$", + "mtu": "1024", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LONG_NAME_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "Long_name_which_exceeds_the_limit", + "mtu": "1024", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_SMALL_MTU_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "0", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LARGE_MTU_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "9217", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_FORMAT_MTU_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "NaN", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_LACK_MTU_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "small_packet_percentage": "100" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_TOO_LARGE_SMALL_PACKET_PERCENTAGE_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "1024", + "small_packet_percentage": "101" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_INVALID_FORMAT_SMALL_PACKET_PERCENTAGE_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "1024", + "small_packet_percentage": "NaN" + } + ] + } + } + }, + "LOSSLESS_TRAFFIC_PATTERN_LACK_SMALL_PACKET_PERCENTAGE_TEST": { + "sonic-lossless-traffic-pattern:sonic-lossless-traffic-pattern": { + "sonic-lossless-traffic-pattern:LOSSLESS_TRAFFIC_PATTERN": { + "LOSSLESS_TRAFFIC_PATTERN_LIST": [ + { + "name": "AZURE", + "mtu": "1024" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-default-lossless-buffer-parameter.yang b/src/sonic-yang-models/yang-models/sonic-default-lossless-buffer-parameter.yang new file mode 100644 index 000000000000..6f98d9a922b7 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-default-lossless-buffer-parameter.yang @@ -0,0 +1,53 @@ +module sonic-default-lossless-buffer-parameter { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-default-lossless-buffer-parameter"; + + prefix default-lossless-buffer-parameter; + + description "DEFAULT_LOSSLESS_BUFFER_PARAMETER YANG module for SONiC OS"; + + revision 2022-05-31 { + description "Initial version"; + } + + container sonic-default-lossless-buffer-parameter { + container DEFAULT_LOSSLESS_BUFFER_PARAMETER { + + description "DEFAULT_LOSSLESS_BUFFER_PARAMETER part of config_db.json"; + + list DEFAULT_LOSSLESS_BUFFER_PARAMETER_LIST { + key "name"; + + leaf name { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})' { + error-message "Invalid default lossless buffer parameter list name."; + error-app-tag default-lossless-buffer-parameter-invalid-list-name; + } + length 1..32 { + error-message "Invalid length for the default lossless buffer parameter list name."; + error-app-tag default-lossless-buffer-parameter-invalid-list-name-length; + } + } + } + + leaf default_dynamic_th { + type int8 { + range -8..7 { + error-message "Invalid default dynamic_th which should be a number in the range [-8, 7]."; + } + } + mandatory true; + description "The default dynamic_th used in lossless buffer profile generated dynamically"; + } + + leaf over_subscribe_ratio { + type uint16; + description "The over subscribe ratio of shared headroom pool"; + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-lossless-traffic-pattern.yang b/src/sonic-yang-models/yang-models/sonic-lossless-traffic-pattern.yang new file mode 100644 index 000000000000..6901dc01e007 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-lossless-traffic-pattern.yang @@ -0,0 +1,58 @@ +module sonic-lossless-traffic-pattern { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-lossless-traffic-pattern"; + + prefix lossless-traffic-pattern; + + description "LOSSLESS_TRAFFIC_PATTERN YANG module for SONiC OS"; + + revision 2022-05-31 { + description "Initial version"; + } + + container sonic-lossless-traffic-pattern { + container LOSSLESS_TRAFFIC_PATTERN { + + description "LOSSLESS_TRAFFIC_PATTERN part of config_db.json"; + + list LOSSLESS_TRAFFIC_PATTERN_LIST { + key "name"; + + leaf name { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})' { + error-message "Invalid lossless traffic pattern list name."; + error-app-tag lossless-traffic-pattern-invalid-list-name; + } + length 1..32 { + error-message "Invalid length for the lossless traffic pattern list name."; + error-app-tag lossless-traffic-pattern-invalid-list-name-length; + } + } + } + + leaf mtu { + type uint16 { + range 1..9216 { + error-message "Invaild MTU which should be in [1, 9216]."; + } + } + mandatory true; + description "The maximum packet size of a lossless packet"; + } + + leaf small_packet_percentage { + type uint8 { + range 0..100 { + error-message "Invalid small packets percentage which should be in [0, 100]."; + } + } + mandatory true; + description "The percentage of small packets which is used to calculate the headroom size"; + } + } + } + } +} From 9b59ee0e79a9d01e9ecbacc52db0ce9787bea336 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Fri, 24 Jun 2022 00:06:57 +0300 Subject: [PATCH 455/817] [ssip]: Add YANG model (#10992) - Why I did it To implement Syslog Source IP feature based on HLD: https://github.com/sonic-net/SONiC/pull/1002 - How I did it Added the relevant yang model - How to verify it Added unit test Signed-off-by: Nazarii Hnydyn --- .../tests/files/sample_config_db.json | 18 ++- .../tests/yang_model_tests/tests/syslog.json | 26 ++++- .../yang_model_tests/tests_config/syslog.json | 109 ++++++++++++++++++ .../yang-models/sonic-syslog.yang | 58 +++++++++- 4 files changed, 202 insertions(+), 9 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index be7816e506c4..d8f90284091a 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -426,9 +426,21 @@ "2001:aa:aa::aa": {} }, "SYSLOG_SERVER" : { - "10.13.14.17": {}, - "20.1.1.1": {}, - "2001:aa:aa::aa": {} + "10.13.14.17": { + "source": "1.1.1.1", + "port": "514", + "vrf": "default" + }, + "20.1.1.1": { + "source": "1.1.1.1", + "port": "514", + "vrf": "mgmt" + }, + "2001:aa:aa::aa": { + "source": "1111::1111", + "port": "514", + "vrf": "Vrf_blue" + } }, "CABLE_LENGTH": { "AZURE": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/syslog.json b/src/sonic-yang-models/tests/yang_model_tests/tests/syslog.json index ee45cf4d28a0..8b110fbd8af8 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/syslog.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/syslog.json @@ -1,4 +1,27 @@ { + "SYSLOG_SERVER_VALID": { + "desc": "Configure SYSLOG_SERVER." + }, + "SYSLOG_SERVER_INVALID_SOURCE": { + "desc": "Configure invalid SOURCE in SYSLOG_SERVER.", + "eStrKey": "InvalidValue" + }, + "SYSLOG_SERVER_SOURCE_IP_FAMILY_MISMATCH": { + "desc": "Configure SOURCE IP family mismatch in SYSLOG_SERVER.", + "eStrKey": "Must" + }, + "SYSLOG_SERVER_INVALID_PORT": { + "desc": "Configure invalid PORT in SYSLOG_SERVER.", + "eStrKey": "InvalidValue" + }, + "SYSLOG_SERVER_INVALID_VRF": { + "desc": "Configure invalid VRF in SYSLOG_SERVER.", + "eStrKey": "InvalidValue" + }, + "SYSLOG_SERVER_DISABLED_MGMT_VRF": { + "desc": "Configure disabled management VRF in SYSLOG_SERVER.", + "eStrKey": "Must" + }, "SYSLOG_SERVER_TEST": { "desc": "Load syslog server table with ipv4 address as syslog servers." }, @@ -14,5 +37,4 @@ "desc": "Load syslog server table with invalid ipv6 address as syslog server.", "eStrKey": "InvalidValue" } - -} \ No newline at end of file +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/syslog.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/syslog.json index ed153c0d6cb3..990fdcf85c72 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/syslog.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/syslog.json @@ -1,4 +1,113 @@ { + "SYSLOG_SERVER_VALID": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "source": "1.1.1.1", + "port": "514", + "vrf": "default" + }, + { + "server_address": "200.0.0.1", + "source": "1.1.1.1", + "port": "514", + "vrf": "mgmt" + }, + { + "server_address" : "2000::1", + "source": "1111::1111", + "port": "514", + "vrf": "Vrf-Data" + } + ] + } + }, + "sonic-mgmt_vrf:sonic-mgmt_vrf": { + "sonic-mgmt_vrf:MGMT_VRF_CONFIG": { + "sonic-mgmt_vrf:vrf_global": { + "mgmtVrfEnabled": "true" + } + } + }, + "sonic-vrf:sonic-vrf": { + "sonic-vrf:VRF": { + "VRF_LIST": [ + { + "name": "Vrf-Data" + } + ] + } + } + }, + "SYSLOG_SERVER_INVALID_SOURCE": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "source": "invalid_value" + } + ] + } + } + }, + "SYSLOG_SERVER_SOURCE_IP_FAMILY_MISMATCH": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "source": "1111::1111" + } + ] + } + } + }, + "SYSLOG_SERVER_INVALID_PORT": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "port": "65536" + } + ] + } + } + }, + "SYSLOG_SERVER_INVALID_VRF": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "vrf": "invalid_value" + } + ] + } + } + }, + "SYSLOG_SERVER_DISABLED_MGMT_VRF": { + "sonic-syslog:sonic-syslog": { + "sonic-syslog:SYSLOG_SERVER": { + "SYSLOG_SERVER_LIST": [ + { + "server_address": "100.0.0.1", + "vrf": "mgmt" + } + ] + } + }, + "sonic-mgmt_vrf:sonic-mgmt_vrf": { + "sonic-mgmt_vrf:MGMT_VRF_CONFIG": { + "sonic-mgmt_vrf:vrf_global": { + "mgmtVrfEnabled": "false" + } + } + } + }, "SYSLOG_SERVER_TEST": { "sonic-syslog:sonic-syslog": { "sonic-syslog:SYSLOG_SERVER": { diff --git a/src/sonic-yang-models/yang-models/sonic-syslog.yang b/src/sonic-yang-models/yang-models/sonic-syslog.yang index 2bb05a02973f..c2aa73827f0f 100644 --- a/src/sonic-yang-models/yang-models/sonic-syslog.yang +++ b/src/sonic-yang-models/yang-models/sonic-syslog.yang @@ -9,22 +9,72 @@ module sonic-syslog { prefix inet; } + import sonic-mgmt_vrf { + prefix mvrf; + } + + 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"; + description "SYSLOG_SERVER part of config_db.json"; list SYSLOG_SERVER_LIST { key "server_address"; leaf server_address { - description "syslog server ip address"; + description "Syslog server IP address"; + type inet:ip-address; + } + + leaf source { + description "Syslog source IP address"; type inet:ip-address; + must "(contains(current(), '.') and contains(../server_address, '.')) + or (contains(current(), ':') and contains(../server_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; + } + must "(current() != 'mgmt') + or (/mvrf:sonic-mgmt_vrf/mvrf:MGMT_VRF_CONFIG/mvrf:vrf_global/mvrf:mgmtVrfEnabled = 'true')"; } - } /* end of list SYSLOG_SERVER_LIST */ - } /* end of container SYSLOG_SERVER */ + } + /* end of list SYSLOG_SERVER_LIST */ + } + /* end of container SYSLOG_SERVER */ } + /* end of container sonic-syslog */ } +/* end of module sonic-syslog */ From d30d84b4c6e12583ec9a322a3a4054358d364478 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 23 Jun 2022 15:34:51 -0700 Subject: [PATCH 456/817] [bcm sai] upgrade Broadcom SAI to 7.1.0.0-5 (#11236) * [bcm sai] upgrade Broadcom SAI to 7.1.0.0-5 - Enable Microsoft AN/LT patch - Create infrastructure to allow upgrading DNX/XGS SAI independently. Signed-off-by: Ying Xie --- platform/broadcom/docker-pde.mk | 2 +- platform/broadcom/docker-syncd-brcm.mk | 2 +- platform/broadcom/libsaithrift-dev.mk | 4 ++-- platform/broadcom/rules.mk | 4 ++-- platform/broadcom/sai.dep | 20 ++++++++++---------- platform/broadcom/sai.mk | 26 ++++++++++++++------------ platform/broadcom/sonic-pde-tests.mk | 2 +- platform/marvell/libsaithrift-dev.mk | 2 +- 8 files changed, 32 insertions(+), 30 deletions(-) diff --git a/platform/broadcom/docker-pde.mk b/platform/broadcom/docker-pde.mk index 2d0f371fde11..d433160e2a7d 100644 --- a/platform/broadcom/docker-pde.mk +++ b/platform/broadcom/docker-pde.mk @@ -6,7 +6,7 @@ DOCKER_PDE = $(DOCKER_PDE_STEM).gz DOCKER_PDE_DBG = $(DOCKER_PDE_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_PDE)_PATH = $(DOCKERS_PATH)/$(DOCKER_PDE_STEM) $(DOCKER_PDE)_DEPENDS += $(PYTHON_NETIFACES) -$(DOCKER_PDE)_DEPENDS += $(SONIC_PLATFORM_PDE) $(BRCM_SAI) +$(DOCKER_PDE)_DEPENDS += $(SONIC_PLATFORM_PDE) $(BRCM_XGS_SAI) $(DOCKER_PDE_RDEPENDS += $(PYTHON_NETIFACES) $(DOCKER_PDE)_PYTHON_DEBS += $(SONIC_UTILS) diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index 1129c7681c34..cb4ee813d914 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -4,7 +4,7 @@ DOCKER_SYNCD_PLATFORM_CODE = brcm include $(PLATFORM_PATH)/../template/docker-syncd-base.mk $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) -$(DOCKER_SYNCD_BASE)_DEPENDS += $(BRCM_SAI) +$(DOCKER_SYNCD_BASE)_DEPENDS += $(BRCM_XGS_SAI) $(DOCKER_SYNCD_BASE)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BASE)_DBG_DEPENDS += $(SYNCD_DBG) \ diff --git a/platform/broadcom/libsaithrift-dev.mk b/platform/broadcom/libsaithrift-dev.mk index c1bd9b90de13..ec4e1f6e6da6 100644 --- a/platform/broadcom/libsaithrift-dev.mk +++ b/platform/broadcom/libsaithrift-dev.mk @@ -13,8 +13,8 @@ else $(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) endif -$(LIBSAITHRIFT_DEV)_DEPENDS += $(BRCM_SAI) $(BRCM_SAI_DEV) -$(LIBSAITHRIFT_DEV)_RDEPENDS += $(BRCM_SAI) +$(LIBSAITHRIFT_DEV)_DEPENDS += $(BRCM_XGS_SAI) $(BRCM_XGS_SAI_DEV) +$(LIBSAITHRIFT_DEV)_RDEPENDS += $(BRCM_XGS_SAI) SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) PYTHON_SAITHRIFT = python-saithrift$(SAITHRIFT_VER)_$(SAI_VER)_amd64.deb diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 5f3172ca0305..b13a145b2b0f 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -42,8 +42,8 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ $(DOCKER_FPM) # Inject brcm sai into syncd -$(SYNCD)_DEPENDS += $(BRCM_SAI) $(BRCM_SAI_DEV) -$(SYNCD)_UNINSTALLS += $(BRCM_SAI_DEV) $(BRCM_SAI) +$(SYNCD)_DEPENDS += $(BRCM_XGS_SAI) $(BRCM_XGS_SAI_DEV) +$(SYNCD)_UNINSTALLS += $(BRCM_XGS_SAI_DEV) $(BRCM_XGS_SAI) ifeq ($(ENABLE_SYNCD_RPC),y) $(SYNCD)_DEPENDS += $(LIBSAITHRIFT_DEV) diff --git a/platform/broadcom/sai.dep b/platform/broadcom/sai.dep index d6f6bb374f0d..f91f61f6132b 100644 --- a/platform/broadcom/sai.dep +++ b/platform/broadcom/sai.dep @@ -1,22 +1,22 @@ #DPKG FRK -SPATH := $($(BRCM_SAI)_SRC_PATH) -DEP_FILES := $(SONIC_COMMON_FILES_LIST) platform/broadcom/sai.mk platform/broadcom/sai.dep +SPATH := $($(BRCM_XGS_SAI)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) platform/broadcom/sai.mk platform/broadcom/sai.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) # Get the Latest HTTP Header and calculate the SHA value as it is a softlink that always points to LATEST_INT_OCP_SAI_X.X.X -SAI_FLAGS := $(shell wget --spider --server-response $($(BRCM_SAI)_URL) $($(BRCM_SAI_DEV)_URL) 2>&1 \ +SAI_FLAGS := $(shell wget --spider --server-response $($(BRCM_XGS_SAI)_URL) $($(BRCM_XGS_SAI_DEV)_URL) 2>&1 \ | grep -Ev -- '--|Date:|x-ms-request-id'|sha256sum|awk '{print $$1}' ) -$(BRCM_SAI)_CACHE_MODE := GIT_CONTENT_SHA -$(BRCM_SAI)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SAI_FLAGS) -$(BRCM_SAI)_DEP_FILES := $(DEP_FILES) +$(BRCM_XGS_SAI)_CACHE_MODE := GIT_CONTENT_SHA +$(BRCM_XGS_SAI)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SAI_FLAGS) +$(BRCM_XGS_SAI)_DEP_FILES := $(DEP_FILES) -$(BRCM_SAI_DEV)_CACHE_MODE := GIT_CONTENT_SHA -$(BRCM_SAI_DEV)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SAI_FLAGS) -$(BRCM_SAI_DEV)_DEP_FILES := $(DEP_FILES) +$(BRCM_XGS_SAI_DEV)_CACHE_MODE := GIT_CONTENT_SHA +$(BRCM_XGS_SAI_DEV)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SAI_FLAGS) +$(BRCM_XGS_SAI_DEV)_DEP_FILES := $(DEP_FILES) # Dependencies for SAI DNX ASIC family -$(BRCM_DNX_SAI)_CACHE_MODE := GIT_CONTENT_SHA +$(BRCM_DNX_SAI)_CACHE_MODE := GIT_CONTENT_SHA $(BRCM_DNX_SAI)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(SAI_FLAGS) $(BRCM_DNX_SAI)_DEP_FILES := $(DEP_FILES) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 876c7af83850..f3f6448d2e46 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,18 +1,20 @@ -LIBSAIBCM_VERSION = 7.1.0.0-1 +LIBSAIBCM_XGS_VERSION = 7.1.0.0-5 +LIBSAIBCM_DNX_VERSION = 7.1.0.0-1 LIBSAIBCM_BRANCH_NAME = REL_7.0 -LIBSAIBCM_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_VERSION)" +LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" +LIBSAIBCM_DNX_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_DNX_VERSION)" -BRCM_SAI = libsaibcm_$(LIBSAIBCM_VERSION)_amd64.deb -$(BRCM_SAI)_URL = "$(LIBSAIBCM_URL_PREFIX)/$(BRCM_SAI)" -BRCM_SAI_DEV = libsaibcm-dev_$(LIBSAIBCM_VERSION)_amd64.deb -$(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "$(LIBSAIBCM_URL_PREFIX)/$(BRCM_SAI_DEV)" +BRCM_XGS_SAI = libsaibcm_$(LIBSAIBCM_XGS_VERSION)_amd64.deb +$(BRCM_XGS_SAI)_URL = "$(LIBSAIBCM_XGS_URL_PREFIX)/$(BRCM_XGS_SAI)" +BRCM_XGS_SAI_DEV = libsaibcm-dev_$(LIBSAIBCM_XGS_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(BRCM_XGS_SAI),$(BRCM_XGS_SAI_DEV))) +$(BRCM_XGS_SAI_DEV)_URL = "$(LIBSAIBCM_XGS_URL_PREFIX)/$(BRCM_XGS_SAI_DEV)" # SAI module for DNX Asic family -BRCM_DNX_SAI = libsaibcm_dnx_$(LIBSAIBCM_VERSION)_amd64.deb -$(BRCM_DNX_SAI)_URL = "$(LIBSAIBCM_URL_PREFIX)/$(BRCM_DNX_SAI)" +BRCM_DNX_SAI = libsaibcm_dnx_$(LIBSAIBCM_DNX_VERSION)_amd64.deb +$(BRCM_DNX_SAI)_URL = "$(LIBSAIBCM_DNX_URL_PREFIX)/$(BRCM_DNX_SAI)" -SONIC_ONLINE_DEBS += $(BRCM_SAI) +SONIC_ONLINE_DEBS += $(BRCM_XGS_SAI) SONIC_ONLINE_DEBS += $(BRCM_DNX_SAI) -$(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) -$(eval $(call add_conflict_package,$(BRCM_SAI_DEV),$(LIBSAIVS_DEV))) +$(BRCM_XGS_SAI_DEV)_DEPENDS += $(BRCM_XGS_SAI) +$(eval $(call add_conflict_package,$(BRCM_XGS_SAI_DEV),$(LIBSAIVS_DEV))) diff --git a/platform/broadcom/sonic-pde-tests.mk b/platform/broadcom/sonic-pde-tests.mk index a7482625c87e..2d76bbfacd62 100644 --- a/platform/broadcom/sonic-pde-tests.mk +++ b/platform/broadcom/sonic-pde-tests.mk @@ -2,6 +2,6 @@ SONIC_PLATFORM_PDE = sonic-platform-pde_1.0_amd64.deb $(SONIC_PLATFORM_PDE)_SRC_PATH = $(SRC_PATH)/sonic-platform-pde -$(SONIC_PLATFORM_PDE)_DEPENDS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(SWIG) +$(SONIC_PLATFORM_PDE)_DEPENDS += $(BRCM_XGS_SAI) $(BRCM_XGS_SAI_DEV) $(SWIG) SONIC_DPKG_DEBS += $(SONIC_PLATFORM_PDE) diff --git a/platform/marvell/libsaithrift-dev.mk b/platform/marvell/libsaithrift-dev.mk index d1607a1ba220..dd178c0b1304 100644 --- a/platform/marvell/libsaithrift-dev.mk +++ b/platform/marvell/libsaithrift-dev.mk @@ -12,7 +12,7 @@ PYTHON_SAITHRIFT = python-saithrift_$(SAI_VER)_amd64.deb $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(PYTHON_SAITHRIFT))) SAISERVER = saiserver_$(SAI_VER)_amd64.deb -$(SAISERVER)_RDEPENDS += $(LIBTHRIFT) $(BRCM_SAI) +$(SAISERVER)_RDEPENDS += $(LIBTHRIFT) $(BRCM_XGS_SAI) $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(SAISERVER))) SAISERVER_DBG = saiserver-dbg_$(SAI_VER)_amd64.deb From 505d505d598ba68518739e3db2a5ab36bfe56b38 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Fri, 24 Jun 2022 01:38:24 +0300 Subject: [PATCH 457/817] [vs][asan] add /var/log/asan to ASAN-enabled docker-sonic-vs image (#11059) To ensure that ASAN logs are always generated. Currently, the way to get the logs is to map the "/var/log/asan" outside of a container, which doesn't work for DVS test run with "--imgname" option. Signed-off-by: Yakiv Huryk --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index e0edc4b4bac2..70ac1d9da8da 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -186,6 +186,10 @@ RUN mkdir -p /etc/supervisor/conf.d/ RUN sonic-cfggen -a "{\"ENABLE_ASAN\":\"{{ENABLE_ASAN}}\"}" -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf RUN rm -f /usr/share/sonic/templates/supervisord.conf.j2 +{%- if ENABLE_ASAN == "y" %} +RUN mkdir -p /var/log/asan +{%- endif %} + # Workaround the tcpdump issue RUN mv /usr/sbin/tcpdump /usr/bin/tcpdump From 4afe2094020a8150b2d1fa60c1ab67877549130a Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 24 Jun 2022 08:31:21 +0800 Subject: [PATCH 458/817] [Submodule] Update src/sonic-swss-common (#11226) Updating sonic-utilities sub module with the following commits 40a685c [azp] Fix the 'make check' failure at the step 'Compile sonic sairedis' ecf5bbc [sonic-cli] Fix sonic-db-cli output format not backward compatible with python version issue. 34c4b05 [portcounter] Check if counter ID exists before arithmetic operation #### Why I did it To fix sonic-db-cli output format not backward compatible with python version issue, need update sonic-swss-common submodule. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog 40a685c [azp] Fix the 'make check' failure at the step 'Compile sonic sairedis' ecf5bbc [sonic-cli] Fix sonic-db-cli output format not backward compatible with python version issue. 34c4b05 [portcounter] Check if counter ID exists before arithmetic operation #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 92f541111721..34c4b059e545 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 92f54111172138a3c1b2ed2dfbdda23e84d9ae9d +Subproject commit 34c4b059e545caff775d6be903206c7f39c5c112 From 336426b2c3c43260f225f43c6f42f2fb27e2048e Mon Sep 17 00:00:00 2001 From: Sumukha Tumkur Vani Date: Thu, 23 Jun 2022 22:32:48 -0700 Subject: [PATCH 459/817] [RESTAPI] Update submodule (#11233) --- src/sonic-restapi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-restapi b/src/sonic-restapi index e83e0e862cc4..55683f2abb8e 160000 --- a/src/sonic-restapi +++ b/src/sonic-restapi @@ -1 +1 @@ -Subproject commit e83e0e862cc4e8a2627eaf79f1461e7d7d9a4e75 +Subproject commit 55683f2abb8e7be0e80b0e81128314c90006303c From 0c5b1b29e413ca8dfffbadf2f3c811010102c566 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 24 Jun 2022 17:39:50 +0800 Subject: [PATCH 460/817] Update swsssdk submodule (#10996) Updating sonic-utilities sub module with the following commits ca785a2 Remove sonic-db-cli #### Why I did it To fix sonic-db-cli high CPU usage on SONiC startup issue: https://github.com/Azure/sonic-buildimage/issues/10218 sonic-db-cli re-write with c++ and move to sonic-swss-common repo. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog ca785a2 Remove sonic-db-cli #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 653bdba51750..ca785a2cc6a8 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 653bdba51750cac95feb3dd47904bf4de2353fec +Subproject commit ca785a2cc6a8a06fdb1145d5f4ff50ec7c5d25a6 From 6a9c058a92443a6d2b2dcd97f9b877e17c4b2ed4 Mon Sep 17 00:00:00 2001 From: geogchen <106694330+geogchen@users.noreply.github.com> Date: Fri, 24 Jun 2022 06:30:33 -0700 Subject: [PATCH 461/817] Revert "Add support for generating interface configuration in /etc/network/interfaces for multiple management interfaces (#11204)" (#11241) This reverts commit 90a849ea85fd3b95b2d59511e3121227a19c6b5e. #### Why I did it The interfaces unit test did not cover some of the conditions in interfaces.j2 that was changed in #11204. Therefore reverting the change and add the tests before making the change to interfaces.j2. #### How I did it Git revert. #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- files/image_config/interfaces/interfaces.j2 | 30 +- src/sonic-config-engine/minigraph.py | 4 +- .../sample_output/py2/two_mgmt_interfaces | 76 -- .../sample_output/py3/two_mgmt_interfaces | 76 -- .../tests/t0-sample-graph-two-mgmt.xml | 953 ------------------ src/sonic-config-engine/tests/test_j2files.py | 5 - 6 files changed, 12 insertions(+), 1132 deletions(-) delete mode 100644 src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces delete mode 100644 src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces delete mode 100644 src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index f308527856cd..1e554e4ed716 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -30,27 +30,19 @@ iface lo inet loopback {% block mgmt_interface %} # The management network interface -{% if MGMT_INTERFACE %} -{% for (name, prefix) in MGMT_INTERFACE|pfx_filter|unique(attribute=0) %} -auto {{ name }} -{% endfor %} -{% endif %} +auto eth0 {% if (ZTP_DHCP_DISABLED is not defined) and (ZTP is defined) and (ZTP['mode'] is defined and ZTP['mode']['profile'] == 'active') %} # ZTP out-of-band interface -{% if MGMT_INTERFACE %} -{% for (name, prefix) in MGMT_INTERFACE|pfx_filter|unique(attribute=0) %} -allow-hotplug {{ name }} +allow-hotplug eth0 {% if ZTP['mode']['ipv4'] == 'true' %} -iface {{ name }} inet dhcp +iface eth0 inet dhcp {% endif %} {% if ZTP['mode']['ipv6'] == 'true' %} -iface {{ name }} inet6 dhcp - up sysctl net.ipv6.conf.{{ name }}.accept_ra=1 - down sysctl net.ipv6.conf.{{ name }}.accept_ra=0 -{% endif %} -{% endfor %} +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 {% endif %} {% if ZTP['mode']['inband'] == 'true' %} @@ -73,7 +65,7 @@ iface {{ port }} inet6 dhcp {% else %} {% if MGMT_INTERFACE %} {% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} -iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static +iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} network {{ prefix | network }} @@ -85,15 +77,15 @@ iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static {% endif %} ########## management network policy routing rules # management port up rules - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} metric 201 - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} metric 201 + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} up ip {{ '-4' if prefix | ipv4 else '-6' }} rule add pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} up ip rule add pref 32764 to {{ route }} table {{ vrf_table }} {% endfor %} # management port down rules - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} rule delete pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} pre-down ip rule delete pref 32764 to {{ route }} table {{ vrf_table }} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 5a044c8f9ea3..b1ad117d255c 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -10,7 +10,6 @@ from lxml import etree as ET from lxml.etree import QName -from natsort import natsorted from portconfig import get_port_config from sonic_py_common.interface import backplane_prefix @@ -1433,8 +1432,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['MGMT_INTERFACE'] = {} mgmt_intf_count = 0 mgmt_alias_reverse_mapping = {} - sorted_keys = natsorted(mgmt_intf.keys(), key=lambda x : x[0].lower()) - for key in sorted_keys: + for key in mgmt_intf: alias = key[0] if alias in mgmt_alias_reverse_mapping: name = mgmt_alias_reverse_mapping[alias] diff --git a/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces deleted file mode 100644 index 12136a316acb..000000000000 --- a/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces +++ /dev/null @@ -1,76 +0,0 @@ -# -# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== -# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen -# file: /etc/network/interfaces -# -# The loopback network interface -auto lo -iface lo inet loopback - address 127.0.0.1 - netmask 255.255.0.0 - scope host - post-up ip addr del 127.0.0.1/8 dev lo - -# The management network interface -auto eth1 -auto eth0 -iface eth1 inet static - address 10.0.10.100 - netmask 255.255.255.0 - network 10.0.10.0 - broadcast 10.0.10.255 - ########## management network policy routing rules - # management port up rules - up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 - up ip -4 route add 10.0.10.0/24 dev eth1 table default - up ip -4 rule add pref 32765 from 10.0.10.100/32 table default - # management port down rules - pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default - pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default - pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default -iface eth0 inet static - address 10.0.0.100 - netmask 255.255.255.0 - network 10.0.0.0 - broadcast 10.0.0.255 - ########## management network policy routing rules - # management port up rules - up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 - up ip -4 route add 10.0.0.0/24 dev eth0 table default - up ip -4 rule add pref 32765 from 10.0.0.100/32 table default - # management port down rules - pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default - pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default - pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default -iface eth1 inet6 static - address 2603:10e2:0:abcd::8 - netmask 64 - network 2603:10e2:0:abcd:: - broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff - ########## management network policy routing rules - # management port up rules - up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 - up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default - up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default - # management port down rules - pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default - pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default - pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default -iface eth0 inet6 static - address 2603:10e2:0:2902::8 - netmask 64 - network 2603:10e2:0:2902:: - broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff - ########## management network policy routing rules - # management port up rules - up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 - up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default - up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default - # management port down rules - pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default - pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default - pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default -# -source /etc/network/interfaces.d/* -# - diff --git a/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces deleted file mode 100644 index 7fa99896e8c2..000000000000 --- a/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces +++ /dev/null @@ -1,76 +0,0 @@ -# -# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== -# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen -# file: /etc/network/interfaces -# -# The loopback network interface -auto lo -iface lo inet loopback - address 127.0.0.1 - netmask 255.255.0.0 - scope host - post-up ip addr del 127.0.0.1/8 dev lo - -# The management network interface -auto eth0 -auto eth1 -iface eth0 inet static - address 10.0.0.100 - netmask 255.255.255.0 - network 10.0.0.0 - broadcast 10.0.0.255 - ########## management network policy routing rules - # management port up rules - up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 - up ip -4 route add 10.0.0.0/24 dev eth0 table default - up ip -4 rule add pref 32765 from 10.0.0.100/32 table default - # management port down rules - pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default - pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default - pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default -iface eth0 inet6 static - address 2603:10e2:0:2902::8 - netmask 64 - network 2603:10e2:0:2902:: - broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff - ########## management network policy routing rules - # management port up rules - up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 - up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default - up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default - # management port down rules - pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default - pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default - pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default -iface eth1 inet static - address 10.0.10.100 - netmask 255.255.255.0 - network 10.0.10.0 - broadcast 10.0.10.255 - ########## management network policy routing rules - # management port up rules - up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 - up ip -4 route add 10.0.10.0/24 dev eth1 table default - up ip -4 rule add pref 32765 from 10.0.10.100/32 table default - # management port down rules - pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default - pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default - pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default -iface eth1 inet6 static - address 2603:10e2:0:abcd::8 - netmask 64 - network 2603:10e2:0:abcd:: - broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff - ########## management network policy routing rules - # management port up rules - up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 - up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default - up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default - # management port down rules - pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default - pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default - pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default -# -source /etc/network/interfaces.d/* -# - diff --git a/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml b/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml deleted file mode 100644 index da1b56fe1309..000000000000 --- a/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml +++ /dev/null @@ -1,953 +0,0 @@ - - - - - - switch-t0 - 10.1.0.32 - BGPMonitor - 10.20.30.40 - 30 - 10 - 3 - - - false - switch-t0 - 10.0.0.56 - ARISTA01T1 - 10.0.0.57 - 1 - 180 - 60 - - - switch-t0 - FC00::71 - ARISTA01T1 - FC00::72 - 1 - 180 - 60 - - - false - switch-t0 - 10.0.0.58 - ARISTA02T1 - 10.0.0.59 - 1 - 180 - 60 - - - switch-t0 - FC00::75 - ARISTA02T1 - FC00::76 - 1 - 180 - 60 - - - false - switch-t0 - 10.0.0.60 - ARISTA03T1 - 10.0.0.61 - 1 - 180 - 60 - - - switch-t0 - FC00::79 - ARISTA03T1 - FC00::7A - 1 - 180 - 60 - - - false - switch-t0 - 10.0.0.62 - ARISTA04T1 - 10.0.0.63 - 1 - 180 - 60 - - - switch-t0 - FC00::7D - ARISTA04T1 - FC00::7E - 1 - 180 - 60 - - - - - 1 - - BGPMonitor - - - BGPPeer -
10.1.0.32
- - - -
-
- -
- - 65100 - switch-t0 - - -
10.0.0.57
- - - -
- -
10.0.0.59
- - - -
- -
10.0.0.61
- - - -
- -
10.0.0.63
- - - -
-
- -
- - 64600 - ARISTA01T1 - - - - 64600 - ARISTA02T1 - - - - 64600 - ARISTA03T1 - - - - 64600 - ARISTA04T1 - - -
-
- - - - - - HostIP - Loopback0 - - 10.1.0.32/32 - - 10.1.0.32/32 - - - HostIP1 - Loopback0 - - FC00:1::32/128 - - FC00:1::32/128 - - - LoopbackIP1 - Loopback1 - - 10.10.0.99/32 - - 10.10.0.99/32 - - - LoopbackIP2 - Loopback2 - - 10.21.0.64/32 - - 10.21.0.64/32 - - - LoopbackIP3 - Loopback3 - - 10.21.64.2/32 - - 10.21.64.2/32 - - - - - HostIP - eth0 - - 10.0.0.100/24 - - 10.0.0.100/24 - - - HostIP - eth0 - - 2603:10e2:0:2902::8/64 - - 2603:10e2:0:2902::8/64 - - - HostIP1 - eth1 - - 10.0.10.100/24 - - 10.0.10.100/24 - - - HostIP1 - eth1 - - 2603:10e2:0:abcd::8/64 - - 2603:10e2:0:abcd::8/64 - - - - - - - switch-t0 - - - PortChannel01 - fortyGigE0/112 - - - - PortChannel02 - fortyGigE0/116 - - - - PortChannel03 - fortyGigE0/120 - - - - PortChannel04 - fortyGigE0/124 - - - - - - Vlan1000 - fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 - False - 0.0.0.0/0 - - - 192.0.0.1;192.0.0.2 - fc02:2000::1;fc02:2000::2 - 1000 - 1000 - 192.168.0.0/27 - - - - - Vlan2000 - fortyGigE0/112;fortyGigE0/116;fortyGigE0/120 - False - 0.0.0.0/0 - - - - 2000 - 2000 - 192.168.200.0/27 - - - - - Vlan99 - fortyGigE0/100 - False - 0.0.0.0/0 - - UserDefinedL2Vlan - 192.0.0.1;192.0.0.2 - 99 - 99 - - - - - - Vlan98 - fortyGigE0/100;PortChannel01;PortChannel03 - False - 0.0.0.0/0 - - UserDefinedL2Vlan - 192.0.0.1;192.0.0.2 - 98 - 98 - - - - - - - - - PortChannel01 - 10.0.0.56/31 - - - - PortChannel01 - FC00::71/126 - - - - PortChannel02 - 10.0.0.58/31 - - - - PortChannel02 - FC00::75/126 - - - - PortChannel03 - 10.0.0.60/31 - - - - PortChannel03 - FC00::79/126 - - - - PortChannel04 - 10.0.0.62/31 - - - - PortChannel04 - FC00::7D/126 - - - - Vlan1000 - 192.168.0.1/27 - - - - Vlan2000 - 192.168.200.1/27 - - - - - - ERSPAN - everflow - Everflow - - - ERSPANv6 - everflowV6 - Everflow - - - EGRESS_ERSPAN - everflow_egress - Everflow - - - PortChannel01;PortChannel02;PortChannel03;PortChannel04 - DataAclIngress - DataPlane - - - PortChannel01;PortChannel02;Vlan98 - DataAclEgress - DataPlane - - - SNMP - SNMP_ACL - SNMP - - - NTP - NTP_ACL - NTP - - - SSH - SSH_ACL - SSH - - - SSH - ROUTER-PROTECT - SSH - - - SNMP - ROUTER-PROTECT - SNMP - - - NTP - NTP_ACL - - - - - - - - - - DeviceInterfaceLink - ARISTA01T1 - Ethernet1/1 - switch-t0 - fortyGigE0/112 - - - DeviceInterfaceLink - ARISTA02T1 - Ethernet1/1 - switch-t0 - fortyGigE0/116 - - - DeviceInterfaceLink - ARISTA03T1 - Ethernet1/1 - switch-t0 - fortyGigE0/120 - - - DeviceInterfaceLink - ARISTA04T1 - Ethernet1/1 - switch-t0 - fortyGigE0/124 - 100000 - - - DeviceInterfaceLink - 100000 - switch-t0 - fortyGigE0/4 - true - ARISTA05T1 - Ethernet1/33 - true - - - DeviceInterfaceLink - Servers0 - eth0 - switch-t0 - fortyGigE0/4 - - - DeviceInterfaceLink - Servers100 - eth0 - switch-t0 - fortyGigE0/100 - - - - - switch-t0 - Force10-S6000 - - - ARISTA01T1 - Arista - - - ARISTA02T1 - Arista - - - ARISTA03T1 - Arista - - - ARISTA04T1 - Arista - - - - - - - - DeviceInterface - - true - 1 - Ethernet0 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet8 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet12 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet16 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet20 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet24 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet28 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet32 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet36 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet40 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet44 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet48 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet52 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet56 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet60 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet64 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet68 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet72 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet76 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet80 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet84 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet88 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet92 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet96 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet100 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet104 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet108 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet112 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet116 - - false - 0 - 0 - 40000 - - - DeviceInterface - - true - 1 - Ethernet120 - - false - 0 - 0 - 40000 - - - Force10-S6000 - - - - - - - switch-t0 - - - ErspanDestinationIpv4 - - 2.2.2.2 - - - - - - - - - - - - - AutoNegotiation - - True - - - FECDisabled - - True - - - ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4 - - - - - - AutoNegotiation - - False - - - FECDisabled - - True - - - ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8 - - - - - - - switch-t0 - - - DeploymentId - - 1 - - - - - - - switch-t0 - Force10-S6000 -
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index fc8eb3fb024c..a82e108f6871 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -14,7 +14,6 @@ def setUp(self): self.simple_minigraph = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.t0_mvrf_minigraph = os.path.join(self.test_dir, 't0-sample-graph-mvrf.xml') - self.t0_two_mgmt_minigraph = os.path.join(self.test_dir, 't0-sample-graph-two-mgmt.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') self.l1_l3_port_config = os.path.join(self.test_dir, 'l1-l3-sample-port-config.ini') @@ -93,10 +92,6 @@ def test_interfaces(self): self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) - argument = '-m ' + self.t0_two_mgmt_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file - self.run_script(argument) - self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'two_mgmt_interfaces'), self.output_file), self.output_file) - def test_ports_json(self): ports_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ports.json.j2') argument = '-m ' + self.simple_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ports_template + ' > ' + self.output_file From 071cf5f0a9c505bd5285ca1b4602b87766815efb Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Fri, 24 Jun 2022 13:30:13 -0400 Subject: [PATCH 462/817] Update sonic-platform-common submodule (#11237) 0d45adb Skip CDB and VDM for flat memory modules (#281) be04b80 [multiasic][sfputil]Fix the sftpuitlhelper on mutilasic platform issue (#286) 04b08ba [ssd_generic] Fix innodisk health regex (#287) Signed-off-by: mlok --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index f575a401b83b..0d45adb62f48 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit f575a401b83bbd5d6b6d68824ff22eae8647be16 +Subproject commit 0d45adb62f48637a575e09da7c61c58a7020e40e From c9f36957db687d231e0ccd2b648fa3a4c4ed457b Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Fri, 24 Jun 2022 10:32:02 -0700 Subject: [PATCH 463/817] Update include_macsec flag if type is SpineRouter (#11141) Add the support to enable macsec when type is SpineRouter --- files/build_templates/init_cfg.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index ca5a0756f954..5fd9ac10cd25 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -46,7 +46,7 @@ {%- if include_p4rt == "y" %}{% do features.append(("p4rt", "enabled", false, "enabled")) %}{% endif %} {%- if include_restapi == "y" %}{% do features.append(("restapi", "enabled", false, "enabled")) %}{% endif %} {%- if include_sflow == "y" %}{% do features.append(("sflow", "disabled", false, "enabled")) %}{% endif %} -{%- if include_macsec == "y" %}{% do features.append(("macsec", "disabled", false, "enabled")) %}{% endif %} +{%- if include_macsec == "y" %}{% do features.append(("macsec", "{% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'SpineRouter' %}enabled{% else %}disabled{% endif %}", false, "enabled")) %}{% endif %} {%- if include_system_telemetry == "y" %}{% do features.append(("telemetry", "enabled", true, "enabled")) %}{% endif %} "FEATURE": { {# has_timer field if set, will start the feature systemd .timer unit instead of .service unit #} From 9d5ca72b8bc18f1d8390472e76056786984ed00e Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Sat, 25 Jun 2022 20:24:31 +0300 Subject: [PATCH 464/817] [sairedis] fix incorrect package specified in sairedis rules (#11227) #### Why I did it Fix the build with updated sairedis #### How I did it Specify nopython2 for syncd and fixed a copy paste mistake for libsairedis #### How to verify it Run build with updated sairedis --- rules/sairedis.mk | 2 +- rules/syncd.mk | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index fe77c98b86ab..baa32493b330 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -46,7 +46,7 @@ $(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) ifeq ($(ENABLE_PY2_MODULES), n) - $(LIBSWSSCOMMON)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 + $(LIBSAIREDIS)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 endif # The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} diff --git a/rules/syncd.mk b/rules/syncd.mk index 2b7007d84d5b..225f7ec0574c 100644 --- a/rules/syncd.mk +++ b/rules/syncd.mk @@ -33,4 +33,8 @@ $(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) $(eval $(call add_derived_package,$(SYNCD),$(SYNCD_RPC_DBG))) endif +ifeq ($(ENABLE_PY2_MODULES), n) + $(SYNCD)_BUILD_ENV += DEB_BUILD_PROFILES=nopython2 +endif + endif From 3f0c1c2dda64fb6f25ed248e8f06056d739dbea7 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 27 Jun 2022 08:10:28 -0700 Subject: [PATCH 465/817] [submodule] Advnace sonic-utilities pointer (#11248) Updating sonic-utilities submodule with the below commits f64d280 [sfpshow/sfputil] Enhance sfpshow and sfputil to behavior correctly on RJ45 ports 2f6a547 Image-installer: Fix duplication of image prefix cc775ab [generate dump] Move the Core/Log collection to the End of process Execution and removed default timeout 6dbb4bd Add an option in queue stat to display voq counters 248ddd5 Gives cisco-8000 more flexibility to easily add subcommnads under show platform 9f2607d [config reload] Fixing config reload when timer based services are disabled --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 05c79ef0842d..f64d2807381b 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 05c79ef0842deb93e05e3947c4179cb6e0c486e6 +Subproject commit f64d2807381bc4faf0b8d66c73b3a14b277d0408 From 19dcfd3328cc656606965ec223a9f421c1b270ec Mon Sep 17 00:00:00 2001 From: arista-nwolfe <94405414+arista-nwolfe@users.noreply.github.com> Date: Mon, 27 Jun 2022 15:53:57 -0400 Subject: [PATCH 466/817] Setting the soc property for num_sa_per_sc on macsec encrypt and decrypt (#11166) * Setting the soc property for num_sa_per_sc on macsec encrypt and decrypt * Changed decrypt from 2 to 4 to match broadcom's recommendations --- .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 3 +++ .../1/j2p-a7800r3a-36d-36x400G.config.bcm | 3 +++ src/sonic-device-data/tests/permitted_list | 2 ++ 3 files changed, 8 insertions(+) diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm index 84da5b8ab7a4..652815971716 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -995,3 +995,6 @@ serdes_tx_taps_33=nrz:-5:83:-22:0:0:0 serdes_tx_taps_34=nrz:-5:83:-22:0:0:0 serdes_tx_taps_35=nrz:-4:75:-21:0:0:0 serdes_tx_taps_36=nrz:-8:89:-29:0:0:0 + +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm index 84b62055b92b..fe67582df2f5 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm @@ -994,3 +994,6 @@ serdes_tx_taps_33=nrz:-5:75:-20:0:0:0 serdes_tx_taps_34=nrz:-5:75:-20:0:0:0 serdes_tx_taps_35=nrz:-5:80:-23:0:0:0 serdes_tx_taps_36=nrz:-7:85:-25:0:0:0 + +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 29f18c772337..0ef2b8a467e1 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -315,3 +315,5 @@ phy_pcs_repeater l3_alpm_hit_skip phy_an_lt_msft system_ref_core_clock_khz +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt \ No newline at end of file From b756e2971c807801d7d810515394fd59d8ea6e18 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Guruswamy <75792349+sg893052@users.noreply.github.com> Date: Tue, 28 Jun 2022 02:24:08 +0530 Subject: [PATCH 467/817] Upgrade broadcom platform containers(syncd/ saiserver/ syncd-rpc/ syncd-dnx-rpc) to bullseye (#10864) --- platform/broadcom/docker-saiserver-brcm.mk | 4 ++-- platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 | 2 +- platform/broadcom/docker-syncd-brcm-dnx-rpc.mk | 2 +- .../broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 | 4 ++-- platform/broadcom/docker-syncd-brcm-dnx.mk | 10 +++++----- platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 | 2 +- platform/broadcom/docker-syncd-brcm-rpc.mk | 2 +- platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 | 4 ++-- platform/broadcom/docker-syncd-brcm.mk | 2 +- platform/broadcom/docker-syncd-brcm/Dockerfile.j2 | 2 +- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/platform/broadcom/docker-saiserver-brcm.mk b/platform/broadcom/docker-saiserver-brcm.mk index f4f9cdd42a49..2ee39c8600e8 100644 --- a/platform/broadcom/docker-saiserver-brcm.mk +++ b/platform/broadcom/docker-saiserver-brcm.mk @@ -4,9 +4,9 @@ DOCKER_SAISERVER_BRCM = docker-saiserver$(SAITHRIFT_VER)-brcm.gz $(DOCKER_SAISERVER_BRCM)_PATH = $(PLATFORM_PATH)/docker-saiserver-brcm $(DOCKER_SAISERVER_BRCM)_DEPENDS += $(SAISERVER) $(DOCKER_SAISERVER_BRCM)_FILES += $(DSSERVE) $(BCMCMD) -$(DOCKER_SAISERVER_BRCM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_SAISERVER_BRCM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) SONIC_DOCKER_IMAGES += $(DOCKER_SAISERVER_BRCM) -SONIC_BUSTER_DOCKERS += $(DOCKER_SAISERVER_BRCM) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SAISERVER_BRCM) #Support two versions of saiserver $(DOCKER_SAISERVER_BRCM)_CONTAINER_NAME = saiserver$(SAITHRIFT_VER) diff --git a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 index d77eb46b6aa3..782320a4b39b 100644 --- a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/broadcom/docker-syncd-brcm-dnx-rpc.mk b/platform/broadcom/docker-syncd-brcm-dnx-rpc.mk index 111071128c97..a7ca064b0912 100644 --- a/platform/broadcom/docker-syncd-brcm-dnx-rpc.mk +++ b/platform/broadcom/docker-syncd-brcm-dnx-rpc.mk @@ -30,4 +30,4 @@ $(DOCKER_SYNCD_BRCM_DNX_RPC)_BASE_IMAGE_FILES += bcmcmd:/usr/bin/bcmcmd $(DOCKER_SYNCD_BRCM_DNX_RPC)_BASE_IMAGE_FILES += bcmsh:/usr/bin/bcmsh $(DOCKER_SYNCD_BRCM_DNX_RPC)_MACHINE = broadcom-dnx -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_BRCM_DNX_RPC) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_BRCM_DNX_RPC) diff --git a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 index c476f2823211..868b0603e11e 100644 --- a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 @@ -15,7 +15,7 @@ RUN apt-get purge -y syncd RUN apt-get update \ && apt-get -y install \ net-tools \ - python-pip \ + python3-pip \ python-setuptools \ build-essential \ libssl-dev \ @@ -25,7 +25,7 @@ RUN apt-get update \ cmake \ libqt5core5a \ libqt5network5 \ - libboost-atomic1.71.0 + libboost-atomic1.74.0 RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ {% for deb in docker_syncd_brcm_dnx_rpc_debs.split(' ') -%} diff --git a/platform/broadcom/docker-syncd-brcm-dnx.mk b/platform/broadcom/docker-syncd-brcm-dnx.mk index 2cf89f18753a..4cba4867c9ca 100644 --- a/platform/broadcom/docker-syncd-brcm-dnx.mk +++ b/platform/broadcom/docker-syncd-brcm-dnx.mk @@ -7,9 +7,9 @@ DOCKER_SYNCD_DNX_PLATFORM_CODE = brcm-dnx $(DOCKER_SYNCD_DNX_BASE)_PATH = $(PLATFORM_PATH)/docker-syncd-$(DOCKER_SYNCD_DNX_PLATFORM_CODE) $(DOCKER_SYNCD_DNX_BASE)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -$(DOCKER_SYNCD_DNX_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) -$(DOCKER_SYNCD_DNX_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) -$(DOCKER_SYNCD_DNX_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_SYNCD_DNX_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) +$(DOCKER_SYNCD_DNX_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_SYNCD_DNX_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_DNX_BASE) ifneq ($(ENABLE_SYNCD_RPC),y) @@ -47,5 +47,5 @@ $(DOCKER_SYNCD_DNX_BASE)_BASE_IMAGE_FILES += bcmcmd:/usr/bin/bcmcmd $(DOCKER_SYNCD_DNX_BASE)_BASE_IMAGE_FILES += bcmsh:/usr/bin/bcmsh $(DOCKER_SYNCD_DNX_BASE)_BASE_IMAGE_FILES += bcm_common:/usr/bin/bcm_common -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_DNX_BASE) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_SYNCD_DNX_BASE_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_DNX_BASE) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_SYNCD_DNX_BASE_DBG) diff --git a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 index 95d3db54b11e..230c2628f41d 100755 --- a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name diff --git a/platform/broadcom/docker-syncd-brcm-rpc.mk b/platform/broadcom/docker-syncd-brcm-rpc.mk index 49c664819f8b..95810f1cb477 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc.mk +++ b/platform/broadcom/docker-syncd-brcm-rpc.mk @@ -29,4 +29,4 @@ $(DOCKER_SYNCD_BRCM_RPC)_BASE_IMAGE_FILES += bcmcmd:/usr/bin/bcmcmd $(DOCKER_SYNCD_BRCM_RPC)_BASE_IMAGE_FILES += bcmsh:/usr/bin/bcmsh $(DOCKER_SYNCD_BRCM_RPC)_MACHINE = broadcom -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_BRCM_RPC) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_BRCM_RPC) diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 6e5a3d6dadc5..3517b037a40a 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -15,7 +15,7 @@ RUN apt-get purge -y syncd RUN apt-get update \ && apt-get -y install \ net-tools \ - python-pip \ + python3-pip \ python-setuptools \ build-essential \ libssl-dev \ @@ -25,7 +25,7 @@ RUN apt-get update \ cmake \ libqt5core5a \ libqt5network5 \ - libboost-atomic1.71.0 + libboost-atomic1.74.0 RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ {% for deb in docker_syncd_brcm_rpc_debs.split(' ') -%} diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index cb4ee813d914..315c27a416d8 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -1,7 +1,7 @@ # docker image for brcm syncd DOCKER_SYNCD_PLATFORM_CODE = brcm -include $(PLATFORM_PATH)/../template/docker-syncd-base.mk +include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(DOCKER_SYNCD_BASE)_DEPENDS += $(BRCM_XGS_SAI) diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index e8f9c8c86a97..6900e7c933b5 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name From d18ff262a076f33e1064a4571b916914b7dc1230 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Mon, 27 Jun 2022 23:59:23 +0000 Subject: [PATCH 468/817] advance submodule sonic-swss (#11260) 2022-06-24 93af69c: [PFC_WD] Avoid applying ZeroBuffer Profiles to ingress PG when a PFC storm is detected (Azure/sonic-swss#2304) 2022-06-24 37349cf: [swssconfig] Optimize performance of swssconfig (Azure/sonic-swss#2336) 2022-06-24 84e9b07: [fdborch] fix heap-use-after-free in clearFdbEntry() (Azure/sonic-swss#2353) 2022-06-24 1b8bd94: Create ACL table fails due to incorrect check for supported ACL actions #11235 (Azure/sonic-swss#2351) 2022-06-24 1ed0b4b: [macsec] Refactor the logic of macsec name map (Azure/sonic-swss#2348) 2022-06-23 f88f992: [mock_tests] Add Sflow Orch UTs (Azure/sonic-swss#2295) 2022-06-23 ec57bf1: [macsec] Update macsec flex counter (Azure/sonic-swss#2338) 2022-06-22 6e0fc85: [ACL] Support stage particular match fields (Azure/sonic-swss#2341) 2022-06-22 efb4530: [orchagent, DTel]: report session support to set user vrf (Azure/sonic-swss#2326) 2022-06-22 d82874d: Fix for "orchagent crashed when trying to delete fdb static entry with swssconfig #11046" (Azure/sonic-swss#2332) 2022-06-22 0c789e6: Fix qos map test in vs test (Azure/sonic-swss#2343) 2022-06-17 1bb5070: Enhance mock test for dynamic buffer manager for port removing and qos reload flows (Azure/sonic-swss#2262) 2022-06-16 700492f: [aclorch] Fix and simplify DTel watchlist tables and entries (Azure/sonic-swss#2155) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 59f77eae01ee..93af69c5cb9a 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 59f77eae01ee2b906244c1323014be0b1c649b40 +Subproject commit 93af69c5cb9a78465604974b59d1b1ed709d2b10 From 94556d3953a1547a709c60cd1fecc4458910b301 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Tue, 28 Jun 2022 09:29:59 +0800 Subject: [PATCH 469/817] [submodule]: Update submodule for wpa-supplicant (#11264) 3f43852b8 [sonic_operators.cpp]: Increasing select timeout (#55) a1142e251 [sonic_operators.cpp] Update sonic_db_manager::get_counter (#56) 1069d2dd4 [sonic_operators.cpp]: Fixbug wait with false positive to return success (#54) Signed-off-by: Ze Gan --- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 1069d2dd4f71..3f43852b8ccd 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 1069d2dd4f7108838246abe2b8f693180c972acd +Subproject commit 3f43852b8ccd5d2a0877c86b82d227893e4566d4 From 8dbfb0aebbabb01624785677d73dc00da0e18ffd Mon Sep 17 00:00:00 2001 From: Vivek Date: Mon, 27 Jun 2022 18:38:48 -0700 Subject: [PATCH 470/817] [submodule]update sonic-swss submodule (#11253) Swss commits: 93af69c [PFC_WD] Avoid applying ZeroBuffer Profiles to ingress PG when a PFC storm is detected (#2304) 37349cf [swssconfig] Optimize performance of swssconfig (#2336) 84e9b07 [fdborch] fix heap-use-after-free in clearFdbEntry() (#2353) 1b8bd94 Create ACL table fails due to incorrect check for supported ACL actions #11235 (#2351) 1ed0b4b [macsec] Refactor the logic of macsec name map (#2348) f88f992 [mock_tests] Add Sflow Orch UTs (#2295) ec57bf1 [macsec] Update macsec flex counter (#2338) 6e0fc85 [ACL] Support stage particular match fields (#2341) efb4530 [orchagent, DTel]: report session support to set user vrf (#2326) d82874d Fix for "orchagent crashed when trying to delete fdb static entry with swssconfig #11046" (#2332) 0c789e6 Fix qos map test in vs test (#2343) 1bb5070 Enhance mock test for dynamic buffer manager for port removing and qos reload flows (#2262) 700492f [aclorch] Fix and simplify DTel watchlist tables and entries (#2155) Signed-off-by: Vivek Reddy Karri From 542cc0838c9f6415b9aabaf69a6870dd369df00c Mon Sep 17 00:00:00 2001 From: Jing Kan <672454911@qq.com> Date: Tue, 28 Jun 2022 20:14:53 +0800 Subject: [PATCH 471/817] [minigraph] Support parse IPv6 in device_desc.xml (#11095) Signed-off-by: Jing Kan jika@microsoft.com --- src/sonic-config-engine/minigraph.py | 27 +++++++++++++------ .../simple-sample-device-desc-ipv6-only.xml | 11 ++++++++ .../tests/simple-sample-device-desc.xml | 11 ++++++++ .../tests/test_minigraph_case.py | 21 +++++++++++++-- 4 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml create mode 100644 src/sonic-config-engine/tests/simple-sample-device-desc.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index b1ad117d255c..15d6682359f3 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -87,6 +87,7 @@ def parse_device(device): lo_prefix = None lo_prefix_v6 = None mgmt_prefix = None + mgmt_prefix_v6 = None d_type = None # don't shadow type() hwsku = None name = None @@ -101,6 +102,8 @@ def parse_device(device): lo_prefix_v6 = node.find(str(QName(ns2, "IPPrefix"))).text elif node.tag == str(QName(ns, "ManagementAddress")): mgmt_prefix = node.find(str(QName(ns2, "IPPrefix"))).text + elif node.tag == str(QName(ns, "ManagementAddressV6")): + mgmt_prefix_v6 = node.find(str(QName(ns2, "IPPrefix"))).text elif node.tag == str(QName(ns, "Hostname")): name = node.text elif node.tag == str(QName(ns, "HwSku")): @@ -117,7 +120,7 @@ def parse_device(device): if d_type is None and str(QName(ns3, "type")) in device.attrib: d_type = device.attrib[str(QName(ns3, "type"))] - return (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, d_subtype) + return (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, d_subtype) def calculate_lcm_for_ecmp (nhdevices_bank_map, nhip_bank_map): @@ -254,7 +257,7 @@ def parse_png(png, hname, dpg_ecmp_content = None): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): - (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, d_subtype) = parse_device(device) + (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, d_subtype) = parse_device(device) device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku} if cluster: device_data['cluster'] = cluster @@ -387,7 +390,7 @@ def parse_asic_png(png, asic_name, hostname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): - (lo_prefix, lo_prefix_v6, mgmt_prefix, name, hwsku, d_type, deployment_id, cluster, _) = parse_device(device) + (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, _) = parse_device(device) device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } if cluster: device_data['cluster'] = cluster @@ -1836,7 +1839,7 @@ def get_mux_cable_entries(mux_cable_ports, neighbors, devices): def parse_device_desc_xml(filename): root = ET.parse(filename).getroot() - (lo_prefix, lo_prefix_v6, mgmt_prefix, hostname, hwsku, d_type, _, _, _) = parse_device(root) + (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, hostname, hwsku, d_type, _, _, _) = parse_device(root) results = {} results['DEVICE_METADATA'] = {'localhost': { @@ -1848,10 +1851,18 @@ def parse_device_desc_xml(filename): if lo_prefix_v6: results['LOOPBACK_INTERFACE'] = {('lo_v6', lo_prefix_v6): {}} - mgmt_intf = {} - mgmtipn = ipaddress.ip_network(UNICODE_TYPE(mgmt_prefix), False) - gwaddr = ipaddress.ip_address((next(mgmtipn.hosts()))) - results['MGMT_INTERFACE'] = {('eth0', mgmt_prefix): {'gwaddr': gwaddr}} + results['MGMT_INTERFACE'] = {} + if mgmt_prefix: + mgmtipn = ipaddress.ip_network(UNICODE_TYPE(mgmt_prefix), False) + if mgmtipn != ipaddress.ip_network(u'0.0.0.0/0', False): + gwaddr = ipaddress.ip_address((next(mgmtipn.hosts()))) + results['MGMT_INTERFACE'].update({('eth0', mgmt_prefix): {'gwaddr': gwaddr}}) + + if mgmt_prefix_v6: + mgmtipn_v6 = ipaddress.ip_network(UNICODE_TYPE(mgmt_prefix_v6), False) + if mgmtipn != ipaddress.ip_network(u'::/0', False): + gwaddr_v6 = ipaddress.ip_address((next(mgmtipn_v6.hosts()))) + results['MGMT_INTERFACE'].update({('eth0', mgmt_prefix_v6): {'gwaddr': gwaddr_v6}}) return results diff --git a/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml b/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml new file mode 100644 index 000000000000..c35d2354a900 --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-device-desc-ipv6-only.xml @@ -0,0 +1,11 @@ + + switch-t0 + Force10-S6000 + AAA00PrdStr00 + + 0.0.0.0/0 + + + FC00:1::32/64 + + diff --git a/src/sonic-config-engine/tests/simple-sample-device-desc.xml b/src/sonic-config-engine/tests/simple-sample-device-desc.xml new file mode 100644 index 000000000000..72941dfcd9b6 --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-device-desc.xml @@ -0,0 +1,11 @@ + + switch-t0 + Force10-S6000 + AAA00PrdStr00 + + 10.0.0.100/24 + + + FC00:1::32/64 + + diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index b4756219399d..16ad019032f2 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -1,6 +1,7 @@ import json import os import subprocess +import ipaddress import tests.common_utils as utils import minigraph @@ -21,6 +22,8 @@ def setUp(self): self.sample_simple_graph = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.sample_resource_graph = os.path.join(self.test_dir, 'sample-graph-resource-type.xml') self.sample_subintf_graph = os.path.join(self.test_dir, 'sample-graph-subintf.xml') + self.sample_simple_device_desc = os.path.join(self.test_dir, 'simple-sample-device-desc.xml') + self.sample_simple_device_desc_ipv6_only = os.path.join(self.test_dir, 'simple-sample-device-desc-ipv6-only.xml') self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') def run_script(self, argument, check_stderr=False): @@ -463,5 +466,19 @@ def test_minigraph_mirror_dscp(self): expected_ports.sort() ) - - + def test_parse_device_desc_xml_mgmt_interface(self): + # Regular device_desc.xml with both IPv4 and IPv6 mgmt address + result = minigraph.parse_device_desc_xml(self.sample_simple_device_desc) + mgmt_intf = result['MGMT_INTERFACE'] + self.assertEqual(len(mgmt_intf.keys()), 2) + self.assertTrue(('eth0', '10.0.0.100/24') in mgmt_intf.keys()) + self.assertTrue(('eth0', 'FC00:1::32/64') in mgmt_intf.keys()) + self.assertTrue(ipaddress.ip_address(u'10.0.0.1') == mgmt_intf[('eth0', '10.0.0.100/24')]['gwaddr']) + self.assertTrue(ipaddress.ip_address(u'fc00:1::1') == mgmt_intf[('eth0', 'FC00:1::32/64')]['gwaddr']) + + # Special device_desc.xml with IPv6 mgmt address only + result = minigraph.parse_device_desc_xml(self.sample_simple_device_desc_ipv6_only) + mgmt_intf = result['MGMT_INTERFACE'] + self.assertEqual(len(mgmt_intf.keys()), 1) + self.assertTrue(('eth0', 'FC00:1::32/64') in mgmt_intf.keys()) + self.assertTrue(ipaddress.ip_address(u'fc00:1::1') == mgmt_intf[('eth0', 'FC00:1::32/64')]['gwaddr']) From 0ced7081c7abf472577d9b8503993edaae0fab3c Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:45:52 +0300 Subject: [PATCH 472/817] [asan] add print_suppressions=0 to ASAN configs (#11252) - Why I did it To provide an ability to suppress ASAN false positives and have a clean ASAN report for docker-sonic-vs/mlnx-syncd/orchagent docker - How I did it Added the "print_suppressions=0" to ASAN configs. - How to verify it add a suppression to some ASAN-enabled component (the suppression should catch some leak) build with ENABLE_ASAN=y run a test and see that the ASAN report is empty instead of having the suppression summary Signed-off-by: Yakiv Huryk --- dockers/docker-orchagent/supervisord.conf.j2 | 31 +++++++------- .../docker-syncd-mlnx/supervisord.conf.j2 | 3 +- .../vs/docker-sonic-vs/supervisord.conf.j2 | 41 ++++++++++--------- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/dockers/docker-orchagent/supervisord.conf.j2 b/dockers/docker-orchagent/supervisord.conf.j2 index 7cd31a113223..9751a58bb833 100644 --- a/dockers/docker-orchagent/supervisord.conf.j2 +++ b/dockers/docker-orchagent/supervisord.conf.j2 @@ -36,6 +36,7 @@ dependent_startup=true {% set orchagent_dependent_startup_wait_for = "rsyslogd:running" %} {%- endif %} {%- endif %} +{% set asan_extra_options = ':print_suppressions=0' %} {% if is_fabric_asic == 0 %} [program:gearsyncd] @@ -50,7 +51,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=rsyslogd:running {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/gearsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/gearsyncd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -65,7 +66,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=rsyslogd:running {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/portsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/portsyncd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -79,7 +80,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for={{ orchagent_dependent_startup_wait_for }} {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/orchagent-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/orchagent-asan.log{{ asan_extra_options }}" {% endif %} [program:swssconfig] @@ -94,7 +95,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=orchagent:running {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/swssconfig-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/swssconfig-asan.log{{ asan_extra_options }}" {% endif %} {% if is_fabric_asic == 0 %} @@ -124,7 +125,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=orchagent:running {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/coppmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/coppmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -139,7 +140,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/neighsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/neighsyncd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -154,7 +155,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vlanmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vlanmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -169,7 +170,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/intfmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/intfmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -184,7 +185,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/portmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/portmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -199,7 +200,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/buffermgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/buffermgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -214,7 +215,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vrfmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vrfmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -229,7 +230,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/nbrmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/nbrmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -244,7 +245,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vxlanmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vxlanmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -259,7 +260,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/tunnelmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/tunnelmgrd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} @@ -284,7 +285,7 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=swssconfig:exited {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 b/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 index cc07096b20c6..a6c7e8121ab8 100644 --- a/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf.j2 @@ -1,3 +1,4 @@ +{% set asan_extra_options = ':print_suppressions=0' %} [supervisord] logfile_maxbytes=1MB logfile_backups=2 @@ -38,5 +39,5 @@ stderr_logfile=syslog dependent_startup=true dependent_startup_wait_for=rsyslogd:running {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log{{ asan_extra_options }}" {% endif %} diff --git a/platform/vs/docker-sonic-vs/supervisord.conf.j2 b/platform/vs/docker-sonic-vs/supervisord.conf.j2 index a49f33866edf..ba63d2b77dda 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf.j2 +++ b/platform/vs/docker-sonic-vs/supervisord.conf.j2 @@ -1,3 +1,4 @@ +{% set asan_extra_options = ':print_suppressions=0' %} [supervisord] logfile_maxbytes=1MB logfile_backups=2 @@ -43,7 +44,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/syncd-asan.log{{ asan_extra_options }}" {% endif %} [program:gbsyncd] @@ -71,7 +72,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/portsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/portsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:orchagent] @@ -82,7 +83,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/orchagent-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/orchagent-asan.log{{ asan_extra_options }}" {% endif %} [program:coppmgrd] @@ -93,7 +94,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/coppmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/coppmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:neighsyncd] @@ -104,7 +105,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/neighsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/neighsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:teamsyncd] @@ -115,7 +116,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/teamsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/teamsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:vlanmgrd] @@ -126,7 +127,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vlanmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vlanmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:intfmgrd] @@ -137,7 +138,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/intfmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/intfmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:portmgrd] @@ -148,7 +149,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/portmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/portmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:teammgrd] @@ -159,7 +160,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/teammgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/teammgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:zebra] @@ -194,7 +195,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/fpmsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/fpmsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:arp_update] @@ -213,7 +214,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/buffermgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/buffermgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:vrfmgrd] @@ -224,7 +225,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vrfmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vrfmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:restore_neighbors] @@ -245,7 +246,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/nbrmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/nbrmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:vxlanmgrd] @@ -256,7 +257,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/vxlanmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/vxlanmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:sflowmgrd] @@ -267,7 +268,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/sflowmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/sflowmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:natmgrd] @@ -278,7 +279,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/natmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/natmgrd-asan.log{{ asan_extra_options }}" {% endif %} [program:natsyncd] @@ -289,7 +290,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/natsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/natsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:fdbsyncd] @@ -300,7 +301,7 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log{{ asan_extra_options }}" {% endif %} [program:tunnelmgrd] @@ -311,5 +312,5 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% if ENABLE_ASAN == "y" %} -environment=ASAN_OPTIONS="log_path=/var/log/asan/tunnelmgrd-asan.log" +environment=ASAN_OPTIONS="log_path=/var/log/asan/tunnelmgrd-asan.log{{ asan_extra_options }}" {% endif %} From 865be7ba8538ae332cd2233851f36925bf1b6c61 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 28 Jun 2022 23:48:10 +0800 Subject: [PATCH 473/817] =?UTF-8?q?[system-health]=20Fix=20error=20log=20s?= =?UTF-8?q?ystem=5Fservice'state'=20while=20doing=20confi=E2=80=A6=20(#112?= =?UTF-8?q?25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Why I did it While doing config reload, FEATURE table may be removed and re-add. During this process, updating FEATURE table is not atomic. It could be that the FEATURE table has entry, but each entry has no field. This PR introduces a retry mechanism to avoid this. - How I did it Introduces a retry mechanism to avoid this. - How to verify it New unit test added to verify the flow as well as running some manual test. --- .../health_checker/sysmonitor.py | 43 ++++++++++++++++--- src/system-health/tests/test_system_health.py | 20 +++++++++ 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/system-health/health_checker/sysmonitor.py b/src/system-health/health_checker/sysmonitor.py index a4058f8c09d3..e69d289fc537 100755 --- a/src/system-health/health_checker/sysmonitor.py +++ b/src/system-health/health_checker/sysmonitor.py @@ -2,6 +2,7 @@ import os import sys +import time import glob import multiprocessing from datetime import datetime @@ -145,12 +146,7 @@ def get_all_service_list(self): dir_list += [os.path.basename(i) for i in glob.glob('{}/*.service'.format(path))] #add the enabled docker services from config db feature table - feature_table = self.config_db.get_table("FEATURE") - for srv in feature_table.keys(): - if feature_table[srv]["state"] not in ["disabled", "always_disabled"]: - srvext = srv + ".service" - if srvext not in dir_list: - dir_list.append(srvext) + self.get_service_from_feature_table(dir_list) self.config.load_config() if self.config and self.config.ignore_services: @@ -161,6 +157,41 @@ def get_all_service_list(self): dir_list.sort() return dir_list + def get_service_from_feature_table(self, dir_list): + """Get service from CONFIG DB FEATURE table. During "config reload" command, filling FEATURE table + is not an atomic operation, sonic-cfggen do it with two steps: + 1. Add an empty table entry to CONFIG DB + 2. Add all fields to the table + + So, if system health read db on middle of step 1 and step 2, it might read invalid data. A retry + mechanism is here to avoid such issue. + + Args: + dir_list (list): service list + """ + max_retry = 3 + retry_delay = 1 + success = True + + while max_retry > 0: + success = True + feature_table = self.config_db.get_table("FEATURE") + for srv, fields in feature_table.items(): + if 'state' not in fields: + success = False + logger.log_warning("FEATURE table is not fully ready: {}, retrying".format(feature_table)) + break + if fields["state"] not in ["disabled", "always_disabled"]: + srvext = srv + ".service" + if srvext not in dir_list: + dir_list.append(srvext) + if not success: + max_retry -= 1 + time.sleep(retry_delay) + else: + break + if not success: + logger.log_error("FEATURE table is not fully ready: {}, max retry reached".format(feature_table)) #Checks FEATURE table from config db for the service' check_up_status flag #if marked to true, then read the service up_status from FEATURE table of state db. diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index 76f3ceea5d3f..d58c69bececa 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -720,3 +720,23 @@ def test_system_service(): sysmon.task_run() assert sysmon._task_process is not None sysmon.task_stop() + + +def test_get_service_from_feature_table(): + sysmon = Sysmonitor() + sysmon.config_db = MagicMock() + sysmon.config_db.get_table = MagicMock() + sysmon.config_db.get_table.side_effect = [ + { + 'bgp': {}, + 'swss': {} + }, + { + 'bgp': {'state': 'enabled'}, + 'swss': {'state': 'disabled'} + } + ] + dir_list = [] + sysmon.get_service_from_feature_table(dir_list) + assert 'bgp.service' in dir_list + assert 'swss.service' not in dir_list From ac86f71287ff03e3a37de892f93ea2a2c5c30adc Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Wed, 29 Jun 2022 03:50:33 +0800 Subject: [PATCH 474/817] Add extra lossy PG profile for ports between T1 and T2 (#11157) Signed-off-by: bingwang Why I did it This PR brings two changes Add lossy PG profile for PG2 and PG6 on T1 for ports between T1 and T2. After PR Update qos config to clear queues for bounced back traffic #10176 , the DSCP_TO_TC_MAP and TC_TO_PG_MAP is updated when remapping is enable DSCP_TO_TC_MAP Before After Why do this change "2" : "1" "2" : "2" Only change for leaf router to map DSCP 2 to TC 2 as TC 2 will be used for lossless TC "6" : "1" "6" : "6" Only change for leaf router to map DSCP 6 to TC 6 as TC 6 will be used for lossless TC TC_TO_PRIORITY_GROUP_MAP Before After Why do this change "2" : "0" "2" : "2" Only change for leaf router to map TC 2 to PG 2 as PG 2 will be used for lossless PG "6" : "0" "6" : "6" Only change for leaf router to map TC 6 to PG 6 as PG 6 will be used for lossless PG So, we have two new lossy PGs (2 and 6) for the T2 facing ports on T1, and two new lossless PGs (2 and 6) for the T0 facing port on T1. However, there is no lossy PG profile for the T2 facing ports on T1. The lossless PGs for ports between T1 and T0 have been handled by buffermgrd .Therefore, We need to add lossy PG profiles for T2 facing ports on T1. We don't have this issue on T0 because PG 2 and PG 6 are lossless PGs, and there is no lossy traffic mapped to PG 2 and PG 6 Map port level TC7 to PG0 Before the PCBB change, DSCP48 -> TC 6 -> PG 0. After the PCBB change, DSCP48 -> TC 7 -> PG 7 Actually, we can map TC7 to PG0 to save a lossy PG. How I did it Update the qos and buffer template. How to verify it Verified by UT. --- .../Arista-7050CX3-32S-D48C8/qos.json.j2 | 2 +- .../Arista-7260CX3-C64/buffers_defaults_t1.j2 | 8 +++- .../Arista-7260CX3-C64/buffers_extra_pgs.j2 | 20 ++++++++ .../Arista-7260CX3-C64/qos.json.j2 | 4 +- .../Arista-7260CX3-Q64/buffers_defaults_t1.j2 | 8 +++- .../Arista-7260CX3-Q64/buffers_extra_pgs.j2 | 1 + files/build_templates/buffers_config.j2 | 4 ++ .../py3/buffer-arista7260-t1.json | 48 +++++++++++++++++++ .../py3/qos-arista7050cx3-dualtor.json | 2 +- .../py3/qos-arista7260-dualtor.json | 2 +- .../sample_output/py3/qos-arista7260-t1.json | 2 +- 11 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 index e0aca4f8dd8b..6719911b29e5 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 @@ -145,7 +145,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7", + "7": "0", "8": "0" }, "AZURE_TUNNEL": { diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 index c5d390668a33..469f5fc4001a 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 @@ -55,8 +55,12 @@ }, {%- endmacro %} -{% import 'buffers_extra_queues.j2' as defs with context %} +{% import 'buffers_extra_queues.j2' as defs1 with context %} +{% import 'buffers_extra_pgs.j2' as defs2 with context %} {%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} +{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} +{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} {%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 new file mode 100644 index 000000000000..73c1c1a9b30e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 @@ -0,0 +1,20 @@ +{% if DEVICE_METADATA is defined and 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' %} +{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pg) %} + "BUFFER_PG": { +{% for port in port_names.split(',') %} +{% if port not in port_names_require_no_extra_pg.split(',') %} + "{{ port }}|2": { + "profile" : "ingress_lossy_profile" + }, + "{{ port }}|6": { + "profile" : "ingress_lossy_profile" + }, +{% endif %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, +{% endmacro %} +{% endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 index 4d82382817cb..cb3ad17faa39 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -79,7 +79,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7" + "7": "0" } }, {%- endmacro %} @@ -230,7 +230,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7", + "7": "0", "8": "0" }, "AZURE_TUNNEL": { diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 index f531b5e208e9..c73fde73562b 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 @@ -49,8 +49,12 @@ }, {%- endmacro %} -{% import 'buffers_extra_queues.j2' as defs with context %} +{% import 'buffers_extra_queues.j2' as defs1 with context %} +{% import 'buffers_extra_pgs.j2' as defs2 with context %} {%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} +{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} +{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} {%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 new file mode 120000 index 000000000000..7dfb03cbc9d0 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_extra_pgs.j2 \ No newline at end of file diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index 814e470d0211..f03a7f9f63e3 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -172,6 +172,10 @@ def {{ defs.generate_pg_profils(port_names_active) }} {% elif defs.generate_pg_profiles_with_inactive_ports is defined %} {{ defs.generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) }}, +{% elif (defs.generate_pg_buffers_with_extra_lossy_pgs is defined) and (port_names_extra_queues != '') %} +{{ defs.generate_pg_buffers_with_extra_lossy_pgs(port_names_active, port_names_extra_queues) }} +{% elif (defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports is defined) and (port_names_extra_queues != '') %} +{{ defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }} {% else %} "BUFFER_PG": { {% for port in PORT_ACTIVE %} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json index 702076249ac6..1ce8a99e4fb7 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json @@ -112,9 +112,21 @@ "Ethernet0|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet0|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet0|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet4|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet4|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet144|0": { "profile" : "ingress_lossy_profile" }, @@ -124,9 +136,21 @@ "Ethernet16|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet16|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet20|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet20|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet152|0": { "profile" : "ingress_lossy_profile" }, @@ -136,9 +160,21 @@ "Ethernet64|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet64|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet68|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet68|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet168|0": { "profile" : "ingress_lossy_profile" }, @@ -148,9 +184,21 @@ "Ethernet80|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet80|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet84|0": { "profile" : "ingress_lossy_profile" }, + "Ethernet84|2": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|6": { + "profile" : "ingress_lossy_profile" + }, "Ethernet180|0": { "profile" : "ingress_lossy_profile" }, diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json index a48656d57c0c..8e1d376f19db 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -178,7 +178,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7", + "7": "0", "8": "0" }, "AZURE_TUNNEL": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index cad403c93d2e..85339be6d10d 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -178,7 +178,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7", + "7": "0", "8": "0" }, "AZURE_TUNNEL": { diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json index f850e3285bef..eff232ab179d 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json @@ -100,7 +100,7 @@ "4": "4", "5": "0", "6": "6", - "7": "7" + "7": "0" } }, "SCHEDULER": { From 1720fa21d990758121f96f490ead3ecc7f16207c Mon Sep 17 00:00:00 2001 From: yozhao101 <56170650+yozhao101@users.noreply.github.com> Date: Tue, 28 Jun 2022 17:29:02 -0700 Subject: [PATCH 475/817] [tunnel_packet_handler] Add a whitespace in the warning syslog message. (#11232) *This PR aims to add a whitespace in the warning syslog message of process tunnel_packet_handler. Signed-off-by: Yong Zhao --- dockers/docker-orchagent/tunnel_packet_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/tunnel_packet_handler.py b/dockers/docker-orchagent/tunnel_packet_handler.py index 682316eb6d49..3d75fdd94a0c 100755 --- a/dockers/docker-orchagent/tunnel_packet_handler.py +++ b/dockers/docker-orchagent/tunnel_packet_handler.py @@ -192,7 +192,7 @@ def get_ipinip_tunnel_addrs(self): peer_switch = self.config_db.get_keys(PEER_SWITCH_TABLE)[0] tunnel = self.config_db.get_keys(TUNNEL_TABLE)[0] except IndexError: - logger.log_warning('PEER_SWITCH or TUNNEL table' + logger.log_warning('PEER_SWITCH or TUNNEL table ' 'not found in config DB') return None, None From 3ba9ae2405e97a2fcda74631f36377f922705b30 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Wed, 29 Jun 2022 00:15:05 -0400 Subject: [PATCH 476/817] [Mellanox] Add arch folder to SDK binary location (#11278) - Why I did it This is for the eventual support of multiple architectures for the mellanox platform. - How I did it Change the location of the binaries in Switch-SDK-drivers so that the path specifies the target architecture in addition to the target distribution that the debians are built for. This is the most straightforward way to separate binaries built against different architectures and selectively target them for installation in the mellanox SONiC image. - How to verify it Build SONiC for mellanox and verify it compiles successfully. --- platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers | 2 +- platform/mellanox/sdk.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers index 9f94bdfc2c7e..e9fa9a843702 160000 --- a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers +++ b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers @@ -1 +1 @@ -Subproject commit 9f94bdfc2c7e3670b5b959138f9d61d40e7cc1ea +Subproject commit e9fa9a843702aa55b13c8eb01c7a1f188e4a16a9 diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 0ecc6d6bf041..2412cf0ca705 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -15,7 +15,7 @@ # limitations under the License. # MLNX_SDK_BASE_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel/Switch-SDK-drivers/bin/ -MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/ +MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/$(CONFIGURED_ARCH)/ MLNX_SDK_VERSION = 4.5.2262 MLNX_SDK_ISSU_VERSION = 101 From e2396b46e93d61d58d0940be8713f655f80056c1 Mon Sep 17 00:00:00 2001 From: Nathan Cohen <66022536+nathcohe@users.noreply.github.com> Date: Wed, 29 Jun 2022 00:15:17 -0700 Subject: [PATCH 477/817] Updated git hash of sonic-utilities (#11247) Signed-off-by: Nathan J Cohen From 8b7d069880b016c6bfa95fd64e0daf0b3e4ce0a4 Mon Sep 17 00:00:00 2001 From: davidpil2002 <91657985+davidpil2002@users.noreply.github.com> Date: Wed, 29 Jun 2022 15:34:56 +0300 Subject: [PATCH 478/817] Add support for Password Hardening (#10323) - Why I did it New security feature for enforcing strong passwords when login or changing passwords of existing users into the switch. - How I did it By using mainly Linux package named pam-cracklib that support the enforcement of user passwords, the daemon named hostcfgd, will support add/modify password policies that enforce and strengthen the user passwords. - How to verify it Manually Verification- 1. Enable the feature, using the new sonic-cli command passw-hardening or manually add the password hardening table like shown in HLD by using redis-cli command 2. Change password policies manually like in step 1. Notes: password hardening CLI can be found in sonic-utilities repo- P.R: Add support for Password Hardening sonic-utilities#2121 code config path: config/plugins/sonic-passwh_yang.py code show path: show/plugins/sonic-passwh_yang.py 3. Create a new user (using adduser command) or modify an existing password by using passwd command in the terminal. And it will now request a strong password instead of default linux policies. Automatic Verification - Unitest: This PR contained unitest that cover: 1. test default init values of the feature in PAM files 2. test all the types of classes policies supported by the feature in PAM files 3. test aging policy configuration in PAM files --- .../build_templates/sonic_debian_extension.j2 | 3 + .../templates/common-password.j2 | 43 +++ src/sonic-host-services/scripts/hostcfgd | 211 ++++++++++- .../tests/hostcfgd/hostcfgd_passwh_test.py | 182 ++++++++++ .../PASSWORD_HARDENING/login.defs.old | 340 ++++++++++++++++++ .../common-password | 36 ++ .../login.defs | 340 ++++++++++++++++++ .../common-password | 39 ++ .../login.defs | 340 ++++++++++++++++++ .../common-password | 39 ++ .../login.defs | 340 ++++++++++++++++++ .../tests/hostcfgd/test_passwh_vectors.py | 244 +++++++++++++ 12 files changed, 2155 insertions(+), 2 deletions(-) create mode 100644 src/sonic-host-services-data/templates/common-password.j2 create mode 100755 src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password create mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs create mode 100644 src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 760ef2ebc422..d3caf046ccf9 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -266,6 +266,9 @@ fi sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/sonic-device-data_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# package for supporting password hardening +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install libpam-cracklib + # Install pam-tacplus and nss-tacplus sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libtac2_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f diff --git a/src/sonic-host-services-data/templates/common-password.j2 b/src/sonic-host-services-data/templates/common-password.j2 new file mode 100644 index 000000000000..c5fd3f889c24 --- /dev/null +++ b/src/sonic-host-services-data/templates/common-password.j2 @@ -0,0 +1,43 @@ +#THIS IS AN AUTO-GENERATED FILE +# +# /etc/pam.d/common-password - password-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define the services to be +# used to change user passwords. The default is pam_unix. + +# Explanation of pam_unix options: +# The "yescrypt" option enables +#hashed passwords using the yescrypt algorithm, introduced in Debian +#11. Without this option, the default is Unix crypt. Prior releases +#used the option "sha512"; if a shadow password hash will be shared +#between Debian 11 and older releases replace "yescrypt" with "sha512" +#for compatibility . The "obscure" option replaces the old +#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage +#for other options. + +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) + +{% if passw_policies %} +{% if passw_policies['state'] == 'enabled' %} +password requisite pam_cracklib.so retry=3 maxrepeat=0 {% if passw_policies['len_min'] %}minlen={{passw_policies['len_min']}}{% endif %} {% if passw_policies['upper_class'] %}ucredit=-1{% else %}ucredit=0{% endif %} {% if passw_policies['lower_class'] %}lcredit=-1{% else %}lcredit=0{% endif %} {% if passw_policies['digits_class'] %}dcredit=-1{% else %}dcredit=0{% endif %} {% if passw_policies['special_class'] %}ocredit=-1{% else %}ocredit=0{% endif %} {% if passw_policies['reject_user_passw_match'] %}reject_username{% endif %} enforce_for_root + +password required pam_pwhistory.so {% if passw_policies['history_cnt'] %}remember={{passw_policies['history_cnt']}}{% endif %} use_authtok enforce_for_root +{% endif %} +{% endif %} + +password [success=1 default=ignore] pam_unix.so obscure yescrypt +# here's the fallback if no module succeeds +password requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +password required pam_permit.so +# and here are more per-package modules (the "Additional" block) +# end of pam-auth-update config diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd index 41da37490be4..a82a630bfc0a 100755 --- a/src/sonic-host-services/scripts/hostcfgd +++ b/src/sonic-host-services/scripts/hostcfgd @@ -8,7 +8,7 @@ import sys import subprocess import syslog import signal - +import re import jinja2 from sonic_py_common import device_info from swsscommon.swsscommon import ConfigDBConnector, DBConnector, Table @@ -16,6 +16,8 @@ from swsscommon.swsscommon import ConfigDBConnector, DBConnector, Table # FILE PAM_AUTH_CONF = "/etc/pam.d/common-auth-sonic" PAM_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/common-auth-sonic.j2" +PAM_PASSWORD_CONF = "/etc/pam.d/common-password" +PAM_PASSWORD_CONF_TEMPLATE = "/usr/share/sonic/templates/common-password.j2" NSS_TACPLUS_CONF = "/etc/tacplus_nss.conf" NSS_TACPLUS_CONF_TEMPLATE = "/usr/share/sonic/templates/tacplus_nss.conf.j2" NSS_RADIUS_CONF = "/etc/radius_nss.conf" @@ -24,6 +26,16 @@ PAM_RADIUS_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_radius_auth.conf NSS_CONF = "/etc/nsswitch.conf" ETC_PAMD_SSHD = "/etc/pam.d/sshd" ETC_PAMD_LOGIN = "/etc/pam.d/login" +ETC_LOGIN_DEF = "/etc/login.defs" + +# Linux login.def default values (password hardening disable) +LINUX_DEFAULT_PASS_MAX_DAYS = 99999 +LINUX_DEFAULT_PASS_WARN_AGE = 7 + +ACCOUNT_NAME = 0 # index of account name +AGE_DICT = { 'MAX_DAYS': {'REGEX_DAYS': r'^PASS_MAX_DAYS[ \t]*(?P\d*)', 'DAYS': 'max_days', 'CHAGE_FLAG': '-M '}, + 'WARN_DAYS': {'REGEX_DAYS': r'^PASS_WARN_AGE[ \t]*(?P\d*)', 'DAYS': 'warn_days', 'CHAGE_FLAG': '-W '} + } PAM_LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_limits.j2" LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/limits.conf.j2" PAM_LIMITS_CONF = "/etc/pam.d/pam-limits-conf" @@ -85,8 +97,10 @@ def run_cmd(cmd, log_err=True, raise_exception=False): def is_true(val): if val == 'True' or val == 'true': return True - else: + elif val == 'False' or val == 'false': return False + syslog.syslog(syslog.LOG_ERR, "Failed to get bool value, instead val= {}".format(val)) + return False def is_vlan_sub_interface(ifname): @@ -867,6 +881,189 @@ class AaaCfg(object): .format(err.cmd, err.returncode, err.output)) +class PasswHardening(object): + def __init__(self): + self.passw_policies_default = {} + self.passw_policies = {} + + self.debug = False + self.trace = False + + def load(self, policies_conf): + for row in policies_conf: + self.passw_policies_update(row, policies_conf[row], modify_conf=False) + + self.modify_passw_conf_file() + + def passw_policies_update(self, key, data, modify_conf=True): + syslog.syslog(syslog.LOG_DEBUG, "passw_policies_update - key: {}".format(key)) + syslog.syslog(syslog.LOG_DEBUG, "passw_policies_update - data: {}".format(data)) + + if data == {}: + self.passw_policies = {} + else: + if 'reject_user_passw_match' in data: + data['reject_user_passw_match'] = is_true(data['reject_user_passw_match']) + if 'lower_class' in data: + data['lower_class'] = is_true(data['lower_class']) + if 'upper_class' in data: + data['upper_class'] = is_true(data['upper_class']) + if 'digits_class' in data: + data['digits_class'] = is_true(data['digits_class']) + if 'special_class' in data: + data['special_class'] = is_true(data['special_class']) + + if key == 'POLICIES': + self.passw_policies = data + + if modify_conf: + self.modify_passw_conf_file() + + def modify_single_file_inplace(self, filename, operations=None): + if operations: + cmd = "sed -i {0} {1}".format(' -i '.join(operations), filename) + syslog.syslog(syslog.LOG_DEBUG, "modify_single_file_inplace: cmd - {}".format(cmd)) + os.system(cmd) + + def set_passw_hardening_policies(self, passw_policies): + # Password Hardening flow + # When feature is enabled, the passw_policies from CONFIG_DB will be set in the pam files /etc/pam.d/common-password and /etc/login.def. + # When the feature is disabled, the files above will be generate with the linux default (without secured passw_policies). + syslog.syslog(syslog.LOG_DEBUG, "modify_conf_file: passw_policies - {}".format(passw_policies)) + + template_passwh_file = os.path.abspath(PAM_PASSWORD_CONF_TEMPLATE) + env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) + env.filters['sub'] = sub + template_passwh = env.get_template(template_passwh_file) + + # Render common-password file with passw hardening policies if any. Other render without them. + pam_passwh_conf = template_passwh.render(debug=self.debug, passw_policies=passw_policies) + + # Use rename(), which is atomic (on the same fs) to avoid empty file + with open(PAM_PASSWORD_CONF + ".tmp", 'w') as f: + f.write(pam_passwh_conf) + os.chmod(PAM_PASSWORD_CONF + ".tmp", 0o644) + os.rename(PAM_PASSWORD_CONF + ".tmp", PAM_PASSWORD_CONF) + + # Age policy + # When feature disabled or age policy disabled, expiry days policy should be as linux default, other, accoriding CONFIG_DB. + curr_expiration = LINUX_DEFAULT_PASS_MAX_DAYS + curr_expiration_warning = LINUX_DEFAULT_PASS_WARN_AGE + + if passw_policies: + if 'state' in passw_policies: + if passw_policies['state'] == 'enabled': + if 'expiration' in passw_policies: + if int(self.passw_policies['expiration']) != 0: # value '0' meaning age policy is disabled + # the logic is to modify the expiration time according the last updated modificatiion + # + curr_expiration = int(passw_policies['expiration']) + + if 'expiration_warning' in passw_policies: + if int(self.passw_policies['expiration_warning']) != 0: # value '0' meaning age policy is disabled + curr_expiration_warning = int(passw_policies['expiration_warning']) + + if self.is_passwd_aging_expire_update(curr_expiration, 'MAX_DAYS'): + # Set aging policy for existing users + self.passwd_aging_expire_modify(curr_expiration, 'MAX_DAYS') + + # Aging policy for new users + self.modify_single_file_inplace(ETC_LOGIN_DEF, ["\'/^PASS_MAX_DAYS/c\PASS_MAX_DAYS " +str(curr_expiration)+"\'"]) + + if self.is_passwd_aging_expire_update(curr_expiration_warning, 'WARN_DAYS'): + # Aging policy for existing users + self.passwd_aging_expire_modify(curr_expiration_warning, 'WARN_DAYS') + + # Aging policy for new users + self.modify_single_file_inplace(ETC_LOGIN_DEF, ["\'/^PASS_WARN_AGE/c\PASS_WARN_AGE " +str(curr_expiration_warning)+"\'"]) + + def passwd_aging_expire_modify(self, curr_expiration, age_type): + normal_accounts = self.get_normal_accounts() + if not normal_accounts: + syslog.syslog(syslog.LOG_ERR,"failed, no normal users found in /etc/passwd") + return + chage_flag = AGE_DICT[age_type]['CHAGE_FLAG'] + for normal_account in normal_accounts: + try: + chage_p_m = subprocess.Popen(('chage', chage_flag + str(curr_expiration), normal_account), stdout=subprocess.PIPE) + return_code_chage_p_m = chage_p_m.poll() + if return_code_chage_p_m != 0: + syslog.syslog(syslog.LOG_ERR, "failed: return code - {}".format(return_code_chage_p_m)) + + except subprocess.CalledProcessError as e: + syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(e.cmd, e.returncode, e.output)) + + def is_passwd_aging_expire_update(self, curr_expiration, age_type): + """ Function verify that the current age expiry policy values are equal from the old one + Return update_age_status 'True' value meaning that was a modification from the last time, and vice versa. + """ + update_age_status = False + days_num = None + regex_days = AGE_DICT[age_type]['REGEX_DAYS'] + days_type = AGE_DICT[age_type]['DAYS'] + if os.path.exists(ETC_LOGIN_DEF): + with open(ETC_LOGIN_DEF, 'r') as f: + login_def_data = f.readlines() + + for line in login_def_data: + m1 = re.match(regex_days, line) + if m1: + days_num = int(m1.group(days_type)) + break + + if curr_expiration != days_num: + update_age_status = True + + return update_age_status + + def get_normal_accounts(self): + # Get user list + try: + getent_out = subprocess.check_output(['getent', 'passwd']).decode('utf-8').split('\n') + except subprocess.CalledProcessError as err: + syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(err.cmd, err.returncode, err.output)) + return False + + # Get range of normal users + REGEX_UID_MAX = r'^UID_MAX[ \t]*(?P\d*)' + REGEX_UID_MIN = r'^UID_MIN[ \t]*(?P\d*)' + uid_max = None + uid_min = None + if os.path.exists(ETC_LOGIN_DEF): + with open(ETC_LOGIN_DEF, 'r') as f: + login_def_data = f.readlines() + + for line in login_def_data: + m1 = re.match(REGEX_UID_MAX, line) + m2 = re.match(REGEX_UID_MIN, line) + if m1: + uid_max = int(m1.group("uid_max")) + if m2: + uid_min = int(m2.group("uid_min")) + + if not uid_max or not uid_min: + syslog.syslog(syslog.LOG_ERR,"failed, no UID_MAX/UID_MIN founded in login.def file") + return False + + # Get normal user list + normal_accounts = [] + for account in getent_out[0:-1]: # last item is always empty + account_spl = account.split(':') + account_number = int(account_spl[2]) + if account_number >= uid_min and account_number <= uid_max: + normal_accounts.append(account_spl[ACCOUNT_NAME]) + + normal_accounts.append('root') # root is also a candidate to be age modify. + return normal_accounts + + def modify_passw_conf_file(self): + passw_policies = self.passw_policies_default.copy() + passw_policies.update(self.passw_policies) + + # set new Password Hardening policies. + self.set_passw_hardening_policies(passw_policies) + + class KdumpCfg(object): def __init__(self, CfgDb): self.config_db = CfgDb @@ -1090,6 +1287,9 @@ class HostConfigDaemon: self.hostname_cache="" self.aaacfg = AaaCfg() + # Initialize PasswHardening + self.passwcfg = PasswHardening() + # Initialize PamLimitsCfg self.pamLimitsCfg = PamLimitsCfg(self.config_db) self.pamLimitsCfg.update_config_file() @@ -1105,12 +1305,14 @@ class HostConfigDaemon: ntp_server = init_data['NTP_SERVER'] ntp_global = init_data['NTP'] kdump = init_data['KDUMP'] + passwh = init_data['PASSW_HARDENING'] self.feature_handler.sync_state_field(features) self.aaacfg.load(aaa, tacacs_global, tacacs_server, radius_global, radius_server) self.iptables.load(lpbk_table) self.ntpcfg.load(ntp_global, ntp_server) self.kdumpCfg.load(kdump) + self.passwcfg.load(passwh) dev_meta = self.config_db.get_table('DEVICE_METADATA') if 'localhost' in dev_meta: @@ -1131,6 +1333,10 @@ class HostConfigDaemon: self.aaacfg.aaa_update(key, data) syslog.syslog(syslog.LOG_INFO, 'AAA Update: key: {}, op: {}, data: {}'.format(key, op, data)) + def passwh_handler(self, key, op, data): + self.passwcfg.passw_policies_update(key, data) + syslog.syslog(syslog.LOG_INFO, 'PASSW_HARDENING Update: key: {}, op: {}, data: {}'.format(key, op, data)) + def tacacs_server_handler(self, key, op, data): self.aaacfg.tacacs_server_update(key, data) log_data = copy.deepcopy(data) @@ -1229,6 +1435,7 @@ class HostConfigDaemon: self.config_db.subscribe('TACPLUS_SERVER', make_callback(self.tacacs_server_handler)) self.config_db.subscribe('RADIUS', make_callback(self.radius_global_handler)) self.config_db.subscribe('RADIUS_SERVER', make_callback(self.radius_server_handler)) + self.config_db.subscribe('PASSW_HARDENING', make_callback(self.passwh_handler)) # Handle IPTables configuration self.config_db.subscribe('LOOPBACK_INTERFACE', make_callback(self.lpbk_handler)) # Handle NTP & NTP_SERVER updates diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py new file mode 100755 index 000000000000..da68ad861207 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py @@ -0,0 +1,182 @@ +import importlib.machinery +import importlib.util +import filecmp +import shutil +import os +import sys +import subprocess +import re + +from parameterized import parameterized +from unittest import TestCase, mock +from tests.hostcfgd.test_passwh_vectors import HOSTCFGD_TEST_PASSWH_VECTOR +from tests.common.mock_configdb import MockConfigDb, MockDBConnector + +test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +modules_path = os.path.dirname(test_path) +scripts_path = os.path.join(modules_path, "scripts") +src_path = os.path.dirname(modules_path) +templates_path = os.path.join(src_path, "sonic-host-services-data/templates") +output_path = os.path.join(test_path, "hostcfgd/output") +sample_output_path = os.path.join(test_path, "hostcfgd/sample_output") +sys.path.insert(0, modules_path) + +# Load the file under test +hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') +loader = importlib.machinery.SourceFileLoader('hostcfgd', hostcfgd_path) +spec = importlib.util.spec_from_loader(loader.name, loader) +hostcfgd = importlib.util.module_from_spec(spec) +loader.exec_module(hostcfgd) +sys.modules['hostcfgd'] = hostcfgd + +# Mock swsscommon classes +hostcfgd.ConfigDBConnector = MockConfigDb +hostcfgd.DBConnector = MockDBConnector +hostcfgd.Table = mock.Mock() + +AGE_DICT = { 'MAX_DAYS': {'REGEX_DAYS': r'^PASS_MAX_DAYS[ \t]*(?P\d*)', 'DAYS': 'max_days', 'CHAGE_FLAG': '-M '}, + 'WARN_DAYS': {'REGEX_DAYS': r'^PASS_WARN_AGE[ \t]*(?P\d*)', 'DAYS': 'warn_days', 'CHAGE_FLAG': '-W '} + } + +class TestHostcfgdPASSWH(TestCase): + """ + Test hostcfd daemon - PASSWH + """ + def run_diff(self, file1, file2): + try: + diff_out = subprocess.check_output('diff -ur {} {} || true'.format(file1, file2), shell=True) + return diff_out + except subprocess.CalledProcessError as err: + syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(err.cmd, err.returncode, err.output)) + return -1 + + def get_passw_days(self, login_file, age_type): + days_num = -1 + + regex_days = AGE_DICT[age_type]['REGEX_DAYS'] + days_type = AGE_DICT[age_type]['DAYS'] + + with open(login_file, 'r') as f: + login_def_data = f.readlines() + + for line in login_def_data: + m1 = re.match(regex_days, line) + if m1: + days_num = int(m1.group(days_type)) + break + return days_num + + """ + Check different config + """ + def check_config(self, test_name, test_data, config_name): + t_path = templates_path + op_path = output_path + "/" + test_name + "_" + config_name + sop_path = sample_output_path + "/" + test_name + "_" + config_name + sop_path_common = sample_output_path + "/" + test_name + + hostcfgd.PAM_PASSWORD_CONF_TEMPLATE = t_path + "/common-password.j2" + hostcfgd.PAM_AUTH_CONF_TEMPLATE = t_path + "/common-auth-sonic.j2" + hostcfgd.NSS_TACPLUS_CONF_TEMPLATE = t_path + "/tacplus_nss.conf.j2" + hostcfgd.NSS_RADIUS_CONF_TEMPLATE = t_path + "/radius_nss.conf.j2" + hostcfgd.PAM_RADIUS_AUTH_CONF_TEMPLATE = t_path + "/pam_radius_auth.conf.j2" + hostcfgd.PAM_PASSWORD_CONF = op_path + "/common-password" + hostcfgd.ETC_LOGIN_DEF = op_path + "/login.defs" + hostcfgd.PAM_AUTH_CONF = op_path + "/common-auth-sonic" + hostcfgd.NSS_TACPLUS_CONF = op_path + "/tacplus_nss.conf" + hostcfgd.NSS_RADIUS_CONF = op_path + "/radius_nss.conf" + hostcfgd.NSS_CONF = op_path + "/nsswitch.conf" + hostcfgd.ETC_PAMD_SSHD = op_path + "/sshd" + hostcfgd.ETC_PAMD_LOGIN = op_path + "/login" + hostcfgd.RADIUS_PAM_AUTH_CONF_DIR = op_path + "/" + + shutil.rmtree(op_path, ignore_errors=True) + os.mkdir(op_path) + + shutil.copyfile(sop_path_common + "/login.defs.old", op_path + "/login.defs") + MockConfigDb.set_config_db(test_data[config_name]) + host_config_daemon = hostcfgd.HostConfigDaemon() + + try: + passwh_table = host_config_daemon.config_db.get_table('PASSW_HARDENING') + except Exception as e: + syslog.syslog(syslog.LOG_ERR, "failed: get_table 'PASSW_HARDENING', exception={}".format(e)) + passwh_table = [] + + host_config_daemon.passwcfg.load(passwh_table) + + + diff_output = "" + files_to_compare = ['common-password'] + + # check output files exists + for name in files_to_compare: + if not os.path.isfile(sop_path + "/" + name): + raise ValueError('filename: %s not exit' % (sop_path + "/" + name)) + if not os.path.isfile(op_path + "/" + name): + raise ValueError('filename: %s not exit' % (op_path + "/" + name)) + + # deep comparison + match, mismatch, errors = filecmp.cmpfiles(sop_path, op_path, files_to_compare, shallow=False) + + if not match: + for name in files_to_compare: + diff_output += self.run_diff( sop_path + "/" + name,\ + op_path + "/" + name).decode('utf-8') + + self.assertTrue(len(diff_output) == 0, diff_output) + + # compare age data in login.def file. + out_passw_age_days = self.get_passw_days(op_path + "/login.defs", 'MAX_DAYS') + sout_passw_age_days = self.get_passw_days(sop_path + "/login.defs", 'MAX_DAYS') + out_passw_age_warn_days = self.get_passw_days(op_path + "/login.defs", 'WARN_DAYS') + sout_passw_age_warn_days = self.get_passw_days(sop_path + "/login.defs", 'WARN_DAYS') + + self.assertEqual(out_passw_age_days, sout_passw_age_days) + self.assertEqual(out_passw_age_warn_days, sout_passw_age_warn_days) + + @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) + def test_hostcfgd_passwh(self, test_name, test_data): + """ + Test PASSWH hostcfd daemon initialization + + Args: + test_name(str): test name + test_data(dict): test data which contains initial Config Db tables, and expected results + + Returns: + None + """ + + self.check_config(test_name, test_data, "default_values") + + @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) + def test_hostcfgd_passwh_enable(self, test_name, test_data): + """ + Test PASSWH hostcfd daemon initialization + + Args: + test_name(str): test name + test_data(dict): test data which contains initial Config Db tables, and expected results + + Returns: + None + """ + + self.check_config(test_name, test_data, "enable_feature") + + + @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) + def test_hostcfgd_passwh_classes(self, test_name, test_data): + """ + Test PASSWH hostcfd daemon initialization + + Args: + test_name(str): test name + test_data(dict): test data which contains initial Config Db tables, and expected results + + Returns: + None + """ + + self.check_config(test_name, test_data, "enable_digits_class") \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old new file mode 100644 index 000000000000..db8baa4d2bf8 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old @@ -0,0 +1,340 @@ +# +# /etc/login.defs - Configuration control definitions for the login package. +# +# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. +# If unspecified, some arbitrary (and possibly incorrect) value will +# be assumed. All other items are optional - if not specified then +# the described action or option will be inhibited. +# +# Comment lines (lines beginning with "#") and blank lines are ignored. +# +# Modified for Linux. --marekm + +# REQUIRED for useradd/userdel/usermod +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, +# MAIL_DIR takes precedence. +# +# Essentially: +# - MAIL_DIR defines the location of users mail spool files +# (for mbox use) by appending the username to MAIL_DIR as defined +# below. +# - MAIL_FILE defines the location of the users mail spool files as the +# fully-qualified filename obtained by prepending the user home +# directory before $MAIL_FILE +# +# NOTE: This is no more used for setting up users MAIL environment variable +# which is, starting from shadow 4.0.12-1 in Debian, entirely the +# job of the pam_mail PAM modules +# See default PAM configuration files provided for +# login, su, etc. +# +# This is a temporary situation: setting these variables will soon +# move to /etc/default/useradd and the variables will then be +# no more supported +MAIL_DIR /var/mail +#MAIL_FILE .mail + +# +# Enable logging and display of /var/log/faillog login failure info. +# This option conflicts with the pam_tally PAM module. +# +FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login failures are recorded. +# +# WARNING: Unknown usernames may become world readable. +# See #290803 and #298773 for details about how this could become a security +# concern +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable "syslog" logging of su activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp and sg. +# +SYSLOG_SU_ENAB yes +SYSLOG_SG_ENAB yes + +# +# If defined, all su activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format something like "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login failures will be logged here in a utmp format +# last, when invoked as lastb, will read /var/log/btmp, so... +# +FTMP_FILE /var/log/btmp + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then a "ps" will display the +# command is "-su". If not defined, then "ps" would display the +# name of the shell actually being run, e.g. something like "-sh". +# +SU_NAME su + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a "write" program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP to the group number and +# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign +# TTYPERM to either 622 or 600. +# +# In Debian /usr/bin/bsd-write or similar programs are setgid tty +# However, the default and recommended value for TTYPERM is still 0600 +# to not allow anyone to write to anyone else console or terminal + +# Users can still allow other people to write them by issuing +# the "mesg y" command. + +TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# UMASK Default "umask" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# +# UMASK is the default umask value for pam_umask and is used by +# useradd and newusers to set the mode of the new home directories. +# 022 is the "historical" value in Debian for UMASK +# 027, or even 077, could be considered better for privacy +# There is no One True Answer here : each sysadmin must make up his/her +# mind. +# +# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value +# for private user groups, i. e. the uid is the same as gid, and username is +# the same as the primary group name: for these, the user permissions will be +# used as group permissions, e. g. 022 will become 002. +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +ERASECHAR 0177 +KILLCHAR 025 +UMASK 022 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 99999 +PASS_MIN_DAYS 0 +PASS_WARN_AGE 7 + +# +# Min/max values for automatic uid selection in useradd +# +UID_MIN 1000 +UID_MAX 60000 +# System accounts +#SYS_UID_MIN 100 +#SYS_UID_MAX 999 + +# +# Min/max values for automatic gid selection in groupadd +# +GID_MIN 1000 +GID_MAX 60000 +# System accounts +#SYS_GID_MIN 100 +#SYS_GID_MAX 999 + +# +# Max number of login retries if password is bad. This will most likely be +# overriden by PAM, since the default pam_unix module has it's own built +# in of 3 retries. However, this is a safe fallback in case you are using +# an authentication module that does not enforce PAM_MAXTRIES. +# +LOGIN_RETRIES 5 + +# +# Max time in seconds for login +# +LOGIN_TIMEOUT 60 + +# +# Which fields may be changed by regular users using chfn - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +CHFN_RESTRICT rwh + +# +# Should login be allowed if we can't cd to the home directory? +# Default in no. +# +DEFAULT_HOME yes + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# If set to yes, userdel will remove the user's group if it contains no +# more members, and useradd will create by default a group with the name +# of the user. +# +# Other former uses of this variable such as setting the umask when +# user==primary group are not used in PAM environments, such as Debian +# +USERGROUPS_ENAB yes + +# +# Instead of the real user shell, the program specified by this parameter +# will be launched, although its visible name (argv[0]) will be the shell's. +# The program may do whatever it wants (logging, additional authentification, +# banner, ...) before running the actual shell. +# +# FAKE_SHELL /bin/fakeshell + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# upon these devices. +# +# This variable is used by login and su. +# +#CONSOLE /etc/consoles +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# List of groups to add to the user's supplementary group set +# when logging in on the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in on the console. +# How to do it is left as an exercise for the reader... +# +# This variable is used by login and su. +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# This variable is deprecated. You should use ENCRYPT_METHOD. +# +#MD5_CRYPT_ENAB no + +# +# If set to MD5 , MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: It is recommended to use a value consistent with +# the PAM modules configuration. +# +ENCRYPT_METHOD SHA512 + +# +# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute forcing the password. +# But note also that it more CPU resources will be needed to authenticate +# users. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be inside the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +# SHA_CRYPT_MIN_ROUNDS 5000 +# SHA_CRYPT_MAX_ROUNDS 5000 + +################# OBSOLETED BY PAM ############## +# # +# These options are now handled by PAM. Please # +# edit the appropriate file in /etc/pam.d/ to # +# enable the equivelants of them. +# +############### + +#MOTD_FILE +#DIALUPS_CHECK_ENAB +#LASTLOG_ENAB +#MAIL_CHECK_ENAB +#OBSCURE_CHECKS_ENAB +#PORTTIME_CHECKS_ENAB +#SU_WHEEL_ONLY +#CRACKLIB_DICTPATH +#PASS_CHANGE_TRIES +#PASS_ALWAYS_WARN +#ENVIRON_FILE +#NOLOGINS_FILE +#ISSUE_FILE +#PASS_MIN_LEN +#PASS_MAX_LEN +#ULIMIT +#ENV_HZ +#CHFN_AUTH +#CHSH_AUTH +#FAIL_DELAY + +################# OBSOLETED ####################### +# # +# These options are no more handled by shadow. # +# # +# Shadow utilities will display a warning if they # +# still appear. # +# # +################################################### + +# CLOSE_SESSIONS +# LOGIN_STRING +# NO_PASSWORD_CONSOLE +# QMAIL_DIR + + + diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password new file mode 100644 index 000000000000..0da639249c94 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password @@ -0,0 +1,36 @@ +#THIS IS AN AUTO-GENERATED FILE +# +# /etc/pam.d/common-password - password-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define the services to be +# used to change user passwords. The default is pam_unix. + +# Explanation of pam_unix options: +# The "yescrypt" option enables +#hashed passwords using the yescrypt algorithm, introduced in Debian +#11. Without this option, the default is Unix crypt. Prior releases +#used the option "sha512"; if a shadow password hash will be shared +#between Debian 11 and older releases replace "yescrypt" with "sha512" +#for compatibility . The "obscure" option replaces the old +#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage +#for other options. + +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) + + +password [success=1 default=ignore] pam_unix.so obscure yescrypt +# here's the fallback if no module succeeds +password requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +password required pam_permit.so +# and here are more per-package modules (the "Additional" block) +# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs new file mode 100644 index 000000000000..db8baa4d2bf8 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs @@ -0,0 +1,340 @@ +# +# /etc/login.defs - Configuration control definitions for the login package. +# +# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. +# If unspecified, some arbitrary (and possibly incorrect) value will +# be assumed. All other items are optional - if not specified then +# the described action or option will be inhibited. +# +# Comment lines (lines beginning with "#") and blank lines are ignored. +# +# Modified for Linux. --marekm + +# REQUIRED for useradd/userdel/usermod +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, +# MAIL_DIR takes precedence. +# +# Essentially: +# - MAIL_DIR defines the location of users mail spool files +# (for mbox use) by appending the username to MAIL_DIR as defined +# below. +# - MAIL_FILE defines the location of the users mail spool files as the +# fully-qualified filename obtained by prepending the user home +# directory before $MAIL_FILE +# +# NOTE: This is no more used for setting up users MAIL environment variable +# which is, starting from shadow 4.0.12-1 in Debian, entirely the +# job of the pam_mail PAM modules +# See default PAM configuration files provided for +# login, su, etc. +# +# This is a temporary situation: setting these variables will soon +# move to /etc/default/useradd and the variables will then be +# no more supported +MAIL_DIR /var/mail +#MAIL_FILE .mail + +# +# Enable logging and display of /var/log/faillog login failure info. +# This option conflicts with the pam_tally PAM module. +# +FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login failures are recorded. +# +# WARNING: Unknown usernames may become world readable. +# See #290803 and #298773 for details about how this could become a security +# concern +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable "syslog" logging of su activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp and sg. +# +SYSLOG_SU_ENAB yes +SYSLOG_SG_ENAB yes + +# +# If defined, all su activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format something like "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login failures will be logged here in a utmp format +# last, when invoked as lastb, will read /var/log/btmp, so... +# +FTMP_FILE /var/log/btmp + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then a "ps" will display the +# command is "-su". If not defined, then "ps" would display the +# name of the shell actually being run, e.g. something like "-sh". +# +SU_NAME su + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a "write" program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP to the group number and +# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign +# TTYPERM to either 622 or 600. +# +# In Debian /usr/bin/bsd-write or similar programs are setgid tty +# However, the default and recommended value for TTYPERM is still 0600 +# to not allow anyone to write to anyone else console or terminal + +# Users can still allow other people to write them by issuing +# the "mesg y" command. + +TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# UMASK Default "umask" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# +# UMASK is the default umask value for pam_umask and is used by +# useradd and newusers to set the mode of the new home directories. +# 022 is the "historical" value in Debian for UMASK +# 027, or even 077, could be considered better for privacy +# There is no One True Answer here : each sysadmin must make up his/her +# mind. +# +# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value +# for private user groups, i. e. the uid is the same as gid, and username is +# the same as the primary group name: for these, the user permissions will be +# used as group permissions, e. g. 022 will become 002. +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +ERASECHAR 0177 +KILLCHAR 025 +UMASK 022 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 99999 +PASS_MIN_DAYS 0 +PASS_WARN_AGE 7 + +# +# Min/max values for automatic uid selection in useradd +# +UID_MIN 1000 +UID_MAX 60000 +# System accounts +#SYS_UID_MIN 100 +#SYS_UID_MAX 999 + +# +# Min/max values for automatic gid selection in groupadd +# +GID_MIN 1000 +GID_MAX 60000 +# System accounts +#SYS_GID_MIN 100 +#SYS_GID_MAX 999 + +# +# Max number of login retries if password is bad. This will most likely be +# overriden by PAM, since the default pam_unix module has it's own built +# in of 3 retries. However, this is a safe fallback in case you are using +# an authentication module that does not enforce PAM_MAXTRIES. +# +LOGIN_RETRIES 5 + +# +# Max time in seconds for login +# +LOGIN_TIMEOUT 60 + +# +# Which fields may be changed by regular users using chfn - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +CHFN_RESTRICT rwh + +# +# Should login be allowed if we can't cd to the home directory? +# Default in no. +# +DEFAULT_HOME yes + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# If set to yes, userdel will remove the user's group if it contains no +# more members, and useradd will create by default a group with the name +# of the user. +# +# Other former uses of this variable such as setting the umask when +# user==primary group are not used in PAM environments, such as Debian +# +USERGROUPS_ENAB yes + +# +# Instead of the real user shell, the program specified by this parameter +# will be launched, although its visible name (argv[0]) will be the shell's. +# The program may do whatever it wants (logging, additional authentification, +# banner, ...) before running the actual shell. +# +# FAKE_SHELL /bin/fakeshell + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# upon these devices. +# +# This variable is used by login and su. +# +#CONSOLE /etc/consoles +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# List of groups to add to the user's supplementary group set +# when logging in on the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in on the console. +# How to do it is left as an exercise for the reader... +# +# This variable is used by login and su. +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# This variable is deprecated. You should use ENCRYPT_METHOD. +# +#MD5_CRYPT_ENAB no + +# +# If set to MD5 , MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: It is recommended to use a value consistent with +# the PAM modules configuration. +# +ENCRYPT_METHOD SHA512 + +# +# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute forcing the password. +# But note also that it more CPU resources will be needed to authenticate +# users. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be inside the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +# SHA_CRYPT_MIN_ROUNDS 5000 +# SHA_CRYPT_MAX_ROUNDS 5000 + +################# OBSOLETED BY PAM ############## +# # +# These options are now handled by PAM. Please # +# edit the appropriate file in /etc/pam.d/ to # +# enable the equivelants of them. +# +############### + +#MOTD_FILE +#DIALUPS_CHECK_ENAB +#LASTLOG_ENAB +#MAIL_CHECK_ENAB +#OBSCURE_CHECKS_ENAB +#PORTTIME_CHECKS_ENAB +#SU_WHEEL_ONLY +#CRACKLIB_DICTPATH +#PASS_CHANGE_TRIES +#PASS_ALWAYS_WARN +#ENVIRON_FILE +#NOLOGINS_FILE +#ISSUE_FILE +#PASS_MIN_LEN +#PASS_MAX_LEN +#ULIMIT +#ENV_HZ +#CHFN_AUTH +#CHSH_AUTH +#FAIL_DELAY + +################# OBSOLETED ####################### +# # +# These options are no more handled by shadow. # +# # +# Shadow utilities will display a warning if they # +# still appear. # +# # +################################################### + +# CLOSE_SESSIONS +# LOGIN_STRING +# NO_PASSWORD_CONSOLE +# QMAIL_DIR + + + diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password new file mode 100644 index 000000000000..841074728a4f --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password @@ -0,0 +1,39 @@ +#THIS IS AN AUTO-GENERATED FILE +# +# /etc/pam.d/common-password - password-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define the services to be +# used to change user passwords. The default is pam_unix. + +# Explanation of pam_unix options: +# The "yescrypt" option enables +#hashed passwords using the yescrypt algorithm, introduced in Debian +#11. Without this option, the default is Unix crypt. Prior releases +#used the option "sha512"; if a shadow password hash will be shared +#between Debian 11 and older releases replace "yescrypt" with "sha512" +#for compatibility . The "obscure" option replaces the old +#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage +#for other options. + +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) + +password requisite pam_cracklib.so retry=3 maxrepeat=0 minlen=8 ucredit=0 lcredit=0 dcredit=-1 ocredit=0 enforce_for_root + +password required pam_pwhistory.so remember=0 use_authtok enforce_for_root + +password [success=1 default=ignore] pam_unix.so obscure yescrypt +# here's the fallback if no module succeeds +password requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +password required pam_permit.so +# and here are more per-package modules (the "Additional" block) +# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs new file mode 100644 index 000000000000..db8baa4d2bf8 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs @@ -0,0 +1,340 @@ +# +# /etc/login.defs - Configuration control definitions for the login package. +# +# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. +# If unspecified, some arbitrary (and possibly incorrect) value will +# be assumed. All other items are optional - if not specified then +# the described action or option will be inhibited. +# +# Comment lines (lines beginning with "#") and blank lines are ignored. +# +# Modified for Linux. --marekm + +# REQUIRED for useradd/userdel/usermod +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, +# MAIL_DIR takes precedence. +# +# Essentially: +# - MAIL_DIR defines the location of users mail spool files +# (for mbox use) by appending the username to MAIL_DIR as defined +# below. +# - MAIL_FILE defines the location of the users mail spool files as the +# fully-qualified filename obtained by prepending the user home +# directory before $MAIL_FILE +# +# NOTE: This is no more used for setting up users MAIL environment variable +# which is, starting from shadow 4.0.12-1 in Debian, entirely the +# job of the pam_mail PAM modules +# See default PAM configuration files provided for +# login, su, etc. +# +# This is a temporary situation: setting these variables will soon +# move to /etc/default/useradd and the variables will then be +# no more supported +MAIL_DIR /var/mail +#MAIL_FILE .mail + +# +# Enable logging and display of /var/log/faillog login failure info. +# This option conflicts with the pam_tally PAM module. +# +FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login failures are recorded. +# +# WARNING: Unknown usernames may become world readable. +# See #290803 and #298773 for details about how this could become a security +# concern +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable "syslog" logging of su activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp and sg. +# +SYSLOG_SU_ENAB yes +SYSLOG_SG_ENAB yes + +# +# If defined, all su activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format something like "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login failures will be logged here in a utmp format +# last, when invoked as lastb, will read /var/log/btmp, so... +# +FTMP_FILE /var/log/btmp + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then a "ps" will display the +# command is "-su". If not defined, then "ps" would display the +# name of the shell actually being run, e.g. something like "-sh". +# +SU_NAME su + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a "write" program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP to the group number and +# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign +# TTYPERM to either 622 or 600. +# +# In Debian /usr/bin/bsd-write or similar programs are setgid tty +# However, the default and recommended value for TTYPERM is still 0600 +# to not allow anyone to write to anyone else console or terminal + +# Users can still allow other people to write them by issuing +# the "mesg y" command. + +TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# UMASK Default "umask" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# +# UMASK is the default umask value for pam_umask and is used by +# useradd and newusers to set the mode of the new home directories. +# 022 is the "historical" value in Debian for UMASK +# 027, or even 077, could be considered better for privacy +# There is no One True Answer here : each sysadmin must make up his/her +# mind. +# +# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value +# for private user groups, i. e. the uid is the same as gid, and username is +# the same as the primary group name: for these, the user permissions will be +# used as group permissions, e. g. 022 will become 002. +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +ERASECHAR 0177 +KILLCHAR 025 +UMASK 022 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 99999 +PASS_MIN_DAYS 0 +PASS_WARN_AGE 7 + +# +# Min/max values for automatic uid selection in useradd +# +UID_MIN 1000 +UID_MAX 60000 +# System accounts +#SYS_UID_MIN 100 +#SYS_UID_MAX 999 + +# +# Min/max values for automatic gid selection in groupadd +# +GID_MIN 1000 +GID_MAX 60000 +# System accounts +#SYS_GID_MIN 100 +#SYS_GID_MAX 999 + +# +# Max number of login retries if password is bad. This will most likely be +# overriden by PAM, since the default pam_unix module has it's own built +# in of 3 retries. However, this is a safe fallback in case you are using +# an authentication module that does not enforce PAM_MAXTRIES. +# +LOGIN_RETRIES 5 + +# +# Max time in seconds for login +# +LOGIN_TIMEOUT 60 + +# +# Which fields may be changed by regular users using chfn - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +CHFN_RESTRICT rwh + +# +# Should login be allowed if we can't cd to the home directory? +# Default in no. +# +DEFAULT_HOME yes + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# If set to yes, userdel will remove the user's group if it contains no +# more members, and useradd will create by default a group with the name +# of the user. +# +# Other former uses of this variable such as setting the umask when +# user==primary group are not used in PAM environments, such as Debian +# +USERGROUPS_ENAB yes + +# +# Instead of the real user shell, the program specified by this parameter +# will be launched, although its visible name (argv[0]) will be the shell's. +# The program may do whatever it wants (logging, additional authentification, +# banner, ...) before running the actual shell. +# +# FAKE_SHELL /bin/fakeshell + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# upon these devices. +# +# This variable is used by login and su. +# +#CONSOLE /etc/consoles +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# List of groups to add to the user's supplementary group set +# when logging in on the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in on the console. +# How to do it is left as an exercise for the reader... +# +# This variable is used by login and su. +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# This variable is deprecated. You should use ENCRYPT_METHOD. +# +#MD5_CRYPT_ENAB no + +# +# If set to MD5 , MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: It is recommended to use a value consistent with +# the PAM modules configuration. +# +ENCRYPT_METHOD SHA512 + +# +# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute forcing the password. +# But note also that it more CPU resources will be needed to authenticate +# users. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be inside the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +# SHA_CRYPT_MIN_ROUNDS 5000 +# SHA_CRYPT_MAX_ROUNDS 5000 + +################# OBSOLETED BY PAM ############## +# # +# These options are now handled by PAM. Please # +# edit the appropriate file in /etc/pam.d/ to # +# enable the equivelants of them. +# +############### + +#MOTD_FILE +#DIALUPS_CHECK_ENAB +#LASTLOG_ENAB +#MAIL_CHECK_ENAB +#OBSCURE_CHECKS_ENAB +#PORTTIME_CHECKS_ENAB +#SU_WHEEL_ONLY +#CRACKLIB_DICTPATH +#PASS_CHANGE_TRIES +#PASS_ALWAYS_WARN +#ENVIRON_FILE +#NOLOGINS_FILE +#ISSUE_FILE +#PASS_MIN_LEN +#PASS_MAX_LEN +#ULIMIT +#ENV_HZ +#CHFN_AUTH +#CHSH_AUTH +#FAIL_DELAY + +################# OBSOLETED ####################### +# # +# These options are no more handled by shadow. # +# # +# Shadow utilities will display a warning if they # +# still appear. # +# # +################################################### + +# CLOSE_SESSIONS +# LOGIN_STRING +# NO_PASSWORD_CONSOLE +# QMAIL_DIR + + + diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password new file mode 100644 index 000000000000..a66c1b1ade0c --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password @@ -0,0 +1,39 @@ +#THIS IS AN AUTO-GENERATED FILE +# +# /etc/pam.d/common-password - password-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define the services to be +# used to change user passwords. The default is pam_unix. + +# Explanation of pam_unix options: +# The "yescrypt" option enables +#hashed passwords using the yescrypt algorithm, introduced in Debian +#11. Without this option, the default is Unix crypt. Prior releases +#used the option "sha512"; if a shadow password hash will be shared +#between Debian 11 and older releases replace "yescrypt" with "sha512" +#for compatibility . The "obscure" option replaces the old +#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage +#for other options. + +# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. +# To take advantage of this, it is recommended that you configure any +# local modules either before or after the default block, and use +# pam-auth-update to manage selection of other modules. See +# pam-auth-update(8) for details. + +# here are the per-package modules (the "Primary" block) + +password requisite pam_cracklib.so retry=3 maxrepeat=0 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 reject_username enforce_for_root + +password required pam_pwhistory.so remember=10 use_authtok enforce_for_root + +password [success=1 default=ignore] pam_unix.so obscure yescrypt +# here's the fallback if no module succeeds +password requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +password required pam_permit.so +# and here are more per-package modules (the "Additional" block) +# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs new file mode 100644 index 000000000000..1c8b360a14aa --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs @@ -0,0 +1,340 @@ +# +# /etc/login.defs - Configuration control definitions for the login package. +# +# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. +# If unspecified, some arbitrary (and possibly incorrect) value will +# be assumed. All other items are optional - if not specified then +# the described action or option will be inhibited. +# +# Comment lines (lines beginning with "#") and blank lines are ignored. +# +# Modified for Linux. --marekm + +# REQUIRED for useradd/userdel/usermod +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, +# MAIL_DIR takes precedence. +# +# Essentially: +# - MAIL_DIR defines the location of users mail spool files +# (for mbox use) by appending the username to MAIL_DIR as defined +# below. +# - MAIL_FILE defines the location of the users mail spool files as the +# fully-qualified filename obtained by prepending the user home +# directory before $MAIL_FILE +# +# NOTE: This is no more used for setting up users MAIL environment variable +# which is, starting from shadow 4.0.12-1 in Debian, entirely the +# job of the pam_mail PAM modules +# See default PAM configuration files provided for +# login, su, etc. +# +# This is a temporary situation: setting these variables will soon +# move to /etc/default/useradd and the variables will then be +# no more supported +MAIL_DIR /var/mail +#MAIL_FILE .mail + +# +# Enable logging and display of /var/log/faillog login failure info. +# This option conflicts with the pam_tally PAM module. +# +FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login failures are recorded. +# +# WARNING: Unknown usernames may become world readable. +# See #290803 and #298773 for details about how this could become a security +# concern +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable "syslog" logging of su activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp and sg. +# +SYSLOG_SU_ENAB yes +SYSLOG_SG_ENAB yes + +# +# If defined, all su activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format something like "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login failures will be logged here in a utmp format +# last, when invoked as lastb, will read /var/log/btmp, so... +# +FTMP_FILE /var/log/btmp + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then a "ps" will display the +# command is "-su". If not defined, then "ps" would display the +# name of the shell actually being run, e.g. something like "-sh". +# +SU_NAME su + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a "write" program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP to the group number and +# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign +# TTYPERM to either 622 or 600. +# +# In Debian /usr/bin/bsd-write or similar programs are setgid tty +# However, the default and recommended value for TTYPERM is still 0600 +# to not allow anyone to write to anyone else console or terminal + +# Users can still allow other people to write them by issuing +# the "mesg y" command. + +TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# UMASK Default "umask" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# +# UMASK is the default umask value for pam_umask and is used by +# useradd and newusers to set the mode of the new home directories. +# 022 is the "historical" value in Debian for UMASK +# 027, or even 077, could be considered better for privacy +# There is no One True Answer here : each sysadmin must make up his/her +# mind. +# +# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value +# for private user groups, i. e. the uid is the same as gid, and username is +# the same as the primary group name: for these, the user permissions will be +# used as group permissions, e. g. 022 will become 002. +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +ERASECHAR 0177 +KILLCHAR 025 +UMASK 022 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 180 +PASS_MIN_DAYS 0 +PASS_WARN_AGE 15 + +# +# Min/max values for automatic uid selection in useradd +# +UID_MIN 1000 +UID_MAX 60000 +# System accounts +#SYS_UID_MIN 100 +#SYS_UID_MAX 999 + +# +# Min/max values for automatic gid selection in groupadd +# +GID_MIN 1000 +GID_MAX 60000 +# System accounts +#SYS_GID_MIN 100 +#SYS_GID_MAX 999 + +# +# Max number of login retries if password is bad. This will most likely be +# overriden by PAM, since the default pam_unix module has it's own built +# in of 3 retries. However, this is a safe fallback in case you are using +# an authentication module that does not enforce PAM_MAXTRIES. +# +LOGIN_RETRIES 5 + +# +# Max time in seconds for login +# +LOGIN_TIMEOUT 60 + +# +# Which fields may be changed by regular users using chfn - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +CHFN_RESTRICT rwh + +# +# Should login be allowed if we can't cd to the home directory? +# Default in no. +# +DEFAULT_HOME yes + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# If set to yes, userdel will remove the user's group if it contains no +# more members, and useradd will create by default a group with the name +# of the user. +# +# Other former uses of this variable such as setting the umask when +# user==primary group are not used in PAM environments, such as Debian +# +USERGROUPS_ENAB yes + +# +# Instead of the real user shell, the program specified by this parameter +# will be launched, although its visible name (argv[0]) will be the shell's. +# The program may do whatever it wants (logging, additional authentification, +# banner, ...) before running the actual shell. +# +# FAKE_SHELL /bin/fakeshell + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# upon these devices. +# +# This variable is used by login and su. +# +#CONSOLE /etc/consoles +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# List of groups to add to the user's supplementary group set +# when logging in on the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in on the console. +# How to do it is left as an exercise for the reader... +# +# This variable is used by login and su. +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# This variable is deprecated. You should use ENCRYPT_METHOD. +# +#MD5_CRYPT_ENAB no + +# +# If set to MD5 , MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: It is recommended to use a value consistent with +# the PAM modules configuration. +# +ENCRYPT_METHOD SHA512 + +# +# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute forcing the password. +# But note also that it more CPU resources will be needed to authenticate +# users. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be inside the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +# SHA_CRYPT_MIN_ROUNDS 5000 +# SHA_CRYPT_MAX_ROUNDS 5000 + +################# OBSOLETED BY PAM ############## +# # +# These options are now handled by PAM. Please # +# edit the appropriate file in /etc/pam.d/ to # +# enable the equivelants of them. +# +############### + +#MOTD_FILE +#DIALUPS_CHECK_ENAB +#LASTLOG_ENAB +#MAIL_CHECK_ENAB +#OBSCURE_CHECKS_ENAB +#PORTTIME_CHECKS_ENAB +#SU_WHEEL_ONLY +#CRACKLIB_DICTPATH +#PASS_CHANGE_TRIES +#PASS_ALWAYS_WARN +#ENVIRON_FILE +#NOLOGINS_FILE +#ISSUE_FILE +#PASS_MIN_LEN +#PASS_MAX_LEN +#ULIMIT +#ENV_HZ +#CHFN_AUTH +#CHSH_AUTH +#FAIL_DELAY + +################# OBSOLETED ####################### +# # +# These options are no more handled by shadow. # +# # +# Shadow utilities will display a warning if they # +# still appear. # +# # +################################################### + +# CLOSE_SESSIONS +# LOGIN_STRING +# NO_PASSWORD_CONSOLE +# QMAIL_DIR + + + diff --git a/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py new file mode 100644 index 000000000000..acf1c7671125 --- /dev/null +++ b/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py @@ -0,0 +1,244 @@ +""" + hostcfgd test password hardening vector +""" +HOSTCFGD_TEST_PASSWH_VECTOR = [ + [ + "PASSWORD_HARDENING", + { + "default_values":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "disabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": "True", + "lower_class": "True", + "upper_class": "True", + "digits_class": "True", + "special_class": "True" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + } + }, + "enable_feature":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "180", + "expiration_warning": "15", + "history_cnt": "10", + "len_min": "8", + "reject_user_passw_match": "True", + "lower_class": "True", + "upper_class": "True", + "digits_class": "True", + "special_class": "True" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + } + }, + "enable_digits_class":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "0", + "expiration_warning": "0", + "history_cnt": "0", + "len_min": "8", + "reject_user_passw_match": "False", + "lower_class": "False", + "upper_class": "False", + "digits_class": "True", + "special_class": "False" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + } + }, + "enable_lower_class":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "0", + "expiration_warning": "0", + "history_cnt": "0", + "len_min": "8", + "reject_user_passw_match": "False", + "lower_class": "True", + "upper_class": "False", + "digits_class": "False", + "special_class": "False" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + }, + }, + "enable_upper_class":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "0", + "expiration_warning": "0", + "history_cnt": "0", + "len_min": "8", + "reject_user_passw_match": "False", + "lower_class": "False", + "upper_class": "True", + "digits_class": "False", + "special_class": "False" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + } + }, + "enable_special_class":{ + "PASSW_HARDENING": { + "POLICIES":{ + "state": "enabled", + "expiration": "0", + "expiration_warning": "0", + "history_cnt": "0", + "len_min": "8", + "reject_user_passw_match": "False", + "lower_class": "False", + "upper_class": "False", + "digits_class": "False", + "special_class": "True" + } + }, + "DEVICE_METADATA": { + "localhost": { + "hostname": "radius", + } + }, + "FEATURE": { + "dhcp_relay": { + "auto_restart": "enabled", + "has_global_scope": "True", + "has_per_asic_scope": "False", + "has_timer": "False", + "high_mem_alert": "disabled", + "set_owner": "kube", + "state": "enabled" + }, + }, + "KDUMP": { + "config": { + "enabled": "false", + "num_dumps": "3", + "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" + } + } + } + } + ] +] From 17cd7bac4217fc245ea81607b95acfc64371f8a1 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 29 Jun 2022 20:49:05 +0800 Subject: [PATCH 479/817] Revert sonic-db-cli change (#11282) #### Why I did it Revert PR '[Submodule] Update src/sonic-py-swsssdk #10996' which break UT in sonic-swss and sonic-swss-common #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Revert PR '[Submodule] Update src/sonic-py-swsssdk #10996' #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index ca785a2cc6a8..653bdba51750 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit ca785a2cc6a8a06fdb1145d5f4ff50ec7c5d25a6 +Subproject commit 653bdba51750cac95feb3dd47904bf4de2353fec From d974ffd707d6eb1ce625721aa0acc416f18cf99d Mon Sep 17 00:00:00 2001 From: Arun Saravanan Balachandran <52521751+ArunSaravananBalachandran@users.noreply.github.com> Date: Wed, 29 Jun 2022 22:00:58 +0530 Subject: [PATCH 480/817] DellEMC Z9332f: 'update_firmware' component API return False if firmware image not found (#10797) Why I did it To return 'False' in update_firmware component API in DellEMC Z9332f platform, if the firmware image is not present in the provided image path. How I did it Updated 'update_firmware' in component.py to return False if image is not found in location provided by 'image_path' How to verify it Verified that the API returns False when an invalid image path is specified. --- .../z9332f/sonic_platform/component.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py index 24619a481c4b..7e413e041aea 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py @@ -388,9 +388,15 @@ def update_firmware(self, image_path): Args: image_path: A string, path to firmware image + Returns: + False if image not found. + Raises: RuntimeError: update failed """ + if not os.path.isfile(image_path): + return False + valid, version = self._get_available_firmware_version(image_path) if valid: avail_ver = version.get(self.name) From 6e0559d5fa296e8aece03dd55030342732e5fd12 Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Wed, 29 Jun 2022 09:56:24 -0700 Subject: [PATCH 481/817] [Arista] Add initial support for 720DT-48S (#10656) Added initial set of config files to allow for booting and partial traffic testing in SONiC on the 720DT-48S. How to verify it - Switch boots - show interfaces status shows links up on interfaces Ethernet24-51 - Traffic flows with no errors on interfaces Ethernet24-51 --- .../Arista-720DT-48S/hwsku.json | 208 ++++++ .../Arista-720DT-48S/port_config.ini | 53 ++ .../Arista-720DT-48S/sai.profile | 1 + .../x86_64-arista_720dt_48s/default_sku | 1 + .../x86_64-arista_720dt_48s/platform.json | 647 ++++++++++++++++++ .../x86_64-arista_720dt_48s/platform_asic | 1 + .../x86_64-arista_720dt_48s/platform_reboot | 1 + device/arista/x86_64-arista_720dt_48s/plugins | 1 + .../pmon_daemon_control.json | 1 + .../system_health_monitoring_config.json | 1 + .../td3x2-a720dt-48s-flex.config.bcm | 302 ++++++++ .../thermal_policy.json | 1 + files/Aboot/boot0.j2 | 6 + files/initramfs-tools/arista-convertfs.j2 | 2 +- 14 files changed, 1225 insertions(+), 1 deletion(-) create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/port_config.ini create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/sai.profile create mode 100644 device/arista/x86_64-arista_720dt_48s/default_sku create mode 100644 device/arista/x86_64-arista_720dt_48s/platform.json create mode 100644 device/arista/x86_64-arista_720dt_48s/platform_asic create mode 120000 device/arista/x86_64-arista_720dt_48s/platform_reboot create mode 120000 device/arista/x86_64-arista_720dt_48s/plugins create mode 120000 device/arista/x86_64-arista_720dt_48s/pmon_daemon_control.json create mode 120000 device/arista/x86_64-arista_720dt_48s/system_health_monitoring_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm create mode 120000 device/arista/x86_64-arista_720dt_48s/thermal_policy.json diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json new file mode 100644 index 000000000000..e0dc3fc5e55c --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json @@ -0,0 +1,208 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet1": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet2": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet3": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet4": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet5": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet6": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet7": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet8": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet9": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet10": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet11": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet12": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet13": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet14": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet15": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet16": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet17": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet18": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet19": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet20": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet21": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet22": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet23": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet24": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet25": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet26": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet27": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet28": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet29": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet30": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet31": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet32": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet33": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet34": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet35": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet36": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet37": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet38": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet39": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet40": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet41": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet42": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet43": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet44": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet45": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet46": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet47": { + "default_brkout_mode": "1x1G", + "port_type": "RJ45" + }, + "Ethernet48": { + "default_brkout_mode": "1x10G" + }, + "Ethernet49": { + "default_brkout_mode": "1x10G" + }, + "Ethernet50": { + "default_brkout_mode": "1x10G" + }, + "Ethernet51": { + "default_brkout_mode": "1x10G" + } + } +} \ No newline at end of file diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/port_config.ini b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/port_config.ini new file mode 100644 index 000000000000..938f5588c59e --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/port_config.ini @@ -0,0 +1,53 @@ +# name lanes alias index speed +Ethernet0 25 Ethernet1 1 1000 +Ethernet1 26 Ethernet2 2 1000 +Ethernet2 27 Ethernet3 3 1000 +Ethernet3 28 Ethernet4 4 1000 +Ethernet4 29 Ethernet5 5 1000 +Ethernet5 30 Ethernet6 6 1000 +Ethernet6 31 Ethernet7 7 1000 +Ethernet7 32 Ethernet8 8 1000 +Ethernet8 33 Ethernet9 9 1000 +Ethernet9 34 Ethernet10 10 1000 +Ethernet10 35 Ethernet11 11 1000 +Ethernet11 36 Ethernet12 12 1000 +Ethernet12 37 Ethernet13 13 1000 +Ethernet13 38 Ethernet14 14 1000 +Ethernet14 39 Ethernet15 15 1000 +Ethernet15 40 Ethernet16 16 1000 +Ethernet16 41 Ethernet17 17 1000 +Ethernet17 42 Ethernet18 18 1000 +Ethernet18 43 Ethernet19 19 1000 +Ethernet19 44 Ethernet20 20 1000 +Ethernet20 45 Ethernet21 21 1000 +Ethernet21 46 Ethernet22 22 1000 +Ethernet22 47 Ethernet23 23 1000 +Ethernet23 48 Ethernet24 24 1000 +Ethernet24 1 Ethernet25 25 1000 +Ethernet25 2 Ethernet26 26 1000 +Ethernet26 3 Ethernet27 27 1000 +Ethernet27 4 Ethernet28 28 1000 +Ethernet28 5 Ethernet29 29 1000 +Ethernet29 6 Ethernet30 30 1000 +Ethernet30 7 Ethernet31 31 1000 +Ethernet31 8 Ethernet32 32 1000 +Ethernet32 9 Ethernet33 33 1000 +Ethernet33 10 Ethernet34 34 1000 +Ethernet34 11 Ethernet35 35 1000 +Ethernet35 12 Ethernet36 36 1000 +Ethernet36 13 Ethernet37 37 1000 +Ethernet37 14 Ethernet38 38 1000 +Ethernet38 15 Ethernet39 39 1000 +Ethernet39 16 Ethernet40 40 1000 +Ethernet40 17 Ethernet41 41 1000 +Ethernet41 18 Ethernet42 42 1000 +Ethernet42 19 Ethernet43 43 1000 +Ethernet43 20 Ethernet44 44 1000 +Ethernet44 21 Ethernet45 45 1000 +Ethernet45 22 Ethernet46 46 1000 +Ethernet46 23 Ethernet47 47 1000 +Ethernet47 24 Ethernet48 48 1000 +Ethernet48 61 Ethernet49 49 10000 +Ethernet49 62 Ethernet50 50 10000 +Ethernet50 63 Ethernet51 51 10000 +Ethernet51 64 Ethernet52 52 10000 diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/sai.profile b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/sai.profile new file mode 100644 index 000000000000..6a6d4789cef7 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/td3x2-a720dt-48s-flex.config.bcm diff --git a/device/arista/x86_64-arista_720dt_48s/default_sku b/device/arista/x86_64-arista_720dt_48s/default_sku new file mode 100644 index 000000000000..dc550de2463c --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/default_sku @@ -0,0 +1 @@ +Arista-720DT-48S t1 diff --git a/device/arista/x86_64-arista_720dt_48s/platform.json b/device/arista/x86_64-arista_720dt_48s/platform.json new file mode 100644 index 000000000000..add21ae911bc --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/platform.json @@ -0,0 +1,647 @@ +{ + "chassis": { + "name": "CCS-720DT-48S", + "components": [], + "fans": [], + "fan_drawers": [], + "psus": [ + { + "name": "psu1", + "fans": [] + }, + { + "name": "psu2", + "fans": [] + } + ], + "thermals": [], + "sfps": [ + { + "name": "ethernet1" + }, + { + "name": "ethernet2" + }, + { + "name": "ethernet3" + }, + { + "name": "ethernet4" + }, + { + "name": "ethernet5" + }, + { + "name": "ethernet6" + }, + { + "name": "ethernet7" + }, + { + "name": "ethernet8" + }, + { + "name": "ethernet9" + }, + { + "name": "ethernet10" + }, + { + "name": "ethernet11" + }, + { + "name": "ethernet12" + }, + { + "name": "ethernet13" + }, + { + "name": "ethernet14" + }, + { + "name": "ethernet15" + }, + { + "name": "ethernet16" + }, + { + "name": "ethernet17" + }, + { + "name": "ethernet18" + }, + { + "name": "ethernet19" + }, + { + "name": "ethernet20" + }, + { + "name": "ethernet21" + }, + { + "name": "ethernet22" + }, + { + "name": "ethernet23" + }, + { + "name": "ethernet24" + }, + { + "name": "ethernet25" + }, + { + "name": "ethernet26" + }, + { + "name": "ethernet27" + }, + { + "name": "ethernet28" + }, + { + "name": "ethernet29" + }, + { + "name": "ethernet30" + }, + { + "name": "ethernet31" + }, + { + "name": "ethernet32" + }, + { + "name": "ethernet33" + }, + { + "name": "ethernet34" + }, + { + "name": "ethernet35" + }, + { + "name": "ethernet36" + }, + { + "name": "ethernet37" + }, + { + "name": "ethernet38" + }, + { + "name": "ethernet39" + }, + { + "name": "ethernet40" + }, + { + "name": "ethernet41" + }, + { + "name": "ethernet42" + }, + { + "name": "ethernet43" + }, + { + "name": "ethernet44" + }, + { + "name": "ethernet45" + }, + { + "name": "ethernet46" + }, + { + "name": "ethernet47" + }, + { + "name": "ethernet48" + }, + { + "name": "sfp49" + }, + { + "name": "sfp50" + }, + { + "name": "sfp51" + }, + { + "name": "sfp52" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "1", + "lanes": "25", + "breakout_modes": { + "1x1G": [ + "Ethernet1" + ] + } + }, + "Ethernet1": { + "index": "2", + "lanes": "26", + "breakout_modes": { + "1x1G": [ + "Ethernet2" + ] + } + }, + "Ethernet2": { + "index": "3", + "lanes": "27", + "breakout_modes": { + "1x1G": [ + "Ethernet3" + ] + } + }, + "Ethernet3": { + "index": "4", + "lanes": "28", + "breakout_modes": { + "1x1G": [ + "Ethernet4" + ] + } + }, + "Ethernet4": { + "index": "5", + "lanes": "29", + "breakout_modes": { + "1x1G": [ + "Ethernet5" + ] + } + }, + "Ethernet5": { + "index": "6", + "lanes": "30", + "breakout_modes": { + "1x1G": [ + "Ethernet6" + ] + } + }, + "Ethernet6": { + "index": "7", + "lanes": "31", + "breakout_modes": { + "1x1G": [ + "Ethernet7" + ] + } + }, + "Ethernet7": { + "index": "8", + "lanes": "32", + "breakout_modes": { + "1x1G": [ + "Ethernet8" + ] + } + }, + "Ethernet8": { + "index": "9", + "lanes": "33", + "breakout_modes": { + "1x1G": [ + "Ethernet9" + ] + } + }, + "Ethernet9": { + "index": "10", + "lanes": "34", + "breakout_modes": { + "1x1G": [ + "Ethernet10" + ] + } + }, + "Ethernet10": { + "index": "11", + "lanes": "35", + "breakout_modes": { + "1x1G": [ + "Ethernet11" + ] + } + }, + "Ethernet11": { + "index": "12", + "lanes": "36", + "breakout_modes": { + "1x1G": [ + "Ethernet12" + ] + } + }, + "Ethernet12": { + "index": "13", + "lanes": "37", + "breakout_modes": { + "1x1G": [ + "Ethernet13" + ] + } + }, + "Ethernet13": { + "index": "14", + "lanes": "38", + "breakout_modes": { + "1x1G": [ + "Ethernet14" + ] + } + }, + "Ethernet14": { + "index": "15", + "lanes": "39", + "breakout_modes": { + "1x1G": [ + "Ethernet15" + ] + } + }, + "Ethernet15": { + "index": "16", + "lanes": "40", + "breakout_modes": { + "1x1G": [ + "Ethernet16" + ] + } + }, + "Ethernet16": { + "index": "17", + "lanes": "41", + "breakout_modes": { + "1x1G": [ + "Ethernet17" + ] + } + }, + "Ethernet17": { + "index": "18", + "lanes": "42", + "breakout_modes": { + "1x1G": [ + "Ethernet18" + ] + } + }, + "Ethernet18": { + "index": "19", + "lanes": "43", + "breakout_modes": { + "1x1G": [ + "Ethernet19" + ] + } + }, + "Ethernet19": { + "index": "20", + "lanes": "44", + "breakout_modes": { + "1x1G": [ + "Ethernet20" + ] + } + }, + "Ethernet20": { + "index": "21", + "lanes": "45", + "breakout_modes": { + "1x1G": [ + "Ethernet21" + ] + } + }, + "Ethernet21": { + "index": "22", + "lanes": "46", + "breakout_modes": { + "1x1G": [ + "Ethernet22" + ] + } + }, + "Ethernet22": { + "index": "23", + "lanes": "47", + "breakout_modes": { + "1x1G": [ + "Ethernet23" + ] + } + }, + "Ethernet23": { + "index": "24", + "lanes": "48", + "breakout_modes": { + "1x1G": [ + "Ethernet24" + ] + } + }, + "Ethernet24": { + "index": "25", + "lanes": "1", + "breakout_modes": { + "1x1G": [ + "Ethernet25" + ] + } + }, + "Ethernet25": { + "index": "26", + "lanes": "2", + "breakout_modes": { + "1x1G": [ + "Ethernet26" + ] + } + }, + "Ethernet26": { + "index": "27", + "lanes": "3", + "breakout_modes": { + "1x1G": [ + "Ethernet27" + ] + } + }, + "Ethernet27": { + "index": "28", + "lanes": "4", + "breakout_modes": { + "1x1G": [ + "Ethernet28" + ] + } + }, + "Ethernet28": { + "index": "29", + "lanes": "5", + "breakout_modes": { + "1x1G": [ + "Ethernet29" + ] + } + }, + "Ethernet29": { + "index": "30", + "lanes": "6", + "breakout_modes": { + "1x1G": [ + "Ethernet30" + ] + } + }, + "Ethernet30": { + "index": "31", + "lanes": "7", + "breakout_modes": { + "1x1G": [ + "Ethernet31" + ] + } + }, + "Ethernet31": { + "index": "32", + "lanes": "8", + "breakout_modes": { + "1x1G": [ + "Ethernet32" + ] + } + }, + "Ethernet32": { + "index": "33", + "lanes": "9", + "breakout_modes": { + "1x1G": [ + "Ethernet33" + ] + } + }, + "Ethernet33": { + "index": "34", + "lanes": "10", + "breakout_modes": { + "1x1G": [ + "Ethernet34" + ] + } + }, + "Ethernet34": { + "index": "35", + "lanes": "11", + "breakout_modes": { + "1x1G": [ + "Ethernet35" + ] + } + }, + "Ethernet35": { + "index": "36", + "lanes": "12", + "breakout_modes": { + "1x1G": [ + "Ethernet36" + ] + } + }, + "Ethernet36": { + "index": "37", + "lanes": "13", + "breakout_modes": { + "1x1G": [ + "Ethernet37" + ] + } + }, + "Ethernet37": { + "index": "38", + "lanes": "14", + "breakout_modes": { + "1x1G": [ + "Ethernet38" + ] + } + }, + "Ethernet38": { + "index": "39", + "lanes": "15", + "breakout_modes": { + "1x1G": [ + "Ethernet39" + ] + } + }, + "Ethernet39": { + "index": "40", + "lanes": "16", + "breakout_modes": { + "1x1G": [ + "Ethernet40" + ] + } + }, + "Ethernet40": { + "index": "41", + "lanes": "17", + "breakout_modes": { + "1x1G": [ + "Ethernet41" + ] + } + }, + "Ethernet41": { + "index": "42", + "lanes": "18", + "breakout_modes": { + "1x1G": [ + "Ethernet42" + ] + } + }, + "Ethernet42": { + "index": "43", + "lanes": "19", + "breakout_modes": { + "1x1G": [ + "Ethernet43" + ] + } + }, + "Ethernet43": { + "index": "44", + "lanes": "20", + "breakout_modes": { + "1x1G": [ + "Ethernet44" + ] + } + }, + "Ethernet44": { + "index": "45", + "lanes": "21", + "breakout_modes": { + "1x1G": [ + "Ethernet45" + ] + } + }, + "Ethernet45": { + "index": "46", + "lanes": "22", + "breakout_modes": { + "1x1G": [ + "Ethernet46" + ] + } + }, + "Ethernet46": { + "index": "47", + "lanes": "23", + "breakout_modes": { + "1x1G": [ + "Ethernet47" + ] + } + }, + "Ethernet47": { + "index": "48", + "lanes": "24", + "breakout_modes": { + "1x1G": [ + "Ethernet48" + ] + } + }, + "Ethernet48": { + "index": "49", + "lanes": "61", + "breakout_modes": { + "1x10G": [ + "Ethernet49" + ] + } + }, + "Ethernet49": { + "index": "50", + "lanes": "62", + "breakout_modes": { + "1x10G": [ + "Ethernet50" + ] + } + }, + "Ethernet50": { + "index": "51", + "lanes": "63", + "breakout_modes": { + "1x10G": [ + "Ethernet51" + ] + } + }, + "Ethernet51": { + "index": "52", + "lanes": "64", + "breakout_modes": { + "1x10G": [ + "Ethernet52" + ] + } + } + } +} diff --git a/device/arista/x86_64-arista_720dt_48s/platform_asic b/device/arista/x86_64-arista_720dt_48s/platform_asic new file mode 100644 index 000000000000..960467652765 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/platform_asic @@ -0,0 +1 @@ +broadcom diff --git a/device/arista/x86_64-arista_720dt_48s/platform_reboot b/device/arista/x86_64-arista_720dt_48s/platform_reboot new file mode 120000 index 000000000000..7f94a49e38b0 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/platform_reboot @@ -0,0 +1 @@ +../x86_64-arista_common/platform_reboot \ No newline at end of file diff --git a/device/arista/x86_64-arista_720dt_48s/plugins b/device/arista/x86_64-arista_720dt_48s/plugins new file mode 120000 index 000000000000..789a45fcace9 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/plugins @@ -0,0 +1 @@ +../x86_64-arista_common/plugins \ No newline at end of file diff --git a/device/arista/x86_64-arista_720dt_48s/pmon_daemon_control.json b/device/arista/x86_64-arista_720dt_48s/pmon_daemon_control.json new file mode 120000 index 000000000000..51d5ab7b0059 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/pmon_daemon_control.json @@ -0,0 +1 @@ +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_720dt_48s/system_health_monitoring_config.json b/device/arista/x86_64-arista_720dt_48s/system_health_monitoring_config.json new file mode 120000 index 000000000000..1185f771fa8e --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/system_health_monitoring_config.json @@ -0,0 +1 @@ +../x86_64-arista_common/system_health_monitoring_config.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm new file mode 100644 index 000000000000..7469c6dbca21 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm @@ -0,0 +1,302 @@ +PHY_AN_ALLOW_PLL_CHANGE=1 +arl_clean_timeout_usec=15000000 +asf_mem_profile.0=0 +bcm_num_cos.0=9 +bcm_stat_flags=1 +bcm_stat_jumbo.0=9236 +cdma_timeout_usec.0=15000000 +disable_pcie_firmware_check.0=1 +dma_desc_timeout_usec.0=15000000 +fpem_mem_entries.0=0 +higig2_hdr_mode.0=1 +ifp_inports_support_enable.0=1 +l2xmsg_mode.0=1 +l2_mem_entries.0=65536 +l3_mem_entries.0=32768 +max_vp_lags.0=0 +mem_scan_enable.0=1 +miim_intr_enable.0=0 +module_64ports.0=1 +multicast_l2_range.0=4095 +multicast_l3_range.0=0 +os=unix +oversubscribe_mode=2 +pbmp_xport_xe.0=0x1e1fffffffffffe +phy_an_c37_53.0=2 +phy_an_c37_54.0=2 +phy_an_c37_55.0=2 +phy_an_c37_56.0=2 +phy_an_c73_1.0=1 +phy_an_c73_10.0=1 +phy_an_c73_11.0=1 +phy_an_c73_12.0=1 +phy_an_c73_13.0=1 +phy_an_c73_14.0=1 +phy_an_c73_15.0=1 +phy_an_c73_16.0=1 +phy_an_c73_17.0=1 +phy_an_c73_18.0=1 +phy_an_c73_19.0=1 +phy_an_c73_2.0=1 +phy_an_c73_20.0=1 +phy_an_c73_21.0=1 +phy_an_c73_22.0=1 +phy_an_c73_23.0=1 +phy_an_c73_24.0=1 +phy_an_c73_3.0=1 +phy_an_c73_4.0=1 +phy_an_c73_5.0=1 +phy_an_c73_53.0=0 +phy_an_c73_54.0=0 +phy_an_c73_55.0=0 +phy_an_c73_56.0=0 +phy_an_c73_6.0=1 +phy_an_c73_7.0=1 +phy_an_c73_8.0=1 +phy_an_c73_9.0=1 +phy_chain_rx_lane_map_physical{1.0}=0x3210 +phy_chain_rx_lane_map_physical{5.0}=0x3210 +phy_chain_rx_lane_map_physical{9.0}=0x3210 +phy_chain_rx_lane_map_physical{13.0}=0x3210 +phy_chain_rx_lane_map_physical{17.0}=0x3210 +phy_chain_rx_lane_map_physical{21.0}=0x3210 +phy_chain_rx_lane_map_physical{25.0}=0x3210 +phy_chain_rx_lane_map_physical{41.0}=0x3120 +phy_chain_rx_lane_map_physical{61.0}=0x1032 +phy_chain_rx_polarity_flip_physical{1.0}=0x0 +phy_chain_rx_polarity_flip_physical{2.0}=0x0 +phy_chain_rx_polarity_flip_physical{3.0}=0x0 +phy_chain_rx_polarity_flip_physical{4.0}=0x0 +phy_chain_rx_polarity_flip_physical{5.0}=0x0 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{8.0}=0x0 +phy_chain_rx_polarity_flip_physical{9.0}=0x0 +phy_chain_rx_polarity_flip_physical{10.0}=0x0 +phy_chain_rx_polarity_flip_physical{11.0}=0x0 +phy_chain_rx_polarity_flip_physical{12.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x0 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x0 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{17.0}=0x0 +phy_chain_rx_polarity_flip_physical{18.0}=0x0 +phy_chain_rx_polarity_flip_physical{19.0}=0x0 +phy_chain_rx_polarity_flip_physical{20.0}=0x0 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x0 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{25.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{33.0}=0x0 +phy_chain_rx_polarity_flip_physical{37.0}=0x0 +phy_chain_rx_polarity_flip_physical{41.0}=0x0 +phy_chain_rx_polarity_flip_physical{45.0}=0x0 +phy_chain_rx_polarity_flip_physical{61.0}=0x0 +phy_chain_rx_polarity_flip_physical{62.0}=0x0 +phy_chain_rx_polarity_flip_physical{63.0}=0x0 +phy_chain_rx_polarity_flip_physical{64.0}=0x0 +phy_chain_tx_lane_map_physical{1.0}=0x3210 +phy_chain_tx_lane_map_physical{5.0}=0x3210 +phy_chain_tx_lane_map_physical{9.0}=0x3210 +phy_chain_tx_lane_map_physical{13.0}=0x3210 +phy_chain_tx_lane_map_physical{17.0}=0x3210 +phy_chain_tx_lane_map_physical{21.0}=0x3210 +phy_chain_tx_lane_map_physical{25.0}=0x3210 +phy_chain_tx_lane_map_physical{41.0}=0x3120 +phy_chain_tx_lane_map_physical{61.0}=0x1032 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 +phy_chain_tx_polarity_flip_physical{2.0}=0x0 +phy_chain_tx_polarity_flip_physical{3.0}=0x0 +phy_chain_tx_polarity_flip_physical{4.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x0 +phy_chain_tx_polarity_flip_physical{6.0}=0x0 +phy_chain_tx_polarity_flip_physical{7.0}=0x0 +phy_chain_tx_polarity_flip_physical{8.0}=0x0 +phy_chain_tx_polarity_flip_physical{9.0}=0x0 +phy_chain_tx_polarity_flip_physical{10.0}=0x0 +phy_chain_tx_polarity_flip_physical{11.0}=0x0 +phy_chain_tx_polarity_flip_physical{12.0}=0x0 +phy_chain_tx_polarity_flip_physical{13.0}=0x0 +phy_chain_tx_polarity_flip_physical{14.0}=0x0 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x0 +phy_chain_tx_polarity_flip_physical{17.0}=0x0 +phy_chain_tx_polarity_flip_physical{18.0}=0x0 +phy_chain_tx_polarity_flip_physical{19.0}=0x0 +phy_chain_tx_polarity_flip_physical{20.0}=0x0 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{22.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{25.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x0 +phy_chain_tx_polarity_flip_physical{33.0}=0x0 +phy_chain_tx_polarity_flip_physical{37.0}=0x0 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{45.0}=0x0 +phy_chain_tx_polarity_flip_physical{61.0}=0x0 +phy_chain_tx_polarity_flip_physical{62.0}=0x0 +phy_chain_tx_polarity_flip_physical{63.0}=0x0 +phy_chain_tx_polarity_flip_physical{64.0}=0x0 +phy_port_primary_and_offset_25=0x0100 +phy_port_primary_and_offset_26=0x0101 +phy_port_primary_and_offset_27=0x0102 +phy_port_primary_and_offset_28=0x0103 +phy_port_primary_and_offset_29=0x0104 +phy_port_primary_and_offset_30=0x0105 +phy_port_primary_and_offset_31=0x0106 +phy_port_primary_and_offset_32=0x0107 +phy_port_primary_and_offset_33=0x0900 +phy_port_primary_and_offset_34=0x0901 +phy_port_primary_and_offset_35=0x0902 +phy_port_primary_and_offset_36=0x0903 +phy_port_primary_and_offset_37=0x0904 +phy_port_primary_and_offset_38=0x0905 +phy_port_primary_and_offset_39=0x0906 +phy_port_primary_and_offset_40=0x0907 +phy_port_primary_and_offset_41=0x1100 +phy_port_primary_and_offset_42=0x1101 +phy_port_primary_and_offset_43=0x1102 +phy_port_primary_and_offset_44=0x1103 +phy_port_primary_and_offset_45=0x1104 +phy_port_primary_and_offset_46=0x1105 +phy_port_primary_and_offset_47=0x1106 +phy_port_primary_and_offset_48=0x1107 +portmap_1.0=25:1 +portmap_2.0=26:1 +portmap_3.0=27:1 +portmap_4.0=28:1 +portmap_5.0=29:1 +portmap_6.0=30:1 +portmap_7.0=31:1 +portmap_8.0=32:1 +portmap_9.0=33:1 +portmap_10.0=34:1 +portmap_11.0=35:1 +portmap_12.0=36:1 +portmap_13.0=37:1 +portmap_14.0=38:1 +portmap_15.0=39:1 +portmap_16.0=40:1 +portmap_17.0=41:1 +portmap_18.0=42:1 +portmap_19.0=43:1 +portmap_20.0=44:1 +portmap_21.0=45:1 +portmap_22.0=46:1 +portmap_23.0=47:1 +portmap_24.0=48:1 +portmap_25.0=1:1 +portmap_26.0=2:1 +portmap_27.0=3:1 +portmap_28.0=4:1 +portmap_29.0=5:1 +portmap_30.0=6:1 +portmap_31.0=7:1 +portmap_32.0=8:1 +portmap_33.0=9:1 +portmap_34.0=10:1 +portmap_35.0=11:1 +portmap_36.0=12:1 +portmap_37.0=13:1 +portmap_38.0=14:1 +portmap_39.0=15:1 +portmap_40.0=16:1 +portmap_41.0=17:1 +portmap_42.0=18:1 +portmap_43.0=19:1 +portmap_44.0=20:1 +portmap_45.0=21:1 +portmap_46.0=22:1 +portmap_47.0=23:1 +portmap_48.0=24:1 +portmap_53.0=61:10 +portmap_54.0=62:10 +portmap_55.0=63:10 +portmap_56.0=64:10 +port_flex_enable.0=1 +port_gmii_mode{25}=1 +port_gmii_mode{41}=1 +port_init_autoneg_1.0=0 +port_init_autoneg_2.0=0 +port_init_autoneg_3.0=0 +port_init_autoneg_4.0=0 +port_init_autoneg_5.0=0 +port_init_autoneg_6.0=0 +port_init_autoneg_7.0=0 +port_init_autoneg_8.0=0 +port_init_autoneg_9.0=0 +port_init_autoneg_10.0=0 +port_init_autoneg_11.0=0 +port_init_autoneg_12.0=0 +port_init_autoneg_13.0=0 +port_init_autoneg_14.0=0 +port_init_autoneg_15.0=0 +port_init_autoneg_16.0=0 +port_init_autoneg_17.0=0 +port_init_autoneg_18.0=0 +port_init_autoneg_19.0=0 +port_init_autoneg_20.0=0 +port_init_autoneg_21.0=0 +port_init_autoneg_22.0=0 +port_init_autoneg_23.0=0 +port_init_autoneg_24.0=0 +port_init_autoneg_53.0=0 +port_init_autoneg_54.0=0 +port_init_autoneg_55.0=0 +port_init_autoneg_56.0=0 +port_phy_addr_1.0=0xff +port_phy_addr_2.0=0xff +port_phy_addr_3.0=0xff +port_phy_addr_4.0=0xff +port_phy_addr_5.0=0xff +port_phy_addr_6.0=0xff +port_phy_addr_7.0=0xff +port_phy_addr_8.0=0xff +port_phy_addr_9.0=0xff +port_phy_addr_10.0=0xff +port_phy_addr_11.0=0xff +port_phy_addr_12.0=0xff +port_phy_addr_13.0=0xff +port_phy_addr_14.0=0xff +port_phy_addr_15.0=0xff +port_phy_addr_16.0=0xff +port_phy_addr_17.0=0xff +port_phy_addr_18.0=0xff +port_phy_addr_19.0=0xff +port_phy_addr_20.0=0xff +port_phy_addr_21.0=0xff +port_phy_addr_22.0=0xff +port_phy_addr_23.0=0xff +port_phy_addr_24.0=0xff +port_phy_addr_53.0=0xff +port_phy_addr_54.0=0xff +port_phy_addr_55.0=0xff +port_phy_addr_56.0=0xff +robust_hash_disable_egress_vlan.0=1 +robust_hash_disable_mpls.0=1 +robust_hash_disable_vlan.0=1 +serdes_core_rx_polarity_flip_physical{1}=0x0 +serdes_core_rx_polarity_flip_physical{5}=0x0 +serdes_core_rx_polarity_flip_physical{9}=0x0 +serdes_core_rx_polarity_flip_physical{13}=0x0 +serdes_core_rx_polarity_flip_physical{17}=0x0 +serdes_core_rx_polarity_flip_physical{21}=0x0 +serdes_core_rx_polarity_flip_physical{25}=0x0 +serdes_core_rx_polarity_flip_physical{41}=0x0 +serdes_core_rx_polarity_flip_physical{61}=0x0 +serdes_core_tx_polarity_flip_physical{1}=0x0 +serdes_core_tx_polarity_flip_physical{5}=0x0 +serdes_core_tx_polarity_flip_physical{9}=0x0 +serdes_core_tx_polarity_flip_physical{13}=0x0 +serdes_core_tx_polarity_flip_physical{17}=0x0 +serdes_core_tx_polarity_flip_physical{21}=0x0 +serdes_core_tx_polarity_flip_physical{25}=0x0 +serdes_core_tx_polarity_flip_physical{41}=0x0 +serdes_core_tx_polarity_flip_physical{61}=0x0 +sram_scan_enable.0=0 +stable_size=0x5500000 +tdma_timeout_usec.0=15000000 +tslam_timeout_usec.0=15000000 diff --git a/device/arista/x86_64-arista_720dt_48s/thermal_policy.json b/device/arista/x86_64-arista_720dt_48s/thermal_policy.json new file mode 120000 index 000000000000..0991dc7f3638 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 4998fea98fc7..0ca7ed4cf8fa 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -537,6 +537,9 @@ write_platform_specific_cmdline() { aboot_machine=arista_7060dx4_32 flash_size=28000 fi + if in_array "$sid" "PikeIslandZ" "PikeIslandZ-F" "PikeIslandZ-2F" "PikeIslandZ-R" "PikeIslandZ-2R"; then + aboot_machine=arista_720dt_48s + fi if [ "$sid" = "BlackhawkT4O" ]; then aboot_machine=arista_7050px4_32s fi @@ -627,6 +630,9 @@ write_platform_specific_cmdline() { cmdline_add reassign_prefmem read_system_eeprom fi + if in_array "$platform" "prairieisland"; then + read_system_eeprom + fi if [ $flash_size -ge 28000 ]; then varlog_size=4096 diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 9af44f221fe9..ff9922d9c4f9 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -31,7 +31,7 @@ wait_get_flash_dev() { if [ -n "$is_mmc" ]; then continue fi - local devid=$(realpath "/sys/block/$dev/device") + local devid="$(realpath "/sys/block/$dev/device")/" local is_device=$(echo "$devid" | grep '^/sys/devices/' | cat) local is_flash=$(echo "$devid" | grep "$block_flash" | cat) if [ -n "$is_device" -a -n "$is_flash" ]; then From 05f1c6f27ffbade4f691455dc707b8d9d4231c36 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Wed, 29 Jun 2022 09:58:35 -0700 Subject: [PATCH 482/817] [macsec] Parse masec_enabled and macsec_profile from minigraph (#10917) * Updates needed to parse the macsec config from minigraph * Add unit tests in tests/test_cfggen.py::TestCfgGen, and updates --- src/sonic-config-engine/minigraph.py | 41 ++++++++++++++++--- src/sonic-config-engine/tests/common_utils.py | 3 ++ .../tests/macsec_profile.json | 22 ++++++++++ .../tests/sample-voq-graph.xml | 41 ++++++++++++++----- src/sonic-config-engine/tests/test_cfggen.py | 22 ++++++---- 5 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 src/sonic-config-engine/tests/macsec_profile.json diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 15d6682359f3..2bcef2232aef 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -890,6 +890,7 @@ def parse_meta(meta, hname): switch_type = None max_cores = None kube_data = {} + macsec_profile = {} device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower(): @@ -930,7 +931,9 @@ def parse_meta(meta, hname): kube_data["enable"] = value elif name == "KubernetesServerIp": kube_data["ip"] = value - return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data + elif name == 'MacSecProfile': + macsec_profile = parse_macsec_profile(value) + return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile def parse_system_defaults(meta): @@ -979,6 +982,7 @@ def parse_linkmeta(meta, hname): upper_tor_hostname = '' lower_tor_hostname = '' auto_negotiation = None + macsec_enabled = False properties = linkmeta.find(str(QName(ns1, "Properties"))) for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))): @@ -994,6 +998,8 @@ def parse_linkmeta(meta, hname): lower_tor_hostname = value elif name == "AutoNegotiation": auto_negotiation = value + elif name == "MacSecEnabled": + macsec_enabled = value linkmetas[port] = {} if fec_disabled: @@ -1005,14 +1011,28 @@ def parse_linkmeta(meta, hname): linkmetas[port]["PeerSwitch"] = upper_tor_hostname if auto_negotiation: linkmetas[port]["AutoNegotiation"] = auto_negotiation + if macsec_enabled: + linkmetas[port]["MacSecEnabled"] = macsec_enabled return linkmetas +def parse_macsec_profile(val_string): + macsec_profile = {} + values = val_string.strip().split() + for val in values: + keys = val.strip().split('=') + if keys[0] == 'PrimaryKey': + macsec_profile['PrimaryKey'] = keys[1].strip('\"') + elif keys[0] == 'FallbackKey': + macsec_profile['FallbackKey'] = keys[1].strip('\"') + + return macsec_profile def parse_asic_meta(meta, hname): sub_role = None switch_id = None switch_type = None max_cores = None + macsec_profile = {} device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower(): @@ -1028,7 +1048,10 @@ def parse_asic_meta(meta, hname): switch_type = value elif name == "MaxCores": max_cores = value - return sub_role, switch_id, switch_type, max_cores + elif name == 'MacSecProfile': + macsec_profile = parse_macsec_profile(value) + + return sub_role, switch_id, switch_type, max_cores, macsec_profile def parse_deviceinfo(meta, hwsku): port_speeds = {} @@ -1289,6 +1312,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw kube_data = {} static_routes = {} system_defaults = {} + macsec_profile = {} hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -1319,7 +1343,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1335,7 +1359,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (sub_role, switch_id, switch_type, max_cores ) = parse_asic_meta(child, asic_name) + (sub_role, switch_id, switch_type, max_cores, macsec_profile) = parse_asic_meta(child, asic_name) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1538,6 +1562,11 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if autoneg: port['autoneg'] = 'on' if autoneg.lower() == 'true' else 'off' + # If macsec is enabled on interface, and profile is valid, add the profile to port + macsec_enabled = linkmetas.get(alias, {}).get('MacSecEnabled') + if macsec_enabled and 'PrimaryKey' in macsec_profile: + port['macsec'] = macsec_profile['PrimaryKey'] + # If connected to a smart cable, get the connection position for port_name, port in ports.items(): if port_name in mux_cable_ports: @@ -1872,7 +1901,7 @@ def parse_asic_sub_role(filename, asic_name): root = ET.parse(filename).getroot() for child in root: if child.tag == str(QName(ns, "MetadataDeclaration")): - sub_role, _, _, _ = parse_asic_meta(child, asic_name) + sub_role, _, _, _, _= parse_asic_meta(child, asic_name) return sub_role def parse_asic_switch_type(filename, asic_name): @@ -1880,7 +1909,7 @@ def parse_asic_switch_type(filename, asic_name): root = ET.parse(filename).getroot() for child in root: if child.tag == str(QName(ns, "MetadataDeclaration")): - _, _, switch_type, _ = parse_asic_meta(child, asic_name) + _, _, switch_type, _, _ = parse_asic_meta(child, asic_name) return switch_type return None diff --git a/src/sonic-config-engine/tests/common_utils.py b/src/sonic-config-engine/tests/common_utils.py index 7b8d2b4e27a4..72325ecbc1e0 100644 --- a/src/sonic-config-engine/tests/common_utils.py +++ b/src/sonic-config-engine/tests/common_utils.py @@ -61,6 +61,7 @@ def validate(self, argument): parser.add_argument("-n", "--namespace", help="namespace name", nargs='?', const=None, default=None) parser.add_argument("-p", "--port-config", help="port config file, used with -m or -k", nargs='?', const=None) parser.add_argument("-S", "--hwsku-config", help="hwsku config file, used with -p and -m or -k", nargs='?', const=None) + parser.add_argument("-j", "--json", help="additional json file input, used with -p, -S and -m or -k", nargs='?', const=None) args, unknown = parser.parse_known_args(shlex.split(argument)) print('\n Validating yang schema') @@ -73,6 +74,8 @@ def validate(self, argument): cmd += ' -p ' + args.port_config if args.namespace is not None: cmd += ' -n ' + args.namespace + if args.json is not None: + cmd += ' -j ' + args.json cmd += ' --print-data' output = subprocess.check_output(cmd, shell=True).decode() try: diff --git a/src/sonic-config-engine/tests/macsec_profile.json b/src/sonic-config-engine/tests/macsec_profile.json new file mode 100644 index 000000000000..b70f1a052128 --- /dev/null +++ b/src/sonic-config-engine/tests/macsec_profile.json @@ -0,0 +1,22 @@ +{ + "MACSEC_PROFILE":{ + "macsec-profile": { + "cipher_suite": "GCM-AES-XPN-256", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435", + "fallback_cak": "0000000000000000000000000000000000000000000000000000000000000000", + "fallback_ckn": "1111111111111111111111111111111111111111111111111111111111111111", + "priority": "0", + "rekey_period": "60" + }, + "macsec-profile2": { + "cipher_suite": "GCM-AES-XPN-256", + "primary_cak": "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", + "primary_ckn": "6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435", + "fallback_cak": "0000000000000000000000000000000000000000000000000000000000000000", + "fallback_ckn": "1111111111111111111111111111111111111111111111111111111111111111", + "priority": "0", + "rekey_period": "60" + } + } +} diff --git a/src/sonic-config-engine/tests/sample-voq-graph.xml b/src/sonic-config-engine/tests/sample-voq-graph.xml index 5205265ee384..f1fa43620345 100644 --- a/src/sonic-config-engine/tests/sample-voq-graph.xml +++ b/src/sonic-config-engine/tests/sample-voq-graph.xml @@ -67,6 +67,21 @@ + + + + + + + MacSecEnabled + True + + + linecard-1:Ethernet1/1;ARISTA01-RH:Ethernet1/1 + + + + @@ -144,6 +159,10 @@ 16 + + MacSecProfile + PrimaryKey="macsec-profile" FallbackKey="macsec-profile2" MacsecPolicy="" + @@ -157,36 +176,36 @@ true 1 - fortyGigE0/0 + Ethernet1/1 false 0 0 - 10000 + 100000 DeviceInterface true 1 - fortyGigE0/4 + Ethernet2/1 false 0 0 - 25000 + 100000 DeviceInterface true 1 - fortyGigE0/8 + Ethernet3/1 false 0 0 - 40000 + 100000 Interface description @@ -194,7 +213,7 @@ true 1 - fortyGigE0/12 + Ethernet4/1 false 0 @@ -207,7 +226,7 @@ true 1 - fortyGigE0/16 + Ethernet5/1 false 0 @@ -219,7 +238,7 @@ true 1 - fortyGigE0/20 + Ethernet6/1 false 0 @@ -231,7 +250,7 @@ true 1 - fortyGigE0/24 + Ethernet7/1 false 0 @@ -243,7 +262,7 @@ true 1 - fortyGigE0/28 + Ethernetr8/1 false 0 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 175aefff8da4..0c3519068e90 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -38,6 +38,7 @@ def setUp(self): self.voq_port_config = os.path.join(self.test_dir, 'voq-sample-port-config.ini') self.packet_chassis_graph = os.path.join(self.test_dir, 'sample-chassis-packet-lc-graph.xml') self.packet_chassis_port_ini = os.path.join(self.test_dir, 'sample-chassis-packet-lc-port-config.ini') + self.macsec_profile = os.path.join(self.test_dir, 'macsec_profile.json') # To ensure that mock config_db data is used for unit-test cases os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -839,7 +840,7 @@ def test_show_run_interfaces(self): self.assertEqual(output, '') def test_minigraph_voq_metadata(self): - argument = "-m {} -p {} --var-json DEVICE_METADATA".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json DEVICE_METADATA".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) output = json.loads(self.run_script(argument)) self.assertEqual(output['localhost']['asic_name'], 'Asic0') self.assertEqual(output['localhost']['switch_id'], '0') @@ -847,7 +848,7 @@ def test_minigraph_voq_metadata(self): self.assertEqual(output['localhost']['max_cores'], '16') def test_minigraph_voq_system_ports(self): - argument = "-m {} -p {} --var-json SYSTEM_PORT".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json SYSTEM_PORT".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) self.assertDictEqual( json.loads(self.run_script(argument)), { @@ -865,8 +866,16 @@ def test_minigraph_voq_system_ports(self): } ) + def test_minigraph_voq_port_macsec_enabled(self): + argument = '-j "' + self.macsec_profile + '" -m "' + self.sample_graph_voq + '" -p "' + self.voq_port_config + '" -v "PORT[\'Ethernet0\']"' + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + utils.to_dict("{'lanes': '6,7', 'fec': 'rs', 'alias': 'Ethernet1/1', 'index': '1', 'role': 'Ext', 'speed': '100000', 'macsec': 'macsec-profile', 'description': 'Ethernet1/1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off'}") + ) + def test_minigraph_voq_inband_interface_vlan(self): - argument = "-m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( @@ -879,7 +888,7 @@ def test_minigraph_voq_inband_interface_vlan(self): ) def test_minigraph_voq_inband_interface_port(self): - argument = "-m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json VOQ_INBAND_INTERFACE".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( @@ -892,7 +901,7 @@ def test_minigraph_voq_inband_interface_port(self): ) def test_minigraph_voq_inband_port(self): - argument = "-m {} -p {} --var-json PORT".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json PORT".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( @@ -910,7 +919,7 @@ def test_minigraph_voq_inband_port(self): }) def test_minigraph_voq_recirc_ports(self): - argument = "-m {} -p {} --var-json PORT".format(self.sample_graph_voq, self.voq_port_config) + argument = "-j {} -m {} -p {} --var-json PORT".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) output = self.run_script(argument) output_dict = utils.to_dict(output.strip()) self.assertDictEqual( @@ -968,4 +977,3 @@ def test_minigraph_bgp_packet_chassis_vlan_subintf(self): utils.to_dict(output.strip()), utils.to_dict("{('PortChannel32.2', '192.168.1.4/24'): {}, 'PortChannel32.2': {'admin_status': 'up'}, ('PortChannel33.2', '192.168.2.4/24'): {}, 'PortChannel33.2': {'admin_status': 'up'}}") ) - From dbc6681dbbc44d45394b0addb4dfc190aee852cc Mon Sep 17 00:00:00 2001 From: Senthil Kumar Guruswamy <75792349+sg893052@users.noreply.github.com> Date: Thu, 30 Jun 2022 03:46:57 +0530 Subject: [PATCH 483/817] Add yang model unit test for check_up_status field type (#11243) #### Why I did it To address https://github.com/Azure/sonic-buildimage/issues/11110 - Add yang model unit test for check_up_status field type #### How I did it Add check_up_status with different values in sample_config_db.json and the field with correct and incorrect values in feature.json #### How to verify it Build sonic_yang_models-1.0-py3-none-any.whl --- .../tests/files/sample_config_db.json | 21 ++++++++++----- .../tests_config/feature.json | 27 ++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index d8f90284091a..cee594b23634 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1465,7 +1465,8 @@ "has_timer": "False", "high_mem_alert": "disabled", "state": "enabled", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "False" }, "database": { "auto_restart": "always_enabled", @@ -1474,7 +1475,8 @@ "has_timer": "false", "high_mem_alert": "disabled", "state": "always_enabled", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "false" }, "snmp": { "auto_restart": "enabled", @@ -1483,7 +1485,8 @@ "has_timer": "true", "high_mem_alert": "disabled", "state": "enabled", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "true" }, "swss": { "auto_restart": "enabled", @@ -1492,7 +1495,8 @@ "has_timer": "false", "high_mem_alert": "disabled", "state": "enabled", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "false" }, "syncd": { "auto_restart": "enabled", @@ -1501,7 +1505,8 @@ "has_timer": "false", "high_mem_alert": "disabled", "state": "enabled", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "false" }, "lldp": { "auto_restart": "enabled", @@ -1510,7 +1515,8 @@ "has_timer": "false", "high_mem_alert": "disabled", "state": "enabled", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "false" }, "dhcp_relay": { "auto_restart": "enabled", @@ -1519,7 +1525,8 @@ "has_timer": "false", "high_mem_alert": "disabled", "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "true" } }, "DHCP_RELAY": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/feature.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/feature.json index 82e403cb147c..08c974d8e45f 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/feature.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/feature.json @@ -10,7 +10,8 @@ "has_timer": "False", "has_global_scope": "True", "has_per_asic_scope": "True", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "False" }, { "name": "swss", @@ -19,7 +20,8 @@ "has_timer": "false", "has_global_scope": "false", "has_per_asic_scope": "true", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "false" }, { "name": "syncd", @@ -28,7 +30,8 @@ "has_timer": "false", "has_global_scope": "false", "has_per_asic_scope": "true", - "set_owner": "local" + "set_owner": "local", + "check_up_status": "false" }, { "name": "snmp", @@ -37,7 +40,8 @@ "has_timer": "false", "has_global_scope": "true", "has_per_asic_scope": "false", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "false" }, { "name": "lldp", @@ -46,7 +50,8 @@ "has_timer": "false", "has_global_scope": "false", "has_per_asic_scope": "true", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "false" }, { "name": "dhcp_relay", @@ -55,7 +60,8 @@ "has_timer": "false", "has_global_scope": "false", "has_per_asic_scope": "true", - "set_owner": "kube" + "set_owner": "kube", + "check_up_status": "false" } ] } @@ -72,7 +78,8 @@ "has_timer": "false", "has_global_scope": "false", "has_per_asic_scope": "true", - "set_owner": "invalid" + "set_owner": "invalid", + "check_up_status": "false" } ] } @@ -88,7 +95,8 @@ "auto_restart": "disabled", "has_timer": "false", "has_global_scope": "false", - "has_per_asic_scope": "true" + "has_per_asic_scope": "true", + "check_up_status": "false" } ] } @@ -104,7 +112,8 @@ "auto_restart": "always_enabled", "has_timer": "FALSE", "has_global_scope": "TRUE", - "has_per_asic_scope": "TRUE" + "has_per_asic_scope": "TRUE", + "check_up_status": "FALSE" } ] } From 859b4793d2b18f8cfaf1f3359e8266fba6c97539 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Thu, 30 Jun 2022 10:09:54 +0800 Subject: [PATCH 484/817] [yang] update TCP_FLAGS format in sonic-acl.yang (#11270) Why I did it Fix #11224 TCP_FLAGS supports flags/mask pattern. How I did it Change the pattern. How to verify it Add unit test. --- .../tests/yang_model_tests/tests/acl.json | 3 ++ .../yang_model_tests/tests_config/acl.json | 40 ++++++++++++++++++- .../yang-templates/sonic-acl.yang.j2 | 2 +- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json index b7968e240767..3bfb0611fb2e 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/acl.json @@ -129,5 +129,8 @@ }, "ACL_RULE_WITH_VALID_MIRROR_INGRESS_ACTION": { "desc": "Configure ACL_RULE with valid mirror action." + }, + "ACL_RULE_VALID_TCP_FLAGS": { + "desc": "Configure ACL_RULE with valid TCP_FLAGS." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json index d98645b8a19c..6c3d3ad3ec64 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/acl.json @@ -953,7 +953,7 @@ "ACL_TABLE_NAME": "EVERFLOW_DSCP", "policy_desc": "EVERFLOW_DSCP", "ports": [ - "" + "" ], "stage": "ingress", "type": "MIRROR_DSCP" @@ -981,7 +981,7 @@ "ACL_TABLE_NAME": "EVERFLOW_DSCP", "policy_desc": "EVERFLOW_DSCP", "ports": [ - "" + "" ], "stage": "ingress", "type": "MIRROR_DSCP" @@ -1003,5 +1003,41 @@ ] } } + }, + "ACL_RULE_VALID_TCP_FLAGS": { + "sonic-acl:sonic-acl": { + "sonic-acl:ACL_RULE": { + "ACL_RULE_LIST": [ + { + "ACL_TABLE_NAME": "TCP_FLAGS_TEST", + "ETHER_TYPE": "2048", + "PACKET_ACTION": "DROP", + "PRIORITY": 9981, + "TCP_FLAGS": "0x24", + "RULE_NAME": "Rule_19" + }, + { + "ACL_TABLE_NAME": "TCP_FLAGS_TEST", + "ETHER_TYPE": "2048", + "PACKET_ACTION": "DROP", + "PRIORITY": 9981, + "TCP_FLAGS": "0x24/0x24", + "RULE_NAME": "Rule_20" + } + + ] + }, + "sonic-acl:ACL_TABLE": { + "ACL_TABLE_LIST": [ + { + "ACL_TABLE_NAME": "TCP_FLAGS_TEST", + "policy_desc": "TCP_FLAGS_TEST", + "ports": [ "" ], + "stage": "INGRESS", + "type": "L3" + } + ] + } + } } } diff --git a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 index 2a527aa2bcf9..e9461be2ceed 100644 --- a/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-acl.yang.j2 @@ -184,7 +184,7 @@ module sonic-acl { leaf TCP_FLAGS { type string { - pattern '0[x][0-9a-fA-F]{1,2}|0[X][0-9a-fA-F]{1,2}'; + pattern '0[xX][0-9a-fA-F]{1,2}(/0[xX][0-9a-fA-F]{1,2})?'; } } From 5d03b5d0dfa3517e8bd0ab9d6b1c6c41e7c25370 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Wed, 29 Jun 2022 21:34:02 -0700 Subject: [PATCH 485/817] Avoid write_standby in warm restart context (#11283) Avoid write_standby in warm restart context. sign-off: Jing Zhang zhangjing@microsoft.com Why I did it In warm restart context, we should avoid mux state change. How I did it Check warm restart flag before applying changes to app db. How to verify it Ran write_standby in table missing, key missing, field missing scenarios. Did a warm restart, app db changes were skipped. Saw this in syslog: WARNING write_standby: Taking no action due to ongoing warmrestart. --- files/scripts/write_standby.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/files/scripts/write_standby.py b/files/scripts/write_standby.py index 53cf5265ecde..3a41fe58bbe6 100755 --- a/files/scripts/write_standby.py +++ b/files/scripts/write_standby.py @@ -3,8 +3,8 @@ import time from sonic_py_common import logger as log -from swsscommon.swsscommon import ConfigDBConnector, DBConnector, FieldValuePairs, ProducerStateTable, SonicV2Connector -from swsscommon.swsscommon import APPL_DB +from swsscommon.swsscommon import ConfigDBConnector, DBConnector, FieldValuePairs, ProducerStateTable, SonicV2Connector, Table +from swsscommon.swsscommon import APPL_DB, STATE_DB logger = log.Logger('write_standby') @@ -22,6 +22,7 @@ class MuxStateWriter(object): def __init__(self): self.config_db_connector = None self.appl_db_connector = None + self.state_db_connector = None self.asic_db_connector = None @property @@ -45,6 +46,16 @@ def appl_db(self): if self.appl_db_connector is None: self.appl_db_connector = DBConnector(APPL_DB, REDIS_SOCK_PATH, True) return self.appl_db_connector + + @property + def state_db(self): + """ + Returns the state DB connector. + Intializes the connector during the first call + """ + if self.state_db_connector is None: + self.state_db_connector = DBConnector(STATE_DB, REDIS_SOCK_PATH, True) + return self.state_db_connector @property def asic_db(self): @@ -75,6 +86,16 @@ def is_dualtor(self): return 'subtype' in metadata and 'dualtor' in metadata['subtype'].lower() + @property + def is_warmrestart(self): + """ + Checks if a warmrestart is going on + """ + tbl = Table(self.state_db, 'WARM_RESTART_ENABLE_TABLE') + (status, value) = tbl.hget('system', 'enable') + + return status and value == 'true' + def get_auto_mux_intfs(self): """ Returns a list of all mux cable interfaces that are configured to auto-switch @@ -117,6 +138,12 @@ def apply_mux_config(self): if not self.is_dualtor: # If not running on a dual ToR system, take no action return + + if self.is_warmrestart: + # If in warmrestart context, take no action + logger.log_warning("Skip setting mux state due to ongoing warmrestart.") + return + intfs = self.get_auto_mux_intfs() state = 'standby' if self.wait_for_tunnel(): From 09376421e133cc556f81760ecd49a1e4914b5984 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Thu, 30 Jun 2022 07:54:36 +0000 Subject: [PATCH 486/817] Upgrade gbsyncd container to bullseye (#11288) Update the base of docker gbsyncd from buster to bullseye --- platform/components/docker-gbsyncd-credo/Dockerfile.j2 | 2 +- platform/template/docker-gbsyncd-base.mk | 10 +++++----- platform/vs/docker-gbsyncd-vs/Dockerfile.j2 | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 index 98717c31e057..3010dc7fdad5 100644 --- a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 +++ b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/platform/template/docker-gbsyncd-base.mk b/platform/template/docker-gbsyncd-base.mk index 0b02557845f9..712554405080 100644 --- a/platform/template/docker-gbsyncd-base.mk +++ b/platform/template/docker-gbsyncd-base.mk @@ -9,18 +9,18 @@ $(DOCKER_GBSYNCD_BASE)_PATH = $(PLATFORM_PATH)/docker-gbsyncd-$(DOCKER_GBSYNCD_P $(DOCKER_GBSYNCD_BASE)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -$(DOCKER_GBSYNCD_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_GBSYNCD_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) -$(DOCKER_GBSYNCD_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_GBSYNCD_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) -$(DOCKER_GBSYNCD_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_GBSYNCD_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) SONIC_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BASE) -SONIC_BUSTER_DOCKERS += $(DOCKER_GBSYNCD_BASE) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_GBSYNCD_BASE) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BASE) SONIC_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BASE_DBG) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_GBSYNCD_BASE_DBG) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_GBSYNCD_BASE_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BASE_DBG) $(DOCKER_GBSYNCD_BASE)_CONTAINER_NAME = gbsyncd diff --git a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 index 08956a44ce77..4dd9abf49ee7 100644 --- a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 +++ b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name From 2aac98804938b47599ab41c0a513281d7097e5c0 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Thu, 30 Jun 2022 17:51:25 +0800 Subject: [PATCH 487/817] [build] Fix libssl version issue. (#11287) The following packages have unmet dependencies: libssl-dev : Depends: libssl1.1 (= 1.1.1n-0+deb11u3) but 1.1.1n-0+deb11u2 is to be installed E: Unable to correct problems, you have held broken packages. --- sonic-slave-bullseye/Dockerfile.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index f190f0b35e3d..edac99af113e 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -21,6 +21,7 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bull echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian bullseye-backports main" >> /etc/apt/sources.list && \ + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list @@ -32,6 +33,7 @@ RUN echo "deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib no echo "deb [arch=armhf] http://security.debian.org bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb-src [arch=armhf] http://security.debian.org bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=armhf] http://ftp.debian.org/debian bullseye-backports main' >> /etc/apt/sources.list && \ + echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list {%- elif CONFIGURED_ARCH == "arm64" %} @@ -41,6 +43,7 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian bullseye main contrib no echo "deb-src [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://security.debian.org bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb-src [arch=arm64] http://security.debian.org bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=arm64] http://ftp.debian.org/debian bullseye-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list From df28eceb35eb2b80bd9a8d3313274720538b3314 Mon Sep 17 00:00:00 2001 From: WistronNetwork <106370135+WistronNetwork@users.noreply.github.com> Date: Fri, 1 Jul 2022 00:13:56 +0800 Subject: [PATCH 488/817] [Wistron] Add 6512-32r platform support (#10956) Why I did it Add 6512-32r support for Wistron platform Update sw-to3200k for newer branch How I did it Add code in device and platform folder for 6512-32r Update sw-to3200k code both in device and platform folder How to verify it Install on Wistron device and run command to verify Signed-off-by: RogerChang Roger_Chang@wistron.com --- .../x86_64-wistron_6512_32r-r0/default_sku | 1 + .../x86_64-wistron_6512_32r-r0/installer.conf | 4 + .../x86_64-wistron_6512_32r-r0/platform_asic | 1 + .../plugins/eeprom.py | 26 + .../plugins/psuutil.py | 59 + .../plugins/sfputil.py | 220 + .../pmon_daemon_control.json | 3 + .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 222 + .../sonic_platform/eeprom.py | 110 + .../sonic_platform/fan.py | 182 + .../sonic_platform/platform.py | 20 + .../sonic_platform/psu.py | 248 + .../sonic_platform/sfp.py | 1443 +++++ .../sonic_platform/thermal.py | 136 + .../sonic_platform/watchdog.py | 73 + .../x86_64-wistron_6512_32r-r0/topo.conf | 1 + .../6512-32_32x400G.config.yaml | 430 ++ .../wistron_6512_32r/buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../wistron_6512_32r/buffers_defaults_t1.j2 | 137 + .../wistron_6512_32r/innovium.77700_A | 59 + .../wistron_6512_32r/innovium.77700_B | 59 + .../wistron_6512_32r/ivm.sai.config.yaml | 8 + .../ivm.sai.datapath.config.yaml | 9 + .../wistron_6512_32r/pg_profile_lookup.ini | 18 + .../wistron_6512_32r/port_config.ini | 33 + .../wistron_6512_32r/qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../wistron_6512_32r/qos_defaults_t1.j2 | 114 + .../wistron_6512_32r/sai.profile | 1 + .../CSV/TL7_DAC_1M.csv | 342 ++ .../CSV/TL7_DAC_3M.csv | 342 ++ .../CSV/TL7_Optics.csv | 289 + .../Wistron_sw_to3200k/buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../Wistron_sw_to3200k/buffers_defaults_t1.j2 | 137 + .../config_32x400G_wistron_sw_to3200k.yaml | 426 ++ .../Wistron_sw_to3200k/innovium.77700_A | 59 + .../Wistron_sw_to3200k/innovium.77700_B | 59 + .../Wistron_sw_to3200k/ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../Wistron_sw_to3200k/pg_profile_lookup.ini | 18 + .../Wistron_sw_to3200k/port_config.ini | 33 + .../Wistron_sw_to3200k/qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../Wistron_sw_to3200k/qos_defaults_t1.j2 | 114 + .../Wistron_sw_to3200k/sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...g_104x1025G_6x100G_wistron_sw_to3200k.yaml | 972 ++++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 111 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...fig_24x400G_8x100G_wistron_sw_to3200k.yaml | 426 ++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 33 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...fig_28x400G_4x100G_wistron_sw_to3200k.yaml | 426 ++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 33 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../Wistron_sw_to3200k_32x100/buffers.json.j2 | 137 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + .../config_32x100G_wistron_sw_to3200k.yaml | 425 ++ .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../Wistron_sw_to3200k_32x100/port_config.ini | 33 + .../Wistron_sw_to3200k_32x100/qos.json.j2 | 114 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../Wistron_sw_to3200k_32x100/sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...nfig_72x25G_6x400G_wistron_sw_to3200k.yaml | 804 +++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 87 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../x86_64-wistron_sw_to3200k-r0/default_sku | 1 + .../installer.conf | 4 + .../platform_asic | 1 + .../plugins/eeprom.py | 26 + .../plugins/psuutil.py | 59 + .../plugins/sfputil.py | 186 + .../pmon_daemon_control.json | 3 + .../sw-to3200k_sonic_serdes.config | 5135 +++++++++++++++++ .../x86_64-wistron_sw_to3200k-r0/topo.conf | 1 + platform/innovium/one-image.mk | 1 + platform/innovium/platform-modules-wistron.mk | 19 + platform/innovium/rules.mk | 1 + .../6512-32r/modules/Makefile | 20 + .../6512-32r/modules/wistron_6512_32r_cpld.c | 953 +++ .../6512-32r/modules/wistron_6512_32r_fan.c | 255 + .../6512-32r/modules/wistron_6512_32r_leds.c | 245 + .../6512-32r/modules/wistron_6512_32r_oom.c | 312 + .../6512-32r/modules/wistron_6512_32r_psu.c | 347 ++ .../modules/wistron_6512_32r_syseeprom.c | 161 + .../modules/wistron_6512_32r_thermal.c | 200 + .../service/6512-32r-platform.service | 13 + .../service/6512-32r-syseeprom.service | 12 + .../service/platform-modules-6512-32r.service | 14 + .../6512-32r/setup.py | 34 + .../6512-32r/utils/platform_sync | 7 + .../6512-32r/utils/platform_syseeprom | 10 + .../6512-32r/utils/sonic-fanthrml-monitor | 416 ++ .../6512-32r/utils/sonic-led-monitor | 70 + .../6512-32r/utils/sonic-psu-monitor | 248 + .../6512-32r/utils/sonic-qsfp-monitor | 479 ++ .../6512-32r/utils/wistron_6512_32r_util.py | 482 ++ .../sonic-platform-modules-wistron/LICENSE | 16 + .../sw-to3200k/cfg/sw-to3200k-modules.conf | 18 + .../sw-to3200k/classes/__init__.py | 0 .../sw-to3200k/modules/Makefile | 20 + .../sw-to3200k/modules/wistron_i2c_psu.c | 469 ++ .../modules/wistron_sw_to3200k_cpld.c | 701 +++ .../modules/wistron_sw_to3200k_fan.c | 299 + .../modules/wistron_sw_to3200k_leds.c | 293 + .../modules/wistron_sw_to3200k_oom.c | 397 ++ .../modules/wistron_sw_to3200k_psu.c | 266 + .../modules/wistron_sw_to3200k_thermal.c | 205 + .../platform-modules-sw-to3200k.service | 14 + .../sw-to3200k/service/to3200k-led.service | 12 + .../service/to3200k-platform.service | 13 + .../sw-to3200k/service/to3200k-pld.service | 12 + .../sw-to3200k/setup.py | 32 + .../sw-to3200k/sonic_platform/__init__.py | 2 + .../sw-to3200k/sonic_platform/chassis.py | 233 + .../sw-to3200k/sonic_platform/eeprom.py | 110 + .../sw-to3200k/sonic_platform/fan.py | 192 + .../sw-to3200k/sonic_platform/platform.py | 20 + .../sw-to3200k/sonic_platform/psu.py | 278 + .../sw-to3200k/sonic_platform/sfp.py | 1515 +++++ .../sw-to3200k/sonic_platform/thermal.py | 165 + .../sw-to3200k/sonic_platform/watchdog.py | 73 + .../sw-to3200k/utils/platform_led | 4 + .../sw-to3200k/utils/platform_pld | 4 + .../sw-to3200k/utils/platform_sync | 7 + .../sw-to3200k/utils/sonic-fanthrml-monitor | 354 ++ .../sw-to3200k/utils/sonic-led-monitor | 201 + .../sw-to3200k/utils/sonic-psu-monitor | 328 ++ .../sw-to3200k/utils/sonic-qsfp-monitor | 399 ++ .../utils/wistron_sw_to3200k_util.py | 442 ++ 181 files changed, 29866 insertions(+) create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/default_sku create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/installer.conf create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/platform_asic create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/topo.conf create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf create mode 100644 platform/innovium/platform-modules-wistron.mk create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/LICENSE create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/default_sku b/device/wistron/x86_64-wistron_6512_32r-r0/default_sku new file mode 100644 index 000000000000..3b1993095024 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/default_sku @@ -0,0 +1 @@ +wistron_6512_32r t1 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf new file mode 100644 index 000000000000..d5f9419d77ff --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic b/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic new file mode 100644 index 000000000000..84083a7415d9 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic @@ -0,0 +1 @@ +innovium diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py new file mode 100644 index 000000000000..ede2cced3b9b --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +def eeprom_check(): + filepath="/sys/bus/i2c/devices/0-0055/eeprom" + if os.path.isfile(filepath): + return 1 #now board, 0x56 + else: + return 0 #now board, 0x57 + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + ret=eeprom_check() + if ret==1: + self.eeprom_path = "/sys/bus/i2c/devices/0-0055/eeprom" + else: + pass + + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py new file mode 100644 index 000000000000..000180c155d3 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/present" + self.psu_oper_status = "/power_good" + self.psu_mapping = { + 2: "0-0059", + 1: "0-005a", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py new file mode 100644 index 000000000000..8dbc6ba8519a --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py @@ -0,0 +1,220 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/0-00" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/0-0006/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/0-0007/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: '10', + 1: '11', + 2: '12', + 3: '13', + 4: '14', + 5: '15', + 6: '16', + 7: '17', + 8: '18', + 9: '19', + 10: '1a', + 11: '1b', + 12: '1c', + 13: '1d', + 14: '1e', + 15: '1f', + 16: '20', + 17: '21', + 18: '22', + 19: '23', + 20: '24', + 21: '25', + 22: '26', + 23: '27', + 24: '28', + 25: '29', + 26: '2a', + 27: '2b', + 28: '2c', + 29: '2d', + 30: '2e', + 31: '2f', + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def is_logical_port(self, port_name): + return True + + def get_logical_to_physical(self, port_name): + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return None + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + port_idx = port_idx // 8 + return [port_idx] + + def __init__(self): + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = self.BASE_OOM_PATH + self.port_to_i2c_mapping[x] + "/eeprom1" + + self._transceiver_presence = {} + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < 16: + present_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_present" + else: + present_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_present" + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print("Error: unable to access file: %s" % str(e)) + return False + + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < 16: + lpmode_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_lpmode" + else: + lpmode_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_lpmode" + self.__port_to_is_lpmode = lpmode_path + + try: + val_file = open(self.__port_to_is_lpmode) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print("Error: unable to access file: %s" % str(e)) + return False + + if content == "1": + return True + + return False + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < 16: + lpmode_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_lpmode" + else: + lpmode_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_lpmode" + self.__port_to_is_lpmode = lpmode_path + + try: + val_file = open(self.__port_to_is_lpmode, 'w') + val_file.write('1' if lpmode else '0') + val_file.close() + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + def reset(self, port_num): + raise NotImplementedError + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, self.port_end+1): + port_pres[port] = self.get_presence(port) + + return port_pres + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_transceiver_change_event:Invalid timeout value", timeout) + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print('get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout) + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + change_status = False + + cur_presence = self._get_sfp_presence() + for port in range(0, self.port_end+1): + if cur_presence[port] != self._transceiver_presence[port]: + if cur_presence[port] == 1: + port_dict[port]='1' + else: + port_dict[port]='0' + change_status = True + + self._transceiver_presence = cur_presence + if change_status: + return True, port_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print("get_evt_change_event: Should not reach here.") + return False, {} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json b/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..94592fa8cebc --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py new file mode 100644 index 000000000000..29dfc92139ef --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp', 'thermal', 'fan', 'watchdog'] +from . import platform diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py new file mode 100644 index 000000000000..232ca0ca5fe3 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# +try: + import sys + import os + import time + import subprocess + from sonic_platform_base.chassis_base import ChassisBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN = 14 +NUM_PSU = 2 +NUM_THERMAL = 8 +NUM_SFP = 32 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "docker > /dev/null 2>&1" +GET_HWSKU_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.hwsku" +GET_PLATFORM_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.platform" + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + super(Chassis, self).__init__() + + # Initialize SKU name and Platform name + self.sku_name = self._get_sku_name() + self.platform_name = self._get_platform_name() + self.name = self.sku_name + + self._transceiver_presence = [0] * NUM_SFP + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp_module = Sfp(index, 'QSFP_DD') + self._sfp_list.append(sfp_module) + + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, NUM_FAN): + fan = Fan(fan_index) + self._fan_list.append(fan) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + sw_reboot_cause = self.__read_txt_file( + reboot_cause_path) or "Unknown" + + if sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + else: + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'Unknown reason' + + return (reboot_cause, description) + + def _get_sku_name(self): + p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def _get_platform_name(self): + p = subprocess.Popen(GET_PLATFORM_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.name + + def get_sfp(self, index): + sfp = None + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format(index, len(self._sfp_list)-1)) + + return sfp + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + port_pres[port] = sfp.get_presence() + + return port_pres + + def get_change_event(self, timeout=0): + port_dict = {} + ret_dict = {'sfp': port_dict} + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) + else: + return False, ret_dict #Incorrect timeout + + while True: + if forever: + timer = 1 + else: + timer = min(timeout, 1) + start_time = time.time() + + time.sleep(timer) + cur_presence = self._get_sfp_presence() + for port in range(0, NUM_SFP): + if cur_presence[port] != self._transceiver_presence[port]: + change_event = True + if cur_presence[port] == 1: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + self._transceiver_presence = cur_presence + if change_event == True: + break + + if not forever: + elapsed_time = time.time() - start_time + timeout = round(timeout - elapsed_time, 3) + if timeout <= 0: + break + + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + sfp.reinit() + + return True, ret_dict diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..9d01b1f866b8 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +############################################################################# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0055/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except BaseException: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status < 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except OSError: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except OSError: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py new file mode 100644 index 000000000000..aec7e23be5c0 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_PATH = "/sys/bus/i2c/devices/0-0044/" +FANTRAY_NAME_LIST = ["FANTRAY-1", "FANTRAY-2", + "FANTRAY-3", "FANTRAY-4", + "FANTRAY-5", "FANTRAY-6", "FANTRAY-7"] +FAN_NAME_LIST = ["fan1_front","fan2_front","fan3_front","fan4_front","fan5_front","fan6_front", "fan7_front",\ +"fan1_rear","fan2_rear","fan3_rear","fan4_rear", "fan5_rear", "fan6_rear", "fan7_rear",] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_index): + self.fan_tray_index = fan_index + self.fan_presence = "fan{}_present" + self.fan_direction = "fan{}_direction" + self.fan_speed_rpm = "fan{}_input" + FanBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except BaseException: + return False + return True + + def __search_file_by_name(self, directory, file_name): + for dirpath, dirnames, files in os.walk(directory): + for name in files: + file_path = os.path.join(dirpath, name) + if name in file_name: + return file_path + return None + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_direction.format(index1+1)) + raw = self.__read_txt_file(fan_direction_file).strip('\r\n') + direction = self.FAN_DIRECTION_INTAKE if str( + raw).upper() == "1" else self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 12000 (full speed) + """ + + speed = 0 + if self.fan_tray_index<=13: + index1=self.fan_tray_index + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1)) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + + speed = 0 + if self.fan_tray_index<=13: + index1=self.fan_tray_index + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1)) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return 10 + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + + Note: + Depends on pwm or target mode is selected: + 1) pwm = speed_pc * 255 <-- Currently use this mode. + 2) target_pwm = speed_pc * 100 / 255 + 2.1) set pwm{}_enable to 3 + + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index] + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_presence.format(index1+1)) + present_str = self.__read_txt_file(fan_direction_file) or '1' + + return int(present_str) == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and self.get_speed() > 0 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py new file mode 100644 index 000000000000..44e03cdadbb3 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py new file mode 100644 index 000000000000..dc13cc1ed824 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python + +############################################################################# +# psuutil.py +# Platform-specific PSU status interface for SONiC +############################################################################# + +try: + from sonic_platform_base.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] + +class Psu(PsuBase): + """Platform-specific Psu class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/0-005a", + "/sys/bus/i2c/devices/0-0059"] + + def __init__(self, psu_index): + self.index = psu_index + PsuBase.__init__(self) + + + def get_fan(self): + """ + Retrieves object representing the fan module contained in this PSU + Returns: + An object dervied from FanBase representing the fan module + contained in this PSU + """ + # Hardware not supported + return False + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + attr_file ='present' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as psu_prs: + status = int(psu_prs.read()) + except IOError: + return False + + return status == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + attr_file = 'power_good' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_model(self): + """ + Retrieves the model number/name of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query model number + :return: String, denoting model number/name + """ + attr_file ='model' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + model = "" + try: + with open(attr_path, 'r') as psu_model: + model = psu_model.read() + except IOError: + return model + + return model + + def get_mfr_id(self): + """ + Retrieves the manufacturing id of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query mfr id + :return: String, denoting manufacturing id + """ + attr_file ='vendor' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + vendor = "" + try: + with open(attr_path, 'r') as psu_vendor: + vendor = psu_vendor.read() + except IOError: + return vendor + + return vendor + + def get_serial(self): + """ + Retrieves the serial number of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query serial number + :return: String, denoting serial number of the PSU unit + """ + attr_file ='sn' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + sn = "" + try: + with open(attr_path, 'r') as psu_sn: + sn = psu_sn.read() + except IOError: + return sn + + return sn + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + attr_file ='temp1_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + temp = 0.0 + try: + with open(attr_path, 'r') as psu_temp: + temp = float(psu_temp.read()) / 1000 + except IOError: + return temp + + return temp + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return False #Not supported + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + return False #Not supported + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return False #Not supported + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + attr_file ='in2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + volt = 0.0 + try: + with open(attr_path, 'r') as psu_volt: + volt = float(psu_volt.read()) / 1000 + except IOError: + return volt + + return volt + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + attr_file ='curr2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + curr = 0.0 + try: + with open(attr_path, 'r') as psu_curr: + curr = float(psu_curr.read()) / 1000 + except IOError: + return curr + + return curr + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + attr_file ='power2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + power = 0.0 + try: + with open(attr_path, 'r') as psu_power: + power = float(psu_power.read()) / 1000000 + except IOError: + return power + + return power diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..7664999e56b8 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py @@ -0,0 +1,1443 @@ +#!/usr/bin/env python + +############################################################################# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +############################################################################# +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom + from sonic_py_common.logger import Logger + import sys +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET = 64 +XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH = 1 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +# definitions of the offset and width for values in XCVR_QSFP_DD info eeprom +XCVR_EXT_TYPE_OFFSET_QSFP_DD = 72 +XCVR_EXT_TYPE_WIDTH_QSFP_DD = 2 +XCVR_CONNECTOR_OFFSET_QSFP_DD = 75 +XCVR_CONNECTOR_WIDTH_QSFP_DD = 1 +XCVR_CABLE_LENGTH_OFFSET_QSFP_DD = 74 +XCVR_CABLE_LENGTH_WIDTH_QSFP_DD = 1 +XCVR_HW_REV_OFFSET_QSFP_DD = 36 +XCVR_HW_REV_WIDTH_QSFP_DD = 2 +XCVR_VENDOR_DATE_OFFSET_QSFP_DD = 54 +XCVR_VENDOR_DATE_WIDTH_QSFP_DD = 8 +XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD = 2 +XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD = 1 +XCVR_MEDIA_TYPE_OFFSET_QSFP_DD = 85 +XCVR_MEDIA_TYPE_WIDTH_QSFP_DD = 1 +XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD = 86 +XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD = 32 +XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD = 351 +XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD = 28 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +QSFP_DD_DOM_BULK_DATA_START = 14 +QSFP_DD_DOM_BULK_DATA_SIZE = 4 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 + +# definitions of the offset for values in QSFP_DD info eeprom +QSFP_DD_TYPE_OFFSET = 0 +QSFP_DD_VENDOR_NAME_OFFSET = 1 +QSFP_DD_VENDOR_PN_OFFSET = 20 +QSFP_DD_VENDOR_SN_OFFSET = 38 +QSFP_DD_VENDOR_OUI_OFFSET = 17 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 + +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DD_TEMPE_OFFSET = 14 +QSFP_DD_TEMPE_WIDTH = 2 +QSFP_DD_VOLT_OFFSET = 16 +QSFP_DD_VOLT_WIDTH = 2 +QSFP_DD_TX_BIAS_OFFSET = 42 +QSFP_DD_TX_BIAS_WIDTH = 16 +QSFP_DD_RX_POWER_OFFSET = 58 +QSFP_DD_RX_POWER_WIDTH = 16 +QSFP_DD_TX_POWER_OFFSET = 26 +QSFP_DD_TX_POWER_WIDTH = 16 +QSFP_DD_CHANNL_MON_OFFSET = 154 +QSFP_DD_CHANNL_MON_WIDTH = 48 +QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET = 19 +QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_DD_CHANNL_TX_FAULT_STATUS_OFFSET = 7 +QSFP_DD_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_DD_MODULE_THRESHOLD_OFFSET = 0 +QSFP_DD_MODULE_THRESHOLD_WIDTH = 72 +QSFP_DD_CHANNL_STATUS_OFFSET = 26 +QSFP_DD_CHANNL_STATUS_WIDTH = 1 + +QSFP_TYPE_CODE_LIST = [ + '0d', # QSFP+ or later + '11' # QSFP28 or later +] + +QSFP_DD_TYPE_CODE_LIST = [ + '18' # QSFP-DD Double Density 8X Pluggable Transceiver +] + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes','FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia','FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +QSFP_TYPE = "QSFP" +QSFP_DD_TYPE = "QSFP_DD" + +# Global logger class instance +logger = Logger() + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 0 + PORT_END = 31 + + port_to_i2c_mapping = { + 0: '10', + 1: '11', + 2: '12', + 3: '13', + 4: '14', + 5: '15', + 6: '16', + 7: '17', + 8: '18', + 9: '19', + 10: '1a', + 11: '1b', + 12: '1c', + 13: '1d', + 14: '1e', + 15: '1f', + 16: '20', + 17: '21', + 18: '22', + 19: '23', + 20: '24', + 21: '25', + 22: '26', + 23: '27', + 24: '28', + 25: '29', + 26: '2a', + 27: '2b', + 28: '2c', + 29: '2d', + 30: '2e', + 31: '2f', + } + + _sfp_port = range(32, PORT_END + 1) + RESET_1_16_PATH = "/sys/bus/i2c/devices/0-0006/port{}_reset" + RESET_17_32_PATH = "/sys/bus/i2c/devices/0-0007/port{}_reset" + PRS_1_16_PATH = "/sys/bus/i2c/devices/0-0006/port{}_present" + PRS_17_32_PATH = "/sys/bus/i2c/devices/0-0007/port{}_present" + + def __init__(self, sfp_index, sfp_type): + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + # Init eeprom path + eeprom_path_prefix = '/sys/bus/i2c/devices/0-00' + self.port_to_eeprom1_mapping = {} + self.port_to_eeprom2_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_eeprom1_mapping[x] = eeprom_path_prefix + self.port_to_i2c_mapping[x] + '/eeprom1' + self.port_to_eeprom2_mapping[x] = eeprom_path_prefix + self.port_to_i2c_mapping[x] + '/eeprom2' + + self._detect_sfp_type(sfp_type) + self._dom_capability_detect() + SfpBase.__init__(self) + + def reinit(self): + self._detect_sfp_type(self.sfp_type) + self._dom_capability_detect() + + def get_presence(self): + """ + Retrieves the presence of the SFP + Returns: + bool: True if SFP is present, False if not + """ + presence = False + try: + if self.index < 16: + pres_path=self.PRS_1_16_PATH.format(self.port_num) + else: + pres_path=self.PRS_17_32_PATH.format(self.port_num) + with open(pres_path, 'r') as sfp_presence: + presence = int(sfp_presence.read(), 16) + except IOError: + return False + logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) + return presence + + def _read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + if offset < 256: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom1_mapping[self.index] + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom2_mapping[self.index] + offset = offset - 256 + + try: + sysfsfile_eeprom = open(sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + + except BaseException: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def _detect_sfp_type(self, sfp_type): + eeprom_raw = [] + eeprom_raw = self._read_eeprom_specific_bytes(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH) + if eeprom_raw: + if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: + self.sfp_type = QSFP_TYPE + elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: + self.sfp_type = QSFP_DD_TYPE + else: + # we don't regonize this identifier value, treat the xSFP module as the default type + self.sfp_type = sfp_type + logger.log_info("Identifier value of {} module {} is {} which isn't regonized and will be treated as default type ({})".format( + sfp_type, self.index, eeprom_raw[0], sfp_type + )) + else: + # eeprom_raw being None indicates the module is not present. + # in this case we treat it as the default type according to the SKU + self.sfp_type = sfp_type + + def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_tx_power_supported = False + self.dom_channel_monitor_supported = False + self.dom_module_monitor_supported = False + self.dom_channel_treshold_supported = False + self.dom_module_treshold_supported =False + self.calibration = 0 + return + + self.dom_channel_monitor_supported = False + self.dom_module_monitor_supported = True + self.dom_channel_treshold_supported = False + self.dom_module_treshold_supported =False + + if self.sfp_type == QSFP_TYPE: + self.calibration = 1 + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = 128 + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self._read_eeprom_specific_bytes(QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int(qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + self.dom_supported = True + self.calibration = 1 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self._read_eeprom_specific_bytes(QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params(qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability['data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator(qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.qsfp_page3_available = False + + elif self.sfp_type == QSFP_DD_TYPE: + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + + offset = 0 + # two types of QSFP-DD cable types supported: Copper and Optical. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD), XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD) + if qsfp_dom_capability_raw is not None: + self.dom_temp_supported = True + self.dom_volt_supported = True + dom_capability = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0) + if dom_capability['data']['Flat_MEM']['value'] == 'Off': + self.dom_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + else: + self.dom_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ================================================================================ + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + application_advertisement |1*255VCHAR |supported applications advertisement + ================================================================================ + """ + transceiver_info_dict = {} + compliance_code_dict = {} + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 128 + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) + + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['application_advertisement'] = 'N/A' + + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + sfp_ext_specification_compliance_raw = self._read_eeprom_specific_bytes(offset + XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET, XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH) + if sfp_ext_specification_compliance_raw is not None: + sfp_ext_specification_compliance_data = sfpi_obj.parse_ext_specification_compliance(sfp_ext_specification_compliance_raw[0 : 1], 0) + if sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] != "Unspecified": + compliance_code_dict['Extended Specification compliance'] = sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] + transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) + transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + #QSFP-DD + else: + offset = 128 + + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET_QSFP_DD), XCVR_HW_REV_WIDTH_QSFP_DD) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + else: + return None + + sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) + else: + return None + + sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET_QSFP_DD), XCVR_VENDOR_DATE_WIDTH_QSFP_DD) + if sfp_vendor_date_raw is not None: + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) + else: + return None + + sfp_connector_raw = self._read_eeprom_specific_bytes((offset + XCVR_CONNECTOR_OFFSET_QSFP_DD), XCVR_CONNECTOR_WIDTH_QSFP_DD) + if sfp_connector_raw is not None: + sfp_connector_data = sfpi_obj.parse_connector(sfp_connector_raw, 0) + else: + return None + + sfp_ext_identifier_raw = self._read_eeprom_specific_bytes((offset + XCVR_EXT_TYPE_OFFSET_QSFP_DD), XCVR_EXT_TYPE_WIDTH_QSFP_DD) + if sfp_ext_identifier_raw is not None: + sfp_ext_identifier_data = sfpi_obj.parse_ext_iden(sfp_ext_identifier_raw, 0) + else: + return None + + sfp_cable_len_raw = self._read_eeprom_specific_bytes((offset + XCVR_CABLE_LENGTH_OFFSET_QSFP_DD), XCVR_CABLE_LENGTH_WIDTH_QSFP_DD) + if sfp_cable_len_raw is not None: + sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_cable_len_raw, 0) + else: + return None + + sfp_media_type_raw = self._read_eeprom_specific_bytes(XCVR_MEDIA_TYPE_OFFSET_QSFP_DD, XCVR_MEDIA_TYPE_WIDTH_QSFP_DD) + if sfp_media_type_raw is not None: + sfp_media_type_dict = sfpi_obj.parse_media_type(sfp_media_type_raw, 0) + if sfp_media_type_dict is None: + return None + + host_media_list = "" + sfp_application_type_first_list = self._read_eeprom_specific_bytes((XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD) + possible_application_count = 8 + if sfp_application_type_first_list is not None: + sfp_application_type_list = sfp_application_type_first_list + else: + return None + + for i in range(0, possible_application_count): + if sfp_application_type_list[i * 4] == 'ff': + break + host_electrical, media_interface = sfpi_obj.parse_application(sfp_media_type_dict, sfp_application_type_list[i * 4], sfp_application_type_list[i * 4 + 1]) + host_media_list = host_media_list + host_electrical + ' - ' + media_interface + '\n\t\t\t\t ' + else: + return None + + transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) + transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) + transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) + transceiver_info_dict['hardware_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) + transceiver_info_dict['serial'] = str(sfp_vendor_sn_data['data']['Vendor SN']['value']) + transceiver_info_dict['vendor_oui'] = str(sfp_vendor_oui_data['data']['Vendor OUI']['value']) + transceiver_info_dict['vendor_date'] = str(sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value']) + transceiver_info_dict['connector'] = str(sfp_connector_data['data']['Connector']['value']) + transceiver_info_dict['encoding'] = "Not supported for CMIS cables" + transceiver_info_dict['ext_identifier'] = str(sfp_ext_identifier_data['data']['Extended Identifier']['value']) + transceiver_info_dict['ext_rateselect_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['specification_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['cable_type'] = "Length Cable Assembly(m)" + transceiver_info_dict['cable_length'] = str(sfp_cable_len_data['data']['Length Cable Assembly(m)']['value']) + transceiver_info_dict['nominal_bit_rate'] = "Not supported for CMIS cables" + transceiver_info_dict['application_advertisement'] = host_media_list + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = {} + + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'rx5power', 'rx6power', + 'rx7power', 'rx8power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx5bias', 'tx6bias', + 'tx7bias', 'tx8bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power', + 'tx5power', 'tx6power', + 'tx7power', 'tx8power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) + + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + + #QSFP-DD + else: + offset = 0 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_DOM_BULK_DATA_START), QSFP_DD_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_DD_TEMPE_OFFSET - QSFP_DD_DOM_BULK_DATA_START + end = start + QSFP_DD_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_DD_VOLT_OFFSET - QSFP_DD_DOM_BULK_DATA_START + end = start + QSFP_DD_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = {} + + dom_info_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning' + ] + transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = QSFP_MODULE_UPPER_PAGE3_START + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), + QSFP_CHANNL_THRESHOLD_WIDTH) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + #QSFP-DD + else: + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + if not self.dom_thresholds_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + # page 02 (we put page 2 to byte 256~384) + offset = 256 + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_MODULE_THRESHOLD_OFFSET), QSFP_DD_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TxPowerLowWarning']['value'] + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + if not self.dom_supported: + return None + + rx_los_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + + #QSFP-DD + else: + # page 11h (we put page 2 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 8) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + rx_los_list.append(rx_los_data & 0x10 != 0) + rx_los_list.append(rx_los_data & 0x20 != 0) + rx_los_list.append(rx_los_data & 0x40 != 0) + rx_los_list.append(rx_los_data & 0x80 != 0) + + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + if not self.dom_supported: + return None + + tx_fault_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + + #QSFP-DD + else: + return None + + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + + for QSFP, the disable states of each channel which are the lower 4 bits in byte 85 page a0 + for SFP, the TX Disable State and Soft TX Disable Select is ORed as the tx_disable status returned + These two bits are bit 7 & 6 in byte 110 page a2 respectively + """ + if not self.dom_supported: + return None + + tx_disable_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + + #QSFP-DD + else: + if self.dom_rx_tx_power_bias_supported: + # page 11h (we put page 1 to byte 384~512) + offset = 384 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET), QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + tx_disable_list.append(tx_disable_data & 0x10 != 0) + tx_disable_list.append(tx_disable_data & 0x20 != 0) + tx_disable_list.append(tx_disable_data & 0x40 != 0) + tx_disable_list.append(tx_disable_data & 0x80 != 0) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return 0 + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + if not self.dom_supported: + return None + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + else: + return None + else: + return None + + #QSFP-DD + else: + offset = 0 + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TEMPE_OFFSET), QSFP_DD_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + return None + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + if not self.dom_supported: + return None + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + else: + return None + return None + + #QSFP-DD + else: + offset = 0 + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VOLT_OFFSET), QSFP_DD_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + return None + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Bias']['value'])) + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if dom_tx_bias_power_supported: + dom_tx_bias_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_BIAS_OFFSET), QSFP_DD_TX_BIAS_WIDTH) + if dom_tx_bias_raw is not None: + dom_tx_bias_data = sfpd_obj.parse_dom_tx_bias(dom_tx_bias_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX4Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX5Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX6Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX7Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX8Bias']['value'])) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + elif self.sfp_type == QSFP_DD_TYPE: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_rx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_RX_POWER_OFFSET), QSFP_DD_RX_POWER_WIDTH) + if dom_rx_power_raw is not None: + dom_rx_power_data = sfpd_obj.parse_dom_rx_power(dom_rx_power_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX4Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX5Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX6Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX7Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX8Power']['value'])) + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_tx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_POWER_OFFSET), QSFP_DD_TX_POWER_WIDTH) + if dom_tx_power_raw is not None: + dom_tx_power_data = sfpd_obj.parse_dom_tx_power(dom_tx_power_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX4Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX5Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX6Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX7Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX8Power']['value'])) + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + # SFP doesn't support this feature + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + + name='port'+str(self.index) + return name + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("serial", "N/A") + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py new file mode 100644 index 000000000000..942e6b7be347 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python + +############################################################################# +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + SYSFS_THERMAL_DIR = ["/sys/bus/i2c/devices/0-0068/", + "/sys/bus/i2c/devices/0-004a/", + "/sys/bus/i2c/devices/0-0049/", + "/sys/bus/i2c/devices/0-004b/", + "/sys/bus/i2c/devices/0-004c/", + "/sys/bus/i2c/devices/0-004f/", + "/sys/bus/i2c/devices/0-0048/", + "/sys/bus/i2c/devices/0-004d/"] + + def __init__(self, thermal_index): + self.index = thermal_index + + # Add thermal name + self.THERMAL_NAME_LIST.append("Switch") + self.THERMAL_NAME_LIST.append("UFRNT1") + self.THERMAL_NAME_LIST.append("UFRNT2") + self.THERMAL_NAME_LIST.append("UFRNT3") + self.THERMAL_NAME_LIST.append("UFRNT4") + self.THERMAL_NAME_LIST.append("UREAR1") + self.THERMAL_NAME_LIST.append("UCPUB") + self.THERMAL_NAME_LIST.append("UFANB") + ThermalBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __get_temp(self, temp_file): + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) + raw_temp = self.__read_txt_file(temp_file_path) + temp = float(raw_temp)/1000 + return "{:.3f}".format(temp) + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_file = "temp1_input" + return float(self.__get_temp(temp_file)) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + :return: A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(3) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + :return: A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(0) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + + temp_file = "temp1_max" + return float(self.__get_temp(temp_file)) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + :return: A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + + temp_file = "temp1_crit" + return float(self.__get_temp(temp_file)) + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + temp_file = "temp1_input" + temp_file_path = os.path.join(self.hwmon_path, temp_file) + return os.path.isfile(temp_file_path) + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + + return True + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py new file mode 100644 index 000000000000..820dd54f954a --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +######################################################################## +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + print("INFO: Watchdog __init__") + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + print("ERROR: Platform did not implement arm()") + raise NotImplementedError + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + print("ERROR: Platform did not implement disarm()") + raise NotImplementedError + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + print("ERROR: Platform did not implement is_armed()") + raise NotImplementedError + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + S5232 doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + print("ERROR: Platform did not implement get_remaining_time()") + raise NotImplementedError diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf b/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf new file mode 100644 index 000000000000..795ea43143eb --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml new file mode 100644 index 000000000000..17ed53abb1d0 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml @@ -0,0 +1,430 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + mac_clk: "1340" + skip_pll_check: "false" + sys_clk: "1720" + mbist_on_init: "true" + ifc_clk: "1200" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - id: "89" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - id: "81" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - id: "73" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - id: "65" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - id: "57" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - id: "49" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - id: "41" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - id: "33" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - id: "153" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - id: "145" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - id: "137" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - id: "129" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - id: "121" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - id: "113" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - id: "105" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - id: "97" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - id: "209" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - id: "217" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - id: "193" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - id: "201" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - id: "177" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - id: "185" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - id: "161" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - id: "169" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - id: "17" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - id: "25" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - id: "1" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - id: "9" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - id: "241" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - id: "249" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - id: "225" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - id: "233" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - id: "257" + fec: "NONE" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - id: "258" + fec: "NONE" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "11" + lane_swap: "27163504" + rx_polarity: "01010000" + tx_polarity: "01100000" + - id: "10" + lane_swap: "51604372" + rx_polarity: "11001000" + tx_polarity: "11110000" + - id: "9" + lane_swap: "17032546" + rx_polarity: "10001000" + tx_polarity: "00000100" + - id: "8" + lane_swap: "70435162" + rx_polarity: "11000100" + tx_polarity: "00100101" + - id: "7" + lane_swap: "27053416" + rx_polarity: "00011001" + tx_polarity: "10001000" + - id: "6" + lane_swap: "70635142" + rx_polarity: "10001000" + tx_polarity: "01100001" + - id: "5" + lane_swap: "27053416" + rx_polarity: "00001001" + tx_polarity: "00001000" + - id: "4" + lane_swap: "62405173" + rx_polarity: "11000101" + tx_polarity: "10110000" + - id: "19" + lane_swap: "06152347" + rx_polarity: "11010110" + tx_polarity: "10001110" + - id: "18" + lane_swap: "73614052" + rx_polarity: "11001100" + tx_polarity: "11100001" + - id: "17" + lane_swap: "17053426" + rx_polarity: "10001001" + tx_polarity: "00001000" + - id: "16" + lane_swap: "54216073" + rx_polarity: "10000011" + tx_polarity: "01001010" + - id: "15" + lane_swap: "36072514" + rx_polarity: "10100000" + tx_polarity: "10100001" + - id: "14" + lane_swap: "50763241" + rx_polarity: "00010001" + tx_polarity: "01110001" + - id: "13" + lane_swap: "26071435" + rx_polarity: "00000011" + tx_polarity: "00101001" + - id: "12" + lane_swap: "43510627" + rx_polarity: "11100100" + tx_polarity: "00011101" + - id: "26" + lane_swap: "31427506" + rx_polarity: "10011000" + tx_polarity: "11110001" + - id: "27" + lane_swap: "21735406" + rx_polarity: "01011110" + tx_polarity: "10011100" + - id: "24" + lane_swap: "07162435" + rx_polarity: "10010000" + tx_polarity: "10001010" + - id: "25" + lane_swap: "64501372" + rx_polarity: "11010001" + tx_polarity: "10001010" + - id: "22" + lane_swap: "35071624" + rx_polarity: "00100011" + tx_polarity: "11001011" + - id: "23" + lane_swap: "64705132" + rx_polarity: "11010100" + tx_polarity: "11101000" + - id: "20" + lane_swap: "16270453" + rx_polarity: "00101100" + tx_polarity: "00001001" + - id: "21" + lane_swap: "71356204" + rx_polarity: "01100010" + tx_polarity: "00001011" + - id: "2" + lane_swap: "37260145" + rx_polarity: "10011010" + tx_polarity: "11000000" + - id: "3" + lane_swap: "47512630" + rx_polarity: "10010100" + tx_polarity: "10101101" + - id: "0" + lane_swap: "05462713" + rx_polarity: "01000000" + tx_polarity: "10010010" + - id: "1" + lane_swap: "71605432" + rx_polarity: "00000000" + tx_polarity: "11000101" + - id: "30" + lane_swap: "37251604" + rx_polarity: "11000010" + tx_polarity: "11001000" + - id: "31" + lane_swap: "42736051" + rx_polarity: "10000110" + tx_polarity: "01000010" + - id: "28" + lane_swap: "01245736" + rx_polarity: "10110101" + tx_polarity: "10000001" + - id: "29" + lane_swap: "52706134" + rx_polarity: "00010010" + tx_polarity: "10101010" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml new file mode 100644 index 000000000000..cf505b299dd8 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/6512-32_32x400G.config.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini new file mode 100644 index 000000000000..66220e66a896 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv new file mode 100644 index 000000000000..b9f4e750a8df --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_1M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G ,PAM4,,,,,,,ANLT 25G/100G ,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv new file mode 100644 index 000000000000..b6bbd017e483 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_3M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G,PAM4,,,,,,,ANLT 25G/100G,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv new file mode 100644 index 000000000000..758ee731733e --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv @@ -0,0 +1,289 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,OPTICS,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,,SPEED,ENCODING,,,,,, +,,,50G/400G,PAM4,,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,,10G/40G,NRZ,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING +0,0,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +1,0,1,0,4,-1,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +2,0,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +3,0,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +4,0,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +5,0,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +6,0,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +7,0,7,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +8,1,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +9,1,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +10,1,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +11,1,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +12,1,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +13,1,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +14,1,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +15,1,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +16,2,0,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +17,2,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +18,2,2,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +19,2,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +20,2,4,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +21,2,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +22,2,6,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +23,2,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +24,3,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +25,3,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +26,3,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +27,3,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +28,3,4,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +29,3,5,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +30,3,6,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +31,3,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +32,4,0,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,1,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +33,4,1,0,2,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +34,4,2,0,4,0,0,2,4,Medium,High,0,2,0,0,2,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +35,4,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +36,4,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +37,4,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +38,4,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +39,4,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +40,5,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +41,5,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +42,5,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +43,5,3,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +44,5,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +45,5,5,0,2,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +46,5,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +47,5,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +48,6,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +49,6,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +50,6,2,0,4,0,0,2,4,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +51,6,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +52,6,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +53,6,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +54,6,6,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +55,6,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +56,7,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +57,7,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +58,7,2,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +59,7,3,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +60,7,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +61,7,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +62,7,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +63,7,7,0,4,0,0,4,4,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +64,8,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +65,8,1,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +66,8,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +67,8,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +68,8,4,0,4,0,0,4,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +69,8,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +70,8,6,0,2,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +71,8,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +72,9,0,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +73,9,1,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +74,9,2,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +75,9,3,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +76,9,4,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +77,9,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +78,9,6,0,4,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +79,9,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +80,10,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +81,10,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +82,10,2,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +83,10,3,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +84,10,4,0,4,-1,0,4,6,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +85,10,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +86,10,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +87,10,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +88,11,0,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +89,11,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +90,11,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +91,11,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +92,11,4,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +93,11,5,0,4,0,0,2,7,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +94,11,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +95,11,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +96,12,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +97,12,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +98,12,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +99,12,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +100,12,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +101,12,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +102,12,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +103,12,7,0,4,0,0,0,5.5,Medium,High,0,2,0,1,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +104,13,0,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +105,13,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +106,13,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +107,13,3,0,2,0,0,2,4.5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +108,13,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +109,13,5,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,1,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +110,13,6,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +111,13,7,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +112,14,0,0,4,0,0,0,5,Medium,High,0,2,0,0,2,0,0,2,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +113,14,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +114,14,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +115,14,3,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +116,14,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +117,14,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +118,14,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +119,14,7,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +120,15,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +121,15,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +122,15,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +123,15,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +124,15,4,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +125,15,5,0,4,0,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +126,15,6,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +127,15,7,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +128,16,0,0,2,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +129,16,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +130,16,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +131,16,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +132,16,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +133,16,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +134,16,6,0,4,0,0,0,6.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +135,16,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +136,17,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +137,17,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +138,17,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +139,17,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +140,17,4,1,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +141,17,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +142,17,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +143,17,7,0,4,0,0,2,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +144,18,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +145,18,1,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +146,18,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +147,18,3,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +148,18,4,0,2,0,0,0,7,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +149,18,5,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +150,18,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +151,18,7,0,4,0,0,4,4,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +152,19,0,0,2,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +153,19,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +154,19,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +155,19,3,0,4,0,0,-2,6,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +156,19,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +157,19,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +158,19,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +159,19,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +160,20,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +161,20,1,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +162,20,2,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +163,20,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +164,20,4,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +165,20,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +166,20,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +167,20,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +168,21,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +169,21,1,0,4,-1,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +170,21,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +171,21,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +172,21,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +173,21,5,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +174,21,6,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +175,21,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +176,22,0,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +177,22,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +178,22,2,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +179,22,3,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +180,22,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +181,22,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +182,22,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +183,22,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +184,23,0,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +185,23,1,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +186,23,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +187,23,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +188,23,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +189,23,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +190,23,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +191,23,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +192,24,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +193,24,1,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +194,24,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +195,24,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +196,24,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +197,24,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +198,24,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +199,24,7,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +200,25,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +201,25,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +202,25,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +203,25,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +204,25,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +205,25,5,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +206,25,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +207,25,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +208,26,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,-1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +209,26,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +210,26,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +211,26,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +212,26,4,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +213,26,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +214,26,6,0,4,0,0,4,3.5,Medium,High,0,2,0,0,2,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +215,26,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +216,27,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +217,27,1,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +218,27,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +219,27,3,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +220,27,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +221,27,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +222,27,6,0,2,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +223,27,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +224,28,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +225,28,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +226,28,2,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +227,28,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +228,28,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +229,28,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +230,28,6,0,2,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +231,28,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +232,29,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +233,29,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +234,29,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +235,29,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +236,29,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +237,29,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +238,29,6,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +239,29,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +240,30,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +241,30,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +242,30,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +243,30,3,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +244,30,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +245,30,5,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +246,30,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +247,30,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +248,31,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +249,31,1,0,4,0,-1,2,5.5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +250,31,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +251,31,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +252,31,4,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +253,31,5,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +254,31,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +255,31,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..23445c6dede5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml new file mode 100644 index 000000000000..0c1644ab7d72 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini new file mode 100644 index 000000000000..66220e66a896 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..2e019733c452 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,972 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "NONE" + id: "193" + lanes: "0:1" + serdes_group: "24" + speed: "10G" + sysport: "193" + type: "eth" + - fec: "NONE" + id: "194" + lanes: "1:1" + serdes_group: "24" + speed: "10G" + sysport: "194" + type: "eth" + - fec: "NONE" + id: "195" + lanes: "2:1" + serdes_group: "24" + speed: "10G" + sysport: "195" + type: "eth" + - fec: "NONE" + id: "196" + lanes: "3:1" + serdes_group: "24" + speed: "10G" + sysport: "196" + type: "eth" + - fec: "NONE" + id: "201" + lanes: "0:1" + serdes_group: "25" + speed: "10G" + sysport: "201" + type: "eth" + - fec: "NONE" + id: "202" + lanes: "1:1" + serdes_group: "25" + speed: "10G" + sysport: "202" + type: "eth" + - fec: "NONE" + id: "203" + lanes: "2:1" + serdes_group: "25" + speed: "10G" + sysport: "203" + type: "eth" + - fec: "NONE" + id: "204" + lanes: "3:1" + serdes_group: "25" + speed: "10G" + sysport: "204" + type: "eth" + - fec: "NONE" + id: "177" + lanes: "0:1" + serdes_group: "22" + speed: "10G" + sysport: "177" + type: "eth" + - fec: "NONE" + id: "178" + lanes: "1:1" + serdes_group: "22" + speed: "10G" + sysport: "178" + type: "eth" + - fec: "NONE" + id: "179" + lanes: "2:1" + serdes_group: "22" + speed: "10G" + sysport: "179" + type: "eth" + - fec: "NONE" + id: "180" + lanes: "3:1" + serdes_group: "22" + speed: "10G" + sysport: "180" + type: "eth" + - fec: "NONE" + id: "185" + lanes: "0:1" + serdes_group: "23" + speed: "10G" + sysport: "185" + type: "eth" + - fec: "NONE" + id: "186" + lanes: "1:1" + serdes_group: "23" + speed: "10G" + sysport: "186" + type: "eth" + - fec: "NONE" + id: "187" + lanes: "2:1" + serdes_group: "23" + speed: "10G" + sysport: "187" + type: "eth" + - fec: "NONE" + id: "188" + lanes: "3:1" + serdes_group: "23" + speed: "10G" + sysport: "188" + type: "eth" + - fec: "NONE" + id: "161" + lanes: "0:1" + serdes_group: "20" + speed: "10G" + sysport: "161" + type: "eth" + - fec: "NONE" + id: "162" + lanes: "1:1" + serdes_group: "20" + speed: "10G" + sysport: "162" + type: "eth" + - fec: "NONE" + id: "163" + lanes: "2:1" + serdes_group: "20" + speed: "10G" + sysport: "163" + type: "eth" + - fec: "NONE" + id: "164" + lanes: "3:1" + serdes_group: "20" + speed: "10G" + sysport: "164" + type: "eth" + - fec: "NONE" + id: "169" + lanes: "0:1" + serdes_group: "21" + speed: "10G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "170" + lanes: "1:1" + serdes_group: "21" + speed: "10G" + sysport: "170" + type: "eth" + - fec: "NONE" + id: "171" + lanes: "2:1" + serdes_group: "21" + speed: "10G" + sysport: "171" + type: "eth" + - fec: "NONE" + id: "172" + lanes: "3:1" + serdes_group: "21" + speed: "10G" + sysport: "172" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:1" + serdes_group: "2" + speed: "10G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "18" + lanes: "1:1" + serdes_group: "2" + speed: "10G" + sysport: "18" + type: "eth" + - fec: "NONE" + id: "19" + lanes: "2:1" + serdes_group: "2" + speed: "10G" + sysport: "19" + type: "eth" + - fec: "NONE" + id: "20" + lanes: "3:1" + serdes_group: "2" + speed: "10G" + sysport: "20" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:1" + serdes_group: "3" + speed: "10G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "26" + lanes: "1:1" + serdes_group: "3" + speed: "10G" + sysport: "26" + type: "eth" + - fec: "NONE" + id: "27" + lanes: "2:1" + serdes_group: "3" + speed: "10G" + sysport: "27" + type: "eth" + - fec: "NONE" + id: "28" + lanes: "3:1" + serdes_group: "3" + speed: "10G" + sysport: "28" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml new file mode 100644 index 000000000000..5e5d2fe66861 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_104x1025G_6x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini new file mode 100644 index 000000000000..43e568f6ef3c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini @@ -0,0 +1,111 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193 Eth19-1 10000 18 9126 none +Ethernet145 194 Eth19-2 10000 18 9126 none +Ethernet146 195 Eth19-3 10000 18 9126 none +Ethernet147 196 Eth19-4 10000 18 9126 none +Ethernet152 201 Eth20-1 10000 19 9126 none +Ethernet153 202 Eth20-2 10000 19 9126 none +Ethernet154 203 Eth20-3 10000 19 9126 none +Ethernet155 204 Eth20-4 10000 19 9126 none +Ethernet160 177 Eth21-1 10000 20 9126 none +Ethernet161 178 Eth21-2 10000 20 9126 none +Ethernet162 179 Eth21-3 10000 20 9126 none +Ethernet163 180 Eth21-4 10000 20 9126 none +Ethernet168 185 Eth22-1 10000 21 9126 none +Ethernet169 186 Eth22-2 10000 21 9126 none +Ethernet170 187 Eth22-3 10000 21 9126 none +Ethernet171 188 Eth22-4 10000 21 9126 none +Ethernet176 161 Eth23-1 10000 22 9126 none +Ethernet177 162 Eth23-2 10000 22 9126 none +Ethernet178 163 Eth23-3 10000 22 9126 none +Ethernet179 164 Eth23-4 10000 22 9126 none +Ethernet184 169 Eth24-1 10000 23 9126 none +Ethernet185 170 Eth24-2 10000 23 9126 none +Ethernet186 171 Eth24-3 10000 23 9126 none +Ethernet187 172 Eth24-4 10000 23 9126 none +Ethernet192 17 Eth25-1 10000 24 9126 none +Ethernet193 18 Eth25-2 10000 24 9126 none +Ethernet194 19 Eth25-3 10000 24 9126 none +Ethernet195 20 Eth25-4 10000 24 9126 none +Ethernet200 25 Eth26-1 10000 25 9126 none +Ethernet201 26 Eth26-2 10000 25 9126 none +Ethernet202 27 Eth26-3 10000 25 9126 none +Ethernet203 28 Eth26-4 10000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..76171942ee06 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml new file mode 100644 index 000000000000..8014caa1da4d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_24x400G_8x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini new file mode 100644 index 000000000000..c9e1c968c305 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 none +Ethernet200 25,26,27,28 Eth26 100000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 none +Ethernet216 9,10,11,12 Eth28 100000 27 9126 none +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..78452fa14cae --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "NONE" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "NONE" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "NONE" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml new file mode 100644 index 000000000000..e17792d88daa --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_28x400G_4x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini new file mode 100644 index 000000000000..a04e89da9489 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60 Eth5 100000 4 9126 none +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140 Eth11 100000 10 9126 none +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 none +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..a6f5d00d8b34 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,425 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml new file mode 100644 index 000000000000..8ae2b9683d49 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini new file mode 100644 index 000000000000..9507616bd5c2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92 Eth1 100000 0 9126 rs +Ethernet8 81,82,83,84 Eth2 100000 1 9126 rs +Ethernet16 73,74,75,76 Eth3 100000 2 9126 rs +Ethernet24 65,66,67,68 Eth4 100000 3 9126 rs +Ethernet32 57,58,59,60 Eth5 100000 4 9126 rs +Ethernet40 49,50,51,52 Eth6 100000 5 9126 rs +Ethernet48 41,42,43,44 Eth7 100000 6 9126 rs +Ethernet56 33,34,35,36 Eth8 100000 7 9126 rs +Ethernet64 153,154,155,156 Eth9 100000 8 9126 rs +Ethernet72 145,146,147,148 Eth10 100000 9 9126 rs +Ethernet80 137,138,139,140 Eth11 100000 10 9126 rs +Ethernet88 129,130,131,132 Eth12 100000 11 9126 rs +Ethernet96 121,122,123,124 Eth13 100000 12 9126 rs +Ethernet104 113,114,115,116 Eth14 100000 13 9126 rs +Ethernet112 105,106,107,108 Eth15 100000 14 9126 rs +Ethernet120 97,98,99,100 Eth16 100000 15 9126 rs +Ethernet128 209,210,211,212 Eth17 100000 16 9126 rs +Ethernet136 217,218,219,220 Eth18 100000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 rs +Ethernet232 249,250,251,252 Eth30 100000 29 9126 rs +Ethernet240 225,226,227,228 Eth31 100000 30 9126 rs +Ethernet248 233,234,235,236 Eth32 100000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..1a31812c26b1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..93dac6b1992a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml new file mode 100644 index 000000000000..5eb611aa7db9 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,804 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml new file mode 100644 index 000000000000..01fe64ec7bc9 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_72x25G_6x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini new file mode 100644 index 000000000000..adcb52ab2a29 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini new file mode 100644 index 000000000000..4f3e8d2bd38c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini @@ -0,0 +1,87 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..104d2d78de87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 new file mode 100644 index 000000000000..4b9748c7b594 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku new file mode 100644 index 000000000000..041c1629fc22 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku @@ -0,0 +1 @@ +Wistron_sw_to3200k t1 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf new file mode 100644 index 000000000000..6af5fa8d979b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=4 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic new file mode 100644 index 000000000000..84083a7415d9 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic @@ -0,0 +1 @@ +innovium diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py new file mode 100644 index 000000000000..9f59510eac28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +def eeprom_check(): + filepath="/sys/bus/i2c/devices/0-0056/eeprom" + if os.path.isfile(filepath): + return 1 #now board, 0x56 + else: + return 0 #now board, 0x57 + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + ret=eeprom_check() + if ret==1: + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + else: + self.eeprom_path = "/sys/bus/i2c/devices/47-0057/eeprom" + + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py new file mode 100644 index 000000000000..2d00aa6282c0 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "0-0051", + 1: "0-0052", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py new file mode 100644 index 000000000000..fe59dc7d8ce5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py @@ -0,0 +1,186 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/0-00{0}/" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/0-0061/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/0-0062/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [1, 10], + 1: [2, 11], + 2: [3, 12], + 3: [4, 13], + 4: [5, 14], + 5: [6, 15], + 6: [7, 16], + 7: [8, 17], + 8: [9, 18], + 9: [10, 19], + 10: [11, 20], + 11: [12, 21], + 12: [13, 22], + 13: [14, 23], + 14: [15, 24], + 15: [16, 25], + 16: [17, 26], + 17: [18, 27], + 18: [19, 28], + 19: [20, 29], + 20: [21, 30], + 21: [22, 31], + 22: [23, 32], + 23: [24, 33], + 24: [25, 34], + 25: [26, 35], + 26: [27, 36], + 27: [28, 37], + 28: [29, 38], + 29: [30, 39], + 30: [31, 40], + 31: [32, 41], + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def is_logical_port(self, port_name): + return True + + def get_logical_to_physical(self, port_name): + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return None + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + port_idx = port_idx // 8 + return [port_idx] + + def __init__(self): + eeprom_path = self.BASE_OOM_PATH + "eeprom1" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x][1]) + + self._transceiver_presence = self._get_sfp_presence() + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < 16 : + present_path = self.BASE_CPLD1_PATH + "module_present_" + str(port_num+1) + else: + present_path = self.BASE_CPLD2_PATH + "module_present_" + str(port_num+1) + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print "Error: unable to access file: %s" % str(e) + return False + + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + raise NotImplementedError + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, self.port_end+1): + port_pres[port] = self.get_presence(port) + + return port_pres + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + change_status = False + + cur_presence = self._get_sfp_presence() + for port in range(0, self.port_end+1): + if cur_presence[port] == 1: + port_dict[port]='1' + else: + port_dict[port]='0' + + if cur_presence[port] != self._transceiver_presence[port]: + change_status = True + + self._transceiver_presence = cur_presence + if change_status: + return True, port_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print "get_evt_change_event: Should not reach here." + return False, {} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..94592fa8cebc --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config new file mode 100644 index 000000000000..9a16887e3ada --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config @@ -0,0 +1,5135 @@ + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf new file mode 100644 index 000000000000..795ea43143eb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index bf1267041252..2cae779d71ac 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -7,6 +7,7 @@ $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_715_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WISTRON_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/innovium/platform-modules-wistron.mk b/platform/innovium/platform-modules-wistron.mk new file mode 100644 index 000000000000..ed0c8922c1b1 --- /dev/null +++ b/platform/innovium/platform-modules-wistron.mk @@ -0,0 +1,19 @@ +# Wistron Platform modules + +WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION = 1.1 +WISTRON_6512_32R_PLATFORM_MODULE_VERSION = 1.1 + +export WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION WISTRON_6512_32R_PLATFORM_MODULE_VERSION + +WISTRON_SW_TO3200K_PLATFORM_MODULE = sonic-platform-wistron-sw-to3200k_$(WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION)_amd64.deb +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-wistron +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_PLATFORM = x86_64-wistron_sw_to3200k-r0 + +WISTRON_6512_32R_PLATFORM_MODULE = sonic-platform-wistron-6512-32r_$(WISTRON_6512_32R_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb +$(WISTRON_6512_32R_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-wistron +$(WISTRON_6512_32R_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(WISTRON_6512_32R_PLATFORM_MODULE)_PLATFORM = x86_64-wistron_6512_32r-r0 + +WISTRON_PLATFORM_MODULE = $(WISTRON_SW_TO3200K_PLATFORM_MODULE) $(WISTRON_6512_32R_PLATFORM_MODULE) +SONIC_DPKG_DEBS += $(WISTRON_PLATFORM_MODULE) diff --git a/platform/innovium/rules.mk b/platform/innovium/rules.mk index 9cf6dd2bf259..39e695575326 100755 --- a/platform/innovium/rules.mk +++ b/platform/innovium/rules.mk @@ -1,6 +1,7 @@ include $(PLATFORM_PATH)/invm-sai.mk include $(PLATFORM_PATH)/platform-modules-cel.mk include $(PLATFORM_PATH)/platform-modules-delta.mk +include $(PLATFORM_PATH)/platform-modules-wistron.mk include $(PLATFORM_PATH)/platform-modules-netberg.mk include $(PLATFORM_PATH)/docker-syncd-invm.mk include $(PLATFORM_PATH)/docker-syncd-invm-rpc.mk diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile new file mode 100644 index 000000000000..86a67f55089b --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile @@ -0,0 +1,20 @@ +ifneq ($(KERNELRELEASE),) +obj-m:= wistron_6512_32r_cpld.o wistron_6512_32r_fan.o \ + wistron_6512_32r_oom.o wistron_6512_32r_psu.o \ + wistron_6512_32r_thermal.o \ + wistron_6512_32r_leds.o wistron_6512_32r_syseeprom.o +else +ifeq (,$(KERNEL_SRC)) +#$(error KERNEL_SRC is not defined) +KVERSION=3.16.0-8-amd64 +KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ +KERNELDIR:=$(KERNEL_DIR) +else +KERNELDIR:=$(KERNEL_SRC) +endif +PWD:=$(shell pwd) +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules +clean: + rm -rf *.o *.mod.o *.mod.o *.ko .*cmd *.mod.c *.mod .tmp_versions Module.markers Module.symvers modules.order +endif diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c new file mode 100644 index 000000000000..a6c21966d1cf --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c @@ -0,0 +1,953 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT_NUM 32 +#define SYSLED_NUM 4 +#define FPGA_ADDR 0x30 + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +enum cpld_type { + wistron_fpga, + wistron_cpld1, + wistron_cpld2 +}; + +struct wistron_cpld_data { + enum cpld_type type; + struct device *hwmon_dev; + struct mutex lock; + int version; + int sysled_status[SYSLED_NUM]; + int present[PORT_NUM]; + int reset[PORT_NUM]; + int lpmod[PORT_NUM]; + int modsel[PORT_NUM]; +}; + +static const struct i2c_device_id wistron_cpld_id[] = { + { "wistron_fpga", wistron_fpga }, + { "wistron_cpld1", wistron_cpld1 }, + { "wistron_cpld2", wistron_cpld2 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wistron_cpld_id); + +#define TRANSCEIVER_PRESENT_ATTR_ID(index) MODULE_PRESENT_##index +#define TRANSCEIVER_RESET_ATTR_ID(index) MODULE_RESET_##index +#define TRANSCEIVER_LPMOD_ATTR_ID(index) MODULE_LPMOD_##index +#define TRANSCEIVER_MODSEL_ATTR_ID(index) MODULE_MODSEL_##index + +enum wistron_cpld_sysfs_attributes { + /* chip version */ + CPLD_VERSION, + /* system led */ + SYSTEM_LED_LOC, + SYSTEM_LED_DIAG, + SYSTEM_LED_FAN, + SYSTEM_LED_PSU, + /* transceiver attributes */ + TRANSCEIVER_PRESENT_ATTR_ID(1), + TRANSCEIVER_PRESENT_ATTR_ID(2), + TRANSCEIVER_PRESENT_ATTR_ID(3), + TRANSCEIVER_PRESENT_ATTR_ID(4), + TRANSCEIVER_PRESENT_ATTR_ID(5), + TRANSCEIVER_PRESENT_ATTR_ID(6), + TRANSCEIVER_PRESENT_ATTR_ID(7), + TRANSCEIVER_PRESENT_ATTR_ID(8), + TRANSCEIVER_PRESENT_ATTR_ID(9), + TRANSCEIVER_PRESENT_ATTR_ID(10), + TRANSCEIVER_PRESENT_ATTR_ID(11), + TRANSCEIVER_PRESENT_ATTR_ID(12), + TRANSCEIVER_PRESENT_ATTR_ID(13), + TRANSCEIVER_PRESENT_ATTR_ID(14), + TRANSCEIVER_PRESENT_ATTR_ID(15), + TRANSCEIVER_PRESENT_ATTR_ID(16), + TRANSCEIVER_PRESENT_ATTR_ID(17), + TRANSCEIVER_PRESENT_ATTR_ID(18), + TRANSCEIVER_PRESENT_ATTR_ID(19), + TRANSCEIVER_PRESENT_ATTR_ID(20), + TRANSCEIVER_PRESENT_ATTR_ID(21), + TRANSCEIVER_PRESENT_ATTR_ID(22), + TRANSCEIVER_PRESENT_ATTR_ID(23), + TRANSCEIVER_PRESENT_ATTR_ID(24), + TRANSCEIVER_PRESENT_ATTR_ID(25), + TRANSCEIVER_PRESENT_ATTR_ID(26), + TRANSCEIVER_PRESENT_ATTR_ID(27), + TRANSCEIVER_PRESENT_ATTR_ID(28), + TRANSCEIVER_PRESENT_ATTR_ID(29), + TRANSCEIVER_PRESENT_ATTR_ID(30), + TRANSCEIVER_PRESENT_ATTR_ID(31), + TRANSCEIVER_PRESENT_ATTR_ID(32), + TRANSCEIVER_RESET_ATTR_ID(1), + TRANSCEIVER_RESET_ATTR_ID(2), + TRANSCEIVER_RESET_ATTR_ID(3), + TRANSCEIVER_RESET_ATTR_ID(4), + TRANSCEIVER_RESET_ATTR_ID(5), + TRANSCEIVER_RESET_ATTR_ID(6), + TRANSCEIVER_RESET_ATTR_ID(7), + TRANSCEIVER_RESET_ATTR_ID(8), + TRANSCEIVER_RESET_ATTR_ID(9), + TRANSCEIVER_RESET_ATTR_ID(10), + TRANSCEIVER_RESET_ATTR_ID(11), + TRANSCEIVER_RESET_ATTR_ID(12), + TRANSCEIVER_RESET_ATTR_ID(13), + TRANSCEIVER_RESET_ATTR_ID(14), + TRANSCEIVER_RESET_ATTR_ID(15), + TRANSCEIVER_RESET_ATTR_ID(16), + TRANSCEIVER_RESET_ATTR_ID(17), + TRANSCEIVER_RESET_ATTR_ID(18), + TRANSCEIVER_RESET_ATTR_ID(19), + TRANSCEIVER_RESET_ATTR_ID(20), + TRANSCEIVER_RESET_ATTR_ID(21), + TRANSCEIVER_RESET_ATTR_ID(22), + TRANSCEIVER_RESET_ATTR_ID(23), + TRANSCEIVER_RESET_ATTR_ID(24), + TRANSCEIVER_RESET_ATTR_ID(25), + TRANSCEIVER_RESET_ATTR_ID(26), + TRANSCEIVER_RESET_ATTR_ID(27), + TRANSCEIVER_RESET_ATTR_ID(28), + TRANSCEIVER_RESET_ATTR_ID(29), + TRANSCEIVER_RESET_ATTR_ID(30), + TRANSCEIVER_RESET_ATTR_ID(31), + TRANSCEIVER_RESET_ATTR_ID(32), + TRANSCEIVER_LPMOD_ATTR_ID(1), + TRANSCEIVER_LPMOD_ATTR_ID(2), + TRANSCEIVER_LPMOD_ATTR_ID(3), + TRANSCEIVER_LPMOD_ATTR_ID(4), + TRANSCEIVER_LPMOD_ATTR_ID(5), + TRANSCEIVER_LPMOD_ATTR_ID(6), + TRANSCEIVER_LPMOD_ATTR_ID(7), + TRANSCEIVER_LPMOD_ATTR_ID(8), + TRANSCEIVER_LPMOD_ATTR_ID(9), + TRANSCEIVER_LPMOD_ATTR_ID(10), + TRANSCEIVER_LPMOD_ATTR_ID(11), + TRANSCEIVER_LPMOD_ATTR_ID(12), + TRANSCEIVER_LPMOD_ATTR_ID(13), + TRANSCEIVER_LPMOD_ATTR_ID(14), + TRANSCEIVER_LPMOD_ATTR_ID(15), + TRANSCEIVER_LPMOD_ATTR_ID(16), + TRANSCEIVER_LPMOD_ATTR_ID(17), + TRANSCEIVER_LPMOD_ATTR_ID(18), + TRANSCEIVER_LPMOD_ATTR_ID(19), + TRANSCEIVER_LPMOD_ATTR_ID(20), + TRANSCEIVER_LPMOD_ATTR_ID(21), + TRANSCEIVER_LPMOD_ATTR_ID(22), + TRANSCEIVER_LPMOD_ATTR_ID(23), + TRANSCEIVER_LPMOD_ATTR_ID(24), + TRANSCEIVER_LPMOD_ATTR_ID(25), + TRANSCEIVER_LPMOD_ATTR_ID(26), + TRANSCEIVER_LPMOD_ATTR_ID(27), + TRANSCEIVER_LPMOD_ATTR_ID(28), + TRANSCEIVER_LPMOD_ATTR_ID(29), + TRANSCEIVER_LPMOD_ATTR_ID(30), + TRANSCEIVER_LPMOD_ATTR_ID(31), + TRANSCEIVER_LPMOD_ATTR_ID(32), + TRANSCEIVER_MODSEL_ATTR_ID(1), + TRANSCEIVER_MODSEL_ATTR_ID(2), + TRANSCEIVER_MODSEL_ATTR_ID(3), + TRANSCEIVER_MODSEL_ATTR_ID(4), + TRANSCEIVER_MODSEL_ATTR_ID(5), + TRANSCEIVER_MODSEL_ATTR_ID(6), + TRANSCEIVER_MODSEL_ATTR_ID(7), + TRANSCEIVER_MODSEL_ATTR_ID(8), + TRANSCEIVER_MODSEL_ATTR_ID(9), + TRANSCEIVER_MODSEL_ATTR_ID(10), + TRANSCEIVER_MODSEL_ATTR_ID(11), + TRANSCEIVER_MODSEL_ATTR_ID(12), + TRANSCEIVER_MODSEL_ATTR_ID(13), + TRANSCEIVER_MODSEL_ATTR_ID(14), + TRANSCEIVER_MODSEL_ATTR_ID(15), + TRANSCEIVER_MODSEL_ATTR_ID(16), + TRANSCEIVER_MODSEL_ATTR_ID(17), + TRANSCEIVER_MODSEL_ATTR_ID(18), + TRANSCEIVER_MODSEL_ATTR_ID(19), + TRANSCEIVER_MODSEL_ATTR_ID(20), + TRANSCEIVER_MODSEL_ATTR_ID(21), + TRANSCEIVER_MODSEL_ATTR_ID(22), + TRANSCEIVER_MODSEL_ATTR_ID(23), + TRANSCEIVER_MODSEL_ATTR_ID(24), + TRANSCEIVER_MODSEL_ATTR_ID(25), + TRANSCEIVER_MODSEL_ATTR_ID(26), + TRANSCEIVER_MODSEL_ATTR_ID(27), + TRANSCEIVER_MODSEL_ATTR_ID(28), + TRANSCEIVER_MODSEL_ATTR_ID(29), + TRANSCEIVER_MODSEL_ATTR_ID(30), + TRANSCEIVER_MODSEL_ATTR_ID(31), + TRANSCEIVER_MODSEL_ATTR_ID(32), +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_lpmod(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_lpmod(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_modsel(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_modsel(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* version */ +static SENSOR_DEVICE_ATTR(version, S_IWUSR | S_IRUGO, get_version, set_version, CPLD_VERSION); + +/* system led */ +static SENSOR_DEVICE_ATTR(loc_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_LOC); +static SENSOR_DEVICE_ATTR(sys_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_DIAG); +static SENSOR_DEVICE_ATTR(fan_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_FAN); +static SENSOR_DEVICE_ATTR(psu_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU); + +/* transceiver attributes */ +#define DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_present, S_IWUSR | S_IRUGO, get_status, set_status, MODULE_PRESENT_##index) +#define DECLARE_TRANSCEIVER_PRESENT_ATTR(index) &sensor_dev_attr_port##index##_present.dev_attr.attr + +/*reset*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_reset, S_IWUSR | S_IRUGO, get_mode_reset, set_mode_reset, MODULE_RESET_##index) +#define DECLARE_TRANSCEIVER_RESET_ATTR(index) &sensor_dev_attr_port##index##_reset.dev_attr.attr + +/*lpmod*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_lpmode, S_IWUSR | S_IRUGO, get_mode_lpmod, set_mode_lpmod, MODULE_LPMOD_##index) +#define DECLARE_TRANSCEIVER_LPMOD_ATTR(index) &sensor_dev_attr_port##index##_lpmode.dev_attr.attr + +/*modsel*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_modsel, S_IWUSR | S_IRUGO, get_mode_modsel, set_mode_modsel, MODULE_MODSEL_##index) +#define DECLARE_TRANSCEIVER_MODSEL_ATTR(index) &sensor_dev_attr_port##index##_modsel.dev_attr.attr + +/* transceiver attributes */ +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(1); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(2); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(3); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(4); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(5); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(6); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(7); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(8); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(9); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(10); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(11); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(12); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(13); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(14); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(15); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(16); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(17); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(18); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(19); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(20); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(21); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(22); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(23); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(24); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(25); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(26); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(27); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(28); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(29); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(30); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(31); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(32); + +static struct attribute *wistron_fpga_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + &sensor_dev_attr_loc_led.dev_attr.attr, + &sensor_dev_attr_sys_led.dev_attr.attr, + &sensor_dev_attr_fan_led.dev_attr.attr, + &sensor_dev_attr_psu_led.dev_attr.attr, + NULL +}; + +static const struct attribute_group wistron_fpga_group = { + .attrs = wistron_fpga_attributes, +}; + +static struct attribute *wistron_cpld1_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(1), + DECLARE_TRANSCEIVER_PRESENT_ATTR(2), + DECLARE_TRANSCEIVER_PRESENT_ATTR(3), + DECLARE_TRANSCEIVER_PRESENT_ATTR(4), + DECLARE_TRANSCEIVER_PRESENT_ATTR(5), + DECLARE_TRANSCEIVER_PRESENT_ATTR(6), + DECLARE_TRANSCEIVER_PRESENT_ATTR(7), + DECLARE_TRANSCEIVER_PRESENT_ATTR(8), + DECLARE_TRANSCEIVER_PRESENT_ATTR(9), + DECLARE_TRANSCEIVER_PRESENT_ATTR(10), + DECLARE_TRANSCEIVER_PRESENT_ATTR(11), + DECLARE_TRANSCEIVER_PRESENT_ATTR(12), + DECLARE_TRANSCEIVER_PRESENT_ATTR(13), + DECLARE_TRANSCEIVER_PRESENT_ATTR(14), + DECLARE_TRANSCEIVER_PRESENT_ATTR(15), + DECLARE_TRANSCEIVER_PRESENT_ATTR(16), + DECLARE_TRANSCEIVER_RESET_ATTR(1), + DECLARE_TRANSCEIVER_RESET_ATTR(2), + DECLARE_TRANSCEIVER_RESET_ATTR(3), + DECLARE_TRANSCEIVER_RESET_ATTR(4), + DECLARE_TRANSCEIVER_RESET_ATTR(5), + DECLARE_TRANSCEIVER_RESET_ATTR(6), + DECLARE_TRANSCEIVER_RESET_ATTR(7), + DECLARE_TRANSCEIVER_RESET_ATTR(8), + DECLARE_TRANSCEIVER_RESET_ATTR(9), + DECLARE_TRANSCEIVER_RESET_ATTR(10), + DECLARE_TRANSCEIVER_RESET_ATTR(11), + DECLARE_TRANSCEIVER_RESET_ATTR(12), + DECLARE_TRANSCEIVER_RESET_ATTR(13), + DECLARE_TRANSCEIVER_RESET_ATTR(14), + DECLARE_TRANSCEIVER_RESET_ATTR(15), + DECLARE_TRANSCEIVER_RESET_ATTR(16), + DECLARE_TRANSCEIVER_LPMOD_ATTR(1), + DECLARE_TRANSCEIVER_LPMOD_ATTR(2), + DECLARE_TRANSCEIVER_LPMOD_ATTR(3), + DECLARE_TRANSCEIVER_LPMOD_ATTR(4), + DECLARE_TRANSCEIVER_LPMOD_ATTR(5), + DECLARE_TRANSCEIVER_LPMOD_ATTR(6), + DECLARE_TRANSCEIVER_LPMOD_ATTR(7), + DECLARE_TRANSCEIVER_LPMOD_ATTR(8), + DECLARE_TRANSCEIVER_LPMOD_ATTR(9), + DECLARE_TRANSCEIVER_LPMOD_ATTR(10), + DECLARE_TRANSCEIVER_LPMOD_ATTR(11), + DECLARE_TRANSCEIVER_LPMOD_ATTR(12), + DECLARE_TRANSCEIVER_LPMOD_ATTR(13), + DECLARE_TRANSCEIVER_LPMOD_ATTR(14), + DECLARE_TRANSCEIVER_LPMOD_ATTR(15), + DECLARE_TRANSCEIVER_LPMOD_ATTR(16), + DECLARE_TRANSCEIVER_MODSEL_ATTR(1), + DECLARE_TRANSCEIVER_MODSEL_ATTR(2), + DECLARE_TRANSCEIVER_MODSEL_ATTR(3), + DECLARE_TRANSCEIVER_MODSEL_ATTR(4), + DECLARE_TRANSCEIVER_MODSEL_ATTR(5), + DECLARE_TRANSCEIVER_MODSEL_ATTR(6), + DECLARE_TRANSCEIVER_MODSEL_ATTR(7), + DECLARE_TRANSCEIVER_MODSEL_ATTR(8), + DECLARE_TRANSCEIVER_MODSEL_ATTR(9), + DECLARE_TRANSCEIVER_MODSEL_ATTR(10), + DECLARE_TRANSCEIVER_MODSEL_ATTR(11), + DECLARE_TRANSCEIVER_MODSEL_ATTR(12), + DECLARE_TRANSCEIVER_MODSEL_ATTR(13), + DECLARE_TRANSCEIVER_MODSEL_ATTR(14), + DECLARE_TRANSCEIVER_MODSEL_ATTR(15), + DECLARE_TRANSCEIVER_MODSEL_ATTR(16), + NULL +}; + +static const struct attribute_group wistron_cpld1_group = { + .attrs = wistron_cpld1_attributes, +}; + +static struct attribute *wistron_cpld2_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(17), + DECLARE_TRANSCEIVER_PRESENT_ATTR(18), + DECLARE_TRANSCEIVER_PRESENT_ATTR(19), + DECLARE_TRANSCEIVER_PRESENT_ATTR(20), + DECLARE_TRANSCEIVER_PRESENT_ATTR(21), + DECLARE_TRANSCEIVER_PRESENT_ATTR(22), + DECLARE_TRANSCEIVER_PRESENT_ATTR(23), + DECLARE_TRANSCEIVER_PRESENT_ATTR(24), + DECLARE_TRANSCEIVER_PRESENT_ATTR(25), + DECLARE_TRANSCEIVER_PRESENT_ATTR(26), + DECLARE_TRANSCEIVER_PRESENT_ATTR(27), + DECLARE_TRANSCEIVER_PRESENT_ATTR(28), + DECLARE_TRANSCEIVER_PRESENT_ATTR(29), + DECLARE_TRANSCEIVER_PRESENT_ATTR(30), + DECLARE_TRANSCEIVER_PRESENT_ATTR(31), + DECLARE_TRANSCEIVER_PRESENT_ATTR(32), + DECLARE_TRANSCEIVER_RESET_ATTR(17), + DECLARE_TRANSCEIVER_RESET_ATTR(18), + DECLARE_TRANSCEIVER_RESET_ATTR(19), + DECLARE_TRANSCEIVER_RESET_ATTR(20), + DECLARE_TRANSCEIVER_RESET_ATTR(21), + DECLARE_TRANSCEIVER_RESET_ATTR(22), + DECLARE_TRANSCEIVER_RESET_ATTR(23), + DECLARE_TRANSCEIVER_RESET_ATTR(24), + DECLARE_TRANSCEIVER_RESET_ATTR(25), + DECLARE_TRANSCEIVER_RESET_ATTR(26), + DECLARE_TRANSCEIVER_RESET_ATTR(27), + DECLARE_TRANSCEIVER_RESET_ATTR(28), + DECLARE_TRANSCEIVER_RESET_ATTR(29), + DECLARE_TRANSCEIVER_RESET_ATTR(30), + DECLARE_TRANSCEIVER_RESET_ATTR(31), + DECLARE_TRANSCEIVER_RESET_ATTR(32), + DECLARE_TRANSCEIVER_LPMOD_ATTR(17), + DECLARE_TRANSCEIVER_LPMOD_ATTR(18), + DECLARE_TRANSCEIVER_LPMOD_ATTR(19), + DECLARE_TRANSCEIVER_LPMOD_ATTR(20), + DECLARE_TRANSCEIVER_LPMOD_ATTR(21), + DECLARE_TRANSCEIVER_LPMOD_ATTR(22), + DECLARE_TRANSCEIVER_LPMOD_ATTR(23), + DECLARE_TRANSCEIVER_LPMOD_ATTR(24), + DECLARE_TRANSCEIVER_LPMOD_ATTR(25), + DECLARE_TRANSCEIVER_LPMOD_ATTR(26), + DECLARE_TRANSCEIVER_LPMOD_ATTR(27), + DECLARE_TRANSCEIVER_LPMOD_ATTR(28), + DECLARE_TRANSCEIVER_LPMOD_ATTR(29), + DECLARE_TRANSCEIVER_LPMOD_ATTR(30), + DECLARE_TRANSCEIVER_LPMOD_ATTR(31), + DECLARE_TRANSCEIVER_LPMOD_ATTR(32), + DECLARE_TRANSCEIVER_MODSEL_ATTR(17), + DECLARE_TRANSCEIVER_MODSEL_ATTR(18), + DECLARE_TRANSCEIVER_MODSEL_ATTR(19), + DECLARE_TRANSCEIVER_MODSEL_ATTR(20), + DECLARE_TRANSCEIVER_MODSEL_ATTR(21), + DECLARE_TRANSCEIVER_MODSEL_ATTR(22), + DECLARE_TRANSCEIVER_MODSEL_ATTR(23), + DECLARE_TRANSCEIVER_MODSEL_ATTR(24), + DECLARE_TRANSCEIVER_MODSEL_ATTR(25), + DECLARE_TRANSCEIVER_MODSEL_ATTR(26), + DECLARE_TRANSCEIVER_MODSEL_ATTR(27), + DECLARE_TRANSCEIVER_MODSEL_ATTR(28), + DECLARE_TRANSCEIVER_MODSEL_ATTR(29), + DECLARE_TRANSCEIVER_MODSEL_ATTR(30), + DECLARE_TRANSCEIVER_MODSEL_ATTR(31), + DECLARE_TRANSCEIVER_MODSEL_ATTR(32), + NULL +}; + +static const struct attribute_group wistron_cpld2_group = { + .attrs = wistron_cpld2_attributes, +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + status = data->present[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + long status=0; + int update_idx, error; + + error = kstrtol(buf, 10, &status); + if (error) + return error; + + update_idx = attr->index - MODULE_PRESENT_1; + + mutex_lock(&data->lock); + data->present[update_idx] = status; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int version; + + mutex_lock(&data->lock); + version = data->version; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", version); +} + +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, version; + + error = kstrtoint(buf, 10, &version); + if (error) + return error; + + mutex_lock(&data->lock); + data->version = version; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, reset = 0; + + update_idx = attr->index - MODULE_RESET_1; + + mutex_lock(&data->lock); + reset = data->reset[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", reset); +} + +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, reset; + int update_idx; + + error = kstrtoint(buf, 10, &reset); + if (error) + return error; + + update_idx = attr->index - MODULE_RESET_1; + + mutex_lock(&data->lock); + data->reset[update_idx] = reset; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - SYSTEM_LED_LOC; + + mutex_lock(&data->lock); + status = data->sysled_status[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", status); +} + +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, status; + int update_idx; + + error = kstrtoint(buf, 10, &status); + if (error) + return error; + + update_idx = attr->index - SYSTEM_LED_LOC; + + mutex_lock(&data->lock); + data->sysled_status[update_idx] = status; + mutex_unlock(&data->lock); + + return count; +} + +static int get_led_status_internal(struct i2c_client *client, int led_type) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + status = data->sysled_status[led_type]; + mutex_unlock(&data->lock); + return status; +} + +static int set_led_status_internal(struct i2c_client *client, int led_type, int light_mode) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + data->sysled_status[led_type] = light_mode; + mutex_unlock(&data->lock); + + return 0; +} + +static ssize_t get_mode_lpmod(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, lpmod = 0; + + update_idx = attr->index - MODULE_LPMOD_1; + + mutex_lock(&data->lock); + lpmod = data->lpmod[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", lpmod); +} + +static ssize_t set_mode_lpmod(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, lpmod; + int update_idx; + + error = kstrtoint(buf, 10, &lpmod); + if (error) + return error; + + update_idx = attr->index - MODULE_LPMOD_1; + + mutex_lock(&data->lock); + data->lpmod[update_idx] = lpmod; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_mode_modsel(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, modsel = 0; + + update_idx = attr->index - MODULE_MODSEL_1; + + mutex_lock(&data->lock); + modsel = data->modsel[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", modsel); +} + +static ssize_t set_mode_modsel(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, modsel; + int update_idx; + + error = kstrtoint(buf, 10, &modsel); + if (error) + return error; + + update_idx = attr->index - MODULE_MODSEL_1; + + mutex_lock(&data->lock); + data->modsel[update_idx] = modsel; + mutex_unlock(&data->lock); + + return count; +} + +static void wistron_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void wistron_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +/* + * I2C init/probing/exit functions + */ +static int wistron_cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct wistron_cpld_data *data; + int ret = -ENODEV; + const struct attribute_group *group = NULL; + + data = kzalloc(sizeof(struct wistron_cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + data->type = id->driver_data; + + /* Register sysfs hooks */ + switch (data->type) + { + case wistron_fpga: + group = &wistron_fpga_group; + break; + case wistron_cpld1: + group = &wistron_cpld1_group; + break; + case wistron_cpld2: + group = &wistron_cpld2_group; + break; + default: + break; + } + + if (group) { + ret = sysfs_create_group(&client->dev.kobj, group); + if (ret) + goto exit_free; + } + + wistron_cpld_add_client(client); + return 0; + +exit_free: + kfree(data); + + return ret; +} + +static int wistron_cpld_remove(struct i2c_client *client) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + const struct attribute_group *group = NULL; + + wistron_cpld_remove_client(client); + + /* Remove sysfs hooks */ + switch (data->type) + { + case wistron_fpga: + group = &wistron_fpga_group; + break; + case wistron_cpld1: + group = &wistron_cpld1_group; + break; + case wistron_cpld2: + group = &wistron_cpld2_group; + break; + default: + break; + } + + if (group) + sysfs_remove_group(&client->dev.kobj, group); + + kfree(data); + + return 0; +} + +int wistron_fpga_sysled_get(int led_type) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == FPGA_ADDR) { + ret = get_led_status_internal(cpld_node->client, led_type); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(wistron_fpga_sysled_get); + +int wistron_fpga_sysled_set(int led_type, int light_mode) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == FPGA_ADDR) { + ret = set_led_status_internal(cpld_node->client, led_type, light_mode); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(wistron_fpga_sysled_set); + +static struct i2c_driver wistron_cpld_driver = { + .driver = { + .name = "wistron_cpld", + .owner = THIS_MODULE, + }, + .probe = wistron_cpld_probe, + .remove = wistron_cpld_remove, + .id_table = wistron_cpld_id, +}; + +static int __init wistron_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&wistron_cpld_driver); +} + +static void __exit wistron_cpld_exit(void) +{ + i2c_del_driver(&wistron_cpld_driver); +} + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("Wistron I2C CPLD driver"); +MODULE_LICENSE("GPL"); + +module_init(wistron_cpld_init); +module_exit(wistron_cpld_exit); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c new file mode 100644 index 000000000000..4d57ba729c81 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c @@ -0,0 +1,255 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "wistron_fan" + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum fan_id { + FAN1_ID, + FAN2_ID, + FAN3_ID, + FAN4_ID, + FAN5_ID, + FAN6_ID, + FAN7_ID +}; + +enum sysfs_fan_attributes { + FAN_DUTY_CYCLE_PERCENTAGE, + FAN1_PRESENCE, + FAN2_PRESENCE, + FAN3_PRESENCE, + FAN4_PRESENCE, + FAN5_PRESENCE, + FAN6_PRESENCE, + FAN7_PRESENCE, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, + FAN7_DIRECTION, + FAN1_FRONT_SPEED_RPM, + FAN2_FRONT_SPEED_RPM, + FAN3_FRONT_SPEED_RPM, + FAN4_FRONT_SPEED_RPM, + FAN5_FRONT_SPEED_RPM, + FAN6_FRONT_SPEED_RPM, + FAN7_FRONT_SPEED_RPM, + FAN1_REAR_SPEED_RPM, + FAN2_REAR_SPEED_RPM, + FAN3_REAR_SPEED_RPM, + FAN4_REAR_SPEED_RPM, + FAN5_REAR_SPEED_RPM, + FAN6_REAR_SPEED_RPM, + FAN7_REAR_SPEED_RPM, + FAN_ATTR_MAX +}; + +/* Each client has this additional data */ +struct wistron_fan_data { + struct device *hwmon_dev; + struct mutex update_lock; + int fan_val[FAN_ATTR_MAX]; +}; + +/* Define attributes */ +#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(pwm##index, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DUTY_CYCLE_PERCENTAGE) +#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_pwm##index.dev_attr.attr + +#define DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_present, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_PRESENCE) +#define DECLARE_FAN_PRESENCE_ATTR(index) &sensor_dev_attr_fan##index##_present.dev_attr.attr + +#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DIRECTION) +#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr + +#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index, index2) \ +static SENSOR_DEVICE_ATTR(fan##index##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ +static SENSOR_DEVICE_ATTR(fan##index2##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM) +#define DECLARE_FAN_SPEED_RPM_ATTR(index, index2) \ +&sensor_dev_attr_fan##index##_input.dev_attr.attr, \ +&sensor_dev_attr_fan##index2##_input.dev_attr.attr + +/* 7 fan speed(rpm) attributes in this platform */ +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1, 8); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2, 9); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3, 10); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4, 11); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5, 12); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6, 13); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(7, 14); + +/* 7 fan presence */ +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(7); + +/* 7 fan direction */ +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(7); + +/* 1 fan duty cycle attribute in this platform */ +DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); + +static struct attribute *wistron_fan_attributes[] = { + /* fan related attributes */ + DECLARE_FAN_SPEED_RPM_ATTR(1, 8), + DECLARE_FAN_SPEED_RPM_ATTR(2, 9), + DECLARE_FAN_SPEED_RPM_ATTR(3, 10), + DECLARE_FAN_SPEED_RPM_ATTR(4, 11), + DECLARE_FAN_SPEED_RPM_ATTR(5, 12), + DECLARE_FAN_SPEED_RPM_ATTR(6, 13), + DECLARE_FAN_SPEED_RPM_ATTR(7, 14), + DECLARE_FAN_PRESENCE_ATTR(1), + DECLARE_FAN_PRESENCE_ATTR(2), + DECLARE_FAN_PRESENCE_ATTR(3), + DECLARE_FAN_PRESENCE_ATTR(4), + DECLARE_FAN_PRESENCE_ATTR(5), + DECLARE_FAN_PRESENCE_ATTR(6), + DECLARE_FAN_PRESENCE_ATTR(7), + DECLARE_FAN_DIRECTION_ATTR(1), + DECLARE_FAN_DIRECTION_ATTR(2), + DECLARE_FAN_DIRECTION_ATTR(3), + DECLARE_FAN_DIRECTION_ATTR(4), + DECLARE_FAN_DIRECTION_ATTR(5), + DECLARE_FAN_DIRECTION_ATTR(6), + DECLARE_FAN_DIRECTION_ATTR(7), + DECLARE_FAN_DUTY_CYCLE_ATTR(), + NULL +}; + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_fan_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->update_lock); + value = data->fan_val[attr->index]; + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d", value); +} + +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf,size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_fan_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) { + printk("fan_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->update_lock); + data->fan_val[attr->index] = value; + mutex_unlock(&data->update_lock); + + return count; +} + +static const struct attribute_group wistron_fan_group = { + .attrs = wistron_fan_attributes, +}; + +static int wistron_fan_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_fan_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_fan_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_fan_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_fan", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_fan_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_fan_remove(struct i2c_client *client) +{ + struct wistron_fan_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_fan_group); + + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { 0x23, I2C_CLIENT_END }; + +static const struct i2c_device_id wistron_fan_id[] = { + { "wistron_fan", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_fan_id); + +static struct i2c_driver wistron_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = wistron_fan_probe, + .remove = wistron_fan_remove, + .id_table = wistron_fan_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(wistron_fan_driver); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_fan driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c new file mode 100644 index 000000000000..a9e143624eb7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c @@ -0,0 +1,245 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +extern int wistron_fpga_sysled_get(int led_type); +extern int wistron_fpga_sysled_set(int led_type, int light_mode); +#define SYSLED_NUM 4 + +#define DRVNAME "wistron_led" + +struct wistron_led_data { + struct platform_device *pdev; + struct mutex lock; + int sysled_status[SYSLED_NUM]; +}; + +static struct wistron_led_data *ledctl = NULL; + +enum led_type { + LED_TYPE_LOC, + LED_TYPE_DIAG, + LED_TYPE_FAN, + LED_TYPE_PSU, + LED_TYPE_END +}; + +enum led_light_mode { + LED_MODE_OFF = 0, + LED_MODE_GREEN, + LED_MODE_AMBER, + LED_MODE_BLK_GREEN, + LED_MODE_UNKNOWN +}; + +static void wistron_led_update(void) +{ + int i; + mutex_lock(&ledctl->lock); + for (i = 0; i < LED_TYPE_END; i++) { + ledctl->sysled_status[i] = wistron_fpga_sysled_get(i); + } + mutex_unlock(&ledctl->lock); +} + +static void wistron_led_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode, enum led_type type) +{ + mutex_lock(&ledctl->lock); + wistron_fpga_sysled_set(type, led_light_mode); + mutex_unlock(&ledctl->lock); +} + +static void wistron_led_diag_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); +} + +static enum led_brightness wistron_led_diag_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_DIAG]; +} + +static void wistron_led_loc_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); +} + +static enum led_brightness wistron_led_loc_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_LOC]; +} + +static void wistron_led_fan_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_FAN); +} + +static enum led_brightness wistron_led_fan_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_FAN]; +} + +static void wistron_led_psu_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_PSU); +} + +static enum led_brightness wistron_led_psu_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU]; +} + +static struct led_classdev wistron_leds[] = { + [LED_TYPE_DIAG] = { + .name = "wistron_led::sys_led", + .default_trigger = "unused", + .brightness_set = wistron_led_diag_set, + .brightness_get = wistron_led_diag_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_LOC] = { + .name = "wistron_led::loc_led", + .default_trigger = "unused", + .brightness_set = wistron_led_loc_set, + .brightness_get = wistron_led_loc_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_FAN] = { + .name = "wistron_led::fan_led", + .default_trigger = "unused", + .brightness_set = wistron_led_fan_set, + .brightness_get = wistron_led_fan_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU] = { + .name = "wistron_led::psu_led", + .default_trigger = "unused", + .brightness_set = wistron_led_psu_set, + .brightness_get = wistron_led_psu_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, +}; + +static int wistron_led_suspend(struct platform_device *dev, pm_message_t state) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_suspend(&wistron_leds[i]); + } + + return 0; +} + +static int wistron_led_resume(struct platform_device *dev) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_resume(&wistron_leds[i]); + } + + return 0; +} + +static int wistron_led_probe(struct platform_device *pdev) +{ + int ret, i; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + ret = led_classdev_register(&pdev->dev, &wistron_leds[i]); + + if (ret < 0) + break; + } + + /* Check if all LEDs were successfully registered */ + if (i != ARRAY_SIZE(wistron_leds)) { + int j; + + /* only unregister the LEDs that were successfully registered */ + for (j = 0; j < i; j++) { + led_classdev_unregister(&wistron_leds[i]); + } + } + + return ret; +} + +static int wistron_led_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_unregister(&wistron_leds[i]); + } + + return 0; +} + +static struct platform_driver wistron_led_driver = { + .probe = wistron_led_probe, + .remove = wistron_led_remove, + .suspend = wistron_led_suspend, + .resume = wistron_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init wistron_led_init(void) +{ + int ret; + + ret = platform_driver_register(&wistron_led_driver); + if (ret < 0) + goto exit; + + ledctl = kzalloc(sizeof(struct wistron_led_data), GFP_KERNEL); + if (!ledctl) { + ret = -ENOMEM; + platform_driver_unregister(&wistron_led_driver); + goto exit; + } + + mutex_init(&ledctl->lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(ledctl->pdev)) { + ret = PTR_ERR(ledctl->pdev); + platform_driver_unregister(&wistron_led_driver); + kfree(ledctl); + goto exit; + } + +exit: + return ret; +} + +static void __exit wistron_led_exit(void) +{ + platform_device_unregister(ledctl->pdev); + platform_driver_unregister(&wistron_led_driver); + kfree(ledctl); +} + +module_init(wistron_led_init); +module_exit(wistron_led_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c new file mode 100644 index 000000000000..4236373499b2 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c @@ -0,0 +1,312 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* QSFP-DD: page0 (low page + high page (128+128 byte)), page 2 (high page (128 byte)), page11 (high page (128 byte))*/ +#define EEPROM_DATA_SIZE 256 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; +#define MAX_PORT_NAME_LEN 20 + +enum sysfs_fan_attributes { + OOM_LP_MODE, + OOM_TEMP, + OOM_EEPROM1, + OOM_EEPROM2, + OOM_PORT_NAME, + OOM_ATTR_MAX +}; + +/* Each client has this additional data */ +struct wistron_oom_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + int lp_mode; + int temp; + unsigned char eeprom1[EEPROM_DATA_SIZE]; + unsigned char eeprom2[EEPROM_DATA_SIZE]; + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info1(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info1(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info2(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static SENSOR_DEVICE_ATTR(lp_mode, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_LP_MODE); +static SENSOR_DEVICE_ATTR(temp, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_TEMP); +static SENSOR_DEVICE_ATTR(eeprom1, S_IWUSR | S_IRUGO, get_oom_info1, set_oom_info1, OOM_EEPROM1); +static SENSOR_DEVICE_ATTR(eeprom2, S_IWUSR | S_IRUGO, get_oom_info2, set_oom_info2, OOM_EEPROM2); +static SENSOR_DEVICE_ATTR(port_name, S_IRUGO | S_IWUSR, get_port_name, set_port_name, OOM_PORT_NAME); + +static struct attribute *wistron_oom_attributes[] = { + &sensor_dev_attr_lp_mode.dev_attr.attr, + &sensor_dev_attr_temp.dev_attr.attr, + &sensor_dev_attr_eeprom1.dev_attr.attr, + &sensor_dev_attr_eeprom2.dev_attr.attr, + &sensor_dev_attr_port_name.dev_attr.attr, + NULL +}; + +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + value = data->lp_mode; + else + value = data->temp; + + mutex_unlock(&data->lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) { + printk("oom_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + data->lp_mode = value; + else + data->temp = value; + + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_oom_info1(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom1, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info1(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom1, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i=0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + + sscanf(str, "%x", &val); + + i = j + i - 1; + + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom1[k] = (unsigned char)val; + k++; + } + } + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_oom_info2(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom2, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom2, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i = 0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + + sscanf(str, "%x", &val); + + i = j + i - 1; + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom2[k]=(unsigned char)val; + k++; + } + } + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + count = sprintf(buf, "%s", data->port_name); + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + if (sscanf(buf, "%19s", port_name) != 1) + return -EINVAL; + + mutex_lock(&data->lock); + strcpy(data->port_name, port_name); + mutex_unlock(&data->lock); + + return count; +} + +static const struct attribute_group wistron_oom_group = { + .attrs = wistron_oom_attributes, +}; + +static int wistron_oom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_oom_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_oom_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_oom_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_oom", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: oom '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_oom_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_oom_remove(struct i2c_client *client) +{ + struct wistron_oom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_oom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_oom_id[] = { + { "wistron_oom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_oom_id); + +static struct i2c_driver wistron_oom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_oom", + }, + .probe = wistron_oom_probe, + .remove = wistron_oom_remove, + .id_table = wistron_oom_id, + .address_list = normal_i2c, +}; + +static int __init wistron_oom_init(void) +{ + return i2c_add_driver(&wistron_oom_driver); +} + +static void __exit wistron_oom_exit(void) +{ + i2c_del_driver(&wistron_oom_driver); +} + +module_init(wistron_oom_init); +module_exit(wistron_oom_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_oom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c new file mode 100644 index 000000000000..1ea7764dd430 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c @@ -0,0 +1,347 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +#define MFR_VENDOR_NAME_LENGTH 16 +#define MFR_MODEL_NAME_LENGTH 16 +#define MFR_SERIAL_NUM_LENGTH 32 + +/* Each client has this additional data */ +struct wistron_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int index; /* PSU index */ + int present; /* PSU present */ + int pwr_good; /* PSU power good */ + int v_in; + int v_out; + int i_in; + int i_out; + int p_in; + int p_out; + int temp_input; + int fault; + u8 mfr_id[MFR_VENDOR_NAME_LENGTH]; + u8 mfr_model[MFR_MODEL_NAME_LENGTH]; + u8 mfr_serial[MFR_SERIAL_NUM_LENGTH]; +}; + +enum psu_index { + wistron_psu1, + wistron_psu2 +}; + +enum wistron_psu_sysfs_attributes { + PSU_PRESENT, + PSU_POWER_GOOD, + PSU_V_IN, + PSU_V_OUT, + PSU_I_IN, + PSU_I_OUT, + PSU_P_IN, + PSU_P_OUT, + PSU_TEMP1_INPUT, + PSU_FAULT, + PSU_MFR_ID, + PSU_MFR_MODEL, + PSU_MFR_SERIAL, +}; + +/* sysfs attributes for hwmon */ +static SENSOR_DEVICE_ATTR(present, S_IWUSR | S_IRUGO, get_status, set_status, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(power_good, S_IWUSR | S_IRUGO, get_status, set_status, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(in1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_IN); +static SENSOR_DEVICE_ATTR(in2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_IN); +static SENSOR_DEVICE_ATTR(curr2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_IN); +static SENSOR_DEVICE_ATTR(power2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fault, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAULT); +static SENSOR_DEVICE_ATTR(vendor, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_ID); +static SENSOR_DEVICE_ATTR(model, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(sn, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_SERIAL); + + +static struct attribute *wistron_psu_attributes[] = { + &sensor_dev_attr_present.dev_attr.attr, + &sensor_dev_attr_power_good.dev_attr.attr, + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_curr1_input.dev_attr.attr, + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fault.dev_attr.attr, + &sensor_dev_attr_vendor.dev_attr.attr, + &sensor_dev_attr_model.dev_attr.attr, + &sensor_dev_attr_sn.dev_attr.attr, + NULL +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) { + status = data->present; + } else if (attr->index == PSU_POWER_GOOD) { + status = data->pwr_good; + } + + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int error, status; + + error = kstrtoint(buf, 10, &status); + if (error) { + printk("psu_set_status error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) { + data->present = status; + } else if (attr->index == PSU_POWER_GOOD) { + data->pwr_good = status; + } + + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + size_t ret_count = 0; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + ret_count = sprintf(buf, "%d", data->v_in); + break; + case PSU_V_OUT: + ret_count = sprintf(buf, "%d", data->v_out); + break; + case PSU_I_IN: + ret_count = sprintf(buf, "%d", data->i_in); + break; + case PSU_I_OUT: + ret_count = sprintf(buf, "%d", data->i_out); + break; + case PSU_P_IN: + ret_count = sprintf(buf, "%d", data->p_in); + break; + case PSU_P_OUT: + ret_count = sprintf(buf, "%d", data->p_out); + break; + case PSU_TEMP1_INPUT: + ret_count = sprintf(buf, "%d", data->temp_input); + break; + case PSU_FAULT: + ret_count = sprintf(buf, "%d", data->fault); + break; + case PSU_MFR_ID: + ret_count = sprintf(buf, "%s", data->mfr_id); + break; + case PSU_MFR_MODEL: + ret_count = sprintf(buf, "%s", data->mfr_model); + break; + case PSU_MFR_SERIAL: + ret_count = sprintf(buf, "%s", data->mfr_serial); + break; + default: + break; + } + + mutex_unlock(&data->lock); + return ret_count; +} + +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int error; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + error = kstrtoint(buf, 10, &data->v_in); + if (error) + goto exit_err; + break; + case PSU_V_OUT: + error = kstrtoint(buf, 10, &data->v_out); + if (error) + goto exit_err; + break; + case PSU_I_IN: + error = kstrtoint(buf, 10, &data->i_in); + if (error) + goto exit_err; + break; + case PSU_I_OUT: + error = kstrtoint(buf, 10, &data->i_out); + if (error) + goto exit_err; + break; + case PSU_P_IN: + error = kstrtoint(buf, 10, &data->p_in); + if (error) + goto exit_err; + break; + case PSU_P_OUT: + error = kstrtoint(buf, 10, &data->p_out); + if (error) + goto exit_err; + break; + case PSU_TEMP1_INPUT: + error = kstrtoint(buf, 10, &data->temp_input); + if (error) + goto exit_err; + break; + case PSU_FAULT: + error = kstrtoint(buf, 10, &data->fault); + if (error) + goto exit_err; + break; + case PSU_MFR_ID: + memset(&data->mfr_id, 0x0, sizeof(data->mfr_id)); + strncpy(data->mfr_id, buf, sizeof(data->mfr_id) - 1); + break; + case PSU_MFR_MODEL: + memset(&data->mfr_model, 0x0, sizeof(data->mfr_model)); + strncpy(data->mfr_model, buf, sizeof(data->mfr_model) - 1); + break; + case PSU_MFR_SERIAL: + memset(&data->mfr_serial, 0x0, sizeof(data->mfr_serial)); + strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial) - 1); + break; + default: + break; + } + + mutex_unlock(&data->lock); + return count; + +exit_err: + mutex_unlock(&data->lock); + return error; +} + +static const struct attribute_group wistron_psu_group = { + .attrs = wistron_psu_attributes, +}; + +static int wistron_psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct wistron_psu_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) + return -EIO; + + data = kzalloc(sizeof(struct wistron_psu_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_psu_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_psu", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_psu_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_psu_remove(struct i2c_client *client) +{ + struct wistron_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_psu_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_psu_id[] = { + { "wistron_psu1", wistron_psu1 }, + { "wistron_psu2", wistron_psu2 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_psu_id); + +static struct i2c_driver wistron_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_psu", + }, + .probe = wistron_psu_probe, + .remove = wistron_psu_remove, + .id_table = wistron_psu_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(wistron_psu_driver); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_psu driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c new file mode 100644 index 000000000000..a281df719677 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c @@ -0,0 +1,161 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EEPROM_DATA_SIZE 256 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct wistron_syseeprom_data { + struct device *hwmon_dev; + struct mutex lock; + unsigned char eeprom[EEPROM_DATA_SIZE]; +}; + +static ssize_t get_syseeprom(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_syseeprom(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i = 0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + sscanf(str, "%x", &val); + + i = j + i - 1; + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom[k] = (unsigned char)val; + + k++; + } + } + + mutex_unlock(&data->lock); + return size; +} + +static SENSOR_DEVICE_ATTR(eeprom, S_IWUSR | S_IRUGO, get_syseeprom, set_syseeprom, 0); + +static struct attribute *wistron_syseeprom_attributes[] = { + &sensor_dev_attr_eeprom.dev_attr.attr, + NULL +}; + +static const struct attribute_group wistron_syseeprom_group = { + .attrs = wistron_syseeprom_attributes, +}; + +static int wistron_syseeprom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_syseeprom_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_syseeprom_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_syseeprom_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_syseeprom", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: syseeprom '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_syseeprom_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_syseeprom_remove(struct i2c_client *client) +{ + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_syseeprom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_syseeprom_id[] = { + { "wistron_syseeprom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_syseeprom_id); + +static struct i2c_driver wistron_syseeprom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_syseeprom", + }, + .probe = wistron_syseeprom_probe, + .remove = wistron_syseeprom_remove, + .id_table = wistron_syseeprom_id, + .address_list = normal_i2c, +}; + +static int __init wistron_syseeprom_init(void) +{ + return i2c_add_driver(&wistron_syseeprom_driver); +} + +static void __exit wistron_syseeprom_exit(void) +{ + i2c_del_driver(&wistron_syseeprom_driver); +} + +module_init(wistron_syseeprom_init); +module_exit(wistron_syseeprom_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron syseeprom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c new file mode 100644 index 000000000000..7d841046db67 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct wistron_thermal_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + unsigned int temp1_input; + unsigned int temp1_max; + unsigned int temp1_crit; + unsigned int temp1_max_hyst; +}; + +enum wistron_thermal_sysfs_attributes { + TEMP1_INPUT, + TEMP1_MAX, + TEMP1_CRIT, + TEMP1_MAX_HYST +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX); +static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_CRIT); +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX_HYST); + +static struct attribute *wistron_thermal_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, + NULL +}; + +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_thermal_data *data = i2c_get_clientdata(client); + int status = -EINVAL; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_input); + break; + case TEMP1_MAX: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_max); + break; + case TEMP1_CRIT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_crit); + break; + case TEMP1_MAX_HYST: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_max); // not support in this platform, so return max temp + break; + default : + break; + } + mutex_unlock(&data->lock); + + return status; +} + +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_thermal_data *data = i2c_get_clientdata(client); + long keyin = 0; + int error; + + error = kstrtol(buf, 10, &keyin); + if (error) + return error; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + data->temp1_input = keyin; + break; + case TEMP1_MAX: + data->temp1_max = keyin; + break; + case TEMP1_CRIT: + data->temp1_crit = keyin; + break; + default : + break; + } + + mutex_unlock(&data->lock); + + return size; +} + +static const struct attribute_group wistron_thermal_group = { + .attrs = wistron_thermal_attributes, +}; + +static int wistron_thermal_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_thermal_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_thermal_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_thermal_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_thermal", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: thermal '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_thermal_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_thermal_remove(struct i2c_client *client) +{ + struct wistron_thermal_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_thermal_group); + kfree(data); + + return 0; +} + + +static const struct i2c_device_id wistron_thermal_id[] = { + { "wistron_thermal", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_thermal_id); + +static struct i2c_driver wistron_thermal_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_thermal", + }, + .probe = wistron_thermal_probe, + .remove = wistron_thermal_remove, + .id_table = wistron_thermal_id, + .address_list = normal_i2c, +}; + +static int __init wistron_thermal_init(void) +{ + return i2c_add_driver(&wistron_thermal_driver); +} + +static void __exit wistron_thermal_exit(void) +{ + i2c_del_driver(&wistron_thermal_driver); +} + +module_init(wistron_thermal_init); +module_exit(wistron_thermal_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron thermal driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service new file mode 100644 index 000000000000..1842d036cda4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service @@ -0,0 +1,13 @@ +[Unit] +Description=Wistron 6512-32R Platform Monitoring service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_sync +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service new file mode 100644 index 000000000000..989248c885ad --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron 6512-32R Platform SysEEPROM service +After=platform-modules-6512-32r.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_syseeprom +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service new file mode 100644 index 000000000000..485217dc6e39 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service @@ -0,0 +1,14 @@ +[Unit] +Description=Wistron 6512-32R Platform modules +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/wistron_6512_32r_util.py install +ExecStop=/usr/local/bin/wistron_6512_32r_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py new file mode 100644 index 000000000000..3c2888412e90 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py @@ -0,0 +1,34 @@ +from setuptools import setup + +DEVICE_NAME = 'wistron' +HW_SKU = 'x86_64-wistron_6512_32r-r0' + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Wistron Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='ChihPei Chang', + maintainer_email='ChihPei_Chang@wistron.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync new file mode 100644 index 000000000000..9c357e7ac7e8 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync @@ -0,0 +1,7 @@ +#!/bin/bash +/usr/local/bin/sonic-fanthrml-monitor & +/usr/local/bin/sonic-led-monitor & +/usr/local/bin/sonic-qsfp-monitor & +/usr/local/bin/sonic-psu-monitor & +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom new file mode 100644 index 000000000000..2db0a921cb9a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom @@ -0,0 +1,10 @@ +#!/bin/bash +eeprom_part1=$(ipmitool raw 0x30 0x25 0x00 0xaa 0x80 0x0 2>>/dev/null) +eeprom_part2=$(ipmitool raw 0x30 0x25 0x00 0xaa 0x80 0x80 2>>/dev/null) +eeprom1_full=$eeprom_part1$eeprom_part2 +eeprom1_full=$(echo $eeprom1_full | sed 's/[[:space:]]//g') +eeprom1_path="/sys/bus/i2c/devices/0-0055/eeprom" +eeprom1_full=$(echo $eeprom1_full | sed -e 's/ //g') +echo $eeprom1_full > $eeprom1_path +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor new file mode 100644 index 000000000000..b490dbc8c914 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor @@ -0,0 +1,416 @@ +#!/bin/bash + +debug_flag=0 + +fan_val=0 +temp_val=0 +ctrl_mode_val=0 +fan_pwm_val=0 +fan_rpm_val=0 +init_threshold=0 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + + +bmc_sensor_read() +{ + temp_val=$(ipmitool raw 0x30 0x88 2>>/dev/null) + if [ $? -ne 0 ];then + return 1 + fi + + fan_val=$(ipmitool raw 0x30 0x22 2>>/dev/null) + if [ $? -ne 0 ];then + return 1 + fi + + return 0 +} + +#$1=get(0)/set(1), $2=ctrl_mode(1:manual, 0:auto) +#get rtn: ctrl_mode_val, fan_pwm_val +bmc_fan_speed_ctrl() +{ + if [ -e /sys/bus/i2c/devices/0-0044/pwm ];then + if [ $1 -eq 1 ];then + #Set Fan Speed Control + if [ $2 -eq 0 ];then + ipmitool raw 0x30 0x21 0x0 0x0 1>/dev/null 2>/dev/null + else + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0044/pwm | awk '{printf $1}') + fan_pwm_input=$( printf "%d" 0x$fan_pwm_input ) + ipmitool raw 0x30 0x21 0x1 $fan_pwm_input 1>/dev/null 2>/dev/null + fi + else + #Get Fan Speed Control + ctrl_mode_val=$(echo $fan_val | awk '{printf $1}') + fan_pwm_val=$(echo $fan_val | awk '{printf $2}') + byte_hex_test $ctrl_mode_val + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $fan_pwm_val + if [ $? -eq 0 ]; then + return + fi + ctrl_mode_val=$( printf "%d" 0x$ctrl_mode_val ) + fan_pwm_val=$( printf "%d" 0x$fan_pwm_val ) + echo $fan_pwm_val > /sys/bus/i2c/devices/0-0044/pwm + fi + fi +} + +bmc_fan_presence() +{ + if [ -e /sys/bus/i2c/devices/0-0044/fan1_present ];then + for i in $(seq 0 6); + do + p=$((31+i)) + fan_pre_val=$(echo $fan_val | awk '{print $'"$p"'}') + byte_hex_test $fan_pre_val + if [ $? -eq 0 ]; then + return + fi + fan_pre_val=$( printf "%d" 0x$fan_pre_val ) + echo $fan_pre_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_present + done + fi +} + +bmc_fan_speed_rpm() +{ + if [ -e /sys/bus/i2c/devices/0-0044/fan1_input ];then + for i in $(seq 0 6); + do + p1=$((3+i*2)) + p2=$((4+i*2)) + p3=$((17+i*2)) + p4=$((18+i*2)) + + #front + hi_byte=$(echo $fan_val | awk '{print $'"$p1"'}') + lo_byte=$(echo $fan_val | awk '{print $'"$p2"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return + fi + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_input + + #rear + hi_byte=$(echo $fan_val | awk '{print $'"$p3"'}') + lo_byte=$(echo $fan_val | awk '{print $'"$p4"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return + fi + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+8))_input + done + fi +} + +do_fan_update() +{ + #fan presence + bmc_fan_presence + + #fan speed rpm + bmc_fan_speed_rpm + + if [ $debug_flag -eq 0 ];then + #Get Fan RPM + bmc_fan_speed_ctrl 0 + else + bmc_fan_speed_ctrl 1 1 + fi +} + +do_thermal_update() +{ + if [ -e /sys/bus/i2c/devices/0-004f/temp1_input ];then + + local check_val=0 + #command return check + for i in $(seq 8 7 57); do + thermal_val=$(echo $temp_val | awk '{print $'"$i"'}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + check_val=$((check_val + thermal_val)) + if [ $check_val -gt 0 ]; then + break + fi + done + + if [ $check_val -eq 0 ]; then + return + fi + + #mcp3425 + thermal_val=$(echo $temp_val | awk '{printf $8}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $15}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $22}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $29}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $36}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $43}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $50}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $57}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + # fan tmp75 should be 0x49, but conflict + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_input + fi +} + +do_thermal_threshold_init() +{ + if [ $init_threshold -eq 0 ]; then + if [ -e /sys/bus/i2c/devices/0-004f/temp1_max ];then + #mcp3425 + thermal_val=$(echo $temp_val | awk '{printf $13}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $14}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $20}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $21}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $27}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $28}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $34}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $35}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $41}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $42}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $48}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $49}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $55}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $56}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $62}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $63}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_crit + + init_threshold=1 + fi + fi +} + +FAN_Thermal_monitor() +{ + if [ $debug_flag -eq 1 ];then + fan_pwm_input=100 + echo $fan_pwm_input > /sys/bus/i2c/devices/0-0044/pwm + fi + + while true + do + #get bmc sensor value + bmc_sensor_read + if [ $? -eq 0 ];then + do_fan_update + do_thermal_update + do_thermal_threshold_init + fi + + sleep 1 + done +} + +FAN_Thermal_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor new file mode 100644 index 000000000000..c72d8e0498e7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor @@ -0,0 +1,70 @@ +#!/bin/bash + +pre_loc_state=0 +loc=256 +sys=256 +fan=256 +psu=256 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +bmc_led_read() +{ + led_state=0 + val=$(ipmitool raw 0x30 0x25 0x00 0x60 0x1 0x81 2>>/dev/null) + res=$? + val=$(echo $val | awk '{printf $1}') + byte_hex_test $val + if [ $? -eq 0 ]; then + return 0 + fi + val=$( printf "%d" 0x$val ) + loc=$(($val & 0x3)) + sys=$((($val & 0xc) >> 2)) + fan=$((($val & 0x30) >> 4)) + psu=$((($val & 0xc0) >> 6)) + + return 1 +} + +bmc_led_write() +{ + ipmitool raw 0x30 0x42 $1 1>>/dev/null 2>>/dev/null +} + +LED_monitor() +{ + local loc_state=0 + + while true + do + if [ -e /sys/bus/i2c/devices/0-0030/sys_led ];then + loc_state=$(cat /sys/bus/i2c/devices/0-0030/loc_led | awk '{printf $1}') + if [ $loc_state -gt 1 ]; then + loc_state=1 + fi + if [ $loc_state != $pre_loc_state ]; then + bmc_led_write $loc_state + pre_loc_state=$loc_state + fi + + bmc_led_read + if [ $? -eq 1 ];then + echo $sys > /sys/bus/i2c/devices/0-0030/sys_led + echo $fan > /sys/bus/i2c/devices/0-0030/fan_led + echo $psu > /sys/bus/i2c/devices/0-0030/psu_led + fi + fi + + sleep 2 + done +} + +LED_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor new file mode 100644 index 000000000000..180456f6a8aa --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor @@ -0,0 +1,248 @@ +#!/bin/bash + +debug_flag=0 +val=0 +value=0 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +byte_read(){ + data=$(echo $val | awk '{print $'"$1"'}') + byte_hex_test $data + if [ $? -eq 0 ]; then + return 0 + fi + data=$(printf "%d" 0x$data) + value=$data + return 1 + +} +add_byte(){ + hi_byte=$(echo $val | awk '{print $'"$1"'}') + lo_byte=$(echo $val | awk '{print $'"$2"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return 0 + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return 0 + fi + hi_byte=$(printf "%d" 0x$hi_byte) + lo_byte=$(printf "%d" 0x$lo_byte) + ((hi_byte <<= 8)) + value=$((($lo_byte+$hi_byte))) + return 1 +} +# string_read [start byte] [length] +string_read(){ + value="" + len=$(echo $val | awk '{print $'"$1"'}') + byte_hex_test $len + if [ $? -eq 0 ]; then + return 0 + fi + len=$(printf "%d" 0x$len) + s=$(($1 + 1)) + e=$(($1 + len - 1)) + for i in $(seq $s $e) + do + data=$(echo $val | awk '{print $'"$i"'}') + byte_hex_test $data + if [ $? -eq 0 ]; then + return 0 + fi + data=$(printf "%d" 0x$data) + if [ $data -ne 0 ];then + value=$value$(printf "$(printf '\\x%x' $data)") + else + data=0x20 + value=$value$(printf "$(printf '\\x%x' $data)") + fi + done + return 1 +} +#$1=dev_addr, $2=reg, $3=val +get_PSU_information() +{ + val=$(ipmitool raw 0x30 0x89 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-005a/vendor ] && [ -e /sys/bus/i2c/devices/0-0059/vendor ];then + #PSU1 Vin + add_byte 1 2 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/in1_input + fi + #PSU2 Vin + add_byte 3 4 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/in1_input + fi + #PSU 1 Vout + add_byte 5 6 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/in2_input + fi + #PSU 2 Vout + add_byte 7 8 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/in2_input + fi + #PSU 1 Iin + add_byte 9 10 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/curr1_input + fi + #PSU 2 Iin + add_byte 11 12 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/curr1_input + fi + #PSU 1 Iout + add_byte 13 14 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/curr2_input + fi + #PSU 2 Iout + add_byte 15 16 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/curr2_input + fi + #PSU 1 Pin + add_byte 17 18 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-005a/power1_input + fi + #PSU 2 Pin + add_byte 19 20 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-0059/power1_input + fi + #PSU 1 Pout + add_byte 21 22 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-005a/power2_input + fi + #PSU 2 Pout + add_byte 23 24 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-0059/power2_input + fi + #PSU 1 Temp1 + byte_read 25 + if [ $? -eq 1 ];then + value=$(($value * 1000)) + echo $value > /sys/bus/i2c/devices/0-005a/temp1_input + fi + #PSU 2 Temp1 + byte_read 26 + if [ $? -eq 1 ];then + value=$(($value * 1000)) + echo $value > /sys/bus/i2c/devices/0-0059/temp1_input + fi + + byte_read 31 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/present + fi + + byte_read 32 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/present + fi + + #PSU 1 2 PSU power good + byte_read 33 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/power_good + fi + + byte_read 34 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/power_good + fi + + add_byte 35 36 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/fault + fi + + add_byte 37 38 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/fault + fi + fi + + #____________________________________________________________________________ + + val=$(ipmitool raw 0x30 0x8a 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-005a/vendor ] && [ -e /sys/bus/i2c/devices/0-0059/vendor ];then + #PSU1 mfr_ID + string_read 1 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/vendor + fi + #PSU2 mfr_ID + string_read 21 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/vendor + fi + #PSU1 mfr_model + string_read 41 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/model + fi + #PSU2 mfr_model + string_read 61 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/model + fi + #PSU1 mfr_serial + string_read 81 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/sn + fi + #PSU1 mfr_serial + string_read 111 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/sn + fi + fi +} + +#$1=dev_addr, $2=reg, $3=len + +PSU_monitor() +{ + + while true + do + + get_PSU_information + if [ $debug_flag -eq 1 ];then + bmc_fan_speed_ctrl + fi + + sleep 1 + done +} + +PSU_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor new file mode 100644 index 000000000000..645b8528851f --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor @@ -0,0 +1,479 @@ +#!/bin/bash + +debug_flag=0 +port_map=('00' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '1a' '1b' '1c' '1d' '1e' '1f' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29' '2a' '2b' '2c' '2d' '2e' '2f') +port_1_8_presence=0 +port_9_16_presence=0 +port_17_24_presence=0 +port_25_32_presence=0 +port_1_8_reset=0 +port_9_16_reset=0 +port_17_24_reset=0 +port_25_32_reset=0 + +result=0 +pre_port_1_8_reset=256 +pre_port_9_16_reset=256 +pre_port_17_24_reset=256 +pre_port_25_32_reset=256 +pre_port_1_8_lpmode=256 +pre_port_9_16_lpmode=256 +pre_port_17_24_lpmode=256 +pre_port_25_32_lpmode=256 +pre_port_1_8_modsel=256 +pre_port_9_16_modsel=256 +pre_port_17_24_modsel=256 +pre_port_25_32_modsel=256 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=val +bmc_write() +{ + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x85 $1 $2 $addr_8b 2 $4 $5 1>>/dev/null 2>>/dev/null + sleep 1 + ipmitool raw 0x30 0x87 1>>/dev/null 2>>/dev/null +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=len +bmc_read() +{ + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x86 $1 $2 $addr_8b $5 $4 1>>/dev/null 2>>/dev/null + sleep 1 + val=$(ipmitool raw 0x30 0x87 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + return 1 + else + return 0 + fi +} + +bmc_qsfp_lpmode_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 1)))) + done + if [ $val -ne $pre_port_1_8_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x50 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_lpmode=$val + fi + val=0 + for i in $(seq 9 16); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 9)))) + done + + if [ $val -ne $pre_port_9_16_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x51 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_lpmode=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 17)))) + done + + if [ $val -ne $pre_port_17_24_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x50 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_lpmode=$val + fi + val=0 + for i in $(seq 25 32); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 25)))) + done + + if [ $val -ne $pre_port_25_32_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x51 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_lpmode=$val + fi + + + return 0 +} + +bmc_qsfp_modsel_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 1)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_1_8_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x60 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_modsel=$val + fi + val=0 + for i in $(seq 9 16); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 9)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_9_16_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x61 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_modsel=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 17)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_17_24_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x60 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_modsel=$val + fi + val=0 + for i in $(seq 25 32); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 25)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_25_32_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x61 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_modsel=$val + fi + + + return 0 +} + +bmc_qsfp_presence_read() +{ + a=0 + tmp1=$(ipmitool raw 0x30 0x25 0x00 0x0c 0x1 0x30 2>>/dev/null) + a=$((a+$?)) + tmp1=$(echo $tmp1 | awk '{printf $1}') + sleep 0.05 + tmp2=$(ipmitool raw 0x30 0x25 0x00 0x0c 0x1 0x31 2>>/dev/null) + a=$((a+$?)) + tmp2=$(echo $tmp2 | awk '{printf $1}') + sleep 0.05 + tmp3=$(ipmitool raw 0x30 0x25 0x00 0x0e 0x1 0x30 2>>/dev/null) + a=$((a+$?)) + tmp3=$(echo $tmp3 | awk '{printf $1}') + sleep 0.05 + tmp4=$(ipmitool raw 0x30 0x25 0x00 0x0e 0x1 0x31 2>>/dev/null) + a=$((a+$?)) + tmp4=$(echo $tmp4 | awk '{printf $1}') + sleep 0.05 + if [ $a -eq 0 ];then + byte_hex_test $tmp1 + if [ $? -eq 0 ]; then + return 0 + fi + port_1_8_presence=$( printf "%d" 0x$tmp1 ) + byte_hex_test $tmp2 + if [ $? -eq 0 ]; then + return 0 + fi + port_9_16_presence=$( printf "%d" 0x$tmp2 ) + byte_hex_test $tmp3 + if [ $? -eq 0 ]; then + return 0 + fi + port_17_24_presence=$( printf "%d" 0x$tmp3 ) + byte_hex_test $tmp4 + if [ $? -eq 0 ]; then + return 0 + fi + port_25_32_presence=$( printf "%d" 0x$tmp4 ) + return 1 + fi + + return 0 +} + +bmc_qsfp_reset_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 1)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_1_8_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x20 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_reset=$val + fi + val=0 + for i in $(seq 9 16); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 9)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_9_16_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x21 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_reset=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 17)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_17_24_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x20 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_reset=$val + fi + val=0 + for i in $(seq 25 32); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 25)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_25_32_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x21 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_reset=$val + fi + + + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_read() +{ + local port=$1 + local eeprom_part1 + local eeprom_part2 + local eeprom_part3 + local eeprom_part4 + local eeprom1_full + local eeprom2_full + + port=`expr $port - 1` + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + 2` + ch=`expr $port % 8` + + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x00 + bmc_read $i2cmux_dev $ch 0x50 0 128 + if [ $? -eq 1 ];then + eeprom_part1=$result + else + return 1 + fi + + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part2=$result + else + return 1 + fi + + #QSFP-DD page2 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x02 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part3=$result + else + return 1 + fi + + #QSFP-DD page11 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x11 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part4=$result + else + return 1 + fi + + sfp_type=$(echo $eeprom_part1 | awk '{printf $1}') + byte_hex_test $sfp_type + if [ $? -eq 0 ]; then + return + fi + sfp_type=$( printf "%d" 0x$sfp_type ) + + #get temperature + temp=$(echo $eeprom_part1 | awk '{printf $15}') + if [ $temp != "" ];then + temp=$( printf "%d" 0x$temp ) + temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp" + echo $temp > $temp_path + fi + + #get lp_mode + lpmod_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/lp_mode" + if [ $sfp_type -eq 24 ];then + lpmod=$(echo $eeprom_part1 | awk '{printf $27}') + if [ $lpmod != "" ];then + state=$((lpmod&0x10)) + if [ $state -eq 16 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + elif [ $sfp_type -eq 17 ];then + lpmod=$(echo $eeprom_part1 | awk '{printf $93}') + if [ $lpmod != "" ];then + state=$((lpmod&0x02)) + if [ $state -eq 2 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + else + lpmod="" + fi + + eeprom1_full=$eeprom_part1$eeprom_part2 + eeprom1_full=$(echo $eeprom1_full | sed 's/[[:space:]]//g') + eeprom2_full=$eeprom_part3$eeprom_part4 + eeprom2_full=$(echo $eeprom2_full | sed 's/[[:space:]]//g') + + if [ $debug_flag -eq 0 ];then + eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1" + eeprom1_full=$(echo $eeprom1_full | sed -e 's/ //g') + echo $eeprom1_full > $eeprom1_path + eeprom2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom2" + eeprom2_full=$(echo $eeprom2_full | sed -e 's/ //g') + echo $eeprom2_full > $eeprom2_path + else + printf "\nPort %d EEPROM:" $1 + printf "-----------------------------------------------\n" + for i in $(seq 1 256); + do + printf "%s " ${eeprom1_full:0:2} + eeprom1_full=$(echo $eeprom1_full | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + fi + + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_clear() +{ + eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1" + echo "" > $eeprom1_path + eeprom2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom2" + echo "" > $eeprom2_path +} + +QSFP_monitor() +{ + while true + do + if [ -e /sys/bus/i2c/devices/0-0006/port1_present ] && [ -e /sys/bus/i2c/devices/0-0007/port32_present ] && [ -e /sys/bus/i2c/devices/0-002f/eeprom1 ];then + bmc_qsfp_presence_read + mod_presence=$((port_25_32_presence<<8)) + mod_presence=`expr $mod_presence + $port_17_24_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_9_16_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_1_8_presence` + + bmc_qsfp_lpmode_write + bmc_qsfp_modsel_write + bmc_qsfp_reset_write + + for i in $(seq 1 32); + do + idx=`expr $i - 1` + check_bit=$((1<<$idx)) + is_presence=$(($mod_presence & $check_bit)) + if [ $i -le 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0006/" + else + cpld_path="/sys/bus/i2c/devices/0-0007/" + fi + + if [ $is_presence -eq 0 ];then + echo 1 > $cpld_path"port"$i"_present" + bmc_qsfp_eeprom_read $i + else + echo 0 > $cpld_path"port"$i"_present" + bmc_qsfp_eeprom_clear $i + fi + done + sleep 2 + else + sleep 1 + fi + done +} + +QSFP_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py new file mode 100644 index 000000000000..030942825df0 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py @@ -0,0 +1,482 @@ +#!/usr/bin/env python + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes + show : show all systen status + sff : dump SFP eeprom +""" + +import sys, getopt +import subprocess +import logging +import re +import time + +PROJECT_NAME = '6512-32r' +version = '0.0.1' +verbose = False +DEBUG = False +args = [] +ALL_DEVICE = {} +DEVICE_NO = {'led':4, 'fan':7, 'thermal':8, 'psu':2, 'qsfp':32} + +led_prefix ='/sys/devices/platform/wistron_led/leds/wistron_led::' +hwmon_types = {'led': ['sys_led','fan_led','loc_led','psu_led']} +hwmon_nodes = {'led': ['brightness']} +hwmon_prefix ={'led': led_prefix} + +i2c_prefix = '/sys/bus/i2c/devices/' + +i2c_bus = {'fan': ['0-0044'], + 'thermal': ['0-0068', '0-0049','0-004a','0-004b','0-004c','0-004d','0-0048','0-004f'], + 'psu': ['0-005a','0-0059'], + 'qsfp': ['0-0010']} + +i2c_nodes = {'fan': ['front_speed_rpm', 'rear_speed_rpm'], + 'thermal': ['temp1_input'], + 'psu': ['present', 'power_good'], + 'qsfp': ['module_present_']} + +sfp_map = ['10', '11', '12', '13', '14', '15', '16', '17', + '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', + '20', '21', '22', '23', '24', '25', '26', '27', + '28', '29', '2a', '2b', '2c', '2d', '2e', '2f'] + +mknod =[ +'echo wistron_fpga 0x30 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_cpld1 0x6 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_cpld2 0x7 > /sys/bus/i2c/devices/i2c-0/new_device', +# FAN +'echo wistron_fan 0x44 > /sys/bus/i2c/devices/i2c-0/new_device', +# Thermal +'echo wistron_thermal 0x68 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x49 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4b > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4c > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4d > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x48 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4f > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU +'echo wistron_psu1 0x5a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_psu2 0x59 > /sys/bus/i2c/devices/i2c-0/new_device', +# EEPROM +'echo wistron_syseeprom 0x55 > /sys/bus/i2c/devices/i2c-0/new_device', +] + +FORCE = 0 +logging.basicConfig(filename= PROJECT_NAME+'.log', filemode='w',level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) + +if DEBUG == True: + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) + +def main(): + global DEBUG + global args + global FORCE + + logging.basicConfig(level=logging.INFO) + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print(options) + print(args) + print(len(sys.argv)) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + do_install() + elif arg == 'clean': + do_uninstall() + elif arg == 'show': + device_traversal() + elif arg == 'sff': + if len(args)!=2: + show_eeprom_help() + elif int(args[1]) > DEVICE_NO['qsfp'] -1: + show_eeprom_help() + else: + show_eeprom(args[1]) + return + else: + show_help() + + + return 0 + +def show_help(): + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) + sys.exit(0) + +def show_eeprom_help(): + cmd = sys.argv[0].split("/")[-1]+ " " + args[0] + print(" use \""+ cmd + " 1-32 \" to dump sfp# eeprom") + sys.exit(0) + +def my_log(txt): + if DEBUG == True: + print("[WISTRON DBG]: "+txt) + return + +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + output = "" + status, output = subprocess.getstatusoutput(cmd) + my_log (cmd +"with result:" + str(status)) + my_log ("cmd:" + cmd) + my_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +def driver_inserted(): + ret, lsmod = log_os_system("lsmod | grep wistron", 0) + if ret != 0: + return False + logging.info('mods:'+lsmod) + if len(lsmod) ==0: + return False + + +kos = [ +'modprobe ipmi_msghandler', +'modprobe ipmi_si', +'modprobe ipmi_devintf', +'modprobe ipmi_watchdog', +'modprobe i2c_dev', +'modprobe at24', +'modprobe wistron_6512_32r_syseeprom', +'modprobe wistron_6512_32r_cpld', +'modprobe wistron_6512_32r_fan', +'modprobe wistron_6512_32r_leds', +'modprobe wistron_6512_32r_psu', +'modprobe wistron_6512_32r_oom', +'modprobe wistron_6512_32r_thermal'] + +kos_wdt = [ +'modprobe iTCO_wdt', + ] + +def driver_install(): + global FORCE + log_os_system("depmod", 1) + + for i in range(0,len(kos_wdt)): + rm = kos_wdt[i].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + + for i in range(0,len(kos)): + status, output = log_os_system(kos[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + return 0 + +def driver_uninstall(): + global FORCE + for i in range(0,len(kos)): + rm = kos[-(i+1)].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + + for i in range(0,len(kos_wdt)): + status, output = log_os_system(kos_wdt[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + + return 0 + +def device_install(): + global FORCE + for i in range(0,len(mknod)): + print("init i2c device instance") + status, output = log_os_system(mknod[i], 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output = log_os_system("echo wistron_oom 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/new_device", 1) + if status: + print(output) + if FORCE == 0: + return status + +# for i in range(0,len(sfp_map)): +# status, output =log_os_system("echo port"+str(i+1)+" > /sys/bus/i2c/devices/0-00"+sfp_map[i]+"/port_name", 1) +# if status: +# print output +# if FORCE == 0: +# return status + + for i in range(0,DEVICE_NO['qsfp']): + if i < 16: + status, output =log_os_system("echo 1 > /sys/bus/i2c/devices/0-0006/port"+ str(i+1) + "_modsel", 1) + if status: + print(output) + if FORCE == 0: + return status + else: + status, output =log_os_system("echo 1 > /sys/bus/i2c/devices/0-0007/port"+ str(i+1) + "_modsel", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def device_uninstall(): + global FORCE + + for i in range(0,len(sfp_map)): + target = "echo 0x"+sfp_map[i]+ " > /sys/bus/i2c/devices/i2c-0/delete_device" + print(target) + status, output =log_os_system(target, 1) + if status: + print(output) + if FORCE == 0: + return status + + nodelist = mknod + + for i in range(len(nodelist)): + target = nodelist[-(i+1)] + temp = target.split() + del temp[1] + temp[-1] = temp[-1].replace('new_device', 'delete_device') + status, output = log_os_system(" ".join(temp), 1) + if status: + print(output) + if FORCE == 0: + return status + + return + +def system_ready(): + if driver_inserted() == False: + return False + if not device_exist(): + print("not device_exist()") + return False + return True + +def do_install(): + if driver_inserted() == False: + status = driver_install() + time.sleep(1) + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" drivers detected....") + + if not device_exist(): + status = device_install() + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" devices detected....") + + status, output = log_os_system( + "/bin/sh /usr/local/bin/platform_api_mgnt.sh init", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def do_uninstall(): + if not device_exist(): + print(PROJECT_NAME.upper() +" has no device installed....") + else: + print("Removing device....") + status = device_uninstall() + if status: + if FORCE == 0: + return status + + if driver_inserted()== False : + print(PROJECT_NAME.upper() +" has no driver installed....") + else: + print("Removing installed driver....") + status = driver_uninstall() + if status: + if FORCE == 0: + return status + + return + +def devices_info(): + global DEVICE_NO + global ALL_DEVICE + global i2c_bus, hwmon_types + for key in DEVICE_NO: + ALL_DEVICE[key]= {} + for i in range(0,DEVICE_NO[key]): + ALL_DEVICE[key][key+str(i+1)] = [] + + for key in i2c_bus: + buses = i2c_bus[key] + nodes = i2c_nodes[key] + for i in range(0,len(buses)): + for j in range(0,len(nodes)): + if 'fan' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + path = i2c_prefix+ buses[i]+"/fan"+str(k+1) if j == 0 else str(k+8) +"_input" + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + elif 'qsfp' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + if k < 16: + path = i2c_prefix+"0-0006/"+ "port"+ str(k+1) + "_present" + else: + path = i2c_prefix+"0-0007/"+ "port"+ str(k+1) + "_present" + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + else: + node = key+str(i+1) + path = i2c_prefix+ buses[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + + for key in hwmon_types: + itypes = hwmon_types[key] + nodes = hwmon_nodes[key] + for i in range(0,len(itypes)): + for j in range(0,len(nodes)): + node = key+"_"+itypes[i] + path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][ key+str(i+1)].append(path) + + #show dict all in the order + if DEBUG == True: + for i in sorted(ALL_DEVICE.keys()): + print(i+": ") + for j in sorted(ALL_DEVICE[i].keys()): + print(" "+j) + for k in (ALL_DEVICE[i][j]): + print(" "+" "+k) + return + +def show_eeprom(index): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + node= "/sys/bus/i2c/devices/0-00"+sfp_map[int(index)-1]+"/eeprom1" + # check if got hexdump command in current environment + ret, log = log_os_system("which hexdump", 0) + ret, log2 = log_os_system("which busybox hexdump", 0) + if len(log): + hex_cmd = 'hexdump' + elif len(log2): + hex_cmd = ' busybox hexdump' + else: + log = 'Failed : no hexdump cmd!!' + logging.info(log) + print(log) + return 1 + + print("node=%s"%node) + ret, log = log_os_system(hex_cmd+" -C " + node, 1) + if ret==0: + print(log) + else: + print("**********device no found**********") + return + +#get digits inside a string. +#Ex: 31 for "sfp31" +def get_value(input): + digit = re.findall('\d+', input) + return int(digit[0]) + +def device_traversal(): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + if len(ALL_DEVICE)==0: + devices_info() + for i in sorted(ALL_DEVICE.keys()): + print("============================================") + print(i.upper()+": ") + print("============================================") + + for j in sorted(ALL_DEVICE[i].keys(), key=get_value): + print(" "+j+":",) + for k in (ALL_DEVICE[i][j]): + ret, log = log_os_system("cat "+k, 0) + func = k.split("/")[-1].strip() + func = re.sub(j+'_','',func,1) + func = re.sub(i.lower()+'_','',func,1) + if ret==0: + print(func+"="+log+" ",) + else: + print(func+"="+"X"+" ",) + print() + print("----------------------------------------------------------------") + + + print() + return + +def device_exist(): + ret1, log = log_os_system("ls "+i2c_prefix+"*0030", 0) + ret2, log = log_os_system("ls "+i2c_prefix+"i2c-0", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() diff --git a/platform/innovium/sonic-platform-modules-wistron/LICENSE b/platform/innovium/sonic-platform-modules-wistron/LICENSE new file mode 100644 index 000000000000..c14238424af3 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2016 Microsoft, Inc +Copyright (C) 2019 Wistron Corporation + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf new file mode 100644 index 000000000000..9c1102dfadbe --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf @@ -0,0 +1,18 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +ipmi_msghandler +ipmi_si +ipmi_devintf +i2c_dev +at24 +wistron_i2c_psu +wistron_sw_to3200k_cpld +wistron_sw_to3200k_fan +wistron_sw_to3200k_leds +wistron_sw_to3200k_psu +wistron_sw_to3200k_oom +wistron_sw_to3200k_thermal + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile new file mode 100644 index 000000000000..1856dc169102 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile @@ -0,0 +1,20 @@ +ifneq ($(KERNELRELEASE),) +obj-m:= wistron_sw_to3200k_cpld.o wistron_sw_to3200k_fan.o \ + wistron_sw_to3200k_oom.o wistron_sw_to3200k_psu.o \ + wistron_sw_to3200k_thermal.o wistron_i2c_psu.o \ + wistron_sw_to3200k_leds.o +else +ifeq (,$(KERNEL_SRC)) +#$(error KERNEL_SRC is not defined) +KVERSION=3.16.0-8-amd64 +KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ +KERNELDIR:=$(KERNEL_DIR) +else +KERNELDIR:=$(KERNEL_SRC) +endif +PWD:=$(shell pwd) +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules +clean: + rm -rf *.o *.mod.o *.mod.o *.ko .*cmd *.mod.c *.mod .tmp_versions Module.markers Module.symvers modules.order +endif diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c new file mode 100644 index 000000000000..746e581486cb --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c @@ -0,0 +1,469 @@ +/* + * An hwmon driver for the Wistron Redundant Power Module + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESCRIPTION_NAME "wistron i2c psu driver" +#define MAX_FAN_DUTY_CYCLE 100 + +/* Addresses scanned + */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data + */ +struct wistron_i2c_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int v_in; + int v_out; + int i_in; + int i_out; + int p_in; + int p_out; + int temp_input; + int fan_fault; + int fan_duty_cycle; + int fan_speed; + int pmbus_revision; + u8 mfr_id[16]; + u8 mfr_model[16]; + u8 mfr_revsion[4]; + u8 mfr_serial[32]; +}; + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum wistron_i2c_psu_sysfs_attributes { + PSU_V_IN, + PSU_V_OUT, + PSU_I_IN, + PSU_I_OUT, + PSU_P_IN, + PSU_P_OUT, + PSU_PMBUS_REVISION, + PSU_TEMP1_INPUT, + PSU_FAN1_FAULT, + PSU_FAN1_DUTY_CYCLE, + PSU_FAN1_SPEED, + PSU_MFR_ID, + PSU_MFR_MODEL, + PSU_MFR_REVISION, + PSU_MFR_SERIAL, +}; + +/* sysfs attributes for hwmon + */ +static SENSOR_DEVICE_ATTR(psu_v_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_IN); +static SENSOR_DEVICE_ATTR(psu_v_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(psu_i_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_IN); +static SENSOR_DEVICE_ATTR(psu_i_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(psu_p_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_IN); +static SENSOR_DEVICE_ATTR(psu_p_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(psu_pmbus_revision, S_IWUSR | S_IRUGO, get_value, set_value, PSU_PMBUS_REVISION); +static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_FAULT); +static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_DUTY_CYCLE); +static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_SPEED); +static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_ID); +static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu_mfr_serial, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_SERIAL); + +/*Duplicate nodes for lm-sensors.*/ +static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, get_value, NULL, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, get_value, NULL, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO, get_value, NULL, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, get_value, NULL, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_value, NULL, PSU_FAN1_SPEED); + +static struct attribute *wistron_i2c_psu_attributes[] = { + &sensor_dev_attr_psu_v_in.dev_attr.attr, + &sensor_dev_attr_psu_v_out.dev_attr.attr, + &sensor_dev_attr_psu_i_in.dev_attr.attr, + &sensor_dev_attr_psu_i_out.dev_attr.attr, + &sensor_dev_attr_psu_p_in.dev_attr.attr, + &sensor_dev_attr_psu_p_out.dev_attr.attr, + &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, + &sensor_dev_attr_psu_temp1_input.dev_attr.attr, + &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, + &sensor_dev_attr_psu_fan1_duty_cycle.dev_attr.attr, + &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, + &sensor_dev_attr_psu_mfr_id.dev_attr.attr, + &sensor_dev_attr_psu_mfr_model.dev_attr.attr, + &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, + &sensor_dev_attr_psu_mfr_serial.dev_attr.attr, + /*Duplicate nodes for lm-sensors.*/ + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_in3_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fan1_input.dev_attr.attr, + NULL +}; + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + size_t ret_count=0; + + mutex_lock(&data->lock); + switch (attr->index) + { + case PSU_V_IN: + { + ret_count = sprintf(buf, "%d", data->v_in); + break; + } + case PSU_V_OUT: + { + ret_count = sprintf(buf, "%d", data->v_out); + break; + } + case PSU_I_IN: + { + ret_count = sprintf(buf, "%d", data->i_in); + break; + } + case PSU_I_OUT: + { + ret_count = sprintf(buf, "%d", data->i_out); + break; + } + case PSU_P_IN: + { + ret_count = sprintf(buf, "%d", data->p_in); + break; + } + case PSU_P_OUT: + { + ret_count = sprintf(buf, "%d", data->p_out); + break; + } + case PSU_PMBUS_REVISION: + { + ret_count = sprintf(buf, "%d", data->pmbus_revision); + break; + } + case PSU_TEMP1_INPUT: + { + ret_count = sprintf(buf, "%d", data->temp_input); + break; + } + case PSU_FAN1_FAULT: + { + ret_count = sprintf(buf, "%d", data->fan_fault); + break; + } + case PSU_FAN1_DUTY_CYCLE: + { + ret_count = sprintf(buf, "%d", data->fan_duty_cycle); + break; + } + case PSU_FAN1_SPEED: + { + ret_count = sprintf(buf, "%d", data->fan_speed); + break; + } + case PSU_MFR_ID: + { + ret_count = sprintf(buf, "%s", data->mfr_id); + break; + } + case PSU_MFR_MODEL: + { + ret_count = sprintf(buf, "%s", data->mfr_model); + break; + } + case PSU_MFR_REVISION: + { + ret_count = sprintf(buf, "%s", data->mfr_revsion); + break; + } + case PSU_MFR_SERIAL: + { + ret_count = sprintf(buf, "%s", data->mfr_serial); + break; + } + default: + break; + } + mutex_unlock(&data->lock); + return ret_count; +} + +static ssize_t set_value +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + int error, value; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + { + error = kstrtoint(buf, 10, &data->v_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_V_OUT: + { + error = kstrtoint(buf, 10, &data->v_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_I_IN: + { + error = kstrtoint(buf, 10, &data->i_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_I_OUT: + { + error = kstrtoint(buf, 10, &data->i_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_P_IN: + { + error = kstrtoint(buf, 10, &data->p_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_P_OUT: + { + error = kstrtoint(buf, 10, &data->p_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_PMBUS_REVISION: + { + error = kstrtoint(buf, 10, &data->pmbus_revision); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_TEMP1_INPUT: + { + error = kstrtoint(buf, 10, &data->temp_input); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_FAN1_FAULT: + { + error = kstrtoint(buf, 10, &data->fan_fault); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_FAN1_DUTY_CYCLE: + { + error = kstrtoint(buf, 10, &value); + if (error) + { + goto exit_err; + } + + if (value < 0 || value > MAX_FAN_DUTY_CYCLE) + { + error = -EINVAL; + goto exit_err; + } + + data->fan_duty_cycle = value; + break; + } + case PSU_FAN1_SPEED: + { + error = kstrtoint(buf, 10, &data->fan_speed); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_MFR_ID: + { + memset(&data->mfr_id, 0x0, sizeof(data->mfr_id)); + strncpy(data->mfr_id, buf, sizeof(data->mfr_id)-1); + break; + } + case PSU_MFR_MODEL: + { + memset(&data->mfr_model, 0x0, sizeof(data->mfr_model)); + strncpy(data->mfr_model, buf, sizeof(data->mfr_model)-1); + break; + } + case PSU_MFR_REVISION: + { + memset(&data->mfr_revsion, 0x0, sizeof(data->mfr_revsion)); + strncpy(data->mfr_revsion, buf, sizeof(data->mfr_revsion)-1); + break; + } + case PSU_MFR_SERIAL: + { + memset(&data->mfr_serial, 0x0, sizeof(data->mfr_serial)); + strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial)-1); + break; + } + default: + break; + } + + mutex_unlock(&data->lock); + return count; + +exit_err: + mutex_unlock(&data->lock); + return error; +} + +static const struct attribute_group wistron_i2c_psu_group = { + .attrs = wistron_i2c_psu_attributes, +}; + +static int wistron_i2c_psu_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_i2c_psu_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_i2c_psu_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_i2c_psu_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_i2c_psu_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int wistron_i2c_psu_remove(struct i2c_client *client) +{ + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_i2c_psu_group); + kfree(data); + return 0; +} + +/* Support psu moduel + */ +static const struct i2c_device_id wistron_i2c_psu_id[] = { + { "acbel_fshxxx", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_i2c_psu_id); + +static struct i2c_driver wistron_i2c_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_i2c_psu", + }, + .probe = wistron_i2c_psu_probe, + .remove = wistron_i2c_psu_remove, + .id_table = wistron_i2c_psu_id, + .address_list = normal_i2c, +}; + +static int __init wistron_i2c_psu_init(void) +{ + return i2c_add_driver(&wistron_i2c_psu_driver); +} + +static void __exit wistron_i2c_psu_exit(void) +{ + i2c_del_driver(&wistron_i2c_psu_driver); +} + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION(DRIVER_DESCRIPTION_NAME); +MODULE_LICENSE("GPL"); + +module_init(wistron_i2c_psu_init); +module_exit(wistron_i2c_psu_exit); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c new file mode 100644 index 000000000000..52f659eae240 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c @@ -0,0 +1,701 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT_NUM 32 +#define SYSLED_NUM 5 +#define SW_TO3200K_FPGA_ADDR 0x60 + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +enum cpld_type { + sw_to3200k_fpga, + sw_to3200k_cpld1, + sw_to3200k_cpld2 +}; + +struct sw_to3200k_cpld_data { + enum cpld_type type; + struct device *hwmon_dev; + struct mutex lock; + int version; + int sysled_status[SYSLED_NUM]; + int present[PORT_NUM]; + int reset[PORT_NUM]; +}; + +static const struct i2c_device_id sw_to3200k_cpld_id[] = { + { "sw_to3200k_fpga", sw_to3200k_fpga }, + { "sw_to3200k_cpld1", sw_to3200k_cpld1 }, + { "sw_to3200k_cpld2", sw_to3200k_cpld2 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_cpld_id); + +#define TRANSCEIVER_PRESENT_ATTR_ID(index) MODULE_PRESENT_##index +#define TRANSCEIVER_RESET_ATTR_ID(index) MODULE_RESET_##index + +enum sw_to3200k_cpld_sysfs_attributes { + /* chip version */ + CPLD_VERSION, + /* system led */ + SYSTEM_LED_LOC, + SYSTEM_LED_DIAG, + SYSTEM_LED_FAN, + SYSTEM_LED_PSU1, + SYSTEM_LED_PSU2, + /* transceiver attributes */ + TRANSCEIVER_PRESENT_ATTR_ID(1), + TRANSCEIVER_PRESENT_ATTR_ID(2), + TRANSCEIVER_PRESENT_ATTR_ID(3), + TRANSCEIVER_PRESENT_ATTR_ID(4), + TRANSCEIVER_PRESENT_ATTR_ID(5), + TRANSCEIVER_PRESENT_ATTR_ID(6), + TRANSCEIVER_PRESENT_ATTR_ID(7), + TRANSCEIVER_PRESENT_ATTR_ID(8), + TRANSCEIVER_PRESENT_ATTR_ID(9), + TRANSCEIVER_PRESENT_ATTR_ID(10), + TRANSCEIVER_PRESENT_ATTR_ID(11), + TRANSCEIVER_PRESENT_ATTR_ID(12), + TRANSCEIVER_PRESENT_ATTR_ID(13), + TRANSCEIVER_PRESENT_ATTR_ID(14), + TRANSCEIVER_PRESENT_ATTR_ID(15), + TRANSCEIVER_PRESENT_ATTR_ID(16), + TRANSCEIVER_PRESENT_ATTR_ID(17), + TRANSCEIVER_PRESENT_ATTR_ID(18), + TRANSCEIVER_PRESENT_ATTR_ID(19), + TRANSCEIVER_PRESENT_ATTR_ID(20), + TRANSCEIVER_PRESENT_ATTR_ID(21), + TRANSCEIVER_PRESENT_ATTR_ID(22), + TRANSCEIVER_PRESENT_ATTR_ID(23), + TRANSCEIVER_PRESENT_ATTR_ID(24), + TRANSCEIVER_PRESENT_ATTR_ID(25), + TRANSCEIVER_PRESENT_ATTR_ID(26), + TRANSCEIVER_PRESENT_ATTR_ID(27), + TRANSCEIVER_PRESENT_ATTR_ID(28), + TRANSCEIVER_PRESENT_ATTR_ID(29), + TRANSCEIVER_PRESENT_ATTR_ID(30), + TRANSCEIVER_PRESENT_ATTR_ID(31), + TRANSCEIVER_PRESENT_ATTR_ID(32), + TRANSCEIVER_RESET_ATTR_ID(1), + TRANSCEIVER_RESET_ATTR_ID(2), + TRANSCEIVER_RESET_ATTR_ID(3), + TRANSCEIVER_RESET_ATTR_ID(4), + TRANSCEIVER_RESET_ATTR_ID(5), + TRANSCEIVER_RESET_ATTR_ID(6), + TRANSCEIVER_RESET_ATTR_ID(7), + TRANSCEIVER_RESET_ATTR_ID(8), + TRANSCEIVER_RESET_ATTR_ID(9), + TRANSCEIVER_RESET_ATTR_ID(10), + TRANSCEIVER_RESET_ATTR_ID(11), + TRANSCEIVER_RESET_ATTR_ID(12), + TRANSCEIVER_RESET_ATTR_ID(13), + TRANSCEIVER_RESET_ATTR_ID(14), + TRANSCEIVER_RESET_ATTR_ID(15), + TRANSCEIVER_RESET_ATTR_ID(16), + TRANSCEIVER_RESET_ATTR_ID(17), + TRANSCEIVER_RESET_ATTR_ID(18), + TRANSCEIVER_RESET_ATTR_ID(19), + TRANSCEIVER_RESET_ATTR_ID(20), + TRANSCEIVER_RESET_ATTR_ID(21), + TRANSCEIVER_RESET_ATTR_ID(22), + TRANSCEIVER_RESET_ATTR_ID(23), + TRANSCEIVER_RESET_ATTR_ID(24), + TRANSCEIVER_RESET_ATTR_ID(25), + TRANSCEIVER_RESET_ATTR_ID(26), + TRANSCEIVER_RESET_ATTR_ID(27), + TRANSCEIVER_RESET_ATTR_ID(28), + TRANSCEIVER_RESET_ATTR_ID(29), + TRANSCEIVER_RESET_ATTR_ID(30), + TRANSCEIVER_RESET_ATTR_ID(31), + TRANSCEIVER_RESET_ATTR_ID(32), +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* version */ +static SENSOR_DEVICE_ATTR(version, S_IWUSR | S_IRUGO, get_version, set_version, CPLD_VERSION); + +/* system led */ +static SENSOR_DEVICE_ATTR(sys_led_loc, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_LOC); +static SENSOR_DEVICE_ATTR(sys_led_diag, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_DIAG); +static SENSOR_DEVICE_ATTR(sys_led_fan, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_FAN); +static SENSOR_DEVICE_ATTR(sys_led_psu1, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU1); +static SENSOR_DEVICE_ATTR(sys_led_psu2, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU2); + +/* transceiver attributes */ +#define DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(index) \ + static SENSOR_DEVICE_ATTR(module_present_##index, S_IWUSR | S_IRUGO, get_status, set_status, MODULE_PRESENT_##index) +#define DECLARE_TRANSCEIVER_PRESENT_ATTR(index) &sensor_dev_attr_module_present_##index.dev_attr.attr + +/*reset*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(index) \ + static SENSOR_DEVICE_ATTR(module_reset_##index, S_IWUSR | S_IRUGO, get_mode_reset, set_mode_reset, MODULE_RESET_##index) +#define DECLARE_TRANSCEIVER_RESET_ATTR(index) &sensor_dev_attr_module_reset_##index.dev_attr.attr + +/* transceiver attributes */ +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(1); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(2); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(3); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(4); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(5); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(6); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(7); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(8); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(9); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(10); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(11); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(12); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(13); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(14); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(15); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(16); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(17); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(18); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(19); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(20); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(21); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(22); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(23); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(24); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(25); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(26); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(27); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(28); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(29); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(30); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(31); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(32); + +static struct attribute *sw_to3200k_fpga_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + &sensor_dev_attr_sys_led_loc.dev_attr.attr, + &sensor_dev_attr_sys_led_diag.dev_attr.attr, + &sensor_dev_attr_sys_led_fan.dev_attr.attr, + &sensor_dev_attr_sys_led_psu1.dev_attr.attr, + &sensor_dev_attr_sys_led_psu2.dev_attr.attr, + NULL +}; + +static const struct attribute_group sw_to3200k_fpga_group = { + .attrs = sw_to3200k_fpga_attributes, +}; + +static struct attribute *sw_to3200k_cpld1_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(1), + DECLARE_TRANSCEIVER_PRESENT_ATTR(2), + DECLARE_TRANSCEIVER_PRESENT_ATTR(3), + DECLARE_TRANSCEIVER_PRESENT_ATTR(4), + DECLARE_TRANSCEIVER_PRESENT_ATTR(5), + DECLARE_TRANSCEIVER_PRESENT_ATTR(6), + DECLARE_TRANSCEIVER_PRESENT_ATTR(7), + DECLARE_TRANSCEIVER_PRESENT_ATTR(8), + DECLARE_TRANSCEIVER_PRESENT_ATTR(9), + DECLARE_TRANSCEIVER_PRESENT_ATTR(10), + DECLARE_TRANSCEIVER_PRESENT_ATTR(11), + DECLARE_TRANSCEIVER_PRESENT_ATTR(12), + DECLARE_TRANSCEIVER_PRESENT_ATTR(13), + DECLARE_TRANSCEIVER_PRESENT_ATTR(14), + DECLARE_TRANSCEIVER_PRESENT_ATTR(15), + DECLARE_TRANSCEIVER_PRESENT_ATTR(16), + DECLARE_TRANSCEIVER_RESET_ATTR(1), + DECLARE_TRANSCEIVER_RESET_ATTR(2), + DECLARE_TRANSCEIVER_RESET_ATTR(3), + DECLARE_TRANSCEIVER_RESET_ATTR(4), + DECLARE_TRANSCEIVER_RESET_ATTR(5), + DECLARE_TRANSCEIVER_RESET_ATTR(6), + DECLARE_TRANSCEIVER_RESET_ATTR(7), + DECLARE_TRANSCEIVER_RESET_ATTR(8), + DECLARE_TRANSCEIVER_RESET_ATTR(9), + DECLARE_TRANSCEIVER_RESET_ATTR(10), + DECLARE_TRANSCEIVER_RESET_ATTR(11), + DECLARE_TRANSCEIVER_RESET_ATTR(12), + DECLARE_TRANSCEIVER_RESET_ATTR(13), + DECLARE_TRANSCEIVER_RESET_ATTR(14), + DECLARE_TRANSCEIVER_RESET_ATTR(15), + DECLARE_TRANSCEIVER_RESET_ATTR(16), + NULL +}; + +static const struct attribute_group sw_to3200k_cpld1_group = { + .attrs = sw_to3200k_cpld1_attributes, +}; + +static struct attribute *sw_to3200k_cpld2_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(17), + DECLARE_TRANSCEIVER_PRESENT_ATTR(18), + DECLARE_TRANSCEIVER_PRESENT_ATTR(19), + DECLARE_TRANSCEIVER_PRESENT_ATTR(20), + DECLARE_TRANSCEIVER_PRESENT_ATTR(21), + DECLARE_TRANSCEIVER_PRESENT_ATTR(22), + DECLARE_TRANSCEIVER_PRESENT_ATTR(23), + DECLARE_TRANSCEIVER_PRESENT_ATTR(24), + DECLARE_TRANSCEIVER_PRESENT_ATTR(25), + DECLARE_TRANSCEIVER_PRESENT_ATTR(26), + DECLARE_TRANSCEIVER_PRESENT_ATTR(27), + DECLARE_TRANSCEIVER_PRESENT_ATTR(28), + DECLARE_TRANSCEIVER_PRESENT_ATTR(29), + DECLARE_TRANSCEIVER_PRESENT_ATTR(30), + DECLARE_TRANSCEIVER_PRESENT_ATTR(31), + DECLARE_TRANSCEIVER_PRESENT_ATTR(32), + DECLARE_TRANSCEIVER_RESET_ATTR(17), + DECLARE_TRANSCEIVER_RESET_ATTR(18), + DECLARE_TRANSCEIVER_RESET_ATTR(19), + DECLARE_TRANSCEIVER_RESET_ATTR(20), + DECLARE_TRANSCEIVER_RESET_ATTR(21), + DECLARE_TRANSCEIVER_RESET_ATTR(22), + DECLARE_TRANSCEIVER_RESET_ATTR(23), + DECLARE_TRANSCEIVER_RESET_ATTR(24), + DECLARE_TRANSCEIVER_RESET_ATTR(25), + DECLARE_TRANSCEIVER_RESET_ATTR(26), + DECLARE_TRANSCEIVER_RESET_ATTR(27), + DECLARE_TRANSCEIVER_RESET_ATTR(28), + DECLARE_TRANSCEIVER_RESET_ATTR(29), + DECLARE_TRANSCEIVER_RESET_ATTR(30), + DECLARE_TRANSCEIVER_RESET_ATTR(31), + DECLARE_TRANSCEIVER_RESET_ATTR(32), + NULL +}; + +static const struct attribute_group sw_to3200k_cpld2_group = { + .attrs = sw_to3200k_cpld2_attributes, +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + status = data->present[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + long status=0; + int update_idx, error; + + error = kstrtol(buf, 10, &status); + if (error) + { + return error; + } + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + data->present[update_idx] = status; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int version; + + mutex_lock(&data->lock); + version = data->version; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", version); +} + +static ssize_t set_version +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, version; + + error = kstrtoint(buf, 10, &version); + if (error) + { + return error; + } + + mutex_lock(&data->lock); + data->version = version; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, reset = 0; + + update_idx = attr->index - MODULE_RESET_1; + mutex_lock(&data->lock); + reset = data->reset[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", reset); +} + +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, reset; + int update_idx; + + error = kstrtoint(buf, 10, &reset); + if (error) + { + return error; + } + + update_idx = attr->index - MODULE_RESET_1; + mutex_lock(&data->lock); + data->reset[update_idx] = reset; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - SYSTEM_LED_LOC; + mutex_lock(&data->lock); + status = data->sysled_status[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_led_status +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, status; + int update_idx; + + error = kstrtoint(buf, 10, &status); + if (error) + { + return error; + } + + update_idx = attr->index - SYSTEM_LED_LOC; + mutex_lock(&data->lock); + data->sysled_status[update_idx] = status; + mutex_unlock(&data->lock); + return count; +} + +static int get_led_status_internal(struct i2c_client *client, int led_type) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + status = data->sysled_status[led_type]; + mutex_unlock(&data->lock); + return status; +} + +static int set_led_status_internal(struct i2c_client *client, int led_type, int light_mode) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + data->sysled_status[led_type] = light_mode; + mutex_unlock(&data->lock); + return 0; +} + +static void sw_to3200k_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) + { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void sw_to3200k_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) + { + found = 1; + break; + } + } + + if (found) + { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +/* + * I2C init/probing/exit functions + */ +static int sw_to3200k_cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct sw_to3200k_cpld_data *data; + int ret = -ENODEV; + const struct attribute_group *group = NULL; + + data = kzalloc(sizeof(struct sw_to3200k_cpld_data), GFP_KERNEL); + if (!data) + { + ret = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + data->type = id->driver_data; + + /* Register sysfs hooks */ + switch (data->type) + { + case sw_to3200k_fpga: + group = &sw_to3200k_fpga_group; + break; + case sw_to3200k_cpld1: + group = &sw_to3200k_cpld1_group; + break; + case sw_to3200k_cpld2: + group = &sw_to3200k_cpld2_group; + break; + default: + break; + } + + if (group) + { + ret = sysfs_create_group(&client->dev.kobj, group); + if (ret) + { + goto exit_free; + } + } + + sw_to3200k_cpld_add_client(client); + return 0; + +exit_free: + kfree(data); +exit: + return ret; +} + +static int sw_to3200k_cpld_remove(struct i2c_client *client) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + const struct attribute_group *group = NULL; + + sw_to3200k_cpld_remove_client(client); + + /* Remove sysfs hooks */ + switch (data->type) + { + case sw_to3200k_fpga: + group = &sw_to3200k_fpga_group; + break; + case sw_to3200k_cpld1: + group = &sw_to3200k_cpld1_group; + break; + case sw_to3200k_cpld2: + group = &sw_to3200k_cpld2_group; + break; + default: + break; + } + + if (group) + { + sysfs_remove_group(&client->dev.kobj, group); + } + + kfree(data); + return 0; +} + +int sw_to3200k_fpga_sysled_get(int led_type) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == SW_TO3200K_FPGA_ADDR) { + ret = get_led_status_internal(cpld_node->client, led_type); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(sw_to3200k_fpga_sysled_get); + +int sw_to3200k_fpga_sysled_set(int led_type, int light_mode) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == SW_TO3200K_FPGA_ADDR) { + ret = set_led_status_internal(cpld_node->client, led_type, light_mode); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(sw_to3200k_fpga_sysled_set); + +static struct i2c_driver sw_to3200k_cpld_driver = { + .driver = { + .name = "sw_to3200k_cpld", + .owner = THIS_MODULE, + }, + .probe = sw_to3200k_cpld_probe, + .remove = sw_to3200k_cpld_remove, + .id_table = sw_to3200k_cpld_id, +}; + +static int __init sw_to3200k_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&sw_to3200k_cpld_driver); +} + +static void __exit sw_to3200k_cpld_exit(void) +{ + i2c_del_driver(&sw_to3200k_cpld_driver); +} + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("Wistron I2C CPLD driver"); +MODULE_LICENSE("GPL"); + +module_init(sw_to3200k_cpld_init); +module_exit(sw_to3200k_cpld_exit); + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c new file mode 100644 index 000000000000..82dfa71b7805 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c @@ -0,0 +1,299 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "sw_to3200k_fan" + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum fan_id { + FAN1_ID, + FAN2_ID, + FAN3_ID, + FAN4_ID, + FAN5_ID, + FAN6_ID, + FAN7_ID +}; + +enum sysfs_fan_attributes { + FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ + FAN1_PRESENCE, + FAN2_PRESENCE, + FAN3_PRESENCE, + FAN4_PRESENCE, + FAN5_PRESENCE, + FAN6_PRESENCE, + FAN7_PRESENCE, + FAN1_ENABLE, + FAN2_ENABLE, + FAN3_ENABLE, + FAN4_ENABLE, + FAN5_ENABLE, + FAN6_ENABLE, + FAN7_ENABLE, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, + FAN7_DIRECTION, + FAN1_FRONT_SPEED_RPM, + FAN2_FRONT_SPEED_RPM, + FAN3_FRONT_SPEED_RPM, + FAN4_FRONT_SPEED_RPM, + FAN5_FRONT_SPEED_RPM, + FAN6_FRONT_SPEED_RPM, + FAN7_FRONT_SPEED_RPM, + FAN1_REAR_SPEED_RPM, + FAN2_REAR_SPEED_RPM, + FAN3_REAR_SPEED_RPM, + FAN4_REAR_SPEED_RPM, + FAN5_REAR_SPEED_RPM, + FAN6_REAR_SPEED_RPM, + FAN7_REAR_SPEED_RPM, + FAN_ATTR_MAX +}; + +/* Each client has this additional data */ +struct sw_to3200k_fan_data { + struct device *hwmon_dev; + struct mutex update_lock; + int fan_val[FAN_ATTR_MAX]; +}; + +/* Define attributes */ +#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_duty_cycle_percentage, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DUTY_CYCLE_PERCENTAGE) +#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_fan##index##_duty_cycle_percentage.dev_attr.attr + +#define DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_presence, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_PRESENCE) +#define DECLARE_FAN_PRESENCE_ATTR(index) &sensor_dev_attr_fan##index##_presence.dev_attr.attr + +#define DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_enable, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_ENABLE) +#define DECLARE_FAN_ENABLE_ATTR(index) &sensor_dev_attr_fan##index##_enable.dev_attr.attr + +#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DIRECTION) +#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr + +#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index, index2) \ + static SENSOR_DEVICE_ATTR(fan##index##_front_speed_rpm, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index##_rear_speed_rpm, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index2##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM) +#define DECLARE_FAN_SPEED_RPM_ATTR(index, index2) &sensor_dev_attr_fan##index##_front_speed_rpm.dev_attr.attr, \ + &sensor_dev_attr_fan##index##_rear_speed_rpm.dev_attr.attr, \ + &sensor_dev_attr_fan##index##_input.dev_attr.attr, \ + &sensor_dev_attr_fan##index2##_input.dev_attr.attr + +/* 7 fan speed(rpm) attributes in this platform */ +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1,11); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2,12); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3,13); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4,14); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5,15); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6,16); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(7,17); + +/* 7 fan presence */ +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(7); + +/* 7 fan enable */ +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(7); + +/* 7 fan direction */ +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(7); + +/* 1 fan duty cycle attribute in this platform */ +DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); + +static struct attribute *sw_to3200k_fan_attributes[] = { + /* fan related attributes */ + DECLARE_FAN_SPEED_RPM_ATTR(1,11), + DECLARE_FAN_SPEED_RPM_ATTR(2,12), + DECLARE_FAN_SPEED_RPM_ATTR(3,13), + DECLARE_FAN_SPEED_RPM_ATTR(4,14), + DECLARE_FAN_SPEED_RPM_ATTR(5,15), + DECLARE_FAN_SPEED_RPM_ATTR(6,16), + DECLARE_FAN_SPEED_RPM_ATTR(7,17), + DECLARE_FAN_PRESENCE_ATTR(1), + DECLARE_FAN_PRESENCE_ATTR(2), + DECLARE_FAN_PRESENCE_ATTR(3), + DECLARE_FAN_PRESENCE_ATTR(4), + DECLARE_FAN_PRESENCE_ATTR(5), + DECLARE_FAN_PRESENCE_ATTR(6), + DECLARE_FAN_PRESENCE_ATTR(7), + DECLARE_FAN_ENABLE_ATTR(1), + DECLARE_FAN_ENABLE_ATTR(2), + DECLARE_FAN_ENABLE_ATTR(3), + DECLARE_FAN_ENABLE_ATTR(4), + DECLARE_FAN_ENABLE_ATTR(5), + DECLARE_FAN_ENABLE_ATTR(6), + DECLARE_FAN_ENABLE_ATTR(7), + DECLARE_FAN_DIRECTION_ATTR(1), + DECLARE_FAN_DIRECTION_ATTR(2), + DECLARE_FAN_DIRECTION_ATTR(3), + DECLARE_FAN_DIRECTION_ATTR(4), + DECLARE_FAN_DIRECTION_ATTR(5), + DECLARE_FAN_DIRECTION_ATTR(6), + DECLARE_FAN_DIRECTION_ATTR(7), + DECLARE_FAN_DUTY_CYCLE_ATTR(), + NULL +}; + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->update_lock); + value = data->fan_val[attr->index]; + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_fan_value +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) + { + printk("fan_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->update_lock); + data->fan_val[attr->index] = value; + mutex_unlock(&data->update_lock); + return count; +} + +static const struct attribute_group sw_to3200k_fan_group = { + .attrs = sw_to3200k_fan_attributes, +}; + +static int sw_to3200k_fan_probe +( + struct i2c_client *client, + const struct i2c_device_id *dev_id +) +{ + struct sw_to3200k_fan_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_fan_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_fan_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_fan_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_fan_remove(struct i2c_client *client) +{ + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_fan_group); + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { 0x66, I2C_CLIENT_END }; + +static const struct i2c_device_id sw_to3200k_fan_id[] = { + { "sw_to3200k_fan", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_fan_id); + +static struct i2c_driver sw_to3200k_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = sw_to3200k_fan_probe, + .remove = sw_to3200k_fan_remove, + .id_table = sw_to3200k_fan_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(sw_to3200k_fan_driver); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_fan driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c new file mode 100644 index 000000000000..65be12e9f0bc --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c @@ -0,0 +1,293 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* led_type: 0=loc, 1=diag, 2=fan, 3=psu1, 4=psu2 + * light_mode: 0=off, 1=green, 2=amber, 3=blinking green + */ +extern int sw_to3200k_fpga_sysled_get(int led_type); +extern int sw_to3200k_fpga_sysled_set(int led_type, int light_mode); + +#define DRVNAME "wistron_sw_to3200k_led" + +struct wistron_sw_to3200k_led_data { + struct platform_device *pdev; + struct mutex lock; + int sysled_status[5]; +}; + +static struct wistron_sw_to3200k_led_data *ledctl = NULL; + +/* LED related data */ +#define LED_MODE_OFF_VALUE 0 +#define LED_MODE_GREEN_VALUE 1 +#define LED_MODE_AMBER_VALUE 2 +#define LED_MODE_BLK_GREEN_VALUE 3 + +enum led_type { + LED_TYPE_LOC, + LED_TYPE_DIAG, + LED_TYPE_FAN, + LED_TYPE_PSU1, + LED_TYPE_PSU2, + LED_TYPE_END +}; + +enum led_light_mode { + LED_MODE_OFF = 0, + LED_MODE_GREEN, + LED_MODE_AMBER, + LED_MODE_BLK_GREEN, + LED_MODE_UNKNOWN +}; + +static void wistron_sw_to3200k_led_update(void) +{ + int i; + mutex_lock(&ledctl->lock); + for (i = 0; i < LED_TYPE_END; i++) + { + ledctl->sysled_status[i] = sw_to3200k_fpga_sysled_get(i); + } + mutex_unlock(&ledctl->lock); +} + +static void wistron_sw_to3200k_led_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode, + enum led_type type) +{ + mutex_lock(&ledctl->lock); + sw_to3200k_fpga_sysled_set(type, led_light_mode); + mutex_unlock(&ledctl->lock); +} + +static void wistron_sw_to3200k_led_diag_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); +} + +static enum led_brightness wistron_sw_to3200k_led_diag_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_DIAG]; +} + +static void wistron_sw_to3200k_led_loc_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); +} + +static enum led_brightness wistron_sw_to3200k_led_loc_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_LOC]; +} + +static void wistron_sw_to3200k_led_fan_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_FAN); +} + +static enum led_brightness wistron_sw_to3200k_led_fan_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_FAN]; +} + +static void wistron_sw_to3200k_led_psu1_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_PSU1); +} + +static enum led_brightness wistron_sw_to3200k_led_psu1_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU1]; +} + +static void wistron_sw_to3200k_led_psu2_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_PSU2); +} + +static enum led_brightness wistron_sw_to3200k_led_psu2_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU2]; +} + +static struct led_classdev wistron_sw_to3200k_leds[] = { + [LED_TYPE_DIAG] = { + .name = "wistron_sw_to3200k_led::diag", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_diag_set, + .brightness_get = wistron_sw_to3200k_led_diag_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_LOC] = { + .name = "wistron_sw_to3200k_led::loc", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_loc_set, + .brightness_get = wistron_sw_to3200k_led_loc_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_FAN] = { + .name = "wistron_sw_to3200k_led::fan", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_fan_set, + .brightness_get = wistron_sw_to3200k_led_fan_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU1] = { + .name = "wistron_sw_to3200k_led::psu1", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_psu1_set, + .brightness_get = wistron_sw_to3200k_led_psu1_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU2] = { + .name = "wistron_sw_to3200k_led::psu2", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_psu2_set, + .brightness_get = wistron_sw_to3200k_led_psu2_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, +}; + +static int wistron_sw_to3200k_led_suspend(struct platform_device *dev, + pm_message_t state) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_suspend(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static int wistron_sw_to3200k_led_resume(struct platform_device *dev) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_resume(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static int wistron_sw_to3200k_led_probe(struct platform_device *pdev) +{ + int ret, i; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + ret = led_classdev_register(&pdev->dev, &wistron_sw_to3200k_leds[i]); + + if (ret < 0) + break; + } + + /* Check if all LEDs were successfully registered */ + if (i != ARRAY_SIZE(wistron_sw_to3200k_leds)) + { + int j; + + /* only unregister the LEDs that were successfully registered */ + for (j = 0; j < i; j++) + { + led_classdev_unregister(&wistron_sw_to3200k_leds[i]); + } + } + + return ret; +} + +static int wistron_sw_to3200k_led_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_unregister(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static struct platform_driver wistron_sw_to3200k_led_driver = { + .probe = wistron_sw_to3200k_led_probe, + .remove = wistron_sw_to3200k_led_remove, + .suspend = wistron_sw_to3200k_led_suspend, + .resume = wistron_sw_to3200k_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init wistron_sw_to3200k_led_init(void) +{ + int ret; + + ret = platform_driver_register(&wistron_sw_to3200k_led_driver); + if (ret < 0) + { + goto exit; + } + + ledctl = kzalloc(sizeof(struct wistron_sw_to3200k_led_data), GFP_KERNEL); + if (!ledctl) + { + ret = -ENOMEM; + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + goto exit; + } + + mutex_init(&ledctl->lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(ledctl->pdev)) + { + ret = PTR_ERR(ledctl->pdev); + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + kfree(ledctl); + goto exit; + } + +exit: + return ret; +} + +static void __exit wistron_sw_to3200k_led_exit(void) +{ + platform_device_unregister(ledctl->pdev); + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + kfree(ledctl); +} + +module_init(wistron_sw_to3200k_led_init); +module_exit(wistron_sw_to3200k_led_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("wistron_sw_to3200k_led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c new file mode 100644 index 000000000000..6e1df229c9fd --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c @@ -0,0 +1,397 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* QSFP-DD: page0 (low page (128 byte)), page 0 (high page (128 byte)), page 2 (high page (128 byte)), page11 (high page (128 byte))*/ +#define EEPROM_DATA_SIZE 128 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; +#define MAX_PORT_NAME_LEN 20 + +enum sysfs_fan_attributes { + OOM_LP_MODE, + OOM_TEMP, + OOM_EEPROM_LOW, + OOM_EEPROM_PG0, + OOM_EEPROM_PG1, + OOM_EEPROM_PG2, + OOM_EEPROM_PG3, + OOM_EEPROM_PG11, + OOM_PORT_NAME, + OOM_ATTR_MAX +}; + +/* Each client has this additional data */ +struct sw_to3200k_oom_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + int lp_mode; + int temp; + unsigned char eeproml[EEPROM_DATA_SIZE]; + unsigned char eeprom0[EEPROM_DATA_SIZE]; + unsigned char eeprom1[EEPROM_DATA_SIZE]; + unsigned char eeprom2[EEPROM_DATA_SIZE]; + unsigned char eeprom3[EEPROM_DATA_SIZE]; + unsigned char eeprom11[EEPROM_DATA_SIZE]; + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static SENSOR_DEVICE_ATTR(lp_mode, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_LP_MODE); +static SENSOR_DEVICE_ATTR(temp, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_TEMP); +static SENSOR_DEVICE_ATTR(eeprom_low, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_LOW); +static SENSOR_DEVICE_ATTR(eeprom_pg0, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG0); +static SENSOR_DEVICE_ATTR(eeprom_pg1, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG1); +static SENSOR_DEVICE_ATTR(eeprom_pg2, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG2); +static SENSOR_DEVICE_ATTR(eeprom_pg3, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG3); +static SENSOR_DEVICE_ATTR(eeprom_pg11, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG11); +static SENSOR_DEVICE_ATTR(port_name, S_IRUGO | S_IWUSR, get_port_name, set_port_name, OOM_PORT_NAME); + +static struct attribute *sw_to3200k_oom_attributes[] = { + &sensor_dev_attr_lp_mode.dev_attr.attr, + &sensor_dev_attr_temp.dev_attr.attr, + &sensor_dev_attr_eeprom_low.dev_attr.attr, + &sensor_dev_attr_eeprom_pg0.dev_attr.attr, + &sensor_dev_attr_eeprom_pg1.dev_attr.attr, + &sensor_dev_attr_eeprom_pg2.dev_attr.attr, + &sensor_dev_attr_eeprom_pg3.dev_attr.attr, + &sensor_dev_attr_eeprom_pg11.dev_attr.attr, + &sensor_dev_attr_port_name.dev_attr.attr, + NULL +}; + +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + { + value = data->lp_mode; + } + else + { + value = data->temp; + } + mutex_unlock(&data->lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) + { + printk("oom_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + { + data->lp_mode = value; + } + else + { + data->temp = value; + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_oom_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + memcpy(buf, data->eeproml, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG0: + { + memcpy(buf, data->eeprom0, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG1: + { + memcpy(buf, data->eeprom1, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG2: + { + memcpy(buf, data->eeprom2, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG3: + { + memcpy(buf, data->eeprom3, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG11: + { + memcpy(buf, data->eeprom11, EEPROM_DATA_SIZE); + break; + } + default: + break; + } + mutex_unlock(&data->lock); + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int i=0, j=0, k=0; + unsigned char str[3]; + unsigned int val; + + k=0; + mutex_lock(&data->lock); + memset(str, 0x0, 3); + if (strlen(buf) >= EEPROM_DATA_SIZE) + { + for (i=0; i < strlen(buf) ; i++) + { + for (j=0;j<2; j++) + { + str[j]=buf[i+j]; + } + sscanf(str, "%x", &val); + i=j+i-1; + if (k>=EEPROM_DATA_SIZE) + { + break; + } + + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + data->eeproml[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG0: + { + data->eeprom0[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG1: + { + data->eeprom1[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG2: + { + data->eeprom2[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG3: + { + data->eeprom3[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG11: + { + data->eeprom11[k]=(unsigned char)val; + break; + } + default: + break; + } + + k++; + } + } + else + { + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + memset(&data->eeproml, 0x0, sizeof(data->eeproml)); + break; + } + case OOM_EEPROM_PG0: + { + memset(&data->eeprom0, 0x0, sizeof(data->eeprom0)); + break; + } + case OOM_EEPROM_PG2: + { + memset(&data->eeprom2, 0x0, sizeof(data->eeprom2)); + break; + } + case OOM_EEPROM_PG3: + { + memset(&data->eeprom3, 0x0, sizeof(data->eeprom3)); + break; + } + case OOM_EEPROM_PG11: + { + memset(&data->eeprom11, 0x0, sizeof(data->eeprom11)); + break; + } + default: + break; + } + } + + mutex_unlock(&data->lock); + return size; +} + +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + count = sprintf(buf, "%s", data->port_name); + mutex_unlock(&data->lock); + return count; +} + +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + if (sscanf(buf, "%19s", port_name) != 1) + { + return -EINVAL; + } + + mutex_lock(&data->lock); + strcpy(data->port_name, port_name); + mutex_unlock(&data->lock); + return count; +} + +static const struct attribute_group sw_to3200k_oom_group = { + .attrs = sw_to3200k_oom_attributes, +}; + +static int sw_to3200k_oom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_oom_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_oom_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_oom_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: oom '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_oom_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_oom_remove(struct i2c_client *client) +{ + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_oom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id sw_to3200k_oom_id[] = { + { "sw_to3200k_oom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_oom_id); + +static struct i2c_driver sw_to3200k_oom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_oom", + }, + .probe = sw_to3200k_oom_probe, + .remove = sw_to3200k_oom_remove, + .id_table = sw_to3200k_oom_id, + .address_list = normal_i2c, +}; + +static int __init sw_to3200k_oom_init(void) +{ + return i2c_add_driver(&sw_to3200k_oom_driver); +} + +static void __exit sw_to3200k_oom_exit(void) +{ + i2c_del_driver(&sw_to3200k_oom_driver); +} + +module_init(sw_to3200k_oom_init); +module_exit(sw_to3200k_oom_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_oom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c new file mode 100644 index 000000000000..849ec1315407 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c @@ -0,0 +1,266 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_MODEL_NAME 16 +#define MAX_SERIAL_NUMBER 19 + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_string(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_string(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { 0x51, 0x52, I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct sw_to3200k_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int index; /* PSU index */ + int present; /* PSU present */ + int pwr_good; /* PSU power good */ + int psu_fan_dir; /* PSU fan direction 0:afo, 1:afi */ + char model_name[MAX_MODEL_NAME]; /* Model name */ + char serial_number[MAX_SERIAL_NUMBER]; +}; + +enum sw_to3200k_psu_sysfs_attributes { + PSU_PRESENT, + PSU_MODEL_NAME, + PSU_POWER_GOOD, + PSU_SERIAL_NUMBER, + PSU_FAN_DIR +}; + +/* sysfs attributes for hwmon */ +static SENSOR_DEVICE_ATTR(psu_present, S_IWUSR | S_IRUGO, get_status, set_status, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(psu_model_name, S_IWUSR | S_IRUGO, get_string, set_string, PSU_MODEL_NAME); +static SENSOR_DEVICE_ATTR(psu_power_good, S_IWUSR | S_IRUGO, get_status, set_status, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(psu_serial_number, S_IWUSR | S_IRUGO, get_string, set_string, PSU_SERIAL_NUMBER); +static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IWUSR | S_IRUGO, get_status, set_status, PSU_FAN_DIR); + +static struct attribute *sw_to3200k_psu_attributes[] = { + &sensor_dev_attr_psu_present.dev_attr.attr, + &sensor_dev_attr_psu_model_name.dev_attr.attr, + &sensor_dev_attr_psu_power_good.dev_attr.attr, + &sensor_dev_attr_psu_serial_number.dev_attr.attr, + &sensor_dev_attr_psu_fan_dir.dev_attr.attr, + NULL +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) + { + status = data->present; + } + else if (attr->index == PSU_POWER_GOOD) + { + status = data->pwr_good; + } + else + { + status = data->psu_fan_dir; + } + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + int error, status; + + error = kstrtoint(buf, 10, &status); + if (error) + { + printk("psu_set_status error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) + { + data->present = status; + } + else if (attr->index == PSU_POWER_GOOD) + { + data->pwr_good = status; + } + else + { + data->psu_fan_dir = status; + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_string(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + if (attr->index == PSU_MODEL_NAME) + { + count = sprintf(buf, "%s", data->model_name); + } + else + { + count = sprintf(buf, "%s", data->serial_number); + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t set_string(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + char tmp_str[32]; + + memset(&tmp_str, 0x0, sizeof(tmp_str)); + if (attr->index == PSU_MODEL_NAME) + { + if (sscanf(buf, "%16s", tmp_str) != 1) + { + return -EINVAL; + } + } + else + { + if (sscanf(buf, "%19s", tmp_str) != 1) + { + return -EINVAL; + } + } + + mutex_lock(&data->lock); + if (attr->index == PSU_MODEL_NAME) + { + strcpy(data->model_name, tmp_str); + } + else + { + strcpy(data->serial_number, tmp_str); + } + mutex_unlock(&data->lock); + return count; +} + +static const struct attribute_group sw_to3200k_psu_group = { + .attrs = sw_to3200k_psu_attributes, +}; + +static int sw_to3200k_psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_psu_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) + { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct sw_to3200k_psu_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_psu_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_psu_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_psu_remove(struct i2c_client *client) +{ + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_psu_group); + kfree(data); + + return 0; +} + +enum psu_index +{ + sw_to3200k_psu1, + sw_to3200k_psu2 +}; + +static const struct i2c_device_id sw_to3200k_psu_id[] = { + { "sw_to3200k_psu1", sw_to3200k_psu1 }, + { "sw_to3200k_psu2", sw_to3200k_psu2 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_psu_id); + +static struct i2c_driver sw_to3200k_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_psu", + }, + .probe = sw_to3200k_psu_probe, + .remove = sw_to3200k_psu_remove, + .id_table = sw_to3200k_psu_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(sw_to3200k_psu_driver); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_psu driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c new file mode 100644 index 000000000000..e96e9d723f46 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c @@ -0,0 +1,205 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define STRING_TO_DEC_VALUE 10 +#define STRING_TO_HEX_VALUE 16 + +#define TEMP1_MAX_DEFAULT 75000 +#define TEMP1_MAX_HYST_DEFAULT 70000 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct sw_to3200k_thermal_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + unsigned int temp1_input; + unsigned int temp1_max; + unsigned int temp1_max_hyst; +}; + +enum sw_to3200k_thermal_sysfs_attributes { + TEMP1_INPUT, + TEMP1_MAX, + TEMP1_MAX_HYST +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX); +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX_HYST); + +static struct attribute *sw_to3200k_thermal_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, + NULL +}; + +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + int status = -EINVAL; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_input); + break; + case TEMP1_MAX: + status = snprintf(buf, PAGE_SIZE - 1, "%d", TEMP1_MAX_DEFAULT); + break; + case TEMP1_MAX_HYST: + status = snprintf(buf, PAGE_SIZE - 1, "%d", TEMP1_MAX_HYST_DEFAULT); + break; + default : + break; + } + mutex_unlock(&data->lock); + return status; +} + +static ssize_t set_temp_info +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t size +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + long keyin = 0; + int error; + + error = kstrtol(buf, STRING_TO_DEC_VALUE, &keyin); + if (error) + { + return error; + } + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + data->temp1_input = keyin; + break; + default : + break; + } + + mutex_unlock(&data->lock); + return size; +} + +static const struct attribute_group sw_to3200k_thermal_group = { + .attrs = sw_to3200k_thermal_attributes, +}; + +static int sw_to3200k_thermal_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_thermal_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_thermal_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_thermal_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: thermal '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_thermal_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_thermal_remove(struct i2c_client *client) +{ + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_thermal_group); + kfree(data); + return 0; +} + + +static const struct i2c_device_id sw_to3200k_thermal_id[] = { + { "sw_to3200k_thermal", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_thermal_id); + +static struct i2c_driver sw_to3200k_thermal_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_thermal", + }, + .probe = sw_to3200k_thermal_probe, + .remove = sw_to3200k_thermal_remove, + .id_table = sw_to3200k_thermal_id, + .address_list = normal_i2c, +}; + +static int __init sw_to3200k_thermal_init(void) +{ + return i2c_add_driver(&sw_to3200k_thermal_driver); +} + +static void __exit sw_to3200k_thermal_exit(void) +{ + i2c_del_driver(&sw_to3200k_thermal_driver); +} + +module_init(sw_to3200k_thermal_init); +module_exit(sw_to3200k_thermal_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_thermal driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service new file mode 100644 index 000000000000..0e7a679b9183 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service @@ -0,0 +1,14 @@ +[Unit] +Description=Wistron SW-TO3200K Platform modules +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/wistron_sw_to3200k_util.py install +ExecStop=/usr/local/bin/wistron_sw_to3200k_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service new file mode 100644 index 000000000000..6e708518cae5 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron SW-TO3200K Platform LED service +After=platform-modules-sw-to3200k.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_led +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service new file mode 100644 index 000000000000..38aab39739e8 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service @@ -0,0 +1,13 @@ +[Unit] +Description=Wistron SW-TO3200K Platform Monitoring service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_sync +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service new file mode 100644 index 000000000000..8d21131db23d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron SW-TO3200K Platform PLD service +After=platform-modules-sw-to3200k.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_pld +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py new file mode 100644 index 000000000000..9844d2633379 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py @@ -0,0 +1,32 @@ +from setuptools import setup + + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Wistron SW-TO3200K Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='sonic_rd@wistron.com', + url='', + maintainer='Wistron SW-TO3200K', + maintainer_email='', + packages=[ + 'sonic_platform' + ], + package_dir={'sonic_platform': 'sonic_platform'}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py new file mode 100644 index 000000000000..0c73278ba9f5 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "psu", "thermal", "fan", "watchdog"] +from . import platform diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py new file mode 100644 index 000000000000..4effac20b6a4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# +try: + import sys + import os + import time + import subprocess + from sonic_platform_base.chassis_base import ChassisBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN = 14 +NUM_PSU = 2 +NUM_THERMAL = 7 +NUM_SFP = 32 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "docker > /dev/null 2>&1" +GET_HWSKU_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.hwsku" +GET_PLATFORM_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.platform" + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + super(Chassis, self).__init__() + + # Initialize SKU name and Platform name + self.sku_name = self._get_sku_name() + self.platform_name = self._get_platform_name() + self.name = self.sku_name + + self._transceiver_presence = [0] * NUM_SFP + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp_module = Sfp(index, 'QSFP_DD') + self._sfp_list.append(sfp_module) + + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, NUM_FAN): + fan = Fan(fan_index) + self._fan_list.append(fan) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def _get_sku_name(self): + p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def _get_platform_name(self): + p = subprocess.Popen(GET_PLATFORM_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.name + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + sw_reboot_cause = self.__read_txt_file( + reboot_cause_path) or "Unknown" + + if sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + else: + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'Unknown reason' + + return (reboot_cause, description) + + def is_modular_chassis(self): + """ + Retrieves whether the sonic instance is part of modular chassis + Returns: + A bool value, should return False by default or for fixed-platforms. + Should return True for supervisor-cards, line-cards etc running as part + of modular-chassis. + """ + return False + + def get_sfp(self, index): + sfp = None + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format(index, len(self._sfp_list)-1)) + + return sfp + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + port_pres[port] = sfp.get_presence() + + return port_pres + + def get_change_event(self, timeout=0): + port_dict = {} + ret_dict = {'sfp': port_dict} + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) + else: + return False, ret_dict #Incorrect timeout + + while True: + if forever: + timer = 1 + else: + timer = min(timeout, 1) + start_time = time.time() + + time.sleep(timer) + cur_presence = self._get_sfp_presence() + for port in range(0, NUM_SFP): + + if cur_presence[port] != self._transceiver_presence[port]: + change_event = True + if cur_presence[port] == 1: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + self._transceiver_presence = cur_presence + if change_event == True: + break + + if not forever: + elapsed_time = time.time() - start_time + timeout = round(timeout - elapsed_time, 3) + if timeout <= 0: + break + + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + sfp.reinit() + + return True, ret_dict diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py new file mode 100644 index 000000000000..448e083712ce --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +############################################################################# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except BaseException: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status < 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except OSError: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except OSError: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py new file mode 100644 index 000000000000..f5b7f9e80ed6 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_PATH = "/sys/bus/i2c/devices/0-0066/" +FANTRAY_NAME_LIST = ["FANTRAY-1", "FANTRAY-2", + "FANTRAY-3", "FANTRAY-4", + "FANTRAY-5", "FANTRAY-6", "FANTRAY-7"] +FAN_NAME_LIST = ["fan1_front","fan2_front","fan3_front","fan4_front","fan5_front","fan6_front", "fan7_front",\ +"fan1_rear","fan2_rear","fan3_rear","fan4_rear", "fan5_rear", "fan6_rear", "fan7_rear",] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_index): + self.fan_tray_index = fan_index + self.fan_presence = "fan{}_presence" + self.fan_direction = "fan{}_direction" + self.fan_speed_rpm = "fan{}_{}_speed_rpm" + FanBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except BaseException: + return False + return True + + def __search_file_by_name(self, directory, file_name): + for dirpath, dirnames, files in os.walk(directory): + for name in files: + file_path = os.path.join(dirpath, name) + if name in file_name: + return file_path + return None + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_direction.format(index1+1)) + raw = self.__read_txt_file(fan_direction_file).strip('\r\n') + direction = self.FAN_DIRECTION_INTAKE if str( + raw).upper() == "1" else self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 12000 (full speed) + """ + if self.fan_tray_index<=6: + index1=self.fan_tray_index + speed = 0 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"front")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + else: + index1=self.fan_tray_index%7 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"rear")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if self.fan_tray_index<=6: + index1=self.fan_tray_index + speed = 0 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"front")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + else: + index1=self.fan_tray_index%7 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"rear")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return 10 + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + + Note: + Depends on pwm or target mode is selected: + 1) pwm = speed_pc * 255 <-- Currently use this mode. + 2) target_pwm = speed_pc * 100 / 255 + 2.1) set pwm{}_enable to 3 + + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index] + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_presence.format(index1+1)) + present_str = self.__read_txt_file(fan_direction_file) or '1' + + return int(present_str) == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and self.get_speed() > 0 diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py new file mode 100644 index 000000000000..44e03cdadbb3 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py new file mode 100644 index 000000000000..c26b82ee4c76 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSU information which are available in the platform +############################################################################# + + +try: + from sonic_platform_base.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] + +class Psu(PsuBase): + """Platform-specific Psu class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/0-0051", + "/sys/bus/i2c/devices/0-0052"] + STATUS_PSU_DIR = ["/sys/bus/i2c/devices/0-0059", + "/sys/bus/i2c/devices/0-005a"] + + def __init__(self, psu_index): + self.PSU_TEMP_MAX = 85 * 1000 + self.PSU_OUTPUT_POWER_MAX = 1300 * 1000 + self.PSU_OUTPUT_VOLTAGE_MIN = 11400 + self.PSU_OUTPUT_VOLTAGE_MAX = 12600 + self.index = psu_index + PsuBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def get_fan(self): + """ + Retrieves object representing the fan module contained in this PSU + Returns: + An object dervied from FanBase representing the fan module + contained in this PSU + """ + # Hardware not supported + return False + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + attr_file ='psu_present' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as psu_prs: + status = int(psu_prs.read()) + except IOError: + return False + + return status == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + attr_file = 'psu_power_good' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_model(self): + """ + Retrieves the part number of the PSU + Returns: + string: Part number of PSU + """ + try: + if self.get_presence(): + attr_file = 'psu_model_name' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_serial(self): + """ + Retrieves the serial number of the PSU + Returns: + string: Serial number of PSU + """ + try: + if self.get_presence(): + attr_file = 'psu_serial_number' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A int number, the output voltage in volts. + """ + try: + if self.get_presence(): + attr_file = 'psu_v_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A int number, electric current in amperes + """ + try: + if self.get_presence(): + attr_file = 'psu_i_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A int number, the power in watts. + """ + try: + if self.get_presence(): + attr_file = 'psu_p_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + # TODO + if self.get_presence(): + if self.get_powergood_status(): + return self.STATUS_LED_COLOR_GREEN + else: + return self.STATUS_LED_COLOR_RED + else: + return None + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + try: + if self.get_presence(): + attr_file = 'psu_temp1_input' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return float(self.PSU_TEMP_MAX/1000) + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + return float(self.PSU_OUTPUT_VOLTAGE_MAX/1000) + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return float(self.PSU_OUTPUT_VOLTAGE_MIN/1000) + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PSU_OUTPUT_POWER_MAX/1000) + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + return True diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py new file mode 100644 index 000000000000..004bda2ada66 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py @@ -0,0 +1,1515 @@ +#!/usr/bin/env python + +############################################################################# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +############################################################################# +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom + from sonic_platform_base.sonic_sfp.sffbase import sffbase + from sonic_py_common.logger import Logger + import sys +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET = 64 +XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH = 1 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +# definitions of the offset and width for values in XCVR_QSFP_DD info eeprom +XCVR_EXT_TYPE_OFFSET_QSFP_DD = 72 +XCVR_EXT_TYPE_WIDTH_QSFP_DD = 2 +XCVR_CONNECTOR_OFFSET_QSFP_DD = 75 +XCVR_CONNECTOR_WIDTH_QSFP_DD = 1 +XCVR_CABLE_LENGTH_OFFSET_QSFP_DD = 74 +XCVR_CABLE_LENGTH_WIDTH_QSFP_DD = 1 +XCVR_HW_REV_OFFSET_QSFP_DD = 36 +XCVR_HW_REV_WIDTH_QSFP_DD = 2 +XCVR_VENDOR_DATE_OFFSET_QSFP_DD = 54 +XCVR_VENDOR_DATE_WIDTH_QSFP_DD = 8 +XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD = 2 +XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD = 1 +XCVR_MEDIA_TYPE_OFFSET_QSFP_DD = 85 +XCVR_MEDIA_TYPE_WIDTH_QSFP_DD = 1 +XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD = 86 +XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD = 32 +XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD = 351 +XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD = 28 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +QSFP_DD_DOM_BULK_DATA_START = 14 +QSFP_DD_DOM_BULK_DATA_SIZE = 4 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 + +# definitions of the offset for values in QSFP_DD info eeprom +QSFP_DD_TYPE_OFFSET = 0 +QSFP_DD_VENDOR_NAME_OFFSET = 1 +QSFP_DD_VENDOR_PN_OFFSET = 20 +QSFP_DD_VENDOR_SN_OFFSET = 38 +QSFP_DD_VENDOR_OUI_OFFSET = 17 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 + +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DD_CHANNL_STATUS_OFFSET = 26 +QSFP_DD_CHANNL_STATUS_WIDTH = 1 + +QSFP_DD_FLAT_MEM = {'offset': 2, 'width': 1, 'page': 'low'} + +QSFP_DD_MODULE_MON = {'offset': 14, 'width': 4, 'page': 'low'} +QSFP_DD_TEMPE_MON = {'offset': 14, 'width': 2, 'page': 'low'} +QSFP_DD_VOLT_MON = {'offset': 16, 'width': 2, 'page': 'low'} + +QSFP_DD_MON_SUPPORT = {'offset': 159, 'width': 2, 'page': 1 } + +QSFP_DD_CHANNL_MON = {'offset': 154, 'width': 48, 'page': 11 } +QSFP_DD_TX_POWER = {'offset': 154, 'width': 16, 'page': 11 } +QSFP_DD_TX_BIAS = {'offset': 170, 'width': 16, 'page': 11 } +QSFP_DD_RX_POWER = {'offset': 186, 'width': 16, 'page': 11 } + +QSFP_DD_MODULE_THRESHOLD = {'offset': 128, 'width': 72, 'page': 2 } + +QSFP_DD_CHANNL_DISABLE_STATUS = {'offset': 130, 'width': 1, 'page': 10 } +QSFP_DD_CHANNL_RX_LOS_STATUS = {'offset': 147, 'width': 1, 'page': 11 } +QSFP_DD_CHANNL_TX_FAULT_STATUS = {'offset': 135, 'width': 1, 'page': 11 } + +QSFP_TYPE_CODE_LIST = [ + '0d', # QSFP+ or later + '11' # QSFP28 or later +] + +QSFP_DD_TYPE_CODE_LIST = [ + '18' # QSFP-DD Double Density 8X Pluggable Transceiver +] + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes','FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia','FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +QSFP_TYPE = "QSFP" +QSFP_DD_TYPE = "QSFP_DD" + +# Global logger class instance +logger = Logger() +class ext_qsfp_dd(sffbase): + version = '1.0' + + qsfp_dd_mon_capability = { + 'Tx_bias_support': + {'offset': 1, + 'bit': 0, + 'type': 'bitvalue'}, + 'Tx_power_support': + {'offset': 1, + 'bit': 1, + 'type': 'bitvalue'}, + 'Rx_power_support': + {'offset': 1, + 'bit': 2, + 'type': 'bitvalue'}, + 'Voltage_support': + {'offset': 0, + 'bit': 1, + 'type': 'bitvalue'}, + 'Temp_support': + {'offset': 0, + 'bit': 0, + 'type': 'bitvalue'} + } + + def parse_mon_capability(self, sn_raw_data, start_pos): + return sffbase.parse(self, self.qsfp_dd_mon_capability, sn_raw_data, start_pos) + + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 0 + PORT_END = 31 + + port_to_i2c_mapping = { + 0: 10, + 1: 11, + 2: 12, + 3: 13, + 4: 14, + 5: 15, + 6: 16, + 7: 17, + 8: 18, + 9: 19, + 10: 20, + 11: 21, + 12: 22, + 13: 23, + 14: 24, + 15: 25, + 16: 26, + 17: 27, + 18: 28, + 19: 29, + 20: 30, + 21: 31, + 22: 32, + 23: 33, + 24: 34, + 25: 35, + 26: 36, + 27: 37, + 28: 38, + 29: 39, + 30: 40, + 31: 41, + } + + _sfp_port = range(32, PORT_END + 1) + RESET_1_16_PATH = "/sys/bus/i2c/devices/0-0061/module_reset_{}" + RESET_17_32_PATH = "/sys/bus/i2c/devices/0-0062/module_reset_{}" + PRS_1_16_PATH = "/sys/bus/i2c/devices/0-0061/module_present_{}" + PRS_17_32_PATH = "/sys/bus/i2c/devices/0-0062/module_present_{}" + + def __init__(self, sfp_index, sfp_type): + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + # Init eeprom path + eeprom_low_path = '/sys/bus/i2c/devices/0-00{}/eeprom_low' + eeprom_0_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg0' + eeprom_1_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg1' + eeprom_2_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg2' + eeprom_3_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg3' + eeprom_11_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg11' + name_path = '/sys/bus/i2c/devices/0-00{}/port_name' + self.port_to_eeprom_low_mapping = {} + self.port_to_eeprom_0_mapping = {} + self.port_to_eeprom_1_mapping = {} + self.port_to_eeprom_2_mapping = {} + self.port_to_eeprom_3_mapping = {} + self.port_to_eeprom_11_mapping = {} + self.port_to_name_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + p_num = x - 1 if self.PORT_START == 1 else x + self.port_to_eeprom_low_mapping[p_num] = eeprom_low_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_0_mapping[p_num] = eeprom_0_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_1_mapping[p_num] = eeprom_1_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_2_mapping[p_num] = eeprom_2_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_3_mapping[p_num] = eeprom_3_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_11_mapping[p_num] = eeprom_11_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_name_mapping[p_num] = name_path.format(self.port_to_i2c_mapping[p_num]) + + self._detect_sfp_type(sfp_type) + self._dom_capability_detect() + SfpBase.__init__(self) + + def reinit(self): + self._detect_sfp_type(self.sfp_type) + self._dom_capability_detect() + + def get_presence(self): + """ + Retrieves the presence of the SFP + Returns: + bool: True if SFP is present, False if not + """ + presence = False + try: + if self.index < 16: + pres_path=self.PRS_1_16_PATH.format(self.port_num) + else: + pres_path=self.PRS_17_32_PATH.format(self.port_num) + with open(pres_path, 'r') as sfp_presence: + presence = int(sfp_presence.read(), 16) + except IOError: + return False + logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) + return presence + + def _read_eeprom_specific_bytes(self, offset, num_bytes, page = 0): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + if offset < 128: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_low_mapping[self.index] + elif page == 0 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_0_mapping[self.index] + offset = offset - 128 + elif page == 1 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_1_mapping[self.index] + offset = offset - 128 + elif page == 2 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_2_mapping[self.index] + offset = offset - 128 + elif page == 3 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_3_mapping[self.index] + offset = offset - 128 + + elif page == 11 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_11_mapping[self.index] + offset = offset - 128 + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_low_mapping[self.index] + offset = offset - 128 + + try: + sysfsfile_eeprom = open(sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + + except BaseException: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def _detect_sfp_type(self, sfp_type): + eeprom_raw = [] + eeprom_raw = self._read_eeprom_specific_bytes(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH) + if eeprom_raw: + if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: + self.sfp_type = QSFP_TYPE + elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: + self.sfp_type = QSFP_DD_TYPE + else: + # we don't regonize this identifier value, treat the xSFP module as the default type + self.sfp_type = sfp_type + logger.log_info("Identifier value of {} module {} is {} which isn't regonized and will be treated as default type ({})".format( + sfp_type, self.index, eeprom_raw[0], sfp_type + )) + else: + # eeprom_raw being None indicates the module is not present. + # in this case we treat it as the default type according to the SKU + self.sfp_type = sfp_type + + def _dom_capability_detect(self): + + self.dom_channel_monitor_supported = True + self.dom_module_monitor_supported = True + self.dom_channel_treshold_supported = True + self.dom_module_treshold_supported = True + + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_bias_supported = False + self.dom_tx_power_supported = False + self.dom_thresholds_supported =False + + + if self.sfp_type == QSFP_TYPE: + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = 128 + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self._read_eeprom_specific_bytes(QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int(qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + self.dom_supported = True + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self._read_eeprom_specific_bytes(QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params(qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability['data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator(qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.qsfp_page3_available = False + + elif self.sfp_type == QSFP_DD_TYPE: + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + + self.dom_temp_supported = True + self.dom_volt_supported = True + + # two types of QSFP-DD cable types supported: Copper and Optical. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes(QSFP_DD_FLAT_MEM['offset'], QSFP_DD_FLAT_MEM['width'], QSFP_DD_FLAT_MEM['page']) + if qsfp_dom_capability_raw is not None: + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if dom_capability['data']['Flat_MEM']['value'] == 'Off': + + ext_dd = ext_qsfp_dd() + mon_sup_raw = self._read_eeprom_specific_bytes(QSFP_DD_MON_SUPPORT['offset'], QSFP_DD_MON_SUPPORT['width'], QSFP_DD_MON_SUPPORT['page']) + mon_sup_data = ext_dd.parse_mon_capability(mon_sup_raw, 0) + + self.dom_thresholds_supported = mon_sup_data['data']['Tx_power_support']['value'] == 'On' + self.dom_rx_power_supported = mon_sup_data['data']['Tx_power_support']['value'] == 'On' + self.dom_tx_power_supported = mon_sup_data['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_bias_supported = mon_sup_data['data']['Tx_bias_support']['value'] == 'On' + #self.dom_temp_supported = mon_sup_data['data']['Temp_support']['value'] == 'On' + #self.dom_volt_supported = mon_sup_data['data']['Voltage_support']['value'] == 'On' + self.dom_supported = True + + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ================================================================================ + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + application_advertisement |1*255VCHAR |supported applications advertisement + ================================================================================ + """ + transceiver_info_dict = {} + compliance_code_dict = {} + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 128 + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) + + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['application_advertisement'] = 'N/A' + + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + sfp_ext_specification_compliance_raw = self._read_eeprom_specific_bytes(offset + XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET, XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH) + if sfp_ext_specification_compliance_raw is not None: + sfp_ext_specification_compliance_data = sfpi_obj.parse_ext_specification_compliance(sfp_ext_specification_compliance_raw[0 : 1], 0) + if sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] != "Unspecified": + compliance_code_dict['Extended Specification compliance'] = sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] + transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) + transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + #QSFP-DD + else: + offset = 128 + + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET_QSFP_DD), XCVR_HW_REV_WIDTH_QSFP_DD) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + else: + return None + + sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) + else: + return None + + sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET_QSFP_DD), XCVR_VENDOR_DATE_WIDTH_QSFP_DD) + if sfp_vendor_date_raw is not None: + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) + else: + return None + + sfp_connector_raw = self._read_eeprom_specific_bytes((offset + XCVR_CONNECTOR_OFFSET_QSFP_DD), XCVR_CONNECTOR_WIDTH_QSFP_DD) + if sfp_connector_raw is not None: + sfp_connector_data = sfpi_obj.parse_connector(sfp_connector_raw, 0) + else: + return None + + sfp_ext_identifier_raw = self._read_eeprom_specific_bytes((offset + XCVR_EXT_TYPE_OFFSET_QSFP_DD), XCVR_EXT_TYPE_WIDTH_QSFP_DD) + if sfp_ext_identifier_raw is not None: + sfp_ext_identifier_data = sfpi_obj.parse_ext_iden(sfp_ext_identifier_raw, 0) + else: + return None + + sfp_cable_len_raw = self._read_eeprom_specific_bytes((offset + XCVR_CABLE_LENGTH_OFFSET_QSFP_DD), XCVR_CABLE_LENGTH_WIDTH_QSFP_DD) + if sfp_cable_len_raw is not None: + sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_cable_len_raw, 0) + else: + return None + + sfp_media_type_raw = self._read_eeprom_specific_bytes(XCVR_MEDIA_TYPE_OFFSET_QSFP_DD, XCVR_MEDIA_TYPE_WIDTH_QSFP_DD) + if sfp_media_type_raw is not None: + sfp_media_type_dict = sfpi_obj.parse_media_type(sfp_media_type_raw, 0) + if sfp_media_type_dict is None: + return None + + host_media_list = "" + sfp_application_type_first_list = self._read_eeprom_specific_bytes((XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD) + possible_application_count = 8 + if sfp_application_type_first_list is not None: + sfp_application_type_list = sfp_application_type_first_list + else: + return None + + for i in range(0, possible_application_count): + if sfp_application_type_list[i * 4] == 'ff': + break + host_electrical, media_interface = sfpi_obj.parse_application(sfp_media_type_dict, sfp_application_type_list[i * 4], sfp_application_type_list[i * 4 + 1]) + host_media_list = host_media_list + host_electrical + ' - ' + media_interface + '\n\t\t\t\t ' + else: + return None + + transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) + transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) + transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) + transceiver_info_dict['hardware_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) + transceiver_info_dict['serial'] = str(sfp_vendor_sn_data['data']['Vendor SN']['value']) + transceiver_info_dict['vendor_oui'] = str(sfp_vendor_oui_data['data']['Vendor OUI']['value']) + transceiver_info_dict['vendor_date'] = str(sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value']) + transceiver_info_dict['connector'] = str(sfp_connector_data['data']['Connector']['value']) + transceiver_info_dict['encoding'] = "Not supported for CMIS cables" + transceiver_info_dict['ext_identifier'] = str(sfp_ext_identifier_data['data']['Extended Identifier']['value']) + transceiver_info_dict['ext_rateselect_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['specification_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['cable_type'] = "Length Cable Assembly(m)" + transceiver_info_dict['cable_length'] = str(sfp_cable_len_data['data']['Length Cable Assembly(m)']['value']) + transceiver_info_dict['nominal_bit_rate'] = "Not supported for CMIS cables" + transceiver_info_dict['application_advertisement'] = host_media_list + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = {} + + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'rx5power', 'rx6power', + 'rx7power', 'rx8power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx5bias', 'tx6bias', + 'tx7bias', 'tx8bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power', + 'tx5power', 'tx6power', + 'tx7power', 'tx8power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) + + + #QSFP-DD + else: + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + + if self.dom_temp_supported: + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_TEMPE_MON['offset'], QSFP_DD_TEMPE_MON['width'], QSFP_DD_TEMPE_MON['page']) + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_VOLT_MON['offset'], QSFP_DD_VOLT_MON['width'], QSFP_DD_VOLT_MON['page']) + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw, 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_MON['offset'], QSFP_DD_CHANNL_MON['width'], QSFP_DD_CHANNL_MON['page']) + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw, 0) + if self.dom_rx_power_supported: + transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] + transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] + transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] + transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] + transceiver_dom_info_dict['tx5power'] = dom_channel_monitor_data['data']['TX5Power']['value'] + transceiver_dom_info_dict['tx6power'] = dom_channel_monitor_data['data']['TX6Power']['value'] + transceiver_dom_info_dict['tx7power'] = dom_channel_monitor_data['data']['TX7Power']['value'] + transceiver_dom_info_dict['tx8power'] = dom_channel_monitor_data['data']['TX8Power']['value'] + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] + transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] + transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] + transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] + transceiver_dom_info_dict['rx5power'] = dom_channel_monitor_data['data']['RX5Power']['value'] + transceiver_dom_info_dict['rx6power'] = dom_channel_monitor_data['data']['RX6Power']['value'] + transceiver_dom_info_dict['rx7power'] = dom_channel_monitor_data['data']['RX7Power']['value'] + transceiver_dom_info_dict['rx8power'] = dom_channel_monitor_data['data']['RX8Power']['value'] + + if self.dom_tx_bias_supported: + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + transceiver_dom_info_dict['tx5bias'] = dom_channel_monitor_data['data']['TX5Bias']['value'] + transceiver_dom_info_dict['tx6bias'] = dom_channel_monitor_data['data']['TX6Bias']['value'] + transceiver_dom_info_dict['tx7bias'] = dom_channel_monitor_data['data']['TX7Bias']['value'] + transceiver_dom_info_dict['tx8bias'] = dom_channel_monitor_data['data']['TX8Bias']['value'] + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = {} + + dom_info_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning' + ] + transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH, 3) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), QSFP_CHANNL_THRESHOLD_WIDTH, 3) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + #QSFP-DD + else: + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + if not self.dom_thresholds_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + # page 02 (we put page 2 to byte 256~384) + dom_module_threshold_raw = self._read_eeprom_specific_bytes(QSFP_DD_MODULE_THRESHOLD['offset'], QSFP_DD_MODULE_THRESHOLD['width'], QSFP_DD_MODULE_THRESHOLD['page']) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TxPowerLowWarning']['value'] + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + if not self.dom_supported: + return None + + rx_los_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + + #QSFP-DD + else: + # page 11h (we put page 2 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: #not implement + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_RX_LOS_STATUS['offset'], QSFP_DD_CHANNL_RX_LOS_STATUS['width'], QSFP_DD_CHANNL_RX_LOS_STATUS['page']) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 8) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + rx_los_list.append(rx_los_data & 0x10 != 0) + rx_los_list.append(rx_los_data & 0x20 != 0) + rx_los_list.append(rx_los_data & 0x40 != 0) + rx_los_list.append(rx_los_data & 0x80 != 0) + + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + if not self.dom_supported: + return None + + tx_fault_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + + #QSFP-DD + else: + return None + + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + + for QSFP, the disable states of each channel which are the lower 4 bits in byte 85 page a0 + for SFP, the TX Disable State and Soft TX Disable Select is ORed as the tx_disable status returned + These two bits are bit 7 & 6 in byte 110 page a2 respectively + """ + if not self.dom_supported: + return None + + tx_disable_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + + #QSFP-DD + else: + if self.dom_rx_tx_power_bias_supported: #not implement + # page 11h (we put page 1 to byte 384~512) + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_DISABLE_STATUS['offset'], QSFP_DD_CHANNL_DISABLE_STATUS['width'], QSFP_DD_CHANNL_DISABLE_STATUS['page']) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + tx_disable_list.append(tx_disable_data & 0x10 != 0) + tx_disable_list.append(tx_disable_data & 0x20 != 0) + tx_disable_list.append(tx_disable_data & 0x40 != 0) + tx_disable_list.append(tx_disable_data & 0x80 != 0) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return 0 + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + if not self.dom_supported: + return None + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + else: + return None + else: + return None + + #QSFP-DD + else: + + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes(QSFP_DD_TEMPE_MON['offset'], QSFP_DD_TEMPE_MON['width'], QSFP_DD_TEMPE_MON['page']) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + return None + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + if not self.dom_supported: + return None + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + else: + return None + return None + + #QSFP-DD + else: + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes(QSFP_DD_VOLT_MON['offset'], QSFP_DD_VOLT_MON['width'], QSFP_DD_VOLT_MON['page']) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + return None + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Bias']['value'])) + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if dom_tx_bias_power_supported: + dom_tx_bias_raw = self._read_eeprom_specific_bytes(QSFP_DD_TX_BIAS['offset'], QSFP_DD_TX_BIAS['width'], QSFP_DD_TX_BIAS['page']) + if dom_tx_bias_raw is not None: + dom_tx_bias_data = sfpd_obj.parse_dom_tx_bias(dom_tx_bias_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX4Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX5Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX6Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX7Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX8Bias']['value'])) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + elif self.sfp_type == QSFP_DD_TYPE: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_rx_power_raw = self._read_eeprom_specific_bytes(QSFP_DD_RX_POWER['offset'], QSFP_DD_RX_POWER['width'], QSFP_DD_RX_POWER['page']) + if dom_rx_power_raw is not None: + dom_rx_power_data = sfpd_obj.parse_dom_rx_power(dom_rx_power_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX4Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX5Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX6Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX7Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX8Power']['value'])) + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_tx_power_raw = self._read_eeprom_specific_bytes(QSFP_DD_TX_POWER['offset'], QSFP_DD_TX_POWER['width'], QSFP_DD_TX_POWER['page']) + if dom_tx_power_raw is not None: + dom_tx_power_data = sfpd_obj.parse_dom_tx_power(dom_tx_power_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX4Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX5Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX6Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX7Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX8Power']['value'])) + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + # SFP doesn't support this feature + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + try: + with open(self.port_to_name_mapping[self.index], 'r') as sfp_name: + name=sfp_name.read() + except IOError: + name="Unknown" + + return name + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("serial", "N/A") + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py new file mode 100644 index 000000000000..f45d930e87f5 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python + +############################################################################# +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + SYSFS_THERMAL_DIR = ["/sys/bus/i2c/devices/0-004f/", + "/sys/bus/i2c/devices/0-0049/", + "/sys/bus/i2c/devices/0-004a/", + "/sys/bus/i2c/devices/0-004b/", + "/sys/bus/i2c/devices/0-004c/", + "/sys/bus/i2c/devices/0-004d/", + "/sys/bus/i2c/devices/0-004e/"] + + def __init__(self, thermal_index): + self.index = thermal_index + + # Add thermal name + self.THERMAL_NAME_LIST.append("Top-Rear") + self.THERMAL_NAME_LIST.append("Top-Front") + self.THERMAL_NAME_LIST.append("Right-Front") + self.THERMAL_NAME_LIST.append("Top-Center") + self.THERMAL_NAME_LIST.append("Left-Front") + self.THERMAL_NAME_LIST.append("Bottom-Front") + self.THERMAL_NAME_LIST.append("Bottom-Rear") + ThermalBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __get_temp(self, temp_file): + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) + raw_temp = self.__read_txt_file(temp_file_path) + temp = float(raw_temp)/1000 + return "{:.3f}".format(temp) + + def __set_threshold(self, file_name, temperature): + temp_file_path = os.path.join(self.hwmon_path, file_name) + try: + with open(temp_file_path, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError: + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_file = "temp1_input" + return float(self.__get_temp(temp_file)) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + :return: A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(9) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + :return: A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(7) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.index==0: + return int(56) + elif self.index==1: + return int(74) + elif self.index==2: + return int(55) + elif self.index==3: + return int(74) + elif self.index==4: + return int(55) + elif self.index==5: + return int(74) + else: + return int(56) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + :return: A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.index==0: + return int(58) + elif self.index==1: + return int(76) + elif self.index==2: + return int(57) + elif self.index==3: + return int(76) + elif self.index==4: + return int(57) + elif self.index==5: + return int(76) + else: + return int(58) + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + temp_file = "temp1_input" + temp_file_path = os.path.join(self.hwmon_path, temp_file) + return os.path.isfile(temp_file_path) + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + + return True + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py new file mode 100644 index 000000000000..820dd54f954a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +######################################################################## +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + print("INFO: Watchdog __init__") + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + print("ERROR: Platform did not implement arm()") + raise NotImplementedError + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + print("ERROR: Platform did not implement disarm()") + raise NotImplementedError + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + print("ERROR: Platform did not implement is_armed()") + raise NotImplementedError + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + S5232 doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + print("ERROR: Platform did not implement get_remaining_time()") + raise NotImplementedError diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led new file mode 100644 index 000000000000..9cf2b7adc1ef --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led @@ -0,0 +1,4 @@ +#!/bin/bash +sudo ipmitool raw 0x06 0x52 0x05 192 0 0x49 0 2>>/dev/null +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld new file mode 100644 index 000000000000..ce5a3dd0092a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld @@ -0,0 +1,4 @@ +#!/bin/bash +sudo ipmitool raw 0x30 0x91 0xff 0xff 0xff 0xff +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync new file mode 100644 index 000000000000..9c357e7ac7e8 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync @@ -0,0 +1,7 @@ +#!/bin/bash +/usr/local/bin/sonic-fanthrml-monitor & +/usr/local/bin/sonic-led-monitor & +/usr/local/bin/sonic-qsfp-monitor & +/usr/local/bin/sonic-psu-monitor & +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor new file mode 100644 index 000000000000..4dcf00781f5d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor @@ -0,0 +1,354 @@ +#!/bin/bash + +debug_flag=0 + +ipmi_val=0 +ctrl_mode_val=0 +fan_pwm_val=0 +fan_rpm_val=0 + +bmc_sensor_read() +{ + ipmi_val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + return 0 + fi + + return 1 +} + +#$1=get(0)/set(1), $2=ctrl_mode(1:manual, 0:auto) +#get rtn: ctrl_mode_val, fan_pwm_val +bmc_fan_speed_ctrl() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage ];then + if [ $1 -eq 1 ];then + #Set Fan Speed Control + if [ $2 -eq 0 ];then + ipmitool raw 0x30 0x20 0x0 0x0 1>/dev/null 2>/dev/null + else + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage | awk '{printf $1}') + fan_pwm_input=$( printf "%d" 0x$fan_pwm_input ) + ipmitool raw 0x30 0x20 0x1 $fan_pwm_input 1>/dev/null 2>/dev/null + fi + else + #Get Fan Speed Control + ctrl_mode_val=$(echo $ipmi_val | awk '{printf $1}') + fan_pwm_val=$(echo $ipmi_val | awk '{printf $2}') + ctrl_mode_val=$( printf "%d" 0x$ctrl_mode_val ) + fan_pwm_val=$( printf "%d" 0x$fan_pwm_val ) + echo $fan_pwm_val > /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage + fi + fi +} + +bmc_fan_presence() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_presence ];then + fan_pre_val=$(echo $ipmi_val | awk '{printf $44}') + fan_pre_val=$( printf "%d" 0x$fan_pre_val ) + for i in $(seq 0 6); + do + tmp=$((1 << $i)) + tmp1=$(($fan_pre_val & $tmp)) + if [ $tmp1 -eq 0 ];then + if [ $i == 0 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan1_presence + elif [ $i == 1 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan2_presence + elif [ $i == 2 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan3_presence + elif [ $i == 3 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan4_presence + elif [ $i == 4 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan5_presence + elif [ $i == 5 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan6_presence + else + echo 1 > /sys/bus/i2c/devices/0-0066/fan7_presence + fi + else + if [ $i == 0 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan1_presence + elif [ $i == 1 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan2_presence + elif [ $i == 2 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan3_presence + elif [ $i == 3 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan4_presence + elif [ $i == 4 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan5_presence + elif [ $i == 5 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan6_presence + else + echo 0 > /sys/bus/i2c/devices/0-0066/fan7_presence + fi + fi + done + fi +} + +bmc_fan_enable() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_enable ];then + fan_en_val=$(echo $ipmi_val | awk '{printf $45}') + fan_en_val=$( printf "%d" 0x$fan_en_val ) + for i in $(seq 0 6); + do + tmp=$((1 << $i)) + tmp1=$(($fan_en_val & $tmp)) + if [ $tmp1 -ne 0 ];then + if [ $i == 0 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan1_enable + elif [ $i == 1 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan2_enable + elif [ $i == 2 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan3_enable + elif [ $i == 3 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan4_enable + elif [ $i == 4 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan5_enable + elif [ $i == 5 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan6_enable + else + echo 1 > /sys/bus/i2c/devices/0-0066/fan7_enable + fi + else + if [ $i == 0 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan1_enable + elif [ $i == 1 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan2_enable + elif [ $i == 2 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan3_enable + elif [ $i == 3 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan4_enable + elif [ $i == 4 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan5_enable + elif [ $i == 5 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan6_enable + else + echo 0 > /sys/bus/i2c/devices/0-0066/fan7_enable + fi + fi + done + fi +} + +bmc_fan_speed_rpm() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_front_speed_rpm ];then + #fan1 front + hi_byte=$(echo $ipmi_val | awk '{printf $1}') + lo_byte=$(echo $ipmi_val | awk '{printf $2}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan1_front_speed_rpm + + #fan1 rear + hi_byte=$(echo $ipmi_val | awk '{printf $15}') + lo_byte=$(echo $ipmi_val | awk '{printf $16}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan1_rear_speed_rpm + + #fan2 front + hi_byte=$(echo $ipmi_val | awk '{printf $3}') + lo_byte=$(echo $ipmi_val | awk '{printf $4}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan2_front_speed_rpm + + #fan2 rear + hi_byte=$(echo $ipmi_val | awk '{printf $17}') + lo_byte=$(echo $ipmi_val | awk '{printf $18}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan2_rear_speed_rpm + + #fan3 front + hi_byte=$(echo $ipmi_val | awk '{printf $5}') + lo_byte=$(echo $ipmi_val | awk '{printf $6}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan3_front_speed_rpm + + #fan3 rear + hi_byte=$(echo $ipmi_val | awk '{printf $19}') + lo_byte=$(echo $ipmi_val | awk '{printf $20}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan3_rear_speed_rpm + + #fan4 front + hi_byte=$(echo $ipmi_val | awk '{printf $7}') + lo_byte=$(echo $ipmi_val | awk '{printf $8}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan4_front_speed_rpm + + #fan4 rear + hi_byte=$(echo $ipmi_val | awk '{printf $21}') + lo_byte=$(echo $ipmi_val | awk '{printf $22}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan4_rear_speed_rpm + + #fan5 front + hi_byte=$(echo $ipmi_val | awk '{printf $9}') + lo_byte=$(echo $ipmi_val | awk '{printf $10}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan5_front_speed_rpm + + #fan5 rear + hi_byte=$(echo $ipmi_val | awk '{printf $23}') + lo_byte=$(echo $ipmi_val | awk '{printf $24}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan5_rear_speed_rpm + + #fan6 front + hi_byte=$(echo $ipmi_val | awk '{printf $11}') + lo_byte=$(echo $ipmi_val | awk '{printf $12}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan6_front_speed_rpm + + #fan6 rear + hi_byte=$(echo $ipmi_val | awk '{printf $25}') + lo_byte=$(echo $ipmi_val | awk '{printf $26}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan6_rear_speed_rpm + + #fan7 front + hi_byte=$(echo $ipmi_val | awk '{printf $13}') + lo_byte=$(echo $ipmi_val | awk '{printf $14}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan7_front_speed_rpm + + #fan7 rear + hi_byte=$(echo $ipmi_val | awk '{printf $27}') + lo_byte=$(echo $ipmi_val | awk '{printf $28}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan7_rear_speed_rpm + fi +} + +do_fan_update() +{ + #fan presence + bmc_fan_presence + + #fan enable + bmc_fan_enable + + #fan speed rpm + bmc_fan_speed_rpm + + if [ $debug_flag -eq 0 ];then + #Get Fan RPM + bmc_fan_speed_ctrl 0 + else + bmc_fan_speed_ctrl 1 1 + fi +} + +do_thermal_update() +{ + if [ -e /sys/bus/i2c/devices/0-004f/temp1_input ];then + #lm75_1 + thermal_val=$(echo $ipmi_val | awk '{printf $29}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_input + + #lm75_2 + thermal_val=$(echo $ipmi_val | awk '{printf $30}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_input + + #lm75_3 + thermal_val=$(echo $ipmi_val | awk '{printf $31}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_input + + #lm75_4 + thermal_val=$(echo $ipmi_val | awk '{printf $32}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_input + + #lm75_5 + thermal_val=$(echo $ipmi_val | awk '{printf $32}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_input + + #lm75_6 + thermal_val=$(echo $ipmi_val | awk '{printf $33}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_input + + #lm75_7 + thermal_val=$(echo $ipmi_val | awk '{printf $34}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004e/temp1_input + fi +} + +FAN_Thermal_monitor() +{ + if [ $debug_flag -eq 1 ];then + fan_pwm_input=100 + echo $fan_pwm_input > /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage + fi + + while true + do + #get bmc sensor value + bmc_sensor_read + if [ $? -eq 0 ];then + do_fan_update + do_thermal_update + fi + + sleep 1 + done +} + +FAN_Thermal_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor new file mode 100644 index 000000000000..ba4f4c8dae99 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor @@ -0,0 +1,201 @@ +#!/bin/bash + +#0=off, 1=green, 2=amber, 3=blk_green +led_state=0 + +#$1=led_no(1=loc, 2=diag, 3=fan, 4=psu1, 5=psu2) +bmc_led_read() +{ + led_state=0 + rtn_state=0 + val=$(ipmitool raw 0x30 0x97 2>>/dev/null) + if [ $? -eq 0 ];then + if [ $1 -eq 1 ];then + rtn_state=$(echo $val | awk '{printf $1}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=2 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=3 + return 1 + fi + + tmp=$(($rtn_state & 4)) + if [ $tmp -eq 4 ];then + led_state=1 + return 1 + fi + + elif [ $1 -eq 2 ];then + rtn_state=$(echo $val | awk '{printf $2}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=2 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=3 + return 1 + fi + + tmp=$(($rtn_state & 4)) + if [ $tmp -eq 4 ];then + led_state=1 + return 1 + fi + + elif [ $1 -eq 3 ];then + rtn_state=$(echo $val | awk '{printf $3}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + elif [ $1 -eq 4 ];then + rtn_state=$(echo $val | awk '{printf $4}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + else + rtn_state=$(echo $val | awk '{printf $5}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + fi + fi + + return 0 +} + +#$1=led_no(1=loc, 2=diag, 3=fan, 4=psu1, 5=psu2) +#$2=led_val(0=off, 1=green, 2=amber, 3=blk_green) +bmc_led_write() +{ + led_val=$2 + val=$(ipmitool raw 0x30 0x97 2>>/dev/null) + loc_val=$(echo $val | awk '{printf $1}') + diag_val=$(echo $val | awk '{printf $2}') + fan_val=$(echo $val | awk '{printf $3}') + psu1_val=$(echo $val | awk '{printf $4}') + psu2_val=$(echo $val | awk '{printf $5}') + + loc_val=$( printf "%d" 0x$loc_val ) + diag_val=$( printf "%d" 0x$diag_val ) + fan_val=$( printf "%d" 0x$fan_val ) + psu1_val=$( printf "%d" 0x$psu1_val ) + psu2_val=$( printf "%d" 0x$psu2_val ) + + if [ $1 -eq 1 ];then + loc_val=$(($loc_val & $led_val)) + elif [ $1 -eq 2 ];then + diag_val=$(($diag_val & $led_val)) + elif [ $1 -eq 3 ];then + fan_val=$(($fan_val & $led_val)) + elif [ $1 -eq 4 ];then + psu1_val=$(($psu1_val & $led_val)) + else + psu2_val=$(($psu2_val & $led_val)) + fi + + ipmitool raw 0x30 0x96 $loc_val $diag_val $fan_val $psu1_val $psu2_val 1>>/dev/null 2>>/dev/null +} + +LED_monitor() +{ + local loc_state=0 + #default set loc led to off + echo $loc_state > /sys/bus/i2c/devices/0-0060/sys_led_loc + + while true + do + if [ -e /sys/bus/i2c/devices/0-0060/sys_led_diag ];then + loc_state=$(cat /sys/bus/i2c/devices/0-0060/sys_led_loc | awk '{printf $1}') + bmc_led_write 1 $loc_state + + bmc_led_read 2 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_diag + fi + + bmc_led_read 3 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_fan + fi + + bmc_led_read 4 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_psu1 + fi + + bmc_led_read 5 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_psu2 + fi + fi + + sleep 1 + done +} + +LED_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor new file mode 100644 index 000000000000..bcb3502e4a7c --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor @@ -0,0 +1,328 @@ +#!/bin/bash + +result=0 +debug_flag=0 +bmc_fan_duty_cycle_ctrl() +{ + #control PSU 1 + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-005a/psu_fan1_duty_cycle | awk '{print $1}') + lo_byte_1= $((fan_pwm_input & 0xff)) + hi_byte_1= $((fan_pwm_input >> 8)) + + #control PSU 2 + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0059/psu_fan1_duty_cycle | awk '{print $1}') + lo_byte_2= $((fan_pwm_input & 0xff)) + hi_byte_2= $((fan_pwm_input >> 8)) + + + ipmitool raw 0x30 0x95 hi_byte_1 lo_byte_1 hi_byte_2 lo_byte_2 + + return 1 +} +byte_read(){ + data=$(echo $val | awk '{print $'"$1"'}') + data=$(printf "%d" 0x$data) + Value=$data + return 1 + +} +add_byte(){ + hi_byte=$(echo $val | awk '{print $'"$1"'}') + lo_byte=$(echo $val | awk '{print $'"$2"'}') + hi_byte=$(printf "%d" 0x$hi_byte) + lo_byte=$(printf "%d" 0x$lo_byte) + ((hi_byte <<= 8)) + Value=$(($lo_byte+$hi_byte)) + return 1 +} +# string_read [start byte] [length] +string_read(){ + Value="" + seqnum=$(($1+$2-1)) + for i in $(seq $1 $seqnum) + do + data=$(echo $val | awk '{print $'"$i"'}') + data=$(printf "%d" 0x$data) + if [ $data -ne 0 ];then + Value=$Value$(printf "$(printf '\\x%x' $data)") + else + data=0x20 + Value=$Value$(printf "$(printf '\\x%x' $data)") + fi + done + return 1 +} +#$1=dev_addr, $2=reg, $3=val +get_PSU_information() +{ + val=$(ipmitool raw 0x30 0x93 2>>/dev/null) + ##################################################################################### + # BMC_command content resultfile algorithm # + # 93 2:5 vin 5a/59 psu_v_in LINEAR_11 # + # 93 6:9 vout 5a/59 psu_v_out LINEAR_16 # + # 93 10:13 Iin 5a/59 psu_i_in LINEAR_11 # + # 93 14:17 Iout 5a/59 psu_i_out LINEAR_11 # + # 93 18:21 Pin 5a/59 psu_p_in LINEAR_11 # + # 93 22:25 Pout 5a/59 psu_p_out LINEAR_11 # + # 93 26:27 temp1 5a/59 psu_temp1_input # + # 93 28:29 temp2 DISCARD # + # 93 30:31 temp3 DISCARD # + # 93 32:33 fan_fault 5a/59 psu_fan1_fault # + # 93 34:37 fan_command 5a/59 psu_fan1_duty_cycle # + # 93 38:41 fan_speed 5a/59 psu_fan1_speed_rpm LINEAR_11 # + # 93 42:43 psu_present 52/51 psu_present # + # 93 44:45 power_good 52/51 psu_power_good # + # 94 2:23 mfr_ID 5a/59 psu_mfr_id # + # 94 24:45 mfr_model 5a/59 psu_mfr_model # + # 94 46:49 mfr_rev 5a/59 psu_mfr_revision # + # 94 50:97 mfr_serial 5a/59 psu_mfr_serial # + # TBD pmbus_rev. 5a/59 psu_pmbus_revision # + # 98 2:21 psu_model_name 52/51 psu_model_name # + # 98 22:59 psu_serial 52/51 psu_serial_number # + ##################################################################################### +#_______________________with _LINEAR11&16 VIN IIN IOUT PIN POUT FAN_SPEED with _LINEAR16 VOUT + if [ -e /sys/bus/i2c/devices/0-005a/psu_mfr_id ] && [ -e /sys/bus/i2c/devices/0-0059/psu_mfr_id ];then + #PSU1 Vin + add_byte 1 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_in + fi + #PSU2 Vin + add_byte 3 4 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_in + fi + #PSU 1 Vout + add_byte 5 6 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_out + fi + #PSU 2 Vout + add_byte 7 8 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_out + fi + #PSU 1 Iin + add_byte 9 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_in + fi + #PSU 2 Iin + add_byte 11 12 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_in + fi + #PSU 1 Iout + add_byte 13 14 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_out + fi + #PSU 2 Iout + add_byte 15 16 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_out + fi + #PSU 1 Pin + add_byte 17 18 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_in + fi + #PSU 2 Pin + add_byte 19 20 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_in + fi + #PSU 1 Pout + add_byte 21 22 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_out + fi + #PSU 2 Pout + add_byte 23 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_out + fi + #PSU 1 Fan speed + add_byte 37 38 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_speed_rpm + fi + #PSU 2 Fan speed + add_byte 39 40 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_speed_rpm + fi +#_______________________with _LINEAR11&16 VIN IIN IOUT PIN POUT FAN_SPEED with _LINEAR16 VOUT +#----------------93->/58/59----psu_fan1_fault psu_temp1_input psu_fan1_duty_cycle + #PSU 1 Temp1 + byte_read 25 + echo $Value > /sys/bus/i2c/devices/0-005a/psu_temp1_input + #PSU 2 Temp1 + byte_read 26 + echo $Value > /sys/bus/i2c/devices/0-0059/psu_temp1_input + if [ $debug_flag -eq 0 ];then + #PSU 1 Fan command + add_byte 33 34 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_duty_cycle + fi + #PSU 2 Fan command + add_byte 35 36 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_duty_cycle + fi + fi + #PSU 1 2 Fan status check fault(0x81,bit 7, 0 for ignormal) + byte_read 31 + ((Value >>= 7)) + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_fault + + #PSU 2 Fan status check fault(0x81,bit 7, 0 for ignormal) + byte_read 32 + ((Value >>= 7)) + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_fault + fi + +#____________________________________ +#----------------93->/50/51 + if [ -e /sys/bus/i2c/devices/0-0051/psu_serial_number ] && [ -e /sys/bus/i2c/devices/0-0052/psu_serial_number ];then + #PSU 1 2 PSU present + byte_read 41 + if [ $Value -eq 0 ];then + Value=1 + else + Value=0 + fi + echo $Value > /sys/bus/i2c/devices/0-0052/psu_present + + byte_read 42 + if [ $Value -eq 0 ];then + Value=1 + else + Value=0 + fi + echo $Value > /sys/bus/i2c/devices/0-0051/psu_present + #PSU 1 2 PSU power good + byte_read 43 + echo $Value > /sys/bus/i2c/devices/0-0052/psu_power_good + + byte_read 44 + echo $Value > /sys/bus/i2c/devices/0-0051/psu_power_good + fi +#____________________________________________________________________________ + + val=$(ipmitool raw 0x30 0x94 2>>/dev/null) +#----------------94->/58/59 + if [ -e /sys/bus/i2c/devices/0-005a/psu_mfr_id ] && [ -e /sys/bus/i2c/devices/0-0059/psu_mfr_id ];then + #PSU1 mfr_ID + string_read 1 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_id + fi + #PSU2 mfr_ID + string_read 12 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_id + fi + #PSU1 mfr_model + string_read 23 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_model + fi + #PSU2 mfr_model + string_read 34 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_model + fi + #PSU1 mfr_revision + string_read 45 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_revision + fi + #PSU2 mfr_revision + string_read 47 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_revision + fi + #PSU1 mfr_serial + string_read 49 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_serial + fi + #PSU1 mfr_serial + string_read 73 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_serial + fi + fi +#____________________________________________________________________________ +#----------------98->/50/51 + val=$(ipmitool raw 0x30 0x98 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-0051/psu_serial_number ] && [ -e /sys/bus/i2c/devices/0-0052/psu_serial_number ];then + #PSU 1 psu_model_name + string_read 1 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0052/psu_model_name + fi + if [ "$(echo $Value |cut -c 5)" == 8 ];then #"082" for f2b "095" for b2f + echo 0 > /sys/bus/i2c/devices/0-0052/psu_fan_dir + else + echo 1 > /sys/bus/i2c/devices/0-0052/psu_fan_dir + fi + #PSU 2 psu_model_name + string_read 11 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0051/psu_model_name + fi + if [ "$(echo $Value |cut -c 5)" == 8 ];then #"082" for f2b "095" for b2f + echo 0 > /sys/bus/i2c/devices/0-0051/psu_fan_dir + else + echo 1 > /sys/bus/i2c/devices/0-0051/psu_fan_dir + fi + if [ $(cat /sys/bus/i2c/devices/0-0052/psu_present) -eq 1 ];then + fan_dir=$(cat /sys/bus/i2c/devices/0-0052/psu_fan_dir) + else + fan_dir=$(cat /sys/bus/i2c/devices/0-0051/psu_fan_dir) + fi + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan1_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan2_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan3_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan4_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan5_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan6_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan7_direction + #PSU 1 psu_serial_number + string_read 21 19 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0052/psu_serial_number + fi + #PSU 2 psu_serial_number + string_read 40 19 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0051/psu_serial_number + fi + fi + + +#_____________________________________________ + +} + +#$1=dev_addr, $2=reg, $3=len + +PSU_monitor() +{ + + while true + do + + get_PSU_information + if [ $debug_flag -eq 1 ];then + bmc_fan_speed_ctrl + fi + + sleep 1 + done +} + +PSU_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor new file mode 100644 index 000000000000..1f4ca1d3fe54 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor @@ -0,0 +1,399 @@ +#!/bin/bash + +debug_flag=0 +port_map=('00' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29' '30' '31' '32' '33' '34' '35' '36' '37' '38' '39' '40' '41') +port_1_8_presence=0 +port_9_16_presence=0 +port_17_24_presence=0 +port_25_32_presence=0 +port_1_8_reset=0 +port_9_16_reset=0 +port_17_24_reset=0 +port_25_32_reset=0 + +result=0 + +#$1=dev_addr, $2=reg, $3=val +bmc_write() +{ + addr_8b=$(echo $(($1)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x06 0x52 0x05 $addr_8b 0 $2 $3 1>>/dev/null 2>>/dev/null +} + +#$1=dev_addr, $2=reg, $3=len +bmc_read() +{ + addr_8b=$(echo $(($1)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + val=$(ipmitool raw 0x06 0x52 0x05 $addr_8b $3 $2 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + return 1 + else + return 0 + fi +} + +bmc_qsfp_presence_read() +{ + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + port_1_8_presence=$(echo $val | awk '{printf $36}') + port_9_16_presence=$(echo $val | awk '{printf $37}') + port_17_24_presence=$(echo $val | awk '{printf $40}') + port_25_32_presence=$(echo $val | awk '{printf $41}') + + port_1_8_presence=$( printf "%d" 0x$port_1_8_presence ) + port_9_16_presence=$( printf "%d" 0x$port_9_16_presence ) + port_17_24_presence=$( printf "%d" 0x$port_17_24_presence ) + port_25_32_presence=$( printf "%d" 0x$port_25_32_presence ) + return 1 + fi + + return 0 +} + +bmc_qsfp_reset_read() +{ + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + port_1_8_reset=$(echo $val | awk '{printf $38}') + port_9_16_reset=$(echo $val | awk '{printf $39}') + port_17_24_reset=$(echo $val | awk '{printf $42}') + port_25_32_reset=$(echo $val | awk '{printf $43}') + + port_1_8_reset=$( printf "%d" 0x$port_1_8_reset ) + port_9_16_reset=$( printf "%d" 0x$port_9_16_reset ) + port_17_24_reset=$( printf "%d" 0x$port_17_24_reset ) + port_25_32_reset=$( printf "%d" 0x$port_25_32_reset ) + return 1 + fi + + return 0 +} + +#$1=port_no +bmc_qsfp_reset_write() +{ + local port=$1 + + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + ori_1_8_reset=$(echo $val | awk '{printf $38}') + ori_9_16_reset=$(echo $val | awk '{printf $39}') + ori_17_24_reset=$(echo $val | awk '{printf $42}') + ori_25_32_reset=$(echo $val | awk '{printf $43}') + + ori_1_8_reset=$( printf "%d" 0x$ori_1_8_reset ) + ori_9_16_reset=$( printf "%d" 0x$ori_9_16_reset ) + ori_17_24_reset=$( printf "%d" 0x$ori_17_24_reset ) + ori_25_32_reset=$( printf "%d" 0x$ori_25_32_reset ) + else + return 0 + fi + + port=`expr $port - 1` + port_blk=0 + port_blk=`expr $port / 8` + bit_idx=`expr $port % 8` + bit_idx=$((1<<$bit_idx)) + + if [ $port_blk -eq 1 ];then + tmp_1_8_reset=$(($ori_1_8_reset ^ $bit_idx)) + elif [ $port_blk -eq 2 ];then + tmp_9_16_reset=$(($ori_9_16_reset ^ $bit_idx)) + elif [ $port_blk -eq 3 ];then + tmp_17_24_reset=$(($ori_17_24_reset ^ $bit_idx)) + else + tmp_25_32_reset=$(($ori_25_32_reset ^ $bit_idx)) + fi + + #set to reset state + ipmitool raw 0x30 0x91 $tmp_1_8_reset $tmp_9_16_reset $tmp_17_24_reset $tmp_25_32_reset 1>>/dev/null 2>>/dev/null + + #set back to normal state + ipmitool raw 0x30 0x91 $ori_1_8_reset $ori_9_16_reset $ori_17_24_reset $ori_25_32_reset 1>>/dev/null 2>>/dev/null +} + +#$1=port_no +bmc_qsfp_eeprom_read() +{ + local port=$1 + local eeprom_low + local eeprom_pg0 + local eeprom_pg2 + local eeprom_pg3 + local eeprom_pg11 + + port=`expr $port - 1` + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + $((0x72))` + ch=`expr $port % 8` + ch=$((1<<$ch)) + + bmc_write $i2cmux_dev 0x00 $ch + + bmc_write 0x50 0x7f 0x00 + #QSFP-DD low page + bmc_read 0x50 0 128 + if [ $? -eq 1 ];then + eeprom_low=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page0 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg0=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page1 + bmc_write 0x50 0x7f 0x01 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg1=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page2 + bmc_write 0x50 0x7f 0x02 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg2=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page3 + bmc_write 0x50 0x7f 0x03 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg3=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page11 + bmc_write 0x50 0x7f 0x11 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg11=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + sfp_type=$(echo $eeprom_low | awk '{printf $1}') + sfp_type=$( printf "%d" 0x$sfp_type ) + + #get temperature + temp=$(echo $eeprom_low | awk '{printf $15}') + if [ $temp != "" ];then + temp=$( printf "%d" 0x$temp ) + temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp" + echo $temp > $temp_path + fi + + #get lp_mode + lpmod_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/lp_mode" + if [ $sfp_type -eq 24 ];then + lpmod=$(echo $eeprom_low | awk '{printf $27}') + if [ $lpmod != "" ];then + state=$((lpmod&0x10)) + if [ $state -eq 16 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + elif [ $sfp_type -eq 17 ];then + lpmod=$(echo $eeprom_low | awk '{printf $93}') + if [ $lpmod != "" ];then + state=$((lpmod&0x02)) + if [ $state -eq 2 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + else + lpmod="" + fi + + eeprom_low=$(echo $eeprom_low | sed 's/[[:space:]]//g') + eeprom_pg0=$(echo $eeprom_pg0 | sed 's/[[:space:]]//g') + eeprom_pg1=$(echo $eeprom_pg1 | sed 's/[[:space:]]//g') + eeprom_pg2=$(echo $eeprom_pg2 | sed 's/[[:space:]]//g') + eeprom_pg3=$(echo $eeprom_pg3 | sed 's/[[:space:]]//g') + eeprom_pg11=$(echo $eeprom_pg11 | sed 's/[[:space:]]//g') + + if [ $debug_flag -eq 0 ];then + eeprom_low_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_low" + eeprom_low=$(echo $eeprom_low | sed -e 's/ //g') + echo $eeprom_low > $eeprom_low_path + eeprom_pg0_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg0" + eeprom_pg0=$(echo $eeprom_pg0 | sed -e 's/ //g') + echo $eeprom_pg0 > $eeprom_pg0_path + eeprom_pg1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg1" + eeprom_pg1=$(echo $eeprom_pg1 | sed -e 's/ //g') + echo $eeprom_pg1 > $eeprom_pg1_path + eeprom_pg2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg2" + eeprom_pg2=$(echo $eeprom_pg2 | sed -e 's/ //g') + echo $eeprom_pg2 > $eeprom_pg2_path + eeprom_pg3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg3" + eeprom_pg3=$(echo $eeprom_pg3 | sed -e 's/ //g') + echo $eeprom_pg3 > $eeprom_pg3_path + eeprom_pg11_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg11" + eeprom_pg11=$(echo $eeprom_pg11 | sed -e 's/ //g') + echo $eeprom_pg11 > $eeprom_pg11_path + else + printf "\nPort %d EEPROM:" $1 + printf "\nLow--------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_low:0:2} + eeprom_low=$(echo $eeprom_low | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page0------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg0:0:2} + eeprom_pg0=$(echo $eeprom_pg0 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page1------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg1:0:2} + eeprom_pg0=$(echo $eeprom_pg1 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page2------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg2:0:2} + eeprom_pg2=$(echo $eeprom_pg2 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page3------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg3:0:2} + eeprom_pg3=$(echo $eeprom_pg3 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page11-----------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg11:0:2} + eeprom_pg11=$(echo $eeprom_pg11 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + fi + + bmc_write $i2cmux_dev 0x00 0x0 + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_clear() +{ + eeprom_low_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_low" + echo "" > $eeprom_low_path + eeprom_pg0_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg0" + echo "" > $eeprom_pg0_path + eeprom_pg1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg1" + echo "" > $eeprom_pg1_path + eeprom_pg2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg2" + echo "" > $eeprom_pg2_path + eeprom_pg3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg3" + echo "" > $eeprom_pg3_path + eeprom_pg11_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg11" + echo "" > $eeprom_pg11_path +} + +QSFP_monitor() +{ + while true + do + if [ -e /sys/bus/i2c/devices/0-0061/module_present_1 ] && [ -e /sys/bus/i2c/devices/0-0062/module_present_32 ] && [ -e /sys/bus/i2c/devices/0-0041/eeprom_low ];then + bmc_qsfp_presence_read + mod_presence=$((port_25_32_presence<<8)) + mod_presence=`expr $mod_presence + $port_17_24_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_9_16_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_1_8_presence` + + for i in $(seq 1 32); + do + idx=`expr $i - 1` + check_bit=$((1<<$idx)) + is_presence=$(($mod_presence & $check_bit)) + if [ $i -le 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0061/" + else + cpld_path="/sys/bus/i2c/devices/0-0062/" + fi + + if [ $is_presence -eq 0 ];then + bmc_qsfp_eeprom_read $i + if [ $? -eq 0 ];then + echo 1 > $cpld_path"module_present_"$i + fi + else + echo 0 > $cpld_path"module_present_"$i + bmc_qsfp_eeprom_clear $i + fi + done + sleep 5 + else + sleep 1 + fi + done +} + +QSFP_monitor + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py new file mode 100644 index 000000000000..46121e6e7eed --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py @@ -0,0 +1,442 @@ +#!/usr/bin/env python + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes + show : show all systen status + sff : dump SFP eeprom +""" + +import subprocess +import sys, getopt +import logging +import re +import time + +PROJECT_NAME = 'sw_to3200k' +version = '0.0.1' +verbose = False +DEBUG = False +args = [] +ALL_DEVICE = {} +DEVICE_NO = {'led':5, 'fan':7, 'thermal':7, 'psu':2, 'qsfp':32} + +led_prefix ='/sys/devices/platform/wistron_sw_to3200k_led/leds/wistron_'+PROJECT_NAME+'_led::' +hwmon_types = {'led': ['diag','fan','loc','psu1','psu2']} +hwmon_nodes = {'led': ['brightness']} +hwmon_prefix ={'led': led_prefix} + +i2c_prefix = '/sys/bus/i2c/devices/' + +i2c_bus = {'fan': ['0-0066'], + 'thermal': ['0-0049','0-004a','0-004b','0-004c','0-004d','0-004e','0-004f'], + 'psu': ['0-0051','0-0052'], + 'qsfp': ['0-0061']} + +i2c_nodes = {'fan': ['front_speed_rpm', 'rear_speed_rpm'], + 'thermal': ['temp1_input'], + 'psu': ['psu_present', 'psu_power_good'], + 'qsfp': ['module_present_']} + +sfp_map = [10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41] + +mknod =[ +'echo sw_to3200k_fpga 0x60 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_cpld1 0x61 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_cpld2 0x62 > /sys/bus/i2c/devices/i2c-0/new_device', +# FAN +'echo sw_to3200k_fan 0x66 > /sys/bus/i2c/devices/i2c-0/new_device', +# Thermal +'echo sw_to3200k_thermal 0x49 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4b > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4c > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4d > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4e > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4f > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU-1 eeprom 0x51 +'echo sw_to3200k_psu1 0x51 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo acbel_fshxxx 0x59 > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU-2 eeprom 0x52 +'echo sw_to3200k_psu2 0x52 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo acbel_fshxxx 0x5a > /sys/bus/i2c/devices/i2c-0/new_device', +# EEPROM +'echo 24c02 0x56 > /sys/bus/i2c/devices/i2c-0/new_device', +] + +FORCE = 0 +logging.basicConfig(filename= PROJECT_NAME+'.log', filemode='w',level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) + +if DEBUG == True: + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) + +def main(): + global DEBUG + global args + global FORCE + + logging.basicConfig(level=logging.INFO) + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print(options) + print(args) + print(len(sys.argv)) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + do_install() + elif arg == 'clean': + do_uninstall() + elif arg == 'show': + device_traversal() + elif arg == 'sff': + if len(args)!=2: + show_eeprom_help() + elif int(args[1]) > DEVICE_NO['qsfp'] -1: + show_eeprom_help() + else: + show_eeprom(args[1]) + return + else: + show_help() + + + return 0 + +def show_help(): + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) + sys.exit(0) + +def show_eeprom_help(): + cmd = sys.argv[0].split("/")[-1]+ " " + args[0] + print(" use \""+ cmd + " 1-32 \" to dump sfp# eeprom") + sys.exit(0) + +def my_log(txt): + if DEBUG == True: + print("[WISTRON DBG]: "+txt) + return + +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + output = "" + status, output = subprocess.getstatusoutput(cmd) + my_log (cmd +"with result:" + str(status)) + my_log ("cmd:" + cmd) + my_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +def driver_inserted(): + ret, lsmod = log_os_system("lsmod | grep wistron", 0) + logging.info('mods:'+lsmod) + if len(lsmod) ==0: + return False + + +kos = [ +'modprobe ipmi_msghandler', +'modprobe ipmi_si', +'modprobe ipmi_devintf', +'modprobe i2c_dev', +'modprobe at24', +'modprobe wistron_i2c_psu', +'modprobe wistron_sw_to3200k_cpld', +'modprobe wistron_sw_to3200k_fan', +'modprobe wistron_sw_to3200k_leds', +'modprobe wistron_sw_to3200k_psu', +'modprobe wistron_sw_to3200k_oom', +'modprobe wistron_sw_to3200k_thermal'] + +def driver_install(): + global FORCE + log_os_system("depmod", 1) + for i in range(0,len(kos)): + status, output = log_os_system(kos[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + return 0 + +def driver_uninstall(): + global FORCE + for i in range(0,len(kos)): + rm = kos[-(i+1)].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + return 0 + +def device_install(): + global FORCE + for i in range(0,len(mknod)): + print("init i2c device instance") + status, output = log_os_system(mknod[i], 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output = log_os_system("echo sw_to3200k_oom 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/new_device", 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output =log_os_system("echo port"+str(i+1)+" > /sys/bus/i2c/devices/0-00"+str(sfp_map[i])+"/port_name", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def device_uninstall(): + global FORCE + + for i in range(0,len(sfp_map)): + target = "echo 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/delete_device" + print(target) + status, output =log_os_system(target, 1) + if status: + print(output) + if FORCE == 0: + return status + + nodelist = mknod + + for i in range(len(nodelist)): + target = nodelist[-(i+1)] + temp = target.split() + del temp[1] + temp[-1] = temp[-1].replace('new_device', 'delete_device') + status, output = log_os_system(" ".join(temp), 1) + if status: + print(output) + if FORCE == 0: + return status + + return + +def system_ready(): + if driver_inserted() == False: + return False + if not device_exist(): + print("not device_exist()") + return False + return True + +def do_install(): + if driver_inserted() == False: + status = driver_install() + time.sleep(1) + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" drivers detected....") + + if not device_exist(): + status = device_install() + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" devices detected....") + + status, output = log_os_system( + "/bin/sh /usr/local/bin/platform_api_mgnt.sh init", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def do_uninstall(): + if not device_exist(): + print(PROJECT_NAME.upper() +" has no device installed....") + else: + print("Removing device....") + status = device_uninstall() + if status: + if FORCE == 0: + return status + + if driver_inserted()== False : + print(PROJECT_NAME.upper() +" has no driver installed....") + else: + print("Removing installed driver....") + status = driver_uninstall() + if status: + if FORCE == 0: + return status + + return + +def devices_info(): + global DEVICE_NO + global ALL_DEVICE + global i2c_bus, hwmon_types + for key in DEVICE_NO: + ALL_DEVICE[key]= {} + for i in range(0,DEVICE_NO[key]): + ALL_DEVICE[key][key+str(i+1)] = [] + + for key in i2c_bus: + buses = i2c_bus[key] + nodes = i2c_nodes[key] + for i in range(0,len(buses)): + for j in range(0,len(nodes)): + if 'fan' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + path = i2c_prefix+ buses[i]+"/fan"+str(k+1)+"_"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + elif 'qsfp' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + if k < 16: + path = i2c_prefix+"0-0061/"+ nodes[j]+str(k+1) + else: + path = i2c_prefix+"0-0062/"+ nodes[j]+str(k+1) + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + else: + node = key+str(i+1) + path = i2c_prefix+ buses[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + + for key in hwmon_types: + itypes = hwmon_types[key] + nodes = hwmon_nodes[key] + for i in range(0,len(itypes)): + for j in range(0,len(nodes)): + node = key+"_"+itypes[i] + path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][ key+str(i+1)].append(path) + + #show dict all in the order + if DEBUG == True: + for i in sorted(ALL_DEVICE.keys()): + print(i+": ") + for j in sorted(ALL_DEVICE[i].keys()): + print(" "+j) + for k in (ALL_DEVICE[i][j]): + print(" "+" "+k) + return + +def show_eeprom(index): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + node= "/sys/bus/i2c/devices/0-00"+str(sfp_map[int(index)-1])+"/eeprom1" + # check if got hexdump command in current environment + ret, log = log_os_system("which hexdump", 0) + ret, log2 = log_os_system("which busybox hexdump", 0) + if len(log): + hex_cmd = 'hexdump' + elif len(log2): + hex_cmd = ' busybox hexdump' + else: + log = 'Failed : no hexdump cmd!!' + logging.info(log) + print(log) + return 1 + + print("node=%s"%node) + ret, log = log_os_system(hex_cmd+" -C " + node, 1) + if ret==0: + print(log) + else: + print("**********device no found**********") + return + +#get digits inside a string. +#Ex: 31 for "sfp31" +def get_value(input): + digit = re.findall('\d+', input) + return int(digit[0]) + +def device_traversal(): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + if len(ALL_DEVICE)==0: + devices_info() + for i in sorted(ALL_DEVICE.keys()): + print("============================================") + print(i.upper()+": ") + print("============================================") + + for j in sorted(ALL_DEVICE[i].keys(), key=get_value): + print(" "+j+":",) + for k in (ALL_DEVICE[i][j]): + ret, log = log_os_system("cat "+k, 0) + func = k.split("/")[-1].strip() + func = re.sub(j+'_','',func,1) + func = re.sub(i.lower()+'_','',func,1) + if ret==0: + print(func+"="+log+" ",) + else: + print(func+"="+"X"+" ",) + print() + print("----------------------------------------------------------------") + + + print() + return + +def device_exist(): + ret1, log = log_os_system("ls "+i2c_prefix+"*0060", 0) + ret2, log = log_os_system("ls "+i2c_prefix+"i2c-0", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() From 9a6da79c40e52f4603ad4a90cc7bd82cdd30321c Mon Sep 17 00:00:00 2001 From: geogchen <106694330+geogchen@users.noreply.github.com> Date: Thu, 30 Jun 2022 09:34:27 -0700 Subject: [PATCH 489/817] [Interfaces] Add more unit tests for interfaces.j2 (#11277) #### Why I did it The tests that are available for interfaces.j2 only covers the case when ZTP is disabled and MGMT_INTERFACE is defined. This change adds unit tests for: 1) When ZTP is enabled, with combination of (ip enabled/disabled, inband enabled/disabled) 2) When ZTP is disabled, and MGMT_INTERFACE is not defined, with mgmtVrfEnabled set to true/false #### How I did it I created multiple mock-up files to: 1) Enable/disable ZTP, and subconditions under ZTP 2) Created graph file that has no management interface defined #### How to verify it Compared output with interfaces.j2 template to ensure the output is expected. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- .../tests/sample-port-data.json | 9 + .../tests/sample-ztp-inband-ip.json | 10 + .../tests/sample-ztp-inband.json | 8 + .../tests/sample-ztp-ip.json | 9 + src/sonic-config-engine/tests/sample-ztp.json | 7 + .../tests/sample_output/py2/interfaces_nomgmt | 24 + .../sample_output/py2/interfaces_nomgmt_ztp | 25 + .../py2/interfaces_nomgmt_ztp_inband | 29 + .../py2/interfaces_nomgmt_ztp_inband_ip | 35 + .../py2/interfaces_nomgmt_ztp_ip | 29 + .../sample_output/py2/mvrf_interfaces_nomgmt | 34 + .../tests/sample_output/py3/interfaces_nomgmt | 24 + .../sample_output/py3/interfaces_nomgmt_ztp | 25 + .../py3/interfaces_nomgmt_ztp_inband | 29 + .../py3/interfaces_nomgmt_ztp_inband_ip | 35 + .../py3/interfaces_nomgmt_ztp_ip | 29 + .../sample_output/py3/mvrf_interfaces_nomgmt | 34 + .../tests/t0-sample-graph-mvrf-nomgmt.xml | 797 +++++++++++++++ .../tests/t0-sample-graph-nomgmt.xml | 921 ++++++++++++++++++ .../tests/t0-sample-port-config-tiny.ini | 2 + src/sonic-config-engine/tests/test_j2files.py | 37 + 21 files changed, 2152 insertions(+) create mode 100644 src/sonic-config-engine/tests/sample-port-data.json create mode 100644 src/sonic-config-engine/tests/sample-ztp-inband-ip.json create mode 100644 src/sonic-config-engine/tests/sample-ztp-inband.json create mode 100644 src/sonic-config-engine/tests/sample-ztp-ip.json create mode 100644 src/sonic-config-engine/tests/sample-ztp.json create mode 100644 src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt create mode 100644 src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp create mode 100644 src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband create mode 100644 src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband_ip create mode 100644 src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_ip create mode 100644 src/sonic-config-engine/tests/sample_output/py2/mvrf_interfaces_nomgmt create mode 100644 src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt create mode 100644 src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp create mode 100644 src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband create mode 100644 src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband_ip create mode 100644 src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_ip create mode 100644 src/sonic-config-engine/tests/sample_output/py3/mvrf_interfaces_nomgmt create mode 100644 src/sonic-config-engine/tests/t0-sample-graph-mvrf-nomgmt.xml create mode 100644 src/sonic-config-engine/tests/t0-sample-graph-nomgmt.xml create mode 100644 src/sonic-config-engine/tests/t0-sample-port-config-tiny.ini diff --git a/src/sonic-config-engine/tests/sample-port-data.json b/src/sonic-config-engine/tests/sample-port-data.json new file mode 100644 index 000000000000..f206b1827036 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-port-data.json @@ -0,0 +1,9 @@ +{ + "PORT_DATA": { + "PORT_TABLE:Ethernet0": { + "value": { + "oper_status": "up" + } + } + } +} diff --git a/src/sonic-config-engine/tests/sample-ztp-inband-ip.json b/src/sonic-config-engine/tests/sample-ztp-inband-ip.json new file mode 100644 index 000000000000..8e05abbfb8a1 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-ztp-inband-ip.json @@ -0,0 +1,10 @@ +{ + "ZTP": { + "mode": { + "profile": "active", + "inband": "true", + "ipv4": "true", + "ipv6": "true" + } + } +} diff --git a/src/sonic-config-engine/tests/sample-ztp-inband.json b/src/sonic-config-engine/tests/sample-ztp-inband.json new file mode 100644 index 000000000000..dd80b7611161 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-ztp-inband.json @@ -0,0 +1,8 @@ +{ + "ZTP": { + "mode": { + "profile": "active", + "inband": "true" + } + } +} diff --git a/src/sonic-config-engine/tests/sample-ztp-ip.json b/src/sonic-config-engine/tests/sample-ztp-ip.json new file mode 100644 index 000000000000..ff04047f7d9c --- /dev/null +++ b/src/sonic-config-engine/tests/sample-ztp-ip.json @@ -0,0 +1,9 @@ +{ + "ZTP": { + "mode": { + "profile": "active", + "ipv4": "true", + "ipv6": "true" + } + } +} diff --git a/src/sonic-config-engine/tests/sample-ztp.json b/src/sonic-config-engine/tests/sample-ztp.json new file mode 100644 index 000000000000..5438a963858e --- /dev/null +++ b/src/sonic-config-engine/tests/sample-ztp.json @@ -0,0 +1,7 @@ +{ + "ZTP": { + "mode": { + "profile": "active" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt new file mode 100644 index 000000000000..b2d854266c32 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt @@ -0,0 +1,24 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +iface eth0 inet dhcp + metric 202 +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp new file mode 100644 index 000000000000..2080d7dfcdf3 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp @@ -0,0 +1,25 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 + + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband new file mode 100644 index 000000000000..85d476a9102f --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband @@ -0,0 +1,29 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 + + +# ZTP in-band interface Ethernet0 +auto Ethernet0 +allow-hotplug Ethernet0 + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband_ip b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband_ip new file mode 100644 index 000000000000..9e62929b5a66 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_inband_ip @@ -0,0 +1,35 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 +iface eth0 inet dhcp +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 + + +# ZTP in-band interface Ethernet0 +auto Ethernet0 +allow-hotplug Ethernet0 +iface Ethernet0 inet dhcp +iface Ethernet0 inet6 dhcp + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_ip b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_ip new file mode 100644 index 000000000000..9ddde6b5e8e4 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/interfaces_nomgmt_ztp_ip @@ -0,0 +1,29 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 +iface eth0 inet dhcp +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 + + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py2/mvrf_interfaces_nomgmt b/src/sonic-config-engine/tests/sample_output/py2/mvrf_interfaces_nomgmt new file mode 100644 index 000000000000..a110a91980b0 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/mvrf_interfaces_nomgmt @@ -0,0 +1,34 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +auto mgmt +iface mgmt + vrf-table 5000 +# The loopback network interface for mgmt VRF that is required for applications like NTP + up ip link add lo-m type dummy + up ip link set dev lo-m master mgmt + up ip addr add 127.0.0.1/16 dev lo-m + up ip link set lo-m up + down ip link delete dev lo-m +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +iface eth0 inet dhcp + metric 202 + vrf mgmt +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt new file mode 100644 index 000000000000..b2d854266c32 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt @@ -0,0 +1,24 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +iface eth0 inet dhcp + metric 202 +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp new file mode 100644 index 000000000000..2080d7dfcdf3 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp @@ -0,0 +1,25 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 + + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband new file mode 100644 index 000000000000..85d476a9102f --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband @@ -0,0 +1,29 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 + + +# ZTP in-band interface Ethernet0 +auto Ethernet0 +allow-hotplug Ethernet0 + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband_ip b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband_ip new file mode 100644 index 000000000000..9e62929b5a66 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_inband_ip @@ -0,0 +1,35 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 +iface eth0 inet dhcp +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 + + +# ZTP in-band interface Ethernet0 +auto Ethernet0 +allow-hotplug Ethernet0 +iface Ethernet0 inet dhcp +iface Ethernet0 inet6 dhcp + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_ip b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_ip new file mode 100644 index 000000000000..9ddde6b5e8e4 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/interfaces_nomgmt_ztp_ip @@ -0,0 +1,29 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 + + +# ZTP out-of-band interface +allow-hotplug eth0 +iface eth0 inet dhcp +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 + + +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/mvrf_interfaces_nomgmt b/src/sonic-config-engine/tests/sample_output/py3/mvrf_interfaces_nomgmt new file mode 100644 index 000000000000..a110a91980b0 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/mvrf_interfaces_nomgmt @@ -0,0 +1,34 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +auto mgmt +iface mgmt + vrf-table 5000 +# The loopback network interface for mgmt VRF that is required for applications like NTP + up ip link add lo-m type dummy + up ip link set dev lo-m master mgmt + up ip addr add 127.0.0.1/16 dev lo-m + up ip link set lo-m up + down ip link delete dev lo-m +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +iface eth0 inet dhcp + metric 202 + vrf mgmt +iface eth0 inet6 dhcp + up sysctl net.ipv6.conf.eth0.accept_ra=1 + down sysctl net.ipv6.conf.eth0.accept_ra=0 +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/t0-sample-graph-mvrf-nomgmt.xml b/src/sonic-config-engine/tests/t0-sample-graph-mvrf-nomgmt.xml new file mode 100644 index 000000000000..3bd4827ac0d8 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph-mvrf-nomgmt.xml @@ -0,0 +1,797 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + LoopbackIP1 + Loopback1 + + 10.10.0.99/32 + + 10.10.0.99/32 + + + + + true + + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 192.0.0.1;192.0.0.2 + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + ERSPAN + everflow + Everflow + + + ERSPANv6 + everflowV6 + Everflow + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAcl + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + NTP + NTP_ACL + NTP + + + SSH + SSH_ACL + SSH + + + SSH + ROUTER-PROTECT + SSH + + + SNMP + ROUTER-PROTECT + SNMP + + + NTP + NTP_ACL + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/2 + true + ARISTA05T1 + Ethernet1/33 + true + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet4 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet124 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + + + + + + + AutoNegotiation + + True + + + ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/2 + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/t0-sample-graph-nomgmt.xml b/src/sonic-config-engine/tests/t0-sample-graph-nomgmt.xml new file mode 100644 index 000000000000..e584671315a1 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph-nomgmt.xml @@ -0,0 +1,921 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 1 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
+ + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + LoopbackIP1 + Loopback1 + + 10.10.0.99/32 + + 10.10.0.99/32 + + + LoopbackIP2 + Loopback2 + + 10.21.0.64/32 + + 10.21.0.64/32 + + + LoopbackIP3 + Loopback3 + + 10.21.64.2/32 + + 10.21.64.2/32 + + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + + + + + Vlan2000 + fortyGigE0/112;fortyGigE0/116;fortyGigE0/120 + False + 0.0.0.0/0 + + + 192.0.0.3;192.0.0.4 + fc02:2000::3;fc02:2000::4 + 2000 + 2000 + 192.168.200.0/27 + + + + + Vlan99 + fortyGigE0/100 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 99 + 99 + + + + + + Vlan98 + fortyGigE0/100;PortChannel01;PortChannel03 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 98 + 98 + + + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + Vlan2000 + 192.168.200.1/27 + + + + + + ERSPAN + everflow + Everflow + + + ERSPANv6 + everflowV6 + Everflow + + + EGRESS_ERSPAN + everflow_egress + Everflow + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAclIngress + DataPlane + + + PortChannel01;PortChannel02;Vlan98 + DataAclEgress + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + NTP + NTP_ACL + NTP + + + SSH + SSH_ACL + SSH + + + SSH + ROUTER-PROTECT + SSH + + + SNMP + ROUTER-PROTECT + SNMP + + + NTP + NTP_ACL + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + 100000 + + + DeviceInterfaceLink + 100000 + switch-t0 + fortyGigE0/4 + true + ARISTA05T1 + Ethernet1/33 + true + + + DeviceInterfaceLink + Servers0 + eth0 + switch-t0 + fortyGigE0/4 + + + DeviceInterfaceLink + Servers100 + eth0 + switch-t0 + fortyGigE0/100 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + + + + + + + AutoNegotiation + + True + + + FECDisabled + + True + + + ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + False + + + FECDisabled + + True + + + ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/t0-sample-port-config-tiny.ini b/src/sonic-config-engine/tests/t0-sample-port-config-tiny.ini new file mode 100644 index 000000000000..fe6f8afc907f --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-port-config-tiny.ini @@ -0,0 +1,2 @@ +# name lanes alias +Ethernet0 29,30,31,32 fortyGigE0/0 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index a82e108f6871..b93d26ef368f 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -12,10 +12,18 @@ def setUp(self): self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = utils.PYTHON_INTERPRETTER + ' ' + os.path.join(self.test_dir, '..', 'sonic-cfggen') self.simple_minigraph = os.path.join(self.test_dir, 'simple-sample-graph.xml') + self.port_data = os.path.join(self.test_dir, 'sample-port-data.json') + self.ztp = os.path.join(self.test_dir, "sample-ztp.json") + self.ztp_inband = os.path.join(self.test_dir, "sample-ztp-inband.json") + self.ztp_ip = os.path.join(self.test_dir, "sample-ztp-ip.json") + self.ztp_inband_ip = os.path.join(self.test_dir, "sample-ztp-inband-ip.json") self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.t0_mvrf_minigraph = os.path.join(self.test_dir, 't0-sample-graph-mvrf.xml') + self.t0_minigraph_nomgmt = os.path.join(self.test_dir, 't0-sample-graph-nomgmt.xml') + self.t0_mvrf_minigraph_nomgmt = os.path.join(self.test_dir, 't0-sample-graph-mvrf-nomgmt.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') + self.t0_port_config_tiny = os.path.join(self.test_dir, 't0-sample-port-config-tiny.ini') self.l1_l3_port_config = os.path.join(self.test_dir, 'l1-l3-sample-port-config.ini') self.t0_7050cx3_port_config = os.path.join(self.test_dir, 't0_7050cx3_d48c8_port_config.ini') self.t1_mlnx_minigraph = os.path.join(self.test_dir, 't1-sample-graph-mlnx.xml') @@ -84,6 +92,25 @@ def modify_cable_len(self, base_file, file_dir): def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') + + # ZTP enabled + argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config_tiny + ' -j ' + self.ztp + ' -j ' + self.port_data + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + '> ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces_nomgmt_ztp'), self.output_file)) + + argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config_tiny + ' -j ' + self.ztp_inband + ' -j ' + self.port_data + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + '> ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces_nomgmt_ztp_inband'), self.output_file)) + + argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config_tiny + ' -j ' + self.ztp_ip + ' -j ' + self.port_data + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + '> ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces_nomgmt_ztp_ip'), self.output_file)) + + argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config_tiny + ' -j ' + self.ztp_inband_ip + ' -j ' + self.port_data + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + '> ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces_nomgmt_ztp_inband_ip'), self.output_file)) + + # ZTP disabled, MGMT_INTERFACE defined argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces'), self.output_file)) @@ -92,6 +119,16 @@ def test_interfaces(self): self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) + # ZTP disabled, no MGMT_INTERFACE defined + argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'interfaces_nomgmt'), self.output_file)) + + argument = '-m ' + self.t0_mvrf_minigraph_nomgmt + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces_nomgmt'), self.output_file)) + + def test_ports_json(self): ports_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ports.json.j2') argument = '-m ' + self.simple_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ports_template + ' > ' + self.output_file From 7f10b6bc356add2496ef33f062a696df9f53e330 Mon Sep 17 00:00:00 2001 From: Andrew Sapronov Date: Thu, 30 Jun 2022 20:40:47 +0300 Subject: [PATCH 490/817] [Netberg][Barefoot] Added support for Aurora 610 (#10579) Why I did it Support Intel Tofino based platforms Netberg Aurora 610 ASIC: Intel Tofino BFN-T10-032D-020 Pors: 48x 25G + 8x 100G How I did it Added specification to device/netberg directory Added platform/barefoot/sonic-platform-modules-netberg contains kernel modules, scripts and sonic_platform packages. Modified the platform/barefoot/one-image.mk and platform/barefoot/rule.mk to include Aurora 610 related ID and files. How to verify it Build SONiC Install the image on the device and verify the related components are installed and shown correctly. --- .../aurora-610/buffers.json.j2 | 2 + .../aurora-610/buffers_defaults_t0.j2 | 86 + .../aurora-610/buffers_defaults_t1.j2 | 86 + .../aurora-610/hwsku.json | 284 + .../aurora-610/pg_profile_lookup.ini | 17 + .../aurora-610/port_config.ini | 57 + .../aurora-610/qos.json.j2 | 10 + .../aurora-610/sai.profile | 2 + .../aurora-610/switch-tna-sai.conf | 39 + .../x86_64-netberg_aurora_610-r0/default_sku | 1 + .../installer.conf | 4 + .../x86_64-netberg_aurora_610-r0/pcie.yaml | 453 + .../platform.json | 485 + .../platform_asic | 1 + .../pmon_daemon_control.json | 3 + .../x86_64-netberg_aurora_610-r0/sensors.conf | 44 + platform/barefoot/one-image.mk | 1 + platform/barefoot/platform-modules-netberg.mk | 16 + platform/barefoot/rules.mk | 1 + .../aurora-610/.gitignore | 23 + .../aurora-610/modules/Makefile | 6 + .../aurora-610/modules/io_expander.c | 1747 ++++ .../aurora-610/modules/io_expander.h | 165 + .../aurora-610/modules/net_cpld.c | 471 + .../aurora-610/modules/net_mux.c | 544 ++ .../aurora-610/modules/net_mux.h | 51 + .../aurora-610/modules/net_platform.c | 281 + .../aurora-610/modules/net_psoc.c | 996 ++ .../aurora-610/modules/net_swps.c | 3074 ++++++ .../aurora-610/modules/net_swps.h | 288 + .../aurora-610/modules/transceiver.c | 8462 +++++++++++++++++ .../aurora-610/modules/transceiver.h | 809 ++ .../sonic-platform-netberg-aurora-610.service | 17 + .../aurora-610/setup.py | 27 + .../aurora-610/sonic_platform/__init__.py | 2 + .../aurora-610/sonic_platform/chassis.py | 247 + .../aurora-610/sonic_platform/component.py | 267 + .../aurora-610/sonic_platform/eeprom.py | 114 + .../sonic_platform/event_monitor.py | 95 + .../aurora-610/sonic_platform/fan.py | 293 + .../aurora-610/sonic_platform/fan_drawer.py | 22 + .../aurora-610/sonic_platform/platform.py | 20 + .../aurora-610/sonic_platform/psu.py | 245 + .../aurora-610/sonic_platform/qsfp.py | 1127 +++ .../aurora-610/sonic_platform/sfp.py | 924 ++ .../aurora-610/sonic_platform/thermal.py | 229 + .../aurora-610/sonic_platform/watchdog.py | 251 + .../aurora-610/utils/Yafuflash | Bin 0 -> 438680 bytes .../aurora-610/utils/afulnx_64 | Bin 0 -> 845936 bytes .../aurora-610/utils/cpld | Bin 0 -> 31216 bytes .../aurora-610/utils/healthstatus.sh | 101 + .../utils/netberg_nba610_platform.sh | 14 + .../debian/changelog | 12 + .../debian/compat | 1 + .../debian/control | 11 + .../debian/rules | 47 + .../sonic-platform-netberg-aurora-610.init | 212 + .../sonic-platform-netberg-aurora-610.install | 6 + ...sonic-platform-netberg-aurora-610.postinst | 1 + 59 files changed, 22794 insertions(+) create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers.json.j2 create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t0.j2 create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t1.j2 create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/hwsku.json create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/pg_profile_lookup.ini create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/port_config.ini create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/qos.json.j2 create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/sai.profile create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/switch-tna-sai.conf create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/default_sku create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/installer.conf create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/pcie.yaml create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/platform.json create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/platform_asic create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/pmon_daemon_control.json create mode 100644 device/netberg/x86_64-netberg_aurora_610-r0/sensors.conf create mode 100644 platform/barefoot/platform-modules-netberg.mk create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/.gitignore create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/Makefile create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.h create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_cpld.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.h create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_platform.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_psoc.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.h create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.c create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.h create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/service/sonic-platform-netberg-aurora-610.service create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/setup.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/__init__.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/chassis.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/component.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/eeprom.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/event_monitor.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan_drawer.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/platform.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/psu.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/qsfp.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/sfp.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/thermal.py create mode 100644 platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/watchdog.py create mode 100755 platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/Yafuflash create mode 100755 platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/afulnx_64 create mode 100755 platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/cpld create mode 100755 platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/healthstatus.sh create mode 100755 platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/netberg_nba610_platform.sh create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/changelog create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/compat create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/control create mode 100755 platform/barefoot/sonic-platform-modules-netberg/debian/rules create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.init create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.install create mode 100644 platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.postinst diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers.json.j2 b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers.json.j2 new file mode 100644 index 000000000000..1083a6210fc9 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't0' %} +{%- include 'buffers_config.j2' %} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t0.j2 b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..64735cf0e29e --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t0.j2 @@ -0,0 +1,86 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '4194304' %} +{% set ingress_lossy_pool_size = '7340032' %} +{% set egress_lossless_pool_size = '16777152' %} +{% set egress_lossy_pool_size = '7340032' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,47) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} + {% for port_idx in range(48,55) %} + {% if PORT.append("Ethernet%d" % (48 + ( port_idx - 48 )*4)) %}{% endif %} + {% endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic" + }, + "ingress_lossy_pool": { + "size": "{{ ingress_lossy_pool_size }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"4096", + "dynamic_th":"0", + "xon":"18432", + "xoff":"18432" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"4096", + "dynamic_th":"7", + "xon":"18432", + "xoff":"18432" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "q_lossy_profile" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +{%- endmacro %} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t1.j2 b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..cea4955456bf --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/buffers_defaults_t1.j2 @@ -0,0 +1,86 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '2097152' %} +{% set ingress_lossy_pool_size = '5242880' %} +{% set egress_lossless_pool_size = '16777152' %} +{% set egress_lossy_pool_size = '5242880' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,47) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} + {% for port_idx in range(48,55) %} + {% if PORT.append("Ethernet%d" % (48+(port_idx-48)*4)) %}{% endif %} + {% endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic" + }, + "ingress_lossy_pool": { + "size": "{{ ingress_lossy_pool_size }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"4096", + "dynamic_th":"0", + "xon":"18432", + "xoff":"18432" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"4096", + "dynamic_th":"7", + "xon":"18432", + "xoff":"18432" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"4096", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "q_lossy_profile" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +{%- endmacro %} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/hwsku.json b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/hwsku.json new file mode 100644 index 000000000000..ef374a24c576 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/hwsku.json @@ -0,0 +1,284 @@ +{ + "interfaces": { + "Ethernet1": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet2": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet3": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet4": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet5": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet6": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet7": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet9": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet10": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet11": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet12": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet13": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet14": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet15": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet17": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet18": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet19": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet20": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet21": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet22": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet23": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet25": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet26": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet27": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet28": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet29": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet30": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet31": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet33": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet34": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet35": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet36": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet37": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet38": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet39": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet41": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet42": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet43": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet44": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet45": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet46": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet47": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x25G[10G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet49": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet53": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet57": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet61": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet65": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet69": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet73": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + }, + "Ethernet77": { + "default_brkout_mode": "1x100G[40G]", + "autoneg": "off", + "fec": "rs" + } + } +} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/pg_profile_lookup.ini b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/pg_profile_lookup.ini new file mode 100644 index 000000000000..26287e4b6fea --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 34816 18432 16384 0 + 25000 5m 34816 18432 16384 0 + 40000 5m 34816 18432 16384 0 + 50000 5m 34816 18432 16384 0 + 100000 5m 36864 18432 18432 0 + 10000 40m 36864 18432 18432 0 + 25000 40m 39936 18432 21504 0 + 40000 40m 41984 18432 23552 0 + 50000 40m 41984 18432 23552 0 + 100000 40m 54272 18432 35840 0 + 10000 300m 49152 18432 30720 0 + 25000 300m 71680 18432 53248 0 + 40000 300m 94208 18432 75776 0 + 50000 300m 94208 18432 75776 0 + 100000 300m 184320 18432 165888 0 diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/port_config.ini b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/port_config.ini new file mode 100644 index 000000000000..1eaa5bebe85e --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias index speed autoneg fec +Ethernet1 0 Ethernet1 0 25000 off rs +Ethernet2 1 Ethernet2 1 25000 off rs +Ethernet3 2 Ethernet3 2 25000 off rs +Ethernet4 3 Ethernet4 3 25000 off rs +Ethernet5 4 Ethernet5 4 25000 off rs +Ethernet6 5 Ethernet6 5 25000 off rs +Ethernet7 6 Ethernet7 6 25000 off rs +Ethernet8 7 Ethernet8 7 25000 off rs +Ethernet9 8 Ethernet9 8 25000 off rs +Ethernet10 9 Ethernet10 9 25000 off rs +Ethernet11 10 Ethernet11 10 25000 off rs +Ethernet12 11 Ethernet12 11 25000 off rs +Ethernet13 12 Ethernet13 12 25000 off rs +Ethernet14 13 Ethernet14 13 25000 off rs +Ethernet15 14 Ethernet15 14 25000 off rs +Ethernet16 15 Ethernet16 15 25000 off rs +Ethernet17 16 Ethernet17 16 25000 off rs +Ethernet18 17 Ethernet18 17 25000 off rs +Ethernet19 18 Ethernet19 18 25000 off rs +Ethernet20 19 Ethernet20 19 25000 off rs +Ethernet21 20 Ethernet21 20 25000 off rs +Ethernet22 21 Ethernet22 21 25000 off rs +Ethernet23 22 Ethernet23 22 25000 off rs +Ethernet24 23 Ethernet24 23 25000 off rs +Ethernet25 24 Ethernet25 24 25000 off rs +Ethernet26 25 Ethernet26 25 25000 off rs +Ethernet27 26 Ethernet27 26 25000 off rs +Ethernet28 27 Ethernet28 27 25000 off rs +Ethernet29 28 Ethernet29 28 25000 off rs +Ethernet30 29 Ethernet30 29 25000 off rs +Ethernet31 30 Ethernet31 30 25000 off rs +Ethernet32 31 Ethernet32 31 25000 off rs +Ethernet33 32 Ethernet33 32 25000 off rs +Ethernet34 33 Ethernet34 33 25000 off rs +Ethernet35 34 Ethernet35 34 25000 off rs +Ethernet36 35 Ethernet36 35 25000 off rs +Ethernet37 36 Ethernet37 36 25000 off rs +Ethernet38 37 Ethernet38 37 25000 off rs +Ethernet39 38 Ethernet39 38 25000 off rs +Ethernet40 39 Ethernet40 39 25000 off rs +Ethernet41 40 Ethernet41 40 25000 off rs +Ethernet42 41 Ethernet42 41 25000 off rs +Ethernet43 42 Ethernet43 42 25000 off rs +Ethernet44 43 Ethernet44 43 25000 off rs +Ethernet45 44 Ethernet45 44 25000 off rs +Ethernet46 45 Ethernet46 45 25000 off rs +Ethernet47 46 Ethernet47 46 25000 off rs +Ethernet48 47 Ethernet48 47 25000 off rs +Ethernet49 48,49,50,51 Ethernet49 48 100000 off rs +Ethernet53 52,53,54,55 Ethernet53 49 100000 off rs +Ethernet57 56,57,58,59 Ethernet57 50 100000 off rs +Ethernet61 60,61,62,63 Ethernet61 51 100000 off rs +Ethernet65 64,65,66,67 Ethernet65 52 100000 off rs +Ethernet69 68,69,70,71 Ethernet69 53 100000 off rs +Ethernet73 72,73,74,75 Ethernet73 54 100000 off rs +Ethernet77 76,77,78,79 Ethernet77 55 100000 off rs diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/qos.json.j2 b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/qos.json.j2 new file mode 100644 index 000000000000..f7cd608b6b66 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/qos.json.j2 @@ -0,0 +1,10 @@ +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "3": "3", + "4": "4" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} \ No newline at end of file diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/sai.profile b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/sai.profile new file mode 100644 index 000000000000..81f300522592 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/sai.profile @@ -0,0 +1,2 @@ +SAI_KEY_WARM_BOOT_WRITE_FILE=/var/warmboot/sai-warmboot.bin +SAI_KEY_WARM_BOOT_READ_FILE=/var/warmboot/sai-warmboot.bin \ No newline at end of file diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/switch-tna-sai.conf b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/switch-tna-sai.conf new file mode 100644 index 000000000000..091290a120d2 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/aurora-610/switch-tna-sai.conf @@ -0,0 +1,39 @@ +{ + "chip_list": [ + { + "chip_family": "Tofino", + "sds_fw_path": "share/tofino_sds_fw/avago/firmware", + "instance": 0 + } + ], + "p4_devices": [ + { + "device-id": 0, + "agent0": "lib/platform/x86_64-netberg_aurora_610-r0/libpltfm_mgr.so", + "p4_programs": [ + { + "p4_pipelines": [ + { + "p4_pipeline_name": "pipe", + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" + } + ], + "program-name": "switch", + "bfrt-config": "share/switch/bf-rt.json", + "model_json_path" : "share/switch/aug_model.json", + "switchapi_port_add": false, + "non_default_port_ppgs": 5 + } + ] + } + ], + "switch_options": [ + { + "device-id": 0, + "model_json_path": "share/switch/aug_model.json", + "non_default_port_ppgs": 5, + "switchapi_port_add": false + } + ] +} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/default_sku b/device/netberg/x86_64-netberg_aurora_610-r0/default_sku new file mode 100644 index 000000000000..96100c36ff37 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/default_sku @@ -0,0 +1 @@ +aurora-610 t1 diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/installer.conf b/device/netberg/x86_64-netberg_aurora_610-r0/installer.conf new file mode 100644 index 000000000000..1db64ba02c38 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +VAR_LOG_SIZE=1024 diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/pcie.yaml b/device/netberg/x86_64-netberg_aurora_610-r0/pcie.yaml new file mode 100644 index 000000000000..c97a76819ea7 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/pcie.yaml @@ -0,0 +1,453 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 6f00 + name: 'Host bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 + (rev 03)' +- bus: '00' + dev: '01' + fn: '0' + id: 6f02 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 1 (rev 03)' +- bus: '00' + dev: '01' + fn: '1' + id: 6f03 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 1 (rev 03)' +- bus: '00' + dev: '02' + fn: '0' + id: 6f04 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '02' + fn: '2' + id: 6f06 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 2 (rev 03)' +- bus: '00' + dev: '03' + fn: '0' + id: 6f08 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '1' + id: 6f09 + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '2' + id: 6f0a + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '3' + id: 6f0b + name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI + Express Root Port 3 (rev 03)' +- bus: '00' + dev: '05' + fn: '0' + id: 6f28 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Map/VTd_Misc/System Management (rev 03)' +- bus: '00' + dev: '05' + fn: '1' + id: 6f29 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO Hot Plug (rev 03)' +- bus: '00' + dev: '05' + fn: '2' + id: 6f2a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D IIO RAS/Control Status/Global Errors (rev 03)' +- bus: '00' + dev: '05' + fn: '4' + id: 6f2c + name: 'PIC: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev + 03)' +- bus: '00' + dev: '14' + fn: '0' + id: 8c31 + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + xHCI (rev 05)' +- bus: '00' + dev: '16' + fn: '0' + id: 8c3a + name: 'Communication controller: Intel Corporation 8 Series/C220 Series Chipset + Family MEI Controller #1 (rev 04)' +- bus: '00' + dev: '16' + fn: '1' + id: 8c3b + name: 'Communication controller: Intel Corporation 8 Series/C220 Series Chipset + Family MEI Controller #2 (rev 04)' +- bus: '00' + dev: 1d + fn: '0' + id: 8c26 + name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB + EHCI #1 (rev 05)' +- bus: '00' + dev: 1f + fn: '0' + id: 8c54 + name: 'ISA bridge: Intel Corporation C224 Series Chipset Family Server Standard + SKU LPC Controller (rev 05)' +- bus: '00' + dev: 1f + fn: '2' + id: 8c02 + name: 'SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port + SATA Controller 1 [AHCI mode] (rev 05)' +- bus: '00' + dev: 1f + fn: '3' + id: 8c22 + name: 'SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller + (rev 05)' +- bus: '00' + dev: 1f + fn: '6' + id: 8c24 + name: 'Signal processing controller: Intel Corporation 8 Series Chipset Family Thermal + Management Controller (rev 05)' +- bus: '01' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: '02' + dev: '00' + fn: '0' + id: '1533' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev + 03)' +- bus: '03' + dev: '00' + fn: '0' + id: 6f50 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 0' +- bus: '03' + dev: '00' + fn: '1' + id: 6f51 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 1' +- bus: '03' + dev: '00' + fn: '2' + id: 6f52 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 2' +- bus: '03' + dev: '00' + fn: '3' + id: 6f53 + name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology + Register DMA Channel 3' +- bus: '04' + dev: '00' + fn: '0' + id: 15ab + name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' +- bus: '04' + dev: '00' + fn: '1' + id: 15ab + name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane' +- bus: '06' + dev: '00' + fn: '0' + id: '0010' + name: 'Unassigned class [ff00]: Device 1d1c:0010 (rev 10)' +- bus: ff + dev: 0b + fn: '0' + id: 6f81 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '1' + id: 6f36 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '2' + id: 6f37 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link 0/1 (rev 03)' +- bus: ff + dev: 0b + fn: '3' + id: 6f76 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R3 QPI Link Debug (rev 03)' +- bus: ff + dev: 0c + fn: '0' + id: 6fe0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '1' + id: 6fe1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '2' + id: 6fe2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0c + fn: '3' + id: 6fe3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '0' + id: 6ff8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '4' + id: 6ffc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '5' + id: 6ffd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: 0f + fn: '6' + id: 6ffe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Caching Agent (rev 03)' +- bus: ff + dev: '10' + fn: '0' + id: 6f1d + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '1' + id: 6f34 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D R2PCIe Agent (rev 03)' +- bus: ff + dev: '10' + fn: '5' + id: 6f1e + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '6' + id: 6f7d + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '10' + fn: '7' + id: 6f1f + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Ubox (rev 03)' +- bus: ff + dev: '12' + fn: '0' + id: 6fa0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '12' + fn: '1' + id: 6f30 + name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Home Agent 0 (rev 03)' +- bus: ff + dev: '13' + fn: '0' + id: 6fa8 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '1' + id: 6f71 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: ff + dev: '13' + fn: '2' + id: 6faa + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '3' + id: 6fab + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '4' + id: 6fac + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '5' + id: 6fad + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: ff + dev: '13' + fn: '6' + id: 6fae + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Broadcast (rev 03)' +- bus: ff + dev: '13' + fn: '7' + id: 6faf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Global Broadcast (rev 03)' +- bus: ff + dev: '14' + fn: '0' + id: 6fb0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '1' + id: 6fb1 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Thermal Control (rev 03)' +- bus: ff + dev: '14' + fn: '2' + id: 6fb2 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 0 Error (rev 03)' +- bus: ff + dev: '14' + fn: '3' + id: 6fb3 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 1 Error (rev 03)' +- bus: ff + dev: '14' + fn: '4' + id: 6fbc + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '5' + id: 6fbd + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '6' + id: 6fbe + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '14' + fn: '7' + id: 6fbf + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D DDRIO Channel 0/1 Interface (rev 03)' +- bus: ff + dev: '15' + fn: '0' + id: 6fb4 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '1' + id: 6fb5 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Thermal Control (rev 03)' +- bus: ff + dev: '15' + fn: '2' + id: 6fb6 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 2 Error (rev 03)' +- bus: ff + dev: '15' + fn: '3' + id: 6fb7 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Memory Controller 0 - Channel 3 Error (rev 03)' +- bus: ff + dev: 1e + fn: '0' + id: 6f98 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '1' + id: 6f99 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '2' + id: 6f9a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '3' + id: 6fc0 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1e + fn: '4' + id: 6f9c + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '0' + id: 6f88 + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' +- bus: ff + dev: 1f + fn: '2' + id: 6f8a + name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon + D Power Control Unit (rev 03)' diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/platform.json b/device/netberg/x86_64-netberg_aurora_610-r0/platform.json new file mode 100644 index 000000000000..3ef07f0e0bc7 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/platform.json @@ -0,0 +1,485 @@ +{ + "chassis" : { + "components" : [ ], + "fans" : [ ], + "fan_drawers" : [ + { + "fans" : [ + { "name" : "fan1" }, + { "name" : "fan2" } + ], + "name" : "drawer1" + }, + { + "fans" : [ + { "name" : "fan3" }, + { "name" : "fan4" } + ], + "name" : "drawer2" + }, + { + "fans" : [ + { "name" : "fan5" }, + { "name" : "fan6" } + ], + "name" : "drawer3" + }, + { + "fans" : [ + { "name" : "fan7" }, + { "name" : "fan8" } + ], + "name" : "drawer4" + } + ], + "name" : "aurora-610", + "psus" : [ + { + "fans" : [ { "name" : "psu1_fan1" } ], + "name" : "PSU 1", + "thermals" : [ { "name" : "PSU-1 Temp" } ] + }, + { + "fans" : [ { "name" : "psu2_fan1" } ], + "name" : "PSU 2", + "thermals" : [ { "name" : "PSU-2 Temp" } ] + } + ], + "sfps" : [ + { "name" : "sfp1" }, + { "name" : "sfp2" }, + { "name" : "sfp3" }, + { "name" : "sfp4" }, + { "name" : "sfp5" }, + { "name" : "sfp6" }, + { "name" : "sfp7" }, + { "name" : "sfp8" }, + { "name" : "sfp9" }, + { "name" : "sfp10" }, + { "name" : "sfp11" }, + { "name" : "sfp12" }, + { "name" : "sfp13" }, + { "name" : "sfp14" }, + { "name" : "sfp15" }, + { "name" : "sfp16" }, + { "name" : "sfp17" }, + { "name" : "sfp18" }, + { "name" : "sfp19" }, + { "name" : "sfp20" }, + { "name" : "sfp21" }, + { "name" : "sfp22" }, + { "name" : "sfp23" }, + { "name" : "sfp24" }, + { "name" : "sfp25" }, + { "name" : "sfp26" }, + { "name" : "sfp27" }, + { "name" : "sfp28" }, + { "name" : "sfp29" }, + { "name" : "sfp30" }, + { "name" : "sfp31" }, + { "name" : "sfp32" }, + { "name" : "sfp33" }, + { "name" : "sfp34" }, + { "name" : "sfp35" }, + { "name" : "sfp36" }, + { "name" : "sfp37" }, + { "name" : "sfp38" }, + { "name" : "sfp39" }, + { "name" : "sfp40" }, + { "name" : "sfp41" }, + { "name" : "sfp42" }, + { "name" : "sfp43" }, + { "name" : "sfp44" }, + { "name" : "sfp45" }, + { "name" : "sfp46" }, + { "name" : "sfp48" }, + { "name" : "qsfp49" }, + { "name" : "qsfp50" }, + { "name" : "qsfp51" }, + { "name" : "qsfp52" }, + { "name" : "qsfp53" }, + { "name" : "qsfp54" }, + { "name" : "qsfp55" }, + { "name" : "qsfp56" } + ], + "thermals" : [ ] + }, + "interfaces" : { + "Ethernet1" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet1" ] }, + "index" : "0", + "lanes" : "0" + }, + "Ethernet2" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet2" ] }, + "index" : "1", + "lanes" : "1" + }, + "Ethernet3" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet3" ] }, + "index" : "2", + "lanes" : "2" + }, + "Ethernet4" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet4" ] }, + "index" : "3", + "lanes" : "3" + }, + "Ethernet5" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet5" ] }, + "index" : "4", + "lanes" : "4" + }, + "Ethernet6" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet6" ] }, + "index" : "5", + "lanes" : "5" + }, + "Ethernet7" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet7" ] }, + "index" : "6", + "lanes" : "6" + }, + "Ethernet8" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet8" ] }, + "index" : "7", + "lanes" : "7" + }, + "Ethernet9" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet9" ] }, + "index" : "8", + "lanes" : "8" + }, + "Ethernet10" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet10" ] }, + "index" : "9", + "lanes" : "9" + }, + "Ethernet11" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet11" ] }, + "index" : "10", + "lanes" : "10" + }, + "Ethernet12" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet12" ] }, + "index" : "11", + "lanes" : "11" + }, + "Ethernet13" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet13" ] }, + "index" : "12", + "lanes" : "12" + }, + "Ethernet14" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet14" ] }, + "index" : "13", + "lanes" : "13" + }, + "Ethernet15" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet15" ] }, + "index" : "14", + "lanes" : "14" + }, + "Ethernet16" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet16" ] }, + "index" : "15", + "lanes" : "15" + }, + "Ethernet17" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet17" ] }, + "index" : "16", + "lanes" : "16" + }, + "Ethernet18" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet18" ] }, + "index" : "17", + "lanes" : "17" + }, + "Ethernet19" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet19" ] }, + "index" : "18", + "lanes" : "18" + }, + "Ethernet20" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet20" ] }, + "index" : "19", + "lanes" : "19" + }, + "Ethernet21" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet21" ] }, + "index" : "20", + "lanes" : "20" + }, + "Ethernet22" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet22" ] }, + "index" : "21", + "lanes" : "21" + }, + "Ethernet23" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet23" ] }, + "index" : "22", + "lanes" : "22" + }, + "Ethernet24" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet24" ] }, + "index" : "23", + "lanes" : "23" + }, + "Ethernet25" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet25" ] }, + "index" : "24", + "lanes" : "24" + }, + "Ethernet26" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet26" ] }, + "index" : "25", + "lanes" : "25" + }, + "Ethernet27" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet27" ] }, + "index" : "26", + "lanes" : "26" + }, + "Ethernet28" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet28" ] }, + "index" : "27", + "lanes" : "27" + }, + "Ethernet29" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet29" ] }, + "index" : "28", + "lanes" : "28" + }, + "Ethernet30" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet30" ] }, + "index" : "29", + "lanes" : "29" + }, + "Ethernet31" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet31" ] }, + "index" : "30", + "lanes" : "30" + }, + "Ethernet32" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet32" ] }, + "index" : "31", + "lanes" : "31" + }, + "Ethernet33" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet33" ] }, + "index" : "32", + "lanes" : "32" + }, + "Ethernet34" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet34" ] }, + "index" : "33", + "lanes" : "33" + }, + "Ethernet35" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet35" ] }, + "index" : "34", + "lanes" : "34" + }, + "Ethernet36" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet36" ] }, + "index" : "35", + "lanes" : "35" + }, + "Ethernet37" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet37" ] }, + "index" : "36", + "lanes" : "36" + }, + "Ethernet38" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet38" ] }, + "index" : "37", + "lanes" : "37" + }, + "Ethernet39" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet39" ] }, + "index" : "38", + "lanes" : "38" + }, + "Ethernet40" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet40" ] }, + "index" : "39", + "lanes" : "39" + }, + "Ethernet41" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet41" ] }, + "index" : "40", + "lanes" : "40" + }, + "Ethernet42" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet42" ] }, + "index" : "41", + "lanes" : "41" + }, + "Ethernet43" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet43" ] }, + "index" : "42", + "lanes" : "42" + }, + "Ethernet44" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet44" ] }, + "index" : "43", + "lanes" : "43" + }, + "Ethernet45" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet45" ] }, + "index" : "44", + "lanes" : "44" + }, + "Ethernet46" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet46" ] }, + "index" : "45", + "lanes" : "45" + }, + "Ethernet47" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet47" ] }, + "index" : "46", + "lanes" : "46" + }, + "Ethernet48" : { + "breakout_modes" : { "1x25G[10G]" : [ "Ethernet48" ] }, + "index" : "47", + "lanes" : "47" + }, + "Ethernet49" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet49" ], + "2x50G" : [ + "Ethernet49", + "Ethernet51" + ], + "4x25G[10G]" : [ + "Ethernet49", + "Ethernet50", + "Ethernet51", + "Ethernet52" + ] + }, + "index" : "48,48,48,48", + "lanes" : "48,49,50,51" + }, + "Ethernet53" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet53" ], + "2x50G" : [ + "Ethernet53", + "Ethernet55" + ], + "4x25G[10G]" : [ + "Ethernet53", + "Ethernet54", + "Ethernet55", + "Ethernet56" + ] + }, + "index" : "49,49,49,49", + "lanes" : "52,53,54,55" + }, + "Ethernet57" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet57" ], + "2x50G" : [ + "Ethernet57", + "Ethernet59" + ], + "4x25G[10G]" : [ + "Ethernet57", + "Ethernet58", + "Ethernet59", + "Ethernet60" + ] + }, + "index" : "50,50,50,50", + "lanes" : "56,57,58,59" + }, + "Ethernet61" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet61" ], + "2x50G" : [ + "Ethernet61", + "Ethernet63" + ], + "4x25G[10G]" : [ + "Ethernet61", + "Ethernet62", + "Ethernet63", + "Ethernet64" + ] + }, + "index" : "51,51,51,51", + "lanes" : "60,61,62,63" + }, + "Ethernet65" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet65" ], + "2x50G" : [ + "Ethernet65", + "Ethernet67" + ], + "4x25G[10G]" : [ + "Ethernet65", + "Ethernet66", + "Ethernet67", + "Ethernet68" + ] + }, + "index" : "52,52,52,52", + "lanes" : "64,65,66,67" + }, + "Ethernet69" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet69" ], + "2x50G" : [ + "Ethernet69", + "Ethernet71" + ], + "4x25G[10G]" : [ + "Ethernet69", + "Ethernet70", + "Ethernet71", + "Ethernet72" + ] + }, + "index" : "53,53,53,53", + "lanes" : "68,69,70,71" + }, + "Ethernet73" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet73" ], + "2x50G" : [ + "Ethernet73", + "Ethernet75" + ], + "4x25G[10G]" : [ + "Ethernet73", + "Ethernet74", + "Ethernet75", + "Ethernet76" + ] + }, + "index" : "54,54,54,54", + "lanes" : "72,73,74,75" + }, + "Ethernet77" : { + "breakout_modes" : { + "1x100G[40G]" : [ "Ethernet77" ], + "2x50G" : [ + "Ethernet77", + "Ethernet79" + ], + "4x25G[10G]" : [ + "Ethernet77", + "Ethernet78", + "Ethernet79", + "Ethernet80" + ] + }, + "index" : "55,55,55,55", + "lanes" : "76,77,78,79" + } + } +} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/platform_asic b/device/netberg/x86_64-netberg_aurora_610-r0/platform_asic new file mode 100644 index 000000000000..88d88117928c --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/platform_asic @@ -0,0 +1 @@ +barefoot diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/pmon_daemon_control.json b/device/netberg/x86_64-netberg_aurora_610-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..94592fa8cebc --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/netberg/x86_64-netberg_aurora_610-r0/sensors.conf b/device/netberg/x86_64-netberg_aurora_610-r0/sensors.conf new file mode 100644 index 000000000000..e208b3b25994 --- /dev/null +++ b/device/netberg/x86_64-netberg_aurora_610-r0/sensors.conf @@ -0,0 +1,44 @@ +# libsensors configuration file +chip "net_psoc-*" + ignore temp6 + + label temp1 "FrontSide Temperature" + label temp2 "FanBoard Temperature" + label temp3 "ASIC Temperature" + label temp4 "Center Temperature" + label temp5 "CPU Board Temperature" + label temp6 "Switch die temperature" + label temp7 "PSU1 Temperature1" + label temp8 "PSU2 Temperature1" + label temp9 "PSU1 Temperature2" + label temp10 "PSU2 Temperature2" + label fan1 "FanModule1 Front RPM" + label fan2 "FanModule1 Rear RPM" + label fan3 "FanModule2 Front RPM" + label fan4 "FanModule2 Rear RPM" + label fan5 "FanModule3 Front RPM" + label fan6 "FanModule3 Rear RPM" + label fan7 "FanModule4 Front RPM" + label fan8 "FanModule4 Rear RPM" + label fan9 "FanModule5 Front RPM" + label fan10 "FanModule5 Rear RPM" + label pwm6 "PSU1 FAN PWM" + label pwm7 "PSU2 FAN PWM" + label fan11 "PSU1 FAN RPM" + label fan12 "PSU2 FAN RPM" + label in1 "PSU1 Input Voltage" + label in2 "PSU2 Input Voltage" + label curr1 "PSU1 Input Current" + label curr2 "PSU2 Input Current" + label power1 "PSU1 Input Power" + label power2 "PSU2 Input Power" + label in3 "PSU1 Output Voltage" + label in4 "PSU2 Output Voltage" + label curr3 "PSU1 Output Current" + label curr4 "PSU2 Output Current" + label power3 "PSU1 Output Power" + label power4 "PSU2 Output Power" + compute power1 @*1000,@/1000 + compute power2 @*1000,@/1000 + compute power3 @*1000,@/1000 + compute power4 @*1000,@/1000 diff --git a/platform/barefoot/one-image.mk b/platform/barefoot/one-image.mk index a4565b47916b..d282fec5640a 100644 --- a/platform/barefoot/one-image.mk +++ b/platform/barefoot/one-image.mk @@ -13,6 +13,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WNC_OSW1800_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9180_32X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9280_64X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_QS_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_610_PLATFORM_MODULE) ifeq ($(INSTALL_DEBUG_TOOLS),y) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) $(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES)) diff --git a/platform/barefoot/platform-modules-netberg.mk b/platform/barefoot/platform-modules-netberg.mk new file mode 100644 index 000000000000..1d65b3324d03 --- /dev/null +++ b/platform/barefoot/platform-modules-netberg.mk @@ -0,0 +1,16 @@ +# Netberg Aurora 610 Platform modules + +NETBERG_AURORA_610_PLATFORM_MODULE_VERSION = 1.1.0 + +export NETBERG_AURORA_610_PLATFORM_MODULE_VERSION + +NETBERG_AURORA_610_PLATFORM_MODULE = sonic-platform-netberg-aurora-610_$(NETBERG_AURORA_610_PLATFORM_MODULE_VERSION)_amd64.deb +$(NETBERG_AURORA_610_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-netberg +$(NETBERG_AURORA_610_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(NETBERG_AURORA_610_PLATFORM_MODULE)_PLATFORM = x86_64-netberg_aurora_610-r0 +SONIC_DPKG_DEBS += $(NETBERG_AURORA_610_PLATFORM_MODULE) + +export NETBERG_AURORA_610_PLATFORM_MODULE + +#$(eval $(call add_extra_package,$(NETBERG_AURORA_610_PLATFORM_MODULE))) + diff --git a/platform/barefoot/rules.mk b/platform/barefoot/rules.mk index 8e717ba49ec6..7f159da63fc7 100644 --- a/platform/barefoot/rules.mk +++ b/platform/barefoot/rules.mk @@ -5,6 +5,7 @@ include $(PLATFORM_PATH)/platform-modules-accton.mk include $(PLATFORM_PATH)/platform-modules-bfn-newport.mk include $(PLATFORM_PATH)/platform-modules-wnc-osw1800.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk +include $(PLATFORM_PATH)/platform-modules-netberg.mk include $(PLATFORM_PATH)/bfn-sai.mk include $(PLATFORM_PATH)/docker-syncd-bfn.mk include $(PLATFORM_PATH)/docker-syncd-bfn-rpc.mk diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/.gitignore b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/.gitignore new file mode 100644 index 000000000000..912bdc23edd4 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/.gitignore @@ -0,0 +1,23 @@ +# kernel module build +*.o +*.ko +*.mod.c +*.mod.o +*.cmd +Module.symvers +modules.order + +# debian packaging +*.debhelper +*.log +DEBIAN +.tmp_versions +.finished.build +*.substvars + +# python +*.pyc +/build +/*.egg-info +/venv +/.pybuild diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/Makefile b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/Makefile new file mode 100644 index 000000000000..a50ac378327a --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/Makefile @@ -0,0 +1,6 @@ +obj-m += net_cpld.o +obj-m += net_platform.o +obj-m += net_psoc.o + +obj-m += swps.o +swps-objs := net_swps.o net_mux.o io_expander.o transceiver.o diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.c new file mode 100644 index 000000000000..5620b7f0b135 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.c @@ -0,0 +1,1747 @@ +#include +#include +#include "io_expander.h" + +/* For build single module using (Ex: ONL platform) */ +#include + +static struct ioexp_obj_s *ioexp_head_p = NULL; +static struct ioexp_obj_s *ioexp_tail_p = NULL; +extern int io_no_init; + +/* ========== Register IOEXP layout ========== + */ + +struct ioexp_map_s ioexp_map_lavender_p65 = { + + .chip_amount = 1, + .data_width = 1, + + .map_present = { {0, 0, 4}, }, /* map_present[0] = MOD_ABS_PORT(X) */ + .map_reset = { {0, 0, 1}, }, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + .map_lpmod = { {0, 0, 2}, }, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + .map_modsel = { {0, 0, 0}, }, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ +}; + +struct ioexp_map_s ioexp_map_aurora_610_ga_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 4}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 1, 5}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 1, 4}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 1, 5}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 0, 2}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 0, 3}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 0, 2}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 0, 3}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 1, 0}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 1, 1}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 1, 0}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 1, 1}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 0, 6}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 0, 7}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 0, 6}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 0, 7}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_aurora_610_ga_7abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 1, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + }, + .map_reset = { {0, 1, 0}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 1, 1}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 1, 2}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {0, 1, 3}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {0, 1, 4}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {0, 1, 5}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + }, + .map_lpmod = { {1, 0, 0}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {1, 0, 1}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {1, 0, 2}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {1, 0, 3}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {0, 0, 1}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {0, 0, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {0, 0, 3}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {0, 0, 4}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {0, 0, 5}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + }, +}; + + +struct ioexp_map_s ioexp_map_aurora_610_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 2}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 6}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 1, 6}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 2}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 6}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 1, 2}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 1, 6}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 0, 1}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 0, 5}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 1}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 5}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 0, 1}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 0, 5}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 1}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 5}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 4}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 1, 0}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 1, 4}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 4}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 1, 0}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 1, 4}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 0, 3}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 0, 7}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 3}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 0, 3}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 0, 7}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 3}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_aurora_610_1abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 2}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 6}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 1, 6}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 1, 4}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 1, 5}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 0, 1}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 0, 5}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 1}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 5}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 0, 2}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 0, 3}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 4}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 1, 0}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 1, 4}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 1, 0}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 1, 1}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 0, 3}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 0, 7}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 3}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 0, 6}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 0, 7}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_aurora_610_3abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 4}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 1, 5}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 2}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 6}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 1, 2}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 1, 6}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 0, 2}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 0, 3}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 0, 1}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 0, 5}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 1}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 5}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 1, 0}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 1, 1}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 4}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 1, 0}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 1, 4}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 0, 6}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 0, 7}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 0, 3}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 0, 7}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 3}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + + + +struct ioexp_map_s ioexp_map_aurora_610_7abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {1, 0, 4}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 1, 1}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 1, 6}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 0, 4}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 1}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 0, 1}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 0, 6}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 1, 3}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {1, 0, 1}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {1, 0, 6}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {1, 1, 3}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + {2, 0, 1}, /* map_reset[6] = QRESET_QSFP_N_P(X+6) */ + {2, 0, 6}, /* map_reset[7] = QRESET_QSFP_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 2}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {0, 0, 7}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {0, 1, 4}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {1, 0, 2}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {1, 0, 7}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {1, 1, 4}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + {2, 0, 2}, /* map_lpmod[6] = LPMODE_QSFP_P(X+6) */ + {2, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP_P(X+7) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {0, 0, 5}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {0, 1, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {1, 0, 0}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {1, 0, 5}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {1, 1, 2}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + {2, 0, 0}, /* map_modsel[6] = MODSEL_QSFP_N_P(X+6) */ + {2, 0, 5}, /* map_modsel[7] = MODSEL_QSFP_N_P(X+7) */ + }, +}; + + +/* ========== Private functions ========== + */ +int check_channel_tier_1(void); + +struct i2c_client * +_get_i2c_client(struct ioexp_obj_s *self, + int chip_id){ + + struct ioexp_i2c_s *i2c_curr_p = self->i2c_head_p; + + if (!(i2c_curr_p)){ + SWPS_ERR("%s: i2c_curr_p is NULL\n", __func__); + return NULL; + } + while (i2c_curr_p){ + if ((i2c_curr_p->chip_id) == chip_id){ + return i2c_curr_p->i2c_client_p; + } + i2c_curr_p = i2c_curr_p->next; + } + SWPS_ERR("%s: not exist! :%d\n", __func__, chip_id); + return NULL; +} + + +static int +_common_ioexp_update_one(struct ioexp_obj_s *self, + struct ioexp_addr_s *ioexp_addr, + int chip_id, + int data_width, + int show_err, + char *caller_name) { + int buf = 0; + int err = 0; + int data_id = 0; + int r_offset = 0; + + for(data_id=0; data_idread_offset[data_id]; + if (r_offset < 0) { + SWPS_DEBUG("skip a read_offset <%d>\n", r_offset); + continue; + } + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), r_offset); + /* Check error */ + if (buf < 0) { + err = 1; + if (show_err) { + SWPS_INFO("IOEXP-%d read fail! :%d \n", self->ioexp_id, buf); + SWPS_INFO("Dump: :%d :0x%02x :%d, :%s\n", + ioexp_addr->chan_id, ioexp_addr->chip_addr, + ioexp_addr->read_offset[data_id], caller_name); + } + continue; + } + /* Update IOEXP object */ + self->chip_data[chip_id].data[data_id] = (uint8_t)buf; + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +common_ioexp_update_all(struct ioexp_obj_s *self, + int show_err, + char *caller_name){ + + int err = 0; + int chip_id = 0; + int chip_amount = self->ioexp_map_p->chip_amount; + + for (chip_id=0; chip_idioexp_map_p->map_addr[chip_id]), + chip_id, + self->ioexp_map_p->data_width, + show_err, + caller_name) < 0) { + err = 1; + } + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +_common_check_by_mode(struct ioexp_obj_s *self){ + + switch (self->mode){ + case IOEXP_MODE_DIRECT: + return self->fsm_4_direct(self); + + case IOEXP_MODE_POLLING: + if (self->state >= 0){ + return 0; + } + switch (self->state){ + case STATE_IOEXP_INIT: + return ERR_IOEXP_UNINIT; + case STATE_IOEXP_ABNORMAL: + return ERR_IOEXP_ABNORMAL; + default: + return ERR_IOEXP_NOSTATE; + } + break; + + default: + break; + } + SWPS_ERR("%s: Exception occurs. :%d \n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +static int +_common_get_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + char *func_mane){ + uint8_t buf; + int err_code; + + /* Check and get address */ + err_code = _common_check_by_mode(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Get data form cache */ + buf = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + return (int)(buf >> bitmap_obj_p->bit_shift & 0x01); +} + + +static int +_common_set_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + int input_val, + char *func_mane){ + int err_code, target_offset; + uint8_t origin_byte; + uint8_t modify_byte; + + /* Check and get address */ + err_code = _common_check_by_mode(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Prepare write date */ + origin_byte = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + switch (input_val) { + case 0: + modify_byte = origin_byte; + SWP_BIT_CLEAR(modify_byte, bitmap_obj_p->bit_shift); + break; + case 1: + modify_byte = origin_byte; + SWP_BIT_SET(modify_byte, bitmap_obj_p->bit_shift); + break; + default: + SWPS_ERR("Input value incorrect! :%d :%d :%s\n", + input_val, self->ioexp_id, func_mane); + return ERR_IOEXP_BADINPUT; + } + /* Setup i2c client */ + target_offset = self->ioexp_map_p->map_addr[bitmap_obj_p->chip_id].write_offset[bitmap_obj_p->ioexp_voffset]; + /* Write byte to chip via I2C */ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, bitmap_obj_p->chip_id), + target_offset, + modify_byte); + /* Update or bollback object */ + if (err_code < 0){ + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = origin_byte; + SWPS_ERR("I2C write fail! :%d :%d :%s :%d\n", + input_val, self->ioexp_id, func_mane, err_code); + return err_code; + } + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = modify_byte; + return 0; +} + + +/* ========== Object public functions ========== + */ +int +common_get_present(struct ioexp_obj_s *self, + int virt_offset){ + + int UNPLUG = 1; + int retval = ERR_IOEXP_UNEXCPT; + + retval = _common_get_bit(self, + &(self->ioexp_map_p->map_present[virt_offset]), + "common_get_present"); + if (retval < 0) { + /* [Note] + * => Transceiver object does not need to handle IOEXP layer issues. + */ + return UNPLUG; + } + return retval; +} + + +int +common_get_tx_fault(struct ioexp_obj_s *self, + int virt_offset){ + /* [Transmit Fault (Tx_Fault)] + * A catastrophic laser fault will activate the transmitter signal, + * TX_FAULT, and disable the laser. This signal is an open collector + * output (pull-up required on the host board). A low signal indicates + * normal laser operation and a high signal indicates a fault. The + * TX_FAULT will be latched high when a laser fault occurs and is + * cleared by toggling the TX_DISABLE input or power cycling the + * transceiver. The transmitter fault condition can also be monitored + * via the two-wire serial interface. + * (address A2, byte 110, bit 2). + * + * 0: Normal + * 1: Abnormal + */ + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_fault[virt_offset]), + "common_get_tx_fault"); +} + + +int +common_get_rxlos(struct ioexp_obj_s *self, + int virt_offset){ + /* [Receiver Loss of Signal (Rx_LOS)] + * The post-amplification IC also includes transition detection circuitry + * which monitors the ac level of incoming optical signals and provides a + * TTL/CMOS compatible status signal to the host (pin 8). An adequate optical + * input results in a low Rx_LOS output while a high Rx_LOS output indicates + * an unusable optical input. The Rx_LOS thresholds are factory set so that + * a high output indicates a definite optical fault has occurred. Rx_LOS can + * also be monitored via the two-wire serial interface + * (address A2h, byte 110, bit 1). + * + * 0: Normal + * 1: Abnormal + */ + return _common_get_bit(self, + &(self->ioexp_map_p->map_rxlos[virt_offset]), + "common_get_rxlos"); +} + + +int +common_get_tx_disable(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + "common_get_tx_disable"); +} + + +int +common_get_reset(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + "common_get_reset"); +} + + +int +common_get_lpmod(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + "common_get_lpmod"); +} + + +int +common_get_modsel(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + "common_get_modsel"); +} + + +int +common_get_hard_rs0(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_hard_rs0[virt_offset]), + "common_get_hard_rs0"); +} + + +int +common_get_hard_rs1(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_hard_rs1[virt_offset]), + "common_get_hard_rs1"); +} + + +int +common_set_tx_disable(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + input_val, + "common_set_tx_disable"); +} + + +int +common_set_reset(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + input_val, + "common_set_reset"); +} + + +int +common_set_lpmod(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + input_val, + "common_set_lpmod"); +} + + +int +common_set_modsel(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + input_val, + "common_set_modsel"); +} + + +int +common_set_hard_rs0(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_hard_rs0[virt_offset]), + input_val, + "common_set_hard_rs0"); +} + + +int +common_set_hard_rs1(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_hard_rs1[virt_offset]), + input_val, + "common_set_hard_rs1"); +} + + +int +ioexp_get_not_support(struct ioexp_obj_s *self, + int virt_offset){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +ioexp_set_not_support(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +fake_ioexp_init(struct ioexp_obj_s *self){ + return 1; +} + +int +fake_ioexp_update(struct ioexp_obj_s *self){ + return 1; +} + + +int +fake_update_func(struct ioexp_obj_s *self){ + return 1; +} + +int +fake_get_func(struct ioexp_obj_s *self, + int virt_offset){ + SWPS_WARN("Someone called fake_get_func\n"); + return -1; +} + +int +fake_set_func(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + SWPS_WARN("Someone called fake_set_func\n"); + return -1; +} + + +/* ========== Initial functions for IO Expander ========== + */ +int +common_ioexp_init(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + if (self->mode == IOEXP_MODE_DIRECT) { + goto update_common_ioexp_init; + } + + if (!io_no_init){ /*normal init*/ + + /* Setup default value to each physical IO Expander */ + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + /* Get address mapping */ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("%s: IOEXP config incorrect! :%d \n", + __func__, chip_id); + return -1; + } + /* Setup default value */ + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + /* [Desc] Skip the setup default value behavior + [Note] Setup default value = -1 if you don't want to write the value to IOEXP or CPLD + */ + if(addr_p->write_offset[offset] < 0){ + SWPS_DEBUG("skip a write_offset <%d>\n", addr_p->conf_offset[offset]); + continue; + } + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->write_offset[offset], + addr_p->data_default[offset]); + if (err_code < 0){ + SWPS_ERR("%s: set default fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + } + } + } +update_common_ioexp_init: + /* Check and update info to object */ + err_code = self->update_all(self, 1, "common_ioexp_init"); + if (err_code < 0) { + SWPS_ERR("%s: update_all() fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +/* ========== Object functions for Final State Machine ========== + */ +int +_is_channel_ready(struct ioexp_obj_s *self){ + + int chip_id = 0; + int byte_id = 0; + int getval = ERR_IOEXP_UNEXCPT; + int chkval = ERR_IOEXP_UNEXCPT; + char *emsg = "ERR"; + struct ioexp_addr_s *addr_p = NULL; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++) { + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + emsg = "IOEXP config incorrect"; + goto err_is_channel_ready; + } + for (byte_id=0; byte_id<(self->ioexp_map_p->data_width); byte_id++) { + if (addr_p->conf_offset[byte_id] < 0) { + continue; + } + if ((addr_p->conf_default[byte_id]) != 0) { + goto go_is_channel_ready; + } + } + if (chip_id == ((self->ioexp_map_p->chip_amount) - 1)) { + SWPS_DEBUG("%s: no non-zero config", __func__); + break; + } + } + chip_id = 0; + byte_id = 0; + +go_is_channel_ready: + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + chkval = addr_p->conf_default[byte_id]; + getval = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), + addr_p->conf_offset[byte_id]); + + SWPS_DEBUG("%s: target info :%d :%d :%d :%d :%d\n", + __func__, self->ioexp_id, chip_id, byte_id, chkval, getval); + + if ((getval >= 0) && (getval == chkval)) { + return 1; + } + return 0; + +err_is_channel_ready: + SWPS_ERR("%s: %s :%d :%d :%d :%d :%d\n", + __func__, emsg, self->ioexp_id, chip_id, byte_id, chkval, getval); + return ERR_IOEXP_UNEXCPT; +} + + +int +_ioexp_init_handler(struct ioexp_obj_s *self){ + + int return_val; + + switch (self->mode) { + case IOEXP_MODE_DIRECT: + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + + case IOEXP_MODE_POLLING: + /* Check system and channel is ready */ + if (self->state == STATE_IOEXP_INIT){ + if (!_is_channel_ready(self)){ + self->state = STATE_IOEXP_INIT; + SWPS_WARN("%s: IOEXP:%d channel not ready.\n", + __func__, self->ioexp_id); + return 0; + } + } + /* Execute initial callback */ + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + + default: + break; + } + SWPS_ERR("%s: exception occur :%d\n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_direct(struct ioexp_obj_s *self){ + + int result_val; + int show_err = 1; + char *func_mane = "common_ioexp_fsm_4_direct"; + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, and return error */ + return ERR_IOEXP_UNINIT; + } + /* Case: Initial done */ + return 0; + + case STATE_IOEXP_NORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + SWPS_INFO("%s: NORMAL -> ABNORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + self->state = STATE_IOEXP_NORMAL; + return 0; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_DEBUG("%s: ABNORMAL -> NORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("%s: Exception occurs :%d\n", + __func__, self->state); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_polling(struct ioexp_obj_s *self){ + + int result_val, i, show_e; + int fail_retry = 3; + char *func_name = "common_ioexp_fsm_4_polling"; + +#ifdef DEBUG_SWPS + show_e = 1; +#else + show_e = 0; +#endif + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + /* Case: System (Channel) not ready */ + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, wait and retry */ + return 0; + } + /* Case: Initial done */ + SWPS_INFO("IOEXP-%d: initial done. :%d\n", + self->ioexp_id, self->ioexp_type); + return result_val; + + case STATE_IOEXP_NORMAL: + /* Retry mechanism for case of i2c topology not stable */ + for (i=0; iupdate_all(self, show_e, func_name); + if (result_val >= 0) { + self->state = STATE_IOEXP_NORMAL; + return 0; + } + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: detect I2C crash :%d\n", + __func__, self->ioexp_id); + break; + } + SWPS_DEBUG("IOEXP-%d: unstable :%d\n", + self->ioexp_id, result_val); + } + SWPS_INFO("IOEXP-%d: NORMAL -> ABNORMAL :%d\n", + self->ioexp_id, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_e, func_name); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_INFO("IOEXP-%d: ABNORMAL -> NORMAL :%d\n", + self->ioexp_id, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("IOEXP-%d: Exception occurs :%d\n", + self->ioexp_id, self->state); + return ERR_IOEXP_UNEXCPT; +} + + +/* ========== Object private functions for check & update ========== + */ +int +common_ioexp_check(struct ioexp_obj_s *self){ + + int result; + + if (self->mode != IOEXP_MODE_POLLING){ + SWPS_ERR("%s: not polling mode :%d\n", + __func__, self->mode); + return ERR_IOEXP_NOTSUPPORT; + } + mutex_lock(&self->lock); + result = self->fsm_4_polling(self); + mutex_unlock(&self->lock); + return result; +} + + +/* ========== Functions for Factory pattern ========== + */ +static struct ioexp_map_s * +get_ioexp_map(int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_AURORA_610_GA_NABC: + return &ioexp_map_aurora_610_ga_nabc; + case IOEXP_TYPE_AURORA_610_GA_7ABC: + return &ioexp_map_aurora_610_ga_7abc; + case IOEXP_TYPE_AURORA_610_NABC: + return &ioexp_map_aurora_610_nabc; + case IOEXP_TYPE_AURORA_610_1ABC: + return &ioexp_map_aurora_610_1abc; + case IOEXP_TYPE_AURORA_610_3ABC: + return &ioexp_map_aurora_610_3abc; + case IOEXP_TYPE_AURORA_610_7ABC: + return &ioexp_map_aurora_610_7abc; + default: + return NULL; + } +} + + +int +setup_ioexp_ssize_attr(struct ioexp_obj_s *self, + struct ioexp_map_s *ioexp_map_p, + int ioexp_id, + int ioexp_type, + int run_mode){ + switch (run_mode){ + case IOEXP_MODE_POLLING: /* Direct access device mode */ + case IOEXP_MODE_DIRECT: /* Polling mode, read from cache */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = ERR_IOEXP_UNEXCPT; + return ERR_IOEXP_UNEXCPT; + } + /* Setup mapping structure */ + self->ioexp_map_p = kzalloc(sizeof(*ioexp_map_p), GFP_KERNEL); + if (!(self->ioexp_map_p)) { + SWPS_ERR("%s: kzalloc ioexp_map_p fail\n", __func__); + return -1; + } + memcpy(self->ioexp_map_p, ioexp_map_p, sizeof(*ioexp_map_p)); + /* Setup attributes */ + self->ioexp_id = ioexp_id; + self->ioexp_type = ioexp_type; + self->state = STATE_IOEXP_INIT; + mutex_init(&self->lock); + return 0; +} + + +static int +setup_addr_mapping(struct ioexp_obj_s *self, + struct ioexp_addr_s *addr_map_p, + int chip_amount){ + struct ioexp_addr_s *tmp_p; + if (!addr_map_p){ + SWPS_ERR("%s: map is null\n", __func__); + return -1; + } + tmp_p = kzalloc((sizeof(*addr_map_p) * chip_amount), GFP_KERNEL); + if (!tmp_p){ + SWPS_ERR("%s: kzalloc fail.\n", __func__); + return -1; + } + memcpy(tmp_p, addr_map_p, (sizeof(*addr_map_p) * chip_amount)); + self->ioexp_map_p->map_addr = tmp_p; + + return 0; +} + + +static int +setup_ioexp_public_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case CPLD_TYPE_COTTONWOOD: + self->get_present = common_get_present; + self->get_tx_fault = common_get_tx_fault; + self->get_rxlos = common_get_rxlos; + self->get_tx_disable = common_get_tx_disable; + self->get_reset = ioexp_get_not_support; + self->get_lpmod = ioexp_get_not_support; + self->get_modsel = ioexp_get_not_support; + self->get_hard_rs0 = ioexp_get_not_support; + self->get_hard_rs1 = ioexp_get_not_support; + self->set_tx_disable = common_set_tx_disable; + self->set_reset = ioexp_set_not_support; + self->set_lpmod = ioexp_set_not_support; + self->set_modsel = ioexp_set_not_support; + self->set_hard_rs0 = ioexp_set_not_support; + self->set_hard_rs1 = ioexp_set_not_support; + return 0; + + case IOEXP_TYPE_AURORA_610_GA_NABC: + case IOEXP_TYPE_AURORA_610_NABC: + case IOEXP_TYPE_AURORA_610_1ABC: + case IOEXP_TYPE_AURORA_610_3ABC: + self->get_present = common_get_present; + self->get_tx_fault = common_get_tx_fault; + self->get_rxlos = common_get_rxlos; + self->get_tx_disable = common_get_tx_disable; + self->get_reset = ioexp_get_not_support; + self->get_lpmod = ioexp_get_not_support; + self->get_modsel = ioexp_get_not_support; + self->get_hard_rs0 = common_get_hard_rs0; + self->get_hard_rs1 = common_get_hard_rs1; + self->set_tx_disable = common_set_tx_disable; + self->set_reset = ioexp_set_not_support; + self->set_lpmod = ioexp_set_not_support; + self->set_modsel = ioexp_set_not_support; + self->set_hard_rs0 = common_set_hard_rs0; + self->set_hard_rs1 = common_set_hard_rs1; + return 0; + + case IOEXP_TYPE_AURORA_610_GA_7ABC: + case IOEXP_TYPE_AURORA_610_7ABC: + case IOEXP_TYPE_QSFP_6P_LAYOUT_1: + self->get_present = common_get_present; + self->get_tx_fault = ioexp_get_not_support; + self->get_rxlos = ioexp_get_not_support; + self->get_tx_disable = ioexp_get_not_support; + self->get_reset = common_get_reset; + self->get_lpmod = common_get_lpmod; + self->get_modsel = common_get_modsel; + self->get_hard_rs0 = ioexp_get_not_support; + self->get_hard_rs1 = ioexp_get_not_support; + self->set_tx_disable = ioexp_set_not_support; + self->set_reset = common_set_reset; + self->set_lpmod = common_set_lpmod; + self->set_modsel = common_set_modsel; + self->set_hard_rs0 = ioexp_set_not_support; + self->set_hard_rs1 = ioexp_set_not_support; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_ioexp_private_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case IOEXP_TYPE_AURORA_610_GA_NABC: + case IOEXP_TYPE_AURORA_610_GA_7ABC: + case IOEXP_TYPE_AURORA_610_NABC: + case IOEXP_TYPE_AURORA_610_1ABC: + case IOEXP_TYPE_AURORA_610_3ABC: + case IOEXP_TYPE_AURORA_610_7ABC: + case IOEXP_TYPE_QSFP_6P_LAYOUT_1: + self->init = common_ioexp_init; + self->check = common_ioexp_check; + self->update_all = common_ioexp_update_all; + self->fsm_4_direct = common_ioexp_fsm_4_direct; + self->fsm_4_polling = common_ioexp_fsm_4_polling; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_i2c_client_one(struct ioexp_obj_s *self, + int chip_id){ + + char *err_msg = "ERROR"; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + struct ioexp_i2c_s *i2c_obj_p = NULL; + struct ioexp_i2c_s *i2c_curr_p = NULL; + + int chan_id = self->ioexp_map_p->map_addr[chip_id].chan_id; + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + err_msg = "Can not kzalloc client!"; + goto err_ioexp_setup_i2c_1; + } + i2c_obj_p = kzalloc(sizeof(*i2c_obj_p), GFP_KERNEL); + if (!i2c_obj_p){ + err_msg = "Can not kzalloc i2c_obj_p!"; + goto err_ioexp_setup_i2c_2; + } + adap = i2c_get_adapter(chan_id); + if(!adap){ + err_msg = "Can not get adap!"; + goto err_ioexp_setup_i2c_3; + } + client->adapter = adap; + client->addr = self->ioexp_map_p->map_addr[chip_id].chip_addr; + i2c_obj_p->i2c_client_p = client; + i2c_obj_p->chip_id = chip_id; + i2c_obj_p->next = NULL; + if (!self->i2c_head_p){ + self->i2c_head_p = i2c_obj_p; + } else { + i2c_curr_p = self->i2c_head_p; + while (i2c_curr_p->next){ + i2c_curr_p = i2c_curr_p->next; + } + i2c_curr_p->next = i2c_obj_p; + } + return 0; + +err_ioexp_setup_i2c_3: + kfree(i2c_obj_p); +err_ioexp_setup_i2c_2: + kfree(client); +err_ioexp_setup_i2c_1: + SWPS_ERR("%s: %s :%d\n", __func__, err_msg, chan_id); + return -1; +} + + +static int +setup_i2c_client(struct ioexp_obj_s* self){ + + int result; + int chip_id = 0; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + result = setup_i2c_client_one(self, chip_id); + if (result < 0){ + SWPS_ERR("%s fail! :%d\n", __func__, chip_id); + return -1; + } + } + return 0; +} + + +static int +setup_ioexp_config(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + if (io_no_init) { + + SWPS_INFO("io_no_init:%d \n", io_no_init); + return 0; + } + + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("IOEXP config incorrect! :%d \n",chip_id); + return -1; + } + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + /* [Desc] Skip the setup config value behavior + [Note] Setup config value = -1 if you don't want to write the value to IOEXP or CPLD + */ + if(addr_p->conf_offset[offset] < 0){ + SWPS_DEBUG("skip a config_offset <%d>\n", addr_p->conf_offset[offset]); + continue; + } + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->conf_offset[offset], + addr_p->conf_default[offset]); + + if (err_code < 0){ + SWPS_INFO("%s: set conf fail! :%d \n", __func__, err_code); + return -2; + } + } + } + return 0; +} + + +struct ioexp_obj_s * +_create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_map_s* ioexp_map_p; + struct ioexp_obj_s* result_p; + struct ioexp_i2c_s *i2c_curr_p; + struct ioexp_i2c_s *i2c_next_p; + + /* Get layout */ + ioexp_map_p = get_ioexp_map(ioexp_type); + if (!ioexp_map_p){ + SWPS_ERR("%s: Invalid ioexp_type\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare IOEXP object */ + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + SWPS_ERR("%s: kzalloc failure!\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare static size attributes */ + if (setup_ioexp_ssize_attr(result_p, + ioexp_map_p, + ioexp_id, + ioexp_type, + run_mode) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + /* Prepare address mapping */ + if (setup_addr_mapping(result_p, addr_map_p, ioexp_map_p->chip_amount) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + if (setup_i2c_client(result_p) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + /* Prepare call back functions of object */ + if (setup_ioexp_public_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + if (setup_ioexp_private_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + return result_p; + +err_create_ioexp_setup_i2c_fail: + i2c_curr_p = result_p->i2c_head_p; + i2c_next_p = result_p->i2c_head_p; + while (i2c_curr_p){ + i2c_next_p = i2c_curr_p->next; + if (i2c_curr_p->i2c_client_p) { + i2c_put_adapter(i2c_curr_p->i2c_client_p->adapter); + kfree(i2c_curr_p->i2c_client_p); + } + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } +err_create_ioexp_setup_attr_fail: + kfree(result_p); +err_create_ioexp_fail: + SWPS_ERR("%s: fail! :%d :%d \n", + __func__, ioexp_id, ioexp_type); + return NULL; +} + + +int +create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_obj_s *ioexp_p = NULL; + + ioexp_p = _create_ioexp_obj(ioexp_id, ioexp_type, + addr_map_p, run_mode); + if (!ioexp_p){ + return -1; + } + if (ioexp_head_p == NULL){ + ioexp_head_p = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; + } + ioexp_tail_p->next = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; +} +EXPORT_SYMBOL(create_ioexp_obj); + + +static int +_init_ioexp_obj(struct ioexp_obj_s* self) { + + char *err_msg = "ERR"; + char *func_name = "_init_ioexp_obj"; + + /* Setup IOEXP configure byte */ + if (setup_ioexp_config(self) < 0){ + err_msg = "setup_ioexp_config fail"; + goto err_init_ioexp_obj; + } + /* Setup default data */ + if (_ioexp_init_handler(self) < 0){ + err_msg = "_ioexp_init_handler fail"; + goto err_init_ioexp_obj; + } + /* Update all */ + if (self->state == STATE_IOEXP_NORMAL){ + if (self->update_all(self, 1, func_name) < 0){ + err_msg = "update_all() fail"; + goto err_init_ioexp_obj; + } + } + return 0; + +err_init_ioexp_obj: + SWPS_DEBUG("%s: %s\n", __func__, err_msg); + return -1; +} + + +int +init_ioexp_objs(void){ + /* Return value: + * 0: Success + * -1: Detect topology error + * -2: SWPS internal error + */ + struct ioexp_obj_s *curr_p = ioexp_head_p; + + if (!curr_p) { + SWPS_ERR("%s: ioexp_head_p is NULL\n", __func__); + return -2; + } + while (curr_p) { + if (_init_ioexp_obj(curr_p) < 0) { + SWPS_DEBUG("%s: _init_ioexp_obj() fail\n", __func__); + return -1; + } + curr_p = curr_p->next; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} +EXPORT_SYMBOL(init_ioexp_objs); + + +void +clean_ioexp_objs(void){ + + struct ioexp_i2c_s *i2c_curr_p = NULL; + struct ioexp_i2c_s *i2c_next_p = NULL; + struct ioexp_obj_s *ioexp_next_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + if (ioexp_head_p == NULL){ + ioexp_tail_p = NULL; + return; + } + while(ioexp_curr_p){ + ioexp_next_p = ioexp_curr_p->next; + if (ioexp_curr_p->ioexp_map_p) { + if (ioexp_curr_p->ioexp_map_p->map_addr) { + kfree(ioexp_curr_p->ioexp_map_p->map_addr); + } + kfree(ioexp_curr_p->ioexp_map_p); + } + + i2c_curr_p = ioexp_curr_p->i2c_head_p; + while (i2c_curr_p) { + i2c_next_p = i2c_curr_p->next; + if (i2c_curr_p->i2c_client_p) { + i2c_put_adapter(i2c_curr_p->i2c_client_p->adapter); + kfree(i2c_curr_p->i2c_client_p); + } + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } + kfree(ioexp_curr_p); + ioexp_curr_p = ioexp_next_p; + } + ioexp_tail_p = NULL; + SWPS_DEBUG("%s: done.\n", __func__); +} +EXPORT_SYMBOL(clean_ioexp_objs); + + +int +check_ioexp_objs(void){ + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while (ioexp_curr_p){ + if ( (ioexp_curr_p->check(ioexp_curr_p)) < 0){ + SWPS_INFO("check IOEXP-%d fail! :%d\n", + ioexp_curr_p->ioexp_id, ioexp_curr_p->ioexp_type); + return -1; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; +} +EXPORT_SYMBOL(check_ioexp_objs); + + +struct ioexp_obj_s * +get_ioexp_obj(int ioexp_id){ + + struct ioexp_obj_s *result_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + if (ioexp_curr_p->ioexp_id == ioexp_id){ + result_p = ioexp_curr_p; + break; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return result_p; +} +EXPORT_SYMBOL(get_ioexp_obj); + + +void +unlock_ioexp_all(void) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + mutex_unlock(&ioexp_curr_p->lock); + ioexp_curr_p = ioexp_curr_p->next; + } +} +EXPORT_SYMBOL(unlock_ioexp_all); + +int +lock_ioexp_all(void) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + mutex_lock(&ioexp_curr_p->lock); + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; +} +EXPORT_SYMBOL(lock_ioexp_all); + + +int +check_channel_tier_1(void) { + + if ( (!_is_channel_ready(ioexp_head_p)) && + (!_is_channel_ready(ioexp_tail_p)) ){ + return -1; + } + return 0; +} +EXPORT_SYMBOL(check_channel_tier_1); + + +static int +_scan_channel_tier_1(int force, + int show_err) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + int ready = 0; + + if (!ioexp_curr_p) { + goto err_scan_tier_1_channel; + } + while(ioexp_curr_p) { + ready = _is_channel_ready(ioexp_curr_p); + if ((!ready) && (!force)) { + goto err_scan_tier_1_channel; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; + +err_scan_tier_1_channel: + if (show_err) { + if (ioexp_curr_p) { + SWPS_INFO("%s: IOEXP-%d fail\n", __func__, ioexp_curr_p->ioexp_id); + } else { + SWPS_INFO("%s: IOEXP is null.\n", __func__); + } + } + return -1; +} + + +static int +_scan_channel_tier_1_single(void) { + + int ret = 0; + int chan_id = 0; + int fake_cid = 0; + int fake_offs = 0; + int fake_addr = 0; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + + if (ioexp_head_p->ioexp_id != ioexp_tail_p->ioexp_id) { + return 0; + } + /* Setup i2c_client */ + chan_id = ioexp_head_p->ioexp_map_p->map_addr[fake_cid].chan_id; + fake_addr = ioexp_head_p->ioexp_map_p->map_addr[fake_cid].chip_addr; + adap = i2c_get_adapter((chan_id + 1)); + if(!adap){ + SWPS_INFO("%s: Can not get adap!\n", __func__); + return 0; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + SWPS_INFO("%s: Can not kzalloc client!\n", __func__); + return 0; + } + client->adapter = adap; + client->addr = fake_addr; + /* Fouce move ioexp ptr to next */ + ret = i2c_smbus_read_byte_data(client, fake_offs); + SWPS_DEBUG("%s: move ioexp_ptr done. :%d\n", __func__, ret); + kfree(client); + return 1; +} + + +int +resync_channel_tier_1(void) { + + char *emsg = "ERR"; + + if (!ioexp_head_p) { + emsg = "ioexp_head_p is NULL"; + goto err_resync_ioexp_status_1; + } + /* Run all */ + if (ioexp_head_p->ioexp_id == ioexp_tail_p->ioexp_id) { + _scan_channel_tier_1_single(); + } else { + _scan_channel_tier_1(1, 0); + } + /* Check all */ + if (_scan_channel_tier_1(0, 1) < 0) { + emsg = "resync tier-1 channel fail"; + goto err_resync_ioexp_status_1; + } + return 0; + +err_resync_ioexp_status_1: + SWPS_ERR("%s: %s\n", __func__, emsg); + return -1; +} +EXPORT_SYMBOL(resync_channel_tier_1); + + +/* For build single module using (Ex: ONL platform) */ +MODULE_LICENSE("GPL"); + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.h b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.h new file mode 100644 index 000000000000..5ef1d25a5349 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/io_expander.h @@ -0,0 +1,165 @@ +#ifndef IO_EXPANDER_H +#define IO_EXPANDER_H + +#include + + +/* IOEXP type define (SFP series) */ +#define IOEXP_TYPE_AURORA_610_GA_NABC (10105) +#define IOEXP_TYPE_AURORA_610_NABC (10106) +#define IOEXP_TYPE_AURORA_610_1ABC (10108) +#define IOEXP_TYPE_AURORA_610_3ABC (10109) + +/* IOEXP type define (QSFP series) */ +#define IOEXP_TYPE_AURORA_610_GA_7ABC (10213) +#define IOEXP_TYPE_AURORA_610_7ABC (10214) +#define IOEXP_TYPE_QSFP_6P_LAYOUT_1 (10215) + +/* CPLD type define */ +#define CPLD_TYPE_COTTONWOOD (10301) + +/* IOEXP mode define */ +#define IOEXP_MODE_POLLING (19000) +#define IOEXP_MODE_DIRECT (19001) + +/* IOEXP state define */ +#define STATE_IOEXP_NORMAL (0) +#define STATE_IOEXP_INIT (-1) +#define STATE_IOEXP_ABNORMAL (-2) + +/* IOEXP error code define */ +#define ERR_IOEXP_NOTSUPPORT (-100) +#define ERR_IOEXP_UNINIT (-101) +#define ERR_IOEXP_BADCONF (-102) +#define ERR_IOEXP_ABNORMAL (-103) +#define ERR_IOEXP_NOSTATE (-104) +#define ERR_IOEXP_BADINPUT (-105) +#define ERR_IOEXP_UNEXCPT (-199) + +#define SWPS_INFO(fmt, args...) printk( KERN_INFO "[SWPS] " fmt, ##args) +#define SWPS_WARN(fmt, args...) printk( KERN_WARNING "[SWPS] " fmt, ##args) +#define SWPS_ERR(fmt, args...) printk( KERN_ERR "[SWPS] " fmt, ##args) + +#ifdef DEBUG_SWPS +# define SWPS_DEBUG(fmt, args...) printk( KERN_DEBUG "[SWPS] " fmt, ##args) +#else +# define SWPS_DEBUG(fmt, args...) +#endif + + +struct ioexp_addr_s { + int chan_id; + int chip_addr; + int read_offset[8]; + int write_offset[8]; + int conf_offset[8]; + uint8_t data_default[8]; + uint8_t conf_default[8]; +}; + +struct ioexp_i2c_s { + int chip_id; + struct i2c_client *i2c_client_p; + struct ioexp_i2c_s *next; +}; + + +struct ioexp_bitmap_s { + int chip_id; /* IOEXP chip id */ + int ioexp_voffset; /* IOEXP virtual offset */ + int bit_shift; +}; + +struct ioexp_map_s { + int chip_amount; /* Number of chips that IOEXP object content */ + int data_width; /* Number of (Read/Write/Config) bytes */ + struct ioexp_addr_s *map_addr; /* Chip address info */ + struct ioexp_bitmap_s map_present[10]; /* IOEXP for SFP / QSFP */ + struct ioexp_bitmap_s map_tx_disable[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_tx_fault[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_rxlos[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_reset[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_lpmod[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_modsel[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_hard_rs0[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_hard_rs1[10]; /* IOEXP for QSFP */ +}; + +struct ioexp_data_s { + uint8_t data[8]; +}; + +struct ioexp_obj_s { + + /* ============================ + * Object public property + * ============================ + */ + int ioexp_id; + int ioexp_type; + + /* ============================ + * Object private property + * ============================ + */ + struct ioexp_data_s chip_data[16]; /* Max: 8-ioexp in one virt-ioexp(ioexp_obj) */ + struct ioexp_map_s *ioexp_map_p; + struct ioexp_obj_s *next; + struct ioexp_i2c_s *i2c_head_p; + struct mutex lock; + int mode; + int state; + + /* =========================================== + * Object public functions + * =========================================== + */ + int (*get_present)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_fault)(struct ioexp_obj_s *self, int virt_offset); + int (*get_rxlos)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_disable)(struct ioexp_obj_s *self, int virt_offset); + int (*get_reset)(struct ioexp_obj_s *self, int virt_offset); + int (*get_lpmod)(struct ioexp_obj_s *self, int virt_offset); + int (*get_modsel)(struct ioexp_obj_s *self, int virt_offset); + int (*get_hard_rs0)(struct ioexp_obj_s *self, int virt_offset); + int (*get_hard_rs1)(struct ioexp_obj_s *self, int virt_offset); + int (*set_tx_disable)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_reset)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_lpmod)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_modsel)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_hard_rs0)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_hard_rs1)(struct ioexp_obj_s *self, int virt_offset, int input_val); + + /* =========================================== + * Object private functions + * =========================================== + */ + int (*init)(struct ioexp_obj_s *self); + int (*check)(struct ioexp_obj_s *self); + int (*update_all)(struct ioexp_obj_s *self, int show_err, char *caller_name); + int (*fsm_4_direct)(struct ioexp_obj_s* self); + int (*fsm_4_polling)(struct ioexp_obj_s* self); +}; + + +struct ioexp_obj_s* get_ioexp_obj(int ioexp_id); +int create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode); +int init_ioexp_objs(void); +int check_ioexp_objs(void); +void clean_ioexp_objs(void); + +void unlock_ioexp_all(void); +int lock_ioexp_all(void); + +int check_channel_tier_1(void); +int resync_channel_tier_1(void); + +/* Macro for bit control */ +#define SWP_BIT_SET(byte_val,bit_shift) ((byte_val) |= (1<<(bit_shift))) +#define SWP_BIT_CLEAR(byte_val,bit_shift) ((byte_val) &= ~(1<<(bit_shift))) + + +#endif /* IO_EXPANDER_H */ \ No newline at end of file diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_cpld.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_cpld.c new file mode 100644 index 000000000000..b9fa84895c26 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_cpld.c @@ -0,0 +1,471 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "I2CHostCommunication.h" + +#define USE_SMBUS 1 + +/* definition */ +#define CPLD_INFO_OFFSET 0x00 +#define CPLD_PSU_OFFSET 0x08 +#define CPLD_LED_OFFSET 0x0E +#define CPLD_LED_STATU_OFFSET 0x0D +#define CPLD_CTL_OFFSET 0x0C +#define CPLD_BIOSCS_OFFSET 0x04 + + +/* Each client has this additional data */ +struct cpld_data { + struct device *hwmon_dev; + struct mutex update_lock; +}; + +/*-----------------------------------------------------------------------*/ + +static ssize_t cpld_i2c_read(struct i2c_client *client, u8 *buf, u8 offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg[0].buf = msgbuf; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + status = i2c_transfer(client->adapter, msg, 2); + + if(status == 2) + status = count; + + return status; +#endif +} + +static ssize_t cpld_i2c_write(struct i2c_client *client, char *buf, unsigned offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + + return status; +#endif +} + +/*-----------------------------------------------------------------------*/ + +/* sysfs attributes for hwmon */ + +static ssize_t show_info(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[4]; + + memset(b, 0, 4); + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, b, CPLD_INFO_OFFSET, 4); + mutex_unlock(&data->update_lock); + + if(status != 4) return sprintf(buf, "read cpld info fail\n"); + + status = sprintf (buf, "The CPLD release date is %02d/%02d/%d.\n", b[2] & 0xf, (b[3] & 0x1f), 2014+(b[2] >> 4)); /* mm/dd/yyyy*/ + status = sprintf (buf, "%sThe PCB version is %X%X\n", buf, b[0]>>4, b[0]&0xf); + status = sprintf (buf, "%sThe CPLD version is %d.%d\n", buf, b[1]>>4, b[1]&0xf); + + return strlen(buf); +} + + +static ssize_t show_ctl(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[1]; + + mutex_lock(&data->update_lock); + + status = cpld_i2c_read(client, b, CPLD_CTL_OFFSET, 1); + + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld ctl fail\n"); + + + status = sprintf (buf, "0x%X\n", b[0]); + + return strlen(buf); +} + +static ssize_t set_ctl(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_CTL_OFFSET, 1); + if(temp) byte |= (1<<0); + else byte &= ~(1<<0); + cpld_i2c_write(client, &byte, CPLD_CTL_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_bios_cs(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[1]; + + mutex_lock(&data->update_lock); + + status = cpld_i2c_read(client, b, CPLD_BIOSCS_OFFSET, 1); + + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld BIOS_CS fail\n"); + + + status = sprintf (buf, "0x%X\n", b[0] & 0x01); + + return strlen(buf); +} + +static ssize_t set_bios_cs(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_BIOSCS_OFFSET, 1); + if(temp) byte |= 0x01; + else byte &= ~(0x01); + cpld_i2c_write(client, &byte, CPLD_BIOSCS_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + + +static char* led_str[] = { + "OFF", //000 + "0.5 Hz", //001 + "1 Hz", //010 + "2 Hz", //011 + "4 Hz", //100 + "NA", //101 + "NA", //110 + "ON", //111 +}; + +static ssize_t show_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 0)?3:0; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld offset 0x%x\n", CPLD_LED_OFFSET); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d: %s\n", byte, led_str[byte]); + + return strlen(buf); +} + +static ssize_t set_led(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + + u8 temp = simple_strtol(buf, NULL, 16); + u8 byte; + int shift = (attr->index == 0)?3:0; + + temp &= 0x7; + //validate temp value: 0,1,2,3,7, TBD + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + byte &= ~(0x7<update_lock); + + return count; +} + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu0 | psu1 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 1)?0:3; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + + +static SENSOR_DEVICE_ATTR(info, S_IRUGO, show_info, 0, 0); +static SENSOR_DEVICE_ATTR(ctl, S_IWUSR|S_IRUGO, show_ctl, set_ctl, 0); + +static SENSOR_DEVICE_ATTR(grn_led, S_IWUSR|S_IRUGO, show_led, set_led, 0); +static SENSOR_DEVICE_ATTR(red_led, S_IWUSR|S_IRUGO, show_led, set_led, 1); + +static SENSOR_DEVICE_ATTR(psu0, S_IRUGO, show_psu, 0, 0); +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu, 0, 1); + +static SENSOR_DEVICE_ATTR(bios_cs, S_IWUSR|S_IRUGO, show_bios_cs, set_bios_cs, 0); + +static struct attribute *cpld_attributes[] = { + //info + &sensor_dev_attr_info.dev_attr.attr, + &sensor_dev_attr_ctl.dev_attr.attr, + + &sensor_dev_attr_grn_led.dev_attr.attr, + &sensor_dev_attr_red_led.dev_attr.attr, + + &sensor_dev_attr_psu0.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + + &sensor_dev_attr_bios_cs.dev_attr.attr, + + NULL +}; + +static const struct attribute_group cpld_group = { + .attrs = cpld_attributes, +}; + +static struct attribute *cpld2_attributes[] = { + //info + &sensor_dev_attr_info.dev_attr.attr, + + NULL +}; + +static const struct attribute_group cpld2_group = { + .attrs = cpld2_attributes, +}; + + +/*-----------------------------------------------------------------------*/ + +/* device probe and removal */ + +static int +cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cpld_data *data; + int status; + +// printk("+%s \n", __func__); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* Register sysfs hooks */ + if(id->driver_data==1) // CPLD2 + status = sysfs_create_group(&client->dev.kobj, &cpld2_group); + else // default CPLD1 + status = sysfs_create_group(&client->dev.kobj, &cpld_group); + + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "net_cpld", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &cpld_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &cpld_group); + i2c_set_clientdata(client, NULL); + kfree(data); + return 0; +} + +static const struct i2c_device_id cpld_ids[] = { + { "net_cpld" , 0, }, + { "net_cpld2", 1, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, cpld_ids); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "net_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init net_cpld_init(void) +{ + return i2c_add_driver(&cpld_driver); +} + +static void __exit net_cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("Netberg "); +MODULE_DESCRIPTION("Netberg cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(net_cpld_init); +module_exit(net_cpld_exit); diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.c new file mode 100644 index 000000000000..0143deeb68fd --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.c @@ -0,0 +1,544 @@ +#include +#include +#include +#include +#include +#include +#include "io_expander.h" +#include "net_mux.h" + +/* For build single module using (Ex: ONL platform) */ +#include + +static struct mux_obj_s *mux_head_p = NULL; + +/* ========== MUX object functions ========== + */ +static int +_setup_i2c_value(struct mux_obj_s *self, int offset, int value){ + + return i2c_smbus_write_byte_data(self->i2c_client_p, offset, value); +} + + +static int +_setup_i2c_client(struct mux_obj_s *self, int chan_id, int addr){ + + struct i2c_adapter *adap = NULL; + char *emsg = "ERR"; + + adap = i2c_get_adapter(chan_id); + if (!adap){ + emsg = "can't get adapter"; + goto err_setup_i2c_client; + } + self->i2c_client_p = kzalloc(sizeof(*self->i2c_client_p), GFP_KERNEL); + if (!self->i2c_client_p){ + emsg = "can't kzalloc client"; + goto err_setup_i2c_client; + } + self->i2c_client_p->adapter = adap; + self->i2c_client_p->addr = addr; + return 0; + +err_setup_i2c_client: + SWPS_ERR("%s: %s\n", __func__, emsg); + return ERR_MUX_UNEXCPT; +} + + +int +_common_force_pull_gpio(int mem_addr, + int input, + int bit_offset){ + + unsigned int val = 0; + unsigned int targ = 0; + + /* Get current value */ + val = inl(mem_addr); + if (val == 0) { + SWPS_ERR("%s: inl:%d fail!\n", __func__, val); + return -1; + } + /* Count target value */ + switch (input) { + case 0: /* Pull Low */ + targ = (val & (~(1 << bit_offset))); + break; + case 1: /* Pull high */ + targ = (val | (1 << bit_offset)); + break; + default: + SWPS_ERR("%s: input state:%d incorrect!\n", + __func__, input); + return -1; + } + /* Setup gpio */ + outl(targ, mem_addr); + if (targ != inl(mem_addr)){ + SWPS_ERR("%s: outl:%d fail!\n", __func__, targ); + return -1; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} + + +int +rangeley_force_pull_high(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +rangeley_force_pull_low(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +hedera_force_pull_high(struct mux_obj_s *self){ + return _common_force_pull_gpio(MUX_RST_MEM_ADDR_HEDERA, 1, 5); +} + + +int +hedera_force_pull_low(struct mux_obj_s *self){ + return _common_force_pull_gpio(MUX_RST_MEM_ADDR_HEDERA, 0, 5); +} + + +int +normal_gpio_pull_high(struct mux_obj_s *self){ + return gpio_direction_output(self->gpio_num, 1); +} + + +int +normal_gpio_pull_low(struct mux_obj_s *self){ + return gpio_direction_output(self->gpio_num, 0); +} + + +int +cpld_rst_all_4_pull_low(struct mux_obj_s *self){ + + char *emsg = "ERR"; + int err = ERR_MUX_UNEXCPT; + + switch(self->gpio_num) { + case MUX_RST_CPLD_C0_A77_70_74_RST_ALL: + goto setlow_cpld_rst_all_4_c0_a77_70_74_rst_all; + + default: + break; + } + emsg = "Undefined case"; + goto err_cpld_rst_all_4_pull_low; + +setlow_cpld_rst_all_4_c0_a77_70_74_rst_all: + err = _setup_i2c_value(self, 0x70, 0x0); + if (err < 0) { + emsg = "setup 0x70 fail"; + goto err_cpld_rst_all_4_pull_low; + } + err = _setup_i2c_value(self, 0x74, 0x01); + if (err < 0) { + emsg = "setup 0x74 fail"; + goto err_cpld_rst_all_4_pull_low; + } + return 0; + +err_cpld_rst_all_4_pull_low: + SWPS_INFO("%s: %s :%d :%d\n", + __func__, emsg, self->gpio_num, err); + return ERR_MUX_UNEXCPT; +} + + +int +cpld_rst_all_4_pull_high(struct mux_obj_s *self){ + + char *emsg = "ERR"; + int err = ERR_MUX_UNEXCPT; + + switch(self->gpio_num) { + case MUX_RST_CPLD_C0_A77_70_74_RST_ALL: + goto sethigh_cpld_rst_all_4_c0_a77_70_74_rst_all; + + default: + break; + } + emsg = "Undefined case"; + goto err_cpld_rst_all_4_pull_high; + +sethigh_cpld_rst_all_4_c0_a77_70_74_rst_all: + err = _setup_i2c_value(self, 0x70, 0xfe); + if (err < 0) { + emsg = "setup 0x70 fail"; + goto err_cpld_rst_all_4_pull_high; + } + err = _setup_i2c_value(self, 0x74, 0x03); + if (err < 0) { + emsg = "setup 0x74 fail"; + goto err_cpld_rst_all_4_pull_high; + } + return 0; + +err_cpld_rst_all_4_pull_high: + SWPS_INFO("%s: %s :%d :%d\n", + __func__, emsg, self->gpio_num, err); + return ERR_MUX_UNEXCPT; +} + + +int +pca9548_reset_mux_all(struct mux_obj_s *self){ + /* [Note] Power-on reset (PCA9548A-NXP) + * When power is applied to VDD, an internal Power-On Reset (POR) + * holds the PCA9548A in a reset condition until VDD has reached + * VPOR. At this point, the reset condition is released and the + * PCA9548A register and I2C-bus state machine are initialized to + * their default states (all zeroes) causing all the channels to + * be deselected. Thereafter, VDD must be lowered below 0.2 V for + * at least 5 us in order to reset the device. + */ + if (self->_pull_low(self) < 0) { + SWPS_ERR("%s: _pull_low fail!\n", __func__); + return -1; + } + mdelay(MUX_RST_WAIT_MS_PCA9548); + if (self->_pull_high(self) < 0) { + SWPS_ERR("%s: _pull_high fail!\n", __func__); + return -1; + } + mdelay(MUX_RST_WAIT_MS_PCA9548); + return 0; +} + + +int +cpld_reset_mux_all(struct mux_obj_s *self){ + + char *emsg = "ERR"; + int err = ERR_MUX_UNEXCPT; + + switch(self->gpio_num) { + case MUX_RST_CPLD_C0_A77_70_74_RST_ALL: + goto reset_cpld_rst_all_4_c0_a77_70_74_rst_all; + + default: + break; + } + emsg = "Undefined case"; + goto err_cpld_reset_mux_all; + +reset_cpld_rst_all_4_c0_a77_70_74_rst_all: + if (self->_pull_low(self) < 0) { + emsg = "_pull_low fail"; + goto err_cpld_reset_mux_all; + } + mdelay(MUX_RST_WAIT_MS_CPLD); + return 0; + +err_cpld_reset_mux_all: + SWPS_INFO("%s: %s :%d :%d\n", + __func__, emsg, self->gpio_num, err); + return ERR_MUX_UNEXCPT; +} + + +int +common_reset_mux_all(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +init_gpio_4_force(struct mux_obj_s *self){ + + if (self->_pull_high(self) < 0) { + SWPS_ERR("%s: setup default fail!\n", __func__); + return -1; + } + return 0; +} + + +int +init_gpio_4_normal(struct mux_obj_s *self){ + + int err = 0; + char *emsg = "ERR"; + + if (!gpio_is_valid(self->gpio_num)) { + emsg = "GPIO invalid"; + goto err_init_gpio_4_normal; + } + err = gpio_request(self->gpio_num, MUX_GPIO_LABEL); + if (err < 0) { + emsg = "gpio_request fail"; + goto err_init_gpio_4_normal; + } + err = self->_pull_high(self); + if (err < 0) { + emsg = "setup default fail"; + goto err_init_gpio_4_normal; + } + SWPS_DEBUG("%s: gpio_request:%d ok.\n", __func__, self->gpio_num); + return 0; + +err_init_gpio_4_normal: + SWPS_ERR("%s: %s :%d :%d\n", + __func__, emsg, self->gpio_num, err); + return -1; +} + + +int +init_cpld_4_rst_all(struct mux_obj_s *self){ + + char *emsg = "ERR"; + int err = ERR_MUX_UNEXCPT; + int chan = ERR_MUX_UNEXCPT; + int addr = ERR_MUX_UNEXCPT; + + switch(self->gpio_num) { + case MUX_RST_CPLD_C0_A77_70_74_RST_ALL: + goto init_cpld_i2c_c0_a77_70_74_rst_all; + + default: + break; + } + emsg = "Undefined case"; + goto err_init_cpld_4_rst_all; + +init_cpld_i2c_c0_a77_70_74_rst_all: + chan = 0; + addr = 0x77; + err = _setup_i2c_client(self, chan, addr); + if (err < 0) { + emsg = "_setup_i2c_client fail"; + goto err_init_cpld_4_rst_all; + } + err = self->_pull_high(self); + if (err < 0) { + emsg = "setup default value fail"; + goto err_init_cpld_4_rst_all; + } + SWPS_DEBUG("%s: init_cpld_i2c_c0_a77_70_74_rst_all ok", __func__); + return 0; + +err_init_cpld_4_rst_all: + SWPS_INFO("%s: %s :%d :%d\n", + __func__, emsg, self->gpio_num, err); + return ERR_MUX_UNEXCPT; +} + + +int +clean_gpio_4_common(struct mux_obj_s *self){ + + if (!self) return 0; + if (!gpio_is_valid(self->gpio_num)) return 0; + self->_pull_high(self); + gpio_free(mux_head_p->gpio_num); + return 0; +} + + +int +clean_cpld_4_rst_all(struct mux_obj_s *self){ + + if (!self) return 0; + self->_pull_high(self); + if (self->i2c_client_p) { + i2c_put_adapter(self->i2c_client_p->adapter); + kfree(self->i2c_client_p); + } + return 0; +} + + +static int +_setup_muxctl_cb(struct mux_obj_s *self, + unsigned gpio){ + + char mod_dsc[32] = "ERR"; + + switch (gpio) { + case MUX_RST_GPIO_FORCE_RANGELEY: + self->gpio_num = gpio; + self->_pull_low = rangeley_force_pull_low; + self->_pull_high = rangeley_force_pull_high; + self->_init = init_gpio_4_force; + self->_clean = clean_gpio_4_common; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Rangeley force mode"); + goto ok_setup_muxctl_cb; + + case MUX_RST_GPIO_FORCE_HEDERA: + self->gpio_num = gpio; + self->_pull_low = hedera_force_pull_low; + self->_pull_high = hedera_force_pull_high; + self->_init = init_gpio_4_force; + self->_clean = clean_gpio_4_common; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Hedera force mode"); + goto ok_setup_muxctl_cb; + + case MUX_RST_GPIO_48_PCA9548: + case MUX_RST_GPIO_69_PCA9548: + case MUX_RST_GPIO_249_PCA9548: + case MUX_RST_GPIO_500_PCA9548: + case MUX_RST_GPIO_505_PCA9548: + self->gpio_num = gpio; + self->_pull_low = normal_gpio_pull_low; + self->_pull_high = normal_gpio_pull_high; + self->_init = init_gpio_4_normal; + self->_clean = clean_gpio_4_common; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Normal mode :%d", (int)gpio); + goto ok_setup_muxctl_cb; + + case MUX_RST_CPLD_C0_A77_70_74_RST_ALL: + self->gpio_num = gpio; + self->_pull_low = cpld_rst_all_4_pull_low; + self->_pull_high = cpld_rst_all_4_pull_high; + self->_init = init_cpld_4_rst_all; + self->_clean = clean_cpld_4_rst_all; + self->reset = cpld_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "CPLD mode :%d", (int)gpio); + goto ok_setup_muxctl_cb; + + default: + break; + } + SWPS_ERR("%s: Unexpected GPIO:%d\n", __func__, gpio); + return -1; + +ok_setup_muxctl_cb: + SWPS_INFO("muxctl: %s.\n", mod_dsc); + return 0; +} + + +/* ========== MUX public functions ========== + */ +void +clean_mux_objs(void){ + + struct mux_obj_s *curr_p = mux_head_p; + struct mux_obj_s *next_p = NULL; + + if (!curr_p) { + SWPS_DEBUG("%s: mux_head_p is NULL\n", __func__); + return; + } + while (curr_p) { + next_p = curr_p->next; + curr_p->_clean(curr_p); + kfree(curr_p); + curr_p = next_p; + } + SWPS_DEBUG("%s: done.\n", __func__); +} +EXPORT_SYMBOL(clean_mux_objs); + + +int +reset_mux_objs(void){ + + if (!mux_head_p) { + SWPS_ERR("%s: MUX ctl object doesn't exist!\n", __func__); + return -1; + } + if (mux_head_p->reset(mux_head_p) < 0){ + SWPS_ERR("%s: reset fail!\n", __func__); + return -1; + } + return 0; +} +EXPORT_SYMBOL(reset_mux_objs); + + +struct mux_obj_s * +_create_mux_obj(unsigned gpio){ + + char *emsg = "ERR"; + struct mux_obj_s *obj_p = NULL; + + obj_p = kzalloc(sizeof(struct mux_obj_s), GFP_KERNEL); + if (!obj_p) { + emsg = "kzalloc fail!"; + goto err_create_mux_obj_1; + } + if (_setup_muxctl_cb(obj_p, gpio) < 0){ + emsg = "_setup_muxctl_cb fail!"; + goto err_create_mux_obj_2; + } + if (obj_p->_init(obj_p) < 0) { + emsg = "_init() fail!"; + goto err_create_mux_obj_2; + } + SWPS_DEBUG("%s: created MUX object :%d\n", __func__, gpio); + return obj_p; + +err_create_mux_obj_2: + kfree(obj_p); +err_create_mux_obj_1: + SWPS_ERR("%s: %s :%d\n", __func__, emsg, gpio); + return NULL; +} + + +int +init_mux_objs(unsigned gpio){ + + struct mux_obj_s *curr_p = NULL; + char *emsg = "ERR"; + + /* Create MUX control object */ + if (mux_head_p) { + SWPS_DEBUG("%s: mux_head_p is not NULL!\n", __func__); + clean_mux_objs(); + } + /* Currently, it is using single muxctl architecture. + * In the future, it may use the multi-muxctl. + * (Ex: Aurora 610's advance I2C control) + */ + curr_p = _create_mux_obj(gpio); + if (!curr_p) { + emsg = "_create_mux_obj fail"; + goto err_init_mux_objs; + } + curr_p->next = NULL; + mux_head_p = curr_p; + SWPS_DEBUG("%s: all done. :%d\n", __func__, gpio); + return 0; + +err_init_mux_objs: + clean_mux_objs(); + SWPS_ERR("%s: %s\n", __func__, emsg); + return -1; +} +EXPORT_SYMBOL(init_mux_objs); + + +/* For single ko module + * => You need to declare MODULE_LICENSE If you want to build single module along. + * => Ex: For ONL platform + */ +MODULE_LICENSE("GPL"); + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.h b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.h new file mode 100644 index 000000000000..b0ad952045d4 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_mux.h @@ -0,0 +1,51 @@ +#ifndef NET_MUX_H +#define NET_MUX_H + +#include + +/* MUX basic information */ +#define MUX_GPIO_LABEL "SWPS_RST_MUX" + +/* MUX reset GPIO define */ +#define MUX_RST_GPIO_FORCE (30100) +#define MUX_RST_GPIO_FORCE_RANGELEY (30101) +#define MUX_RST_GPIO_FORCE_HEDERA (30102) +#define MUX_RST_GPIO_48_PCA9548 (48) +#define MUX_RST_GPIO_69_PCA9548 (69) +#define MUX_RST_GPIO_249_PCA9548 (249) +#define MUX_RST_GPIO_500_PCA9548 (500) +#define MUX_RST_GPIO_505_PCA9548 (505) +#define MUX_RST_CPLD_C0_A77_70_74_RST_ALL (30201) + +/* MUX relate value define */ +#define MUX_RST_WAIT_MS_PCA9548 (1) +#define MUX_RST_WAIT_MS_CPLD (10) +#define MUX_RST_MEM_ADDR_RANGELEY (0) // TBD +#define MUX_RST_MEM_ADDR_HEDERA (0x548) + +/* MUX error code define */ +#define ERR_MUX_UNEXCPT (-399) + +struct mux_obj_s { + struct i2c_client *i2c_client_p; + struct mux_obj_s *next; + unsigned gpio_num; + int (*_pull_high)(struct mux_obj_s *self); + int (*_pull_low)(struct mux_obj_s *self); + int (*_init)(struct mux_obj_s *self); + int (*_clean)(struct mux_obj_s *self); + int (*reset)(struct mux_obj_s *self); +}; + + +void clean_mux_objs(void); +int reset_mux_objs(void); +int init_mux_objs(unsigned gpio); + + +#endif /* NET_MUX_H */ + + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_platform.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_platform.c new file mode 100644 index 000000000000..dd4606302935 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_platform.c @@ -0,0 +1,281 @@ +#include +#include +#include +#include +#include +#include +#include +// #include +#include +#include + +// #define GPIO_BASE 0 // in kernel 4.x GPIO_BASE =0 ; in kernel 3.16.x , GPIO_BASE=180 +struct net_i2c_board_info { + int ch; + int size; + struct i2c_board_info *board_info; + int probe; +}; + +#define bus_id(id) (id) +#define SCL_PIN 58 +#define SDA_PIN 75 + +struct pca954x_platform_mode { + int adap_id; + unsigned int deselect_on_exit:1; + unsigned int class; +}; + +/* Per mux/switch data, used with i2c_register_board_info */ +struct pca954x_platform_data { + struct pca954x_platform_mode *modes; + int num_modes; +}; + +static struct pca954x_platform_mode mux_modes_0[] = { + {.adap_id = bus_id(2),}, {.adap_id = bus_id(3),}, + {.adap_id = bus_id(4),}, {.adap_id = bus_id(5),}, + {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, + {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, +}; +static struct pca954x_platform_mode mux_modes_0_0[] = { + {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, + {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, + {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, + {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, +}; + +static struct pca954x_platform_mode mux_modes_0_1[] = { + {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, + {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, + {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, + {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, +}; + +static struct pca954x_platform_mode mux_modes_0_2[] = { + {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, + {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, + {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, + {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, +}; + +static struct pca954x_platform_mode mux_modes_0_3[] = { + {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, + {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, + {.adap_id = bus_id(38),}, {.adap_id = bus_id(39),}, + {.adap_id = bus_id(40),}, {.adap_id = bus_id(41),}, +}; + +static struct pca954x_platform_mode mux_modes_0_4[] = { + {.adap_id = bus_id(42),}, {.adap_id = bus_id(43),}, + {.adap_id = bus_id(44),}, {.adap_id = bus_id(45),}, + {.adap_id = bus_id(46),}, {.adap_id = bus_id(47),}, + {.adap_id = bus_id(48),}, {.adap_id = bus_id(49),}, +}; + +static struct pca954x_platform_mode mux_modes_0_5[] = { + {.adap_id = bus_id(50),}, {.adap_id = bus_id(51),}, + {.adap_id = bus_id(52),}, {.adap_id = bus_id(53),}, + {.adap_id = bus_id(54),}, {.adap_id = bus_id(55),}, + {.adap_id = bus_id(56),}, {.adap_id = bus_id(57),}, +}; + +static struct pca954x_platform_mode mux_modes_0_6[] = { + {.adap_id = bus_id(58),}, {.adap_id = bus_id(59),}, + {.adap_id = bus_id(60),}, {.adap_id = bus_id(61),}, + {.adap_id = bus_id(62),}, {.adap_id = bus_id(63),}, + {.adap_id = bus_id(64),}, {.adap_id = bus_id(65),}, +}; + +//no i2c device driver attach to mux 7 + + +static struct pca954x_platform_data mux_data_0 = { + .modes = mux_modes_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_0 = { + .modes = mux_modes_0_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_1 = { + .modes = mux_modes_0_1, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_2 = { + .modes = mux_modes_0_2, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_3 = { + .modes = mux_modes_0_3, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_4 = { + .modes = mux_modes_0_4, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_5 = { + .modes = mux_modes_0_5, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_6 = { + .modes = mux_modes_0_6, + .num_modes = 8, +}; + +static struct i2c_board_info i2c_device_info0[] __initdata = { +// {"net_cpld", 0, 0x77, 0, 0, 0},//cpld + {"pca9548", 0, 0x70, "pca9548-1", (void *)&mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info2[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-2", (void *)&mux_data_0_0, 0, 0}, +}; +static struct i2c_board_info i2c_device_info3[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-3", (void *)&mux_data_0_1, 0, 0}, +}; +static struct i2c_board_info i2c_device_info4[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-4", (void *)&mux_data_0_2, 0, 0}, +}; +static struct i2c_board_info i2c_device_info5[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-5", (void *)&mux_data_0_3, 0, 0}, +}; +static struct i2c_board_info i2c_device_info6[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-6", (void *)&mux_data_0_4, 0, 0}, +}; +static struct i2c_board_info i2c_device_info7[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-7", (void *)&mux_data_0_5, 0, 0}, +}; +static struct i2c_board_info i2c_device_info8[] __initdata = { + {"pca9548", 0, 0x72, "pca9548-8", (void *)&mux_data_0_6, 0, 0}, +}; + + +static struct net_i2c_board_info i2cdev_list[] = { + {bus_id(0), ARRAY_SIZE(i2c_device_info0), i2c_device_info0, 1}, //mux root + {bus_id(1), ARRAY_SIZE(i2c_device_info0), i2c_device_info0, 1}, //mux root + {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2, 0}, //mux 0 + {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3, 0}, //mux 1 + {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4, 0}, //mux 2 + {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5, 0}, //mux 3 + {bus_id(6), ARRAY_SIZE(i2c_device_info6), i2c_device_info6, 0}, //mux 4 + {bus_id(7), ARRAY_SIZE(i2c_device_info7), i2c_device_info7, 0}, //mux 5 + {bus_id(8), ARRAY_SIZE(i2c_device_info8), i2c_device_info8, 0}, //mux 6 +}; + +static struct gpiod_lookup_table net_i2c_gpiod_table = { + .dev_id = "i2c-gpio.1", + .table = { + GPIO_LOOKUP_IDX("gpio_ich", SDA_PIN, NULL, 0, GPIO_OPEN_DRAIN), //I2C_SDA + GPIO_LOOKUP_IDX("gpio_ich", SCL_PIN, NULL, 1, GPIO_OPEN_DRAIN), //I2C_SCL + }, +}; + +#define NET_PLATFORM_CLIENT_MAX_NUM 100 /*A big enough number for sum of i2cdev_list[i].size */ +static int client_list_index = 0; +static struct i2c_client *client_list[NET_PLATFORM_CLIENT_MAX_NUM] = {0}; + +static void i2cgpio_device_release(struct device *dev) +{ + gpiod_remove_lookup_table(&net_i2c_gpiod_table); +} + +static struct i2c_gpio_platform_data i2c_platform_data = { + .udelay = 5, //5:100kHz +// .sda_is_open_drain = 0, +// .scl_is_open_drain = 0, +// .scl_is_output_only = 0 +}; + +static struct platform_device device_i2c_gpio0 = { + .name = "i2c-gpio", + .id = 1, + .dev = { + .platform_data = &i2c_platform_data, + .release = i2cgpio_device_release, + }, +}; + + +static int __init net_platform_init(void) +{ + struct i2c_adapter *adap = NULL; + struct i2c_client *e = NULL; + int ret = 0; + int i,j,k; + + //printk("%s \n", __func__); + + //use i2c-gpio + //register i2c gpio + //config gpio58,75 to gpio function 58=32+3*8+2 75=32*2+8*1+3 gpio69=32*2+8*0+5 + outl( inl(0x533) | (1<<2), 0x533); //i2c-gpio sdl (GPIO58) + outl( inl(0x541) | (1<<3), 0x541); //i2c-gpio sda (GPIO75) + outl( inl(0x540) | (1<<5), 0x540); //RST_I2C_MUX_N (GPIO69) + outl( inl(0x500) | (1<<7), 0x500); //SYS_RDY_N (GPIO7) + outl( inl(0x501) | (1<<7), 0x501); //BMC_HEART_BEAT (GPIO15) + outl( inl(0x503) | (1<<2)|(1<<3), 0x503); //PSOC_HEART_BEAT(26),CPLD_HEART_BEAT(27) + + gpiod_add_lookup_table(&net_i2c_gpiod_table); + + ret = platform_device_register(&device_i2c_gpio0); + if (ret) { + printk(KERN_ERR "i2c-gpio: platform_device_register fail %d\n", ret); + } + msleep(10); + + for(i=0; i=0; i--) { + i2c_unregister_device(client_list[i]); + } + + device_i2c_gpio0.dev.platform_data = NULL; + platform_device_unregister(&device_i2c_gpio0); + printk("net_platform_exit done\n"); +} + +module_init(net_platform_init); +module_exit(net_platform_exit); + +MODULE_AUTHOR("Netberg "); +MODULE_DESCRIPTION("Netberg Platform devices"); +MODULE_LICENSE("GPL"); diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_psoc.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_psoc.c new file mode 100644 index 000000000000..67389d487bf3 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_psoc.c @@ -0,0 +1,996 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define SWITCH_TEMPERATURE_SOCK "/proc/switch/temp" +#define PSOC_POLLING_PERIOD 1000 + +#include +#include +#include +#include + +#define IPMI_MAX_INTF (4) +#define NETFN_OEM 0x30 +#define CMD_GETDATA 0x31 +#define CMD_SETDATA 0x32 +#define FAN_NUM 4 +#define PSU_NUM 2 + +#define FAN_CLEI_SUPPORT 1 +#define PSU_CLEI_SUPPORT 0 + +#define PSU1 0x5800 +#define PSU2 0x5900 +#define BMC_PMBusNumber 3 +#define PMBus_Vendor 0x99 +#define PMBus_Serial 0x9E +#define PMBus_Temp2 0x8E +#define PMBus_Version 0x9B +#define MaxLeng_Result 0x40 + +#define BMC_FanCLEIBusNumber 9 +#define DEVICE_CLEI_ADDR 0x52,0x53,0x54,0x55,0x56,0x50,0x51 + +#define MAX_IPMI_RECV_LENGTH 0xff +static char CLEI_ADDR[]={DEVICE_CLEI_ADDR}; +struct task_struct *kthread_auto_update; +static long pmbus_reg2data_linear(int data, int linear16); +struct ipmi_result{ + char result[MAX_IPMI_RECV_LENGTH]; + int result_length; +}; + +DEFINE_MUTEX(ipmi_mutex); +DEFINE_MUTEX(ipmi2_mutex); +static struct ipmi_result ipmiresult; +static struct device *hwmon_dev; +static struct kobject *device_kobj; +static struct ipmi_user *ipmi_mh_user = NULL; +static void msg_handler(struct ipmi_recv_msg *msg,void* handler_data); +static struct ipmi_user_hndl ipmi_hndlrs = { .ipmi_recv_hndl = msg_handler,}; + +static atomic_t dummy_count = ATOMIC_INIT(0); +static void dummy_smi_free(struct ipmi_smi_msg *msg) +{ + atomic_dec(&dummy_count); +} +static void dummy_recv_free(struct ipmi_recv_msg *msg) +{ + atomic_dec(&dummy_count); +} +static struct ipmi_smi_msg halt_smi_msg = { + .done = dummy_smi_free +}; +static struct ipmi_recv_msg halt_recv_msg = { + .done = dummy_recv_free +}; + +struct __attribute__ ((__packed__)) psoc_psu_layout { + u16 psu1_iin; + u16 psu2_iin; + u16 psu1_iout; + u16 psu2_iout; + + u16 psu1_pin; + u16 psu2_pin; + u16 psu1_pout; + u16 psu2_pout; + + u16 psu1_vin; + u16 psu2_vin; + u16 psu1_vout; + u16 psu2_vout; +}; + +struct __attribute__ ((__packed__)) clei { + u8 issue_number[3]; + u8 abbreviation_number[9]; + u8 fc_number[10]; + u8 clei_code[10]; + u8 product_year_and_month[5]; + u8 label_location_code[2]; + u8 serial_number[5]; + u8 pcb_revision[5]; + u8 vendor_name[10]; + u8 reserved[5]; +}; + +struct __attribute__ ((__packed__)) psoc_layout { + u8 ctl; //offset: 0 + u16 switch_temp; //offset: 1 + + // BYTE[03:20] - voltage + u16 voltage[15]; //offset: 0x03-0x20 + + // BYTE[21:27] - ExtFan + u8 led_ctl2; //offset: 21 + u8 ext_pwm; //offset: 22 + u16 ext_rpm[2]; //offset: 23 + u8 gpi_fan2; //offset: 27 + + //gpo + u8 led_ctl; //offset: 28 + + u8 gpio; //offset: 29 + + //pwm duty + u8 pwm[4]; //offset: 2a + u8 pwm_psu[2]; //offset: 2e + + //fan rpm + u16 fan[4*2]; //offset: 30 + + u8 reserve1[4]; //offset: 40 + + //gpi + u8 gpi_fan; //offset: 44 + + //psu state + u8 psu_state; //offset: 45 + + //temperature + u16 temp[5]; //offset: 46 + u16 temp_psu[2]; //offset: 50 + + //version + u8 version[2]; //offset: 54 + + u8 reserve2[4]; //offset: 56 + struct psoc_psu_layout psu_info; //offset: 5a +}; + +/* definition */ +#define PSOC_OFF(m) offsetof(struct psoc_layout, m) +#define PSOC_PSU_OFF(m) offsetof(struct psoc_psu_layout, m) + +#define SWITCH_TMP_OFFSET PSOC_OFF(switch_temp) +#define PWM_OFFSET PSOC_OFF(pwm) +#define THERMAL_OFFSET PSOC_OFF(temp) +#define RPM_OFFSET PSOC_OFF(fan) +#define DIAG_FLAG_OFFSET PSOC_OFF(ctl) +#define FAN_LED_OFFSET PSOC_OFF(led_ctl) +#define FAN_GPI_OFFSET PSOC_OFF(gpi_fan) +#define PSOC_PSU_OFFSET PSOC_OFF(psu_state) +#define VERSION_OFFSET PSOC_OFF(version) +#define PSU_INFO_OFFSET PSOC_OFF(psu_info) + +#define PWM2_OFFSET PSOC_OFF(ext_pwm) +#define RPM2_OFFSET PSOC_OFF(ext_rpm) +#define FAN_LED2_OFFSET PSOC_OFF(led_ctl2) +#define FAN_GPI2_OFFSET PSOC_OFF(gpi_fan2) + +#define CLEI_OFF(m) offsetof(struct clei, m) +#define FAN1_CLEI_INDEX 0 +#define FAN2_CLEI_INDEX 1 +#define FAN3_CLEI_INDEX 2 +#define FAN4_CLEI_INDEX 3 +#define FAN5_CLEI_INDEX 4 +#define PSU1_CLEI_INDEX 5 +#define PSU2_CLEI_INDEX 6 + +static void msg_handler(struct ipmi_recv_msg *recv_msg,void* handler_data) +{ + struct ipmi_result *msg_result = recv_msg->user_msg_data; + + if(recv_msg->msg.data[0]==0 && recv_msg->msg.data_len>0) { + msg_result->result_length=recv_msg->msg.data_len-1; + memcpy(msg_result->result, &recv_msg->msg.data[1], recv_msg->msg.data_len-1); + } + ipmi_free_recv_msg(recv_msg); + mutex_unlock(&ipmi_mutex); + + return; +} + +int start_ipmi_command(char NetFn, char cmd,char *data,int data_length, char* result, int* result_length) +{ + int rv=0,i; + int timeout; + + //wait previous command finish at least 50msec + timeout=50; + while((mutex_is_locked(&ipmi_mutex) == 1 || (mutex_is_locked(&ipmi2_mutex) == 1)) && (--timeout)>0) { usleep_range(1000,1010); } + if(timeout==0) { return -1; } + mutex_lock(&ipmi_mutex); + mutex_lock(&ipmi2_mutex); + + if(ipmi_mh_user == NULL) { + for (i=0,rv=1; i0) { usleep_range(1000,1100);} + if(timeout==0) { + mutex_unlock(&ipmi2_mutex); + return -1; + } + else { + *result_length=ipmiresult.result_length; + memcpy(result,ipmiresult.result,*result_length); + mutex_unlock(&ipmi2_mutex); + return 0; + } + } + return 0; +} +EXPORT_SYMBOL(start_ipmi_command); + +static ssize_t psoc_ipmi_read(u8 *buf, u8 offset, size_t count) +{ + uint8_t data[2]; + int result_len=0; + int rv; + + data[0] = offset; + data[1] = count; + + rv=start_ipmi_command(NETFN_OEM, CMD_GETDATA,data,2, buf, &result_len); + + return result_len; +} + +static ssize_t psoc_ipmi_write(char *buf, unsigned offset, size_t count) +{ + uint8_t data[count+1],result[1]; + int result_len; + + data[0] = offset; + memcpy(&data[1],buf,count); + + start_ipmi_command(NETFN_OEM, CMD_SETDATA,data,count+1, result, &result_len); + return count; +} + + +static u16 psoc_read16(u8 offset) +{ + u16 value = 0; + u8 buf[]={0,0}; + + if(psoc_ipmi_read(buf, offset, 2) == 2){ + value = (buf[0]<<8 | buf[1]<<0); + } + + return value; +} + +static u8 psoc_read8(u8 offset) +{ + u8 value = 0; + u8 buf = 0; + + if(psoc_ipmi_read(&buf, offset, 1) == 1){ + value = buf; + } + + return value; +} + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu1 | psu0 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu_st(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 byte=0; + int shift = (attr->index == 0)?3:0; + + status = psoc_ipmi_read(&byte, PSOC_PSU_OFFSET, 1); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + +static ssize_t show_ipmi_pmbus(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + uint8_t data[4],result[MaxLeng_Result]; + int result_len=0; + + data[0] = BMC_PMBusNumber; + data[1] = (attr->index & 0xFF00 ) >>7; + data[3] = attr->index & 0xff; + if(data[3]==PMBus_Temp2) + {data[2]=2;} + else + {data[2]=MaxLeng_Result;} + + if(start_ipmi_command(0x06, 0x52,data,4, result, &result_len)==0) + { + if(data[3]==PMBus_Temp2) + { + return sprintf(buf, "%ld \n", pmbus_reg2data_linear(result[0] | (result[1]<<8), 0 )); + } + result[result[0]+1]='\0'; + return sprintf(buf, "%s\n",&result[1] ); + } + else + { + return 0; + } +} + +static ssize_t show_clei(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 device_index = attr->index & 0xFF; + + uint8_t data[5],result[MaxLeng_Result]; + int result_len=0; + + data[0] = (device_index<=FAN5_CLEI_INDEX) ? BMC_FanCLEIBusNumber:BMC_PMBusNumber; + data[1] = CLEI_ADDR[device_index]<<1; + data[2] = sizeof(struct clei); + data[3] = (device_index<=FAN5_CLEI_INDEX) ? 0x00 : 0x01; //PSU CLEI will start from 0x0100 + data[4] = 0; + + if(start_ipmi_command(0x06, 0x52,data,5, result, &result_len)==0) + { + if(result_len < sizeof(struct clei)) memset(result, 0, sizeof(struct clei)); + sprintf (buf, "Issue Number: %.3s\n", &result[CLEI_OFF(issue_number)]); + sprintf (buf, "%sAbbreviation Number: %.9s\n", buf, &result[CLEI_OFF(abbreviation_number)]); + sprintf (buf, "%sFC Number: %.10s\n", buf, &result[CLEI_OFF(fc_number)]); + sprintf (buf, "%sCLEI Code: %.10s\n", buf, &result[CLEI_OFF(clei_code)]); + sprintf (buf, "%sProduct Year and Month: %.5s\n", buf, &result[CLEI_OFF(product_year_and_month)]); + sprintf (buf, "%s2D Label Location Code: %.2s\n", buf, &result[CLEI_OFF(label_location_code)]); + sprintf (buf, "%sSerial Number: %.5s\n", buf, &result[CLEI_OFF(serial_number)]); + sprintf (buf, "%sPCB Revision: %.5s\n", buf, &result[CLEI_OFF(pcb_revision)]); + sprintf (buf, "%sVendor Name: %.10s\n", buf, &result[CLEI_OFF(vendor_name)]); + return strlen(buf); + } + else + { + return sprintf(buf, "NONE\n"); + } +} + +static ssize_t show_thermal(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index * 2 + THERMAL_OFFSET; + + status = psoc_read16(offset); + + return sprintf(buf, "%d\n", + (s8)(status>>8) * 1000 ); +} + +static ssize_t show_pwm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index; + + status = psoc_read8(offset); + + return sprintf(buf, "%d\n", + status); +} + +static ssize_t set_pwm(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index; + u8 pwm = simple_strtol(buf, NULL, 10); + if(pwm > 255) pwm = 255; + psoc_ipmi_write(&pwm, offset, 1); + + return count; +} + + +static ssize_t show_rpm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index; + status = psoc_read16(offset); + + return sprintf(buf, "%d\n", + status); +} + +static ssize_t show_switch_tmp(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status=0; + u16 temp = 0; + + status = psoc_ipmi_read((u8*)&temp, SWITCH_TMP_OFFSET, 2); + + status = sprintf (buf, "%d\n", (s8)(temp>>8) * 1000 ); + + return strlen(buf); +} + +static ssize_t set_switch_tmp(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + long temp = simple_strtol(buf, NULL, 10); + u16 temp2 = ( (temp/1000) <<8 ) & 0xFF00 ; + + psoc_ipmi_write((u8*)&temp2, SWITCH_TMP_OFFSET, 2); + + + return count; +} + +static ssize_t show_diag(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status=0; + u8 diag_flag = 0; + + status = psoc_ipmi_read((u8*)&diag_flag, DIAG_FLAG_OFFSET, 1); + + status = sprintf (buf, "%d\n", ((diag_flag & 0x80)?1:0)); + + return strlen(buf); +} + +static ssize_t set_diag(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + u8 value = 0; + u8 diag = simple_strtol(buf, NULL, 10); + + diag = diag?1:0; + + psoc_ipmi_read((u8*)&value, DIAG_FLAG_OFFSET, 1); + if(diag) value |= (1<<7); + else value &= ~(1<<7); + psoc_ipmi_write((u8*)&value, DIAG_FLAG_OFFSET, 1); + + return count; +} + +static ssize_t show_version(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status=0; + + status = psoc_read16(VERSION_OFFSET); + + return sprintf(buf, "ver: %x.%x\n", (status & 0xFF00)>>8, (status & 0xFF) ); +} + + +static ssize_t show_fan_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 bit = attr->index; + + if(bit < 8) { status = psoc_read8(FAN_LED_OFFSET); } +#if FAN_NUM>4 + if(bit >= 8) { status = psoc_read8(FAN_LED2_OFFSET); bit-=8; } +#endif + + return sprintf(buf, "%d\n", + (status & (1<index; + u8 led_state = 0; + + u8 v = simple_strtol(buf, NULL, 10); + + if(attr->index < 8) { led_state = psoc_read8(FAN_LED_OFFSET ); } +#if FAN_NUM>4 + if(attr->index >= 8) { led_state = psoc_read8(FAN_LED2_OFFSET); bit-=8; } +#endif + if(v) led_state |= (1<index < 8) { psoc_ipmi_write(&led_state, FAN_LED_OFFSET, 1);} +#if FAN_NUM>4 + if(attr->index >= 8) { psoc_ipmi_write(&led_state, FAN_LED2_OFFSET,1);} +#endif + return count; +} + +static ssize_t show_value8(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index; + + status = psoc_read8(offset); + + return sprintf(buf, "0x%02X\n", status ); +} + +static long pmbus_reg2data_linear(int data, int linear16) +{ + s16 exponent; + s32 mantissa; + long val; + + if (linear16) { /* LINEAR16 */ + exponent = -9; + mantissa = (u16) data; + } else { /* LINEAR11 */ + exponent = ((s16)data) >> 11; + exponent = ((s16)( data & 0xF800) ) >> 11; + mantissa = ((s32)((data & 0x7ff) << 5)) >> 5; + } + + //printk("data=%d, m=%d, e=%d\n", data, exponent, mantissa); + val = mantissa; + + /* scale result to micro-units for power sensors */ + val = val * 1000L; + + if (exponent >= 0) + val <<= exponent; + else + val >>= -exponent; + + return val; +} + +static ssize_t show_psu_psoc(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status=0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + u8 offset = attr->index + PSU_INFO_OFFSET; + + status = psoc_read16(offset); + + if((strstr(attr->dev_attr.attr.name, "vout")!=NULL)|(strstr(attr->dev_attr.attr.name, "in3")!=NULL)|(strstr(attr->dev_attr.attr.name, "in4")!=NULL)) { + offset=1; + } + else { + offset=0; + } + + return sprintf(buf, "%ld \n", pmbus_reg2data_linear(status, offset )); +} + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) +static ssize_t show_name(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + return sprintf(buf, "net_psoc\n"); +} + +static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); +#endif +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_thermal, 0, 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_thermal, 0, 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_thermal, 0, 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_thermal, 0, 3); +static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_thermal, 0, 4); +static SENSOR_DEVICE_ATTR(thermal_psu1, S_IRUGO, show_thermal, 0, 5); +static SENSOR_DEVICE_ATTR(thermal_psu2, S_IRUGO, show_thermal, 0, 6); +static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_thermal, 0, 5); +static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_thermal, 0, 6); + +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 0 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 1 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 2 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 3 + PWM_OFFSET); +#if FAN_NUM > 4 +static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 0 + PWM2_OFFSET); +#endif +static SENSOR_DEVICE_ATTR(pwm_psu1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 4 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm_psu2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 5 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm6, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 4 + PWM_OFFSET); +static SENSOR_DEVICE_ATTR(pwm7, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 5 + PWM_OFFSET); + +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu_st, 0, 0); +static SENSOR_DEVICE_ATTR(psu2, S_IRUGO, show_psu_st, 0, 1); + +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, 0, 0*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_rpm, 0, 1*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_rpm, 0, 2*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_rpm, 0, 3*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_rpm, 0, 4*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_rpm, 0, 5*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_rpm, 0, 6*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_rpm, 0, 7*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(rpm_psu1, S_IRUGO, show_rpm, 0, 8*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(rpm_psu2, S_IRUGO, show_rpm, 0, 9*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan11_input, S_IRUGO, show_rpm, 0, 8*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan12_input, S_IRUGO, show_rpm, 0, 9*2 + RPM_OFFSET); + +#if FAN_NUM > 4 +static SENSOR_DEVICE_ATTR(fan9_input , S_IRUGO, show_rpm, 0,0*2 + RPM2_OFFSET); +static SENSOR_DEVICE_ATTR(fan10_input, S_IRUGO, show_rpm, 0,1*2 + RPM2_OFFSET); +#endif + +static SENSOR_DEVICE_ATTR(switch_tmp, S_IWUSR|S_IRUGO, show_switch_tmp, set_switch_tmp, 0); +static SENSOR_DEVICE_ATTR(temp6_input, S_IWUSR|S_IRUGO, show_switch_tmp, set_switch_tmp, 0); + +static SENSOR_DEVICE_ATTR(diag, S_IWUSR|S_IRUGO, show_diag, set_diag, 0); +static SENSOR_DEVICE_ATTR(version, S_IRUGO, show_version, 0, 0); + +static SENSOR_DEVICE_ATTR(fan_led_grn1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 0); +static SENSOR_DEVICE_ATTR(fan_led_grn2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 1); +static SENSOR_DEVICE_ATTR(fan_led_grn3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 2); +static SENSOR_DEVICE_ATTR(fan_led_grn4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 3); +static SENSOR_DEVICE_ATTR(fan_led_red1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 4); +static SENSOR_DEVICE_ATTR(fan_led_red2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 5); +static SENSOR_DEVICE_ATTR(fan_led_red3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 6); +static SENSOR_DEVICE_ATTR(fan_led_red4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 7); + +#if FAN_NUM>4 +static SENSOR_DEVICE_ATTR(fan_led_grn5, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 8); +static SENSOR_DEVICE_ATTR(fan_led_red5, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 12); +static SENSOR_DEVICE_ATTR(fan_gpi2, S_IRUGO, show_value8, 0, FAN_GPI2_OFFSET); +#endif + +static SENSOR_DEVICE_ATTR(fan_gpi, S_IRUGO, show_value8, 0, FAN_GPI_OFFSET); +static SENSOR_DEVICE_ATTR(psoc_psu1_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pout)); + +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vin)); +static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iin)); +static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pin)); +static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vout)); +static SENSOR_DEVICE_ATTR(curr3_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iout)); +static SENSOR_DEVICE_ATTR(power3_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pout)); + +static SENSOR_DEVICE_ATTR(psoc_psu2_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pout)); + +static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vin)); +static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iin)); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pin)); +static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vout)); +static SENSOR_DEVICE_ATTR(curr4_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iout)); +static SENSOR_DEVICE_ATTR(power4_input, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pout)); + +//IPMI +static SENSOR_DEVICE_ATTR(thermal2_psu1, S_IRUGO, show_ipmi_pmbus, 0, PSU1 | PMBus_Temp2); +static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_ipmi_pmbus, 0, PSU1 | PMBus_Temp2); + +static SENSOR_DEVICE_ATTR(psoc_psu1_vendor, S_IRUGO, show_ipmi_pmbus, 0, PSU1 | PMBus_Vendor); +static SENSOR_DEVICE_ATTR(psoc_psu1_serial, S_IRUGO, show_ipmi_pmbus, 0, PSU1 | PMBus_Serial); +static SENSOR_DEVICE_ATTR(psoc_psu1_version, S_IRUGO, show_ipmi_pmbus, 0, PSU1 | PMBus_Version); + +static SENSOR_DEVICE_ATTR(thermal2_psu2, S_IRUGO, show_ipmi_pmbus, 0, PSU2 | PMBus_Temp2); +static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_ipmi_pmbus, 0, PSU2 | PMBus_Temp2); +static SENSOR_DEVICE_ATTR(psoc_psu2_vendor, S_IRUGO, show_ipmi_pmbus, 0, PSU2 | PMBus_Vendor); +static SENSOR_DEVICE_ATTR(psoc_psu2_serial, S_IRUGO, show_ipmi_pmbus, 0, PSU2 | PMBus_Serial); +static SENSOR_DEVICE_ATTR(psoc_psu2_version, S_IRUGO, show_ipmi_pmbus, 0, PSU2 | PMBus_Version); + +//CLEI +#if FAN_CLEI_SUPPORT +static SENSOR_DEVICE_ATTR(fan1_clei, S_IRUGO, show_clei, 0, FAN1_CLEI_INDEX ); +static SENSOR_DEVICE_ATTR(fan2_clei, S_IRUGO, show_clei, 0, FAN2_CLEI_INDEX ); +static SENSOR_DEVICE_ATTR(fan3_clei, S_IRUGO, show_clei, 0, FAN3_CLEI_INDEX ); +static SENSOR_DEVICE_ATTR(fan4_clei, S_IRUGO, show_clei, 0, FAN4_CLEI_INDEX ); +#if FAN_NUM > 4 +static SENSOR_DEVICE_ATTR(fan5_clei, S_IRUGO, show_clei, 0, FAN5_CLEI_INDEX ); +#endif +#endif + +#if PSU_CLEI_SUPPORT +static SENSOR_DEVICE_ATTR(psu1_clei, S_IRUGO, show_clei, 0, PSU1_CLEI_INDEX ); +static SENSOR_DEVICE_ATTR(psu2_clei, S_IRUGO, show_clei, 0, PSU2_CLEI_INDEX ); +#endif + +static struct attribute *psoc_attributes[] = { +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) + //name + &dev_attr_name.attr, +#endif + //thermal + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp4_input.dev_attr.attr, + &sensor_dev_attr_temp5_input.dev_attr.attr, + &sensor_dev_attr_thermal_psu1.dev_attr.attr, + &sensor_dev_attr_thermal_psu2.dev_attr.attr, + + &sensor_dev_attr_temp7_input.dev_attr.attr, + &sensor_dev_attr_temp8_input.dev_attr.attr, + + //pwm + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, +#if FAN_NUM > 4 + &sensor_dev_attr_pwm5.dev_attr.attr, +#endif + &sensor_dev_attr_pwm_psu1.dev_attr.attr, + &sensor_dev_attr_pwm_psu2.dev_attr.attr, + &sensor_dev_attr_pwm6.dev_attr.attr, + &sensor_dev_attr_pwm7.dev_attr.attr, + + //rpm + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan6_input.dev_attr.attr, + &sensor_dev_attr_fan7_input.dev_attr.attr, + &sensor_dev_attr_fan8_input.dev_attr.attr, +#if FAN_NUM > 4 + &sensor_dev_attr_fan9_input.dev_attr.attr, + &sensor_dev_attr_fan10_input.dev_attr.attr, +#endif + &sensor_dev_attr_rpm_psu1.dev_attr.attr, + &sensor_dev_attr_rpm_psu2.dev_attr.attr, + &sensor_dev_attr_fan11_input.dev_attr.attr, + &sensor_dev_attr_fan12_input.dev_attr.attr, + //switch temperature + &sensor_dev_attr_switch_tmp.dev_attr.attr, + &sensor_dev_attr_temp6_input.dev_attr.attr, + + //diag flag + &sensor_dev_attr_diag.dev_attr.attr, + + //version + &sensor_dev_attr_version.dev_attr.attr, + + //fan led + &sensor_dev_attr_fan_led_grn1.dev_attr.attr, + &sensor_dev_attr_fan_led_grn2.dev_attr.attr, + &sensor_dev_attr_fan_led_grn3.dev_attr.attr, + &sensor_dev_attr_fan_led_grn4.dev_attr.attr, + &sensor_dev_attr_fan_led_red1.dev_attr.attr, + &sensor_dev_attr_fan_led_red2.dev_attr.attr, + &sensor_dev_attr_fan_led_red3.dev_attr.attr, + &sensor_dev_attr_fan_led_red4.dev_attr.attr, +#if FAN_NUM >4 + &sensor_dev_attr_fan_led_grn5.dev_attr.attr, + &sensor_dev_attr_fan_led_red5.dev_attr.attr, + &sensor_dev_attr_fan_gpi2.dev_attr.attr, +#endif + //fan GPI + &sensor_dev_attr_fan_gpi.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + &sensor_dev_attr_psu2.dev_attr.attr, + + + //psu_psoc + &sensor_dev_attr_psoc_psu1_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pout.dev_attr.attr, + + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_curr1_input.dev_attr.attr, + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_in3_input.dev_attr.attr, + &sensor_dev_attr_curr3_input.dev_attr.attr, + &sensor_dev_attr_power3_input.dev_attr.attr, + &sensor_dev_attr_in4_input.dev_attr.attr, + &sensor_dev_attr_curr4_input.dev_attr.attr, + &sensor_dev_attr_power4_input.dev_attr.attr, + + //ipmi_i2c_command + &sensor_dev_attr_thermal2_psu1.dev_attr.attr, + &sensor_dev_attr_temp9_input.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_vendor.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_serial.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_version.dev_attr.attr, + + &sensor_dev_attr_thermal2_psu2.dev_attr.attr, + &sensor_dev_attr_temp10_input.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vendor.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_serial.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_version.dev_attr.attr, + + //clei +#if FAN_CLEI_SUPPORT + &sensor_dev_attr_fan1_clei.dev_attr.attr, + &sensor_dev_attr_fan2_clei.dev_attr.attr, + &sensor_dev_attr_fan3_clei.dev_attr.attr, + &sensor_dev_attr_fan4_clei.dev_attr.attr, +#if FAN_NUM > 4 + &sensor_dev_attr_fan5_clei.dev_attr.attr, +#endif +#endif + +#if PSU_CLEI_SUPPORT + &sensor_dev_attr_psu1_clei.dev_attr.attr, + &sensor_dev_attr_psu2_clei.dev_attr.attr, +#endif + NULL +}; + +static const struct attribute_group psoc_group = { + .attrs = psoc_attributes, +}; + +//================================= +static void check_switch_temp(void) +{ + static struct file *f; +#ifdef set_fs + mm_segment_t old_fs=get_fs(); + set_fs(get_ds()); +#endif + f = filp_open(SWITCH_TEMPERATURE_SOCK,O_RDONLY,0644); + if(IS_ERR(f)) { + return; + } + + filp_close(f,NULL); +#ifdef set_fs + set_fs(old_fs); +#endif +} + +static int psoc_polling_thread(void *p) +{ + while (!kthread_should_stop()) + { + check_switch_temp(); + set_current_state(TASK_INTERRUPTIBLE); + if(kthread_should_stop()) + break; + + schedule_timeout(msecs_to_jiffies(PSOC_POLLING_PERIOD)); + } + return 0; +} + +static int __init net_psoc_init(void) +{ + int ret; + + hwmon_dev = hwmon_device_register_with_info(NULL, "net_psoc", NULL, NULL, NULL); + if (IS_ERR(hwmon_dev)) { + goto fail_hwmon_device_register; + } + + device_kobj = kobject_create_and_add("device", &hwmon_dev->kobj); + if(!device_kobj) { + goto fail_hwmon_device_register; + } + + ret = sysfs_create_group(device_kobj, &psoc_group); + if (ret) { + goto fail_create_group_hwmon; + } + + ret = sysfs_create_group(&hwmon_dev->kobj, &psoc_group); + if (ret) { + goto fail_create_group_hwmon; + } + + kthread_auto_update = kthread_run(psoc_polling_thread,NULL,"BMC_DRIVER"); + if (IS_ERR(kthread_auto_update)) { + goto fail_create_group_hwmon; + } + return ret; + +fail_create_group_hwmon: + hwmon_device_unregister(hwmon_dev); +fail_hwmon_device_register: + return -ENOMEM; +} + +static void __exit net_psoc_exit(void) +{ + kthread_stop(kthread_auto_update); + if(ipmi_mh_user!=NULL) {ipmi_destroy_user(ipmi_mh_user);} + sysfs_remove_group(device_kobj, &psoc_group); + if(hwmon_dev != NULL) hwmon_device_unregister(hwmon_dev); +} + +MODULE_AUTHOR("Netberg "); +MODULE_DESCRIPTION("Netberg psoc driver"); +MODULE_LICENSE("GPL"); + +module_init(net_psoc_init); +module_exit(net_psoc_exit); + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.c new file mode 100644 index 000000000000..cf619ef5fb7d --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.c @@ -0,0 +1,3074 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "net_swps.h" + +static int ctl_major; +static int port_major; +static int ioexp_total; +static int port_total; +static int block_polling; +static int auto_config; +static int flag_i2c_reset; +static int flag_mod_state; +static unsigned gpio_rest_mux; +static int gpio_base = 0; +static struct class *swp_class_p = NULL; +static struct net_platform_s *platform_p = NULL; +static struct net_ioexp_layout_s *ioexp_layout = NULL; +static struct net_port_layout_s *port_layout = NULL; +int io_no_init = 0; +module_param(io_no_init, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); +static void swp_polling_worker(struct work_struct *work); +static DECLARE_DELAYED_WORK(swp_polling, swp_polling_worker); + +static int reset_i2c_topology(void); + +static int +__swp_match(struct device *dev, +#ifdef SWPS_KERN_VER_AF_3_10 + + const void *data){ +#else + void *data){ +#endif + + char *name = (char *)data; + if (strcmp(dev_name(dev), name) == 0) + return 1; + return 0; +} + + +struct device * +get_swpdev_by_name(char *name){ + struct device *dev = class_find_device(swp_class_p, + NULL, + name, + __swp_match); + return dev; +} + + +static int +sscanf_2_int(const char *buf) { + + int result = -EBFONT; + char *hex_tag = "0x"; + + if (strcspn(buf, hex_tag) == 0) { + if (sscanf(buf,"%x",&result)) { + return result; + } + } else { + if (sscanf(buf,"%d",&result)) { + return result; + } + if(sscanf(buf,"-%d",&result)) { + return -result; + } + if (sscanf(buf,"%x",&result)) { + return result; + } + } + return -EBFONT; +} + + +static int +sscanf_2_binary(const char *buf) { + + int result = sscanf_2_int(buf); + + if (result < 0){ + return -EBFONT; + } + switch (result) { + case 0: + case 1: + return result; + default: + break; + } + return -EBFONT; +} + + +static int +_get_polling_period(void) { + + int retval = 0; + + if (SWP_POLLING_PERIOD == 0) { + return 0; + } + retval = ((SWP_POLLING_PERIOD * HZ) / 1000); + if (retval == 0) { + return 1; + } + return retval; +} + + +static struct transvr_obj_s * +_get_transvr_obj(char *dev_name) { + + struct device *dev_p = NULL; + struct transvr_obj_s *transvr_obj_p = NULL; + + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + return NULL; + } + transvr_obj_p = dev_get_drvdata(dev_p); + if (!transvr_obj_p){ + return NULL; + } + return transvr_obj_p; +} + + +static int +_is_i2c_target_exist(int chan, int addr) { + /* retval: Exist = 1 / Not exist = 0 / Error < 0 + */ + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + int retval = -1; + int err = -1; + int d_offs = 0; + + adap = i2c_get_adapter(chan); + if (!adap) { + SWPS_DEBUG("%s: can't get adapter\n", __func__); + retval = 0; + goto out_is_i2c_target_exist_1; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client) { + SWPS_ERR("%s: kzalloc fail\n", __func__); + retval = -1; + goto out_is_i2c_target_exist_2; + } + client->adapter = adap; + client->addr = addr; + err = i2c_smbus_read_byte_data(client, d_offs); + if (err < 0) { + retval = 0; + } else { + retval = 1; + } + i2c_put_adapter(adap); + kfree(client); + return retval; + +out_is_i2c_target_exist_2: + i2c_put_adapter(adap); +out_is_i2c_target_exist_1: + return retval; +} + + +static void +unlock_tobj_all(void) { + + struct transvr_obj_s *tobj_p; + char port_name[32]; + int port_id = 0; + int minor_curr = 0; + + for (minor_curr=0; minor_currauto_config = auto_config; + unlock_transvr_obj(tobj_p); + SWPS_DEBUG("%s: Set %s auto_config=%d\n", + __func__, tobj_p->swp_name, auto_config); + } + return retval; +} + + +/* ========== R/W Functions module control attribute ========== + */ +static ssize_t +show_attr_platform(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 32, "%s\n", platform_p->name); +} + + +static ssize_t +show_attr_version(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%s\n", SWP_VERSION); +} + + +static ssize_t +show_attr_status(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", flag_mod_state); +} + + +static ssize_t +show_attr_auto_config(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", auto_config); +} + + +static ssize_t +show_attr_block_poll(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", block_polling); +} + +static ssize_t +show_attr_io_no_init(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", io_no_init); +} + + +static int +_check_reset_pwd(const char *buf_p, + size_t count) { + + int in_max = 64; + int in_len = (int)count; + char in_val[64] = "ERR"; + char *emsg = "ERR"; + + if (in_len >= in_max) { + emsg = "input too much"; + goto err_check_reset_pwd; + } + if (!sscanf(buf_p,"%s",in_val)) { + emsg = "format incorrect"; + goto err_check_reset_pwd; + } + if (strcmp(in_val, SWP_RESET_PWD) != 0) { + emsg = "password incorrect"; + goto err_check_reset_pwd; + } + return 0; + +err_check_reset_pwd: + SWPS_ERR("%s: %s\n", __func__, emsg); + return -1; +} + + +static ssize_t +store_attr_reset_i2c(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + if (_check_reset_pwd(buf_p, count) < 0) { + return -EBFONT; + } + /* Polling mode */ + if (SWP_POLLING_ENABLE) { + SWPS_INFO("%s: reset I2C :polling\n", __func__); + flag_i2c_reset = 1; + return count; + } + /* Direct mode */ + SWPS_INFO("%s: reset I2C go. :direct\n", __func__); + if (reset_i2c_topology() < 0) { + SWPS_ERR("%s: reset fail!\n", __func__); + return -EIO; + } + SWPS_INFO("%s: reset I2C ok. :direct\n", __func__); + return count; +} + + +static ssize_t +store_attr_reset_swps(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p; + char port_name[32] = "ERR"; + int port_id = 0; + int minor_curr = 0; + + if (_check_reset_pwd(buf_p, count) < 0) { + return -EBFONT; + } + for (minor_curr=0; minor_currstate = STATE_TRANSVR_DISCONNECTED; + unlock_transvr_obj(tobj_p); + SWPS_INFO("%s: reset:%s\n", __func__, tobj_p->swp_name); + } + return count; +} + + +static ssize_t +store_attr_auto_config(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + int input_val = sscanf_2_int(buf_p); + + if (input_val < 0){ + return -EBFONT; + } + if ((input_val != 0) && (input_val != 1)) { + return -EBFONT; + } + auto_config = input_val; + _update_auto_config_2_trnasvr(); + return count; +} + + +static ssize_t +store_attr_block_poll( struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + int input_val = sscanf_2_int(buf_p); + + if (input_val < 0){ + return -EBFONT; + } + if ((input_val != 0) && (input_val != 1)) { + return -EBFONT; + } + + if(input_val != block_polling){ + block_polling = input_val; + if(block_polling){ + cancel_delayed_work_sync(&swp_polling); + } + else{ + schedule_delayed_work(&swp_polling, _get_polling_period()); + } + } + + return count; +} + +static ssize_t +store_attr_io_no_init( struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + int input_val = sscanf_2_int(buf_p); + + if ((input_val != 0) && (input_val != 1)) { + return -EBFONT; + } + + if(input_val != io_no_init){ + io_no_init = input_val; + } + + return count; +} + +/* ========== Show functions: For transceiver attribute ========== + */ +static ssize_t +_show_transvr_hex_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p), + char *buf_p) { + size_t len; + int result; + + lock_transvr_obj(tobj_p); + result = get_func(tobj_p); + unlock_transvr_obj(tobj_p); + if (result < 0){ + len = snprintf(buf_p, 8, "%d\n", result); + } else { + len = snprintf(buf_p, 8, "0x%02x\n", result); + } + return len; +} + + +static ssize_t +_show_transvr_int_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p), + char *buf_p) { + size_t len; + + lock_transvr_obj(tobj_p); + len = snprintf(buf_p, 16, "%d\n", get_func(tobj_p)); + unlock_transvr_obj(tobj_p); + return len; +} + + +static ssize_t +_show_transvr_str_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p, char* buf), + char *buf_p) { + size_t len; + + lock_transvr_obj(tobj_p); + len = get_func(tobj_p, buf_p); + unlock_transvr_obj(tobj_p); + return len; +} + + +static ssize_t +show_attr_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_id, + buf_p); +} + + +static ssize_t +show_attr_ext_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_ext_id, + buf_p); +} + + +static ssize_t +show_attr_connector(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_connector, + buf_p); +} + + +static ssize_t +show_attr_vendor_name(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_name, + buf_p); +} + + +static ssize_t +show_attr_vendor_pn(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_pn, + buf_p); +} + + +static ssize_t +show_attr_vendor_rev(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_rev, + buf_p); +} + + +static ssize_t +show_attr_vendor_sn(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_sn, + buf_p); +} + + +static ssize_t +show_attr_power_cls(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + size_t len; + int result; + struct transvr_obj_s *tobj_p; + + tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + lock_transvr_obj(tobj_p); + result = tobj_p->get_power_cls(tobj_p); + unlock_transvr_obj(tobj_p); + if (result < 0){ + len = snprintf(buf_p, 16, "%d\n", result); + } else { + len = snprintf(buf_p, 16, "Power Class %d\n", result); + } + return len; +} + + +static ssize_t +show_attr_br(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_br, + buf_p); +} + + +static ssize_t +show_attr_len_sm(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_sm, + buf_p); +} + + +static ssize_t +show_attr_len_smf(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_smf, + buf_p); +} + + +static ssize_t +show_attr_len_om1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om1, + buf_p); +} + + +static ssize_t +show_attr_len_om2(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om2, + buf_p); +} + + +static ssize_t +show_attr_len_om3(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om3, + buf_p); +} + + +static ssize_t +show_attr_len_om4(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om4, + buf_p); +} + + +static ssize_t +show_attr_comp_rev(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_rev, + buf_p); +} + + +static ssize_t +show_attr_comp_eth(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_1, + buf_p); +} + + +static ssize_t +show_attr_comp_eth_10(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_10, + buf_p); +} + + +static ssize_t +show_attr_comp_eth_10_40(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_10_40, + buf_p); +} + + +static ssize_t +show_attr_comp_extend(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_extend, + buf_p); +} + + +static ssize_t +show_attr_rate_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_rate_id, + buf_p); +} + + +static ssize_t +show_attr_temperature(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_curr_temp, + buf_p); +} + + +static ssize_t +show_attr_voltage(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_curr_vol, + buf_p); +} + + +static ssize_t +show_attr_tx_bias(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_bias, + buf_p); +} + + +static ssize_t +show_attr_tx_power(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_power, + buf_p); +} + + +static ssize_t +show_attr_tx_eq(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_eq, + buf_p); +} + + +static ssize_t +show_attr_rx_power(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_power, + buf_p); +} + + +static ssize_t +show_attr_rx_am(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_am, + buf_p); +} + + +static ssize_t +show_attr_rx_em(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_em, + buf_p); +} + + +static ssize_t +show_attr_wavelength(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_wavelength, + buf_p); +} + + +static ssize_t +show_attr_extphy_offset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_extphy_offset, + buf_p); +} + + +static ssize_t +show_attr_extphy_reg(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_extphy_reg, + buf_p); +} + + +static ssize_t +show_attr_info(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_info, + buf_p); +} + + +static ssize_t +show_attr_if_type(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_type, + buf_p); +} + + +static ssize_t +show_attr_if_speed(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_speed, + buf_p); +} + + +static ssize_t +show_attr_if_lane(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_lane, + buf_p); +} + + +static ssize_t +show_attr_cdr(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_cdr, + buf_p); +} + + +static ssize_t +show_attr_soft_rs0(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_soft_rs0, + buf_p); +} + + +static ssize_t +show_attr_soft_rs1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_soft_rs1, + buf_p); +} + + +static ssize_t +show_attr_soft_rx_los(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_rx_los, + buf_p); +} + + +static ssize_t +show_attr_soft_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_tx_disable, + buf_p); +} + + +static ssize_t +show_attr_soft_tx_fault(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_tx_fault, + buf_p); +} + + +static ssize_t +show_attr_auto_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_auto_tx_disable, + buf_p); +} + + +/* ========== Store functions: transceiver (R/W) attribute ========== + */ +static ssize_t +_store_transvr_int_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_int(buf_p); + if (input < 0){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +_store_transvr_byte_hex_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_int(buf_p); + if ((input < 0) || (input > 0xff)){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +_store_transvr_binary_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_binary(buf_p); + if (input < 0){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +store_attr_cdr(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_byte_hex_attr(tobj_p, + tobj_p->set_cdr, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_rs0(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_binary_attr(tobj_p, + tobj_p->set_soft_rs0, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_rs1(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_binary_attr(tobj_p, + tobj_p->set_soft_rs1, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count) { + + int check = sscanf_2_int(buf_p); + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + if ((check < 0) || (check > 0xf)){ + return -EBFONT; + } + return _store_transvr_byte_hex_attr(tobj_p, + tobj_p->set_soft_tx_disable, + buf_p, + count); +} + + +static ssize_t +store_attr_auto_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count) { + + int err = -EPERM; + int input = sscanf_2_int(buf_p); + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + if ((input < 0) || (input > 0xf)){ + if (input != VAL_TRANSVR_FUNCTION_DISABLE) { + return -EBFONT; + } + } + lock_transvr_obj(tobj_p); + err = tobj_p->set_auto_tx_disable(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +store_attr_tx_eq(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_tx_eq, + buf_p, + count); +} + + +static ssize_t +store_attr_rx_am(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_rx_am, + buf_p, + count); +} + + +static ssize_t +store_attr_rx_em(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_rx_em, + buf_p, + count); +} + + +static ssize_t +store_attr_extphy_offset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_extphy_offset, + buf_p, + count); +} + + +static ssize_t +store_attr_extphy_reg(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_extphy_reg, + buf_p, + count); +} + +/* ========== Show functions: For I/O Expander attribute ========== + */ +static ssize_t +_show_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*get_func)(struct ioexp_obj_s *ioexp_p, int voffset), + char *buf_p) { + size_t len; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR(" %s: data corruption! :%s\n", __func__, tobj_p->swp_name); + return -ENODATA; + } + mutex_lock(&ioexp_p->lock); + len = snprintf(buf_p, 8, "%d\n", get_func(ioexp_p, tobj_p->ioexp_virt_offset)); + mutex_unlock(&ioexp_p->lock); + return len; +} + + +static ssize_t +show_attr_present(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_present, + buf_p); +} + + +static ssize_t +show_attr_tx_fault(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_fault, + buf_p); +} + + +static ssize_t +show_attr_rxlos(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_rxlos, + buf_p); +} + + +static ssize_t +show_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_disable, + buf_p); +} + + +static ssize_t +show_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_reset, + buf_p); +} + + +static ssize_t +show_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_lpmod, + buf_p); +} + + +static ssize_t +show_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_modsel, + buf_p); +} + + +static ssize_t +show_attr_hard_rs0(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_hard_rs0, + buf_p); +} + + +static ssize_t +show_attr_hard_rs1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_hard_rs1, + buf_p); +} + + +/* ========== Store functions: For I/O Expander (R/W) attribute ========== + */ +static ssize_t +_store_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*set_func)(struct ioexp_obj_s *ioexp_p, + int virt_offset, int input_val), + const char *buf_p, + size_t count) { + + int input, err; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR("%s: data corruption! :%s\n", + __func__, tobj_p->swp_name); + return -ENODATA; + } + input = sscanf_2_binary(buf_p); + if (input < 0) { + return -EBFONT; + } + mutex_lock(&ioexp_p->lock); + err = set_func(ioexp_p, tobj_p->ioexp_virt_offset, input); + mutex_unlock(&ioexp_p->lock); + if (err < 0){ + return err; + } + return count; +} + +static ssize_t +store_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_tx_disable, + buf_p, + count); +} + + +static ssize_t +store_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_reset, + buf_p, + count); +} + + +static ssize_t +store_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_lpmod, + buf_p, + count); +} + + +static ssize_t +store_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_modsel, + buf_p, + count); +} + + +static ssize_t +store_attr_hard_rs0(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_hard_rs0, + buf_p, + count); +} + + +static ssize_t +store_attr_hard_rs1(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_hard_rs1, + buf_p, + count); +} + + +/* ========== SWPS attribute: For module control ========== + */ +static DEVICE_ATTR(platform, S_IRUGO, show_attr_platform, NULL); +static DEVICE_ATTR(version, S_IRUGO, show_attr_version, NULL); +static DEVICE_ATTR(status, S_IRUGO, show_attr_status, NULL); +static DEVICE_ATTR(reset_i2c, S_IWUSR, NULL, store_attr_reset_i2c); +static DEVICE_ATTR(reset_swps, S_IWUSR, NULL, store_attr_reset_swps); +static DEVICE_ATTR(auto_config, S_IRUGO|S_IWUSR, show_attr_auto_config, store_attr_auto_config); +static DEVICE_ATTR(block_poll, S_IRUGO|S_IWUSR, show_attr_block_poll, store_attr_block_poll); +static DEVICE_ATTR(io_no_init, S_IRUGO|S_IWUSR, show_attr_io_no_init, store_attr_io_no_init); + +/* ========== Transceiver attribute: from eeprom ========== + */ +static DEVICE_ATTR(id, S_IRUGO, show_attr_id, NULL); +static DEVICE_ATTR(ext_id, S_IRUGO, show_attr_ext_id, NULL); +static DEVICE_ATTR(connector, S_IRUGO, show_attr_connector, NULL); +static DEVICE_ATTR(vendor_name, S_IRUGO, show_attr_vendor_name, NULL); +static DEVICE_ATTR(vendor_pn, S_IRUGO, show_attr_vendor_pn, NULL); +static DEVICE_ATTR(vendor_rev, S_IRUGO, show_attr_vendor_rev, NULL); +static DEVICE_ATTR(vendor_sn, S_IRUGO, show_attr_vendor_sn, NULL); +static DEVICE_ATTR(power_cls, S_IRUGO, show_attr_power_cls, NULL); +static DEVICE_ATTR(br, S_IRUGO, show_attr_br, NULL); +static DEVICE_ATTR(len_sm, S_IRUGO, show_attr_len_sm, NULL); +static DEVICE_ATTR(len_smf, S_IRUGO, show_attr_len_smf, NULL); +static DEVICE_ATTR(len_om1, S_IRUGO, show_attr_len_om1, NULL); +static DEVICE_ATTR(len_om2, S_IRUGO, show_attr_len_om2, NULL); +static DEVICE_ATTR(len_om3, S_IRUGO, show_attr_len_om3, NULL); +static DEVICE_ATTR(len_om4, S_IRUGO, show_attr_len_om4, NULL); +static DEVICE_ATTR(comp_rev, S_IRUGO, show_attr_comp_rev, NULL); +static DEVICE_ATTR(comp_eth, S_IRUGO, show_attr_comp_eth, NULL); +static DEVICE_ATTR(comp_eth_10, S_IRUGO, show_attr_comp_eth_10, NULL); +static DEVICE_ATTR(comp_eth_10_40, S_IRUGO, show_attr_comp_eth_10_40, NULL); +static DEVICE_ATTR(comp_extend, S_IRUGO, show_attr_comp_extend, NULL); +static DEVICE_ATTR(rate_id, S_IRUGO, show_attr_rate_id, NULL); +static DEVICE_ATTR(temperature, S_IRUGO, show_attr_temperature, NULL); +static DEVICE_ATTR(voltage, S_IRUGO, show_attr_voltage, NULL); +static DEVICE_ATTR(tx_bias, S_IRUGO, show_attr_tx_bias, NULL); +static DEVICE_ATTR(tx_power, S_IRUGO, show_attr_tx_power, NULL); +static DEVICE_ATTR(rx_power, S_IRUGO, show_attr_rx_power, NULL); +static DEVICE_ATTR(info, S_IRUGO, show_attr_info, NULL); +static DEVICE_ATTR(if_type, S_IRUGO, show_attr_if_type, NULL); +static DEVICE_ATTR(if_speed, S_IRUGO, show_attr_if_speed, NULL); +static DEVICE_ATTR(if_lane, S_IRUGO, show_attr_if_lane, NULL); +static DEVICE_ATTR(soft_rx_los, S_IRUGO, show_attr_soft_rx_los, NULL); +static DEVICE_ATTR(soft_tx_fault, S_IRUGO, show_attr_soft_tx_fault, NULL); +static DEVICE_ATTR(wavelength, S_IRUGO, show_attr_wavelength, NULL); +static DEVICE_ATTR(tx_eq, S_IRUGO|S_IWUSR, show_attr_tx_eq, store_attr_tx_eq); +static DEVICE_ATTR(rx_am, S_IRUGO|S_IWUSR, show_attr_rx_am, store_attr_rx_am); +static DEVICE_ATTR(rx_em, S_IRUGO|S_IWUSR, show_attr_rx_em, store_attr_rx_em); +static DEVICE_ATTR(cdr, S_IRUGO|S_IWUSR, show_attr_cdr, store_attr_cdr); +static DEVICE_ATTR(soft_rs0, S_IRUGO|S_IWUSR, show_attr_soft_rs0, store_attr_soft_rs0); +static DEVICE_ATTR(soft_rs1, S_IRUGO|S_IWUSR, show_attr_soft_rs1, store_attr_soft_rs1); +static DEVICE_ATTR(soft_tx_disable, S_IRUGO|S_IWUSR, show_attr_soft_tx_disable, store_attr_soft_tx_disable); +static DEVICE_ATTR(auto_tx_disable, S_IRUGO|S_IWUSR, show_attr_auto_tx_disable, store_attr_auto_tx_disable); +static DEVICE_ATTR(extphy_offset, S_IRUGO|S_IWUSR, show_attr_extphy_offset, store_attr_extphy_offset); +static DEVICE_ATTR(extphy_reg, S_IRUGO|S_IWUSR, show_attr_extphy_reg, store_attr_extphy_reg); + +/* ========== IO Expander attribute: from expander ========== + */ +static DEVICE_ATTR(present, S_IRUGO, show_attr_present, NULL); +static DEVICE_ATTR(tx_fault, S_IRUGO, show_attr_tx_fault, NULL); +static DEVICE_ATTR(rxlos, S_IRUGO, show_attr_rxlos, NULL); +static DEVICE_ATTR(tx_disable, S_IRUGO|S_IWUSR, show_attr_tx_disable, store_attr_tx_disable); +static DEVICE_ATTR(reset, S_IRUGO|S_IWUSR, show_attr_reset, store_attr_reset); +static DEVICE_ATTR(lpmod, S_IRUGO|S_IWUSR, show_attr_lpmod, store_attr_lpmod); +static DEVICE_ATTR(modsel, S_IRUGO|S_IWUSR, show_attr_modsel, store_attr_modsel); +static DEVICE_ATTR(hard_rs0, S_IRUGO|S_IWUSR, show_attr_hard_rs0, store_attr_hard_rs0); +static DEVICE_ATTR(hard_rs1, S_IRUGO|S_IWUSR, show_attr_hard_rs1, store_attr_hard_rs1); + +/* ========== Functions for module handling ========== + */ +static void +clean_port_objs(void){ + + dev_t dev_num; + char dev_name[32]; + struct device *device_p; + struct transvr_obj_s *tobj_p; + int minor_curr, port_id; + + for (minor_curr=0; minor_curri2c_client_p) { + i2c_put_adapter(tobj_p->i2c_client_p->adapter); + kfree(tobj_p->i2c_client_p); + } + kfree(tobj_p->vendor_name); + kfree(tobj_p->vendor_pn); + kfree(tobj_p->vendor_rev); + kfree(tobj_p->vendor_sn); + kfree(tobj_p->worker_p); + kfree(tobj_p); + } + dev_num = MKDEV(port_major, minor_curr); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static void +clean_swps_common(void){ + + dev_t dev_num; + struct device *device_p; + + device_p = get_swpdev_by_name(SWP_DEV_MODCTL); + if (device_p){ + dev_num = MKDEV(ctl_major, 1); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + cancel_delayed_work_sync(&swp_polling); + if (platform_p) { + kfree(platform_p); + } + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static int +get_platform_type(void){ + + int i, tmp; + int auto_chan = -1; + int auto_addr = -1; + int pf_total = ARRAY_SIZE(platform_map); + char log_msg[64] = "ERROR"; + + platform_p = kzalloc(sizeof(struct net_platform_s), GFP_KERNEL); + if (!platform_p){ + snprintf(log_msg, sizeof(log_msg), "kzalloc fail"); + goto err_get_platform_type_1; + } + memset(platform_p->name, 0, sizeof(platform_p->name)); + + switch (PLATFORM_SETTINGS) { + case PLATFORM_TYPE_AUTO: + snprintf(platform_p->name, (sizeof(platform_p->name) - 1), + "%s", dmi_get_system_info(DMI_BOARD_NAME)); + for (i=0; iname, platform_map[i].name) == 0) { + platform_p->id = platform_map[i].id; + snprintf(log_msg, sizeof(log_msg), + "Auto detect platform: %d (%s)", + platform_p->id, platform_p->name); + goto ok_get_platform_type_1; + } + } + snprintf(log_msg, sizeof(log_msg), + "Auto detect fail! detect platform: %s", + platform_p->name); + goto err_get_platform_type_2; + + case PLATFORM_TYPE_AURORA_610_GA: + case PLATFORM_TYPE_AURORA_610: + platform_p->id = PLATFORM_SETTINGS; + goto map_platform_name; + + default: + break; + } + snprintf(log_msg, sizeof(log_msg), + "PLATFORM_SETTINGS:%d undefined", PLATFORM_SETTINGS); + goto err_get_platform_type_2; + +map_platform_name: + for (i=0; iid == platform_map[i].id) { + snprintf(platform_p->name, (sizeof(platform_p->name) - 1), + "%s", platform_map[i].name); + snprintf(log_msg, sizeof(log_msg), + "User setup platform: %d (%s)", + platform_p->id, platform_p->name); + goto ok_get_platform_type_1; + } + } + snprintf(log_msg, sizeof(log_msg), + "Internal error, can not map id:%d", + platform_p->id ); + goto err_get_platform_type_2; + +ok_get_platform_type_1: + SWPS_DEBUG("%s: %s, :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return 0; + +err_get_platform_type_2: + kfree(platform_p); +err_get_platform_type_1: + SWPS_ERR("%s: %s :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return -1; +} + + +static int +get_layout_info(void){ + + switch (platform_p->id) { +#ifdef SWPS_AURORA_610_GA + case PLATFORM_TYPE_AURORA_610_GA: + gpio_rest_mux = aurora_610_ga_gpio_rest_mux; + ioexp_layout = aurora_610_ga_ioexp_layout; + port_layout = aurora_610_ga_port_layout; + ioexp_total = ARRAY_SIZE(aurora_610_ga_ioexp_layout); + port_total = ARRAY_SIZE(aurora_610_ga_port_layout); + break; +#endif +#ifdef SWPS_AURORA_610 + case PLATFORM_TYPE_AURORA_610: + gpio_rest_mux = aurora_610_gpio_rest_mux; + ioexp_layout = aurora_610_ioexp_layout; + port_layout = aurora_610_port_layout; + ioexp_total = ARRAY_SIZE(aurora_610_ioexp_layout); + port_total = ARRAY_SIZE(aurora_610_port_layout); + break; +#endif + default: + SWPS_ERR(" Invalid platform: %d (%s)\n", + platform_p->id, platform_p->name); + return -1; + } + SWPS_INFO("Start to initial platform: %d (%s)\n", + platform_p->id, platform_p->name); + return 0; +} + + +/* ========== Functions for objects operations ========== + */ +static int +__detect_issues_port(int minor_num) { + + struct transvr_obj_s *tobj_p; + int port_id = port_layout[minor_num].port_id; + char port_name[32] = "ERR"; + char *i2c_emsg = "detected bad transceiver/cable"; + + memset(port_name, 0, sizeof(port_name)); + snprintf(port_name, sizeof(port_name), "%s%d", SWP_DEV_PORT, port_id); + tobj_p = _get_transvr_obj(port_name); + if (!tobj_p) { + SWPS_INFO("%s: tobj_p is NULL :%d\n", __func__, minor_num); + return -1; + } + if (resync_channel_tier_2(tobj_p) < 0) { + if (check_channel_tier_1() < 0) { + goto get_target_issues_port; + } + } + /* Re-check again for i2c-gpio special case */ + if (check_channel_tier_1() < 0) { + goto get_target_issues_port; + } + return 0; + +get_target_issues_port: + alarm_msg_2_user(tobj_p, i2c_emsg); + return -2; +} + + +static int +_detect_issues_port(void) { + /* OK : retrun -1; + * Fail: return fail at which minor number (0~N) + */ + char *emsg = "ERR"; + int minor = 0; + int minor_2st = 1; + + /* Force moving the initial channel pointer + * Filter out case of fail at minor-0 port + */ + while (minor_2st < port_total) { + minor = minor_2st; + if (__detect_issues_port(minor_2st) < 0) { + emsg = "detect minor_2st fail"; + goto err_p_detect_issues_port; + } + minor_2st += 8; + } + /* Scan all port */ + for (minor=0; minor:%d\n", __func__, emsg, minor_err); + return -1; +} + + +static int +check_transvr_obj_one(char *dev_name){ + /* [Return] + * 0 : Doesn't need to take care + * -1 : Single error + * -2 : Critical error (I2C topology die) + * -9 : Internal error + */ + struct transvr_obj_s *tobj_p = NULL; + int retval = -9; + + tobj_p = _get_transvr_obj(dev_name); + if (!tobj_p) { + SWPS_ERR("%s: %s _get_transvr_obj fail\n", + __func__, dev_name); + return -9; + } + /* Check transceiver current status */ + lock_transvr_obj(tobj_p); + retval = tobj_p->check(tobj_p); + unlock_transvr_obj(tobj_p); + switch (retval) { + case 0: + case ERR_TRANSVR_UNPLUGGED: + case ERR_TRNASVR_BE_ISOLATED: + case ERR_TRANSVR_TASK_BUSY: + return 0; + + case ERR_TRANSVR_I2C_CRASH: + default: + break; + } + /* Identify abnormal case */ + if (check_channel_tier_1() < 0) { + SWPS_DEBUG("%s: %s critical error :%d\n", + __func__, dev_name, retval); + return -2; + } + SWPS_DEBUG("%s: %s single error :%d\n", + __func__, dev_name, retval); + return -1; +} + +static int +check_transvr_obj_one_with_measuring(char *dev_name){ + struct timespec64 begin, end; + unsigned long val; + int err_code; + const int WARNING_TIME_MS = 100; + + ktime_get_real_ts64(&begin); + err_code = check_transvr_obj_one(dev_name); + ktime_get_real_ts64(&end); + val = (end.tv_sec - begin.tv_sec) * 1000; + val += ((end.tv_nsec - begin.tv_nsec) / 1000); + if (val > WARNING_TIME_MS) { + SWPS_INFO("%s takes %lums\n", dev_name, val); + } + + return err_code; +} + +static int +check_transvr_objs(void){ + + char dev_name[32]; + int port_id, err_code; + int minor_curr = 0; + + for (minor_curr=0; minor_curr:%d\n", + __func__, dev_name, err_code); + break; + } + } + return 0; + +err_check_transvr_objs: + SWPS_ERR("%s: %s reset_i2c_topology fail.\n", + __func__, dev_name); + return -1; +} + + +static void +swp_polling_worker(struct work_struct *work){ + + /* Reset I2C */ + if (flag_i2c_reset) { + goto polling_reset_i2c; + } + /* Check IOEXP */ + if (check_ioexp_objs() < 0) { + goto polling_reset_i2c; + } + /* Check transceiver */ + if (check_transvr_objs() < 0) { + SWPS_DEBUG("%s: check_transvr_objs fail.\n", __func__); + flag_i2c_reset = 1; + } + goto polling_schedule_round; + +polling_reset_i2c: + SWPS_DEBUG("%s: reset_i2c_topology start.\n", __func__); + if (reset_i2c_topology() < 0) { + SWPS_ERR("%s: reset i2c fail!\n", __func__); + flag_i2c_reset = 1; + } else { + SWPS_DEBUG("%s: reset_i2c_topology OK.\n", __func__); + flag_i2c_reset = 0; + } +polling_schedule_round: + schedule_delayed_work(&swp_polling, _get_polling_period()); +} + + +/* ========== Functions for register something ========== + */ +static int +register_transvr_common_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_id) < 0) { + err_attr = "dev_attr_id"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_ext_id) < 0) { + err_attr = "dev_attr_ext_id"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_connector) < 0) { + err_attr = "dev_attr_connector"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_name) < 0) { + err_attr = "dev_attr_vendor_name"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_pn) < 0) { + err_attr = "dev_attr_vendor_pn"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_rev) < 0) { + err_attr = "dev_attr_vendor_rev"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_sn) < 0) { + err_attr = "dev_attr_vendor_sn"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_br) < 0) { + err_attr = "dev_attr_br"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_smf) < 0) { + err_attr = "dev_attr_len_smf"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om1) < 0) { + err_attr = "dev_attr_len_om1"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om2) < 0) { + err_attr = "dev_attr_len_om2"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om3) < 0) { + err_attr = "dev_attr_len_om3"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om4) < 0) { + err_attr = "dev_attr_len_om4"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_extend) < 0) { + err_attr = "dev_attr_comp_extend"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth) < 0) { + err_attr = "dev_attr_comp_eth"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_rev) < 0) { + err_attr = "dev_attr_comp_rev"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_info) < 0) { + err_attr = "dev_attr_info"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_type) < 0) { + err_attr = "dev_attr_if_type"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_speed) < 0) { + err_attr = "dev_attr_if_speed"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_lane) < 0) { + err_attr = "dev_attr_if_lane"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_temperature) < 0) { + err_attr = "dev_attr_temperature"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_voltage) < 0) { + err_attr = "dev_attr_voltage"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_bias) < 0) { + err_attr = "dev_attr_tx_bias"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_power) < 0) { + err_attr = "dev_attr_tx_power"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_rx_power) < 0) { + err_attr = "dev_attr_rx_power"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_eq) < 0) { + err_attr = "dev_attr_tx_eq"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_rx_em) < 0) { + err_attr = "dev_attr_rx_em"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_wavelength) < 0) { + err_attr = "dev_attr_wavelength"; + goto err_transvr_comm_attr; + } + return 0; + +err_transvr_comm_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + +static int +register_transvr_sfp_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_common_attr(device_p) < 0) { + err_attr = "register_transvr_common_attr"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth_10) < 0) { + err_attr = "dev_attr_comp_eth_10"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_len_sm) < 0) { + err_attr = "dev_attr_len_sm"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_rate_id) < 0) { + err_attr = "dev_attr_rate_id"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rs0) < 0) { + err_attr = "dev_attr_soft_rs0"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rs1) < 0) { + err_attr = "dev_attr_soft_rs1"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_extphy_offset) < 0) { + err_attr = "dev_attr_extphy_offset"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_extphy_reg) < 0) { + err_attr = "dev_attr_extphy_reg"; + goto err_transvr_sfp_attr; + } + return 0; + +err_transvr_sfp_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_qsfp_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_common_attr(device_p) < 0) { + err_attr = "register_transvr_common_attr"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth_10_40) < 0) { + err_attr = "dev_attr_comp_eth_10_40"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_power_cls) < 0) { + err_attr = "dev_attr_power_cls"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rx_los) < 0) { + err_attr = "soft_rx_los"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_tx_disable) < 0) { + err_attr = "soft_tx_disable"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_auto_tx_disable) < 0) { + err_attr = "auto_tx_disable"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_tx_fault) < 0) { + err_attr = "soft_tx_fault"; + goto err_transvr_qsfp_attr; + } + return 0; + +err_transvr_qsfp_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_qsfp28_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_qsfp_attr(device_p) < 0){ + err_attr = "register_transvr_qsfp_attr"; + goto err_transvr_qsfp28_attr; + } + if (device_create_file(device_p, &dev_attr_cdr) < 0) { + err_attr = "dev_attr_cdr"; + goto err_transvr_qsfp28_attr; + } + if (device_create_file(device_p, &dev_attr_rx_am) < 0) { + err_attr = "dev_attr_rx_am"; + goto err_transvr_qsfp28_attr; + } + return 0; + +err_transvr_qsfp28_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + switch (transvr_obj->layout){ + case TRANSVR_TYPE_SFP: + if (register_transvr_sfp_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + if (register_transvr_qsfp_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + case TRANSVR_TYPE_QSFP_28: + if (register_transvr_qsfp28_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + default: + goto err_reg_tvr_attr; + } + return 0; + +err_reg_tvr_attr: + SWPS_ERR("%s: fail! type=%d \n", __func__, transvr_obj->type); + return -1; +} + + +static int +register_ioexp_attr_sfp_1(struct device *device_p){ + /* Support machine type: + * - SFP : Magnolia + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_fault) < 0) { + err_attr = "dev_attr_tx_fault"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_rxlos) < 0) { + err_attr = "dev_attr_rxlos"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_disable) < 0) { + err_attr = "dev_attr_tx_disable"; + goto err_ioexp_sfp1_attr; + } + return 0; + +err_ioexp_sfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_ioexp_attr_sfp_2(struct device *device_p){ + /* Support machine type: + * - SFP28 : Cypress + */ + char *err_attr = NULL; + + if (register_ioexp_attr_sfp_1(device_p) < 0){ + goto err_ioexp_sfp2_attr; + } + if (device_create_file(device_p, &dev_attr_hard_rs0) < 0) { + err_attr = "dev_attr_hard_rs0"; + goto err_ioexp_sfp2_attr; + } + if (device_create_file(device_p, &dev_attr_hard_rs1) < 0) { + err_attr = "dev_attr_hard_rs1"; + goto err_ioexp_sfp2_attr; + } + return 0; + +err_ioexp_sfp2_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_ioexp_attr_qsfp_1(struct device *device_p){ + /* Support machine type: + * - QSFP : Magnolia, Redwood, Hudson32i + * - QSFP+ : Magnolia, Redwood, Hudson32i + * - QSFP28: Redwood + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_reset) < 0) { + err_attr = "dev_attr_reset"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_lpmod) < 0) { + err_attr = "dev_attr_lpmod"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_modsel) < 0) { + err_attr = "dev_attr_modsel"; + goto err_ioexp_qsfp1_attr; + } + return 0; + +err_ioexp_qsfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_modctl_attr(struct device *device_p){ + + char *err_msg = NULL; + + if (device_create_file(device_p, &dev_attr_platform) < 0) { + err_msg = "dev_attr_platform"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_version) < 0) { + err_msg = "dev_attr_version"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_status) < 0) { + err_msg = "dev_attr_status"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_reset_i2c) < 0) { + err_msg = "dev_attr_reset_i2c"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_reset_swps) < 0) { + err_msg = "dev_attr_reset_swps"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_auto_config) < 0) { + err_msg = "dev_attr_auto_config"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_block_poll) < 0) { + err_msg = "dev_attr_block_poll"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_io_no_init) < 0) { + err_msg = "dev_attr_io_no_init"; + goto err_reg_modctl_attr; + } + + return 0; + +err_reg_modctl_attr: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int +register_ioexp_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + char *err_msg = "ERR"; + + switch (transvr_obj->ioexp_obj_p->ioexp_type){ + + case IOEXP_TYPE_AURORA_610_GA_NABC: + case IOEXP_TYPE_AURORA_610_NABC: + case IOEXP_TYPE_AURORA_610_1ABC: + case IOEXP_TYPE_AURORA_610_3ABC: + if (register_ioexp_attr_sfp_2(device_p) < 0){ + err_msg = "register_ioexp_attr_sfp_2 fail"; + goto err_reg_ioexp_attr; + } + break; + + case IOEXP_TYPE_AURORA_610_GA_7ABC: + case IOEXP_TYPE_AURORA_610_7ABC: + case IOEXP_TYPE_QSFP_6P_LAYOUT_1: + if (register_ioexp_attr_qsfp_1(device_p) < 0){ + err_msg = "register_ioexp_attr_qsfp_1 fail"; + goto err_reg_ioexp_attr; + } + break; + + default: + err_msg = "Unknow type"; + goto err_reg_ioexp_attr; + } + return 0; + +err_reg_ioexp_attr: + SWPS_ERR("%s: %s :%d \n", + __func__, err_msg, transvr_obj->ioexp_obj_p->ioexp_type); + return -1; +} + + +static int +register_modctl_device(void) { + + struct device *device_p = NULL; + int minor_comm = 0; /* Default minor number for common device */ + dev_t dev_num = MKDEV(ctl_major, minor_comm); + char *err_msg = "ERROR"; + + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + NULL, /* void *private_data */ + SWP_DEV_MODCTL); /* const char *fmt */ + if (IS_ERR(device_p)){ + err_msg = "device_create fail"; + goto err_register_modctl_device_1; + } + if (register_modctl_attr(device_p) < 0) { + err_msg = "register_modctl_attr fail"; + goto err_register_modctl_device_2; + } + return 0; + +err_register_modctl_device_2: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_register_modctl_device_1: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int +register_port_device(char *dev_name, + dev_t dev_num, + struct transvr_obj_s *transvr_obj){ + + struct device *device_p = NULL; + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + transvr_obj, /* void *private_data */ + dev_name); /* const char *fmt */ + if (IS_ERR(device_p)){ + goto err_regswp_create_dev; + } + if (register_transvr_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + if (register_ioexp_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + return 0; + +err_regswp_reg_attr: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_regswp_create_dev: + SWPS_ERR("%s fail! :%s\n", __func__, dev_name); + return -1; +} + + +static int +register_swp_module(void){ + + dev_t ctl_devt = 0; + dev_t port_devt = 0; + // int dev_total = port_total + 1; /* char_dev for module control */ + + /* Register device number */ + if (alloc_chrdev_region(&ctl_devt, 0, 1, SWP_DEV_MODCTL) < 0){ + SWPS_WARN("Allocate CTL MAJOR failure! \n"); + goto err_register_swp_module_1; + } + if (alloc_chrdev_region(&port_devt, 0, port_total, SWP_CLS_NAME) < 0){ + SWPS_WARN("Allocate PORT MAJOR failure! \n"); + goto err_register_swp_module_2; + } + ctl_major = MAJOR(ctl_devt); + port_major = MAJOR(port_devt); + + /* Create class object */ + swp_class_p = class_create(THIS_MODULE, SWP_CLS_NAME); + if (IS_ERR(swp_class_p)) { + SWPS_ERR("Create class failure! \n"); + goto err_register_swp_module_3; + } + return 0; + +err_register_swp_module_3: + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_register_swp_module_2: + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); +err_register_swp_module_1: + return -1; +} + + +/* ========== Module initial relate ========== + */ +static int +create_ioexp_objs(void) { + + int i, run_mod; + + /* Clean IOEXP object */ + clean_ioexp_objs(); + /* Get running mode */ + run_mod = IOEXP_MODE_DIRECT; + if (SWP_POLLING_ENABLE){ + run_mod = IOEXP_MODE_POLLING; + } + /* Create IOEXP object */ + for(i=0; i devlen_max) { + snprintf(err_msg, sizeof(err_msg), + "SWP_DEV_PORT too long!"); + goto err_initport_create_tranobj; + } + memset(dev_name, 0, sizeof(dev_name)); + snprintf(dev_name, devlen_max, "%s%d", SWP_DEV_PORT, port_id); + /* Create transceiver object */ + ioexp_obj_p = get_ioexp_obj(ioexp_id); + if (!ioexp_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "IOEXP object:%d not exist", ioexp_id); + goto err_initport_create_tranobj; + } + transvr_obj_p = create_transvr_obj(dev_name, chan_id, ioexp_obj_p, + ioexp_virt_offset, transvr_type, + chipset_type, run_mod); + if (!transvr_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "Create transceiver object fail :%s", dev_name); + goto err_initport_create_tranobj; + } + /* Setup Lane_ID mapping */ + i = ARRAY_SIZE(port_layout[minor_curr].lane_id); + j = ARRAY_SIZE(transvr_obj_p->lane_id); + if (i != j) { + snprintf(err_msg, sizeof(err_msg), + "Lane_id size inconsistent %d/%d", i, j); + goto err_initport_reg_device; + } + memcpy(transvr_obj_p->lane_id, port_layout[minor_curr].lane_id, i*sizeof(int)); + /* Create and register device object */ + if (register_port_device(dev_name, MKDEV(port_major, minor_curr), transvr_obj_p) < 0){ + snprintf(err_msg, sizeof(err_msg), + "register_port_device fail"); + goto err_initport_reg_device; + } + /* Setup device_ptr of transvr_obj */ + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + snprintf(err_msg, sizeof(err_msg), + "get_swpdev_by_name fail"); + goto err_initport_reg_device; + } + transvr_obj_p->transvr_dev_p = dev_p; + /* Success */ + ok_count++; + } + SWPS_INFO("%s: initialed %d port-dev\n",__func__, ok_count); + return 0; + +err_initport_reg_device: + kfree(transvr_obj_p); +err_initport_create_tranobj: + clean_port_objs(); + SWPS_ERR("%s: %s", __func__, err_msg); + SWPS_ERR("Dump: :%d :%d :%d :%d :%d :%d\n", + port_id, chan_id, ioexp_id, ioexp_virt_offset, transvr_type, run_mod); + return -1; +} + + +static int +init_dev_topology(void){ + + int err; + char *emsg = "ERR"; + flag_mod_state = SWP_STATE_NORMAL; + + err = init_ioexp_objs(); + switch(err){ + case 0: /* Normal */ + SWPS_DEBUG("%s: normal case\n", __func__); + break; + + case -1: /* topology error */ + SWPS_DEBUG("%s: detect tier-1 topology initial failure :%d\n", + __func__, err); + /* Reset and isolate */ + err = reset_i2c_topology(); + if (err < 0) { + emsg = "reset i2c topology fail"; + goto err_init_dev_topology; + } + /* Re-initial again */ + err = init_ioexp_objs(); + if (err < 0) { + emsg = "re-init ioexp objects fail"; + goto err_init_dev_topology; + } + break; + + case -2: /* Internal error */ + SWPS_DEBUG("%s: internal error case\n", __func__); + err = -2; + emsg = "internal error"; + goto err_init_dev_topology; + + default: + SWPS_DEBUG("%s: undefined error case\n", __func__); + emsg = "undefined error case"; + goto err_init_dev_topology; + } + SWPS_DEBUG("%s: initial I2C topology success\n", __func__); + return 0; + +err_init_dev_topology: + SWPS_ERR("%s: %s :%d\n", __func__, emsg, err); + return -1; +} + + +static int +init_polling_task(void){ + + if (SWP_POLLING_ENABLE){ + schedule_delayed_work(&swp_polling, _get_polling_period()); + } + return 0; +} + + +static int +init_swps_common(void){ + + char *err_msg = "ERR"; + + block_polling = 0; + auto_config = 0; + if ((SWP_AUTOCONFIG_ENABLE) && (SWP_POLLING_ENABLE)){ + auto_config = 1; + } + if (register_modctl_device() < 0) { + err_msg = "register_modctl_device fail"; + goto err_init_swps_common_1; + } + if (_update_auto_config_2_trnasvr() < 0) { + err_msg = "_update_auto_config_2_trnasvr fail"; + goto err_init_swps_common_1; + } + if (init_polling_task() < 0){ + err_msg = "init_polling_task fail"; + goto err_init_swps_common_1; + } + return 0; + +err_init_swps_common_1: + clean_swps_common(); + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int __init +swp_module_init(void){ + + if (get_platform_type() < 0){ + goto err_init_out; + } + if (get_layout_info() < 0){ + goto err_init_out; + } + if (register_swp_module() < 0){ + goto err_init_out; + } + if (create_ioexp_objs() < 0){ + goto err_init_ioexp; + } + if (create_port_objs() < 0){ + goto err_init_portobj; + } + if (init_mux_objs(gpio_rest_mux) < 0){ + goto err_init_mux; + } + if (init_dev_topology() < 0){ + goto err_init_topology; + } + if (init_swps_common() < 0){ + goto err_init_topology; + } + SWPS_INFO("Netberg switch-port module V.%s initial success.\n", SWP_VERSION); + return 0; + + +err_init_topology: + clean_mux_objs(); +err_init_mux: + clean_port_objs(); +err_init_portobj: + clean_ioexp_objs(); +err_init_ioexp: + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_init_out: + SWPS_ERR("Netberg switch-port module V.%s initial failure.\n", SWP_VERSION); + return -1; +} + + +static void __exit +swp_module_exit(void){ + + clean_swps_common(); + clean_port_objs(); + clean_ioexp_objs(); + clean_mux_objs(); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + SWPS_INFO("Remove Netberg switch-port module success.\n"); +} + + +/* Module information */ +MODULE_AUTHOR(SWP_AUTHOR); +MODULE_DESCRIPTION(SWP_DESC); +MODULE_VERSION(SWP_VERSION); +MODULE_LICENSE(SWP_LICENSE); +module_param(gpio_base, int, S_IRUGO); +MODULE_SOFTDEP("pre: net_platform"); + +module_init(swp_module_init); +module_exit(swp_module_exit); + + + + + + + + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.h b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.h new file mode 100644 index 000000000000..c9d4b6d657eb --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/net_swps.h @@ -0,0 +1,288 @@ +#ifndef NET_SWPS_H +#define NET_SWPS_H + +#include "transceiver.h" +#include "io_expander.h" +#include "net_mux.h" + +/* Module settings */ +#define SWP_CLS_NAME "swps" +#define SWP_DEV_PORT "port" +#define SWP_DEV_MODCTL "module" +#define SWP_RESET_PWD "netberg" +#define SWP_POLLING_PERIOD (300) /* msec */ +#define SWP_POLLING_ENABLE (1) +#define SWP_AUTOCONFIG_ENABLE (1) + +/* Module information */ +#define SWP_AUTHOR "Netberg " +#define SWP_DESC "Netberg port and transceiver driver" +#define SWP_VERSION "4.3.4" +#define SWP_LICENSE "GPL" + +/* Module status define */ +#define SWP_STATE_NORMAL (0) +#define SWP_STATE_I2C_DIE (-91) + + +#define PLATFORM_TYPE_AUTO (100) +#define PLATFORM_TYPE_AURORA_610_GA (202) +#define PLATFORM_TYPE_AURORA_610 (203) +/* Current running platfrom */ +#define PLATFORM_SETTINGS PLATFORM_TYPE_AURORA_610 + +/* Define platform flag and kernel version */ +#if (PLATFORM_SETTINGS == PLATFORM_TYPE_AURORA_610_GA) + #define SWPS_AURORA_610_GA (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_AURORA_610) + #define SWPS_AURORA_610 (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#endif + +struct net_platform_s { + int id; + char name[64]; +}; + +struct net_ioexp_layout_s { + int ioexp_id; + int ioexp_type; + struct ioexp_addr_s addr[4]; +}; + +struct net_port_layout_s { + int port_id; + int chan_id; + int ioexp_id; + int ioexp_offset; + int transvr_type; + int chipset_type; + int lane_id[8]; +}; + + +/* ========================================== + * Netberg Platform Settings + * ========================================== + */ +struct net_platform_s platform_map[] = { + {PLATFORM_TYPE_AUTO, "Auto-Detect" }, + {PLATFORM_TYPE_AURORA_610_GA, "Aurora_610_GA" }, + {PLATFORM_TYPE_AURORA_610, "Aurora_610" }, +}; + + +/* ========================================== + * Aurora 610 GA Layout configuration + * ========================================== + */ +#ifdef SWPS_AURORA_610_GA +unsigned aurora_610_ga_gpio_rest_mux = MUX_RST_GPIO_69_PCA9548; + +struct net_ioexp_layout_s aurora_610_ga_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_AURORA_610_GA_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_AURORA_610_GA_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_AURORA_610_GA_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_AURORA_610_GA_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_AURORA_610_GA_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_AURORA_610_GA_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_AURORA_610_GA_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xff}, {0xc0, 0xc0}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xc0, 0xff}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + + + +struct net_port_layout_s aurora_610_ga_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BFT_CHIP_TYPE / LANE_ID */ + { 0, 10, 0, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 1} }, + { 1, 11, 0, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 2} }, + { 2, 12, 0, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 3} }, + { 3, 13, 0, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 4} }, + { 4, 14, 0, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 5} }, + { 5, 15, 0, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 6} }, + { 6, 16, 0, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 7} }, + { 7, 17, 0, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 8} }, + { 8, 18, 1, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 9} }, + { 9, 19, 1, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 10} }, + {10, 20, 1, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 11} }, + {11, 21, 1, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 12} }, + {12, 22, 1, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 21} }, + {13, 23, 1, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 22} }, + {14, 24, 1, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 23} }, + {15, 25, 1, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 24} }, + {16, 26, 2, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 33} }, + {17, 27, 2, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 34} }, + {18, 28, 2, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 35} }, + {19, 29, 2, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 36} }, + {20, 30, 2, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 37} }, + {21, 31, 2, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 38} }, + {22, 32, 2, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 39} }, + {23, 33, 2, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 40} }, + {24, 34, 3, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 41} }, + {25, 35, 3, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 42} }, + {26, 36, 3, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 43} }, + {27, 37, 3, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 44} }, + {28, 38, 3, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 49} }, + {29, 39, 3, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 50} }, + {30, 40, 3, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 51} }, + {31, 41, 3, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 52} }, + {32, 42, 4, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 53} }, + {33, 43, 4, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 54} }, + {34, 44, 4, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 55} }, + {35, 45, 4, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 56} }, + {36, 46, 4, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 65} }, + {37, 47, 4, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 66} }, + {38, 48, 4, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 67} }, + {39, 49, 4, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 68} }, + {40, 50, 5, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 69} }, + {41, 51, 5, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 70} }, + {42, 52, 5, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 71} }, + {43, 53, 5, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 72} }, + {44, 54, 5, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 81} }, + {45, 55, 5, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 82} }, + {46, 56, 5, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 83} }, + {47, 57, 5, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, { 84} }, + {48, 58, 6, 0, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, { 97, 98, 99,100} }, + {49, 59, 6, 1, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, { 85, 86, 87, 88} }, + {50, 60, 6, 2, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {101,102,103,104} }, + {51, 61, 6, 3, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {105,106,107,108} }, + {52, 62, 6, 4, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {109,110,111,112} }, + {53, 63, 6, 5, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {109,110,111,112} }, +}; +#endif + + +/* ========================================== + * Aurora 610 Layout configuration + * ========================================== + */ +#ifdef SWPS_AURORA_610 +unsigned aurora_610_gpio_rest_mux = MUX_RST_GPIO_69_PCA9548; + +struct net_ioexp_layout_s aurora_610_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_AURORA_610_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_AURORA_610_1ABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_AURORA_610_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_AURORA_610_3ABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xf3, 0xf3}, {0xf3, 0xf3}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_AURORA_610_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_AURORA_610_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xdd, 0xdd}, {0xdd, 0xdd}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_AURORA_610_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xd6, 0xda}, {0x18, 0xe3}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xd6, 0xda}, {0x18, 0xe3}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xd6, 0xff}, {0x18, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + + + +struct net_port_layout_s aurora_610_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BFT_CHIP_TYPE / LANE_ID */ + { 0, 10, 0, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 1, 11, 0, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 2, 12, 0, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 3, 13, 0, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 4, 14, 0, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 5, 15, 0, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 6, 16, 0, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 7, 17, 0, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 8, 18, 1, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + { 9, 19, 1, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {10, 20, 1, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {11, 21, 1, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {12, 22, 1, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {13, 23, 1, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {14, 24, 1, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {15, 25, 1, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {16, 26, 2, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {17, 27, 2, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {18, 28, 2, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {19, 29, 2, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {20, 30, 2, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {21, 31, 2, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {22, 32, 2, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {23, 33, 2, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {24, 34, 3, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {25, 35, 3, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {26, 36, 3, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {27, 37, 3, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {28, 38, 3, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {29, 39, 3, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {30, 40, 3, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {31, 41, 3, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {32, 42, 4, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {33, 43, 4, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {34, 44, 4, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {35, 45, 4, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {36, 46, 4, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {37, 47, 4, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {38, 48, 4, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {39, 49, 4, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {40, 50, 5, 0, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {41, 51, 5, 1, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {42, 52, 5, 2, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {43, 53, 5, 3, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {44, 54, 5, 4, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {45, 55, 5, 5, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {46, 56, 5, 6, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {47, 57, 5, 7, TRANSVR_TYPE_SFP, CHIP_TYPE_LAVENDER, {-99} }, + {48, 59, 6, 1, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {49, 58, 6, 0, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {50, 61, 6, 3, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {51, 60, 6, 2, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {52, 63, 6, 5, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {53, 62, 6, 4, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {54, 65, 6, 7, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, + {55, 64, 6, 6, TRANSVR_TYPE_QSFP_28, CHIP_TYPE_LAVENDER, {-99,-99,-99,-99} }, +}; +#endif + +#endif /* NET_SWPS_H */ + + + + + + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.c b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.c new file mode 100644 index 000000000000..2f4232628164 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.c @@ -0,0 +1,8462 @@ +#include +#include +#include +#include +#include "io_expander.h" +#include "transceiver.h" + +extern int io_no_init; + +/* For build single module using (Ex: ONL platform) */ +#include + +/* ========== Register EEPROM address mapping ========== + */ +struct eeprom_map_s eeprom_map_sfp = { + .addr_br =0x50, .page_br =-1, .offset_br =12, .length_br =1, + .addr_cdr =-1, .page_cdr =-1, .offset_cdr =-1, .length_cdr =-1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =94, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =-1, .offset_connector =2, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =-1, .offset_diag_type =92 , .length_diag_type =1, + .addr_extbr =-1, .page_extbr =-1, .offset_extbr =-1, .length_extbr =-1, + .addr_ext_id =0x50, .page_ext_id =-1, .offset_ext_id =1, .length_ext_id =1, + .addr_id =0x50, .page_id =-1, .offset_id =0, .length_id =1, + .addr_len_sm =0x50, .page_len_sm =-1, .offset_len_sm =15, .length_len_sm =1, + .addr_len_smf =0x50, .page_len_smf =-1, .offset_len_smf =14, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =-1, .offset_len_om1 =17, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =-1, .offset_len_om2 =16, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =-1, .offset_len_om3 =19, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =-1, .offset_len_om4 =18, .length_len_om4 =1, + .addr_option =0x50, .page_option =-1, .offset_option =64, .length_option =2, + .addr_rate_id =0x50, .page_rate_id =-1, .offset_rate_id =13, .length_rate_id =1, + .addr_rx_am =-1, .page_rx_am =-1, .offset_rx_am =-1, .length_rx_am =-1, + .addr_rx_em =0x51, .page_rx_em =-1, .offset_rx_em =115, .length_rx_em =1, + .addr_rx_los =-1, .page_rx_los =-1, .offset_rx_los =-1, .length_rx_los =-1, + .addr_rx_power =0x51, .page_rx_power =-1, .offset_rx_power =104, .length_rx_power =2, + .addr_soft_rs0 =0x51, .page_soft_rs0 =-1, .offset_soft_rs0 =110, .length_soft_rs0 =1, + .addr_soft_rs1 =0x51, .page_soft_rs1 =-1, .offset_soft_rs1 =118, .length_soft_rs0 =1, + .addr_temp =0x51, .page_temp =-1, .offset_temp =96, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =-1, .offset_trancomp =3, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =-1, .offset_trancomp_ext =36, .length_trancomp_ext =1, + .addr_tx_bias =0x51, .page_tx_bias =-1, .offset_tx_bias =100, .length_tx_bias =2, + .addr_tx_disable =-1, .page_tx_disable =-1, .offset_tx_disable =-1, .length_tx_disable =-1, + .addr_tx_eq =0x51, .page_tx_eq =-1, .offset_tx_eq =114, .length_tx_eq =1, + .addr_tx_fault =-1, .page_tx_fault =-1, .offset_tx_fault =-1, .length_tx_fault =-1, + .addr_tx_power =0x51, .page_tx_power =-1, .offset_tx_power =102, .length_tx_power =2, + .addr_vendor_name =0x50, .page_vendor_name =-1, .offset_vendor_name =20, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =-1, .offset_vendor_pn =40, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =-1, .offset_vendor_rev =56, .length_vendor_rev =4, + .addr_vendor_sn =0x50, .page_vendor_sn =-1, .offset_vendor_sn =68, .length_vendor_sn =16, + .addr_voltage =0x51, .page_voltage =-1, .offset_voltage =98, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =-1, .offset_wavelength =60, .length_wavelength =2, +}; + +struct eeprom_map_s eeprom_map_qsfp = { + .addr_br =0x50, .page_br =0, .offset_br =140, .length_br =1, + .addr_cdr =-1, .page_cdr =-1, .offset_cdr =-1, .length_cdr =-1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =1, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =0, .offset_connector =130, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =0, .offset_diag_type =220, .length_diag_type =1, + .addr_extbr =0x50, .page_extbr =0, .offset_extbr =222, .length_extbr =1, + .addr_ext_id =0x50, .page_ext_id =0, .offset_ext_id =129, .length_ext_id =1, + .addr_id =0x50, .page_id =0, .offset_id =128, .length_id =1, + .addr_len_sm =-1, .page_len_sm =-1, .offset_len_sm =-1, .length_len_sm =-1, + .addr_len_smf =0x50, .page_len_smf =0, .offset_len_smf =142, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =0, .offset_len_om1 =145, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =0, .offset_len_om2 =144, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =0, .offset_len_om3 =143, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =0, .offset_len_om4 =146, .length_len_om4 =1, + .addr_option =0x50, .page_option =0, .offset_option =193, .length_option =3, + .addr_rate_id =-1, .page_rate_id =-1, .offset_rate_id =-1, .length_rate_id =-1, + .addr_rx_am =-1, .page_rx_am =-1, .offset_rx_am =-1, .length_rx_am =-1, + .addr_rx_em =-1, .page_rx_em =-1, .offset_rx_em =-1, .length_rx_em =-1, + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_rx_power =0x50, .page_rx_power =-1, .offset_rx_power =34, .length_rx_power =8, + .addr_soft_rs0 =-1, .page_soft_rs0 =-1, .offset_soft_rs0 =-1, .length_soft_rs0 =-1, + .addr_soft_rs1 =-1, .page_soft_rs1 =-1, .offset_soft_rs1 =-1, .length_soft_rs0 =-1, + .addr_temp =0x50, .page_temp =-1, .offset_temp =22, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =0, .offset_trancomp =131, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =0, .offset_trancomp_ext =192, .length_trancomp_ext =1, + .addr_tx_bias =0x50, .page_tx_bias =-1, .offset_tx_bias =42, .length_tx_bias =8, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_eq =-1, .page_tx_eq =-1, .offset_tx_eq =-1, .length_tx_eq =-1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, + .addr_tx_power =0x50, .page_tx_power =-1, .offset_tx_power =50, .length_tx_power =8, + .addr_vendor_name =0x50, .page_vendor_name =0, .offset_vendor_name =148, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =0, .offset_vendor_pn =168, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =0, .offset_vendor_rev =184, .length_vendor_rev =2, + .addr_vendor_sn =0x50, .page_vendor_sn =0, .offset_vendor_sn =196, .length_vendor_sn =16, + .addr_voltage =0x50, .page_voltage =-1, .offset_voltage =26, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =0, .offset_wavelength =186, .length_wavelength =2, +}; + +struct eeprom_map_s eeprom_map_qsfp28 = { + .addr_br =0x50, .page_br =0, .offset_br =140, .length_br =1, + .addr_cdr =0x50, .page_cdr =-1, .offset_cdr =98, .length_cdr =1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =1, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =0, .offset_connector =130, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =0, .offset_diag_type =220, .length_diag_type =1, + .addr_extbr =0x50, .page_extbr =0, .offset_extbr =222, .length_extbr =1, + .addr_ext_id =0x50, .page_ext_id =0, .offset_ext_id =129, .length_ext_id =1, + .addr_id =0x50, .page_id =0, .offset_id =128, .length_id =1, + .addr_len_sm =-1, .page_len_sm =-1, .offset_len_sm =-1, .length_len_sm =-1, + .addr_len_smf =0x50, .page_len_smf =0, .offset_len_smf =142, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =0, .offset_len_om1 =145, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =0, .offset_len_om2 =144, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =0, .offset_len_om3 =143, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =0, .offset_len_om4 =146, .length_len_om4 =1, + .addr_option =0x50, .page_option =0, .offset_option =193, .length_option =3, + .addr_rate_id =-1, .page_rate_id =-1, .offset_rate_id =-1, .length_rate_id =-1, + .addr_rx_am =0x50, .page_rx_am =3, .offset_rx_am =238, .length_rx_am =2, + .addr_rx_em =0x50, .page_rx_em =3, .offset_rx_em =236, .length_rx_em =2, + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_rx_power =0x50, .page_rx_power =-1, .offset_rx_power =34, .length_rx_power =8, + .addr_soft_rs0 =-1, .page_soft_rs0 =-1, .offset_soft_rs0 =-1, .length_soft_rs0 =-1, + .addr_soft_rs1 =-1, .page_soft_rs1 =-1, .offset_soft_rs1 =-1, .length_soft_rs0 =-1, + .addr_temp =0x50, .page_temp =-1, .offset_temp =22, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =0, .offset_trancomp =131, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =0, .offset_trancomp_ext =192, .length_trancomp_ext =1, + .addr_tx_bias =0x50, .page_tx_bias =-1, .offset_tx_bias =42, .length_tx_bias =8, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_eq =0x50, .page_tx_eq =3, .offset_tx_eq =234, .length_tx_eq =2, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, + .addr_tx_power =0x50, .page_tx_power =-1, .offset_tx_power =50, .length_tx_power =8, + .addr_vendor_name =0x50, .page_vendor_name =0, .offset_vendor_name =148, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =0, .offset_vendor_pn =168, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =0, .offset_vendor_rev =184, .length_vendor_rev =2, + .addr_vendor_sn =0x50, .page_vendor_sn =0, .offset_vendor_sn =196, .length_vendor_sn =16, + .addr_voltage =0x50, .page_voltage =-1, .offset_voltage =26, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =0, .offset_wavelength =186, .length_wavelength =2, +}; + + +/* ========== Utility Functions ========== + */ +static int +get_bit(uint8_t origin_byte, int bit_shift) { + return (int)((origin_byte >> bit_shift) & 0x1); +} + +static int +transform_word_to_int(uint8_t hight_byte, + uint8_t low_byte) { + return ((((int)hight_byte) << 8) + (int)low_byte); +} + +void +alarm_msg_2_user(struct transvr_obj_s *self, + char *emsg) { + + SWPS_ERR("%s on %s.\n", emsg, self->swp_name); +} +EXPORT_SYMBOL(alarm_msg_2_user); + +/* ========== Private functions ========== + */ +static int +_reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +_is_transvr_support_ctle(struct transvr_obj_s *self); + +static int +_transvr_init_handler(struct transvr_obj_s *self); + +int +_transvr_clean_handler(struct transvr_obj_s *self); + +int +_sfp_detect_class_by_1g_ethernet(struct transvr_obj_s* self); + +#define I2C_BLOCK_READ_ENABLE +#define I2C_RETRY_COUNT (3) +#define I2C_RETRY_DELAY_MS (10) +static int net_i2c_smbus_read_block_data(struct i2c_client *client, u8 offset, int len, u8 *buf) +{ + int ret = 0; + int i = 0; + + for (i = 0; i < I2C_RETRY_COUNT; i++) { + // Notes: The maximum length of the block read is 32 bytes. + // If the data size is greater than 32 bytes, please divided into multiple reads. + ret = i2c_smbus_read_i2c_block_data(client, offset, len, buf); + if (ret < 0) { + msleep(I2C_RETRY_DELAY_MS); + continue; + } + break; + } + + if (i >= I2C_RETRY_COUNT) { + SWPS_ERR("%s fail:offset:0x%x try %d/%d! Error Code: %d\n", __func__, offset, i, I2C_RETRY_COUNT, ret); + } + + return ret; +} + +static int net_i2c_smbus_read_byte_data(struct i2c_client *client, u8 offset) +{ + int ret = 0; + int i = 0; + + for (i = 0; i < I2C_RETRY_COUNT; i++) { + ret = i2c_smbus_read_byte_data(client, offset); + if (ret < 0) { + msleep(I2C_RETRY_DELAY_MS); + continue; + } + break; + } + + if (i >= I2C_RETRY_COUNT) { + SWPS_ERR("%s fail:offset:0x%x try %d/%d! Error Code: %d\n", __func__, offset, i, I2C_RETRY_COUNT, ret); + } + + return ret; +} + +void +lock_transvr_obj(struct transvr_obj_s *self) { + + mutex_lock(&self->lock); + self->curr_page = VAL_TRANSVR_PAGE_FREE; +} +EXPORT_SYMBOL(lock_transvr_obj); + + +void +unlock_transvr_obj(struct transvr_obj_s *self) { + + self->curr_page = VAL_TRANSVR_PAGE_FREE; + mutex_unlock(&self->lock); +} +EXPORT_SYMBOL(unlock_transvr_obj); + + +static int +_check_by_mode(struct transvr_obj_s *self, + int (*attr_update_func)(struct transvr_obj_s *self, int show_err), + char *caller_name){ + + int return_val = ERR_TRANSVR_UNEXCPT; + + switch (self->mode){ + case TRANSVR_MODE_POLLING: + switch (self->state){ + case STATE_TRANSVR_CONNECTED: + goto ok_check_by_mode_1; + case STATE_TRANSVR_NEW: + case STATE_TRANSVR_INIT: + return ERR_TRANSVR_UNINIT; + case STATE_TRANSVR_DISCONNECTED: + return ERR_TRANSVR_UNPLUGGED; + case STATE_TRANSVR_UNEXCEPTED: + return ERR_TRANSVR_ABNORMAL; + case STATE_TRANSVR_ISOLATED: + return ERR_TRNASVR_BE_ISOLATED; + default: + goto err_check_by_mode_1; + } + goto ok_check_by_mode_1; + + case TRANSVR_MODE_DIRECT: + return_val = self->fsm_4_direct(self, caller_name); + if (return_val < 0){ + return return_val; + } + goto ok_check_by_mode_1; + + default: + goto err_check_by_mode_1; + } + goto ok_check_by_mode_1; + +ok_check_by_mode_1: + return attr_update_func(self, 0); + +err_check_by_mode_1: + SWPS_INFO("_check_by_mode: mode:%d state:%d\n", self->mode, self->state); + return ERR_TRANSVR_UNEXCPT; +} + + +static void +_transvr_clean_retry(struct transvr_obj_s *self) { + self->retry = 0; +} + + +static int +_transvr_handle_retry(struct transvr_obj_s *self, int retry) { + /* Return: 0: keep retry + * -1: stop retry + */ + if (self->retry == 0) { + self->retry = retry; + } + self->retry -= 1; + if (self->retry <= 0) { + _transvr_clean_retry(self); + return -1; + } + return 0; +} + + +static int +_common_setup_page(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int show_e) { + /* return: + * 0 : OK + * -1 : EEPROM settings incorrect + * -2 : I2C R/W failure + * -3 : Undefined case + */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Check */ + if ((addr < 0) || (offset < 0) || (len < 0)) { + emsg = "EEPROM settings incorrect"; + retval = -1; + goto err_common_setup_page; + } + /* Case1: continue access */ + if ((self->i2c_client_p->addr == addr) && + (self->curr_page == page)) { + return 0; + } + self->i2c_client_p->addr = addr; + /* Case2: select lower page */ + if (page == -1) { + self->curr_page = page; + return 0; + } + /* Case3: select upper page */ + if (page >= 0) { + goto upper_common_setup_page; + } + /* Unexpected case */ + show_e = 1; + emsg = "Unexpected case"; + retval = -3; + goto err_common_setup_page; + +upper_common_setup_page: + if (i2c_smbus_write_byte_data(self->i2c_client_p, + VAL_TRANSVR_PAGE_SELECT_OFFSET, + page) < 0) { + emsg = "I2C R/W failure"; + retval = -2; + goto err_common_setup_page; + } + self->curr_page = page; + mdelay(VAL_TRANSVR_PAGE_SELECT_DELAY); + return 0; + +err_common_setup_page: + if (show_e) { + SWPS_INFO("%s: %s", __func__, emsg); + SWPS_INFO("%s: :0x%02x :%d :%d :%d\n", + __func__, addr, page, offset, len); + } + return retval; +} + +/* +static int +_common_setup_password(struct transvr_obj_s *self, + int addr, + int page, + int offs, + uint8_t pwd[4], + int show_e) { + int i = 0; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offs, 4, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_setup_password; + } + for (i=0; i<4; i++) { + err = i2c_smbus_write_byte_data(self->i2c_client_p, + (offs + i), + pwd[i]); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_setup_password; + } + } + return 0; + +err_common_setup_password: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, err); + } + return ERR_TRANSVR_UPDATE_FAIL; +} +*/ + +static int +_common_update_uint8_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + uint8_t *buf, + char *caller, + int show_e){ + + int i; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_uint8_attr; + } + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_uint8_attr; + } + buf[i] = err; + } + return 0; + +err_common_update_uint8_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = DEBUG_TRANSVR_HEX_VAL; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_int_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int *buf, + char *caller, + int show_e){ + + int i; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_int_attr; + } + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_int_attr; + } + buf[i] = (int)err; + } + return 0; + +err_common_update_int_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = DEBUG_TRANSVR_INT_VAL; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_string_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + char buf[], + char *caller, + int show_e){ + + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_string_attr; + } + #ifndef I2C_BLOCK_READ_ENABLE + int i; + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_string_attr; + } + buf[i] = (char)err; + } + #else + err = net_i2c_smbus_read_block_data(self->i2c_client_p, offset, len, buf); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_string_attr; + } + #endif + + return 0; + +err_common_update_string_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = 'e'; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_set_uint8_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + uint8_t update, + uint8_t *buf, + char *caller, + int show_e){ + int len = 1; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + if ((*buf) == update){ + return 0; + } + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_set_uint8_attr_1; + } + err = i2c_smbus_write_byte_data(self->i2c_client_p, + offset, + update); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_set_uint8_attr_1; + } + (*buf) = update; + return 0; + +err_common_set_uint8_attr_1: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_set_uint8_array(struct transvr_obj_s *self, + int addr, + int page, + int offs, + int len, + uint8_t update[], + uint8_t buf[], + char *caller, + int show_e){ + int i = 0; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offs, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_set_uint8_attr_1; + } + for (i=0; ii2c_client_p, + (offs + i), + update[i]); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_set_uint8_attr_1; + } + buf[i] = update[i]; + } + return 0; + +err_common_set_uint8_attr_1: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + __func__, emsg, caller, err, i); + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_attr_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_id, + self->eeprom_map_p->page_id, + self->eeprom_map_p->offset_id, + self->eeprom_map_p->length_id, + &(self->id), + "_common_update_attr_id", + show_err); +} + + +static int +_common_update_attr_extended_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_ext_id, + self->eeprom_map_p->page_ext_id, + self->eeprom_map_p->offset_ext_id, + self->eeprom_map_p->length_ext_id, + &(self->ext_id), + "_common_update_attr_extended_id", + show_err); +} + + +static int +_common_update_attr_connector(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_connector, + self->eeprom_map_p->page_connector, + self->eeprom_map_p->offset_connector, + self->eeprom_map_p->length_connector, + &(self->connector), + "_common_update_attr_connector", + show_err); +} + + +static int +_common_update_attr_transvr_comp(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_trancomp, + self->eeprom_map_p->page_trancomp, + self->eeprom_map_p->offset_trancomp, + self->eeprom_map_p->length_trancomp, + self->transvr_comp, + "_common_update_attr_transvr_comp", + show_err); +} + + +static int +_common_update_attr_transvr_comp_ext(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_trancomp_ext, + self->eeprom_map_p->page_trancomp_ext, + self->eeprom_map_p->offset_trancomp_ext, + self->eeprom_map_p->length_trancomp_ext, + &(self->transvr_comp_ext), + "_common_update_attr_transvr_comp_ext", + show_err); +} + + +static int +_common_update_attr_vendor_name(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_name, + self->eeprom_map_p->page_vendor_name, + self->eeprom_map_p->offset_vendor_name, + self->eeprom_map_p->length_vendor_name, + self->vendor_name, + "_common_update_attr_vendor_name", + show_err); +} + + +static int +_common_update_attr_vendor_pn(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_pn, + self->eeprom_map_p->page_vendor_pn, + self->eeprom_map_p->offset_vendor_pn, + self->eeprom_map_p->length_vendor_pn, + self->vendor_pn, + "_common_update_attr_vendor_pn", + show_err); +} + + +static int +_common_update_attr_vendor_rev(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_rev, + self->eeprom_map_p->page_vendor_rev, + self->eeprom_map_p->offset_vendor_rev, + self->eeprom_map_p->length_vendor_rev, + self->vendor_rev, + "_common_update_attr_vendor_rev", + show_err); +} + + +static int +_common_update_attr_vendor_sn(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_sn, + self->eeprom_map_p->page_vendor_sn, + self->eeprom_map_p->offset_vendor_sn, + self->eeprom_map_p->length_vendor_sn, + self->vendor_sn, + "_common_update_attr_vendor_sn", + show_err); +} + + +static int +_common_update_attr_br(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_br, + self->eeprom_map_p->page_br, + self->eeprom_map_p->offset_br, + self->eeprom_map_p->length_br, + &(self->br), + "_common_update_attr_br", + show_err); +} + + +static int +_common_update_attr_len_smf(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_smf, + self->eeprom_map_p->page_len_smf, + self->eeprom_map_p->offset_len_smf, + self->eeprom_map_p->length_len_smf, + &(self->len_smf), + "_common_update_attr_len_smf", + show_err); +} + + +static int +_common_update_attr_len_om1(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om1, + self->eeprom_map_p->page_len_om1, + self->eeprom_map_p->offset_len_om1, + self->eeprom_map_p->length_len_om1, + &(self->len_om1), + "_common_update_attr_len_om1", + show_err); +} + +static int +_common_update_attr_len_om2(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om2, + self->eeprom_map_p->page_len_om2, + self->eeprom_map_p->offset_len_om2, + self->eeprom_map_p->length_len_om2, + &(self->len_om2), + "_common_update_attr_len_om2", + show_err); +} + +static int +_common_update_attr_len_om3(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om3, + self->eeprom_map_p->page_len_om3, + self->eeprom_map_p->offset_len_om3, + self->eeprom_map_p->length_len_om3, + &(self->len_om3), + "_common_update_attr_len_om3", + show_err); +} + + +static int +_common_update_attr_len_om4(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om4, + self->eeprom_map_p->page_len_om4, + self->eeprom_map_p->offset_len_om4, + self->eeprom_map_p->length_len_om4, + &(self->len_om4), + "_common_update_attr_len_om4", + show_err); +} + + +static int +_common_update_attr_option(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_option, + self->eeprom_map_p->page_option, + self->eeprom_map_p->offset_option, + self->eeprom_map_p->length_option, + self->option, + "_common_update_attr_option", + show_err); +} + + +static int +_common_update_attr_comp_rev(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_comp_rev, + self->eeprom_map_p->page_comp_rev, + self->eeprom_map_p->offset_comp_rev, + self->eeprom_map_p->length_comp_rev, + &(self->comp_rev), + "_common_update_attr_comp_rev", + show_err); +} + + +static int +_common_update_attr_diag_type(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_diag_type, + self->eeprom_map_p->page_diag_type, + self->eeprom_map_p->offset_diag_type, + self->eeprom_map_p->length_diag_type, + &(self->diag_type), + "_common_update_attr_diag_type", + show_err); +} + + +static int +_common_update_attr_wavelength(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_wavelength, + self->eeprom_map_p->page_wavelength, + self->eeprom_map_p->offset_wavelength, + self->eeprom_map_p->length_wavelength, + self->wavelength, + "_common_update_attr_wavelength", + show_err); +} + + +int +_common_get_option_value(struct transvr_obj_s *self, + int offset, + int bit_shift) { + /* SFP: + * - option[0] = A0h / 64 + * - option[1] = A0h / 65 + * QSFP: + * - option[0] = 00h / 193 + * - option[1] = 00h / 194 + * - option[2] = 00h / 195 + */ + return (self->option[offset] & (1 << bit_shift)); +} + + +static int +_sfp_update_attr_len_sm(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_sm, + self->eeprom_map_p->page_len_sm, + self->eeprom_map_p->offset_len_sm, + self->eeprom_map_p->length_len_sm, + &(self->len_sm), + "_common_update_attr_len_sm", + show_err); +} + + +static int +_sfp_update_attr_rate_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_rate_id, + self->eeprom_map_p->page_rate_id, + self->eeprom_map_p->offset_rate_id, + self->eeprom_map_p->length_rate_id, + &(self->rate_id), + "_sfp_update_attr_rate_id", + show_err); +} + + +static int +_sfp_update_attr_soft_rs0(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_soft_rs0, + self->eeprom_map_p->page_soft_rs0, + self->eeprom_map_p->offset_soft_rs0, + self->eeprom_map_p->length_soft_rs0, + &(self->soft_rs0), + "_sfp_update_attr_soft_rs0", + show_err); +} + + +static int +_sfp_update_attr_soft_rs1(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_soft_rs1, + self->eeprom_map_p->page_soft_rs1, + self->eeprom_map_p->offset_soft_rs1, + self->eeprom_map_p->length_soft_rs1, + &(self->soft_rs1), + "_sfp_update_attr_soft_rs1", + show_err); +} + + +int +_sfp_is_diag_support(struct transvr_obj_s *self){ + + uint8_t bit_mask = 0xC0; /* 1100 0000 */ + uint8_t en_val = 0x40; /* 0100 0000 */ + uint8_t checkval = (self->diag_type & bit_mask); + + if (checkval == en_val) { + return 1; + } + return 0; +} + + +static int +_sfp_update_attr_curr_temp(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_temp, + self->eeprom_map_p->page_temp, + self->eeprom_map_p->offset_temp, + self->eeprom_map_p->length_temp, + self->curr_temp, + "_sfp_update_attr_curr_temp", + show_err); +} + + +static int +_sfp_update_attr_curr_voltage(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_voltage, + self->eeprom_map_p->page_voltage, + self->eeprom_map_p->offset_voltage, + self->eeprom_map_p->length_voltage, + self->curr_voltage, + "_sfp_update_attr_curr_voltage", + show_err); +} + + +static int +_sfp_update_attr_curr_tx_bias(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_bias, + self->eeprom_map_p->page_tx_bias, + self->eeprom_map_p->offset_tx_bias, + self->eeprom_map_p->length_tx_bias, + self->curr_tx_bias, + "_sfp_update_attr_curr_tx_bias", + show_err); +} + + +static int +_sfp_update_attr_curr_tx_power(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_power, + self->eeprom_map_p->page_tx_power, + self->eeprom_map_p->offset_tx_power, + self->eeprom_map_p->length_tx_power, + self->curr_tx_power, + "_sfp_update_attr_curr_tx_power", + show_err); +} + + +static int +_sfp_update_attr_curr_rx_power(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_power, + self->eeprom_map_p->page_rx_power, + self->eeprom_map_p->offset_rx_power, + self->eeprom_map_p->length_rx_power, + self->curr_rx_power, + "_sfp_update_attr_curr_rx_power", + show_err); +} + + +static int +_sfp_update_attr_rx_em(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + self->rx_em, + "_sfp_update_attr_rx_em", + show_err); +} + + +static int +_sfp_update_attr_tx_eq(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + self->tx_eq, + "_sfp_update_attr_tx_eq", + show_err); +} + + +static int +_qsfp_update_attr_cdr(struct transvr_obj_s *self, + int show_err){ + if (self->type != TRANSVR_TYPE_QSFP_28){ + self->cdr = DEBUG_TRANSVR_HEX_VAL; + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->page_cdr, + self->eeprom_map_p->offset_cdr, + self->eeprom_map_p->length_cdr, + &(self->cdr), + "_common_update_attr_cdr", + show_err); +} + + +static int +_qsfg_update_attr_extbr(struct transvr_obj_s *self, + int show_err) { + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_extbr, + self->eeprom_map_p->page_extbr, + self->eeprom_map_p->offset_extbr, + self->eeprom_map_p->length_extbr, + &(self->extbr), + "_common_update_attr_extbr", + show_err); +} + + +static int +_qsfp_is_diag_support(struct transvr_obj_s *self, + int diag_type) { + /* Input Parm: diag_type + * => 1 : temperature + * => 2 : voltage + * => 3 : tx relate + * => 4 : rx relate + */ + uint8_t mask_b2 = 0x04; /* 0000 0100 */ + uint8_t mask_b3 = 0x08; /* 0000 1000 */ + + switch (diag_type) { + case 1: /* temperature */ + case 2: /* voltage */ + /* Direct access target, because of spec not defined */ + return 1; + case 3: + case 4: + /* [Note] + * Due to lot of transceiver vendor defined it not rigorously and + * consider of general support, we seem it as supported if there + * are bit-2 OR bit-3 defined by transceiver vendor. + */ + if ( ((self->diag_type & mask_b2) == mask_b2 ) || + ((self->diag_type & mask_b3) == mask_b3 ) ){ + return 1; + } + return 0; + default: + SWPS_INFO("%s: undefined diag_type:%d\n", + __func__, diag_type); + break; + } + return 0; +} + + +int +_qsfp_is_implement_tx_disable(struct transvr_obj_s *self) { + /* + * 00h / Byte-195 / Bit-4 + */ + int byte = 2; + int bit = 4; + return _common_get_option_value(self, byte, bit); +} + + +int +_qsfp_is_implement_tx_fault(struct transvr_obj_s *self) { + /* + * 00h / Byte-195 / Bit-3 + */ + int byte = 2; + int bit = 3; + return _common_get_option_value(self, byte, bit); +} + + +static int +_qsfp_update_attr_curr_temp(struct transvr_obj_s *self, + int show_err){ + int diag_type = 1; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_temp, + self->eeprom_map_p->page_temp, + self->eeprom_map_p->offset_temp, + self->eeprom_map_p->length_temp, + self->curr_temp, + "_qsfp_update_attr_curr_temp", + show_err); +} + + +static int +_qsfp_update_attr_curr_voltage(struct transvr_obj_s *self, + int show_err){ + int diag_type = 2; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_voltage, + self->eeprom_map_p->page_voltage, + self->eeprom_map_p->offset_voltage, + self->eeprom_map_p->length_voltage, + self->curr_voltage, + "_qsfp_update_attr_curr_voltage", + show_err); +} + + +static int +_qsfp_update_attr_curr_tx_bias(struct transvr_obj_s *self, + int show_err){ + int diag_type = 3; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_bias, + self->eeprom_map_p->page_tx_bias, + self->eeprom_map_p->offset_tx_bias, + self->eeprom_map_p->length_tx_bias, + self->curr_tx_bias, + "_qsfp_update_attr_curr_tx_bias", + show_err); +} + + +static int +_qsfp_update_attr_curr_tx_power(struct transvr_obj_s *self, + int show_err){ + int diag_type = 3; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_power, + self->eeprom_map_p->page_tx_power, + self->eeprom_map_p->offset_tx_power, + self->eeprom_map_p->length_tx_power, + self->curr_tx_power, + "_qsfp_update_attr_curr_tx_power", + show_err); +} + + +static int +_qsfp_update_attr_curr_rx_power(struct transvr_obj_s *self, + int show_err){ + int diag_type = 4; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_power, + self->eeprom_map_p->page_rx_power, + self->eeprom_map_p->offset_rx_power, + self->eeprom_map_p->length_rx_power, + self->curr_rx_power, + "_qsfp_update_attr_curr_rx_power", + show_err); +} + + +static int +_qsfp_update_attr_soft_rx_los(struct transvr_obj_s *self, + int show_err){ + + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_los, + self->eeprom_map_p->page_rx_los, + self->eeprom_map_p->offset_rx_los, + self->eeprom_map_p->length_rx_los, + &(self->rx_los), + "_qsfp_update_attr_soft_rx_los", + show_err); +} + + +static int +_qsfp_update_attr_soft_tx_disable(struct transvr_obj_s *self, + int show_err){ + + if (!_qsfp_is_implement_tx_disable(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->eeprom_map_p->length_tx_disable, + &(self->tx_disable), + "_qsfp_update_attr_soft_tx_disable", + show_err); +} + + +static int +_qsfp_update_attr_soft_tx_fault(struct transvr_obj_s *self, + int show_err){ + + if (!_qsfp_is_implement_tx_fault(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_fault, + self->eeprom_map_p->page_tx_fault, + self->eeprom_map_p->offset_tx_fault, + self->eeprom_map_p->length_tx_fault, + &(self->tx_fault), + "_qsfp_update_attr_soft_tx_fault", + show_err); +} + + +static int +_qsfp_update_attr_tx_eq(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + self->tx_eq, + "_qsfp_update_attr_tx_eq", + show_err); +} + + +static int +_qsfp_update_attr_rx_am(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_am, + self->eeprom_map_p->page_rx_am, + self->eeprom_map_p->offset_rx_am, + self->eeprom_map_p->length_rx_am, + self->rx_am, + "_qsfp_update_attr_rx_am", + show_err); +} + + +static int +_qsfp_update_attr_rx_em(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + self->rx_em, + "_qsfp_update_attr_rx_em", + show_err); +} + + +int +_common_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = "err"; + + if (_common_update_attr_id(self, show_err) < 0) { + err_str = "_common_update_attr_id"; + goto err_common_update_attr_all; + } + if (_common_update_attr_extended_id(self, show_err) < 0) { + err_str = "_common_update_attr_extended_id"; + goto err_common_update_attr_all; + } + if (_common_update_attr_connector(self, show_err) < 0) { + err_str = "_common_update_attr_connector"; + goto err_common_update_attr_all; + } + if (_common_update_attr_transvr_comp(self, show_err) < 0) { + err_str = "_common_update_attr_transvr_comp"; + goto err_common_update_attr_all; + } + if (_common_update_attr_transvr_comp_ext(self, show_err) < 0) { + err_str = "_common_update_attr_transvr_comp_ext"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_name(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_name"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_pn(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_pn"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_rev(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_rev"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_sn(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_sn"; + goto err_common_update_attr_all; + } + if (_common_update_attr_br(self, show_err) < 0) { + err_str = "_common_update_attr_br"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_smf(self, show_err) < 0) { + err_str = "_common_update_attr_len_smf"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om1(self, show_err) < 0) { + err_str = "_common_update_attr_len_om1"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om2(self, show_err) < 0) { + err_str = "_common_update_attr_len_om2"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om3(self, show_err) < 0) { + err_str = "_common_update_attr_len_om3"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om4(self, show_err) < 0) { + err_str = "_common_update_attr_len_om4"; + goto err_common_update_attr_all; + } + if (_common_update_attr_option(self, show_err) < 0) { + err_str = "_common_update_attr_option"; + goto err_common_update_attr_all; + } + if (_common_update_attr_comp_rev(self, show_err) < 0) { + err_str = "_common_update_attr_comp_rev"; + goto err_common_update_attr_all; + } + if (_common_update_attr_diag_type(self, show_err) < 0) { + err_str = "_common_update_attr_diag_type"; + goto err_common_update_attr_all; + } + if (_common_update_attr_wavelength(self, show_err) < 0) { + err_str = "_common_update_attr_wavelength"; + goto err_common_update_attr_all; + } + return 0; + +err_common_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +int +_sfp_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = DEBUG_TRANSVR_STR_VAL; + + if (_common_update_attr_all(self, show_err) < 0){ + err_str = "_common_update_attr_all"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_len_sm(self, show_err) < 0) { + err_str = "_sfp_update_attr_len_sm"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_rate_id(self, show_err) < 0) { + err_str = "_sfp_update_attr_rate_id"; + goto err_sfp_update_attr_all; + } + if ((self->rate_id) > 0) { + if (_sfp_update_attr_soft_rs0(self, show_err) < 0) { + err_str = "_sfp_update_attr_soft_rs0"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_soft_rs1(self, show_err) < 0) { + err_str = "_sfp_update_attr_soft_rs1"; + goto err_sfp_update_attr_all; + } + } + return 0; + +err_sfp_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +int +_qsfp_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = DEBUG_TRANSVR_STR_VAL; + + if (_common_update_attr_all(self, show_err) < 0){ + err_str = "_common_update_attr_all"; + goto err_qsfp_update_attr_all; + } + if (_qsfg_update_attr_extbr(self, show_err) < 0) { + err_str = "_qsfg_update_attr_extbr"; + goto err_qsfp_update_attr_all; + } + if (self->type == TRANSVR_TYPE_QSFP_28) { + if (_qsfp_update_attr_cdr(self, 1) < 0) { + err_str = "_qsfp_update_attr_cdr"; + goto err_qsfp_update_attr_all; + } + } + return 0; + +err_qsfp_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +/* ========== Object functions for common type ========== + */ +int +_common_count_temp(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + int sign = 0; + int high = 0; + int low = 0; + int lmax = 8; + + /* Count high */ + sign = get_bit(high_byte,7); + SWP_BIT_CLEAR(high_byte, 7); + high = (int)high_byte; + if (sign == 1) { + high = 0 - high; + } + /* Count low */ + low = (get_bit(low_byte, 7) * 500); + low += (get_bit(low_byte, 6) * 250); + low += (get_bit(low_byte, 5) * 125); + low += (get_bit(low_byte, 4) * 62); + low = (low / 100); + /* Integrate High and Low */ + return snprintf(buf_p, lmax, "%d.%d\n", high, low); +} + + +int +_common_count_voltage(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note]: + * Internally measured transceiver supply voltage. Represented + * as a 16 bit unsigned integer with the voltage defined as the + * full 16 bit value (0-65535) with LSB equal to 100 uVolt, + * yielding a total range of 0 to +6.55 Volts. Practical + * considerations to be defined by transceiver manufacturer will + * tend to limit the actual bounds of the supply voltage measurement. + * Accuracy is vendor specific but must be better than 3% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. Note that in some transceivers, transmitter supply + * voltage and receiver supply voltage are isolated. In that case, + * only one supply is monitored. Refer to the device specification + * for more detail. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 100 uV (1mV=1000uV) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 Volt */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_tx_bias(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured TX bias current in uA. Represented as a 16 bit unsigned + * integer with the current defined as the full 16 bit value (0-65535) + * with LSB equal to 2 uA, yielding a total range of 0 to 131 mA. + * Accuracy is vendor specific but must be better than 10% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 2 uA (1mA=1000uA) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total*2) / 1000); + val_f = (((total*2) - (val_i*1000)) / 100); + /* Return Unit: 1 mA */ + return snprintf(buf_p, lmax, "%d.%01d\n", val_i, val_f); +} + + +int +_common_count_tx_power(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured TX output power in mW. Represented as a 16 bit unsigned + * integer with the power defined as the full 16 bit value (0-65535) + * with LSB equal to 0.1 uW, yielding a total range of 0 to 6.5535 mW + * (~ -40 to +8.2 dBm). Data is assumed to be based on measurement of + * laser monitor photodiode current. It is factory calibrated to absolute + * units using the most representative fiber output type. Accuracy is + * vendor specific but must be better than 3dB over specified temperature + * and voltage. Data is not valid when the transmitter is disabled. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 0.1 uW (1mW=1000uW) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 mW */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_rx_power(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured RX received optical power in mW. Value can represent either + * average received power or OMA depending upon how bit 3 of byte 92 (A0h) + * is set. Represented as a 16 bit unsigned integer with the power defined + * as the full 16 bit value (0-65535) with LSB equal to 0.1 uW, yielding a + * total range of 0 to 6.5535 mW (~ -40 to +8.2 dBm). Absolute accuracy is + * dependent upon the exact optical wavelength. For the vendor specified + * wavelength, accuracy shall be better than 3dB over specified temperature + * and voltage. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 0.1 uW (1mW=1000uW) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 mW */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_wavelength(struct transvr_obj_s *self, + uint8_t high_byte, + uint8_t low_byte) { + /* [Note] + * SFP : uint 1 um. + * QSFP: unit 0.05 um. + */ + int total = 0; + + total = transform_word_to_int(high_byte, low_byte); + switch (self->type) { + case TRANSVR_TYPE_SFP: + return total; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + return (total/20); + + default: + break; + } + return ERR_TRANSVR_UNDEFINED; +} + + +int +common_get_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_id, + "common_get_id"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->id; +} + + +int +common_get_ext_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_extended_id, + "common_get_ext_id"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->ext_id; +} + + +int +common_get_connector(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_connector, + "common_get_connector"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->connector; +} + + +int +common_get_vendor_name(struct transvr_obj_s *self, char *buf){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_name); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_name, + "common_get_vendor_name"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_name); +} + + +int +common_get_vendor_pn(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_pn); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_pn, + "common_get_vendor_pn"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_pn); +} + + +int +common_get_vendor_rev(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_rev); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_rev, + "common_get_vendor_rev"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_rev); +} + + +int +common_get_vendor_sn(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_sn); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_sn, + "common_get_vendor_sn"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_sn); +} + + +int +common_get_br(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return (int)self->br; + } + err = _check_by_mode(self, + &_common_update_attr_br, + "common_get_br"); + if (err < 0){ + return err; + } + /* Transform to INT to show error case */ + return (int)self->br; +} + + +int +common_get_len_smf(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_smf; + } + err = _check_by_mode(self, + &_common_update_attr_len_smf, + "common_get_len_smf"); + if (err < 0){ + return err; + } + return self->len_smf; +} + + +int +common_get_len_om1(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om1; + } + err = _check_by_mode(self, + &_common_update_attr_len_om1, + "common_get_len_om1"); + if (err < 0){ + return err; + } + return self->len_om1; +} + + +int +common_get_len_om2(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om2; + } + + err = _check_by_mode(self, + &_common_update_attr_len_om2, + "common_get_len_om2"); + if (err < 0){ + return err; + } + return self->len_om2; +} + + +int +common_get_len_om3(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om3; + } + + err = _check_by_mode(self, + &_common_update_attr_len_om3, + "common_get_len_om3"); + if (err < 0){ + return err; + } + return self->len_om3; +} + + +int +common_get_len_om4(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om4; + } + err = _check_by_mode(self, + &_common_update_attr_len_om4, + "common_get_len_om4"); + if (err < 0){ + return err; + } + return self->len_om4; +} + + +int +common_get_comp_extended(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp_ext, + "common_get_comp_extended"); + if (err_code < 0){ + return err_code; + } + return self->transvr_comp_ext; +} + + +int +common_get_comp_rev(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_comp_rev, + "common_get_comp_rev"); + if (err_code < 0){ + return err_code; + } + return self->comp_rev; +} + + +int +common_get_info(struct transvr_obj_s *self){ + + if (self->state != STATE_TRANSVR_CONNECTED) { + return self->state; + } + return self->info; +} + + +int +_common_get_if_lane(struct transvr_obj_s *self, + char *result){ + int i = 0; + int tmp_val = 0; + char tmp_str[LEN_TRANSVR_M_STR] = DEBUG_TRANSVR_STR_VAL; + + memset(result, 0, LEN_TRANSVR_M_STR); + + for (i=0; ilane_id); i++) { + tmp_val = self->lane_id[i]; + if (tmp_val < 1) { + break; + } + memset(tmp_str, 0, LEN_TRANSVR_M_STR); + if (i == 0) { + snprintf(tmp_str, LEN_TRANSVR_M_STR, "%d", tmp_val); + } else { + snprintf(tmp_str, LEN_TRANSVR_M_STR, ",%d", tmp_val); + } + strncat(result, tmp_str, LEN_TRANSVR_M_STR); + } + if (i == 0) { + return EVENT_TRANSVR_TASK_FAIL; + } + return 0; +} + + +int +common_get_if_lane(struct transvr_obj_s *self, + char *buf_p){ + + char tmp_str[LEN_TRANSVR_M_STR] = DEBUG_TRANSVR_STR_VAL; + + if (self->ioexp_obj_p->state != STATE_IOEXP_NORMAL) { + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%d\n", ERR_TRANSVR_ABNORMAL); + } + if (_common_get_if_lane(self, tmp_str) < 0) { + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%d\n" ,ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%s\n" ,tmp_str); +} + + +int +sfp_get_len_sm(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_sfp_update_attr_len_sm, + "sfp_get_len_sm"); + if (err_code < 0){ + return err_code; + } + return self->len_sm; +} + + +int +sfp_get_rate_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_sfp_update_attr_rate_id, + "sfp_get_rate_id"); + if (err_code < 0){ + return err_code; + } + return self->rate_id; +} + + +int +sfp_get_soft_rs0(struct transvr_obj_s *self){ + /* Note: + * SFP Soft Rate_Select Select [aka. "RS(0)"] address + * A2h, offset: 110, bit 3 (begin form 0) + */ + int err_code = DEBUG_TRANSVR_INT_VAL; + int bit_shift = 3; + uint8_t result = 0x00; + uint8_t bitmask = (1 << bit_shift); + + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + return ERR_TRANSVR_NOTSUPPORT; + } + /* Update and check */ + err_code = _check_by_mode(self, + &_sfp_update_attr_soft_rs0, + "sfp_get_soft_rs0"); + if (err_code <0){ + return err_code; + } + result = (self->soft_rs0 & bitmask); + if (result == bitmask) { + return 1; + } + if (result == 0) { + return 0; + } + return ERR_TRANSVR_UNEXCPT; +} + + +int +sfp_get_soft_rs1(struct transvr_obj_s *self){ + /* Note: + * SFP Soft RS(1) Select address + * A2h, offset: 118, bit 3 (begin form 0) + */ + int err_code = DEBUG_TRANSVR_INT_VAL; + int bit_shift = 3; + uint8_t result = 0x00; + uint8_t bitmask = (1 << bit_shift); + + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + return ERR_TRANSVR_NOTSUPPORT; + } + /* Update and check */ + err_code = _check_by_mode(self, + &_sfp_update_attr_soft_rs1, + "sfp_get_soft_rs1"); + if (err_code <0){ + return err_code; + } + result = (self->soft_rs1 & bitmask); + if (result == bitmask) { + return 1; + } + if (result == 0) { + return 0; + } + return ERR_TRANSVR_UNEXCPT; +} + + +int +sfp_get_transvr_temp(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_temp, + "sfp_get_transvr_temp"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_temp[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return _common_count_temp(self->curr_temp[0], + self->curr_temp[1], + buf_p); +} + + +int +sfp_get_transvr_voltage(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_voltage, + "sfp_get_transvr_voltage"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_voltage[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 Volt */ + return _common_count_voltage(self->curr_voltage[0], + self->curr_voltage[1], + buf_p); +} + + +int +sfp_get_transvr_tx_bias(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_tx_bias, + "sfp_get_transvr_tx_bias"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mA */ + return _common_count_tx_bias(self->curr_tx_bias[0], + self->curr_tx_bias[1], + buf_p); +} + + +int +sfp_get_transvr_tx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_tx_power, + "sfp_get_transvr_tx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _common_count_tx_power(self->curr_tx_power[0], + self->curr_tx_power[1], + buf_p); +} + + +int +sfp_get_transvr_rx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_rx_power, + "sfp_get_transvr_rx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _common_count_rx_power(self->curr_rx_power[0], + self->curr_rx_power[1], + buf_p); +} + + +int +sfp_get_transvr_rx_em(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_sfp_update_attr_rx_em, + "sfp_get_transvr_rx_em"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x\n", self->rx_em[0]); +} + + +int +sfp_get_transvr_tx_eq(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_sfp_update_attr_tx_eq, + "sfp_get_transvr_tx_eq"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x\n", self->tx_eq[0]); +} + + +int +_sfp_get_comp_extended(struct transvr_obj_s *self) { + /* Address: A0h / 36 + * Reference: SFF-8024 TABLE 4-4 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp_ext); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +__sfp_get_comp_attr(struct transvr_obj_s *self, + int array_offset) { + /* SFP Specification Compliance: A0h / 3-10 + * transvr_comp[0-7] = 3 - 10 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp[array_offset]); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_get_comp_10g_eth_comp(struct transvr_obj_s *self) { + /* transvr_comp[0] = address A0h / 3 + * + * 3 7: 10G Base-ER + * 3 6: 10GBASE-LRM + * 3 5: 10GBASE-LR + * 3 4: 10GBASE-SR + */ + int bitmask = 0xf0; /* 11110000 */ + return (__sfp_get_comp_attr(self, 0) & bitmask); +} + + +int +_sfp_get_comp_1g_eth_comp(struct transvr_obj_s *self) { + /* transvr_comp[3] = address A0h / 6 + * + * 6 7: BASE-PX *3 + * 6 6: BASE-BX10 *3 + * 6 5: 100BASE-FX + * 6 4: 100BASE-LX/LX10 + * 6 3: 1000BASE-T + * 6 2: 1000BASE-CX + * 6 1: 1000BASE-LX *3 + * 6 0: 1000BASE-SX + */ + return __sfp_get_comp_attr(self, 3); +} + + +int +_sfp_get_cable_tech(struct transvr_obj_s *self) { + /* transvr_comp[5] = address A0h / 8 + * + * 8 3: Active Cable *8 + * 8 2: Passive Cable *8 + */ + int bitmask = 0x0c; /* 00001100 */ + return (__sfp_get_comp_attr(self, 5) & bitmask); +} + + +int +sfp_get_comp_eth_1(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "sfp_get_comp_eth_1"); + if (err_code < 0){ + return err_code; + } + return _sfp_get_comp_1g_eth_comp(self); +} + + +int +sfp_get_comp_eth_10(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "sfp_get_comp_eth_10"); + if (err_code < 0){ + return err_code; + } + return _sfp_get_comp_10g_eth_comp(self); +} + + +int +_sfp_get_connector_type(struct transvr_obj_s *self) { + /* Address: A0h / 2 + * Reference: SFF-8024 TABLE 4-3 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->connector); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_wavelength(struct transvr_obj_s *self, + char *buf_p) { + /* [Note] Optical and Cable Variants Specification Compliance (SFF-8472) + * [Addr] A0h, Bytes 60-61 + * [Note] For optical variants, as defined by having zero's in A0h Byte 8 + * bits 2 and 3, Bytes 60 and 61 denote nominal transmitter output + * wavelength at room temperature. 16 bit value with byte 60 as high + * order byte and byte 61 as low order byte. The laser wavelength is + * equal to the 16 bit integer value in nm. This field allows the user + * to read the laser wavelength directly, so it is not necessary to + * infer it from the Transceiver Codes A0h Bytes 3 to 10 (see Table + * 5-3). This also allows specification of wavelengths not covered + * in the Transceiver Codes, such as those used in coarse WDM systems. + * + * For passive and active cable variants, a value of 00h for both A0h + * Byte 60 and Byte 61 denotes laser wavelength or cable specification + * compliance is unspecified. + */ + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_common_update_attr_wavelength, + "common_get_wavelength"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->wavelength[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* unit: 1 um */ + return snprintf(buf_p, lmax, "%d\n", + _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1])); +} + + +int +sfp_get_1g_rj45_extphy_offset(struct transvr_obj_s *self, char *buf) { + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + return snprintf(buf, LEN_TRANSVR_S_STR, "0x%02x\n", self->extphy_offset); +} + + +int +sfp_get_1g_rj45_extphy_reg(struct transvr_obj_s *self, char *buf) { + + int i = 0; + int ret = 0; + int retry = 3; + int delay = 200; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if (_common_setup_page(self, VAL_TRANSVR_EXTPHY_ADDR_56, + -1, self->extphy_offset, 1, 0) < 0) { + return -EIO; + } + for (i=0; ii2c_client_p, self->extphy_offset); + if (ret >=0) { + goto ok_sfp_get_1g_rj45_extphy_reg; + } + msleep(delay); + } + SWPS_INFO("%s: retry:%d fail :%s :0x%02x\n", + __func__, retry, self->swp_name, self->extphy_offset); + return -EIO; + +ok_sfp_get_1g_rj45_extphy_reg: + ret = ((ret & 0x00ff) << 8) | ((ret & 0xff00) >> 8); + return snprintf(buf, LEN_TRANSVR_S_STR, "0x%04x\n", ret); +} + + +int +__qsfp_get_power_cls(struct transvr_obj_s *self, + int direct_access){ + + int err_code; + uint8_t detect_val; + + /* Detect and Update power class attribute */ + if (direct_access){ + err_code = _check_by_mode(self, + &_common_update_attr_extended_id, + "__qsfp_get_power_cls"); + } else { + err_code = self->ext_id; + } + if (err_code <0){ + return err_code; + } + if (err_code == DEBUG_TRANSVR_HEX_VAL){ + return ERR_TRANSVR_UPDATE_FAIL; + } + /* Clean data */ + detect_val = self->ext_id; + SWP_BIT_CLEAR(detect_val, 2); /* Bit2: CDR RX present */ + SWP_BIT_CLEAR(detect_val, 3); /* Bit3: CDR TX present */ + SWP_BIT_CLEAR(detect_val, 4); /* Bit4: CLEI present */ + SWP_BIT_CLEAR(detect_val, 5); /* Bit5: reserved */ + /* Identify power class */ + switch (detect_val) { + case 0: /* Class_1: 00000000 */ + return 1; + case 64: /* Class_2: 01000000 */ + return 2; + case 128: /* Class_3: 10000000 */ + return 3; + case 192: /* Class_4: 11000000 */ + return 4; + case 1: /* Class_5: 00000001 */ + case 193: /* Class_5: 11000001 */ + return 5; + case 2: /* Class_6: 00000010 */ + case 194: /* Class_6: 11000010 */ + return 6; + case 3: /* Class_7: 00000011 */ + case 195: /* Class_7: 11000011 */ + return 7; + default: + break; + } + SWPS_INFO("%s: Detect undefined power class:%d\n", __func__, detect_val); + return ERR_TRANSVR_UNDEFINED; +} + + +int +qsfp_get_power_cls(struct transvr_obj_s *self) { + return __qsfp_get_power_cls(self, 1); +} + + +int +__qsfp_get_cdr_present(struct transvr_obj_s *self, + int direct_access){ + + int retval; + int BIT_SHIFT = 2; + int BIT_MASK = 0x3; + + /* Detect and Update power class attribute */ + if (direct_access) { + retval = _check_by_mode(self, + &_common_update_attr_extended_id, + "__qsfp_get_cdr_present"); + if (retval < 0){ + return retval; + } + } + retval = self->ext_id; + if (retval == DEBUG_TRANSVR_HEX_VAL){ + return ERR_TRANSVR_UPDATE_FAIL; + } + /* Clean data and return */ + return (int)(retval >> BIT_SHIFT & BIT_MASK); +} + + +int +qsfp_get_cdr_present(struct transvr_obj_s *self) { + return __qsfp_get_cdr_present(self, 1); +} + + +int +qsfp_get_cdr(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_qsfp_update_attr_cdr, + "qsfp_get_cdr"); + if (err_code <0){ + return err_code; + } + + return self->cdr; +} + + +int +__qsfp_get_comp_attr(struct transvr_obj_s *self, + int array_offset) { + /* QSFP Specification Compliance: 00h / 131-138 + * transvr_comp[0-7] = 131 - 138 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp[array_offset]); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_get_comp_10_40_100_ethernet(struct transvr_obj_s *self) { + /* transvr_comp[0] = address 00h / 131 + * + * 131 7: Extended: See section 6.3.23. The Extended Specification Compliance + * Codes are maintained in the Transceiver Management section of SFF- + * 8024. + * 131 6: 10GBASE-LRM + * 131 5: 10GBASE-LR + * 131 4: 10GBASE-SR + * 131 3: 40GBASE-CR4 + * 131 2: 40GBASE-SR4 + * 131 1: 40GBASE-LR4 + * 131 0: 40G Active Cable (XLPPI) + */ + return __qsfp_get_comp_attr(self, 0); +} + + +int +_qsfp_get_comp_sonet(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 132 7-3: Reserved + * 132 2: OC 48, long reach + * 132 1: OC 48, intermediate reach + * 132 0: OC 48 short reach + */ + return __qsfp_get_comp_attr(self, 1); +} + + +int +_qsfp_get_comp_sas_sata(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 133 7: SAS 24.0 Gb/s + * 133 6: SAS 12.0 Gb/s + * 133 5: SAS 6.0 Gb/s + * 133 4: SAS 3.0 Gb/s + * 133 3-0: Reserved + */ + return __qsfp_get_comp_attr(self, 2); +} + + +int +_qsfp_get_comp_ethernet(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 134 7-4: Reserved + * 134 3: 1000BASE-T + * 134 2: 1000BASE-CX + * 134 1: 1000BASE-LX + * 134 0: 1000BASE-SX + */ + return __qsfp_get_comp_attr(self, 3); +} + + +int +_qsfp_get_comp_fc_link_length(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 135 7: Very long distance (V) + * 135 6: Short distance (S) + * 135 5: Intermediate distance (I) + * 135 4: Long distance (L) + * 135 3: Medium (M) + */ + int mask = 0xFC; /* 11111100 */ + return (__qsfp_get_comp_attr(self, 4) & mask); +} + + +int +_qsfp_get_comp_fc_trans_tech(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 135 2: Reserved + * 135 1: Longwave laser (LC) + * 135 0: Electrical inter-enclosure (EL) + * + * 136 7: Electrical intra-enclosure + * 136 6: Shortwave laser w/o OFC (SN) + * 136 5: Shortwave laser w OFC (SL) + * 136 4: Longwave Laser (LL) + * 136 3-0: Reserved + * + * return value = [bit 8-15:addr 135][bit 0-7:addr 136] + */ + int mask_135 = 7; /* 00000111 */ + int val_135 = (__qsfp_get_comp_attr(self, 4) & mask_135); + int val_136 = __qsfp_get_comp_attr(self, 5); + return ((val_135 << 7) + val_136); +} + + +int +_qsfp_get_comp_fc_trans_media(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 137 7: Twin Axial Pair (TW) + * 137 6: Shielded Twisted Pair (TP) + * 137 5: Miniature Coax (MI) + * 137 4: Video Coax (TV) + * 137 3: Multi-mode 62.5 m (M6) + * 137 2: Multi-mode 50 m (M5) + * 137 1: Multi-mode 50 um (OM3) + * 137 0: Single Mode (SM) + */ + return __qsfp_get_comp_attr(self, 6); +} + + +int +_qsfp_get_comp_fc_speed(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 138 7: 1200 MBps (per channel) + * 138 6: 800 MBps + * 138 5: 1600 MBps (per channel) + * 138 4: 400 MBps + * 138 3: 3200 MBps (per channel) + * 138 2: 200 MBps + * 138 1: Extended: See section 6.3.23. The Extended Specification + * Compliance Codes are maintained in the Transceiver Management + * section of SFF-8024. + * 138 0: 100 MBps + */ + return __qsfp_get_comp_attr(self, 7); +} + + +int +_qsfp_get_comp_extended(struct transvr_obj_s *self) { + /* Address: 00h / 192 + * Reference: SFF-8024 TABLE 4-4 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp_ext); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_comp_eth(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "qsfp_get_comp_eth"); + if (err_code < 0){ + return err_code; + } + return _qsfp_get_comp_ethernet(self); +} + + +int +qsfp_get_comp_10_40(struct transvr_obj_s *self) { + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "qsfp_get_comp_10_40"); + if (err_code < 0){ + return err_code; + } + return _qsfp_get_comp_10_40_100_ethernet(self); +} + + +int +_qsfp_get_connector_type(struct transvr_obj_s *self) { + /* Address: 00h / 130 + * Reference: SFF-8024 TABLE 4-3 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->connector); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_transvr_temp(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_temp, + "qsfp_get_transvr_temp"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_temp[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return _common_count_temp(self->curr_temp[0], + self->curr_temp[1], + buf_p); +} + + +int +qsfp_get_transvr_voltage(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_voltage, + "qsfp_get_transvr_voltage"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_voltage[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 Volt */ + return _common_count_voltage(self->curr_voltage[0], + self->curr_voltage[1], + buf_p); +} + + +int +qsfp_get_transvr_tx_eq(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_tx_eq, + "qsfp_get_transvr_tx_eq"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->tx_eq[0], self->tx_eq[1]); +} + + +int +qsfp_get_transvr_rx_am(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_rx_am, + "qsfp_get_transvr_rx_am"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->rx_am[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->rx_am[0], self->rx_am[1]); +} + + +int +qsfp_get_transvr_rx_em(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_rx_em, + "qsfp_get_transvr_rx_em"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->rx_em[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->rx_em[0], self->rx_em[1]); +} + + +int +_qsfp_get_channel_diag(uint8_t *data_array, + int (*count_func)(uint8_t high_byte, uint8_t low_byte, char *buf_p), + char *ch_name, + char *result_p) { + int i, high, low; + int len_max = 128; + char ch_buf[4][16] = { DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL }; + + for (i=0; i<4; i++) { + high = (i*2); + low = ((i*2) + 1); + count_func(data_array[high], data_array[low], ch_buf[i]); + } + return snprintf(result_p, len_max, + "%s-%d:%s%s-%d:%s%s-%d:%s%s-%d:%s", + ch_name, 1, ch_buf[0], + ch_name, 2, ch_buf[1], + ch_name, 3, ch_buf[2], + ch_name, 4, ch_buf[3]); +} + + +int +qsfp_get_soft_rx_los(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_rx_los, + "qsfp_get_soft_rx_los"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->rx_los & mask)); +} + + +int +qsfp_get_soft_tx_disable(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_get_soft_tx_disable"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->tx_disable & mask)); +} + + +int +qsfp_get_soft_tx_fault(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_fault, + "qsfp_get_soft_tx_fault"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->tx_fault & mask)); +} + + +int +qsfp_get_auto_tx_disable(struct transvr_obj_s *self, + char *buf_p) { + + if (self->auto_tx_disable == VAL_TRANSVR_FUNCTION_DISABLE) { + return snprintf(buf_p, LEN_TRANSVR_S_STR, + "%d\n", ERR_TRANSVR_FUNC_DISABLE); + } + return snprintf(buf_p, LEN_TRANSVR_S_STR, + "0x%02x\n", self->auto_tx_disable); +} + + +int +qsfp_get_transvr_tx_bias(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "TX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_tx_bias, + "qsfp_get_transvr_tx_bias"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mA */ + return _qsfp_get_channel_diag(self->curr_tx_bias, + _common_count_tx_bias, + ch_name, + buf_p); +} + + +int +qsfp_get_transvr_tx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "TX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_tx_power, + "qsfp_get_transvr_tx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_power[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _qsfp_get_channel_diag(self->curr_tx_power, + _common_count_tx_power, + ch_name, + buf_p); +} + + +int +qsfp_get_transvr_rx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "RX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_rx_power, + "qsfp_get_transvr_rx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_power[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _qsfp_get_channel_diag(self->curr_rx_power, + _common_count_rx_power, + ch_name, + buf_p); +} + + +int +qsfp_get_wavelength(struct transvr_obj_s *self, + char *buf_p) { + /* [Desc] Wavelength or Copper Cable Attenuation (SFF-8636) + * [Addr] 00h 186-187 + * [Note] + * For optical free side devices, this parameter identifies the nominal + * transmitter output wavelength at room temperature. This parameter is + * a 16-bit hex value with Byte 186 as high order byte and Byte 187 as + * low order byte. The laser wavelength is equal to the 16-bit integer value + * divided by 20 in nm (units of 0.05 nm). This resolution should be adequate + * to cover all relevant wavelengths yet provide enough resolution for all + * expected DWDM applications. For accurate representation of controlled + * wavelength applications, this value should represent the center of the + * guaranteed wavelength range. + * If the free side device is identified as copper cable these registers will + * be used to define the cable attenuation. An indication of 0 dB attenuation + * refers to the case where the attenuation is not known or is unavailable. + * Byte 186 (00-FFh) is the copper cable attenuation at 2.5 GHz in units of 1 dB. + * Byte 187 (00-FFh) is the copper cable attenuation at 5.0 GHz in units of 1 dB. + */ + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_common_update_attr_wavelength, + "common_get_wavelength"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->wavelength[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* unit: 1 um */ + return snprintf(buf_p, lmax, "%d\n", + _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1])); +} + + +/* Public Function for Setup Features + */ +static int +__sfp_set_soft_rs(struct transvr_obj_s *self, + int input_val, + int address, + int page, + int offset, + int bit_shift, + uint8_t *attr_p, + char *caller, + int show_err) { + + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + uint8_t update_val = (*attr_p); + + switch (input_val) { + case 0: + SWP_BIT_CLEAR(update_val, bit_shift); + break; + case 1: + SWP_BIT_SET(update_val, bit_shift); + break; + default: + retval = ERR_TRANSVR_UNEXCPT; + err_code = ERR_TRANSVR_UNEXCPT; + err_msg = "Exception occurs"; + goto err_private_sfp_set_soft_rs_1; + } + err_code = _common_set_uint8_attr(self, + address, + page, + offset, + update_val, + attr_p, + caller, + show_err); + if (err_code < 0) { + retval = err_code; + err_msg = "Write data via i2c fail!"; + goto err_private_sfp_set_soft_rs_1; + } + (*attr_p) = update_val; + return 0; + +err_private_sfp_set_soft_rs_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +static int +_sfp_set_soft_rs(struct transvr_obj_s *self, + int input_val, + int address, + int page, + int offset, + int bit_shift, + int (*attr_update_func)(struct transvr_obj_s *self, int show_err), + uint8_t *attr_p, + char *caller, + int show_err) { + + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + + /* Check input value */ + if ((input_val != 0) && (input_val != 1)){ + retval = ERR_TRANSVR_BADINPUT; + err_code = ERR_TRANSVR_BADINPUT; + err_msg = "Input range incorrect!"; + goto err_common_sfp_set_soft_rs_1; + } + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + switch (err_code) { + case 0: + retval = ERR_TRANSVR_NOTSUPPORT; + err_msg = "Not support this feature"; + break; + case ERR_TRANSVR_UNINIT: + retval = ERR_TRANSVR_UNINIT; + err_msg = "Check CDR present fail!"; + break; + case ERR_TRANSVR_UNPLUGGED: + retval = ERR_TRANSVR_UNPLUGGED; + err_msg = "Transceiver unplugged!"; + break; + default: + retval = err_code; + err_msg = "Check Rate_ID fail!"; + break; + } + goto err_common_sfp_set_soft_rs_1; + } + /* Check and update */ + err_code = _check_by_mode(self, + attr_update_func, + caller); + if ( (err_code < 0) || + ((*attr_p) == DEBUG_TRANSVR_HEX_VAL) ){ + retval = err_code; + err_msg = "Get current value fail!"; + goto err_common_sfp_set_soft_rs_1; + } + /* Generate and update value */ + return __sfp_set_soft_rs(self, + input_val, + address, + page, + offset, + bit_shift, + attr_p, + caller, + show_err); + +err_common_sfp_set_soft_rs_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +int +sfp_set_soft_rs0(struct transvr_obj_s *self, + int input_val) { + /* Note: + * SFP Soft Rate_Select Select RX ["RS(0)"] address + * A2h, offset: 110, bit 3 + */ + int bit_shift = 3; + int show_err = 1; + return _sfp_set_soft_rs(self, + input_val, + self->eeprom_map_p->addr_soft_rs0, + self->eeprom_map_p->page_soft_rs0, + self->eeprom_map_p->offset_soft_rs0, + bit_shift, + &_sfp_update_attr_soft_rs0, + &(self->soft_rs0), + "sfp_set_soft_rs0", + show_err); +} + + +int +sfp_set_soft_rs1(struct transvr_obj_s *self, + int input_val) { + /* Note: + * SFP Soft Rate_Select Select RX ["RS(1)"] address + * A2h, offset: 118, bit 3 + */ + int bit_shift = 3; + int show_err = 1; + return _sfp_set_soft_rs(self, + input_val, + self->eeprom_map_p->addr_soft_rs1, + self->eeprom_map_p->page_soft_rs1, + self->eeprom_map_p->offset_soft_rs1, + bit_shift, + &_sfp_update_attr_soft_rs1, + &(self->soft_rs1), + "sfp_set_soft_rs1", + show_err); +} + + +int +__sfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv = DEBUG_TRANSVR_HEX_VAL; + + if ((input < 0) || (input > 0xFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_sfp_set_tx_eq; + } + setv = (uint8_t)input; + if (self->tx_eq[0] == setv) { + return 0; + } + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + setv, + &(self->tx_eq[0]), + "_sfp_set_tx_eq", + show_e); + if (err < 0) { + emsg = "set_uint8_attr fail"; + goto err_sfp_set_tx_eq; + } + return 0; + +err_sfp_set_tx_eq: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_sfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + uint8_t tmp; + int i = 0; + int retry = 3; + + for (i=0; itx_eq[0]; + if (_sfp_update_attr_tx_eq(self, show_e) < 0){ + continue; + } + if (self->tx_eq[0] == tmp){ + return 0; + } + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +int +sfp_set_tx_eq(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_sfp_update_attr_tx_eq, + "sfp_set_tx_eq"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _sfp_set_tx_eq(self, input, 1); +} + + +int +__sfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv = DEBUG_TRANSVR_HEX_VAL; + + if ((input < 0) || (input > 0xFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_sfp_set_rx_em; + } + setv = (uint8_t)input; + if (self->rx_em[0] == setv) { + return 0; + } + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + setv, + &(self->rx_em[0]), + "_sfp_set_rx_em", + show_e); + if (err < 0) { + emsg = "set_uint8_attr fail"; + goto err_sfp_set_rx_em; + } + return 0; + +err_sfp_set_rx_em: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_sfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + uint8_t tmp; + int i = 0; + int retry = 3; + + for (i=0; irx_em[0]; + if (_sfp_update_attr_rx_em(self, show_e) < 0){ + continue; + } + if (self->rx_em[0] == tmp){ + return 0; + } + } + return -1; +} + + +int +sfp_set_rx_em(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_sfp_update_attr_rx_em, + "sfp_set_rx_em"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _sfp_set_rx_em(self, input, 1); +} + + +int +sfp_set_1g_rj45_extphy_offset(struct transvr_obj_s *self, + int input) { + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if ((input < 0) || (input > 0xff)) { + return ERR_TRANSVR_BADINPUT; + } + self->extphy_offset = (uint8_t)input; + return 0; +} + + +int +sfp_set_1g_rj45_extphy_reg(struct transvr_obj_s *self, + int input) { + + int i = 0; + int retry = 3; + int delay = 200; + uint16_t tmp = 0; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if ((input < 0) || (input > 0xffff)) { + return ERR_TRANSVR_BADINPUT; + } + tmp = ((input & 0x00ff) << 8) | ((input & 0xff00) >> 8); + if (_common_setup_page(self, VAL_TRANSVR_EXTPHY_ADDR_56, + -1, self->extphy_offset, 1, 0) < 0) { + return -EIO; + } + for (i=0; i<=retry; i++) { + if (i2c_smbus_write_word_data(self->i2c_client_p, + self->extphy_offset, + tmp) >= 0) { + return 0; + } + msleep(delay); + } + SWPS_INFO("%s: retry:%d fail :%s :0x%02x\n", + __func__, retry, self->swp_name, self->extphy_offset); + return -EIO; +} + + +static int +__qsfp_set_cdr(struct transvr_obj_s *self, + int input_val, + int show_err) { + + uint8_t update_val; + int CDR_FEATURE_SUPPORTED = 0x3; + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + char *func_name = "__qsfp_set_cdr"; + + /* Check input value */ + if ((input_val < 0) || (input_val > 0xff)){ + retval = ERR_TRANSVR_BADINPUT; + err_code = ERR_TRANSVR_BADINPUT; + err_msg = "Input range incorrect!"; + goto err_qsfp_set_cdr_1; + } + update_val = (uint8_t)input_val; + /* Check CDR supported by transceiver */ + err_code = qsfp_get_cdr_present(self); + if (err_code < 0) { + retval = err_code; + switch (err_code) { + case ERR_TRANSVR_UNINIT: + err_msg = "Check CDR present fail!"; + break; + case ERR_TRANSVR_UNPLUGGED: + err_msg = "Transceiver unplugged!"; + break; + default: + err_msg = "Check CDR present fail!"; + break; + } + goto err_qsfp_set_cdr_1; + } + if (err_code != CDR_FEATURE_SUPPORTED) { + retval = ERR_TRANSVR_NOTSUPPORT; + err_msg = "This transceiver not support CDR!"; + goto err_qsfp_set_cdr_1; + } + /* Check and update */ + err_code = _check_by_mode(self, + &_qsfp_update_attr_cdr, + func_name); + if ( (err_code < 0) || + (self->cdr == DEBUG_TRANSVR_HEX_VAL) ){ + retval = err_code; + err_msg = "Get current value fail!"; + goto err_qsfp_set_cdr_1; + } + /* Write input value to transceiver */ + return _common_set_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->page_cdr, + self->eeprom_map_p->offset_cdr, + update_val, + &(self->cdr), + func_name, + show_err); + +err_qsfp_set_cdr_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +int +qsfp_set_cdr(struct transvr_obj_s *self, + int input_val) { + return __qsfp_set_cdr(self, input_val, 1); +} + + +int +qsfp_set_soft_tx_disable(struct transvr_obj_s *self, + int input_val) { + + int show_err = 1; + int in_max = 0xf; /* 1111 */ + int in_min = 0x0; /* 0000 */ + int retval = DEBUG_TRANSVR_INT_VAL; + int update_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + retval = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_set_soft_tx_disable"); + if (retval < 0) { + snprintf(err_msg, 63, "Not ready. err:%d", retval); + goto err_qsfp_set_soft_tx_disable; + } + if ((input_val > in_max) || + (input_val < in_min) ){ + retval = ERR_TRANSVR_BADINPUT; + snprintf(err_msg, 63, "Input value:%d incorrect!", input_val); + goto err_qsfp_set_soft_tx_disable; + } + if ((self->tx_disable & 0x0f) == input_val) { + return 0; + } + update_val = ((self->tx_disable & 0xf0) & input_val); + retval = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + input_val, + &(self->tx_disable), + "qsfp_set_tx_disable", + show_err); + if (retval < 0) { + snprintf(err_msg, 63, "_common_set_uint8_attr:%d fail!", retval); + goto err_qsfp_set_soft_tx_disable; + } + return 0; + +err_qsfp_set_soft_tx_disable: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return retval; +} + + +int +_qsfp_set_auto_tx_disable(struct transvr_obj_s *self, + uint8_t update) { + + uint8_t tx_enable = 0x0; + int show_e = 1; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Handle timing issues */ + if (update != tx_enable) { + /* Note: + * Because there are some txvr has timing issues, + * therefore we need to execute reset cycle first. + * (enable -> other settings) + */ + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + tx_enable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C set reset value fail"; + goto err_qsfp_set_auto_tx_disable; + } + mdelay(10); + } + /* Setup target value */ + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->auto_tx_disable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C set target value fail"; + goto err_qsfp_set_auto_tx_disable; + } + /* Check and update */ + err = _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->eeprom_map_p->length_tx_disable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C get value fail"; + goto err_qsfp_set_auto_tx_disable; + } + if (self->tx_disable != update) { + emsg = "data not become effective"; + goto err_qsfp_set_auto_tx_disable; + } + return 0; + +err_qsfp_set_auto_tx_disable: + SWPS_DEBUG("%s: %s :%s\n", + __func__, emsg, self->swp_name); + return ERR_TRANSVR_UPDATE_FAIL; +} + + +int +qsfp_set_auto_tx_disable(struct transvr_obj_s *self, + int input_val) { + + int in_max = 0xf; /* 1111 */ + int in_min = 0x0; /* 0000 */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Update settings*/ + if (input_val == VAL_TRANSVR_FUNCTION_DISABLE) { + emsg = "User disable auto tx_disable"; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + goto out_qsfp_set_auto_tx_disable; + } + if ((input_val > in_max) || (input_val < in_min) ){ + SWPS_INFO("%s: Input value:%d incorrect! :%s\n", + __func__, input_val, self->swp_name); + return ERR_TRANSVR_BADINPUT; + } + self->auto_tx_disable = input_val; + /* Check current soft tx_disable */ + retval = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_set_auto_tx_disable"); + switch (retval) { + case 0: + break; + case ERR_TRANSVR_UNPLUGGED: + emsg = "Doesn't need to update"; + goto out_qsfp_set_auto_tx_disable; + default: + SWPS_INFO("%s: setup fail :%d :%s\n", + __func__, retval, self->swp_name); + return retval; + } + return _qsfp_set_auto_tx_disable(self, input_val); + +out_qsfp_set_auto_tx_disable: + SWPS_DEBUG("%s: %s :%s :%d\n :%d", + __func__, emsg, self->swp_name, input_val, retval); + return 0; +} + + +int +__qsfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_tx_eq; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->tx_eq[0] == setv[0]) && + (self->tx_eq[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + setv, + self->tx_eq, + "_qsfp_set_tx_eq", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_tx_eq; + } + return 0; + +err_qsfp_set_tx_eq: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; itx_eq[0]; + tmp[1] = self->tx_eq[1]; + if (_qsfp_update_attr_tx_eq(self, show_e) < 0){ + continue; + } + if ((self->tx_eq[0] == tmp[0]) && + (self->tx_eq[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_tx_eq(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_tx_eq, + "qsfp_set_tx_eq"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_tx_eq(self, input, 1); +} + + +int +__qsfp_set_rx_am(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_rx_am; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->rx_am[0] == setv[0]) && + (self->rx_am[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_rx_am, + self->eeprom_map_p->page_rx_am, + self->eeprom_map_p->offset_rx_am, + self->eeprom_map_p->length_rx_am, + setv, + self->rx_am, + "_qsfp_set_rx_am", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_rx_am; + } + return 0; + +err_qsfp_set_rx_am: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_rx_am(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; irx_am[0]; + tmp[1] = self->rx_am[1]; + if (_qsfp_update_attr_rx_am(self, show_e) < 0){ + continue; + } + if ((self->rx_am[0] == tmp[0]) && + (self->rx_am[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_rx_am(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_rx_am, + "qsfp_set_rx_am"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_rx_am(self, input, 1); +} + + +int +__qsfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_rx_em; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->rx_em[0] == setv[0]) && + (self->rx_em[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + setv, + self->rx_em, + "_qsfp_set_rx_em", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_rx_em; + } + return 0; + +err_qsfp_set_rx_em: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; irx_em[0]; + tmp[1] = self->rx_em[1]; + if (_qsfp_update_attr_rx_em(self, show_e) < 0){ + continue; + } + if ((self->rx_em[0] == tmp[0]) && + (self->rx_em[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_rx_em(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_rx_em, + "qsfp_set_rx_em"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_rx_em(self, input, 1); +} + + +int +common_transvr_dump(struct transvr_obj_s* self){ + + char *type_name = "Undefined"; + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + switch (self->type) { + case TRANSVR_TYPE_SFP: + type_name = STR_TRANSVR_SFP; + break; + case TRANSVR_TYPE_QSFP: + type_name = STR_TRANSVR_QSFP; + break; + case TRANSVR_TYPE_QSFP_PLUS: + type_name = STR_TRANSVR_QSFP_PLUS; + break; + case TRANSVR_TYPE_QSFP_28: + type_name = STR_TRANSVR_QSFP28; + break; + case TRANSVR_TYPE_FAKE: + type_name = "FAKE"; + goto ok_common_transvr_dump; + case TRANSVR_TYPE_UNPLUGGED: + type_name = "UNPLUGGED"; + goto err_common_transvr_dump; + case TRANSVR_TYPE_INCONSISTENT: + type_name = "INCONSISTENT"; + goto err_common_transvr_dump; + case TRANSVR_TYPE_ERROR: + type_name = "ERROR"; + goto err_common_transvr_dump; + + default: + type_name = "UNEXPECTED"; + goto err_common_transvr_dump; + } + printk(KERN_INFO "[SWPS] Dump %s information:\n", self->swp_name); + printk(KERN_INFO " |- :%s\n", type_name); + printk(KERN_INFO " |- :%s\n", self->vendor_name); + printk(KERN_INFO " |- :%s\n", self->vendor_pn); + printk(KERN_INFO " |- :%s\n", self->vendor_rev); + printk(KERN_INFO " |- :%s\n", self->vendor_sn); + printk(KERN_INFO " |- :0x%02x\n", self->br); + printk(KERN_INFO " |- :0x%02x\n", self->comp_rev); + printk(KERN_INFO " |- :%d\n", self->len_om1); + printk(KERN_INFO " |- :%d\n", self->len_om2); + printk(KERN_INFO " |- :%d\n", self->len_om3); + printk(KERN_INFO " |- :%d\n", self->len_om4); + return 0; + +ok_common_transvr_dump: + SWPS_INFO("%s: %s is %s\n", __func__, self->swp_name, type_name); + return 0; + +err_common_transvr_dump: + SWPS_INFO("%s: %s is %s\n", __func__, self->swp_name, type_name); + return -1; +} + + +int +sfp_transvr_dump(struct transvr_obj_s* self) { + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + if (common_transvr_dump(self) < 0) { + return -1; + } + printk(KERN_INFO " |- :%d\n", self->len_sm); + printk(KERN_INFO " |- :%d\n", self->len_smf); + printk(KERN_INFO " '- :0x%02x\n", self->rate_id); + return 0; +} + + +int +qsfp_transvr_dump(struct transvr_obj_s* self) { + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + if (common_transvr_dump(self) < 0) { + return -1; + } + printk(KERN_INFO " |- :%d\n", self->len_smf); + printk(KERN_INFO " '- :Class_%d\n", __qsfp_get_power_cls(self, 0)); + return 0; +} + + +int +fake_transvr_dump(struct transvr_obj_s* self) { + + printk(KERN_INFO "[SWPS] Dump transceiver information: %s\n", self->swp_name); + printk(KERN_INFO " |- :FAKE\n"); + printk(KERN_INFO " |- :FAKE_VENDER_NAME\n"); + printk(KERN_INFO " |- :FAKE_VENDER_PN\n"); + printk(KERN_INFO " |- :FAKE_VENDER_REV\n"); + printk(KERN_INFO " |- :FAKE_VENDER_SN\n"); + printk(KERN_INFO " |- :0x99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " '- :0x99\n"); + return 0; +} + + +/* ========== Object functions for fake type ========== + */ +int +fake_transvr_update(struct transvr_obj_s *self, + int show_err){ + self->state = STATE_TRANSVR_CONNECTED; + return 0; +} + + +int +fake_get_binary(struct transvr_obj_s *self){ + return 1; +} + +int +fake_get_int(struct transvr_obj_s *self){ + return 99; +} + + +int +fake_get_hex(struct transvr_obj_s *self){ + return 0x0f; +} + + +int +fake_get_str(struct transvr_obj_s *self, char *buf) { + return snprintf(buf, 16, "fake_get_str\n"); +} + + +int +fake_set_int(struct transvr_obj_s *self, int input){ + SWPS_INFO("%s: %d\n", __func__, input); + return 0; +} + + +int +fake_set_hex(struct transvr_obj_s *self, int input){ + SWPS_INFO("%s: 0x%02x\n", __func__, input); + return 0; +} + + +/* ========== Object functions for unsupported ========== + */ +int +unsupported_get_func(struct transvr_obj_s *self){ + return ERR_TRANSVR_NOTSUPPORT; +} + + +int +unsupported_get_func2(struct transvr_obj_s *self, + char *buf_p) { + int len = snprintf(buf_p, 8, "%d\n", ERR_TRANSVR_NOTSUPPORT); + return len; +} + + +int +unsupported_set_func(struct transvr_obj_s *self, + int input_val){ + return ERR_TRANSVR_NOTSUPPORT; +} + + + +/* ========== Object functions for long term task ========== + * + * [Note] + * SWPS transceiver worker is likely the green-thread (coroutine). + * Due to resource and performance considerations. SWPS run all + * features in one kthread at the same time, and handle by it self. + */ + +/* For Transceiver Task Handling + */ +static struct transvr_worker_s * +transvr_task_get(struct transvr_obj_s *self, + char *func_name) { + + struct transvr_worker_s *curr_p = self->worker_p; + + while(curr_p != NULL){ + if (strcmp((curr_p->func_name), func_name) == 0 ) { + return curr_p; + } + curr_p = curr_p->next_p; + } + return NULL; +} + + +static struct transvr_worker_s* +transvr_task_creat(struct transvr_obj_s *self, + int (*main_task)(struct transvr_worker_s *task), + int (*post_task)(struct transvr_worker_s *task), + char *caller) { + + struct transvr_worker_s *task_p = NULL; + struct transvr_worker_s *curr_p = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check task not exist */ + task_p = transvr_task_get(self, caller); + if (task_p) { + snprintf(err_msg, sizeof(err_msg), "Task already created!"); + goto err_transvr_task_creat; + } + /* Create task worker */ + task_p = kzalloc(sizeof(struct transvr_worker_s), GFP_KERNEL); + if (!task_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_transvr_task_creat; + } + /* Setup task data */ + task_p->transvr_p = self; + task_p->next_p = NULL; + task_p->trigger_time = 0; + task_p->retry = 1; + task_p->state = STATE_T_TASK_INIT; + task_p->main_task = main_task; + task_p->post_task = post_task; + task_p->p_data = NULL; + snprintf(task_p->func_name, sizeof(task_p->func_name), "%s", caller); + /* Setup Link List */ + if (self->worker_p) { + curr_p = self->worker_p; + while(curr_p->next_p != NULL) { + curr_p = curr_p->next_p; + } + curr_p->next_p = task_p; + task_p->pre_p = curr_p; + } else { + self->worker_p = task_p; + task_p->pre_p = NULL; + } + return task_p; + +err_transvr_task_creat: + SWPS_ERR("%s: %s :%s :%s\n", + __func__, err_msg, caller, self->swp_name); + return NULL; +} + + +static void +transvr_task_free_one(struct transvr_worker_s *task_p){ + + struct transvr_worker_s *pre_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if (task_p) { + pre_p = task_p->pre_p; + next_p = task_p->next_p; + + if ((pre_p) && (next_p)) { + pre_p->next_p = next_p; + next_p->pre_p = pre_p; + + } else if ((!pre_p) && (next_p)) { + next_p->pre_p = NULL; + + } else if ((pre_p) && (!next_p)) { + pre_p->next_p = NULL; + + } else if ((!pre_p) && (!next_p)) { + task_p->transvr_p->worker_p = NULL; + } else { + SWPS_ERR("%s: Unexcept case!\n :%s", + __func__, task_p->transvr_p->swp_name); + } + kfree(task_p->p_data); + kfree(task_p); + } +} + + +static void +transvr_task_free_all(struct transvr_obj_s *self) { + + struct transvr_worker_s *curr_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if (self->worker_p) { + curr_p = self->worker_p; + while(curr_p) { + next_p = curr_p->next_p; + transvr_task_free_one(curr_p); + curr_p = next_p; + } + self->worker_p = NULL; + } +} + + +static void +transvr_cache_free_all(struct transvr_obj_s *self) { + + memset(self->vendor_name, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_rev, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_pn, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_sn, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + self->extphy_offset = 0; +} + +static int +_transvr_task_run_main(struct transvr_worker_s *task_p) { + + int retval = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + if (!task_p){ + snprintf(err_msg, sizeof(err_msg), "main_task is NULL!"); + goto main_transvr_task_err; + } + if ((task_p->trigger_time) == 0){ + goto main_transvr_task_run; + } + if (time_before(jiffies, task_p->trigger_time)){ + goto main_transvr_task_wait; + } + goto main_transvr_task_run; + +main_transvr_task_run: + if (task_p->retry != VAL_TRANSVR_TASK_RETRY_FOREVER) { + task_p->retry -= 1; + } + retval = task_p->main_task(task_p); + if (retval < 0) { + if (task_p->retry > 0) { + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + } + snprintf(err_msg, sizeof(err_msg), "Run main_task fail!"); + goto main_transvr_task_err; + } + goto main_transvr_task_identify; + +main_transvr_task_identify: + switch (retval) { + case EVENT_TRANSVR_TASK_WAIT: + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + + case EVENT_TRANSVR_TASK_DONE: + task_p->state = STATE_T_TASK_DONE; + return EVENT_TRANSVR_TASK_DONE; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Run main_task fail!"); + goto main_transvr_task_err; + +main_transvr_task_wait: + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + +main_transvr_task_err: + task_p->state = STATE_T_TASK_FAIL; + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, retval, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +_transvr_task_run_post(struct transvr_worker_s *task_p) { + + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + if ((task_p->post_task) == NULL) { + return EVENT_TRANSVR_TASK_DONE; + } + switch (task_p->state) { + case STATE_T_TASK_WAIT: + case STATE_T_TASK_INIT: + goto post_transvr_task_wait; + + case STATE_T_TASK_DONE: + case STATE_T_TASK_FAIL: + goto post_transvr_task_run; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Unexcept task state"); + goto post_transvr_task_err; + +post_transvr_task_run: + task_p->post_task(task_p); + return EVENT_TRANSVR_TASK_DONE; + +post_transvr_task_wait: + return EVENT_TRANSVR_TASK_WAIT; + +post_transvr_task_err: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, task_p->state, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +transvr_task_run_one(struct transvr_worker_s *task_p) { + + int retval_main = DEBUG_TRANSVR_INT_VAL; + int retval_post = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + retval_main = _transvr_task_run_main(task_p); + if (retval_main < 0) { + snprintf(err_msg, sizeof(err_msg), "Execute main_task fail!"); + goto err_transvr_task_run_one; + } + retval_post = _transvr_task_run_post(task_p); + if (retval_post < 0) { + snprintf(err_msg, sizeof(err_msg), "Execute post_task fail!"); + goto err_transvr_task_run_one; + } + return retval_main; + +err_transvr_task_run_one: + SWPS_INFO("%s: %s
:%d :%d :%s :%s\n", + __func__, err_msg, retval_main, retval_post, + task_p->func_name, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +transvr_task_run_all(struct transvr_obj_s *self) { + + int haserr = 0; + int retval = DEBUG_TRANSVR_INT_VAL; + struct transvr_worker_s *curr_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if ((self->worker_p) == NULL) { + return EVENT_TRANSVR_TASK_DONE; + } + curr_p = self->worker_p; + while (curr_p != NULL) { + next_p = curr_p->next_p; + retval = transvr_task_run_one(curr_p); + if (curr_p->retry == VAL_TRANSVR_TASK_RETRY_FOREVER) { + curr_p = next_p; + continue; + } + switch (retval) { + case EVENT_TRANSVR_TASK_WAIT: + break; + case EVENT_TRANSVR_TASK_DONE: + transvr_task_free_one(curr_p); + break; + case EVENT_TRANSVR_TASK_FAIL: + + default: + haserr = 1; + transvr_task_free_one(curr_p); + break; + } + curr_p = next_p; + } + if (haserr) { + return EVENT_TRANSVR_TASK_FAIL; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +static void +transvr_task_set_delay(struct transvr_worker_s *task_p, + unsigned long delay_msec) { + + task_p->trigger_time = (jiffies + (delay_msec * (HZ/1000))); +} + + +static void +transvr_task_set_retry(struct transvr_worker_s *task_p, + unsigned long retry_times) { + + task_p->retry = retry_times; +} + + +/* For Transceiver Post Task + */ +int +taskfunc_post_do_nothing(struct transvr_worker_s *task_p) { + + return EVENT_TRANSVR_TASK_DONE; +} + + +int +taskfunc_post_handle_task_state(struct transvr_worker_s *task_p) { + + struct transvr_obj_s* tp = task_p->transvr_p; + + switch (task_p->state) { + case STATE_T_TASK_INIT: + case STATE_T_TASK_WAIT: + return EVENT_TRANSVR_TASK_WAIT; + + case STATE_T_TASK_DONE: + tp->state = STATE_TRANSVR_CONNECTED; + tp->send_uevent(tp, KOBJ_ADD); + return EVENT_TRANSVR_TASK_DONE; + + case STATE_T_TASK_FAIL: + tp->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_TASK_FAIL; + + default: + break; + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +/* For Transceiver Main Task + */ +int +_taskfunc_sfp_setup_soft_rs(struct transvr_worker_s *task_p, + int input_val, + int address, + int page, + int offset, + int bit_shift, + uint8_t *attr_p, + char *caller) { + + int show_err = 0; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_soft_rs"; + + err_code = _sfp_update_attr_soft_rs0(task_p->transvr_p, 0); + if (err_code < 0) { + err_str = "Get current soft_rs0 fail!"; + goto err_taskfunc_sfp_setup_soft_rs_1; + } + err_code = __sfp_set_soft_rs(task_p->transvr_p, + input_val, + address, + page, + offset, + bit_shift, + attr_p, + caller, + show_err); + if (err_code < 0) { + err_str = "Get current soft_rs0 fail!"; + goto err_taskfunc_sfp_setup_soft_rs_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_setup_soft_rs_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_code); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +__taskfunc_sfp_setup_hard_rs(struct transvr_worker_s *task_p, + int input_val, + int (*get_func)(struct ioexp_obj_s *self, int virt_offset), + int (*set_func)(struct ioexp_obj_s *self, int virt_offset, int input_val)) { + + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + + err_val = get_func(task_p->transvr_p->ioexp_obj_p, + task_p->transvr_p->ioexp_virt_offset); + + if (err_val < 0) { + if (err_val == ERR_IOEXP_NOTSUPPORT) { + return EVENT_TRANSVR_TASK_DONE; + } + err_str = "Get current hard_rs fail!"; + goto err_p_taskfunc_sfp_setup_hard_rs_1; + } + if (err_val == input_val) { + return EVENT_TRANSVR_TASK_DONE; + } + err_val = set_func(task_p->transvr_p->ioexp_obj_p, + task_p->transvr_p->ioexp_virt_offset, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs fail!"; + goto err_p_taskfunc_sfp_setup_hard_rs_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_p_taskfunc_sfp_setup_hard_rs_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + __func__, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_sfp_setup_hard_rs0(struct transvr_worker_s *task_p, + int input_val) { + + return __taskfunc_sfp_setup_hard_rs(task_p, + input_val, + task_p->transvr_p->ioexp_obj_p->get_hard_rs0, + task_p->transvr_p->ioexp_obj_p->set_hard_rs0); +} + + +int +_taskfunc_sfp_setup_hard_rs1(struct transvr_worker_s *task_p, + int input_val) { + + return __taskfunc_sfp_setup_hard_rs(task_p, + input_val, + task_p->transvr_p->ioexp_obj_p->get_hard_rs1, + task_p->transvr_p->ioexp_obj_p->set_hard_rs1); +} + + +int +_taskfunc_sfp_setup_rs0(struct transvr_worker_s *task_p, + int input_val) { + + int bit_shift = 3; + int old_val = DEBUG_TRANSVR_INT_VAL; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_rs0"; + + err_val = _taskfunc_sfp_setup_hard_rs0(task_p, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs0 fail!"; + goto err_private_taskfunc_sfp_setup_rs0_1; + } + old_val = err_val; + err_val = _taskfunc_sfp_setup_soft_rs(task_p, + input_val, + task_p->transvr_p->eeprom_map_p->addr_soft_rs0, + task_p->transvr_p->eeprom_map_p->page_soft_rs0, + task_p->transvr_p->eeprom_map_p->offset_soft_rs0, + bit_shift, + &(task_p->transvr_p->soft_rs0), + func_str); + if (err_val < 0) { + err_str = "Setup soft_rs0 fail!"; + goto err_private_taskfunc_sfp_setup_rs0_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_sfp_setup_rs0_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + _taskfunc_sfp_setup_hard_rs0(task_p, old_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_sfp_setup_rs1(struct transvr_worker_s *task_p, + int input_val) { + + int bit_shift = 3; + int old_val = DEBUG_TRANSVR_INT_VAL; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_rs1"; + + err_val = _taskfunc_sfp_setup_hard_rs1(task_p, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs1 fail!"; + goto err_private_taskfunc_sfp_setup_rs1_1; + } + old_val = err_val; + err_val = _taskfunc_sfp_setup_soft_rs(task_p, + input_val, + task_p->transvr_p->eeprom_map_p->addr_soft_rs1, + task_p->transvr_p->eeprom_map_p->page_soft_rs1, + task_p->transvr_p->eeprom_map_p->offset_soft_rs1, + bit_shift, + &(task_p->transvr_p->soft_rs1), + func_str); + if (err_val < 0) { + err_str = "Setup soft_rs1 fail!"; + goto err_private_taskfunc_sfp_setup_rs1_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_sfp_setup_rs1_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + _taskfunc_sfp_setup_hard_rs1(task_p, old_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +taskfunc_sfp_setup_SFF8431_case1(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Rx Rate_Select only) */ + int update_val = 1; + + return _taskfunc_sfp_setup_rs0(task_p, update_val); +} + + + +int +taskfunc_sfp_setup_SFF8431_case2(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Tx Rate_Select only) */ + int update_val = 1; + + return _taskfunc_sfp_setup_rs1(task_p, update_val); +} + + +int +taskfunc_sfp_setup_SFF8431_case3(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) */ + int update_rs0 = 1; + int update_rs1 = 1; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _taskfunc_sfp_setup_rs0(task_p, update_rs0); + if (err_code < 0) { + return err_code; + } + return _taskfunc_sfp_setup_rs1(task_p, update_rs1); +} + + +int +taskfunc_sfp_handle_1g_rj45(struct transvr_worker_s *task_p) { + + /* Not all of platform support 0x56 for transceiver + * external PHY, Support list as below: + * => 1. Magnolia-PVT (PS: EVT & DVT not ready) + */ + int ext_phy_addr = 0x56; + int ext_phy_page = -1; + int ext_phy_offs = 0x11; + int ext_phy_len = 1; + int lstate_mask = 0x04; /* 00000100 */ + int show_err = 0; + int fail_retry = 5; + int fail_delay = 1000; /* msec */ + int err_code = DEBUG_TRANSVR_INT_VAL; + uint8_t detect_val = DEBUG_TRANSVR_HEX_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + int *tmp_p = NULL; + char *func_name = "taskfunc_sfp_handle_1g_rj45"; + + if (task_p->transvr_p->state != STATE_TRANSVR_CONNECTED) { + return EVENT_TRANSVR_TASK_DONE; + } + if ( (task_p->transvr_p->info != TRANSVR_CLASS_BASE_T_1000) && + (task_p->transvr_p->info != TRANSVR_CLASS_BASE_T_1000_up) ) { + goto err_taskfunc_sfp_handle_1g_rj45_1; + } + err_code = _common_update_uint8_attr(task_p->transvr_p, + ext_phy_addr, + ext_phy_page, + ext_phy_offs, + ext_phy_len, + &detect_val, + func_name, + show_err); + if ( (err_code < 0) || + (detect_val == DEBUG_TRANSVR_HEX_VAL) ) { + snprintf(err_str, sizeof(err_str), "Detect external link status fail"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + if ((detect_val & lstate_mask) == lstate_mask) { + goto ok_taskfunc_sfp_handle_1g_rj45_link_up; + } + goto ok_taskfunc_sfp_handle_1g_rj45_link_down; + +ok_taskfunc_sfp_handle_1g_rj45_link_up: + /* Filter out noise */ + if (!(task_p->p_data)) { + tmp_p = kzalloc(sizeof(int), GFP_KERNEL); + if (!tmp_p) { + snprintf(err_str, sizeof(err_str), "kzalloc p_data fail"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + *tmp_p = TRANSVR_CLASS_BASE_T_1000_up; + task_p->p_data = tmp_p; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + } + if ((*(int *)(task_p->p_data)) != TRANSVR_CLASS_BASE_T_1000_up) { + kfree(task_p->p_data); + task_p->p_data = NULL; + snprintf(err_str, sizeof(err_str), "Internal error"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000_up; + kfree(task_p->p_data); + task_p->p_data = NULL; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + +ok_taskfunc_sfp_handle_1g_rj45_link_down: + if (task_p->p_data) { + kfree(task_p->p_data); + task_p->p_data = NULL; + } + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + +ok_taskfunc_sfp_handle_1g_rj45_done: + if (task_p->retry != VAL_TRANSVR_TASK_RETRY_FOREVER) { + transvr_task_set_retry(task_p, VAL_TRANSVR_TASK_RETRY_FOREVER); + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_handle_1g_rj45_1: + snprintf(err_str, sizeof(err_str), "Detect transceiver:%d not Base-T, remove task.", + task_p->transvr_p->info); + SWPS_INFO("%s: %s :%s\n", __func__, err_str, task_p->transvr_p->swp_name); + transvr_task_set_retry(task_p, 0); + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_handle_1g_rj45_2: + if (task_p->retry == VAL_TRANSVR_TASK_RETRY_FOREVER) { + transvr_task_set_retry(task_p, fail_retry); + } + if ((task_p->retry) == 0) { + /* Error case: + * => In this case, SWPS will stop external Link state monitor features + * and keeps transvr_p->info on TRANSVR_CLASS_BASE_T_1000_up. + * Upper layer will see it always Linkup that because of these type of + * transceiver has external phy, BCM chip see it as Loopback transceiver. + */ + SWPS_WARN("%s can not access external PHY of Base-T SFP transceiver\n", + task_p->transvr_p->swp_name); + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000_up; + return EVENT_TRANSVR_TASK_DONE; + } else { + transvr_task_set_delay(task_p, fail_delay); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_qsfp_setup_power_mod(struct transvr_obj_s *self, + int setup_val) { + + int curr_val = DEBUG_TRANSVR_INT_VAL; + int err_val = DEBUG_TRANSVR_INT_VAL; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + if (io_no_init) { + + SWPS_INFO("%s no_io_init\n",__func__); + return EVENT_TRANSVR_TASK_DONE; + } + + curr_val = self->ioexp_obj_p->get_lpmod(self->ioexp_obj_p, + self->ioexp_virt_offset); + if (curr_val < 0){ + err_msg = "Get current value fail!"; + goto err_private_taskfunc_qsfp_setup_power_mod_1; + } + if (curr_val == setup_val){ + return EVENT_TRANSVR_TASK_DONE; + } + err_val = self->ioexp_obj_p->set_lpmod(self->ioexp_obj_p, + self->ioexp_virt_offset, + setup_val); + if (err_val < 0){ + err_msg = "Setup power mode fail!"; + goto err_private_taskfunc_qsfp_setup_power_mod_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_qsfp_setup_power_mod_1: + SWPS_INFO("%s: %s :%d :%d :%d\n", + __func__, err_msg, err_val, curr_val, setup_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +taskfunc_qsfp_handle_tx_disable(struct transvr_worker_s *task_p) { + + int i = 0; + int retry = 5; + int delay_ms = 100; + + if (task_p->transvr_p->auto_tx_disable == VAL_TRANSVR_FUNCTION_DISABLE) { + return EVENT_TRANSVR_TASK_DONE; + } + if (!_qsfp_is_implement_tx_disable(task_p->transvr_p)) { + return EVENT_TRANSVR_TASK_DONE; + } + for (i=0; itransvr_p, + task_p->transvr_p->auto_tx_disable) + == EVENT_TRANSVR_TASK_DONE) { + goto ok_taskfunc_qsfp_handle_tx_disable; + } + mdelay(delay_ms); + } + SWPS_INFO("%s auto setup tx_disable:0x%02x fail.\n", + task_p->transvr_p->swp_name, + task_p->transvr_p->auto_tx_disable); + return EVENT_TRANSVR_INIT_FAIL; + +ok_taskfunc_qsfp_handle_tx_disable: + SWPS_INFO("%s auto setup tx_disable:0x%02x ok.\n", + task_p->transvr_p->swp_name, + task_p->transvr_p->auto_tx_disable); + return EVENT_TRANSVR_TASK_DONE; +} + + +int +taskfunc_qsfp_set_hpmod(struct transvr_worker_s *task_p) { + + int err = DEBUG_TRANSVR_INT_VAL; + int HIGH_POWER_MODE = 0; + + /* Handle power mode */ + err = _taskfunc_qsfp_setup_power_mod(task_p->transvr_p, + HIGH_POWER_MODE); + if (err < 0) { + SWPS_INFO("%s: setup hpmod fail :%d :%s\n", + __func__, err, task_p->transvr_p->swp_name); + return err; + } + /* Handle auto tx_disable + * [Note] + * => Because there are some transceiver have timing issues or + * setup sequence issues, therefore we handle auto tx_disable + * after handle power mode. + */ + mdelay(100); + return taskfunc_qsfp_handle_tx_disable(task_p); +} + + +int +taskfunc_qsfp_set_lpmod(struct transvr_worker_s *task_p) { + + int LOW_POWER_MODE = 1; + return _taskfunc_qsfp_setup_power_mod(task_p->transvr_p, + LOW_POWER_MODE); +} + + +static int +initfunc_sfp_handle_multi_rate_mode(struct transvr_obj_s *self) { + + int task_retry = 3; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "sfp_handle_multi_rate_mode"; + struct transvr_worker_s *task_p = NULL; + + switch (self->rate_id) { + case 0x00: /* Unspecified */ + case 0x03: /* Unspecified */ + case 0x05: /* Unspecified */ + case 0x07: /* Unspecified */ + case 0x09: /* Unspecified */ + case 0x0B: /* Unspecified */ + case 0x0D: /* Unspecified */ + case 0x0F: /* Unspecified */ + goto sfp_handle_multi_rate_mode_4_unspecified; + + case 0x02: /* SFF-8431 (8/4/2G Rx Rate_Select only) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case1, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x04: /* SFF-8431 (8/4/2G Tx Rate_Select only) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case2, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x06: /* SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case3, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x01: /* SFF-8079 (4/2/1G Rate_Select & AS0/AS1) */ + err_str = "SFF-8079 (4/2/1G Rate_Select & AS0/AS1)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x08: /* FC-PI-5 (16/8/4G Rx Rate_select only) + * High=16G only, Low=8G/4G + */ + err_str = "FC-PI-5 (16/8/4G Rx Rate_select only)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0A: /* FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select) + * High=16G only, Low=8G/4G + */ + err_str = "FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0C: /* FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select) + * High=32G only, Low = 16G/8G + */ + err_str = "FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0E: /* 10/8G Rx and Tx Rate_Select controlling the operation or + * locking modes of the internal signal conditioner, retimer + * or CDR, according to the logic table defined in Table 10-2, + * High Bit Rate (10G) =9.95-11.3 Gb/s; Low Bit Rate (8G) = + * 8.5 Gb/s. In this mode, the default value of bit 110.3 (Soft + * Rate Select RS(0), Table 9-11) and of bit 118.3 (Soft Rate + * Select RS(1), Table 10-1) is 1. + */ + err_str = "cable type: 0x0E"; + goto sfp_handle_multi_rate_mode_4_not_support; + + default: + err_str = "cable type: UNKNOW"; + goto sfp_handle_multi_rate_mode_4_not_support; + } + +sfp_handle_multi_rate_mode_4_sff8431: + if (!task_p) { + err_str = "Create task fail!"; + goto sfp_handle_multi_rate_mode_4_fail_1; + } + transvr_task_set_retry(task_p, task_retry); + return EVENT_TRANSVR_TASK_WAIT; + +sfp_handle_multi_rate_mode_4_unspecified: + return EVENT_TRANSVR_TASK_DONE; + +sfp_handle_multi_rate_mode_4_not_support: + SWPS_INFO("%s: Does not support %s :%s :0x%02x\n", + func_str, err_str, self->swp_name, self->rate_id); + return EVENT_TRANSVR_TASK_DONE; + +sfp_handle_multi_rate_mode_4_fail_1: + SWPS_INFO("%s: %s :%s :0x%02x, :%d\n", + func_str, err_str, self->swp_name, self->rate_id, err_code); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +initfunc_sfp_handle_1g_rj45(struct transvr_obj_s *self) { + + struct transvr_worker_s *task_p = NULL; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + char *func_str = "initfunc_sfp_handle_1g_rj45"; + + + if (self->info == TRANSVR_CLASS_BASE_T_1000) { + task_p = transvr_task_creat(self, + taskfunc_sfp_handle_1g_rj45, + taskfunc_post_do_nothing, + func_str); + if (!task_p) { + snprintf(err_str, sizeof(err_str), "Create task fail"); + goto err_initfunc_sfp_handle_1g_rj45; + } + transvr_task_set_retry(task_p, VAL_TRANSVR_TASK_RETRY_FOREVER); + } + return EVENT_TRANSVR_TASK_DONE; + +err_initfunc_sfp_handle_1g_rj45: + SWPS_INFO("%s: %s :%s :%d\n", + __func__, err_str, self->swp_name, detect_cls); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +initfunc_qsfp_handle_power_mode(struct transvr_obj_s *self) { + + int err_code = EVENT_TRANSVR_EXCEP_INIT; + int power_class = DEBUG_TRANSVR_INT_VAL; + int hpmod_retry = 3; + int lpower_config = 1; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + unsigned long hpmod_delay = 500; /* msec */ + struct transvr_worker_s *task_p = NULL; + + /* Handle power mode for IOEXP */ + power_class = __qsfp_get_power_cls(self, 0); + switch (power_class) { + case 1: /* Case: Low power mode (Class = 1) */ + err_code = _taskfunc_qsfp_setup_power_mod(self, lpower_config); + if (err_code < 0){ + snprintf(err_msg, sizeof(err_msg), "Setup lpmod fail :%d", err_code); + goto err_initfunc_qsfp_handle_power_mode; + } + return EVENT_TRANSVR_TASK_DONE; + + case 2: /* Case: High power mode (Class > 1) */ + case 3: + case 4: + case 5: + case 6: + case 7: + task_p = transvr_task_creat(self, + taskfunc_qsfp_set_hpmod, + taskfunc_post_handle_task_state, + "transvr_init_qsfp"); + if (!task_p) { + snprintf(err_msg, sizeof(err_msg), "Setup lpmod fail :%d", err_code); + goto err_initfunc_qsfp_handle_power_mode; + } + transvr_task_set_retry(task_p, hpmod_retry); + transvr_task_set_delay(task_p, hpmod_delay); + return EVENT_TRANSVR_TASK_WAIT; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Exception case"); + goto err_initfunc_qsfp_handle_power_mode; + +err_initfunc_qsfp_handle_power_mode: + SWPS_INFO("%s: %s :%s \n", __func__, err_msg, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +initfunc_qsfp28_handle_cdr(struct transvr_obj_s *self) { + + uint8_t DEFAULT_VAL_CDR = 0xff; + int CDR_FUNC_EXISTED = 0x3; + int show_err = 1; + int err_val = EVENT_TRANSVR_TASK_FAIL; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + char *func_str = "initfunc_qsfp28_handle_cdr"; + + err_val = __qsfp_get_cdr_present(self, 0); + if ( (err_val < 0) || + (err_val == DEBUG_TRANSVR_HEX_VAL) ) { + err_msg = "detect cdr_present fail!"; + goto err_taskfunc_qsfp_handle_cdr_1; + } + if (err_val == CDR_FUNC_EXISTED) { + err_val = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->offset_cdr, + DEFAULT_VAL_CDR, + &(self->cdr), + func_str, + show_err); + if (err_val < 0) { + err_msg = "set CDR fail!"; + goto err_taskfunc_qsfp_handle_cdr_1; + } + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_qsfp_handle_cdr_1: + SWPS_INFO("%s: %s :%d :%s\n", + func_str, err_msg, err_val, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + +/* ========== Object functions for Final State Machine ========== + */ +int +is_plugged(struct transvr_obj_s *self){ + + int limit = 63; + int present = DEBUG_TRANSVR_INT_VAL; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + struct ioexp_obj_s *ioexp_p = self->ioexp_obj_p; + + if (!ioexp_p) { + snprintf(emsg, limit, "ioexp_p is null!"); + goto err_is_plugged_1; + } + present = ioexp_p->get_present(ioexp_p, self->ioexp_virt_offset); + switch (present){ + case 0: + return 1; + case 1: + return 0; + case ERR_IOEXP_UNINIT: + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + default: + if (ioexp_p->state == STATE_IOEXP_INIT){ + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + } + break; + } + SWPS_INFO("%s: Exception case! :%d :%d\n", + __func__, present, ioexp_p->state); + return 0; + +err_is_plugged_1: + SWPS_DEBUG("%s: %s\n", __func__, emsg); + return 0; +} + + +static int +detect_transvr_type(struct transvr_obj_s* self){ + + int type = TRANSVR_TYPE_ERROR; + + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + type = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + + /* Case: 1. Wait transceiver I2C module. + * 2. Transceiver I2C module failure. + * Note: 1. SFF allow maximum transceiver initial time is 2 second. So, there + * are exist some case that we need to wait transceiver. + * For these case, we keeps status on "TRANSVR_TYPE_UNPLUGGED", than + * state machine will keep trace with it. + * 2. There exist some I2C failure case we need to handle. Such as user + * insert the failure transceiver, or any reason cause it abnormal. + */ + if (type < 0){ + switch (type) { + case -EIO: + SWPS_DEBUG("%s: %s smbus return:-5 (I/O error)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + case -ENXIO: + SWPS_DEBUG("%s: %s smbus return:-6 (No such device or address)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + default: + break; + } + SWPS_INFO("%s: %s unexpected smbus return:%d \n", + __func__, self->swp_name, type); + return TRANSVR_TYPE_ERROR; + } + /* Identify valid transceiver type */ + switch (type){ + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + break; + case TRANSVR_TYPE_UNKNOW_1: + case TRANSVR_TYPE_UNKNOW_2: + type = TRANSVR_TYPE_UNKNOW_2; + break; + default: + SWPS_DEBUG("%s: unknow type:0x%02x \n", __func__, type); + type = TRANSVR_TYPE_ERROR; + break; + } + return type; +} + + +static int +detect_transvr_state(struct transvr_obj_s *self, + int result[2]){ + /* [return] [result-0] [result-1] + * 0 STATE_TRANSVR_CONNECTED TRANSVR_TYPE_FAKE + * 0 STATE_TRANSVR_DISCONNECTED TRANSVR_TYPE_UNPLUGGED + * 0 STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * 0 STATE_TRANSVR_INIT / + * 0 STATE_TRANSVR_SWAPPED + * 0 STATE_TRANSVR_CONNECTED + * ERR_TRNASVR_BE_ISOLATED STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_I2C_CRASH STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_UNEXCPT STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_UNKNOW_1/2 + */ + result[0] = STATE_TRANSVR_UNEXCEPTED; /* For return state */ + result[1] = TRANSVR_TYPE_ERROR; /* For return type */ + + /* Case1: Fake type */ + if (self->type == TRANSVR_TYPE_FAKE){ + result[0] = STATE_TRANSVR_CONNECTED; + result[1] = TRANSVR_TYPE_FAKE; + return 0; + } + /* Case2: Transceiver unplugged */ + if (!is_plugged(self)){ + result[0] = STATE_TRANSVR_DISCONNECTED; + result[1] = TRANSVR_TYPE_UNPLUGGED; + return 0; + } + /* Case3: Transceiver be isolated */ + if (self->state == STATE_TRANSVR_ISOLATED){ + result[0] = STATE_TRANSVR_ISOLATED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case4: Transceiver plugged */ + result[1] = detect_transvr_type(self); + /* Case4.1: I2C topology crash + * Note : There are some I2C issues cause by transceiver/cables. + * We need to check topology status when user insert it. + * But in this step, we can't not ensure this is the issues + * port. So, it return the ERR_TRANSVR_I2C_CRASH, then upper + * layer will diagnostic I2C topology. + */ + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: %s detect I2C crash :%d\n", + __func__, self->swp_name, self->state); + result[0] = STATE_TRANSVR_UNEXCEPTED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_I2C_CRASH; + } + /* Case4.2: System initial not ready, + * Note : Sometime i2c channel or transceiver EEPROM will delay that will + * cause system in inconsistent state between EEPROM and IOEXP. + * In this case, SWP transceiver object keep state at LINK_DOWN + * to wait system ready. + * By the way, State Machine will handle these case. + */ + if (result[1] == TRANSVR_TYPE_UNPLUGGED){ + result[0] = STATE_TRANSVR_DISCONNECTED; + return 0; + } + /* Case4.3: Error transceiver type */ + if (result[1] == TRANSVR_TYPE_ERROR){ + result[0] = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s detect error type\n", __func__, self->swp_name); + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard!"); + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case3.3: Unknow transceiver type */ + if ((result[1] == TRANSVR_TYPE_UNKNOW_1) || + (result[1] == TRANSVR_TYPE_UNKNOW_2) ){ + result[0] = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + /* Case3.4: During initial process */ + if (self->state == STATE_TRANSVR_INIT){ + result[0] = STATE_TRANSVR_INIT; + return 0; + } + /* Case3.5: Transceiver be swapped */ + if (self->type != result[1]){ + result[0] = STATE_TRANSVR_SWAPPED; + return 0; + } + /* Case3.6: Link up state */ + result[0] = STATE_TRANSVR_CONNECTED; + return 0; +} + + +int +_sfp_detect_class_by_extend_comp(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int detect_val = _sfp_get_comp_extended(self); + + switch(detect_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + + case 0x01: /* 100G AOC (Active Optical Cable) or 25GAUI C2M */ + case 0x18: /* 100G AOC or 25GAUI C2M AOC. */ + return TRANSVR_CLASS_OPTICAL_25G_AOC; + + case 0x02: /* 100GBASE-SR4 or 25GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_25G_SR; + + case 0x03: /* 100GBASE-LR4 or 25GBASE-LR */ + return TRANSVR_CLASS_OPTICAL_25G_LR; + + case 0x04: /* 100GBASE-ER4 or 25GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_25G_ER; + + case 0x08: /* 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. */ + case 0x0b: /* 100GBASE-CR4 or 25GBASE-CR CA-L */ + case 0x0c: /* 25GBASE-CR CA-S */ + case 0x0d: /* 25GBASE-CR CA-N */ + case 0x19: /* 100G ACC or 25GAUI C2M ACC. */ + return TRANSVR_CLASS_COPPER_L1_25G; + + default: + break; + } + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_class_by_10_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _sfp_get_comp_10g_eth_comp(self); + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 10G Optical (x1) */ + if ((detect_val & 0x10) == 0x10) { /* 00010000 : 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + } + if ( ((detect_val & 0x20) == 0x20) || /* 00100000 : 10GBASE-LR */ + ((detect_val & 0x40) == 0x40) ){ /* 01000000 : 10GBASE-LRM */ + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + } + if ((detect_val & 0x80) == 0x80) { /* 10000000 : 10GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_10G_S_ER; + } + /* Case: ERROR */ + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_if_sp_by_br(struct transvr_obj_s* self) { + + int lower_bound_1g = 0x0b; + int upper_bound_1g = 0x1A; + int lower_bound_10g = 0x60; + int upper_bound_10g = 0x75; + int lower_bound_25g = 0xf0; + int upper_bound_25g = 0xff; + int notmal_br = DEBUG_TRANSVR_INT_VAL; + + notmal_br = (int)(self->br); /* updated by update_all() */ + /* Check 25G */ + if ((notmal_br >= lower_bound_25g) && + (notmal_br <= upper_bound_25g) ) { + return TRANSVR_CLASS_25G; + } + /* Check 10G */ + if ((notmal_br >= lower_bound_10g) && + (notmal_br <= upper_bound_10g) ) { + return TRANSVR_CLASS_10G; + } + /* Check 1G */ + if ((notmal_br >= lower_bound_1g) && + (notmal_br <= upper_bound_1g) ) { + return TRANSVR_CLASS_1G; + } + return TRANSVR_CLASS_UNSPECIFIED; +} + + +int +_sfp_detect_class_by_1g_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + int speed_br = DEBUG_TRANSVR_INT_VAL; + int speed_tmp = DEBUG_TRANSVR_INT_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + + speed_br = _sfp_detect_if_sp_by_br(self); + detect_val = _sfp_get_comp_1g_eth_comp(self); + + if (detect_val < 0) { + snprintf(err_str, sizeof(err_str), "Detect abnormal value:%d", detect_val); + goto err_p_sfp_detect_class_by_1g_ethernet; + } + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 1G (x1) */ + if ((detect_val & 0x01) == 0x01) { /* 00000001 : 1000BASE-SX */ + speed_tmp = TRANSVR_CLASS_OPTICAL_1G_SX; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + if ((detect_val & 0x02) == 0x02) { /* 00000010 : 1000BASE-LX *3 */ + speed_tmp = TRANSVR_CLASS_OPTICAL_1G_LX; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + if ((detect_val & 0x04) == 0x04) { /* 00000100 : 1000BASE-CX */ + speed_tmp = TRANSVR_CLASS_COPPER_L1_1G; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + /* Case: 1000 Base-T (x1) */ + if ((detect_val & 0x08) == 0x08) { /* 00001000 : 1000BASE-T */ + return TRANSVR_CLASS_BASE_T_1000; + } + /* Case: 100 Base */ + if ( ((detect_val & 0x10) == 0x10) || /* 00010000 : 100BASE-LX/LX10 */ + ((detect_val & 0x20) == 0x20) || /* 00100000 : 100BASE-FX */ + ((detect_val & 0x40) == 0x40) || /* 01000000 : BASE-BX10 *3 */ + ((detect_val & 0x80) == 0x80) ){ /* 10000000 : BASE-PX *3 */ + return TRANSVR_CLASS_OPTICAL_100; + } + /* Case: ERROR */ + snprintf(err_str, sizeof(err_str), "Case:ERROR, value:%d", detect_val); + goto err_p_sfp_detect_class_by_1g_ethernet; + +ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g: + switch (speed_br) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_1G: + return speed_tmp; + case TRANSVR_CLASS_10G: + goto ok_sfp_detect_class_by_1g_ethernet_4_transfer_10G; + } + +ok_sfp_detect_class_by_1g_ethernet_4_transfer_10G: + switch (speed_tmp) { + case TRANSVR_CLASS_OPTICAL_1G_SX: + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + case TRANSVR_CLASS_OPTICAL_1G_LX: + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + case TRANSVR_CLASS_COPPER_L1_1G: + return TRANSVR_CLASS_COPPER_L1_10G; + default: + break; + } + snprintf(err_str, sizeof(err_str), "transfer_1to10 fail, speed:%d", speed_tmp); + goto err_p_sfp_detect_class_by_1g_ethernet; + +err_p_sfp_detect_class_by_1g_ethernet: + SWPS_INFO("%s: %s :%s", __func__, err_str, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_class_by_feature(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int is_active = 0; + int conn_val = DEBUG_TRANSVR_INT_VAL; + int check_val = DEBUG_TRANSVR_INT_VAL; + int wave_len = DEBUG_TRANSVR_INT_VAL; + int speed_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + speed_val = _sfp_detect_if_sp_by_br(self); + conn_val = _sfp_get_connector_type(self); + + switch(conn_val) { + case 0x00: /* Unspecified */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + case 0x07: /* LC (Lucent Connector) */ + case 0x0b: /* Optical Pigtail */ + case 0x0c: /* MPO 1x12 */ + case 0x0d: /* MPO 2x16 */ + /* + * ToDo: Need verify Optical Pigtail + */ + goto ok_sfp_detect_class_by_feature_4_optiocal; + case 0x21: /* Copper pigtail */ + /* + * ToDo: Need check ACC use case + */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + case 0x23: /* No separable connector */ + /* + * ToDo: Standard not clear, not all transceiver vendor + * have the same defined + */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + default: + break; + } + goto ok_sfp_detect_class_by_feature_4_unknow; + +ok_sfp_detect_class_by_feature_4_check_active_passive: + check_val = _sfp_get_cable_tech(self); + switch(check_val) { + case 0x00: /* Unspecified */ + goto ok_sfp_detect_class_by_feature_4_unknow; + case 0x04: /* Passive */ + goto ok_sfp_detect_class_by_feature_4_copper; + case 0x08: /* Active */ + is_active = 1; + goto ok_sfp_detect_class_by_feature_4_aoc; + default: + snprintf(err_msg, sizeof(err_msg), + "_sfp_get_cable_tech return Non define value:%d", + check_val); + break; + } + goto err_sfp_detect_class_by_feature_1; + +ok_sfp_detect_class_by_feature_4_optiocal: + wave_len = _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1]); + switch(speed_val) { + case TRANSVR_CLASS_25G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_25G_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_25G_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_25G_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_25G; + + case TRANSVR_CLASS_10G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_10G_S_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_10G; + + case TRANSVR_CLASS_1G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_1G_SX; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_1G_LX; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_1G_EX; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_1G; + + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_sfp_detect_class_by_feature_4_aoc: + switch(speed_val) { + case TRANSVR_CLASS_25G: + return TRANSVR_CLASS_OPTICAL_25G_AOC; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_OPTICAL_10G_S_AOC; + case TRANSVR_CLASS_1G: + return TRANSVR_CLASS_OPTICAL_1G_AOC; + default: + break; + } + goto ok_sfp_detect_class_by_feature_4_unknow; + +ok_sfp_detect_class_by_feature_4_copper: + switch(speed_val) { + case TRANSVR_CLASS_25G: + return TRANSVR_CLASS_COPPER_L1_25G; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_COPPER_L1_10G; + case TRANSVR_CLASS_1G: + return TRANSVR_CLASS_COPPER_L1_1G; + default: + return TRANSVR_CLASS_COPPER; + } + +ok_sfp_detect_class_by_feature_4_unknow: + return TRANSVR_CLASS_UNSPECIFIED; + +err_sfp_detect_class_by_feature_1: + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +sft_detect_transvr_class(struct transvr_obj_s* self) { + + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check Extended Compliance */ + detect_val = _sfp_detect_class_by_extend_comp(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_COPPER_L1_25G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined extend_comp:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check 10G Compliance */ + detect_val = _sfp_detect_class_by_10_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 10G_eth:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check 1G Compliance */ + detect_val = _sfp_detect_class_by_1g_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_COPPER_L1_1G: + case TRANSVR_CLASS_BASE_T_1000: + case TRANSVR_CLASS_OPTICAL_100: + /* + * ToDo: Need Check 0.1G + */ + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_COPPER_L1_10G: + /* Transfer speed case + * => Example: Raycom 10G DAC + */ + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 1G_eth:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check by connector, br, wavelength */ + detect_val = _sfp_detect_class_by_feature(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL: + case TRANSVR_CLASS_OPTICAL_1G: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_25G: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_COPPER: + case TRANSVR_CLASS_COPPER_L1_1G: + case TRANSVR_CLASS_COPPER_L1_10G: + case TRANSVR_CLASS_COPPER_L1_25G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined get_connector:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sft_detect_transceiver_class_1; + +err_sft_detect_transceiver_class_1: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_set_magnolia_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch(transvr_cls) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_sfp_set_magnolia_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_set_magnolia_if_type_1; + +err_sfp_set_magnolia_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_set_redwood_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch(transvr_cls) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SR); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_KR); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_sfp_set_redwood_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_set_redwood_if_type_1; + +err_sfp_set_redwood_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_set_lavender_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + /* (TBD) + * Due to 'LAV' looks like doesn't have interface type. + * We bypass it currently. + */ + int lmax = 8; + return snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); +} + + +int +_sfp_detect_if_type(struct transvr_obj_s* self, + char *result){ + + int lmax = 8; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + + detect_cls = sft_detect_transvr_class(self); + switch (self->chipset_type) { + case CHIP_TYPE_MAGNOLIA: + return _sfp_set_magnolia_if_type(self, detect_cls, result); + + case CHIP_TYPE_MAPLE: + case CHIP_TYPE_REDWOOD: + return _sfp_set_redwood_if_type(self, detect_cls, result); + + case CHIP_TYPE_LAVENDER: + return _sfp_set_lavender_if_type(self, detect_cls, result); + + default: + SWPS_INFO("%s: non-defined chipset_type:%d :%s\n", + __func__, self->chipset_type, self->swp_name); + break; + } + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_if_type(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_sfp_detect_if_type(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_sfp_detect_if_speed(struct transvr_obj_s* self, + char *result){ + + int lmax = 16; + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + detect_val = sft_detect_transvr_class(self); + switch(detect_val) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_SP_100); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + detect_val); + goto err_sfp_detect_if_speed_1; + } + /* Check by BR */ + detect_val = _sfp_detect_if_sp_by_br(self); + switch (detect_val) { + case TRANSVR_CLASS_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + case TRANSVR_CLASS_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + case TRANSVR_CLASS_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + default: + break; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_detect_if_speed_1; + +err_sfp_detect_if_speed_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_if_speed(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_sfp_detect_if_speed(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_qsfp_detect_class_by_extend_comp(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _qsfp_get_comp_extended(self); + switch(detect_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + + case 0x01: /* 100G AOC (Active Optical Cable) or 25GAUI C2M */ + case 0x18: /* 100G AOC or 25GAUI C2M AOC. */ + return TRANSVR_CLASS_OPTICAL_100G_AOC; + + case 0x06: /* 100G CWDM4 */ + case 0x09: /* Obsolete (assigned before 100G CWDM4 MSA required FEC) */ + case 0x17: /* 100G CLR4 */ + case 0x1A: /* 100GE-DWDM2 */ + return TRANSVR_CLASS_OPTICAL_100G; + + case 0x02: /* 100GBASE-SR4 or 25GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_100G_SR4; + + case 0x03: /* 100GBASE-LR4 or 25GBASE-LR */ + return TRANSVR_CLASS_OPTICAL_100G_LR4; + + case 0x04: /* 100GBASE-ER4 or 25GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_100G_ER4; + + case 0x07: /* 100G PSM4 Parallel SMF */ + return TRANSVR_CLASS_OPTICAL_100G_PSM4; + + case 0x12: /* 40G PSM4 Parallel SMF */ + return TRANSVR_CLASS_OPTICAL_40G; + + case 0x11: /* 4 x 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_40G_SR4; + + case 0x10: /* 40GBASE-ER4 */ + return TRANSVR_CLASS_OPTICAL_40G_ER4; + + case 0x08: /* 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. */ + case 0x0b: /* 100GBASE-CR4 or 25GBASE-CR CA-L */ + case 0x19: /* 100G ACC or 25GAUI C2M ACC. */ + return TRANSVR_CLASS_COPPER_L4_100G; + + default: + break; + } + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_detect_class_by_10_40_100_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _qsfp_get_comp_10_40_100_ethernet(self); + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 40G Optical */ + if ((detect_val & 0x01) == 0x01) { /* 00000001 : 40G Active Cable (XLPPI) */ + return TRANSVR_CLASS_OPTICAL_40G_AOC; + } + if ((detect_val & 0x04) == 0x04) { /* 00000100 : 40GBASE-SR4 */ + return TRANSVR_CLASS_OPTICAL_40G_SR4; + } + if ( (detect_val & 0x02) == 0x02) { /* 00000010 : 40GBASE-LR4 */ + return TRANSVR_CLASS_OPTICAL_40G_LR4; + } + if ( (detect_val & 0x08) == 0x08) { /* 00001000 : 40GBASE-CR4 */ + return TRANSVR_CLASS_COPPER_L4_40G; + } + /* Case: 10G Optical */ + if ( (detect_val & 0x10) == 0x10) { /* 00010000 : 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_10G_Q_SR; + } + if ( ((detect_val & 0x20) == 0x20) || /* 00100000 : 10GBASE-LR */ + ((detect_val & 0x40) == 0x40) ){ /* 01000000 : 10GBASE-LRM */ + return TRANSVR_CLASS_OPTICAL_10G_Q_LR; + } + /* Case: Extend Compliance */ + if ( ((detect_val & 0x80) == 0x80) ){ /* 10000000 : Use Extend Compliance */ + return TRANSVR_CLASS_EXTEND_COMP; + } + /* Case: ERROR */ + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_detect_if_sp_by_br(struct transvr_obj_s* self) { + + int lower_bound_10g = 0x10; + int upper_bound_10g = 0x25; + int lower_bound_40g = 0x60; + int upper_bound_40g = 0x75; + int lower_bound_100g = 0x60; + int upper_bound_100g = 0x75; + int used_extend_br = 0xff; + int notmal_br = DEBUG_TRANSVR_INT_VAL; + int extend_br = DEBUG_TRANSVR_INT_VAL; + + notmal_br = (int)(self->br); /* updated by update_all() */ + /* Check 40G */ + if ((notmal_br >= lower_bound_40g) && + (notmal_br <= upper_bound_40g) ) { + return TRANSVR_CLASS_40G; + } + /* Check 100G */ + if (notmal_br == used_extend_br) { + extend_br = (int)(self->extbr); /* updated by update_all() */ + if ((extend_br >= lower_bound_100g) && + (extend_br <= upper_bound_100g) ) { + return TRANSVR_CLASS_100G; + } + } + /* Check 10G */ + if ((notmal_br >= lower_bound_10g) && + (notmal_br <= upper_bound_10g) ) { + return TRANSVR_CLASS_10G; + } + return TRANSVR_CLASS_UNSPECIFIED; +} + + +int +_qsfp_detect_class_by_feature(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int conn_val = DEBUG_TRANSVR_INT_VAL; + int wave_len = DEBUG_TRANSVR_INT_VAL; + int speed_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + speed_val = _qsfp_detect_if_sp_by_br(self); + conn_val = _qsfp_get_connector_type(self); + + switch(conn_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + case 0x07: /* LC (Lucent Connector) */ + case 0x0b: /* Optical Pigtail */ + case 0x0c: /* MPO 1x12 (Multifiber Parallel Optic) */ + case 0x0d: /* MPO 2x16 */ + goto ok_qsfp_detect_class_by_feature_4_optiocal; + case 0x21: /* Copper pigtail */ + goto ok_qsfp_detect_class_by_feature_4_copper; + case 0x23: /* No separable connector */ + if ((_qsfp_get_comp_fc_link_length(self) > 0) || + (_qsfp_get_comp_fc_trans_tech(self) > 0) || + (_qsfp_get_comp_fc_trans_media(self) > 0) || + (_qsfp_get_comp_fc_speed(self) > 0) ) { + goto ok_qsfp_detect_class_by_feature_4_aoc; + } + goto ok_qsfp_detect_class_by_feature_4_copper; + default: + snprintf(err_msg, sizeof(err_msg), + "_qsfp_get_connector_type return Non define value:%d", + conn_val); + goto err_qsfp_detect_class_by_feature_1; + } + return TRANSVR_CLASS_UNSPECIFIED; + +ok_qsfp_detect_class_by_feature_4_optiocal: + wave_len = _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1]); + switch(speed_val) { + case TRANSVR_CLASS_100G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_100G_SR4; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_100G_LR4; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_100G_ER4; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_100G; + + case TRANSVR_CLASS_40G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_40G_SR4; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_40G_LR4; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_40G_ER4; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_40G; + + case TRANSVR_CLASS_10G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_10G_Q_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_10G_Q_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_10G_Q_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_10G; + + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_qsfp_detect_class_by_feature_4_aoc: + switch(speed_val) { + case TRANSVR_CLASS_100G: + return TRANSVR_CLASS_OPTICAL_100G_AOC; + case TRANSVR_CLASS_40G: + return TRANSVR_CLASS_OPTICAL_40G_AOC; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_OPTICAL_10G_Q_AOC; + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_qsfp_detect_class_by_feature_4_copper: + switch(speed_val) { + case TRANSVR_CLASS_100G: + return TRANSVR_CLASS_COPPER_L4_100G; + case TRANSVR_CLASS_40G: + return TRANSVR_CLASS_COPPER_L4_40G; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_COPPER_L4_10G; + default: + return TRANSVR_CLASS_COPPER; + } + +err_qsfp_detect_class_by_feature_1: + SWPS_INFO("%s: %s\n :%s", + __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +qsft_detect_transvr_class(struct transvr_obj_s* self) { + + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check Extended Compliance */ + detect_val = _qsfp_detect_class_by_extend_comp(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + case TRANSVR_CLASS_COPPER_L4_100G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined extend_comp:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Check 10/40G/100G Ethernet Compliance */ + detect_val = _qsfp_detect_class_by_10_40_100_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_COPPER_L4_40G: + return detect_val; + case TRANSVR_CLASS_EXTEND_COMP: + /* Format incorrect case (We already checked the Extend + * Compliance is 0 + */ + snprintf(err_msg, sizeof(err_msg), + "Transceiver format incorrect"); + goto err_qsft_detect_transvr_class_1; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 10/40/100:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Check by Connector type, BR and wavelength */ + detect_val = _qsfp_detect_class_by_feature(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL: + case TRANSVR_CLASS_COPPER_L4_100G: + case TRANSVR_CLASS_COPPER_L4_40G: + case TRANSVR_CLASS_COPPER_L4_10G: + case TRANSVR_CLASS_COPPER: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined connector:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), + "Can not identify!"); + goto err_qsft_detect_transvr_class_1; + +err_qsft_detect_transvr_class_1: + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_set_magnolia_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch (transvr_cls) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: LR4 or LR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: /* Need Check: ER4 or ER */ + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* Copper */ + case TRANSVR_CLASS_COPPER: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_qsfp_set_magnolia_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_set_magnolia_if_type_1; + +err_qsfp_set_magnolia_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_set_redwood_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch (transvr_cls) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* Copper */ + case TRANSVR_CLASS_COPPER: + return snprintf(result, lmax, TRANSVR_IF_KR4); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_qsfp_set_magnolia_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_set_magnolia_if_type_1; + +err_qsfp_set_magnolia_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_set_lavender_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + /* (TBD) + * Due to 'LAV' looks like doesn't have interface type. + * We bypass it currently. + */ + int lmax = 8; + return snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); +} + + +int +_qsfp_detect_if_type(struct transvr_obj_s* self, + char *result){ + + int lmax = 8; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + + detect_cls = qsft_detect_transvr_class(self); + switch (self->chipset_type) { + case CHIP_TYPE_MAGNOLIA: + return _qsfp_set_magnolia_if_type(self, detect_cls, result); + + case CHIP_TYPE_MAPLE: + case CHIP_TYPE_REDWOOD: + return _qsfp_set_redwood_if_type(self, detect_cls, result); + + case CHIP_TYPE_LAVENDER: + return _qsfp_set_lavender_if_type(self, detect_cls, result); + + default: + SWPS_INFO("%s: non-defined chipset_type:%d :%s\n", + __func__, self->chipset_type, self->swp_name); + break; + } + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_if_type(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 8; + char tmp_result[8] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_qsfp_detect_if_type(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_qsfp_detect_if_speed(struct transvr_obj_s* self, + char *result){ + int lmax = 16; + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + detect_val = qsft_detect_transvr_class(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 10G Copper */ + case TRANSVR_CLASS_COPPER_L4_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + break; + /* Copper */ + case TRANSVR_CLASS_COPPER: + break; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined class case:%d", + detect_val); + goto err_qsfp_detect_if_speed_1; + } + /* Check br and extbr */ + detect_val = _qsfp_detect_if_sp_by_br(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + case TRANSVR_CLASS_40G: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + case TRANSVR_CLASS_100G: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined BR case:%d", + detect_val); + goto err_qsfp_detect_if_speed_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_detect_if_speed_1; + +err_qsfp_detect_if_speed_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_if_speed(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_qsfp_detect_if_speed(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_common_set_lane_map_str(struct transvr_obj_s* self, + char *result) { + int i = 0; + int tmp_val = 0; + char tmp_str[LEN_TRANSVR_L_STR] = DEBUG_TRANSVR_STR_VAL; + char err_msg[LEN_TRANSVR_L_STR] = DEBUG_TRANSVR_STR_VAL; + + memset(result, 0, LEN_TRANSVR_L_STR); + snprintf(result, LEN_TRANSVR_L_STR, "%s=", TRANSVR_UEVENT_KEY_LANE); + + for (i=0; ilane_id); i++) { + tmp_val = self->lane_id[i]; + if (tmp_val < 1) { + break; + } + if (tmp_val > 256) { + snprintf(err_msg, sizeof(err_msg), + "detect abnormal value:%d", tmp_val); + goto err_common_set_lane_map_str_1; + } + memset(tmp_str, 0, sizeof(tmp_str)); + if (i == 0) { + snprintf(tmp_str, LEN_TRANSVR_L_STR, "%d", tmp_val); + } else { + snprintf(tmp_str, LEN_TRANSVR_L_STR, ",%d", tmp_val); + } + strncat(result, tmp_str, LEN_TRANSVR_L_STR); + } + if (i == 0) { + goto err_common_set_lane_map_str_2; + } + return 0; + +err_common_set_lane_map_str_1: + SWPS_INFO("%s: %s", __func__, err_msg); +err_common_set_lane_map_str_2: + snprintf(result, LEN_TRANSVR_L_STR, "%s=%s", TRANSVR_UEVENT_KEY_LANE, TRANSVR_UEVENT_UNKNOW); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_common_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action, + int (*detect_if_type)(struct transvr_obj_s *self, char *result), + int (*detect_if_speed)(struct transvr_obj_s *self, char *result), + int send_anyway) { + + char *uevent_envp[4]; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + char tmp_str[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_1[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_2[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_3[64] = DEBUG_TRANSVR_STR_VAL; + + if (TRANSVR_UEVENT_ENABLE != 1) { + return ERR_TRANSVR_NOTSUPPORT; + } + if (_common_get_if_lane(self, tmp_str) < 0) { + snprintf(tmp_str_3, sizeof(tmp_str_3), + "%s=%s", TRANSVR_UEVENT_KEY_LANE, TRANSVR_UEVENT_UNKNOW); + } else { + snprintf(tmp_str_3, sizeof(tmp_str_3), + "%s=%s", TRANSVR_UEVENT_KEY_LANE, tmp_str); + } + switch (u_action) { + case KOBJ_ADD: + /* Detect type */ + if (detect_if_type(self, tmp_str) < 0) { + snprintf(err_msg, sizeof(err_msg), "%s", "Detect interface type fail!"); + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, TRANSVR_UEVENT_UNKNOW); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[0] = tmp_str_1; + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_fail; + } + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, tmp_str); + uevent_envp[0] = tmp_str_1; + /* Detect speed */ + if (detect_if_speed(self, tmp_str) < 0) { + snprintf(err_msg, sizeof(err_msg), "%s", "Detect interface speed fail!"); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_fail; + } + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, tmp_str); + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_send; + + case KOBJ_REMOVE: + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, TRANSVR_UEVENT_UNKNOW); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[0] = tmp_str_1; + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_send; + + default: + snprintf(err_msg, sizeof(err_msg), "kobject_action:%d not support", u_action); + goto private_common_send_uevent_4_fail; + } + snprintf(err_msg, sizeof(err_msg), "%s", "Exception case"); + goto private_common_send_uevent_4_fail; + +private_common_send_uevent_4_fail: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + if (send_anyway) { + goto private_common_send_uevent_4_send; + } + return ERR_TRANSVR_UEVENT_FAIL; + +private_common_send_uevent_4_send: + return kobject_uevent_env(&(self->transvr_dev_p->kobj), + u_action, + uevent_envp); +} + +int +sfp_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + int send_anyway = 1; + return _common_send_uevent(self, + u_action, + &_sfp_detect_if_type, + &_sfp_detect_if_speed, + send_anyway); +} + + +int +qsfp_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + int send_anyway = 1; + return _common_send_uevent(self, + u_action, + &_qsfp_detect_if_type, + &_qsfp_detect_if_speed, + send_anyway); +} + + +int +fake_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + return EVENT_TRANSVR_TASK_DONE; +} + + +int +common_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + + int err; + int detect_result[2]; + int current_state = STATE_TRANSVR_UNEXCEPTED; + int current_type = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_NEW) { + if (_transvr_init_handler(self) < 0){ + return ERR_TRANSVR_INIT_FAIL; + } + } + err = detect_transvr_state(self, detect_result); + if (err < 0) { + return err; + } + /* In Direct mode, driver only detect transceiver when user call driver interface + * which on sysfs. So it only need consider the state of Transceiver. + */ + current_state = detect_result[0]; + current_type = detect_result[1]; + + switch (current_state){ + + case STATE_TRANSVR_DISCONNECTED: /* Transceiver is not plugged */ + self->state = current_state; + self->type = current_type; + return ERR_TRANSVR_UNPLUGGED; + + case STATE_TRANSVR_INIT: /* Transceiver is plugged, system not ready */ + return ERR_TRANSVR_UNINIT; + + case STATE_TRANSVR_ISOLATED: /* Transceiver is plugged, but has some issues */ + return ERR_TRNASVR_BE_ISOLATED; + + case STATE_TRANSVR_CONNECTED: /* Transceiver is plugged, system is ready */ + self->state = current_state; + self->type = current_type; + return 0; + + case STATE_TRANSVR_SWAPPED: /* Transceiver is plugged, system detect user changed */ + self->type = current_type; + if (reload_transvr_obj(self, current_type) < 0){ + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + self->state = current_state; + return 0; + + case STATE_TRANSVR_UNEXCEPTED: /* Transceiver type or state is unexpected case */ + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_UNEXCPT; + + default: + SWPS_INFO("%s: state:%d not in define.\n", __func__, current_state); + break; + } + return ERR_TRANSVR_UNEXCPT; +} + + +static int +_is_except_happened_4_pmode(struct transvr_obj_s* self, + int new_state) { + + int event_chk = 0; + + if (self->temp == 0){ + return 0; + } + switch (new_state) { + case STATE_TRANSVR_INIT: + event_chk = EVENT_TRANSVR_EXCEP_INIT; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_CONNECTED: + event_chk = EVENT_TRANSVR_EXCEP_UP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_DISCONNECTED: + event_chk = EVENT_TRANSVR_EXCEP_DOWN; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_SWAPPED: + event_chk = EVENT_TRANSVR_EXCEP_SWAP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_UNEXCEPTED: + event_chk = EVENT_TRANSVR_EXCEP_EXCEP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_ISOLATED: + event_chk = EVENT_TRANSVR_EXCEP_ISOLATED; + goto check_event_happened_4_pmode; + + default: + SWPS_INFO("%s: unexcepted case:%d\n", __func__, new_state); + break; + } + return 0; + +check_event_happened_4_pmode: + if (self->temp == event_chk){ + return 1; + } + return 0; +} + + +int +common_fsm_4_polling_mode(struct transvr_obj_s* self, + char *caller_name){ + /* [Return Value]: + * ERR_TRANSVR_UNINIT : (1) Initial not ready + * ERR_TRANSVR_UNPLUGGED : (1) Any -> Down + * ERR_TRANSVR_TASK_BUSY : (1) Wait Initial task + * ERR_TRANSVR_UNEXCPT : (1) Initial fail + * (2) Task fail + * (3) Reload fail + * ERR_TRNASVR_BE_ISOLATED : (1) Already be isolated + * OK Case (return 0) : (1) action_4_connected + * (2) action_4_nothing (initial retry) + */ + int curr_state[2]; + int old_state = self->state; + int old_type = self->type; + int new_state = STATE_TRANSVR_UNEXCEPTED; + int new_type = TRANSVR_TYPE_ERROR; + int return_val = ERR_TRANSVR_UNEXCPT; + + /* Never initial */ + if (self->state == STATE_TRANSVR_NEW) { + goto comfsm_action_4_reinit_obj; + } + /* Detect current state */ + switch (detect_transvr_state(self, curr_state)) { + case 0: + new_state = curr_state[0]; + new_type = curr_state[1]; + break; + + case ERR_TRNASVR_BE_ISOLATED: + new_state = STATE_TRANSVR_ISOLATED; + new_type = old_type; + break; + + case ERR_TRANSVR_I2C_CRASH: + goto comfsm_action_4_report_i2c_crash; + + case ERR_TRANSVR_UNEXCPT: + default: + new_state = STATE_TRANSVR_UNEXCEPTED; + new_type = old_type; + } + /* State handling */ + switch (old_state) { + case STATE_TRANSVR_INIT: /* INIT -> */ + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 1-1: UP -> INIT */ + SWPS_INFO("Detect %s is present. :1-1\n",self->swp_name); + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 1-2: UP -> UP */ + return_val = 0; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_DISCONNECTED: /* Case 1-3: UP -> DOWN */ + SWPS_INFO("Detect %s is removed. :1-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 1-4: UP -> SWAP */ + SWPS_INFO("Detect %s is swapped. :1-4\n",self->swp_name); + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 1-5: UP -> UNEXPET */ + SWPS_INFO("Detect %s has error. :1-5\n",self->swp_name); + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: /* Case 1-6: UP -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :1-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_DISCONNECTED: + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 2-1: DOWN -> INIT */ + SWPS_INFO("Detect %s is present. :2-1\n",self->swp_name); + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 2-2: DOWN -> UP */ + SWPS_INFO("Detect %s is present. :2-2\n",self->swp_name); + goto comfsm_action_4_reinit_obj; + + case STATE_TRANSVR_DISCONNECTED: /* Case 2-3: DOWN -> DOWN */ + return_val = ERR_TRANSVR_UNPLUGGED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_SWAPPED: /* Case 2-4: DOWN -> SWAP */ + SWPS_INFO("Detect %s is swapped. :2-4\n",self->swp_name); + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 2-5: DOWN -> UNEXPET */ + SWPS_INFO("Detect %s has error. :2-5\n",self->swp_name); + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: /* Case 2-6: DOWN -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :2-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_UNEXCEPTED: + /* Filter out re-action */ + if (_is_except_happened_4_pmode(self, new_state)) { + goto comfsm_action_4_keep_state; + } + /* First action */ + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 3-1: UNEXPET -> INIT */ + SWPS_INFO("Detect %s is present. :3-1\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_INIT; + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 3-2: UNEXPET -> UP */ + SWPS_INFO("Detect %s is present. :3-2\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_UP; + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_DISCONNECTED: /* Case 3-3: UNEXPET -> DOWN */ + SWPS_INFO("Detect %s is removed. :3-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 3-4: UNEXPET -> SWAP */ + SWPS_INFO("Detect %s is swapped. :3-4\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_SWAP; + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 3-5: UNEXPET -> UNEXPET */ + self->temp = EVENT_TRANSVR_EXCEP_EXCEP; + return_val = ERR_TRANSVR_UNEXCPT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_ISOLATED: /* Case 3-6: UNEXPET -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :3-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: + /* Filter out re-action */ + if (_is_except_happened_4_pmode(self, new_state)) { + goto comfsm_action_4_keep_state; + } + /* First action */ + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 4-1: ISOLATE -> INIT */ + SWPS_INFO("Detect %s internal error. :4-1\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_INIT; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 4-2: ISOLATE -> UP */ + SWPS_INFO("Detect %s internal error. :4-2\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_UP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_DISCONNECTED: /* Case 4-3: ISOLATE -> DOWN */ + SWPS_INFO("Detect %s is removed. :4-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 4-4: ISOLATE -> SWAP */ + SWPS_INFO("Detect %s internal error. :4-4\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_SWAP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 4-5: ISOLATE -> UNEXPET */ + SWPS_INFO("Detect %s internal error. :4-5\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_EXCEP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_ISOLATED: /* Case 4-6: ISOLATE -> ISOLATE */ + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + default: + break; + } + goto comfsm_action_4_unexpected; + + default: + break; + } + goto comfsm_action_4_unexpected; + + +comfsm_action_4_keep_state: + return return_val; + +comfsm_action_4_reinit_obj: + SWPS_DEBUG("FSM action: %s re-initial.\n", self->swp_name); + return_val = _transvr_init_handler(self); + goto comfsm_action_4_identify_event; + +comfsm_action_4_reload_obj: + SWPS_DEBUG("FSM action: %s reload.\n", self->swp_name); + self->type = new_type; + return_val = reload_transvr_obj(self, new_type); + goto comfsm_action_4_identify_event; + +comfsm_action_4_identify_event: + switch (return_val) { + case EVENT_TRANSVR_INIT_UP: + case EVENT_TRANSVR_TASK_DONE: + goto comfsm_action_4_connected; + + case EVENT_TRANSVR_INIT_DOWN: + goto comfsm_action_4_disconnected; + + case EVENT_TRANSVR_INIT_REINIT: + goto comfsm_action_4_nothing; + + case EVENT_TRANSVR_TASK_WAIT: + self->state = STATE_TRANSVR_INIT; + return ERR_TRANSVR_TASK_BUSY; + + case EVENT_TRANSVR_TASK_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_TASK_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_INIT_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_INIT_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_RELOAD_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_RELOAD_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_I2C_CRASH: + goto comfsm_action_4_report_i2c_crash; + + case EVENT_TRANSVR_EXCEP_ISOLATED: + goto comfsm_action_4_isolate_obj; + + default: + SWPS_INFO("%s detect undefined event:%d.\n", self->swp_name, return_val); + goto comfsm_action_4_unexpected; + } + +comfsm_action_4_nothing: + SWPS_DEBUG("FSM action: %s do nothing.\n", self->swp_name); + return 0; + +comfsm_action_4_connected: + SWPS_DEBUG("FSM action: %s Connected.\n", self->swp_name); + self->state = STATE_TRANSVR_CONNECTED; + self->type = new_type; + self->send_uevent(self, KOBJ_ADD); + _transvr_clean_retry(self); + return 0; + +comfsm_action_4_disconnected: + SWPS_DEBUG("FSM action: %s Disconnected. \n", self->swp_name); + self->state = STATE_TRANSVR_DISCONNECTED; + self->temp = EVENT_TRANSVR_TASK_DONE; + self->send_uevent(self, KOBJ_REMOVE); + _transvr_clean_retry(self); + _transvr_clean_handler(self); + return ERR_TRANSVR_UNPLUGGED; + +comfsm_action_4_report_i2c_crash: + SWPS_DEBUG("FSM action: %s report I2C crash.\n", self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_I2C_CRASH; + +comfsm_action_4_isolate_obj: + SWPS_DEBUG("FSM action: %s isolate.\n", self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return ERR_TRNASVR_BE_ISOLATED; + +comfsm_action_4_unexpected: + SWPS_INFO("FSM action: %s unexpected.\n", self->swp_name); + SWPS_INFO("Dump: :%d :0x%02x :%d :0x%02x\n", + old_state, old_type, new_state, new_type); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->send_uevent(self, KOBJ_REMOVE); + _transvr_clean_handler(self); + return ERR_TRANSVR_UNEXCPT; +} + + +int +fake_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + + +int +fake_fsm_4_polling_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + + +/* ========== Object functions for Initial procedure ========== + */ +int +transvr_init_common(struct transvr_obj_s *self){ + /* Nothing to update */ + return EVENT_TRANSVR_TASK_DONE; +} + + +int +transvr_init_fake(struct transvr_obj_s *self){ + return EVENT_TRANSVR_TASK_DONE; +} + + +int +transvr_init_sfp(struct transvr_obj_s *self){ + + int tmp_val = DEBUG_TRANSVR_INT_VAL; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_msg = "ERR"; + + self->info = sft_detect_transvr_class(self); + /* Disable auto_config */ + if (!self->auto_config) { + return EVENT_TRANSVR_TASK_DONE; + } + /* Handle multi-rate */ + err_code = initfunc_sfp_handle_multi_rate_mode(self); + if (err_code < 0) { + err_msg = "initfunc_sfp_handle_multi_rate_mode fail!"; + goto err_transvr_init_sfp_1; + } + /* Handle 1G- RJ45 */ + tmp_val = err_code; + err_code = initfunc_sfp_handle_1g_rj45(self); + if (err_code < 0) { + err_msg = "initfunc_sfp_handle_1g_rj45 fail!"; + goto err_transvr_init_sfp_1; + } + tmp_val = (tmp_val > err_code ? tmp_val : err_code); + if (tmp_val > EVENT_TRANSVR_TASK_DONE) { + return tmp_val; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_sfp_1: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, err_code, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +transvr_init_qsfp(struct transvr_obj_s *self){ + + int err = EVENT_TRANSVR_EXCEP_EXCEP; + char *emsg = "ERR"; + + self->info = qsft_detect_transvr_class(self); + if (!self->auto_config) { + return EVENT_TRANSVR_TASK_DONE; + } + err = initfunc_qsfp_handle_power_mode(self); + if (err < 0){ + emsg = "initfunc_qsfp_handle_tx_disable fail!"; + goto err_transvr_init_qsfp; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_qsfp: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, emsg, err, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +transvr_init_qsfp28(struct transvr_obj_s *self){ + + int tmp_val = EVENT_TRANSVR_EXCEP_EXCEP; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_msg = "ERR"; + + /* Handle QSFP common */ + err_val = transvr_init_qsfp(self); + if (err_val < 0){ + err_msg = "transvr_init_qsfp fail!"; + goto err_transvr_init_qsfp28_1; + } + /* Disable auto_config */ + if (!self->auto_config) { + return err_val; + } + /* Handle CDR */ + tmp_val = err_val; + err_val = initfunc_qsfp28_handle_cdr(self); + if (err_val < 0){ + err_msg = "Handle CDR fail!"; + goto err_transvr_init_qsfp28_1; + } + tmp_val = (tmp_val > err_val ? tmp_val : err_val); + if (tmp_val > EVENT_TRANSVR_TASK_DONE) { + return tmp_val; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_qsfp28_1: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, err_val, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +/* ========== Object Initial handler ========== + */ +static int +_is_transvr_valid(struct transvr_obj_s *self, + int type, + int state) { + /* [Return] + * 0 : OK, inserted + * EVENT_TRANSVR_INIT_DOWN : OK, removed + * EVENT_TRANSVR_INIT_FAIL : Outside error, type doesn't supported + * EVENT_TRANSVR_EXCEP_INIT : Internal error, state undefined + */ + switch (type) { + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + break; + default: + SWPS_INFO("detect undefined type:0x%02x on %s\n", + type, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; + } + switch (state) { + case STATE_TRANSVR_DISCONNECTED: + return EVENT_TRANSVR_INIT_DOWN; + case STATE_TRANSVR_INIT: + case STATE_TRANSVR_CONNECTED: + case STATE_TRANSVR_SWAPPED: + break; + default: + SWPS_INFO("detect undefined state:%d on %s\n", + state, self->swp_name); + return EVENT_TRANSVR_EXCEP_INIT; + } + return 0; +} + + +static int +_is_transvr_hw_ready(struct transvr_obj_s *self, + int type){ + /* [Return] + * EVENT_TRANSVR_TASK_DONE : Ready + * EVENT_TRANSVR_TASK_WAIT : Not ready + * EVENT_TRANSVR_INIT_FAIL : Error + */ + int addr = DEBUG_TRANSVR_INT_VAL; + int page = DEBUG_TRANSVR_INT_VAL; + int offs = DEBUG_TRANSVR_INT_VAL; + int bit = DEBUG_TRANSVR_INT_VAL; + int ready = DEBUG_TRANSVR_INT_VAL; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t ab_val = DEBUG_TRANSVR_HEX_VAL; + + switch (type) { + case TRANSVR_TYPE_SFP: + addr = VAL_TRANSVR_8472_READY_ADDR; + page = VAL_TRANSVR_8472_READY_PAGE; + offs = VAL_TRANSVR_8472_READY_OFFSET; + bit = VAL_TRANSVR_8472_READY_BIT; + ready = VAL_TRANSVR_8472_READY_VALUE; + ab_val = VAL_TRANSVR_8472_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + addr = VAL_TRANSVR_8436_READY_ADDR; + page = VAL_TRANSVR_8436_READY_PAGE; + offs = VAL_TRANSVR_8436_READY_OFFSET; + bit = VAL_TRANSVR_8436_READY_BIT; + ready = VAL_TRANSVR_8436_READY_VALUE; + ab_val = VAL_TRANSVR_8436_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + return EVENT_TRANSVR_TASK_DONE; + + default: + emsg = "unexpected case"; + goto err_is_transvr_hw_ready; + } + /* Select target page */ + err = _common_setup_page(self, addr, page, offs, 1, 0); + if (err < 0) { + emsg = "setup page fail"; + goto err_is_transvr_hw_ready; + } + /* Check feature supported + * [Note] + * Some of transceiver/cables doesn't support "Status Indicators" + * (ex:DAC, RJ45 copper SFP ...etc). In these case, we bypass the + * step of checking Status Indicators, then state machine will take + * the following handle procedure. + */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (err < 0) { + emsg = "doesn't support Status Indicators"; + goto bypass_is_transvr_hw_ready; + } + /* Filter abnormal case */ + if (err == ab_val) { + emsg = "detect using unusual definition."; + goto bypass_is_transvr_hw_ready; + } + /* Get Status Indicators */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, offs); + if (err < 0) { + emsg = "detect current value fail"; + goto err_is_transvr_hw_ready; + } + if ((err & (1<:%d\n", __func__, emsg, type); + return EVENT_TRANSVR_TASK_DONE; + +err_is_transvr_hw_ready: + SWPS_DEBUG("%s: %s :%d\n", __func__, emsg, type); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +_is_transvr_support_ctle(struct transvr_obj_s *self) { + + switch (self->info) { + case TRANSVR_CLASS_OPTICAL_25G: + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return 1; + default: + break; + } + return 0; +} + + +static int +_transvr_init_handler(struct transvr_obj_s *self){ + + int detect[2]; + int d_state = STATE_TRANSVR_UNEXCEPTED; + int d_type = TRANSVR_TYPE_ERROR; + int result = ERR_TRANSVR_UNINIT; + int retry = 6; /* (6+1) x 0.3 = 2.1s > spec:2.0s */ + int elimit = 63; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Clean and check callback */ + self->state = STATE_TRANSVR_INIT; + if (self->init == NULL) { + snprintf(emsg, elimit, "init() is null"); + goto initer_err_case_unexcept_0; + } + if (self->clean == NULL) { + snprintf(emsg, elimit, "clean() is null"); + goto initer_err_case_unexcept_0; + } + self->clean(self); + + /* Detect transceiver information */ + result = detect_transvr_state(self, detect); + if (result < 0) { + snprintf(emsg, elimit, "detect_transvr_state() fail"); + switch (result) { + case ERR_TRANSVR_I2C_CRASH: + goto initer_err_case_i2c_ceash; + case ERR_TRNASVR_BE_ISOLATED: + goto initer_err_case_be_isolated; + + case ERR_TRANSVR_UNEXCPT: + default: + break; + } + goto initer_err_case_retry_1; + } + d_state = detect[0]; + d_type = detect[1]; + + /* Verify transceiver type and state */ + switch (_is_transvr_valid(self, d_type, d_state)) { + case 0: + break; + case EVENT_TRANSVR_INIT_DOWN: + goto initer_ok_case_down;; + case EVENT_TRANSVR_INIT_FAIL: + snprintf(emsg, elimit, "transceiver type doesn't support"); + goto initer_err_case_alarm_to_user; + case EVENT_TRANSVR_EXCEP_INIT: + default: + goto initer_err_case_unexcept_1; + } + + /* Handle reload case */ + if (self->type != d_type){ + /* This is the protect mechanism. Normally, This case will not happen. + * When State machine detect swap event during initial, It will trigger + * reload function to ensure type correct. */ + if (_reload_transvr_obj(self, d_type) < 0){ + snprintf(emsg, elimit, "reload object fail"); + goto initer_err_case_unexcept_1; + } + } + + /* Check transceiver HW initial ready */ + switch (_is_transvr_hw_ready(self, d_type)) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_err_case_retry_1; + case EVENT_TRANSVR_INIT_FAIL: + default: + goto initer_err_case_unexcept_1; + } + + /* Try to update all and check */ + if (self->update_all(self, 1) < 0){ + /* For some transceiver, EEPROME has lag issues during initial stage. + * In this case, we set status back to STATE_TRANSVR_NEW, than it will + * be checked in next polling cycle. */ + goto initer_err_case_retry_1; + } + + /* Execute init() call back */ + result = self->init(self); + switch (result) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_ok_case_wait; + + default: + snprintf(emsg, elimit, "undefined init() return:%d\n", result); + goto initer_err_case_unexcept_1; + } + goto initer_ok_case_up; + + +initer_ok_case_wait: + self->dump_all(self); + return EVENT_TRANSVR_TASK_WAIT; + +initer_ok_case_up: + self->state = STATE_TRANSVR_CONNECTED; + self->temp = 0; + self->dump_all(self); + return EVENT_TRANSVR_INIT_UP; + +initer_ok_case_down: + self->temp = 0; + self->state = STATE_TRANSVR_DISCONNECTED; + return EVENT_TRANSVR_INIT_DOWN; + +initer_err_case_i2c_ceash: + SWPS_DEBUG("%s: %s :%s :I2C crash\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_I2C_CRASH; + +initer_err_case_be_isolated: + SWPS_DEBUG("%s: %s :%s :isolated\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return EVENT_TRANSVR_EXCEP_ISOLATED; + +initer_err_case_retry_1: + SWPS_DEBUG("%s: %s :%s :retry\n", + __func__, emsg, self->swp_name); + if (_transvr_handle_retry(self, retry) == 0) { + self->state = STATE_TRANSVR_NEW; + return EVENT_TRANSVR_INIT_REINIT; + } + goto initer_err_case_alarm_to_user; + +initer_err_case_unexcept_1: + self->clean(self); +initer_err_case_unexcept_0: + self->state = STATE_TRANSVR_UNEXCEPTED; + if (_is_except_happened_4_pmode(self, d_state) && + (self->mode == TRANSVR_MODE_POLLING) ){ + SWPS_INFO("%s: %s :%s\n", __func__, emsg, self->swp_name); + SWPS_INFO("Dump: :%d :%d :%d :%d\n", + self->state, self->type, d_state, d_type); + } + return EVENT_TRANSVR_INIT_FAIL; + +initer_err_case_alarm_to_user: + SWPS_DEBUG("%s: %s :%s :alarm_to_user\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard"); + return EVENT_TRANSVR_INIT_FAIL; +} + + +/* ========== Object functions for Clean procedure ========== + */ +int +_transvr_clean_handler(struct transvr_obj_s *self){ + + int retval = DEBUG_TRANSVR_INT_VAL; + + if (!self->clean) { + SWPS_ERR("%s: %s clean() is NULL.\n", + __func__, self->swp_name); + return EVENT_TRANSVR_TASK_FAIL; + } + retval = self->clean(self); + if (retval != EVENT_TRANSVR_TASK_DONE){ + SWPS_ERR("%s: %s clean() fail. [ERR]:%d\n", + __func__, self->swp_name, retval); + return retval; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +int +common_transvr_clean(struct transvr_obj_s *self){ + + transvr_task_free_all(self); + transvr_cache_free_all(self); + return EVENT_TRANSVR_TASK_DONE; +} + + +int +qsfp_transvr_clean(struct transvr_obj_s *self){ + + int retval; + int lpower_config = 1; + + retval = _taskfunc_qsfp_setup_power_mod(self, lpower_config); + if (retval < 0){ + SWPS_ERR("%s: Set lpmod fail! :%d\n", + __func__, retval); + return retval; + } + retval = common_transvr_clean(self); + if (retval < 0){ + SWPS_ERR("%s: common_transvr_clean fail! :%d\n", + __func__, retval); + return retval; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +int +fake_transvr_clean(struct transvr_obj_s *self){ + + return EVENT_TRANSVR_TASK_DONE; +} + + +/* ========== Object functions for check and update ========== + */ +int +common_transvr_check(struct transvr_obj_s *self){ + + char fun_str[32] = "common_transvr_check"; + + if (self->mode != TRANSVR_MODE_POLLING) { + SWPS_ERR("%s: mode:%d is not TRANSVR_MODE_POLLING\n", + fun_str, self->mode); + return ERR_TRANSVR_UNEXCPT; + } + /* Trigger delay task */ + transvr_task_run_all(self); + /* Trigger state machine to check and update */ + return self->fsm_4_polling(self, fun_str); +} + + +int +fake_transvr_check(struct transvr_obj_s *self){ + return 0; +} + + +/* ========== Functions for Factory pattern ========== + */ +static int +setup_transvr_public_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = unsupported_get_func; + self->get_br = common_get_br; + self->get_len_sm = sfp_get_len_sm; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = sfp_get_comp_eth_1; + self->get_comp_eth_10 = sfp_get_comp_eth_10; + self->get_comp_eth_10_40 = unsupported_get_func; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = unsupported_get_func; + self->get_rate_id = sfp_get_rate_id; + self->get_soft_rs0 = sfp_get_soft_rs0; + self->get_soft_rs1 = sfp_get_soft_rs1; + self->get_info = common_get_info; + self->get_if_type = sfp_get_if_type; + self->get_if_speed = sfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = sfp_get_transvr_temp; + self->get_curr_vol = sfp_get_transvr_voltage; + self->get_soft_rx_los = unsupported_get_func2; + self->get_soft_tx_disable = unsupported_get_func2; + self->get_soft_tx_fault = unsupported_get_func2; + self->get_auto_tx_disable = unsupported_get_func2; + self->get_tx_bias = sfp_get_transvr_tx_bias; + self->get_tx_power = sfp_get_transvr_tx_power; + self->get_rx_power = sfp_get_transvr_rx_power; + self->get_tx_eq = sfp_get_transvr_tx_eq; + self->get_rx_am = unsupported_get_func2; + self->get_rx_em = sfp_get_transvr_rx_em; + self->get_wavelength = sfp_get_wavelength; + self->get_extphy_offset = sfp_get_1g_rj45_extphy_offset; + self->get_extphy_reg = sfp_get_1g_rj45_extphy_reg; + self->set_cdr = unsupported_set_func; + self->set_soft_rs0 = sfp_set_soft_rs0; + self->set_soft_rs1 = sfp_set_soft_rs1; + self->set_soft_tx_disable = unsupported_set_func; + self->set_auto_tx_disable = unsupported_set_func; + self->set_tx_eq = sfp_set_tx_eq; + self->set_rx_am = unsupported_set_func; + self->set_rx_em = sfp_set_rx_em; + self->set_extphy_offset = sfp_set_1g_rj45_extphy_offset; + self->set_extphy_reg = sfp_set_1g_rj45_extphy_reg; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = qsfp_get_power_cls; + self->get_br = common_get_br; + self->get_len_sm = unsupported_get_func; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = qsfp_get_comp_eth; + self->get_comp_eth_10 = unsupported_get_func; + self->get_comp_eth_10_40 = qsfp_get_comp_10_40; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = unsupported_get_func; + self->get_rate_id = unsupported_get_func; + self->get_soft_rs0 = unsupported_get_func; /* TBD */ + self->get_soft_rs1 = unsupported_get_func; /* TBD */ + self->get_info = common_get_info; + self->get_if_type = qsfp_get_if_type; + self->get_if_speed = qsfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = qsfp_get_transvr_temp; + self->get_curr_vol = qsfp_get_transvr_voltage; + self->get_soft_rx_los = qsfp_get_soft_rx_los; + self->get_soft_tx_disable = qsfp_get_soft_tx_disable; + self->get_soft_tx_fault = qsfp_get_soft_tx_fault; + self->get_auto_tx_disable = qsfp_get_auto_tx_disable; + self->get_tx_bias = qsfp_get_transvr_tx_bias; + self->get_tx_power = qsfp_get_transvr_tx_power; + self->get_rx_power = qsfp_get_transvr_rx_power; + self->get_tx_eq = unsupported_get_func2; + self->get_rx_am = unsupported_get_func2; + self->get_rx_em = unsupported_get_func2; + self->get_wavelength = qsfp_get_wavelength; + self->get_extphy_offset = unsupported_get_func2; + self->get_extphy_reg = unsupported_get_func2; + self->set_cdr = unsupported_set_func; + self->set_soft_rs0 = unsupported_set_func; /* TBD */ + self->set_soft_rs1 = unsupported_set_func; /* TBD */ + self->set_soft_tx_disable = qsfp_set_soft_tx_disable; + self->set_auto_tx_disable = qsfp_set_auto_tx_disable; + self->set_tx_eq = unsupported_set_func; + self->set_rx_am = unsupported_set_func; + self->set_rx_em = unsupported_set_func; + self->set_extphy_offset = unsupported_set_func; + self->set_extphy_reg = unsupported_set_func; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = qsfp_get_power_cls; + self->get_br = common_get_br; + self->get_len_sm = unsupported_get_func; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = qsfp_get_comp_eth; + self->get_comp_eth_10 = unsupported_get_func; + self->get_comp_eth_10_40 = qsfp_get_comp_10_40; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = qsfp_get_cdr; + self->get_rate_id = unsupported_get_func; + self->get_soft_rs0 = unsupported_get_func; /* TBD */ + self->get_soft_rs1 = unsupported_get_func; /* TBD */ + self->get_info = common_get_info; + self->get_if_type = qsfp_get_if_type; + self->get_if_speed = qsfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = qsfp_get_transvr_temp; + self->get_curr_vol = qsfp_get_transvr_voltage; + self->get_soft_rx_los = qsfp_get_soft_rx_los; + self->get_soft_tx_disable = qsfp_get_soft_tx_disable; + self->get_soft_tx_fault = qsfp_get_soft_tx_fault; + self->get_auto_tx_disable = qsfp_get_auto_tx_disable; + self->get_tx_bias = qsfp_get_transvr_tx_bias; + self->get_tx_power = qsfp_get_transvr_tx_power; + self->get_rx_power = qsfp_get_transvr_rx_power; + self->get_tx_eq = qsfp_get_transvr_tx_eq; + self->get_rx_am = qsfp_get_transvr_rx_am; + self->get_rx_em = qsfp_get_transvr_rx_em; + self->get_wavelength = qsfp_get_wavelength; + self->get_extphy_offset = unsupported_get_func2; + self->get_extphy_reg = unsupported_get_func2; + self->set_cdr = qsfp_set_cdr; + self->set_soft_rs0 = unsupported_set_func; /* TBD */ + self->set_soft_rs1 = unsupported_set_func; /* TBD */ + self->set_soft_tx_disable = qsfp_set_soft_tx_disable; + self->set_auto_tx_disable = qsfp_set_auto_tx_disable; + self->set_tx_eq = qsfp_set_tx_eq; + self->set_rx_am = qsfp_set_rx_am; + self->set_rx_em = qsfp_set_rx_em; + self->set_extphy_offset = unsupported_set_func; + self->set_extphy_reg = unsupported_set_func; + return 0; + + case TRANSVR_TYPE_FAKE: + self->get_id = fake_get_hex; + self->get_ext_id = fake_get_hex; + self->get_connector = fake_get_hex; + self->get_vendor_name = fake_get_str; + self->get_vendor_pn = fake_get_str; + self->get_vendor_rev = fake_get_str; + self->get_vendor_sn = fake_get_str; + self->get_power_cls = fake_get_int; + self->get_br = fake_get_hex; + self->get_len_sm = fake_get_int; + self->get_len_smf = fake_get_int; + self->get_len_om1 = fake_get_int; + self->get_len_om2 = fake_get_int; + self->get_len_om3 = fake_get_int; + self->get_len_om4 = fake_get_int; + self->get_comp_rev = fake_get_hex; + self->get_comp_eth_1 = fake_get_hex; + self->get_comp_eth_10 = fake_get_hex; + self->get_comp_eth_10_40 = fake_get_hex; + self->get_comp_extend = fake_get_hex; + self->get_cdr = fake_get_hex; + self->get_rate_id = fake_get_hex; + self->get_soft_rs0 = fake_get_binary; + self->get_soft_rs1 = fake_get_binary; + self->get_info = fake_get_int; + self->get_if_type = fake_get_str; + self->get_if_speed = fake_get_str; + self->get_if_lane = fake_get_str; + self->get_curr_temp = fake_get_str; + self->get_curr_vol = fake_get_str; + self->get_soft_rx_los = fake_get_str; + self->get_soft_tx_disable = fake_get_str; + self->get_soft_tx_fault = fake_get_str; + self->get_auto_tx_disable = fake_get_str; + self->get_tx_bias = fake_get_str; + self->get_tx_power = fake_get_str; + self->get_rx_power = fake_get_str; + self->get_tx_eq = fake_get_str; + self->get_rx_am = fake_get_str; + self->get_rx_em = fake_get_str; + self->get_wavelength = fake_get_str; + self->get_extphy_offset = fake_get_str; + self->get_extphy_reg = fake_get_str; + self->set_cdr = fake_set_hex; + self->set_soft_rs0 = fake_set_int; + self->set_soft_rs1 = fake_set_int; + self->set_soft_tx_disable = fake_set_int; + self->set_auto_tx_disable = fake_set_int; + self->set_tx_eq = fake_set_int; + self->set_rx_am = fake_set_int; + self->set_rx_em = fake_set_int; + self->set_extphy_offset = fake_set_hex; + self->set_extphy_reg = fake_set_hex; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static int +setup_transvr_private_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->init = transvr_init_sfp; + self->clean = common_transvr_clean; + self->check = common_transvr_check; + self->update_all = _sfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = sfp_send_uevent; + self->dump_all = sfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->init = transvr_init_qsfp; + self->clean = qsfp_transvr_clean; + self->check = common_transvr_check; + self->update_all = _qsfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = qsfp_send_uevent; + self->dump_all = qsfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->init = transvr_init_qsfp28; + self->clean = qsfp_transvr_clean; + self->check = common_transvr_check; + self->update_all = _qsfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = qsfp_send_uevent; + self->dump_all = qsfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_FAKE: + self->init = transvr_init_fake; + self->clean = fake_transvr_clean; + self->check = fake_transvr_check; + self->update_all = fake_transvr_update; + self->fsm_4_direct = fake_fsm_4_direct_mode; + self->fsm_4_polling = fake_fsm_4_polling_mode; + self->send_uevent = fake_send_uevent; + self->dump_all = fake_transvr_dump; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static struct eeprom_map_s * +get_eeprom_map(int transvr_type){ + + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + return &eeprom_map_sfp; + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + return &eeprom_map_qsfp; + case TRANSVR_TYPE_QSFP_28: + return &eeprom_map_qsfp28; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return NULL; +} + + +static int +setup_transvr_ssize_attr(char *swp_name, + struct transvr_obj_s *self, + struct eeprom_map_s *map_p, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int chan_id, + int run_mode){ + switch (run_mode){ + case TRANSVR_MODE_DIRECT: /* Direct access device mode */ + case TRANSVR_MODE_POLLING: /* Polling mode, read from cache */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = DEBUG_TRANSVR_INT_VAL; + return -1; + } + self->eeprom_map_p = map_p; + self->ioexp_obj_p = ioexp_obj_p; + self->ioexp_virt_offset = ioexp_virt_offset; + self->chan_id = chan_id; + self->layout = transvr_type; + self->type = transvr_type; + self->chipset_type = chipset_type; + self->state = STATE_TRANSVR_NEW; + self->info = STATE_TRANSVR_NEW; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + strncpy(self->swp_name, swp_name, 32); + mutex_init(&self->lock); + return 0; +} + + +static int +setup_transvr_dsize_attr(struct transvr_obj_s *self){ + + char *emsg = DEBUG_TRANSVR_STR_VAL; + + self->vendor_name = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_name){ + emsg = "vendor_name"; + goto err_setup_d_attr; + } + self->vendor_pn = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_pn){ + emsg = "vendor_pn"; + goto err_setup_d_attr; + } + self->vendor_rev = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_rev){ + emsg = "vendor_rev"; + goto err_setup_d_attr; + } + self->vendor_sn = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_sn){ + emsg = "vendor_sn"; + goto err_setup_d_attr; + } + self->worker_p = NULL; + return 0; + +err_setup_d_attr: + SWPS_ERR("%s: %s kzalloc fail!", __func__, emsg); + return ERR_TRANSVR_UNEXCPT; +} + + +static int +setup_i2c_client(struct transvr_obj_s *self){ + + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + adap = i2c_get_adapter(self->chan_id); + if(!adap){ + snprintf(err_msg, sizeof(err_msg), + "can not get adap:%d", self->chan_id); + goto err_setup_i2c_client; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + snprintf(err_msg, sizeof(err_msg), + "can not kzalloc client:%d", self->chan_id); + goto err_setup_i2c_client; + } + client->adapter = adap; + self->i2c_client_p = client; + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + return 0; + +err_setup_i2c_client: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return ERR_TRANSVR_UNEXCPT; +} + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode){ + + struct transvr_obj_s *result_p; + struct eeprom_map_s *map_p; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Allocate transceiver object */ + map_p = get_eeprom_map(transvr_type); + if (!map_p){ + snprintf(err_msg, sizeof(err_msg), + "Invalid transvr_type:%d", transvr_type); + goto err_create_transvr_fail; + } + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_create_transvr_fail; + } + /* Prepare static size attributes */ + if (setup_transvr_ssize_attr(swp_name, + result_p, + map_p, + ioexp_obj_p, + ioexp_virt_offset, + transvr_type, + chipset_type, + chan_id, + run_mode) < 0){ + goto err_create_transvr_sattr_fail; + } + /* Prepare dynamic size attributes */ + if (setup_transvr_dsize_attr(result_p) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare call back functions of object */ + if (setup_transvr_public_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare call back functions of object */ + if (setup_transvr_private_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare i2c client object */ + if (setup_i2c_client(result_p) < 0){ + goto err_create_transvr_dattr_fail; + } + return result_p; + +err_create_transvr_dattr_fail: + kfree(result_p->vendor_sn); + kfree(result_p->vendor_rev); + kfree(result_p->vendor_pn); + kfree(result_p->vendor_name); +err_create_transvr_sattr_fail: + kfree(result_p); +err_create_transvr_fail: + SWPS_ERR("%s: %s :%d :%d :%d\n", + __func__, err_msg, chan_id, ioexp_virt_offset, transvr_type); + return NULL; +} +EXPORT_SYMBOL(create_transvr_obj); + + +static int +_reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + struct eeprom_map_s *new_map_p; + struct eeprom_map_s *old_map_p = self->eeprom_map_p; + struct i2c_client *old_i2c_p = self->i2c_client_p; + int old_type = self->type; + + /* Change state to STATE_TRANSVR_INIT */ + self->state = STATE_TRANSVR_INIT; + self->type = new_type; + /* Replace EEPROME map */ + new_map_p = get_eeprom_map(new_type); + if (!new_map_p){ + goto err_private_reload_func_1; + } + self->eeprom_map_p = new_map_p; + /* Reload i2c client */ + if (setup_i2c_client(self) < 0){ + goto err_private_reload_func_2; + } + /* Replace call back functions */ + if (setup_transvr_public_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + if (setup_transvr_private_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + if(old_i2c_p){ + i2c_put_adapter(old_i2c_p->adapter); + } + kfree(old_i2c_p); + return 0; + +err_private_reload_func_3: + SWPS_INFO("%s: init() fail!\n", __func__); + if(old_i2c_p){ + i2c_put_adapter(old_i2c_p->adapter); + } + kfree(old_i2c_p); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return -2; + +err_private_reload_func_2: + self->eeprom_map_p = old_map_p; + self->i2c_client_p = old_i2c_p; +err_private_reload_func_1: + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = old_type; + SWPS_INFO("%s fail! :0x%02x\n", __func__, new_type); + return -1; +} + + +static int +reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + int result_val = ERR_TRANSVR_UNEXCPT; + + /* Reload phase */ + result_val = _reload_transvr_obj(self, new_type); + if (result_val < 0){ + SWPS_INFO("%s: reload phase fail! :%d\n", + __func__, result_val); + return EVENT_TRANSVR_RELOAD_FAIL; + } + /* Initial phase */ + result_val = _transvr_init_handler(self); + if (result_val < 0){ + SWPS_INFO("%s: initial phase fail! :%d\n", + __func__, result_val); + } + return result_val; +} + + +int +isolate_transvr_obj(struct transvr_obj_s *self) { + + self->state = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s be isolated\n", __func__, self->swp_name); + return 0; +} +EXPORT_SYMBOL(isolate_transvr_obj); + + +int +resync_channel_tier_2(struct transvr_obj_s *self) { + + int val = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_ISOLATED) { + return 0; + } + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + val = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (val < 0) { + return -1; + } + return 0; +} +EXPORT_SYMBOL(resync_channel_tier_2); + +/* For build single module using (Ex: ONL platform) */ +MODULE_LICENSE("GPL"); + + +/* ----------------------------------------- + * ToDo List + * ----------------------------------------- + * 1. _sfp_detect_class_by_feature() + * => Need check ACC use case. + * 2. _sfp_detect_class_by_1g_ethernet() + * => Need check 0.1G use case. + * 3. Loopback transceiver use case. + * => Less much data + * 4. _qsfp_detect_class_by_extend_comp() + * => Verify 100G CWDM4 + * => Verify Obsolete (assigned before 100G CWDM4 MSA required FEC) + * => Verify 100G CLR4 + * => Verify 100GE-DWDM2 + * => Verify 40G PSM4 Parallel SMF + * => Verify 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. + * => Verify 100G ACC or 25GAUI C2M ACC. + * => Verify 25GBASE-LR + * => Verify 40G Active Cable (XLPPI) + */ + + + + + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.h b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.h new file mode 100644 index 000000000000..0c6cd0060041 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/modules/transceiver.h @@ -0,0 +1,809 @@ +#ifndef TRANSCEIVER_H +#define TRANSCEIVER_H + +#include + +/* advanced features control */ +#define TRANSVR_INFO_DUMP_ENABLE (1) +#define TRANSVR_INFO_CACHE_ENABLE (1) +#define TRANSVR_UEVENT_ENABLE (1) + +/* Transceiver type define */ +#define TRANSVR_TYPE_UNKNOW_1 (0x00) +#define TRANSVR_TYPE_UNKNOW_2 (0xff) +#define TRANSVR_TYPE_SFP (0x03) /* Define for SFP, SFP+, SFP28 */ +#define TRANSVR_TYPE_QSFP (0x0c) +#define TRANSVR_TYPE_QSFP_PLUS (0x0d) +#define TRANSVR_TYPE_QSFP_28 (0x11) +#define TRANSVR_TYPE_UNPLUGGED (0xfa) /* Define for ERROR handle */ +#define TRANSVR_TYPE_FAKE (0xfc) /* Define for ERROR handle */ +#define TRANSVR_TYPE_INCONSISTENT (0xfd) /* Define for ERROR handle */ +#define TRANSVR_TYPE_ERROR (0xfe) /* Define for ERROR handle */ + +/* Transceiver class for base info */ +#define TRANSVR_CLASS_UNSPECIFIED (0) +#define TRANSVR_CLASS_ERROR (-26001) +#define TRANSVR_CLASS_1G (26001) +#define TRANSVR_CLASS_10G (26011) +#define TRANSVR_CLASS_25G (26021) +#define TRANSVR_CLASS_40G (26041) +#define TRANSVR_CLASS_100G (26101) +#define TRANSVR_CLASS_NO_SPERARABLE (26901) +#define TRANSVR_CLASS_EXTEND_COMP (26902) +/* Transceiver class for Optical 1G */ +#define TRANSVR_CLASS_OPTICAL (27000) +#define TRANSVR_CLASS_OPTICAL_100 (27001) +#define TRANSVR_CLASS_OPTICAL_1G (27002) +#define TRANSVR_CLASS_OPTICAL_1G_AOC (27003) +#define TRANSVR_CLASS_OPTICAL_1G_SX (27004) +#define TRANSVR_CLASS_OPTICAL_1G_LX (27005) +#define TRANSVR_CLASS_OPTICAL_1G_EX (27006) +/* Transceiver class for Optical 10G */ +#define TRANSVR_CLASS_OPTICAL_10G (27010) +#define TRANSVR_CLASS_OPTICAL_10G_S_AOC (27011) +#define TRANSVR_CLASS_OPTICAL_10G_S_SR (27012) +#define TRANSVR_CLASS_OPTICAL_10G_S_LR (27013) +#define TRANSVR_CLASS_OPTICAL_10G_S_ER (27014) +#define TRANSVR_CLASS_OPTICAL_10G_Q_AOC (27015) +#define TRANSVR_CLASS_OPTICAL_10G_Q_SR (27016) +#define TRANSVR_CLASS_OPTICAL_10G_Q_LR (27017) +#define TRANSVR_CLASS_OPTICAL_10G_Q_ER (27018) +/* Transceiver class for Optical 25G */ +#define TRANSVR_CLASS_OPTICAL_25G (27020) +#define TRANSVR_CLASS_OPTICAL_25G_AOC (27021) +#define TRANSVR_CLASS_OPTICAL_25G_SR (27022) +#define TRANSVR_CLASS_OPTICAL_25G_LR (27023) +#define TRANSVR_CLASS_OPTICAL_25G_ER (27024) +/* Transceiver class for Optical 40G */ +#define TRANSVR_CLASS_OPTICAL_40G (27040) +#define TRANSVR_CLASS_OPTICAL_40G_AOC (27041) +#define TRANSVR_CLASS_OPTICAL_40G_SR4 (27042) +#define TRANSVR_CLASS_OPTICAL_40G_LR4 (27043) +#define TRANSVR_CLASS_OPTICAL_40G_ER4 (27044) +/* Transceiver class for Optical 100G */ +#define TRANSVR_CLASS_OPTICAL_100G (27100) +#define TRANSVR_CLASS_OPTICAL_100G_AOC (27101) +#define TRANSVR_CLASS_OPTICAL_100G_SR4 (27102) +#define TRANSVR_CLASS_OPTICAL_100G_LR4 (27103) +#define TRANSVR_CLASS_OPTICAL_100G_ER4 (27104) +#define TRANSVR_CLASS_OPTICAL_100G_PSM4 (27105) +/* Transceiver class for Copper */ +#define TRANSVR_CLASS_COPPER (28000) +#define TRANSVR_CLASS_COPPER_L1_1G (28001) +#define TRANSVR_CLASS_COPPER_L1_10G (28011) +#define TRANSVR_CLASS_COPPER_L4_10G (28012) +#define TRANSVR_CLASS_COPPER_L1_25G (28021) +#define TRANSVR_CLASS_COPPER_L4_40G (28041) +#define TRANSVR_CLASS_COPPER_L4_100G (28101) +/* Transceiver class for Base-T */ +#define TRANSVR_CLASS_BASE_T_1000 (29001) +#define TRANSVR_CLASS_BASE_T_1000_up (29002) +/* For uevent message */ +#define TRANSVR_UEVENT_KEY_IF "IF_TYPE" +#define TRANSVR_UEVENT_KEY_SP "IF_SPEED" +#define TRANSVR_UEVENT_KEY_LANE "IF_LANE" +#define TRANSVR_UEVENT_UNKNOW "UNKNOW" +#define TRANSVR_IF_KR "KR" +#define TRANSVR_IF_KR4 "KR4" +#define TRANSVR_IF_SR "SR" +#define TRANSVR_IF_SR4 "SR4" +#define TRANSVR_IF_SFI "SFI" +#define TRANSVR_IF_IF_GMII "GMII" +#define TRANSVR_IF_IF_XGMII "XGMII" +#define TRANSVR_IF_SP_100 "100" +#define TRANSVR_IF_SP_1G "1000" +#define TRANSVR_IF_SP_10G "10000" +#define TRANSVR_IF_SP_25G "25000" +#define TRANSVR_IF_SP_40G "40000" +#define TRANSVR_IF_SP_100G "100000" + +/* Transceiver mode define */ +#define TRANSVR_MODE_DIRECT (21000) +#define TRANSVR_MODE_POLLING (21001) + +/* Transceiver state define + * [Note] + * 1. State is used to represent the state of "Transceiver" and "Object". + * 2. State for different target has different means. The description as following: + */ +#define STATE_TRANSVR_CONNECTED (0) /* [Transvr]:Be plugged in. [Obj]:Link up, and work normally. */ +#define STATE_TRANSVR_NEW (-100) /* [Transvr]:(Not used) [Obj]:Create */ +#define STATE_TRANSVR_INIT (-101) /* [Transvr]:Be plugged in. [Obj]:Link up, and in initial process. */ +#define STATE_TRANSVR_ISOLATED (-102) /* [Transvr]:Be plugged in. [Obj]:Isolate, and not provide service. */ +#define STATE_TRANSVR_SWAPPED (-200) /* [Transvr]:Be plugged in. [Obj]:(Not used) */ +#define STATE_TRANSVR_DISCONNECTED (-300) /* [Transvr]:Un-plugged. [Obj]:Link down, and not provide service. */ +#define STATE_TRANSVR_UNEXCEPTED (-901) /* [Transvr]:Any [Obj]:Any, and not in expect case. */ + +/* Task state define */ +#define STATE_T_TASK_WAIT (110) +#define STATE_T_TASK_DONE (0) +#define STATE_T_TASK_INIT (-110) +#define STATE_T_TASK_FAIL (-410) + + +/* Event for task handling */ +#define EVENT_TRANSVR_TASK_WAIT (2101) +#define EVENT_TRANSVR_TASK_DONE (0) +#define EVENT_TRANSVR_TASK_FAIL (-2101) +/* Event for initial handling */ +#define EVENT_TRANSVR_INIT_UP (2201) +#define EVENT_TRANSVR_INIT_DOWN (1) +#define EVENT_TRANSVR_INIT_REINIT (-2201) +#define EVENT_TRANSVR_INIT_FAIL (-2202) +/* Event for others */ +#define EVENT_TRANSVR_RELOAD_FAIL (-2301) +#define EVENT_TRANSVR_EXCEP_INIT (-2401) +#define EVENT_TRANSVR_EXCEP_UP (-2402) +#define EVENT_TRANSVR_EXCEP_DOWN (-2403) +#define EVENT_TRANSVR_EXCEP_SWAP (-2404) +#define EVENT_TRANSVR_EXCEP_EXCEP (-2405) +#define EVENT_TRANSVR_EXCEP_ISOLATED (-2406) +#define EVENT_TRANSVR_I2C_CRASH (-2501) + +/* Transceiver error code define */ +#define ERR_TRANSVR_UNINIT (-201) +#define ERR_TRANSVR_UNPLUGGED (-202) +#define ERR_TRANSVR_ABNORMAL (-203) +#define ERR_TRANSVR_NOSTATE (-204) +#define ERR_TRANSVR_NOTSUPPORT (-205) +#define ERR_TRANSVR_BADINPUT (-206) +#define ERR_TRANSVR_UPDATE_FAIL (-207) +#define ERR_TRANSVR_RELOAD_FAIL (-208) +#define ERR_TRANSVR_INIT_FAIL (-209) +#define ERR_TRANSVR_UNDEFINED (-210) +#define ERR_TRANSVR_TASK_FAIL (-211) +#define ERR_TRANSVR_TASK_BUSY (-212) +#define ERR_TRANSVR_UEVENT_FAIL (-213) +#define ERR_TRANSVR_FUNC_DISABLE (-214) +#define ERR_TRANSVR_I2C_CRASH (-297) +#define ERR_TRNASVR_BE_ISOLATED (-298) +#define ERR_TRANSVR_UNEXCPT (-299) + +/* For debug */ +#define DEBUG_TRANSVR_INT_VAL (-99) +#define DEBUG_TRANSVR_HEX_VAL (0xfe) +#define DEBUG_TRANSVR_STR_VAL "ERROR" + +/* For system internal */ +#define VAL_TRANSVR_COMID_ARREESS (0x50) +#define VAL_TRANSVR_COMID_OFFSET (0x00) +#define VAL_TRANSVR_EXTPHY_ADDR_56 (0x56) +#define VAL_TRANSVR_8472_READY_ADDR (0x51) +#define VAL_TRANSVR_8472_READY_PAGE (-1) +#define VAL_TRANSVR_8472_READY_OFFSET (110) +#define VAL_TRANSVR_8472_READY_BIT (0) +#define VAL_TRANSVR_8472_READY_VALUE (0) +#define VAL_TRANSVR_8472_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_READY_ADDR (0x50) +#define VAL_TRANSVR_8436_READY_PAGE (-1) +#define VAL_TRANSVR_8436_READY_OFFSET (2) +#define VAL_TRANSVR_8436_READY_BIT (0) +#define VAL_TRANSVR_8436_READY_VALUE (0) +#define VAL_TRANSVR_8436_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_PWD_ADDR (0x50) +#define VAL_TRANSVR_8436_PWD_PAGE (-1) +#define VAL_TRANSVR_8436_PWD_OFFSET (123) +#define VAL_TRANSVR_PAGE_FREE (-99) +#define VAL_TRANSVR_PAGE_SELECT_OFFSET (127) +#define VAL_TRANSVR_PAGE_SELECT_DELAY (5) +#define VAL_TRANSVR_TASK_RETRY_FOREVER (-999) +#define VAL_TRANSVR_FUNCTION_DISABLE (-1) +#define STR_TRANSVR_SFP "SFP" +#define STR_TRANSVR_QSFP "QSFP" +#define STR_TRANSVR_QSFP_PLUS "QSFP+" +#define STR_TRANSVR_QSFP28 "QSFP28" + +/* For transvr buf len */ +#define LEN_TRANSVR_S_STR (16) +#define LEN_TRANSVR_M_STR (32) +#define LEN_TRANSVR_L_STR (64) + +/* Optical wavelength */ +#define VAL_OPTICAL_WAVELENGTH_SR (850) +#define VAL_OPTICAL_WAVELENGTH_LR (1310) +#define VAL_OPTICAL_WAVELENGTH_ER (1550) + +/* chip type define */ +#define CHIP_TYPE_MAGNOLIA (31001) /* Magnolia, Hudson32i, Spruce */ +#define CHIP_TYPE_REDWOOD (31002) /* Redwood, Cypress, Sequoia */ +#define CHIP_TYPE_MAPLE (31003) /* Maple */ + +#define CHIP_TYPE_LAVENDER (31011) /* Lavender */ + +/* Info from transceiver EEPROM */ +struct eeprom_map_s { + int addr_br; int page_br; int offset_br; int length_br; + int addr_cdr; int page_cdr; int offset_cdr; int length_cdr; + int addr_comp_rev; int page_comp_rev; int offset_comp_rev; int length_comp_rev; + int addr_connector; int page_connector; int offset_connector; int length_connector; + int addr_diag_type; int page_diag_type; int offset_diag_type; int length_diag_type; + int addr_extbr; int page_extbr; int offset_extbr; int length_extbr; + int addr_ext_id; int page_ext_id; int offset_ext_id; int length_ext_id; + int addr_id; int page_id; int offset_id; int length_id; + int addr_len_sm; int page_len_sm; int offset_len_sm; int length_len_sm; + int addr_len_smf; int page_len_smf; int offset_len_smf; int length_len_smf; + int addr_len_om1; int page_len_om1; int offset_len_om1; int length_len_om1; + int addr_len_om2; int page_len_om2; int offset_len_om2; int length_len_om2; + int addr_len_om3; int page_len_om3; int offset_len_om3; int length_len_om3; + int addr_len_om4; int page_len_om4; int offset_len_om4; int length_len_om4; + int addr_option; int page_option; int offset_option; int length_option; + int addr_rate_id; int page_rate_id; int offset_rate_id; int length_rate_id; + int addr_rx_am; int page_rx_am; int offset_rx_am; int length_rx_am; + int addr_rx_em; int page_rx_em; int offset_rx_em; int length_rx_em; + int addr_rx_los; int page_rx_los; int offset_rx_los; int length_rx_los; + int addr_rx_power; int page_rx_power; int offset_rx_power; int length_rx_power; + int addr_soft_rs0; int page_soft_rs0; int offset_soft_rs0; int length_soft_rs0; + int addr_soft_rs1; int page_soft_rs1; int offset_soft_rs1; int length_soft_rs1; + int addr_temp; int page_temp; int offset_temp; int length_temp; + int addr_trancomp; int page_trancomp; int offset_trancomp; int length_trancomp; + int addr_trancomp_ext; int page_trancomp_ext; int offset_trancomp_ext; int length_trancomp_ext; + int addr_tx_bias; int page_tx_bias; int offset_tx_bias; int length_tx_bias; + int addr_tx_disable; int page_tx_disable; int offset_tx_disable; int length_tx_disable; + int addr_tx_eq; int page_tx_eq; int offset_tx_eq; int length_tx_eq; + int addr_tx_fault; int page_tx_fault; int offset_tx_fault; int length_tx_fault; + int addr_tx_power; int page_tx_power; int offset_tx_power; int length_tx_power; + int addr_vendor_name; int page_vendor_name; int offset_vendor_name; int length_vendor_name; + int addr_vendor_pn; int page_vendor_pn; int offset_vendor_pn; int length_vendor_pn; + int addr_vendor_rev; int page_vendor_rev; int offset_vendor_rev; int length_vendor_rev; + int addr_vendor_sn; int page_vendor_sn; int offset_vendor_sn; int length_vendor_sn; + int addr_voltage; int page_voltage; int offset_voltage; int length_voltage; + int addr_wavelength; int page_wavelength; int offset_wavelength; int length_wavelength; +}; + + +struct transvr_worker_s; + +/* Class of transceiver object */ +struct transvr_obj_s { + + /* ========== Object private property ========== + * [Prop]: id + * [Desc]: Type of serial transceiver. + * [Note]: SFP:03h / QSFP:0Ch / QSPF+:0Dh /QSFP28:11h + */ + uint8_t id; + + /* [Prop]: connector + * [Desc]: Connector type. + * [Note]: SFP : A0h / 2 + * QSFP: 00h / 130 + */ + uint8_t connector; + + /* [Prop]: transvr_comp + * [Desc]: Transceiver compliance code. + * [Note]: SFP: SFF-8472 + * - Normal : A0h / offset 3-10 + * - Extended: A0h / offset 36 + * QSFP: SFF-8436 & SFF-8636 + * - Normal : 00h / offset 131-138 + * - Extended: 00h / offset 192 + */ + uint8_t transvr_comp[8]; + uint8_t transvr_comp_ext; + + /* [Prop]: vendor_name + * [Desc]: SFP vendor name (ASCII 16 byte char). + * [Note]: ex:FINISAR CORP. + */ + char *vendor_name; + + /* [Prop]: vendor_pn + * [Desc]: Part number provided by SFP vendor (ASCII 16 byte char). + * [Note]: + */ + char *vendor_pn; + + /* [Prop]: vendor_rev + * [Desc]: Revision level for part number provided by vendor (ASCII 4 byte char). + * [Note]: + */ + char *vendor_rev; + + /* [Prop]: vendor_sn + * [Desc]: Serial number provided by vendor (ASCII 16 byte char). + * [Note]: + */ + char *vendor_sn; + + /* [Prop]: Extended identifier + * [Desc]: SFP: + * => None + * + * QSFP: + * => This byte contained two information: + * (1) Power consumption class + * (2) CDR function present + * [Note]: Bit description as below: + * [SFP] + * None + * + * [QSFP] + * (1) Power consumption class: + * Class 1: 1.5W (Bit6-7 = 00:) + * Class 2: 2.0W (Bit6-7 = 01:) + * Class 3: 2.5W (Bit6-7 = 10:) + * Class 4: 3.5W (Bit6-7 = 11:) + * Class 5: 4.0W (Bit0-1 = 01:) + * Class 6: 4.5W (Bit0-1 = 10:) + * Class 7: 5.0W (Bit0-1 = 11:) + * (2) CDR function present: + * Bit2: 0 = No CDR in RX + * 1 = CDR present in RX + * Bit3: 0 = No CDR in TX + * 1 = CDR present in TX + */ + uint8_t ext_id; + + /* [Prop]: br + * [Desc]: Nominal bit rate, units of 100 MBits/sec. + * [Note]: SFP:03h / QSFP:0Ch / QSPF+:0Dh + * has val: 0x67 + * no val : + */ + uint8_t br; + + /* [Prop]: extbr + * [Desc]: Extended br (00h/222) + * [Desc]: Nominal bit rate per channel, units of 250 Mbps. + * Complements. Byte 140. See Table 32A. + */ + uint8_t extbr; + + /* [Prop]: len_sm + * [Desc]: Length (single mode)-(100's)m + * [Note]: This value specifies the link length that is supported by the transceiver + * while operating in compliance with the applicable standards using single mode + * fiber. The value is in units of 100 meters. A value of 255 means that the + * transceiver supports a link length greater than 25.4 km. A value of zero means + * that the transceiver does not support single mode fiber or that the length + * information must be determined from the transceiver technology. + */ + int len_sm; + + /* [Prop]: len_smf + * [Desc]: Length (single mode)-km + * [Note]: Addition to EEPROM data from original GBIC definition. This value specifies + * the link length that is supported by the transceiver while operating in + * compliance with the applicable standards using single mode fiber. The value + * is in units of kilometers. A value of 255 means that the transceiver supports + * a link length greater than 254 km. A value of zero means that the transceiver + * does not support single mode fiber or that the length information must be + * determined from the transceiver technology. + */ + int len_smf; + + /* [Prop]: len_om1 + * [Desc]: Link length supported for 62.5 um OM1 fiber, units of 10 m + * [Note]: The value is in units of 10 meters. A value of 255 means that the + * transceiver supports a link length greater than 2.54 km. A value of + * zero means that the transceiver does not support 50 micron multi-mode + * fiber or that the length information must be determined from the transceiver + * technology. + */ + int len_om1; + + /* [Prop]: len_om2 + * [Desc]: Link length supported for 50 um OM2 fiber, units of 10 m + * [Note]: The value is in units of 10 meters. A value of 255 means that the + * transceiver supports a link length greater than 2.54 km. A value of + * zero means that the transceiver does not support 50 micron multi-mode + * fiber or that the length information must be determined from the transceiver + * technology. + */ + int len_om2; + + /* [Prop]: len_om3 + * [Desc]: Length (50um, OM3) + * [Note]: This value specifies link length that is supported by the transceiver while + * operating in compliance with applicable standards using 50 micron multimode + * OM3 [2000 MHz*km] fiber. The value is in units of 10 meters. A value of 255 + * means that the transceiver supports a link length greater than 2.54 km. A value + * of zero means that the transceiver does not support 50 micron multimode fiber + * or that the length information must be determined from the transceiver technology. + */ + int len_om3; + + /* [Prop]: len_om4 + * [Desc]: Length (50um, OM4) and Length (Active Cable or Copper) + * [Note]: For optical links, this value specifies link length that is supported by the + * transceiver while operating in compliance with applicable standards using 50 micron + * multimode OM4 [4700 MHz*km] fiber. The value is in units of 10 meters. A value of + * 255 means that the transceiver supports a link length greater than 2.54 km. A value + * of zero means that the transceiver does not support 50 micron multimode fiber or that + * the length information must be determined from the transceiver codes specified in Table 5-3. + * + * For copper links, this value specifies minimum link length supported by the transceiver + * while operating in compliance with applicable standards using copper cable. For active + * cable, this value represents actual length. The value is in units of 1 meter. A value of 255 + * means the transceiver supports a link length greater than 254 meters. A value of zero means + * the transceiver does not support copper or active cables or the length information must be + * determined from transceiver technology. Further information about cable design, equalization, + * and connectors is usually required to guarantee meeting a particular length requirement. + */ + int len_om4; + + /* [Prop]: comp_rev + * [Desc]: SFF spec revision compliance + * [Note]: Indicates which revision of SFF SFF-8472 (SFP) / SFF-8636 (QSFP) the transceiver + * complies with. (unsigned integer) + */ + uint8_t comp_rev; + + /* [Prop]: CDR + * [Desc]: For transceivers with CDR capability, setting the CDR to ON engages the internal + * retiming function. Setting the CDR to OFF enables an internal bypassing mode ,which + * directs traffic around the internal CDR. (Reference: SFF-8636) + * [Note]: value=0xff: ON. + * value=0x00: OFF. + */ + uint8_t cdr; + + /* [Prop]: rate_id + * [Desc]: Soft Rate Select 0(RX). + * [Note]: 1. Addr: A0h / Offset: 13 + * 2. Value description: + * 00h Unspecified + * 01h SFF-8079 (4/2/1G Rate_Select & AS0/AS1) + * 02h SFF-8431 (8/4/2G Rx Rate_Select only) + * 03h Unspecified * + * 04h SFF-8431 (8/4/2G Tx Rate_Select only) + * 05h Unspecified * + * 06h SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) + * 07h Unspecified * + * 08h FC-PI-5 (16/8/4G Rx Rate_select only) High=16G only, Low=8G/4G + * 09h Unspecified * + * 0Ah FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select) High=16G only, + * Low=8G/4G + * 0Bh Unspecified * + * 0Ch FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select) + * High=32G only, Low = 16G/8G + * 0Dh Unspecified * + * 0Eh 10/8G Rx and Tx Rate_Select controlling the operation or locking + * modes of the internal signal conditioner, retimer or CDR, according + * to the logic table defined in Table 10-2, High Bit Rate + * (10G) =9.95-11.3 Gb/s; Low Bit Rate (8G) = 8.5 Gb/s. In this mode, + * the default value of bit 110.3 (Soft Rate Select RS(0), Table 9-11) + * and of bit 118.3 (Soft Rate Select RS(1), Table 10-1) is 1. + * 0Fh Unspecified * + * 10h-FFh Unallocated + */ + int rate_id; + + /* [Prop]: soft_rs0 + * [Desc]: Soft Rate Select 0(RX). + * [Note]: 1. Writing '1' selects full bandwidth operation. + * 2. This bit is "OR'd with the hard Rate_Select, AS(0) or RS(0) pin value. + * 3. Default at power up is logic zero/low + * 4. Addr: A2h / Offset: 110 / Bit: 3 + */ + uint8_t soft_rs0; + + /* [Prop]: soft_rs1 + * [Desc]: Soft Rate Select 1(TX). + * [Note]: 1. Writing '1' selects full bandwidth TX operation. + * 2. This bit is "OR'd with the hard Rate_Select, AS(1) or RS(1) pin value. + * 3. Default at power up is logic zero/low + * 4. Addr: A2h / Offset: 118 / Bit: 3 + */ + uint8_t soft_rs1; + + /* [Prop]: diag_type + * [Desc]: DIAGNOSTIC MONITORING TYPE (A0h/92) + * [Note]: Description in SFF-8472 as below: + * Bit7: Reserved for legacy diagnostic implementations. Must be '0' for compliance + * with this document. + * Bit6: Digital diagnostic monitoring implemented (described in this document). + * Must be '1' for compliance with this document. + * Bit5 Internally calibrated + * Bit4 Externally calibrated + * Bit3 Received power measurement type.0 = OMA, 1 = average power + * Bit2 Address change required see section above, "addressing modes" + * Bit1-0 Unallocated + */ + uint8_t diag_type; + + /* [Prop]: curr_temp + * [Desc]: Transceiver Current Temperature (A2h/96-97) + * [Note]: 1. Dependent on diag_type. + * 2. 96: High byte + * 3. 97: Low byte + * 4. This feature only for SFP + */ + uint8_t curr_temp[2]; + + /* [Prop]: curr_vol + * [Desc]: Transceiver Current Voltage (SFP:A2h/108-109; QSFP:00h/22-23) + * [Note]: 1. Dependent on diag_type. + * 2. 98: High byte + * 3. 99: Low byte + * 4. This feature only for SFP + * 5. Internally measured transceiver supply voltage. Represented + * as a 16 bit unsigned integer with the voltage defined as the + * full 16 bit value (0-65535) with LSB equal to 100 uVolt, + * yielding a total range of 0 to +6.55 Volts + */ + uint8_t curr_voltage[2]; + + /* [Prop]: curr_tx_bias + * [Desc]: Transceiver TX Bias Current (SFP:A2h/100-101; QSFP:00h/26-27) + * [Note]: 1. Dependent on diag_type. + * 2. 100: High byte + * 3. 101: Low byte + * 4. This feature only for SFP + * 5. Measured TX bias current in uA. Represented as a 16 bit unsigned + * integer with the current defined as the full 16 bit value (0-65535) + * with LSB equal to 2 uA, yielding a total range of 0 to 131 mA. + * Accuracy is vendor specific but must be better than 10% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. + */ + uint8_t curr_tx_bias[8]; + + /* [Prop]: curr_tx_power + * [Desc]: Transceiver TX Output Power (A2h/102-103) + * [Note]: 1. Dependent on diag_type. + * 2. 102: High byte + * 3. 103: Low byte + * 4. This feature only for SFP + * 5. Measured TX output power in mW. Represented as a 16 bit unsigned + * integer with the power defined as the full 16 bit value (0-65535) + * with LSB equal to 0.1 uW, yielding a total range of 0 to 6.5535 mW + * (~ -40 to +8.2 dBm). Data is assumed to be based on measurement of + * laser monitor photodiode current. It is factory calibrated to absolute + * units using the most representative fiber output type. Accuracy is + * vendor specific but must be better than 3dB over specified temperature + * and voltage. Data is not valid when the transmitter is disabled. + */ + uint8_t curr_tx_power[8]; + + /* [Prop]: curr_tx_power + * [Desc]: Transceiver TX Output Power (A2h/102-103) + * [Note]: 1. Dependent on diag_type. + * 2. 102: High byte + * 3. 103: Low byte + * 4. This feature only for SFP + * 5. Measured RX received optical power in mW. Value can represent either + * average received power or OMA depending upon how bit 3 of byte 92 (A0h) + * is set. Represented as a 16 bit unsigned integer with the power defined + * as the full 16 bit value (0-65535) with LSB equal to 0.1 uW, yielding a + * total range of 0 to 6.5535 mW (~ -40 to +8.2 dBm). Absolute accuracy is + * dependent upon the exact optical wavelength. For the vendor specified + * wavelength, accuracy shall be better than 3dB over specified temperature + * and voltage. + */ + uint8_t curr_rx_power[8]; + + /* [Prop]: wavelength + * [Desc]: Wavelength or Copper Cable Attenuation + * [Note]: (Following is info from SFF-8636) + * For optical free side devices, this parameter identifies the nominal + * transmitter output wavelength at room temperature. This parameter is a + * 16-bit hex value with Byte 186 as high order byte and Byte 187 as low + * order byte. The laser wavelength is equal to the 16-bit integer value + * divided by 20 in nm (units of 0.05 nm). This resolution should be adequate + * to cover all relevant wavelengths yet provide enough resolution for all + * expected DWDM applications. For accurate representation of controlled + * wavelength applications, this value should represent the center of the + * guaranteed wavelength range. If the free side device is identified as + * copper cable these registers will be used to define the cable attenuation. + * An indication of 0 dB attenuation refers to the case where the attenuation + * is not known or is unavailable. + * Byte 186 (00-FFh) is the copper cable attenuation at 2.5 GHz in units of 1 dB. + * Byte 187 (00-FFh) is the copper cable attenuation at 5.0 GHz in units of 1 dB. + */ + uint8_t wavelength[2]; + + /* [Prop]: Amplitude control + * [Desc]: Amplitude control + * [Note]: QSFP28 => SFF-8636 03H Byte-238/239 + */ + uint8_t rx_am[2]; + + /* [Prop]: Emphasis control + * [Desc]: Emphasis control + * [Note]: SFP+/28 => SFF-8472 A2H Byte-115 + * QSFP28 => SFF-8636 03H Byte-236/237 + */ + uint8_t rx_em[2]; + + /* [Prop]: Soft Rx LOS + * [Desc]: Soft Rx LOS which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 3: + * - Bit 0: L-Rx1 LOS + * - Bit 1: L-Rx2 LOS + * - Bit 2: L-Rx3 LOS + * - Bit 3: L-Rx4 LOS + */ + uint8_t rx_los; + + /* [Prop]: Soft Tx Disable + * [Desc]: Soft Tx Disable which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 86: + * - Bit 0: Tx1 Disable + * - Bit 1: Tx2 Disable + * - Bit 2: Tx3 Disable + * - Bit 3: Tx4 Disable + */ + uint8_t tx_disable; + + /* [Prop]: Soft Tx Fault + * [Desc]: Soft Tx Fault which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 86: + * - Bit 0: Tx1 Fault + * - Bit 1: Tx2 Fault + * - Bit 2: Tx3 Fault + * - Bit 3: Tx4 Fault + */ + uint8_t tx_fault; + + /* [Prop]: Transceiver EQUALIZATION + * [Desc]: Transceiver EQUALIZATION + * [Note]: SFP+/28 => SFF-8472 A2H Byte-114 + * QSFP28 => SFF-8636 03H Byte-234/235 + */ + uint8_t tx_eq[2]; + + /* [Prop]: OPTION VALUES + * [Desc]: The bits in the option field shall specify the options implemented in the transceiver. + * [Note]: SFP+/28 => SFF-8472 A0H Byte-64/65 + * QSFP+/28 => SFF-8636 00H Byte-193/195 + */ + uint8_t option[3]; + + /* [Prop]: External PHY offset + * [Desc]: It needs to be setup first if you want to access transceiver external phy. + * [Note]: This feature dependent on transceiver. + * Currently, only 1G-RJ45 transceiver supported it. + */ + uint8_t extphy_offset; + + /* ========== Object private property ========== + */ + struct device *transvr_dev_p; + struct eeprom_map_s *eeprom_map_p; + struct i2c_client *i2c_client_p; + struct ioexp_obj_s *ioexp_obj_p; + struct transvr_worker_s *worker_p; + struct mutex lock; + char swp_name[32]; + int auto_config; + int auto_tx_disable; + int chan_id; + int chipset_type; + int curr_page; + int info; + int ioexp_virt_offset; + int lane_id[8]; + int layout; + int mode; + int retry; + int state; + int temp; + int type; + + /* ========== Object public functions ========== + */ + int (*get_id)(struct transvr_obj_s *self); + int (*get_ext_id)(struct transvr_obj_s *self); + int (*get_connector)(struct transvr_obj_s *self); + int (*get_vendor_name)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_pn)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_rev)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_sn)(struct transvr_obj_s *self, char *buf_p); + int (*get_power_cls)(struct transvr_obj_s *self); + int (*get_br)(struct transvr_obj_s *self); + int (*get_len_sm)(struct transvr_obj_s *self); + int (*get_len_smf)(struct transvr_obj_s *self); + int (*get_len_om1)(struct transvr_obj_s *self); + int (*get_len_om2)(struct transvr_obj_s *self); + int (*get_len_om3)(struct transvr_obj_s *self); + int (*get_len_om4)(struct transvr_obj_s *self); + int (*get_comp_rev)(struct transvr_obj_s *self); + int (*get_comp_eth_1)(struct transvr_obj_s *self); + int (*get_comp_eth_10)(struct transvr_obj_s *self); + int (*get_comp_eth_10_40)(struct transvr_obj_s *self); + int (*get_comp_extend)(struct transvr_obj_s *self); + int (*get_cdr)(struct transvr_obj_s *self); + int (*get_rate_id)(struct transvr_obj_s *self); + int (*get_soft_rs0)(struct transvr_obj_s *self); + int (*get_soft_rs1)(struct transvr_obj_s *self); + int (*get_info)(struct transvr_obj_s *self); + int (*get_if_type)(struct transvr_obj_s *self, char *buf_p); + int (*get_if_speed)(struct transvr_obj_s *self, char *buf_p); + int (*get_if_lane)(struct transvr_obj_s *self, char *buf_p); + int (*get_curr_temp)(struct transvr_obj_s *self, char *buf_p); + int (*get_curr_vol)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_rx_los)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_tx_disable)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_tx_fault)(struct transvr_obj_s *self, char *buf_p); + int (*get_auto_tx_disable)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_bias)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_power)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_power)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_eq)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_am)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_em)(struct transvr_obj_s *self, char *buf_p); + int (*get_wavelength)(struct transvr_obj_s *self, char *buf_p); + int (*get_extphy_offset)(struct transvr_obj_s *self, char *buf_p); + int (*get_extphy_reg)(struct transvr_obj_s *self, char *buf_p); + int (*set_cdr)(struct transvr_obj_s *self, int input_val); + int (*set_soft_rs0)(struct transvr_obj_s *self, int input_val); + int (*set_soft_rs1)(struct transvr_obj_s *self, int input_val); + int (*set_soft_tx_disable)(struct transvr_obj_s *self, int input_val); + int (*set_auto_tx_disable)(struct transvr_obj_s *self, int input_val); + int (*set_tx_eq)(struct transvr_obj_s *self, int input_val); + int (*set_rx_am)(struct transvr_obj_s *self, int input_val); + int (*set_rx_em)(struct transvr_obj_s *self, int input_val); + int (*set_extphy_offset)(struct transvr_obj_s *self, int input_val); + int (*set_extphy_reg)(struct transvr_obj_s *self, int input_val); + + /* ========== Object private functions ========== + */ + int (*init)(struct transvr_obj_s *self); + int (*clean)(struct transvr_obj_s *self); + int (*check)(struct transvr_obj_s *self); + int (*update_all)(struct transvr_obj_s *self, int show_err); + int (*fsm_4_direct)(struct transvr_obj_s* self, char *caller_name); + int (*fsm_4_polling)(struct transvr_obj_s* self, char *caller_name); + int (*send_uevent)(struct transvr_obj_s* self, enum kobject_action u_action); + int (*dump_all)(struct transvr_obj_s* self); +}; + + +/* For AVL Mapping */ +struct transvr_avl_s { + char vendor_name[32]; + char vendor_pn[32]; + int (*init)(struct transvr_obj_s *self); +}; + + +/* Worker for long term task of transceiver */ +struct transvr_worker_s { + /* Task Parameter */ + struct transvr_obj_s *transvr_p; + struct transvr_worker_s *next_p; + struct transvr_worker_s *pre_p; + unsigned long trigger_time; + char func_name[64]; + int retry; + int state; + + /* Task private data */ + void *p_data; + + /* Call back function */ + int (*main_task)(struct transvr_worker_s *task); + int (*post_task)(struct transvr_worker_s *task); +}; + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode); + +void lock_transvr_obj(struct transvr_obj_s *self); +void unlock_transvr_obj(struct transvr_obj_s *self); +int isolate_transvr_obj(struct transvr_obj_s *self); + +int resync_channel_tier_2(struct transvr_obj_s *self); + +void alarm_msg_2_user(struct transvr_obj_s *self, char *emsg); + +#endif /* TRANSCEIVER_H */ + + + + + + + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/service/sonic-platform-netberg-aurora-610.service b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/service/sonic-platform-netberg-aurora-610.service new file mode 100644 index 000000000000..98fcfbe42371 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/service/sonic-platform-netberg-aurora-610.service @@ -0,0 +1,17 @@ +[Unit] +Documentation=man:systemd-sysv-generator(8) +SourcePath=/etc/init.d/sonic-platform-netberg-aurora-610 +Description=LSB: Setup Netberg Aurora 610 + +[Service] +Restart=no +TimeoutSec=1min + +ExecStart=/etc/init.d/sonic-platform-netberg-aurora-610 start +ExecStop=/etc/init.d/sonic-platform-netberg-aurora-610 stop + + +[Install] +Alias=sonic-platform-netberg-aurora-610.target +WantedBy=multi-user.target + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/setup.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/setup.py new file mode 100644 index 000000000000..b1b15af521b6 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/setup.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import os +from setuptools import setup +os.listdir + +setup( + name='sonic_platform', + version='1.0', + description='Netberg Aurora 610 sonic platform API', + + packages=['sonic_platform'], + package_dir={'sonic_platform': 'sonic_platform'}, + + classifiers=[ + 'Development Status :: 3 - Beta', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3.7', + 'Topic :: Utilities', + ], +) diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/__init__.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/__init__.py new file mode 100644 index 000000000000..d5f19f74f4c6 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp'] +from . import platform diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/chassis.py new file mode 100644 index 000000000000..902b288b1aff --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/chassis.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python +# +# Name: chassis.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + +try: + import re + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.eeprom import Eeprom + from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.psu import Psu + from sonic_platform.sfp import Sfp + from sonic_platform.qsfp import QSfp + from sonic_platform.thermal import Thermal + from sonic_platform.component import Component + from sonic_platform.watchdog import Watchdog + from sonic_platform.event_monitor import EventMonitor +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +monitor = None + + +class Chassis(ChassisBase): + + __num_of_fans = 4 + __num_of_psus = 2 + __num_of_sfps = 56 + __start_of_qsfp = 48 + __num_of_thermals = 15 + __num_of_components = 4 + + def __init__(self): + ChassisBase.__init__(self) + + # Initialize EEPROM + self._eeprom = Eeprom() + self._eeprom_data = self._eeprom.get_eeprom_data() + + # Initialize FAN + for index in range(self.__num_of_fans): + fandrawer = FanDrawer(index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + # Initialize PSU + for index in range(self.__num_of_psus): + psu = Psu(index) + self._psu_list.append(psu) + + # Initialize SFP + for index in range(self.__num_of_sfps): + if index < self.__start_of_qsfp: + sfp = Sfp(index) + else: + sfp = QSfp(index) + self._sfp_list.append(sfp) + + # Initialize THERMAL + for index in range(self.__num_of_thermals): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + # Initialize COMPONENT + for index in range(self.__num_of_components): + component = Component(index) + self._component_list.append(component) + + # Initialize WATCHDOG + self._watchdog = Watchdog() + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + +############################################## +# Device methods +############################################## + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + return self._eeprom.modelstr() + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + return self._eeprom.part_number_str() + + def get_serial(self): + """ + Retrieves the serial number of the chassis + Returns: + string: Serial number of chassis + """ + return self._eeprom.serial_number_str() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + +############################################## +# Chassis methods +############################################## + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.base_mac_addr(self._eeprom_data) + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.serial_number_str(self._eeprom_data) + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + Ex. { '0x21':'AG9064', '0x22':'V1.0', '0x23':'AG9064-0109867821', + '0x24':'001c0f000fcd0a', '0x25':'02/03/2018 16:22:00', + '0x26':'01', '0x27':'REV01', '0x28':'AG9064-C2358-16G'} + """ + return self._eeprom.system_eeprom_info() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + description = 'None' + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + + reboot_cause_path = PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + prev_reboot_cause_path = PMON_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE + + sw_reboot_cause = self.__read_txt_file(reboot_cause_path) or "Unknown" + prev_sw_reboot_cause = self.__read_txt_file( + prev_reboot_cause_path) or "Unknown" + + if sw_reboot_cause == "Unknown" and prev_sw_reboot_cause in ("Unknown", self.REBOOT_CAUSE_POWER_LOSS): + reboot_cause = self.REBOOT_CAUSE_POWER_LOSS + description = prev_sw_reboot_cause + elif sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + elif prev_reboot_cause_path != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = prev_sw_reboot_cause + + return (reboot_cause, description) + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - True if call successful, False if not; + - A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, + where device_id is the device ID for this device and + device_event, + status='1' represents device inserted, + status='0' represents device removed. + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}} + indicates that fan 0 has been removed, fan 2 + has been inserted and sfp 11 has been removed. + """ + global monitor + port_dict = {} + while True: + with EventMonitor(timeout) as monitor: + while True: + event = monitor.get_events() + + if not bool(event): + return True, {'sfp': port_dict} + else: + if event['SUBSYSTEM'] == 'swps': + portname = event['DEVPATH'].split("/")[-1] + rc = re.match(r"port(?P\d+)", portname) + if rc is not None: + if event['ACTION'] == "remove": + remove_num = int(rc.group("num")) + port_dict[remove_num] = "0" + elif event['ACTION'] == "add": + add_num = int(rc.group("num")) + port_dict[add_num] = "1" + return True, {'sfp': port_dict} + return False, {'sfp': port_dict} + else: + pass diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/component.py new file mode 100644 index 000000000000..f2dfeb54f0d2 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/component.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python + +try: + import os + import re + import logging + from subprocess import Popen, PIPE + from sonic_platform_base.component_base import ComponentBase + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +OS_SYSTEM_SUCCESS = 0 + +CPLD_INFO_PATH = "/sys/bus/i2c/devices/0-0077/info" +BIOS_VER_PATH = "/sys/class/dmi/id/bios_version" +BIOS_CS_PATH = "/sys/bus/i2c/devices/0-0077/bios_cs" + +CPLD_INDEX = 0 +BMC_INDEX = 1 +MAIN_BIOS_INDEX = 2 +BACKUP_BIOS_INDEX = 3 + + +COMPONENT_NAME_LIST = [ + "CPLD", + "BMC", + "Main BIOS", + "Backup BIOS", +] + +COMPONENT_DESC_LIST = [ + "Platform management and LED", + "Baseboard management controller", + "Main BIOS", + "Backup BIOS", +] + + +FW_INSTALL_CMD_LIST = [ + "/usr/share/sonic/platform/plugins/cpld -b 1 -s 0x60 {}", + "/usr/share/sonic/platform/plugins/Yafuflash -cd {} -img-select 3 -non-interactive", + "/usr/share/sonic/platform/plugins/afulnx_64 {} /B /P /N /K", + "/usr/share/sonic/platform/plugins/afulnx_64 {} /B /P /N /K", +] + +BIOS_ID_MAPPING_TABLE = { + 0: MAIN_BIOS_INDEX, + 1: BACKUP_BIOS_INDEX +} + + +class Component(ComponentBase): + + def __get_attr_value(self, attr_path): + + retval = 'ERR' + if not os.path.isfile(attr_path): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open file: %s", attr_path) + + retval = retval.rstrip(' \t\n\r') + return retval + + def __set_attr_value(self, attr_path, value): + try: + with open(attr_path, 'r+') as reg_file: + reg_file.write(value) + except IOError as e: + logging.error("Error: unable to open file: %s", str(e)) + return False + + return True + + def __get_current_bios(self): + current_bios = self.__get_attr_value(BIOS_CS_PATH) + if current_bios != 'ERR': + # Get first char to convert to bios ID + current_bios = int(current_bios[:1]) + else: + current_bios = None + + return current_bios + + def __get_cpld_version(self): + ''' + The info output would be like: + The CPLD release date is 06/13/2019. + The PCB version is 5 + The CPLD version is 1.1 + ''' + cpld_version = None + ret_str = None + path = None + target = "The CPLD version is " + + if self.index == CPLD_INDEX: + path = CPLD_INFO_PATH + else: + logging.error("Unable support index %d", self.index) + + if path is not None: + try: + with open(path, 'r') as file: + ret_str = file.read() + except Exception as error: + logging.error("Unable to open file %s", path) + + if ret_str is not None: + start_idx = ret_str.find(target) + if start_idx > 0: + start_idx = start_idx+len(target) + offset = ret_str[start_idx:].find('\n') + if offset > 0: + end_idx = start_idx+offset + cpld_version = ret_str[start_idx:end_idx].strip('\n') + + if cpld_version is None: + logging.error("Unable to parse cpld info %d", self.index) + + return cpld_version + + def __get_bmc_version(self): + bmc_version = "N/A" + + output = Popen(["ipmitool", "mc", "info"], stdout=PIPE, encoding='utf8') + ret_str = output.communicate(timeout=5)[0] + + ret_search = re.search("Firmware Revision\s+:\s(.*)\n", ret_str, re.M) + + if ret_search: + bmc_version = ret_search.group(1) + + return bmc_version + + def __get_bios_version(self): + bios_version = None + current_bios_id = self.__get_current_bios() + + if current_bios_id is not None: + if self.index == BIOS_ID_MAPPING_TABLE[current_bios_id]: + try: + with open(BIOS_VER_PATH, 'r') as file: + bios_version = file.read().strip('\n') + except Exception as error: + logging.error("Unable to open file %s", BIOS_VER_PATH) + else: + logging.error( + "Only support bios version of current running BIOS") + bios_version = "N/A" + + return bios_version + + def __install_cpld_firmware(self, image_path): + result = False + cmd = FW_INSTALL_CMD_LIST[self.index].format(image_path) + + ret = os.system(cmd) + if ret == OS_SYSTEM_SUCCESS: + result = True + + return result + + def __install_bmc_firmware(self, image_path): + result = False + cmd = FW_INSTALL_CMD_LIST[self.index].format(image_path) + + ret = os.system(cmd) + if ret == OS_SYSTEM_SUCCESS: + result = True + return result + + def __install_bios_firmware(self, image_path): + result = False + temp_bios_id = None + current_bios_id = self.__get_current_bios() + + if current_bios_id == 0: + temp_bios_id = 1 + elif current_bios_id == 1: + temp_bios_id = 0 + else: + #If current BIOS ID illegal, treat as None + logging.error("Cannot get correct bios id") + current_bios_id = None + + if (current_bios_id is not None) and (temp_bios_id is not None): + ret = True + if self.index == BIOS_ID_MAPPING_TABLE[current_bios_id]: + pass + elif self.index == BIOS_ID_MAPPING_TABLE[temp_bios_id]: + ret = self.__set_attr_value(BIOS_CS_PATH, str(temp_bios_id)) + else: + logging.error("Not support BIOS index %d", self.index) + + if ret: + cmd = FW_INSTALL_CMD_LIST[self.index].format(image_path) + ret = os.system(cmd) + if ret == OS_SYSTEM_SUCCESS: + result = True + else: + logging.error("Bios Firmware upgrade fail") + else: + logging.error("Set BIOS ID fail") + + if self.index == BIOS_ID_MAPPING_TABLE[temp_bios_id]: + # Write back current_bios no matter what + self.__set_attr_value(BIOS_CS_PATH, str(current_bios_id)) + + return result + + __get_version_callback_list = { + CPLD_INDEX: __get_cpld_version, + BMC_INDEX: __get_bmc_version, + MAIN_BIOS_INDEX: __get_bios_version, + BACKUP_BIOS_INDEX: __get_bios_version, + } + + __install_firmware_callback_list = { + CPLD_INDEX: __install_cpld_firmware, + BMC_INDEX: __install_bmc_firmware, + MAIN_BIOS_INDEX: __install_bios_firmware, + BACKUP_BIOS_INDEX: __install_bios_firmware, + } + + def __init__(self, component_index): + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_NAME_LIST[self.index] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_DESC_LIST[self.index] + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + Returns: + A string containing the firmware version of the component + """ + return self.__get_version_callback_list[self.index](self) + + def install_firmware(self, image_path): + """ + Installs firmware to the component + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install was successful, False if not + """ + return self.__install_firmware_callback_list[self.index](self, image_path) diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/eeprom.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/eeprom.py new file mode 100644 index 000000000000..df94f5282b4d --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/eeprom.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +try: + import sys + import re + if sys.version_info.major == 3: + from io import StringIO + else: + from cStringIO import StringIO + # from sonic_platform_base.sonic_eeprom import eeprom_dts + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0053/eeprom" + super(Eeprom, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + match = re.search( + r'(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + _eeprom_info_dict[idx] = value + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status < 'ok': + return {} + + data = self.read_eeprom() + if data is None: + return 0 + + self.decode_eeprom(data) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + is_valid = self.is_checksum_valid(data) + if not is_valid: + return {} + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def serial_number_str(self): + """ + Returns the serial number + """ + return self._eeprom.get('0x23', "Undefined.") + + def base_mac_addr(self, ee): + """ + Returns the base mac address found in the system EEPROM + """ + return self._eeprom.get('0x24', "Undefined.") + + def modelstr(self): + """ + Returns the Model name + """ + return self._eeprom.get('0x28', "Undefined.") + + def part_number_str(self): + """ + Returns the part number + """ + return self._eeprom.get('0x22', "Undefined.") + + def revision_str(self): + """ + Returns the device revision + """ + return self._eeprom.get('0x26', "Undefined.") + + def serial_str(self): + return self._eeprom.get('0x2F', "Undefined.") + + def system_eeprom_info(self): + """ + Returns a dictionary, where keys are the type code defined in + ONIE EEPROM format and values are their corresponding values + found in the system EEPROM. + """ + return self._eeprom + + def get_eeprom_data(self): + return self._eeprom diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/event_monitor.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/event_monitor.py new file mode 100644 index 000000000000..3b966023339e --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/event_monitor.py @@ -0,0 +1,95 @@ +# +# event_monitor.py +# Description: module to minitor events +# + +try: + import socket + from collections import OrderedDict + import os +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +NETLINK_KOBJECT_UEVENT = 15 + + +class EventMonitor: + + def __init__(self, timeout): + self.recieved_events = OrderedDict() + self.socket = socket.socket( + socket.AF_NETLINK, socket.SOCK_DGRAM, NETLINK_KOBJECT_UEVENT) + self.timeout = timeout + + def start(self): + self.socket.bind((os.getpid(), -1)) + + if self.timeout == 0: + self.socket.settimeout(None) + else: + self.socket.settimeout(self.timeout/1000.0) + + def stop(self): + self.socket.close() + + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.stop() + + def __iter__(self): + while True: + for item in self.next_events(): + yield item + + def next_events(self): + try: + data = self.socket.recv(16384) + event = {} + for item in data.split(b'\x00'): + if not item: + # check if we have an event and if we already received it + if event and event['SEQNUM'] not in self.recieved_events: + self.recieved_events[event['SEQNUM']] = None + if len(self.recieved_events) > 100: + self.recieved_events.popitem(last=False) + yield event + event = {} + else: + try: + k, v = item.split(b'=', 1) + event[k.decode('ascii')] = v.decode('ascii') + except ValueError: + pass + except socket.timeout: + yield event + + def get_events(self): + event = {} + while True: + try: + data = self.socket.recv(16384) + + for item in data.split(b'\x00'): + if not item: + # check if we have an event and if we already received it + # if no item and event empty, means received garbled + if bool(event): + if event['SEQNUM'] not in self.recieved_events: + self.recieved_events[event['SEQNUM']] = None + if len(self.recieved_events) > 100: + self.recieved_events.popitem(last=False) + return event + else: + event = {} + else: + try: + k, v = item.split(b'=', 1) + event[k] = v + except ValueError: + pass + except socket.timeout: + return event diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan.py new file mode 100644 index 000000000000..2e88e72d2f31 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan.py @@ -0,0 +1,293 @@ +#!/usr/bin/env python +# +# Name: fan.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + +try: + import logging + import math + import os + from sonic_platform_base.fan_base import FanBase + from sonic_py_common.logger import Logger +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +MAX_SPEED_OF_FAN_FRONT = 23000 +MAX_SPEED_OF_FAN_BACK = 20500 +MAX_SPEED_OF_FAN_PSU = 18100 +MAX_PWM_OF_FAN = 255 + + +class FanConst: + FAN_PSU_START_INDEX = 4 + + +FAN_SYS_FS = "/sys/devices/virtual/hwmon/hwmon1/" +logger = Logger('sonic-platform-fan') + + +class Fan(FanBase): + + __name_of_fans = ['FAN1', 'FAN2', 'FAN3', 'FAN4', 'PSU1_FAN1', 'PSU2_FAN1'] + __start_of_psu_fans = FanConst().FAN_PSU_START_INDEX + __fan_gpi_attr = FAN_SYS_FS + "fan_gpi" + + def __init__(self, index): + self.__index = index + + if self.__index >= self.__start_of_psu_fans: + self.__presence_attr = FAN_SYS_FS + \ + "psu{}".format(self.__index - self.__start_of_psu_fans + 1) + self.__pwm_attr = FAN_SYS_FS + \ + "pwm_psu{}".format(self.__index - self.__start_of_psu_fans + 1) + self.__rpm1_attr = FAN_SYS_FS + \ + "rpm_psu{}".format(self.__index - self.__start_of_psu_fans + 1) + self.__rpm2_attr = FAN_SYS_FS + "" + else: + self.__rpm1_attr = FAN_SYS_FS + \ + "fan{}_input".format(2*self.__index + 1) + self.__rpm2_attr = FAN_SYS_FS + \ + "fan{}_input".format(2*self.__index + 2) + self.__pwm_attr = FAN_SYS_FS + "pwm{}".format(self.__index + 1) + + def __get_attr_value(self, attr_path): + + retval = 'ERR' + if not os.path.isfile(attr_path): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open file: %s", attr_path) + + retval = retval.rstrip(' \t\n\r') + return retval + + +############################################## +# Device methods +############################################## + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return self.__name_of_fans[self.__index] + + def get_presence(self): + """ + Retrieves the presence of the device + + Returns: + bool: True if device is present, False if not + """ + presence = False + + if self.__index >= self.__start_of_psu_fans: + # check fan of psu presence if psu presence + attr_normal = "0 : normal" + attr_unpowered = "2 : unpowered" + attr_path = self.__presence_attr + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if attr_rv == attr_normal or attr_rv == attr_unpowered: + presence = True + else: + raise SyntaxError + else: + attr_path = self.__fan_gpi_attr + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + # B[0-3] installed(0)/uninstalled(1) + if not(int(attr_rv, 16) >> self.__index) & 1: + presence = True + else: + raise SyntaxError + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + raise NotImplementedError + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + raise NotImplementedError + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + status = False + + if self.__index >= self.__start_of_psu_fans: + # check fan of psu presence if psu presence + attr_normal = "0 : normal" + attr_path = self.__presence_attr + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if attr_rv == attr_normal: + status = True + else: + raise SyntaxError + else: + status = self.get_presence() + + return status + +############################################## +# FAN methods +############################################## + + def get_direction(self): + """ + Retrieves the direction of fan + + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + direction = 'N/A' + attr_path = self.__fan_gpi_attr + + if self.__index >= self.__start_of_psu_fans: + raise NotImplementedError + else: + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + # B[4-7] FRtype(0)/RFtype(1) + if not((int(attr_rv, 16) >> self.__index) & 1): + if not((int(attr_rv, 16) >> (self.__index+4)) & 1): + direction = 'FAN_DIRECTION_EXHAUST' + else: + direction = 'FAN_DIRECTION_INTAKE' + else: + raise SyntaxError + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed = 0 + attr_path1 = self.__rpm1_attr + attr_path2 = self.__rpm2_attr + + if self.get_presence() and attr_path1 is not None: + attr_rv1 = self.__get_attr_value(attr_path1) + attr_rv2 = self.__get_attr_value(attr_path2) + if attr_rv1 != 'ERR' and attr_rv2 != 'ERR': + fan1_input = int(attr_rv1) + speed = math.ceil( + float(fan1_input * 100 / MAX_SPEED_OF_FAN_FRONT)) + fan2_input = int(attr_rv2) + speed += math.ceil(float(fan2_input * 100 / + MAX_SPEED_OF_FAN_BACK)) + speed /= 2 + elif attr_rv1 != 'ERR': + fan1_input = int(attr_rv1) + if self.__index >= self.__start_of_psu_fans: + speed = math.ceil( + float(fan1_input * 100 / MAX_SPEED_OF_FAN_PSU)) + else: + speed = math.ceil( + float(fan1_input * 100 / MAX_SPEED_OF_FAN_FRONT)) + elif attr_rv2 != 'ERR': + fan2_input = int(attr_rv2) + speed += math.ceil(float(fan2_input * 100 / + MAX_SPEED_OF_FAN_BACK)) + else: + raise SyntaxError + + return speed + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + speed = 0 + attr_path = self.__pwm_attr + + if self.get_presence() and attr_path is not None: + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + pwm = int(attr_rv) + speed = math.ceil(float(pwm * 100 / MAX_PWM_OF_FAN)) + else: + raise SyntaxError + + return speed + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + raise NotImplementedError + + def set_speed(self, speed): + """ + Sets the fan speed + + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + + Returns: + A boolean, True if speed is set successfully, False if not + """ + raise NotImplementedError + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + + Args: + color: A string representing the color with which to set the + fan module status LED + + Returns: + bool: True if status LED state is set successfully, False if not + """ + raise NotImplementedError + + def get_status_led(self): + """ + Gets the state of the fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + raise NotImplementedError diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan_drawer.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..0cfc3e22323d --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/fan_drawer.py @@ -0,0 +1,22 @@ +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class FanDrawer(FanDrawerBase): + """ Platform-specific Fan class""" + + def __init__(self, fantray_index): + FanDrawerBase.__init__(self) + self.fantrayindex = fantray_index + self._fan_list.append(Fan(fantray_index)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/platform.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/platform.py new file mode 100644 index 000000000000..a2ffe0a47e78 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/platform.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# +# Name: platform.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/psu.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/psu.py new file mode 100644 index 000000000000..0d4aee873660 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/psu.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python +# +# Name: psu.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_py_common.logger import Logger + from sonic_platform.fan import Fan, FanConst +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +VOLTAGE_UPPER_LIMIT = 14 +VOLTAGE_LOWER_LIMIT = 10 + +PSU_SYS_FS = "/sys/devices/virtual/hwmon/hwmon1/device/" +logger = Logger('sonic-platform-psu') + + +class Psu(PsuBase): + + __num_of_fans = 1 + __name_of_psus = ['PSU1', 'PSU2'] + + def __init__(self, index): + self.__index = index + self.__psu_presence_attr = PSU_SYS_FS+"psu{}".format(self.__index + 1) + self.__psu_voltage_out_attr = PSU_SYS_FS + \ + "psoc_psu{}_vout".format(self.__index + 1) + self.__psu_current_out_attr = PSU_SYS_FS + \ + "psoc_psu{}_iout".format(self.__index + 1) + self.__psu_power_out_attr = PSU_SYS_FS + \ + "psoc_psu{}_pout".format(self.__index + 1) + self.__psu_model_attr = PSU_SYS_FS + \ + "psoc_psu{}_vendor".format(self.__index + 1) + self.__psu_serial_attr = PSU_SYS_FS + \ + "psoc_psu{}_serial".format(self.__index + 1) + + # Get the start index of fan list + self.__fan_psu_start_index = self.__index + FanConst().FAN_PSU_START_INDEX + + # Overriding _fan_list class variable defined in PsuBase, to make it unique per Psu object + self._fan_list = [] + + # Initialize FAN + for x in range(self.__fan_psu_start_index, self.__fan_psu_start_index + self.__num_of_fans): + fan = Fan(x) + self._fan_list.append(fan) + + def __get_attr_value(self, filepath): + retval = 'ERR' + + try: + with open(filepath, 'r') as fd: + data = fd.readlines() + return data[0].rstrip('\r\n') + except FileNotFoundError: + logger.log_error(f"File {filepath} not found. Aborting") + except OSError as ex: + logger.log_error("Cannot open - {}: {}".format(filepath, repr(ex))) + + return retval +############################################## +# Device methods +############################################## + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return self.__name_of_psus[self.__index] + + def get_presence(self): + """ + Retrieves the presence of the device + + Returns: + bool: True if device is present, False if not + """ + presence = False + attr_normal = "0 : normal" + attr_unpowered = "2 : unpowered" + attr_path = self.__psu_presence_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if attr_rv in (attr_normal, attr_unpowered): + presence = True + else: + raise SyntaxError + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + model = 'Unknow' + attr_path = self.__psu_model_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if attr_rv != '': + model = attr_rv + else: + raise SyntaxError + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + serial = 'Unknow' + attr_path = self.__psu_serial_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if attr_rv != '': + serial = attr_rv + else: + raise SyntaxError + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + attr_normal = "0 : normal" + attr_path = self.__psu_presence_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + return attr_rv == attr_normal + raise SyntaxError + +############################################## +# PSU methods +############################################## + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + attr_path = self.__psu_voltage_out_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + voltage_out = float(attr_rv) / 1000 + else: + raise SyntaxError + + return voltage_out + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + attr_path = self.__psu_current_out_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + current_out = float(attr_rv) / 1000 + else: + raise SyntaxError + + return current_out + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, e.g. 302.6 + """ + attr_path = self.__psu_power_out_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + power_out = float(attr_rv) / 1000 + else: + raise SyntaxError + + return power_out + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + powergood_status = False + voltage_out = self.get_voltage() + + # Check the voltage out with 12V, plus or minus 20 percentage. + if VOLTAGE_LOWER_LIMIT <= voltage_out <= VOLTAGE_UPPER_LIMIT: + powergood_status = True + + return powergood_status + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + + Args: + color: A string representing the color with which to set the + PSU status LED + + Returns: + bool: True if status LED state is set successfully, False if not + """ + raise NotImplementedError + + def get_status_led(self): + """ + Gets the state of the PSU status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + raise NotImplementedError diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/qsfp.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/qsfp.py new file mode 100644 index 000000000000..0da5af9b39a8 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/qsfp.py @@ -0,0 +1,1127 @@ +#!/usr/bin/env python +# +# Name: qsfp.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + +try: + import os + import logging + from ctypes import create_string_buffer + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +INFO_OFFSET = 128 +THRE_OFFSET = 384 # 128*3 +DOM_OFFSET = 0 + +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 1 + +# Offset for values in QSFP eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNEL_THRESHOLD_OFFSET = 176 +QSFP_CHANNEL_THRESHOLD_WIDTH = 16 + +QSFP_REG_VALUE_ENABLE = "0x1" +QSFP_REG_VALUE_DISABLE = "0x0" + + +class QSfp(SfpBase): + + __platform = "x86_64-netberg_aurora_610-r0" + __hwsku = "aurora-610" + __port_to_i2c_mapping = { + 0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, + 8: 18, 9: 19, 10: 20, 11: 21, 12: 22, 13: 23, 14: 24, 15: 25, + 16: 26, 17: 27, 18: 28, 19: 29, 20: 30, 21: 31, 22: 32, 23: 33, + 24: 34, 25: 35, 26: 36, 27: 37, 28: 38, 29: 39, 30: 40, 31: 41, + 32: 42, 33: 43, 34: 44, 35: 45, 36: 46, 37: 47, 38: 48, 39: 49, + 40: 50, 41: 51, 42: 52, 43: 53, 44: 54, 45: 55, 46: 56, 47: 57, + 48: 59, 49: 58, 50: 61, 51: 60, 52: 63, 53: 62, 54: 65, 55: 64 + } + + def __init__(self, index): + self.__index = index + + self.__port_end = len(self.__port_to_i2c_mapping) - 1 + + self.__presence_attr = None + self.__eeprom_path = None + if self.__index in range(0, self.__port_end + 1): + self.__presence_attr = "/sys/class/swps/port{}/present".format( + self.__index) + self.__lpmode_attr = "/sys/class/swps/port{}/lpmod".format( + self.__index) + self.__reset_attr = "/sys/class/swps/port{}/reset".format( + self.__index) + self.__eeprom_path = "/sys/bus/i2c/devices/{}-0050/eeprom".format( + self.__port_to_i2c_mapping[self.__index]) + + SfpBase.__init__(self) + + def __get_attr_value(self, attr_path): + + retval = 'ERR' + if not os.path.isfile(attr_path): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except FileNotFoundError: + logging.error("File %s not found. Aborting", attr_path) + except (OSError, IOError) as ex: + logging.error("Cannot open - %s: %s", attr_path, repr(ex)) + + retval = retval.rstrip(' \t\n\r') + return retval + + def __set_attr_value(self, attr_path, value): + + try: + with open(attr_path, 'r+') as reg_file: + reg_file.write(value) + except FileNotFoundError: + logging.error("File %s not found. Aborting", attr_path) + return False + except (OSError, IOError) as ex: + logging.error("Cannot open - %s: %s", attr_path, repr(ex)) + return False + + return True + + def __is_host(self): + return os.system("docker > /dev/null 2>&1") == 0 + + def __get_path_to_port_config_file(self): + host_platform_root_path = '/usr/share/sonic/device' + docker_hwsku_path = '/usr/share/sonic/hwsku' + + host_platform_path = "/".join([host_platform_root_path, + self.__platform]) + hwsku_path = "/".join([host_platform_path, self.__hwsku] + ) if self.__is_host() else docker_hwsku_path + + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + eeprom_raw = [] + + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_eeprom_path = self.__eeprom_path + try: + with open(sysfs_eeprom_path, mode="rb", buffering=0) as sysfsfile_eeprom: + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + raw_len = len(raw) + for n in range(0, raw_len): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except FileNotFoundError: + logging.error("File %s not found. Aborting", sysfs_eeprom_path) + return None + except (OSError, IOError) as ex: + logging.error("Cannot open - %s: %s", sysfs_eeprom_path, repr(ex)) + return None + + return eeprom_raw + + def __write_eeprom_specific_bytes(self, offset, buffer): + sysfs_eeprom_path = self.__eeprom_path + + try: + with open(sysfs_eeprom_path, "r+b") as sysfsfile_eeprom: + sysfsfile_eeprom.seek(offset) + sysfsfile_eeprom.write(buffer[0]) + except FileNotFoundError: + logging.error("File %s not found. Aborting", sysfs_eeprom_path) + return False + except (OSError, IOError) as ex: + logging.error("Cannot open - %s: %s", sysfs_eeprom_path, repr(ex)) + return False + + return True + + def __convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + +############################################## +# Device methods +############################################## + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + name = None + + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.__index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the device + + Returns: + bool: True if device is present, False if not + """ + presence = False + attr_path = self.__presence_attr + + attr_rv = self.__get_attr_value(attr_path) + if (attr_rv != 'ERR'): + if (int(attr_rv) == 0): + presence = True + else: + raise SyntaxError + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + model = "N/A" + offset = INFO_OFFSET + sfpi_obj = sff8436InterfaceId() + if not self.get_presence() or not sfpi_obj: + return model + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + model = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + serial = "N/A" + offset = INFO_OFFSET + sfpi_obj = sff8436InterfaceId() + if not self.get_presence() or not sfpi_obj: + return serial + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + serial = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + status = False + tx_fault = self.get_tx_fault() + + if self.get_presence() and tx_fault and not any(tx_fault): + status = True + + return status + +############################################## +# SFP methods +############################################## + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + vendor_rev |1*255VCHAR |vendor version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + transceiver_info_dict_keys = ['type', 'vendor_rev', + 'serial', 'manufacturer', + 'model', 'connector', + 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', + 'cable_length', 'nominal_bit_rate', + 'specification_compliance', 'vendor_date', + 'vendor_oui'] + + qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', 'Length Cable Assembly(m)') + + qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', 'Fibre Channel transmission media', + 'Fibre Channel Speed') + + sfpi_obj = sff8436InterfaceId() + if not self.get_presence() or not sfpi_obj: + return {} + + offset = INFO_OFFSET + + sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_INTFACE_BULK_OFFSET), XCVR_INTFACE_BULK_WIDTH_QSFP) + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( + sfp_interface_bulk_raw, 0) + + sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_vendor_name_raw, 0) + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + + sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_HW_REV_OFFSET), XCVR_HW_REV_WIDTH_QSFP) + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + + sfp_vendor_oui_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( + sfp_vendor_oui_raw, 0) + + sfp_vendor_date_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) + sfp_vendor_date_data = sfpi_obj.parse_vendor_date( + sfp_vendor_date_raw, 0) + + transceiver_info_dict = dict.fromkeys( + transceiver_info_dict_keys, 'N/A') + + if sfp_interface_bulk_data: + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data'][ + 'Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data'][ + 'VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' + + transceiver_info_dict['cable_type'] = "Unknown" + transceiver_info_dict['cable_length'] = "Unknown" + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + compliance_code_dict = dict() + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. + tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. + reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. + lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. + tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. + tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 + | |to channel 3. + temperature |INT |module temperature in Celsius + voltage |INT |supply voltage in mV + txbias |INT |TX Bias Current in mA, n is the channel number, + | |for example, tx2bias stands for tx bias of channel 2. + rxpower |INT |received optical power in mW, n is the channel number, + | |for example, rx2power stands for rx power of channel 2. + txpower |INT |TX output power in mW, n is the channel number, + | |for example, tx2power stands for tx power of channel 2. + ======================================================================== + """ + transceiver_dom_info_dict_keys = ['rx_los', 'tx_fault', + 'reset_status', 'power_lpmode', + 'tx_disable', 'tx_disable_channel', + 'temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power'] + + sfpd_obj = sff8436Dom() + sfpi_obj = sff8436InterfaceId() + + if not self.get_presence() or not sfpi_obj or not sfpd_obj: + return {} + + transceiver_dom_info_dict = dict.fromkeys( + transceiver_dom_info_dict_keys, 'N/A') + offset = DOM_OFFSET + offset_xcvr = INFO_OFFSET + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + else: + return None + + dom_temperature_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature( + dom_temperature_raw, 0) + transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] + + dom_voltage_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] + + qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) + if qsfp_dom_rev_raw is not None: + qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) + qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] + + # The tx_power monitoring is only available on QSFP which compliant with SFF-8636 + # and claimed that it support tx_power with one indicator bit. + dom_channel_monitor_data = {} + dom_channel_monitor_raw = None + qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] + if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + + else: + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_channel_monitor_raw, 0) + transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] + transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] + transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] + transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] + + if dom_channel_monitor_raw: + transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] + transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] + transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] + transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + + for key in transceiver_dom_info_dict: + transceiver_dom_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_info_dict[key]) + + transceiver_dom_info_dict['rx_los'] = self.get_rx_los() + transceiver_dom_info_dict['tx_fault'] = self.get_tx_fault() + transceiver_dom_info_dict['reset_status'] = self.get_reset_status() + transceiver_dom_info_dict['tx_disable'] = self.get_tx_disable() + transceiver_dom_info_dict['tx_disable_channel'] = self.get_tx_disable_channel( + ) + transceiver_dom_info_dict['lp_mode'] = self.get_lpmode() + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] + + sfpd_obj = sff8436Dom() + if not self.get_presence() or not sfpd_obj: + return {} + + transceiver_dom_threshold_dict = dict.fromkeys( + transceiver_dom_threshold_info_dict_keys, 'N/A') + offset = THRE_OFFSET + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw: + module_threshold_values = sfpd_obj.parse_module_threshold_values( + dom_module_threshold_raw, 0) + module_threshold_data = module_threshold_values.get('data') + if module_threshold_data: + transceiver_dom_threshold_dict['temphighalarm'] = module_threshold_data['TempHighAlarm']['value'] + transceiver_dom_threshold_dict['templowalarm'] = module_threshold_data['TempLowAlarm']['value'] + transceiver_dom_threshold_dict['temphighwarning'] = module_threshold_data['TempHighWarning']['value'] + transceiver_dom_threshold_dict['templowwarning'] = module_threshold_data['TempLowWarning']['value'] + transceiver_dom_threshold_dict['vcchighalarm'] = module_threshold_data['VccHighAlarm']['value'] + transceiver_dom_threshold_dict['vcclowalarm'] = module_threshold_data['VccLowAlarm']['value'] + transceiver_dom_threshold_dict['vcchighwarning'] = module_threshold_data['VccHighWarning']['value'] + transceiver_dom_threshold_dict['vcclowwarning'] = module_threshold_data['VccLowWarning']['value'] + + dom_channel_thres_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNEL_THRESHOLD_OFFSET), QSFP_CHANNEL_THRESHOLD_WIDTH) + channel_threshold_values = sfpd_obj.parse_channel_threshold_values( + dom_channel_thres_raw, 0) + channel_threshold_data = channel_threshold_values.get('data') + if channel_threshold_data: + transceiver_dom_threshold_dict['rxpowerhighalarm'] = channel_threshold_data['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_dict['rxpowerlowalarm'] = channel_threshold_data['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_dict['rxpowerhighwarning'] = channel_threshold_data['RxPowerHighWarning']['value'] + transceiver_dom_threshold_dict['rxpowerlowwarning'] = channel_threshold_data['RxPowerLowWarning']['value'] + transceiver_dom_threshold_dict['txpowerhighalarm'] = "0.0dBm" + transceiver_dom_threshold_dict['txpowerlowalarm'] = "0.0dBm" + transceiver_dom_threshold_dict['txpowerhighwarning'] = "0.0dBm" + transceiver_dom_threshold_dict['txpowerlowwarning'] = "0.0dBm" + transceiver_dom_threshold_dict['txbiashighalarm'] = channel_threshold_data['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_dict['txbiaslowalarm'] = channel_threshold_data['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_dict['txbiashighwarning'] = channel_threshold_data['TxBiasHighWarning']['value'] + transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] + + for key in transceiver_dom_threshold_dict: + transceiver_dom_threshold_dict[key] = self.__convert_string_to_num( + transceiver_dom_threshold_dict[key]) + + return transceiver_dom_threshold_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + + Returns: + A Boolean, True if reset enabled, False if disabled + """ + reset_status = False + attr_path = self.__reset_attr + + attr_rv = self.__get_attr_value(attr_path) + if (attr_rv != 'ERR'): + if (int(attr_rv) == 0): + reset_status = True + else: + raise SyntaxError + + return reset_status + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los_list = [] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_RX_LOS_STATUS_OFFSET, QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault_list = [] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + tx_disable = False + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return tx_disable + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + tx_disable_list.append( + dom_control_data['data']['TX1Disable']['value'] == 'On') + tx_disable_list.append( + dom_control_data['data']['TX2Disable']['value'] == 'On') + tx_disable_list.append( + dom_control_data['data']['TX3Disable']['value'] == 'On') + tx_disable_list.append( + dom_control_data['data']['TX4Disable']['value'] == 'On') + tx_disable = tx_disable_list[0] or tx_disable_list[1] or tx_disable_list[2] or tx_disable_list[3] + + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_channel = 0 + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return tx_disable_channel + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX1Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX2Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX3Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX4Disable']['value']) + + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disable_channel |= 1 << i + + return tx_disable_channel + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + lpmode = False + attr_path = self.__lpmode_attr + + attr_rv = self.__get_attr_value(attr_path) + if (attr_rv != 'ERR'): + if (int(attr_rv) == 1): + lpmode = True + else: + raise SyntaxError + + return lpmode + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + power_override = False + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return power_override + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + + return power_override + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + temp = "N/A" + sfpd_obj = sff8436Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return temp + + dom_temperature_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature( + dom_temperature_raw, 0) + temp = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + + return temp + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + voltage = "N/A" + sfpd_obj = sff8436Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return voltage + + dom_voltage_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + + return voltage + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + sfpd_obj = sff8436Dom() + sfpi_obj = sff8436InterfaceId() + offset = DOM_OFFSET + offset_xcvr = INFO_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + else: + return None + + qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) + if qsfp_dom_rev_raw is not None: + qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) + qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] + + dom_channel_monitor_data = {} + dom_channel_monitor_raw = None + qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] + if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + + else: + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_channel_monitor_raw, 0) + + if dom_channel_monitor_raw is not None: + tx_bias_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Bias']['value'])) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + sfpd_obj = sff8436Dom() + sfpi_obj = sff8436InterfaceId() + offset = DOM_OFFSET + offset_xcvr = INFO_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + else: + return None + + qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) + if qsfp_dom_rev_raw is not None: + qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) + qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] + + dom_channel_monitor_data = {} + dom_channel_monitor_raw = None + qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] + if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + + else: + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_channel_monitor_raw, 0) + + if dom_channel_monitor_raw is not None: + rx_power_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX1Power']['value'])) + rx_power_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX2Power']['value'])) + rx_power_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX3Power']['value'])) + rx_power_list.append(self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX4Power']['value'])) + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + sfpd_obj = sff8436Dom() + sfpi_obj = sff8436InterfaceId() + offset = DOM_OFFSET + offset_xcvr = INFO_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + else: + return None + + qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) + if qsfp_dom_rev_raw is not None: + qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) + qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] + + dom_channel_monitor_data = {} + dom_channel_monitor_raw = None + qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] + if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): + pass + + else: + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_channel_monitor_raw, 0) + tx_power_list.append(self._convert_string_to_num( + dom_channel_monitor_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num( + dom_channel_monitor_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num( + dom_channel_monitor_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num( + dom_channel_monitor_data['data']['TX4Power']['value'])) + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + + Returns: + A boolean, True if successful, False if not + """ + + return self.__set_attr_value(self.__reset_attr, QSFP_REG_VALUE_ENABLE) + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + + return self.__write_eeprom_specific_bytes(QSFP_CONTROL_OFFSET, buffer) + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + + Returns: + A boolean, True if successful, False if not + """ + channel_state = self.get_tx_disable_channel() + if disable: + tx_disable_ctl = channel_state | channel + else: + tx_disable_ctl = channel_state & (~channel & 0xf) + + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + + return self.__write_eeprom_specific_bytes(QSFP_CONTROL_OFFSET, buffer) + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + if lpmode is True: + reg_value = QSFP_REG_VALUE_ENABLE + else: + reg_value = QSFP_REG_VALUE_DISABLE + + return self.__set_attr_value(self.__lpmode_attr, reg_value) + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + power_override_bit = 0 + if power_override: + power_override_bit |= 1 << 0 + + power_set_bit = 0 + if power_set: + power_set_bit |= 1 << 1 + + buffer = create_string_buffer(1) + buffer[0] = chr(power_override_bit | power_set_bit) + + return self.__write_eeprom_specific_bytes(QSFP_POWEROVERRIDE_OFFSET, buffer) diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/sfp.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/sfp.py new file mode 100644 index 000000000000..bc26396279ae --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/sfp.py @@ -0,0 +1,924 @@ +#!/usr/bin/env python +# +# Name: thermal.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + + +try: + import os + import logging + from ctypes import create_string_buffer + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom + from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId + from sonic_platform_base.sonic_sfp.sff8472 import sffbase + from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +INFO_OFFSET = 0 +DOM_OFFSET = 256 + +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 1 + + +# Offset for values in QSFP eeprom +SFP_TEMPE_OFFSET = 96 +SFP_TEMPE_WIDTH = 2 +SFP_VOLT_OFFSET = 98 +SFP_VOLT_WIDTH = 2 +SFP_CHANNL_MON_OFFSET = 100 +SFP_CHANNL_MON_WIDTH = 6 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 40 +SFP_CHANNL_THRESHOLD_OFFSET = 112 +SFP_CHANNL_THRESHOLD_WIDTH = 2 +SFP_STATUS_CONTROL_OFFSET = 110 +SFP_STATUS_CONTROL_WIDTH = 1 +SFP_TX_DISABLE_HARD_BIT = 7 +SFP_TX_DISABLE_SOFT_BIT = 6 + + +class Sfp(SfpBase): + + __platform = "x86_64-netberg_aurora_610-r0" + __hwsku = "aurora-610" + + __port_to_i2c_mapping = { + 0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, + 8: 18, 9: 19, 10: 20, 11: 21, 12: 22, 13: 23, 14: 24, 15: 25, + 16: 26, 17: 27, 18: 28, 19: 29, 20: 30, 21: 31, 22: 32, 23: 33, + 24: 34, 25: 35, 26: 36, 27: 37, 28: 38, 29: 39, 30: 40, 31: 41, + 32: 42, 33: 43, 34: 44, 35: 45, 36: 46, 37: 47, 38: 48, 39: 49, + 40: 50, 41: 51, 42: 52, 43: 53, 44: 54, 45: 55, 46: 56, 47: 57, + 48: 59, 49: 58, 50: 61, 51: 60, 52: 63, 53: 62, 54: 65, 55: 64 + } + + def __init__(self, index): + self.__index = index + self.__port_end = len(self.__port_to_i2c_mapping) - 1 + + self.__presence_attr = None + self.__eeprom_path = None + if self.__index in range(0, self.__port_end + 1): + self.__presence_attr = "/sys/class/swps/port{}/present".format( + self.__index) + self.__eeprom_path = "/sys/bus/i2c/devices/{}-0050/eeprom".format( + self.__port_to_i2c_mapping[self.__index]) + + SfpBase.__init__(self) + + def __get_attr_value(self, attr_path): + + retval = 'ERR' + if not os.path.isfile(attr_path): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + + except FileNotFoundError: + logging.error("File %s not found. Aborting", attr_path) + except OSError as ex: + logging.error("Cannot open - %s: %s", attr_path, repr(ex)) + + retval = retval.rstrip(' \t\n\r') + return retval + + def __set_attr_value(self, attr_path, value): + + try: + with open(attr_path, 'r+') as reg_file: + reg_file.write(value) + except IOError as e: + logging.error("Error: unable to open file: '%s'", str(e)) + return False + + return True + + def __is_host(self): + return os.system("docker > /dev/null 2>&1") == 0 + + def __get_path_to_port_config_file(self): + host_platform_root_path = '/usr/share/sonic/device' + docker_hwsku_path = '/usr/share/sonic/hwsku' + + host_platform_path = "/".join([host_platform_root_path, + self.__platform]) + hwsku_path = "/".join([host_platform_path, self.__hwsku] + ) if self.__is_host() else docker_hwsku_path + + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + eeprom_raw = [] + + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_eeprom_path = self.__eeprom_path + try: + with open(sysfs_eeprom_path, mode="rb", buffering=0) as sysfsfile_eeprom: + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + raw_len = len(raw) + for n in range(0, raw_len): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except FileNotFoundError: + logging.error("File %s not found. Aborting", sysfs_eeprom_path) + return None + except OSError as ex: + logging.error("Cannot open - %s: %s", sysfs_eeprom_path, repr(ex)) + return None + + return eeprom_raw + + def __write_eeprom_specific_bytes(self, offset, buffer): + sysfs_eeprom_path = self.__eeprom_path + + try: + with open(sysfs_eeprom_path, "r+b") as sysfsfile_eeprom: + sysfsfile_eeprom.seek(offset) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + logging.error("Error: unable to open file: '%s'", str(e)) + return False + + return True + + def __convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + +############################################## +# Device methods +############################################## + + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + name = None + + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.__index] or "Unknown" + + return name + + def get_presence(self): + """ + Retrieves the presence of the device + + Returns: + bool: True if device is present, False if not + """ + presence = False + attr_path = self.__presence_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + if int(attr_rv) == 0: + presence = True + else: + raise SyntaxError + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + model = "N/A" + offset = INFO_OFFSET + sfpi_obj = sff8472InterfaceId() + if not self.get_presence() or not sfpi_obj: + return model + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + + model = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + serial = "N/A" + offset = INFO_OFFSET + sfpi_obj = sff8472InterfaceId() + if not self.get_presence() or not sfpi_obj: + return serial + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + serial = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + status = False + tx_fault = self.get_tx_fault() + + if self.get_presence() and (tx_fault is False): + status = True + + return status + +############################################## +# SFP methods +############################################## + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + vendor_rev |1*255VCHAR |vendor version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + transceiver_info_dict_keys = ['type', 'vendor_rev', + 'serial', 'manufacturer', + 'model', 'connector', + 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', + 'cable_length', 'nominal_bit_rate', + 'specification_compliance', 'vendor_date', + 'vendor_oui'] + + sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + + sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes', 'FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') + + sfpi_obj = sff8472InterfaceId() + if not self.get_presence() or not sfpi_obj: + return {} + + offset = INFO_OFFSET + + sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_INTFACE_BULK_OFFSET), XCVR_INTFACE_BULK_WIDTH_SFP) + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( + sfp_interface_bulk_raw, 0) + + sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_vendor_name_raw, 0) + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + + sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_HW_REV_OFFSET), XCVR_HW_REV_WIDTH_SFP) + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + + sfp_vendor_oui_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( + sfp_vendor_oui_raw, 0) + + sfp_vendor_date_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) + sfp_vendor_date_data = sfpi_obj.parse_vendor_date( + sfp_vendor_date_raw, 0) + + transceiver_info_dict = dict.fromkeys( + transceiver_info_dict_keys, 'N/A') + + if sfp_interface_bulk_data: + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) + + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data'][ + 'Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data'][ + 'VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' + + transceiver_info_dict['cable_type'] = "Unknown" + transceiver_info_dict['cable_length'] = "Unknown" + for key in sfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + compliance_code_dict = dict() + for key in sfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. + tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. + reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. + lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. + tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. + tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 + | |to channel 3. + temperature |INT |module temperature in Celsius + voltage |INT |supply voltage in mV + txbias |INT |TX Bias Current in mA, n is the channel number, + | |for example, tx2bias stands for tx bias of channel 2. + rxpower |INT |received optical power in mW, n is the channel number, + | |for example, rx2power stands for rx power of channel 2. + txpower |INT |TX output power in mW, n is the channel number, + | |for example, tx2power stands for tx power of channel 2. + ======================================================================== + """ + transceiver_dom_info_dict_keys = ['rx_los', 'tx_fault', + 'reset_status', 'power_lpmode', + 'tx_disable', 'tx_disable_channel', + 'temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power'] + + sfpd_obj = sff8472Dom() + + if not self.get_presence() or not sfpd_obj: + return {} + + eeprom_ifraw = self.__read_eeprom_specific_bytes(0, DOM_OFFSET) + sfpi_obj = sff8472InterfaceId(eeprom_ifraw) + cal_type = sfpi_obj.get_calibration_type() + sfpd_obj._calibration_type = cal_type + + offset = DOM_OFFSET + transceiver_dom_info_dict = dict.fromkeys( + transceiver_dom_info_dict_keys, 'N/A') + + dom_temperature_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) + + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature( + dom_temperature_raw, 0) + transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] + + dom_voltage_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_voltage_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + transceiver_dom_info_dict['tx1power'] = dom_voltage_data['data']['TXPower']['value'] + transceiver_dom_info_dict['rx1power'] = dom_voltage_data['data']['RXPower']['value'] + transceiver_dom_info_dict['tx1bias'] = dom_voltage_data['data']['TXBias']['value'] + + for key in transceiver_dom_info_dict: + transceiver_dom_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_info_dict[key]) + + transceiver_dom_info_dict['reset_status'] = self.get_reset_status() + transceiver_dom_info_dict['rx_los'] = self.get_rx_los() + transceiver_dom_info_dict['tx_fault'] = self.get_tx_fault() + transceiver_dom_info_dict['tx_disable'] = self.get_tx_disable() + transceiver_dom_info_dict['tx_disable_channel'] = self.get_tx_disable_channel( + ) + transceiver_dom_info_dict['lp_mode'] = self.get_lpmode() + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] + + sfpd_obj = sff8472Dom() + + if not self.get_presence() or not sfpd_obj: + return {} + + eeprom_ifraw = self.__read_eeprom_specific_bytes(0, DOM_OFFSET) + sfpi_obj = sff8472InterfaceId(eeprom_ifraw) + cal_type = sfpi_obj.get_calibration_type() + sfpd_obj._calibration_type = cal_type + + offset = DOM_OFFSET + transceiver_dom_threshold_info_dict = dict.fromkeys( + transceiver_dom_threshold_info_dict_keys, 'N/A') + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is not None: + dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( + dom_module_threshold_raw, 0) + + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data[ + 'data']['VoltageHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] + + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] + + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] + + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] + + for key in transceiver_dom_threshold_info_dict: + transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_threshold_info_dict[key]) + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los = False + status_control_raw = self.__read_eeprom_specific_bytes( + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + if status_control_raw: + data = int(status_control_raw[0], 16) + rx_los = (sffbase().test_bit(data, 1) != 0) + + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault = False + status_control_raw = self.__read_eeprom_specific_bytes( + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + if status_control_raw: + data = int(status_control_raw[0], 16) + tx_fault = (sffbase().test_bit(data, 2) != 0) + + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + tx_disable = False + status_control_raw = self.__read_eeprom_specific_bytes( + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + if status_control_raw: + data = int(status_control_raw[0], 16) + tx_disable_hard = (sffbase().test_bit( + data, SFP_TX_DISABLE_HARD_BIT) != 0) + tx_disable_soft = (sffbase().test_bit( + data, SFP_TX_DISABLE_SOFT_BIT) != 0) + tx_disable = tx_disable_hard | tx_disable_soft + + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return 0 + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + temp = "N/A" + sfpd_obj = sff8472Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return temp + + eeprom_ifraw = self.__read_eeprom_specific_bytes(0, DOM_OFFSET) + sfpi_obj = sff8472InterfaceId(eeprom_ifraw) + cal_type = sfpi_obj.get_calibration_type() + sfpd_obj._calibration_type = cal_type + + dom_temperature_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature( + dom_temperature_raw, 0) + temp = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + + return temp + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + voltage = "N/A" + sfpd_obj = sff8472Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return voltage + + eeprom_ifraw = self.__read_eeprom_specific_bytes(0, DOM_OFFSET) + sfpi_obj = sff8472InterfaceId(eeprom_ifraw) + cal_type = sfpi_obj.get_calibration_type() + sfpd_obj._calibration_type = cal_type + + dom_voltage_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + + return voltage + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + tx_bias = "N/A" + sfpd_obj = sff8472Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_voltage_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + tx_bias = self.__convert_string_to_num( + dom_voltage_data['data']['TXBias']['value']) + + tx_bias_list.append(tx_bias) + tx_bias_list.append("N/A") + tx_bias_list.append("N/A") + tx_bias_list.append("N/A") + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + rx_power = "N/A" + sfpd_obj = sff8472Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_voltage_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + rx_power = self.__convert_string_to_num( + dom_voltage_data['data']['RXPower']['value']) + + rx_power_list.append(rx_power) + rx_power_list.append("N/A") + rx_power_list.append("N/A") + rx_power_list.append("N/A") + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + tx_power = "N/A" + sfpd_obj = sff8472Dom() + offset = DOM_OFFSET + + if not self.get_presence() or not sfpd_obj: + return [] + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_voltage_data = sfpd_obj.parse_channel_monitor_params( + dom_channel_monitor_raw, 0) + tx_power = self.__convert_string_to_num( + dom_voltage_data['data']['TXPower']['value']) + + tx_power_list.append(tx_power) + tx_power_list.append("N/A") + tx_power_list.append("N/A") + tx_power_list.append("N/A") + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + status_control_raw = self.__read_eeprom_specific_bytes( + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH) + if status_control_raw is not None: + tx_disable_mask = 1 << SFP_TX_DISABLE_SOFT_BIT + status_control = int(status_control_raw[0], 16) + if tx_disable: + tx_disable_ctl = status_control | tx_disable_mask + else: + tx_disable_ctl = status_control & (tx_disable_mask ^ 0xFF) + + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + return self.__write_eeprom_specific_bytes(SFP_STATUS_CONTROL_OFFSET, buffer) + + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + # SFP doesn't support this feature + return False diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/thermal.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/thermal.py new file mode 100644 index 000000000000..ac7007a5f416 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/thermal.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python +# +# Name: thermal.py, version: 1.0 +# +# Description: Module contains the definitions of SONiC platform APIs +# + +try: + import os + import logging + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + + __core_temp_path = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp{}_input" + __switch_thermal_path = "/sys/devices/virtual/hwmon/hwmon1/temp{}_input" + __max_temp_path = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp{}_max" + __name_of_thermal = [ + "Core 0 Temperature", + "Core 1 Temperature", + "Core 2 Temperature", + "Core 3 Temperature", + "Core 4 Temperature", + "FrontSide Temperature", + "FanBoard Temperature", + "ASIC Temperature", + "Center Temperature", + "CPU Board Temperature", + "Switch die temperature", + "PSU1 Temperature1", + "PSU2 Temperature1", + "PSU1 Temperature2", + "PSU2 Temperature2" + ] + __thermal_path_list = [ + __core_temp_path.format(1), + __core_temp_path.format(2), + __core_temp_path.format(3), + __core_temp_path.format(4), + __core_temp_path.format(5), + __switch_thermal_path.format(1), + __switch_thermal_path.format(2), + __switch_thermal_path.format(3), + __switch_thermal_path.format(4), + __switch_thermal_path.format(5), + __switch_thermal_path.format(6), + __switch_thermal_path.format(7), + __switch_thermal_path.format(8), + __switch_thermal_path.format(9), + __switch_thermal_path.format(10) + ] + __max_temp_path_list = [ + __max_temp_path.format(1), + __max_temp_path.format(2), + __max_temp_path.format(3), + __max_temp_path.format(4), + __max_temp_path.format(5), + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + + def __init__(self, index): + self.__index = index + + self.__thermal_temp_attr = self.__thermal_path_list[self.__index] + self.__max_temp_attr = self.__max_temp_path_list[self.__index] + + def __get_attr_value(self, attr_path): + + retval = 'ERR' + if not os.path.isfile(attr_path): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except FileNotFoundError: + logging.error("File %s not found. Aborting", attr_path) + except (OSError, IOError) as ex: + logging.error("Cannot open - %s: %s", attr_path, repr(ex)) + + retval = retval.rstrip(' \t\n\r') + return retval + + +############################################## +# Device methods +############################################## + + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return self.__name_of_thermal[self.__index] + + def get_presence(self): + """ + Retrieves the presence of the device + + Returns: + bool: True if device is present, False if not + """ + attr_path = self.__thermal_temp_attr + return os.path.isfile(attr_path) + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + + Returns: + string: Model/part number of device + """ + raise NotImplementedError + + def get_serial(self): + """ + Retrieves the serial number of the device + + Returns: + string: Serial number of device + """ + raise NotImplementedError + + def get_status(self): + """ + Retrieves the operational status of the device + + Returns: + A boolean value, True if device is operating properly, False if not + """ + status = False + if self.get_presence(): + status = True + + return status + +############################################## +# THERMAL methods +############################################## + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + attr_path = self.__thermal_temp_attr + + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + temperature = float(attr_rv) / 1000 + else: + raise SyntaxError + + return temperature + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_path = self.__max_temp_attr + + if attr_path == '': + raise NotImplementedError + else: + attr_rv = self.__get_attr_value(attr_path) + if attr_rv != 'ERR': + high_threshold = float(attr_rv) / 1000 + else: + raise SyntaxError + + return high_threshold + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + raise NotImplementedError + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + raise NotImplementedError + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + raise NotImplementedError diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/watchdog.py b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/watchdog.py new file mode 100644 index 000000000000..e3df1b3f8614 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/sonic_platform/watchdog.py @@ -0,0 +1,251 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Watchdog information +# +############################################################################# + +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +""" ioctl constants """ +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +""" Watchdog ioctl commands """ +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +""" Watchdog status constants """ +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WD_MAIN_IDENTITY = "iTCO_wdt" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + + +class Watchdog(WatchdogBase): + + def __init__(self): + + self.watchdog = None + self.armed = False + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WD_MAIN_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + return None + wdt_main_dev_name = wdt_main_dev_list[0] + watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) + try: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + except (FileNotFoundError, IOError, OSError): + watchdog = None + except SystemExit: + pass + + return watchdog, wdt_main_dev_name + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + if self.watchdog is None: + return WDT_COMMON_ERROR + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self, timeout_path): + """ + Get watchdog timeout + @return watchdog timeout + """ + if self.watchdog is None: + return WDT_COMMON_ERROR + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + def _set_arm(self): + self.watchdog, self.wdt_main_dev_name = self._get_wdt() + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name + self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name + self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name + # Set default value + self._disable() + self.timeout = self._gettimeout(self.timeout_path) + + ################################################################# + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + if self.watchdog is None: + self._set_arm() + + ret = WDT_COMMON_ERROR + if seconds < 0 or self.watchdog is None: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + if self.armed: + self._keepalive() + else: + self._enable() + self.armed = True + ret = self.timeout + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.watchdog is None: + return disarmed + + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + + timeleft = WDT_COMMON_ERROR + if self.watchdog is None: + return WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + if self.watchdog is not None: + os.close(self.watchdog) diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/Yafuflash b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/Yafuflash new file mode 100755 index 0000000000000000000000000000000000000000..1b221d01c1c69a606858c7c4bfc43aa6c7c07aea GIT binary patch literal 438680 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�} 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

_dfs>6IvzBEzq@lh7zLNV zlk$L{de?Yx5Ip03sEQ6BmGN0bLV?WdFn{O->v4_NjHayyHAm%+8*$iG7eUit^!C!#8z@^WH9=v!V^kDC)(1Qz}4?TDXxTxIoE_wm<;CI1I;AN*l5B><; z3#Lzp9{e8o2)N}8=)ntL1pSLW?=9e3u+oPfTo3L7yTQF+)#8cZAb8VR6TuO1+1ZqP zspnn01Um4w;3n`x;4bhR;9l@I-~sTsa`FYw04Kq1;G$*J{2jO# zT(=B*@V0ZI2S4+YiD2G2o_7db0{#zJ2QI3Z2ztSF;BK%N+y|b$9KONFR!jtk!MCr3 z{#?&{7+eA_Sp_|~@cfCOA3S}{M6d@u@q&rqKJc~+CxS!Zm%*dp6BohvODOLp(1Ewr zLkI3}fDXK_5jyZ|m%%T%y@~RIKLZz4kk1C_z(ZHUFL?8{@C$w-1;5}=z=L4b{2KJ&FTq84Du3qd(1Y6^fF8W(e<-g!{}bf}9|I49f1ZGEaPAa*V!M)(^-~sUDXG0I}04KrD=S~Jo&Z8ZkIvF&9$31T{=m(z%?g1|c_k-7i4}tTZ zKN%bW-wDp=<=iV@Fd0;U2f-$A<7v=?kAr)_8%~EFJoyah!F}Kn@Pb9qpYM4Of)(I3 zXF?Ayd?EDUN5MT{^^2efzY9JDzRHIl{3AGjjpyCE7<%xuv!DmR0QQ5gI2(HK=iq*D zcnS32+;Zr_cZ2gUp#Q%ZdhmX*3G7%3J@{*I54dv~^x*t+pako_ zAb0R!1#$;Zt(pvWgMG`P17CIFWN-+)9z;Jhoz=OW|_ z)`9!4A|G(y)#L+~T|++L@U`Rvo|mFLYd!BzJ;Vo>rHKz-)kl1A&t~F-U)e%@@XrJA zbush&PWS@1{yltw%iaWE;IHn2FYw&G@CCjDJPIBI7rqR+y%#$0&F_N_eE0jI19yG^ zI4Ez%xEfI|ncO=wxsZ{0(>*y!~U7!Mv9< zZh}j|`cF{LVBI~F!6^8O{m_ATeG)qGgP)>)!H<0!K5IPhefN?d_}0%%2EE{s&(bcy zi|?BZ?gKCR2l|uX=gDUsAzn^9^lu&PVk!h;SYQmyc5iRjr_nRUnf8CesB`J+K4R`=-{U-F_SHMZ|+;2f&Px-*L;6?uoJ@_MV7r5@*(1V`<4}cvHLJ$5PoCI(E z4)hJ^B@aOl{t?^+?)xtE;M#wI9{eeI037)q^x*t|g&rIQ7p?ca_xuogaM_QLGx(v0 zX%FDDemoiM126gs{SUnJr?eyRj-OFKm!enw9JzrFzaU@mo(9_)GEye*``P zKKnn(7u*gmYV^ESzoxx|?*@Cp6MsX#;630zu=jED1-}Iz0oOf2eZ7Kl^LOM69soPR z`rlJu;J<)(f*b!peS!Z09s+ki3E$xP{{`QddES@6)!-%n4Lx`e90jlaBlO^-;C*2G zQRu<1fk(lX|AFr&#x-y)IPfRR4L$QF!Ox9D z2dt-H?lY!>UEnR?Uhog#0r1ijpa;JVPJ;e3p>JcH z0oQ_yPlO)49oz+;PzF8tci;i=-1(gE29JXCU+H-tIEk|y;NE9L2mbuzsbDww!sku} z`@y@whrqH^I8OoY0vEM=-in1&K^=HE*biQQD)%FR6W{^xwa+6TaPIS`f_WW`OJD_f z(+jwN06gzB_ygYy?gbwM4}cFWf)4!tnef-ixcEZoz@uOj_{GJ@Rq!n6z@=wH2YwKI z1Uz{Oasi+DV))#^xD2iZC%{eMj-})aUV9Go;CI0T;M#Mc2fLQT@8!JLZWZ~0Z5P8Y zxOE+L;LpLmU}G(G;K>c}3;upR{BEQ@HX%>&`K{y!-U99d{{Zdla`GMV8^1Bi_ffeAR+u##y*^Yd` zVeY5cE6>3L;H9sI4y<_%<-3afc0mWu@Uu6QANZHQBR}w2d#HEtJKz!Ug4@aO zYUU%b0t~<=@N({@=m*!mnfeEB2JZtO0}p|>a9_ny@Z`5r&Q0|1JCP4~2iOUYgQH;2 z+o1=~c?bN0e*zDK>)%bj*T5(DSF8r#!+j8&z?a-jI|X0Joe%rL--3t0=YN#?2j2)T zx|a6FoegWjGd>O-c+n@I18=woI`Gu}loR|2cm#aeC&{mi`UF>l@B0*V;F?b(AMiKe zUhuAa;S+qxXJ|Lzt)E4%uRp1AKcPK( zE^zg#W5HhVPVfMD@_EpMSAvt^Ah>9le!m)i!Lswo7koFk2RwHT`GUt^0KZ@sJPIBL z7hcc2_R?d)YH+Zce8FFUyTHzi$QRtamVChnE+${_f|rvo_|kghG=jba)`1r^kT19& z+zp=p3hD(savAj^&zr~>>~DtOEVjoM=)ecSUhrcb(1D-496IpftDplf-2@$Y(zVcy z(jK~?1K-p~y@30#qnu!NfO-LMABGP65qJdr-1U@mjD7^J2A7Q-3p&AHfurDyv&Xn6 z34IT|4?Jg#a)OJu(;l|*-u4}o6Z|n)2QJU7i_%^I`CEC zo#0ikgATm#_3#V67Muht-+-KUBL6qip1@1@P_N(};4ZN2cJc*xg9pG9?|>fsDL4uK z{!P%o8a?FA(1X7LH-T?^3-sVGz`fulZ-pLw9ry_NQ*aVo_crKXL;Zkj!JmSgz{)$J z2X}#c!DHY7@Upi<555|M}bU#2~R58hAtz_nkad|=PlX^(%0p7#Ll5&XzE=?CB!9;97>FZ>R4 z;I-f(@Nw`cc=to(_gc?OeV6>ex!)r{@Xg>J@XUXO4*Uf82zb`_$q&2(TyzWl2V4tw z{{Xpw4}!bEjsHgb2fqp)1e*@g@4%mc3wNWx{SbMAzjzor@a7*w2Y%}()C2hNPpJpc z{~7s$U-~)y=I1y8~+_)hR3c;g?be{l3qsUw64T2@$+7p7H4%`p!0T+^_e2#l{yLa4wo&mRx|^#uMn>Ewo!Uhs-%KWqClZ}u)Z{i1WvTXL2p zA#v*XmY+Hv?3lxknv+hxbx!SqXUxscA!`lqRB@MnP`eM1z! zkH;f~SH#0NN8tx~ek0+^kW2rXDEu(tHxthE6{SDtI*lOw&pVF!l<>&}|9@8gmk_>$ z@Ow^Yf93fx`b%$_JNM7eGnq&nzD>ltjs2>d=jX)B&QHV}CElYKj|a=Zu)LDq8OMe3 zgs;64?`7;?@jHw+XS>Fc{0qf?duH1O-$$0k>Z|CTE;OE9WB^mD#;$6ROJXn_-@BC!Ed6e^w zJH~^Xa^sC8<5dvvm#-cV21qy24qla%UnlXF-ZUQkFgM;mC*$oR-l1E@gG_F`P04us zhx0iU|{>Sm) zVv-Bf+hK|z^}U<$UlZOC51&(`5hQ#c;q$-5cogS*?wQK8w1-XYJ-BApDGY_~j;C`r*6<*l!7cC?3u{G3To$ zjy#rl6~yZv9}iv`ZwE4;)M-^qG>z9uyf;qdv}Z|gZ!*1I#G5~f{uED7#-oZTJ(15o z;+;N)|CnUp#y8Xbw0s8%e<9(EeCr55 zvqX3=;m;@h>UjQhOa*BD6W&hvy@~L9v;bOu!hcElv*L1^`;4%E9VGm__?f*bL4S2f zf0*zE0sd);@Qq>kyl1mtMfiq9cv~30gzy^)uTP8*FAwLRI>JA6+(dA0oIj~YKUt6c z#QX4^iQw#bKG$kCT911O{}|!L>Ty5eA18cioW47ve~9pV34d`sJQal>A^h`%7i$Oe znLocs_*WC<{8Bg$RuI1N_=(_~@p8`nT38QFgik$VBG@0#f6hlkIrbC&`V%ICb@A{U zBL4Oeeh=Zz@$fm9Y6NNf`w9Os;ZMf-6FL7{SrjUj<00aGpll*|MuN}dlut?LDB-t0 zYa;lA5V-zCI&*$yc#+4_?iM|VacBNSaAP8!ond*`5`GVUi))0yrE|SWL-N@~_}2)p zijRB3?~oVc{5b;jIZ?QbVw`q)8 ze!^dXKjT;8a+GoGGm#u6-lFGX_d0VT*q9sd6;V9Nua0;>#~$-$w^Y*p65$^W z!;cVt6hFpu<8q!`9?nDaPr-h>dLmdJ=hK*p%=l0E0{kAEPK)I)a=YZTu;EB~I*GTk z1^J_Qgz}K`oS`bDq^{}hB3{)M6T!d4YKTP^? z`^JeNlSrpm^O1BOA-w;liQut#eM`9>iTahan|Y_QUvLZlo{4l?Lw=VKp4vSTyok6V zKUbM5*Y;2Ns|f!_g8u%HzL)UhZ=DEENrayihVLf)FNA*}p8lNog#Bk9;X7`dD7t<+ zNch_cUmus(+;u7};qNfv2ln9Cn#g}?nE$-z(XVcw2won~|20whmJt41!p9Tz{}a;J z5&rczO$6H$;Ui&qFX5-X1^L9&pL2g$zTJd>h4Aks!lU)WKEem^+bu*d^?Z=<=e}(s zIDZv?xN%tOdD$vc2p)?Zju7uf-zYpUNcep0yT^ZXBDj#>VLDlpgyd5}_?d*C6qmE) zb6m1rb`o#ycks(i$m0Z+homz~_#X&=EFLcH`%#S|x$F3_mw5MncOtks-hL(Cwq*M~ zNW5o$eom(PX`gLf5PALZxg|J@pR@^h2!457ocPQ2tRDe*vW6sr^EVLLimLb zPXy12^E-EbSig0IpY!9wa+Caf39lhMn@E2!On*1wcM|^IMEG4{_&&m)^Ar526XC`V zF6kd6e1P!f3I5Iv`8!PbuAefGCFrB|=RC&q&k?>R9&YDxNq-69-zNN)MEW;|>DLin z@yJB5B~Cx5NBNif?j?Mb@JHhHBlY-$Xq=aLdx*E}QTlnjo}_)PNY=NUpSk##6TxsI zzpbIX4iSDk;dJ|`K8-r7{op9!uOYx5eq_+!5yA zN%+bCSv-7{@LLFfcY^-yA^n|%PnDp*kMQBc#nV4T_LZzqB;B=Y}knExTdKR|e~ z{ErfT%45aD7gEW$mIz->_+LwecM{(Jc=7Z{34gRi_??8eKT(|iKEl62`1=y&e^*p~ z!fTHdr$0*g=SzeyJd^S4cg5-D+}GX`;hls(`}gSc3I5(1@;6HOt%Mh=pF0WvYl-mt z2=D(xar#4qKUyOEDBA_aYsCB|kYg_o|~4NxO`Uuj@66WT*Mbxw_YL zo+e?xDG*Q2-F=pGHsiVLktd_|h~z8h@^%NM%PIWJxxI_L$)f!4Cj9E-CWATgabNiQ zOLBhLPrUQzO$J+X<6Rrg55m_W;*Fg!8LY{TSCNc2NxWOircZB)kNs@HWbm1|{AFG; zCQfoR@@*ns)3Yao?)W?>@irvOF-p8!pEDVJHaEQwC+ll3@lHNv`t%MG?-i#`2EWfu z?-$ARj!1f(JDQHag^Nk=wCU4ZOFTK3R4P5Ke@XAm$%5-+sV_Na`5%OTli#8KCH>$Z zqkbUq4!_{kOeo?j7@PKYq_MZaHD@r=oTs@plpb`QC#(rHtVBvr;pb}ydV6Z_Rc-7ifaG++r2k<0nv)gQahMv z=7ocbs7W1Ez)NImre+iZo11RI1T_uI1TS^eEXmBsGKsWIO%YA;lI={>(iAm~)MFgW z@*K^`toH1AKHr%&Gi%MW2YjC2>-GDi+OHRU_ssjVzUwk;ty!~XX6?>ixsUn!po?*R zK>5gr?wd%jybJU4{PA{d4AKt}=}MrR5#yCNn{}&2od>#xgS_$%+~*PeZD=g`y9gb< z_f?-R6p?p(#4E=;O#XTs{Rh?S80d!L{VzAZ>+#yv2XlxgfiDO5H!db#0Dca9t`Pni zCCxy#68syKjQ3?s$J;LJ*;4v-4|H9|dByw1)P5vUcM-af6mPxfrO@^`|3UX5pDyxO zF8Ygs?y*#~Yg76hYmEA+w14O>rg`OL-k)8aKp^;8x}A0pA7wl;D55 zl34Oz1KuXxE6))46opecJ27EA4Ls704ek1m`t5c`dnG?zpnEzK@A(LRjQcQ&;J<^H z34EoV4mbESS^o1$=~w{1AAFd(JO>!%NxE|Ae$4jDG9M2epDW_=sfKRfc&|7QOge6S zq2wPE>SYtW@=$ZU{ls{?KzGpXl^dIMcCQ%kNa)_1=#?9qb-#(a0_Yaxc;&0+d|VK9 zrO=Jd#rs=k-M6CdAaorjdF8RDcpdkP`KX0%%;R2h97M<4bRVmAM;x!o7?+s**?$(} zjf3uyJg;ms>(oamDAh_kbwk%9-z&}wQoL=&^c6$bXNp(uY4YdjDC+1v_k^il`7A}i z)m!^fBYjH!ht3DxYF=kwrHF_-@4|Rwntx99BOE;B32&YE3rLp;-7)ASJ|3!XmyPt0 zE+4vgrhDa=&F$?uvAvZ*cWZ%lyRQUK2e)dE)!_dE_t)+z-(K*(GyR9Bbhhq#?diZeg7W1vc$AK>bUoM0<=CfSjjh?kG-y-l~;CBYVf!018cPN8KYKNuZqZfI_ z=XatQe>x~0TK^&$JdzJj{c}69-;IJU z^98T`Ft4NQRrQt$B}Yk55_HR6^vb`{4lQ5o@OQwi z+D9Dt74SZM_TJgLT1>NE|tjl{O_)&0w{VBzh4<517E8l32CqRs+ z1iF^1tn*t5J`Vg@AwNa>ajOR3UkCSscQ3UL-?|FeI{fIHv9`|?8kuj}zAfzJmQ z&YxVrQ~-W!nRUG@0e`9vUJ3q99lRQR(A(Dik{5gr_%lNKjpx!@<9=GZ)n3c{HZkB+ z!E=T1>Uocja}xN+;0t-~r{5}quG1Q?<@0By;IDu$=Ka|Jsh6_{yzx8M>8Jr81HO(A zPvf$ciVNDSj8B7m*lefk(NQ~#g3k4>SI(q>dcT&cIHP=z1b-L2n&%YXAtOHWQvh8u z)(@G$>+Bi2pAztQz(3+yIwc>JdNug|NYI}P0>K0Q=^=fvaS?1|^H%B|Z$IC$V@ujT#2IPiPGt=f?b zd_^7Mi@=Y8yZLl-^C+d@Z7XoT6}a(yqz8N~xK;QX@Ul9>J8|RlOda9F!8>oUjz13E z1#X#t@Q=Z*?!Oj+d%>3q`FlY*NK~&%!6$F^-%f~oz;}RK<{!NA2iDg?&R%#g#)4D( z2nXK*Uf+96iO}7<-79~}=Y#6o4x_%2zkKMdKU3KfIJZW93@w@$(7o{r-+yg$DPZ#y;Sz@|qJ*$up>(|kG zS7V?nH~V`>^hfJq)m(=^S}!YNPyPOAJ*{ofy=9K~RWaUh4D5P+N$YqOdeBdjW9|Gx<-1c%7p?Qv?&G@sQMzayu=UW5=l!ww z5QsbP#yA^1QQ!lW$SB?6;O+N%di6Y&KR_Vqt^bz!5dfk=XBg@y|*#o?fC0g>d#t;_dRGm zxCc+-{+0Q-9TSfmtryp{+AB8;f^+TolRvw7--FhZt3B_PTbbhxG2(4a`G@Y?A58s_ zeWG5z&U-N5c+vm)L#hAZbHG0_r(1nA8ZoHj$3*DDFL~wDd^uCPzYzQ3eCSSH#(H5+ z1myEK+PJQzcuSyb@iW?qIo_>Cc~Sm6&~5s~fBKdDgUc42;&I-K=QXck{B2IpY%x7u zpxfxhxYnGWLq>YY-$>{(WXxAL!3LkdZ<{D(j=jowumHO5O(c1qIo=sYyp;Y@=w1ks z{9b1$`3FA>?(h6h>8Szl(o7PckE7#KVx*h=1pfo`_BTkD_ffil2i=Hucc9ht#m3nb zPa^o!;J-BFIK}h5@~AC^Qu{yXhTi5sKjfzv{59|p^ZmC5;{CTu=nAn8nAP=HHTV(m zJNWuY^E54u`bhb9#$xW^c56T3;H~~9iO<=RpJdTbB6LY%lKd-t8s$@~_uFppo^4Tn ze0r#S<{5sJ{6n|$4oQ5Tk96uQSL9u(Kb6p}ZYRm>%=K}laa@(-4_!nDNlq}w+eeHy zxF3$;o%k(#bG;2T>MfO56m-41N%C%dH}bh%?@va8p8)q)A1Qo3c)RYB<#@grJPF+2 zai#F(;O~Nu7UCbFmva^PIq-`Oxb#u^anF~MA1`!eQId@2VdO)-ZK%}K*8S19fM@gE z?$Yxa1KzZ!m*d?d@FrjxgomQTP(@Uwc`XQzdx!-qz(@ z4gM6kzw}eR@PdB=z8By1<4EJIN+pT3SE*;=18|?Ek0f4)lkOu?mk3>xyCr$Jx!uMY z?Uv%Dbvb+7Bgs3=$7h3BA4{OycdsPA7edGJInkd7x?cSyd9fYN`Tn+0YzG&idp%B) ze=_U1_h%@5p>Y`h50vV?j){RTc#x@`Qoq1Gk3q-L1>H@9vHljm>*=%S>h+)qJQKWD z;Oa#Vg)ar~I|S=?30%GJ9FBb+@GanB=JLErEYFM3t-nu_`irH%Z$5aZp_2H%8`Y;Wu|CndsT=FjQF=Yl-Ti?7 z_=wk#AMp2u^ceR?oC$bda+oy_2d@HOB7|3;_oe*Afe#!m$&Z-Jb*NabZs=x=kmSR> z&T&8yQ92iZcN!_l6NPxxi%Q~a!KZ-_abQEM=Z<)#F%UlpzH+qxbP~S^9y$i=4GQtA zCo$r|12K+$*gAX{@B`q&dIFBwdioQ=yFVhyE8$B|AA9MO{JX(7fv*s_dY_5PaRGR@ zBuS3v(?{*Sw^5FyD~E3Aqf))k7gR&n^)X3qW%j4OdP1pC`g!Ld+#gGpiWwAen(0j z^&fmWxYha8IT-74T5u}waPZ!#lKeVfj?~Y+Bp#PU=+>u6;`@Gd{Ms7*HRU%Sy3HB> z&s!8BKoI@~P0PoG`kNk8N^VbEs zE0f^IeEvu_&NGz1k@1$&siO5|v{C_~e7N(Zg$eF@wu9d7Vj z3nh7{IUVInQuTBcL$@BfS-j3}lt(#uvm)zsRDs_C?k^owUbWzf;I9e(jrYw$A3*yD ze@NiQdH_-2K5(n!JrX=&jy2B*Uj%N|KNW*FoNFDv9Q=Vgcoq1|b?{p7Gj;ILVOYOv zo^||D;JJ11k>FeE;Q8P(_+g=Z59sZo7<~PFNj@d;V|slq2hV=ibX`gHxzMObRPU>y z`@9|<)d%NrT#r3x-9E#?p9Z%|ZyfmF|7kt0bb;qBkSw2HDgy7gP?9eT`TapJk5ce! z;3oxMrE?GX`->#;xn}z*y}W9`Cp|C8+XCP~8z<2CWrHzKO63(i0_TgDu_ zLDynAu7~+?IQjd?80V0`Bc=i?>aNip8F(9M2Z z5})IwptG;`KVGExYQdAhf5UgaJj~B&wtf)vMr))x*JmMranQxQgX?dz zKXr*6+N<=hZsXGSs zrxd!+Hc0YDzP=4zR=yFMJ%#Syye7r{akggWG-W8JkAG7YP zF@7UmYn%Y2t+>uI>$r6!sl4N$tKNorG$%H+_T}iKRC3}j@ZWZ#e-X+lQ!l3?@Pyrx zd;_$4_(Zj=DSRn-FYp_Ae!syz;CF$K5d5nTeN*@v@JBwx`Ap!$^!Vxb92W19fQAv-gpyoQuGRfD6wZQa$Kk z95?c_7P=80|NS)iIS9T2ysmagx?1Q0KdxIx@wLVTYYuc@;k$lZ?8o(d#emq0`Ps{4+zI)h>~eaX9@T(pGb0Fo>P5}5X*&rFQdtR>-Js){%9TC zIR@7e;8yEXgoCg86zkyg>2Mh9kHmqWIe_^+zMVL7^>MxnyvOH~Y&ZAsKO5%(D(?l* zH9acHg+h5frI*)Q@JZlL3fy>3`yluM@F@bHq=&x<9#$pE&+`3!+lj`AnMtPGi3c8jjP4oZMKUOGFQS8dRaT0VJu0vM@-Jnx-`%~&abZ4P^nIh2o z8N2ab@j>v>UrF-6og8EX|x~>Si?=PVL3BY3WMFG~1I@Pptx zcy8aShpz_DmL$0!&(+5}mGEBh=fMBQ^Ra3jrhK$cLVEzG^`rTGI8KPiB@ViHSrVUb zpyS7_Crjn#hVJGDSZAI0#|AIN7l605`z+TfTnoMcTsY65KG9Spg+BxCq|T z;ghF9tLMi)SuZd89i3e89|f)sddPnl@K~qMa-Gsd@C@)_Liqa>|5ToC@TK6m{50aH zej`pTbJ|Vu6hl`DT@mfj+qpX7N`A`0!|?kfzwn&u*Y}1W(p5uu3A$Rd?ps4g@i`yE zI6crOUYE0%kI7Fs_`?l-@{@dfpyQjPGzs#qwD&~l);96ULHv1ubUvfLP<;8&Js*s9 z@+qL6ztMU*6@woD7oL~#Q=clKdo{!-qg&_vJgE4gc&fpVg8Lg+QNFz39`N7z@N_&b zi{%rZjN{hKC!gkZ_LF)%ao{7H`z+@hT;NZEzbk}SZ}w0+i@+P-;FB8(?ZTlH8u3!_ zAHl88&mQoa8?EbQ4S18A@OuP8{KojrIS%y}e1^b{=bOU8cZ1Inxbc2O9C-UspXK_i zF7V^vp+f$e>G>-H|MX^`-}@p;{=o;e@L8@O=>abUUu(lhuTO95$EOCo*)67aXCJI{ zX9}L*1xIz@!mH1lQT*ZHPl5~m4r{c;%l0z;AEq^Skb$ zl7H~~z%gCR`A^W(?*X3*j>|fZ57l`M_!@9b`*3`S&Yh`PR}p-+z`6TB;CJ6@oxV8m zOmNHmgTDf9nSbzq)#1MsJmfa(^n1YR_mc93^c(k=YrtOs$22IH|3OCn({P>zkLEeQ z{u6i=xX^EN^(PM8-pVHr;=|hq=>A>coxuC@TphM5{e2O5Jh)Z;Dh1C0$22yV{(-uG z5BPHMSe~oXrHcO=@NM8$`E$B(eFwgP4{x8R_*eRW@R-&<@i`9aCkqt`g;M)}=vH2b zE+4wUHa__PA0PSqQ1n*<-J0vrd7w+Y-6yXOghQ?U)A{1nK;2Y(6PW-7~p84o-;{T3Y{$izrVxBgYt6RtwaT=jvEd_*E-TC_o5wIIjF-M zC0`f8dw|d6Ig5`yj-k{S`rWws&`siX_6bTMQF@}lzXU(ar-#b>sF{C=ac_~?|OXp@APtC3-0XilSlFCq5KWjQlpkb6?EO>G4644en@9}Z_*20tHJ({ z52dFyI_y;NSbW#h!}TjM;IqN~^&1pE3H-m{Tlw(zO?rL`z~>I}$-8(?{lI3iJ(fb( z=02bNCSQJ(AJhGJ`W?ZS6YKA%YN7L9hpu%t*8RM{Zhy-0hi)%)Pw@G$=P8*W?gGDk zD1O&T;F&rv0v}%oF9ojvN3xCMz}6Qe{~mCk1*iH~1D^0e{rRBZO?($RfANqX`aQ*; z>hVLmk-wEl$ZaeL#u zLb_t;wkDab$Dm_NDnp^R^GfK3KI)Uh%>BVlMt?y0tAQ?IoKL=4$X|0ke@;})z9~NW zkib9Hc{up@sXjSX;E(E@e($o2%V)VBp$q&Y@B~V@mT!AMqyB?m02k)%9qNw*QTj{4 zk7VF{B*Z^KkKY4+M;3nfjrXq(|CIAW4R|#8V|;ij_u+~Q3ZznmCtnr#k2-gQXXX0uFX^~10Ivf7iBBh;=P!uqEQjv($Ni5d z$q)Tb=r-`W&d;RtLN__zCx6YSm&)a^SZ~8I!F}g6pS;_gt_m?-iO}tO!Y4<Ztz3kR=*QRzgv3ellXl+zCJt7D3v)5F4uxz#_w3taLCp_r1|sq_>h*19PuGx z3!U*H9Tx-)3W=N>I4GodVZ-}FV%;IV`-MdI3+dQDB&>f(OX&NDG*W&auNHn<;&(79 z+kbujDuKUB;I9(+s|5Zkfxk-NuM+sH1pb^Q5Y{PH&A4V+G0>2gK4v>x-L3C`mu&|# zo7FZ}`PP(e*V^NiZ@04T?-pVb3ZGVNyAiXuF?*SDx~`y)#((yyuQ4pM$I@6keLm6(!>@Cdh zyE#_*rtQyS+giHEF|SP%Gkc!dtIP)85v#ap!E6U+qnS-$b`-N2%uZ!?F0)ISEn~KV*}cpjXZAd^SD6iL z7i*(W3uZeo8_jG2v!j^JV0J3AbD3SrY#Fl^%nLW|SP%Gkc!dtIP&=WbrfGf!Szg6PO*vYzDJa znVrk*QfAATtzdR9v&We|&+JuZ1Mgz-GuwgLXl4_b9mTB8;?o`bebVnrzyD_Ns^D1` zI&F9Mq>0(duJozdIr$mdzW-ON_{hT~?*HJU_?VcNnU#{`a;H!J|MDaw6#8fV(*WD_ zSKnu8WW#A)QbPW_ZFu8XZuLxT_zX-^ZF~C)V^EcWmzGx3L-9G4HlX`S6~u85N8BRZk6k{Hq3)VMmsAYJTj}vvb~m{BN5p0^h3H z^?Hx0t>3-5zu^;6zuKBDTHSbQ%Vi<|+TL{h(_QbG*yv@q>xBkMY3FN)PneLJ;%@zA zWcr+;__d7xycFnu@~sA~KCEptd$gz7&wEd9NFR1#%Z=Y}-TBXg`5$=CwD~%9aMx2e z|5R{vL3(1$>c|2g)JN@i;Hg6uZb8cAh{`Q-*MsJ#v z8`iig_8c5Hdiy=`|`;nx3D zY}&Ov_*{i!`H}bY`wTqx{rYJ~Uc0%&SI)u~)p<7trF~P>*HwJ)_=!zdj~zcF=uk+_ zYjWcycdoNFd4EO2nQ=>+T|Tm^(Y&lH4Q}`C3Cw09__yM+rSAqQ(IN} z&UQZf?ARHnnjakUb!P6F4}Sgi(#}N#c5b=l*rE;NzFT$t_)|;1Sn1jGW$zJJ&OGpA z=Jqc#M^~189k}@)_eF0UbgFaHFB4leS$}niBYNBnXTOgwjXU$unatIf7UguCzB4;v z!KRc0w-shozHubCee}7k5id;(KIj-2wEcq?_B;OGA>g5%eYbtwF=)re7sr-&c8=ea z^tOCrPq#ydH~(|R$u4cyoqlA)9@ncKuB2ToSv7u2lO+@FYXTdW{3AN#hdG%IC*L&M z7BG9ru9re*Y(2NG^ZQTsZdDQd>Y^hrHr;vb-&-zK7qmU|RZ!KDqjUS8tNQWUrmwSd z3Qzs*vlcs_d8ES!SN}C_L+-SJTUwqU+i3oz@y+B<`vztt1vR)qUXlKM_PW$-N974A z@rT?ko;cU!jsG5LdSYaubLgH;jy@?JGT;8C#kj-w56m9?)wG;@hm8MXUG>=GCo_W1 z#9r?EWv>UVc-xY|6QA8R z`t-qL7G7P(fEse3WUh%)0x9Wv$=$m5PEJcrt3&(8L_xMe_xBs{$IRRHO98C6GEjKRxdcm$~cC(Ao3q^=G4RRoj)>0nCnOb^^0=nJr;< zGqZ=8z07R0?^J&snH|7vGP5(8UB>KYWUg@sx zQ4y~6)G5lf)RZf4m)auovhwmL=clCFA~3I-K6#QYA}2RLJ)&R#!CmuHGTByU&XkDM zDcNpU*KC(9g0`|!^0I6ZuIV{>(m)Pf_9u zKO#T<3H;B%23Rhxcv5T;=~>AclT#+9Cug}3R@+iTB&STCoHAVvp?x2p1{u7kOw3M0 z)VXkoe-TP7s>js4JS9z-LPi0&vvVd~cg?F?Nb?=qoCqm<+hfVVDn@x;PyMF;H`fE2 z`=B`&?f&3Mdn~r_>@V99rfeDiXby+}w8aJ=KHnazVC5Zhd<$2$jDP0vQ9xI5Z%~VW znLSn!FJn78DqF^!lXf4H?Y7;EFH{Cv_}%tcY~ejOwj+|=$fda=%DWa`yKk9*eKeP( zh1c%CUZzPTe6;(m>el}~Pd*d?(^Y!@15%x^0ztE ze$?hrOMJjJKD5miCT`l6nZn2Yu7;2MT@CNn9yDO#%<-3*!fyzr8jbY|Le(P@ldEj% z|Fq+$?bv`XRMn|&(MNlp;k$)uc(Y#H)@&uhG{c`3UVGl*@^yyahp<%sTKH@1d5LTF zghvqN^BMkAO11Dd?LPk^HT{>#IX>!^QGd01a2$+}|MK%0ivIHRY6wlI?8HAU-AwRv1bSn983RlkuXH2*}bLMw>BIo6TZ z0iXlIBSI{a^4;c$cE5vyT2_C2XENQ-Vf2frg!7%FDAb`ou7><(ef}rnB-QtMJCvU8 zw`JuD&T`bX*ujf;R0-ex&L1wM6%4pF!YMjsJ2S`*Qk4 zK#`8{%PNw;{N%lm;ngQk znou?GxT=LqYF8e&vhd{NPM&mp&C=sf5dFgtNROO-{v{&X^~YdPta}Llu`P+OK6Oxi z-YJK_^Suv#vGC68kGpc>gj2^5TZezH|E-ahm75XnPhJfFZo$7X!*9)*{82n7>&;(R zt(viD3s`ACw?F~bZGP@d!(R;r`pSP*8ve;Js;~Udqr$%U(_vVj{4{dC(Ros)*&oJOA|Y4S53a!u!h9+8IsS{gmekiRd#txuExiZuEEkS70~Y3yoE z!~c64{^~URU#9WTL22?2N|XPaGimXc{@%1eQEgjrjc`Tn)b?0 zW7qIB`R`AYe^Q!ye~^ZMa~l4EY5cYyqhNf^=bTeO&U4BNF%2vjhxYG_~X;~XH}Yd=cLKsFOB@2Y4XocGzjhwnP_5K3LXX8`J22avJ_+Y4kZLP5$#yVPErU zcbfd8)5t$JjlIb<{N-unY3hA84gcFT{&^hyzWnfQntJa^BmaOj z^7GR0!)f>rq>=w}8vb)>^n5uD|C=;^{&O0B2lPC|8fISPZCqW!c>5f@Mor zfHSYEcsYSG7bvT$T3TKft(aS}vb>@?x^U?d<|>n1vt|^ZyTYnQ*^07xbC)hDukeWS zGEh|(G+nHeM5^3XcV+ebxmTCfRG^j$YsKP<#WfXCtFp4Hwq}7<6J1tby~?7*c?*|W zHPy=&E{RrJ(WNV@maeE+W>qe&u2^END6d(3+64e%Bz;vR8Vkbw4$m?m4}?gaOhGLfj8jB@ZQw~ z796=S3VW0})nX2mu8b~(Gv>}^d!ZSn?u9iq)n#yM<@}21iW({#U5ZNhRb?$+Tn4)< zmR6!VRU5OFOJ?LPUr;e`F8o?nS-Eft8r&*ZN}zO=av;65ux91Fh4Z10iUPQa$~o#+ zS`u^{j)KrQmC|U^5)doq*H&4}oyb`1*~RvzudBwq@+g8}6}rk|YjN!ox|D(A1fVoG>SJWN^;TJx z3*o?}R&7mHMFrGZp(IzXScX8eDjB%QTNbUXp$95z7tXWFqDvQ|u4?oLc&5teWa2bfcIcITl%E<>eJMXxLRt%Bc%Ij4xQRlnuk~<%|G}%N8!N zDpdqlQa;;zd8Okn(9&aSmN*PpU%nKsnZKlV?!1cSa~GE_s=zlbVLYy+E%>f<6Dt=l zTC#K=d-nWtRLMR)(K>tPjA>_MNr%szOcjECUD)!tHjwf5PNZRLXTn|6t z_>(Zy_4_yfaWw3QQz-TC-{;;xN8sPouzv}ibAXiYZ^*y|?r~DF0UlqM;-+bb{$DVK zQb>O}Yopy6KryvhJdY{Bzv!6TFvVnAKSA~6z4*`~9Fz99?xs5UWZ=~F5quNlCwj!f z11+55KH%i95qf~N#i55RTzD`~KDRscp+X0&XC1nB7|ZvwUIxw2#;4Rg$1})7groj! z()d?ue0QGXSuW22-H$sjlF#!&_v6l^V&#z%vCp8}0P$m3d8p~eqs{D{VPV~DV=@ekGV7i)Z;5xbufjX%_7;=5GiAExma zX#B%9eznHW*7z$m{t+6#PU8>L`0F(Oks7~AgJLx=egW zH2w)1-`4nCtGl0KjX%j{;=4rSbB=RAr5gWamx=EM8vlD5zgpuLYW$TNf3n7})A*-o z{B;`tRE^)H@uz6~4I2M6jlWUjpRVyYY5X%Z{$`CI(fG|8f2ziB)A-Xg{%(zbrpE8k z_(d9jug0IQ@jEsCSsFi~@z2)y-5TH4_&pkbhQ_yc`|*E{#t&+Ib)`>%VU0gi%b%_B z&(rw18lPuD?k8X4U*IzFU7+!cHGZMSzfj{xH2y^z-`4mSYy4u3KTG46X#7hweyPU4 zRO2tu_?Kz?YK>o_@mFg6%Qb$T#^<#p_p?sp&vu#kZqoR3H2wySf0f4HsPX4&{7o9a zRO4^f_+=WuS>s==@!K?hxyIkE@#ks$4vk--@%L){N{!#C@#ky&gvMW>@w+wtLXF>} z@vqVN*3*9cFVgryjjwVjFs$(xYx%P^{t}I!tMQj={CtgHt?>&q{C67Y5dh1f3wD~)A-FAe~rd()A%=O{M{PAUgLLY{05D`SL3hM z_?;U6W{scF_&?D2cKyC!;^$b&C&psgp7_h3f|gysGq|Joq^s{8Z}pCzhrgi_5u`{< z&q;Rn;xqaR(isqy>=61Q()~!c34IRf{-iexJ&klG>5W34LOMXYN$3+uA3(ZJ=&_^+ zkggVb6lo}GB};`KMjAR>$zq`gljas984-FQ>4QiY2;Gl#7U^7}zq|)Dw-U*)&>xZJ z79wd0{T^v<9g^MOf-(9{(%dp6JB9umX>Jjd9YXIR%_Giao6ygY=2jxPS?KMgxrIn> z6nZOZZXJ?MLO)EJTZUwv&<~L2Rv}p}^u46HMM#zkeJ5#d4U)w|-$t5Sf@DPKTS#*& zkSq}TCeqvjBy)wnjx?A4$*|DNNOQ@bw1mEfG?)6x?r&)S)ueMtcM5$4>5-&6guaOM zDAH|0pF{d+(wl{zMmmr5Mxjq3J(_fr&?k^ShIF0KV@V%Nx?1Q_r1MFa3O$VU7}CW; z4<^kec`_pOK+@w#7YN;t^mx*_LVvjtG?(7Vu+Sfo=8`*U3H=^vF13^0UrYOw<`O&E zDfHh+b7`II5PA=3E~%4kLO(;AOX=ihp|_Lf5<0n2=&hu=bWS!2{V-`RnUi%wKR}vG zr`!$L13 z%_VQr68aj_T94wbwZCNeKzT8p+}LnNtX&ejPwlB#X=7zeGch}&;v=IOS(YlexzrT&K3I0 zyFqj5nG6g45os*k}+5M%oKWQ#8lbu5UjWm~*$qu3Skmiyy*(UTeq`8z# zZWekwX)Ym?8-?CVnoGxIlh6;7=8`d4C-eiPxl~M63w9EktNOLKew1mEfG?#$M?k}YMNtcrD6#5F% zWu!ZVzKHbIq}zl(hjcmV%|cHjJ&*K8p-&-QLApuk6G&H*t`mAJ>G`Cqg&swk6Hu~L z=wYN6k}ei{FzIVZM}!_odJ*XYq5F~M(kz)P^p|&m=8`NK7WyO7T#6+vq2D9TC0Me% zN7|n>mtM(Eq5npjORi*x(0fR8sg-OK`Wez(VkI{Vy`40dR>_S*Zzav8Q?g0uhe>nE zl&ll_0n%J5C98$Lmo%41$x@;3B+aE!vRLTbNOMV)j0k-TX)cA51w!9MnoFQ$uF%(! zzJYXD=w+n2&Hi|#ARrRPnw#zMzQ08$9^{6 zve&jn`}KCn5~WH1Tw=%GxtJO2PTTZHjPkYTKHjmT%0jVwLE3A&c9YunRe!s_E5n|= zwP(6IkxF z(x0Lp)*Bt%EG+02Y~71`p6=~@dPh?e^~sH0pOZYiDPbl_aoQAgAfhyBbOml8QJN9y{J(2xK z95V+NLD_hq0)L^3lQ)SeQk6OlsaW7_$ul)2&r{5k`v$5%3M$0{M@ydJDS7Te9y^{R z%09-tTdA)ddkwY!64QJ`TWEb7{xtjnMkfA=Kk>ld{~(%#T4;DH|0G`T=c@A_Ev@g# zkYZ6i53kA7UGS0Bbq>6f<2!?e;_yc#=u{Y`Mt+9-R0iacN^NLY1#$Hh7oU@tqg=6s zxhC%j-3EBp_%J5SNoEzl+v#`d?zM)UyKD-Kg_mXg}-at zY8R#C-mG%NNykmes69FbTkm1xfeqkovsPC?;uo$s27bz-pR$zJmom5Gr_kDQ7zVmB zo4PX4BX@>p@95j~$4#R~I?Bf*L)d*&^~wA$eWIgNbl;ol`f!M-*V_>bto%LQund18 z`t+3Szwxr?xh{{Mk&@#FevaObt~|r|%ZYl%kD>9dNdNX#vFoSgSqR2pd zRVV#APuf6r+(NcNb}X7V#E#8E9WXE#Iq72z+z9)bt=zsPuElg`#{fc;@%9FLTW5c} zKb4Aysa&odQ{THH*c-=ZfdOtd#$66Bye}M{9-qO&rxxW63H^d&%C8X#g&aMyS#40N zJK8suBmI|PVwj?k=Rbr7kP^&LW;{;_!h)fnQdqmfcIF!R zw6_=2-ZYh$>&oU+z8A5!u7g`!)KJ}?xb&mmUKO%j$TnZdjc|j*^SkOr(Qbl>)bX5;Z zSY3yb*)87TH(b+`q4J?HJ=3#Xvh*`pbpY?xB*8i+O+&1bunD$ExCLFH_@f3*q?hJ(8>t3tot5(Hm z)=IY|&iGXI7;$0Hc6^DpmyUwwS8fEO*olRB1dg4>UgKsF!p(<85c0YZnz*r8+8Y`b z7eI}C)s+}qn%+Bgz3jVEEAUa$$%5gM`JWf<{fSI~7Fa^+z1iS4la&&dlqRDaF^TdYt^8!A}!L2vK6{;&coS!OQZ>$TV* zHnBUoKcbc?m;|+z$bX~08C_}XyK7&c_0hCMtQ(=wxvnVhZK{`GSL*3Hoavs>mRWgk zuM5{#<#l3D#X%ivby~6-uKkCMugH%%0TN#IN_R8WspP2PIkZKZuvWHGiZVG(W z5%|)7B5)#wcRK>1pjEhC)QJvgM$=neqo8cs8g|I?Syh9U{8~x`pvTv2p|81$NI)cZ zDqQc^{*z3OWMLHpvO472rakc(2BFw?Z(*p`go!TI5#3n~p6TvN^?)c`JHnYE#RHC~ zy;`4VIG|=47i#Hn?3I{$Va&GJZYm^0B6@l>FC6PY(`9Xqz!tS_YvaCf6g1Iz)|=oB zqIM9Ba=Th3*GR4sz=3^Ot}#ytoH|*e3{hFWz}cdLK0vC4nG|pYa>^L(4)?lFv(UqK zL$9EwgVcBnh9iw9buQ-+m7-V7(bUvtn72B?9_b_Bm;Z{{? z$2gZj#cuv9E+|#g4@Ehz)h$4NC~%#kwwr(FX8x%5RB<9II)J(JyT-Bo^BHrQjJbT4$wuKJ7=912CwHidf8WgbgaHLI zn{q%ygL4JR;OHLGCL3@NA0)^cn7uYD5z2g#&DAF)N{Y;~aF`uJmY&YJi zQjp6C3R zN(3Y_5M2WyE^(6R_*CPN{>&Z=V+G1e(PeWox||Mt2<*#oMugj3OY&!5x#MCuV4pYI zcx`wH>X0_<++`I&oa)MGzE_nOJG5I{RgGWVFSe8M8gs(U^I_y8bA=4+G;%k`Kg7pTCK0iT>d2(}u9y zMPVF6K-V7X+P%YW58QX}cq@wel2w*r4XMeH-zP~^>RrFMG#`BcBS&i znvmL_I6WbHjYpC35Gy;S|5WU4>BS!Y-u_~38EfIXOjMSM^QP!%{8=`jzNcSwQrEe% zfY^!+s?{1-c6+3>bWtam@AaJ-=!WDHG0B^+sPs^6^ zS{T6DtdJfng!#5N1gq6@%TbQpvz?sMCfTn4G2ZGcvWwtLK-n_eN2G0JAXl4SG(a{L z%XKP$38o^}r$BwHD+&dsaI7xnSp6$?6hnR8-1%TNv_;QO$@hJgFRs?>VXWxY5OR=2 z4l0}y3#Sw~M+#(j@pNelPnV{s3P+Le9kB2!FVBu-O$P+;wE^FEe60?bz#yd2jai&Wv^1 z<$ob~%oW(u$L4Uv_B7=%yoSc2-)H(VhN*&{}N+`+UHSQebI6dV$&NFCPG!=$* zD|(y_W3%nGe~+S@yq@51%=q2;hIFVQ7&P1(hpHOY!G(k@l*erBG@>&Fq;#)?oyziA zS-u>o$k4C$DkvG2@jm$twS{@v-ht>pF~dd_ed^n?**UXobKJJ$v5z{|LEy6`ff7@c1ay3` zA3id^0lNq}ohV}C7rg3q0pn0d?X)H8(O;mYb~=?wbz4nzKf?rHcWduE;twverkvyo84FA~`T#RH$+$dfFL^zp#Ql4N&{ z2j<^FHu58@x&$KEJfK)Sb0@nBPq@Y_Qm*2R=XuKb{z{RT;I%?bq-*x^$M~vKHqOaY z%Z#m8a0ZCIZpU8u*nSXoy;bMbh4kT#DoszG>ZEg#e%{HGkMy4$K4#{?iuEdgA<{=W z{0P#2y;bpTq#tzn#Yn&YL&Yya`d1FW6zPYY{0o@hNmpz6S0cSb_zih=)IT10LPRy> ztyAP94%(#1yBuxx^v&D)MZH>{O)fkO@V;5m)tgEAqP4itJJ3gAOVOrt!e54jGiuDiCm#3@dWW zk5t)gMYf7>8}f1$S?!Sdik#?}P@u?X9JEl8Z#iT{k(rLpwjvuHHHsB^vqP3Ba++iR^&Afxl)nk4q2zjIS#o_k&TX4O^Uq3AvY-UZin2c$W0EpNs+&I z$jyqp^A_c+W<`GNplymA?~uC{d6GkRDDrfN+^fj59kNrA#SWQJ}2NS2Y@bdNIrcBRqQZYl6~l`(8yF%jfaF(&dQ5f4lh-2s57&Ix8fkts^gTtus15TV{Zv> zD-ZYdxn#uT<3P)F7L}x$&TL0fI4W>!Fa0koyFh`AEj;sx2j2d%;&X~={#K<6kj`=P zaEh^Ilq<@Mz~DJls*BU&95oNR)1pJlv^a-$%sJ4X7E9$$A=&uIeFkAlp-;2jM6M*_ zfj_QNI#A~gPCDClKEBno%o|x`9(Dp_j7!hl8O8zy#=rxz2JU^q^)t_4^E2>AP1^mG zc3Y4WCj{CN+rLrpNKL`sm5x(A#m2gdIEwMaTNF(RS5t{+Tm@FDRRfpu5E*{$^oa7( z&o)exMDFb0DNcUVD=JYC`W-U{BBBei53A^r2l_-AZbCoEelOec@-(5UksM31Z zu~_Bg$?71|Pb`EF#1zFBv=dRYXW)#gz z9EE#H5rFPR!beIi6|-_L%aLd`987WV?PUJ|N|NE+e1$q>8<_8`tKc1VDoIng3E9ZA zKpfq)~g+PJ}y&)ti%+a7C=QgunSwY!*PSn9E@tM z1&}B`uXhhGPK1&NqszjNIjkJ6%7GWLbd5Ka@|Hg^!tuzY$=hp}`&j7Frg<(HdNfj4 z3HY)UxKe{pA&jm^T^emRlv9NrkSglif?I=PxE%3Jg6;d?tri_XvogAdp}}xTG_Vk( zIabvOt>V``CYwW9^Cz6fbe?PP~o7uGCx^Di?0g8|e03|6Yt! zC^;8_413TtII6DYeNd0Uw$^pNX3ZR7x(-VG>uTn#;XLNFwc72(19QQ{P>s{Mp>;^c z1Lxzf%q4*$q!N>Hfk*VBlATa8v9ug_`#`LfSp5PHCwLZG1hZrn%C$jVNf1&`q>I3+_9*`;Sdnxd&9IuZ_Y*X-Mbifqh>O{@_gBpXzU z$zM20bqR7a3{MP%yX68Q4y3bMcawG5pK`q;*?-CH;gzv6i~K`AALVdmMi1lI+(jD)8o z)7m?N@UoJ%sC6(3CvJmMT=vtjtp`!&;hxL`Ak&6=Vs!1;t#yR)&yn`-Gq{>LfV@#& zkr(0SE(}siARFtA4qQT&+UFzHGKN{lvF7Y&Rn6-lK_*=oSle}?9qVkF44h@(p>ha| zqrfCR9nzsIJ>P0mMkZu*jke?K)eZwq!qDI)z%UQXnVzO|dE6RRTlXBeinU<+0q z$|f0B5?8@-u|N;jX7RvB_`5AJ0-@hvBb%mw$)EPqKh*FnBz29^Z5Zj;fZO`ShBcra z8~WC~PUQNUKdfthsNc-+OPSH)m$1Q7TKp&LrN!xj=!vGC%h4dQKv?V?h`*oXnjS1g zn86Awc_n&F>jJv@muP9b(TOf_#fi6E=-oygo!+{E`D**hceR#}WB7)fF*xi-c4rJ% zG2IQRhBZH6S5C3!sh{}qd#)Wn?mUP}bfTr>?AG^-<8~yT7ls}C8z!%WSI=Km5WWfb zw+{UT%IW}$7)NnZ zzh>V$3<+v3MqKj_R(_DoMiMg%qn*!6<%h#qu9nVs(yiyyD-ZAHeGd4j+Rj96?l9(r z#qDQ627;jp-N7Fc*sWgP<#zBgih37iIkd1cc2W6u3VQwYHq?hMuEwM>o?PnGat)+V z?sIShPY4}*BmfaBA`fscTLE&z`zbUX3i13eXoc3ULNQl7g~nKMeIjF5LnbZZFidA< z)aKcZ>%}-%X3G+#hZ-Dyk8)k3_RF(Y&(lcR(AIUWD~a`vBnGb#f>ckq4;+y82*mR?}I1ztGsqdd*J>Cbz^cfgC+U!X>2h^N9a6U^Du3AXr^;M z9KEbPP?b`2g;DfP3<+Iw+mfs=4y6L{y4gmuwQxu;WG@_FWo^n*MRw>P^DV%bHEt}%-_5!*e3j@VfR=MUP*X|0Z;MZ zO@!|=V6I=4@C4zt20X%p^LqeSriE?7XQzc15YA5vuOob*0q1&kZzBAj5h*_0LHJK8 zaC@Sw&;Ifuvu@mu(AdAftjTu!%k$e*hC-*m@LTnl;1^n0Z`zR>Vn%d%Ka^T&B|H+X~>(qYTuM=)J;3K@! zUlQJAz`pPyUjmL9uy6M`!q*tEuld=8&rJ)L5*}~ByeUQXyH$h_HekQ*9}@nT(drYt z(whlCZ@_-(PQsfFSavL2L$rQP_{Rq9yCw50z{?DHq*r$?;foD8*Mn`slMLAR+CsuZ z)513q{>@NUAl8SwW!xQB3!0sAY00&9kqm}S60uXHitlML7}>@Wi! z<&`dF>CanJ?KXt(HQ+!E=%{eq}uHZ@1Fs<(}4Y6awOqx2JH8eLc;eNuo1}h1|0Idb_Gk%GhnVWRQJDz z@N@$`(As1!XGeTqe^pTkOII22a8L7B z37==chEtC>V8f{)12&x6{Y0wWhErcKV86X(s(ILe{dvsl2hD$Cz=m6*20X{JyM(1L zF<`^)lMUEt(8CQl#}obth4(z3YPY{;+C%si12*d3YQVnN-eu{Z8!(>)r2_dY!q=yT z2lWShr2!j0KizV83oL>_G$ehun`S z{8j@t3|nl#S9)#)TrXsX?YYJW3e-)q?c2!Gsw4b^^O z!2T&pAxqz2z=mp98L*++83yc+4htwe*MJSxG7Q)^tcj)H+>+`RL$w_SY^Zjh0s9U5 z5QVQbU_-S^13tlP&<>V9n=p?uGt7hWCm&Ks6AGjr=l%)^jy1irc{!|BN6 z518Q}C?5YX&Qy=_PE8w&2lSoq0Oa!!UU=i#?S<45$3GExu4^vORBieYA7-V7Et6Gc ziAt77R%YO_ie!wAV{c?~E9Y_EA;A2JF`MO({$R%%_`t$1{cvE)iagPEQUsT_k=s4? z53OC^3kp&tD|9^Wk8)T;uVmCl^xp4J1~XXcOUS6hvmsthV+#mB0=R30o?(ucVK+0Z zH_97RQ7vHDGYfj~LuZvbX(X%sWVN4+x|th`a8pDbinT~tn6>41&{nnZNS@)V7Dl#~ z(F3&Ry#T)HI$9b|LV(S?U#78ips-I>WfQyq3mmjo2^3&!@!L|5D;kKQ2FLn;9}NU< zmK@OMWaxte)YxUG{_5^8R9GtzPz7js{MOWR%0{{W;cnzYA?9Mh)lmqlq35WVc#yXV z_==o{KvOCfLPf-kltmSyDKfH*v?~QZMANm>y}yUQ3cz41*!@-RtzmlpbjLThA`7k{ z^>6B$joZ+eFT=@ys!~+l4gEOo!bugw-+G=JJ*^M!_}U;uF*Gv1OXNdx)4gLg9wXyA zK%M4`PhirkFbN2y^{*XC-!E zz!E&-_4inMu>l*Zoo~Q~Y7-1N&$HVKLU`DK4b?v6+@S?Tfmb@8rS}-Hq1qn|*idb~ z0gv*8mr{7G0UN4aYQTPju4C!%8L**Rb_(2{DCGEsVU>~3kGjP7C?&oB8$cLBq*I`u zNS07T16oLTjen_VH%mQAftu(1J?&?NHyE&gRu?`H@G1lLSIlDwUtz%h#5A4osRlff z21!6IAe>{se!Sg6_#0>3bq4|eC~qU-*9`b+Pk0C6Rs;68+jkBGywQMt)ix7eW55eN z;d=>RodUNfZu)Istv2l-Wc}WzK3nZ~IGNC!#Xl>Q>kt_!6>Qt;Z+qoZ!JDj4YgFIw z7qiYC2JD||%jKE-4A`&xT9#gG!2bBQj&P*``@-)ce6|7m@%9+ud;|9VzL)TU2Au2p z-O2*|-h-)jAM3&Sg#To~{_s~!__qe^Z$%amZZu&3?C8gYml&|$&o>jkz<`ZWqQHRt zVD4n;Lk!sW`M`q#fAm1A-9DU4_(cQuPj?Fm|IvVt_Pn-$@a+cd+kGqH*n_hO&o^Md^f1D9T6i?!F$U~wUO;%D0sF$I5bnA^)o#B@&L;e< z0sB+!g@k`+zmLUE zk^%euJD2by25fZTI}F$#TZ&kEg#r65b_L-Q1NMi#O2U&3_!uvkstFG>V83(;ub6%H z>r}h_PV`fje${~espdYyPa3eliD)BymjU}{X4WBqR~xWlcc}sUnv3024Olx`qVQ1$ z?3Wh1`x~%tSUF3-eP60u{H4tegr72Ce->;c{J#tsdrhbNZzTK!1J;(4gclg_c&~I1 z;TZ<(m(Cvyc&q{Ys$EL>AOnti!mA1I`&Fvl{*e0);XfO&Kh;==0{$-p_PhTG!ap+L z?|F4c2v-}hzgAsI_`;Z8{a6bP0ld^}lfVCAiOW$w6ezaIa0k1P)-z|BB7aFj?ADm4190NYY>qM6j9%sOQ z-3th38L&SS-AefVyHoA<4ckQcIRo}5Nm+2wFW%OgNq4Y zWWfG@tcLK32JDYa8wd|E;0rwA&4fR_E7k5=4-Os<_+A`h`A2s0fJ-CDL1_M69 zgLAV1uQFhN(^EqD3Iq0MgLQ;YHDG@>XeOLvz_Yx%6NJC{WvbnN7d-61mQ;BL>>DOyOTd8r(Lu(RfBquX zE&lAEISi_`8?awm#+FS6Yz!VT1NIHu%faIs1NQs(5Y~OJ0sCH){ypA+eYZ&eKG=Z$ zx}|^r>*uL<8~yuv1NN5|vg+Avz~j7F%ctf)HsBc^Ttax60c)xezSw~M)5#9PlMLAJ zM8P8g4^0af68`MYRJ;AzU_Rl$8n6*e%?9kdMOIutGvFG}?rI9Z&Vc=~B|&($0sCWW zVGiIa20YmpPI$Nh`<{jiI*q>@j3BS7`)h+(=eI4Q5Y2nR;e`CP@ z=pbXuEe7m2iHuB(4A>|=(}4Y0dzp0~XTbiVC`ovb0ULFH@Y7Vg{e{VwEZt$i{-_ul z0r>X@YzV*2fDOZH4A|Fv1clEsV59U&2JEj>3t0Lv1NKYHfc^O$sdoGKeHOFyUIX^$ z?p&oN-%u(JuDX2AZ&qm=Mb2JE-k4+!_( zo@)1DUfn+>+-bo6(qc2=Z3b-Y-tRSF-{;Z|>QmtM#IM#vm;ElvyvB-3ngH#8QD#0y zXc=Z_=&vH_QQjw&Sl zr~#ko!5ay0FkpX~w3qNI1NM8}*inG5FkpXQdj{cC4cI?$FD0B~!2W6?M);ebq}uIY zwfi~Y*9_QjODo_O*lM*t#N2ft-Jfud(7ov|LUu6UIzy^Iymk^^Xu#T3el*~74A@@) z6%rn2z<%9x2xl3v-y4?^e*d;qfA}5dM}(g3Kem9F4a+w|DrzC2c~^mQKj@ei>NtL*~R?H$Zr2!%2>E8R(WsR8?E?+1+rTx`I8>1@Ii z4cM>yOu~Z=*pI$a!XN)A)oy<-s3-iA0sFTWY$W`M0UQ114g)s&%?bm~^4#(ig_op- z_Yj_Jzz2J!Une}wfQ?T16=PUyZ@={WEd8nh`>K6K_(=mce14Y!`}?WjF(|z{1#VB= z?e)q>et<~NWuABp`l(UC=~Jt~N!O>IL^=P4FQ?C@^r_kGIoe1t4$@Sgn#!_npUMun zeQF>xFv1f}DB6q!pP#i3olKs2D9?byGf;wUs~Jngy6(OH{-b> zvhFw=G8FIU`p9u3YrzxG)uVA5ehQ-;Ggt~yL5uVkik!y+?xVRIDv8pU$n4imqfSE2 zUhxjctMb&BBR#{^6HR6~)?Ezm!wo0*UFscKzR(@2)P+u|;Zn-qrJiF*;79bKEpLqkH1(pULg}5!iiBbyz>u{;iIS}Tw_@q75q?LD;P?#Fw3o4Sru;Cg_q zD23G`*j(R+vr2Rl5{Zp}XO0ngM`KFbaaU>t z4YHd*f_77n50a;&JPp$rKQdC|mRI?9 zo2?F7(fLu7vE8SmOm|yVJ!;K;I?86KiF;dl<2A=cn$$HcHESE{r?|DW2q7qSfqsfH z+~-Jn5G|DXEwr`*B3*fuasic6PflSZaknQGJGZSnxfxukPfl5Za_Y$`dH}YhJUQiJ z$~Ia?g=u@@U1|@H$pcMMskB~b?H@H2LJey{^=(pN9f}*#pQ_-?tRPM0*Ys669@#|) zB!7yP6a6Zh!9(v$M^iHpJ+_*AV!ov=dY&p!X%u(@1+=H6NPPA6loYMUUXFgyvJ(xf z#`7=XI80QLKEm>h)ij*Z%K4zBT?K<065etnnQCqk5A7G$y*H+m->aAZm0o^%-{o6V z%Uj24dzEs%{K+g2|8JmE@#({snp9aw>#`1aWyzhRH0TjpZjRBRhPSYaa)UOswwN1} z{X6r4sWlboHT}*tl$F%65;Q)ww(;B;V`DQB?WDuT5yxNyHa0dNvp;CU%itEZv5_N= zmkiiA;&{Y>jU$db4A?m0V1L!?_E*tz#KG}Qhm9kS$p&m3aSStHGmJ3?Z0yAb z8nCe!>tbwcabRqho;6^97b#~Lze|Df{5!_4+Pyfh6sluf;h#(sgT4 za!|0{fQ`WUl>r+E1q}wAO}B6~YW)%PO;i}Lztxw6g0l?RI4C&Qfc?^PP!Kd=W2>Ju zhMA*1)izPJXAIZ~uLlj-2(McW*xygfR)4Vp`@3=3%b#z+MsQ9rV868N<--Q-*DZVb z4>=BN?QLw<_oTq>iH{IUGRL}4s$H{_Bv*%WHaU68AA`CeA}0= z9xu2Fg(P$G9;(TX?md`uCauMC<1k^(_;Pb{7bB7H+Y5W94qgq7LBtoUbqkC zd_Z?Xq4awkOT_UI#M*Jbdh;jsrQU(AdhQ$l)Wa0{C`ISV)_86+o(i0MaYcD8zVnt< zOj}xsME=q!p2RyA8vs1?6{_*k!JPT5U4f#LF+1Chd_5fWRBs|{$$b`25#|Vo{_0LL z^2U*D^>pR|y8>A#hxdBovDKk10Sg45zZ~nS#4~31g&xJ9*!F#Bl3qTpxOYb?Q29Qy zeamd$8qoUyzK-MHj@Xy6?n=Bt>}%%jVcxGpkK#Shl^^WDA@ap zT_S;5Cl(ltVu>#X1uZ`KI3DP)q}L9R#~w!q<8@U}ARNm6E8^@H0}`UBM7>e28t#}9 zi{c$#Xw_2IFE4OA3eB51d^xm%6Y$XLzuB=4d)t?1*q`HNWJrTs6%QP6qC9_-?~kiO zC{KyW8%JZ?;zReHATQ3Xg0RBI%>J>q8L_9Q#yTG3)F8VtdXzDgn8vvi;!3+p;(_To z=>(1gBGvp`fgj4iLV?aJBCq7kUD_KhM)@hIDMC4Xo?YK1~ftzfCb?s!?hvs%51w}3lo^|nv+{cJp9bw{iC@%gAS5vTmRA3@TO`H+|o z?+t0p?8nEMqaWclclq|`uh<#Sz)g1SuZiL4yJ#PDHtbc)P++_lku4bh?YR3oBRqF| zWD0yY;CLjA2WJm4kJqAnJ&iBuLrgPW!{yoTXtnW9yi>aS=HVZx0kj@(&SQL*z+CNx z1M$G;1+tNM+`bah0b@Yn*pM3!>;>FXI+ah9mKaQ2whYk*r!!z42gm|x<7C(>Ix%o0 z1Bc{4gSD@lq{BKW0CXB!5qb!;=@DgeDaJ_Aaaum;k zrhJbN#6YqPyYawis$8b2eBZUuqCN0q6z9jSPrZPyG}R&OQ6 zuvHej1UY8>3daiVfgDFDGaOI$83;EHUB_2q7;T`>6cr160lgr!2;Hd--vtze?@1O8 z3PO(t{suVoXd8_vXn6$~gx!TzCd?~>6He5NvPWt~@9v{$xmUFIWQdp)3)CVPQ!Uv_ z_`_eR2rpqnlx!uJ0UCZALuLTR#RF%e1ggGDGH|qPp{~$t1&d0n#N@q$5P_joo-i)$ z>&lbqo?cmwt^cmT@i;WfXb8}7*$x~E2I_HQ5N`?_{>9;p4{7$9?i(zg!;{iq z#2APdJIG74jfRU4-}xPdawYox=z{kOVX!o8IJIG)!DclcI9utoC>}TsDc5H=eyMyW z&&e+opS93owDAR$gV;Pcz76d;5XGGK47=_59BOP2B#u}1SGEVy~`B8tAQ?@5;*P1fuP#$MExh%Usvs{6Wx44H7#c{CNrV) zX+0tXPglmXnGNie@4zOz7+az`_C>7Qjt$AH#A^k!Fr}fh;!VMkY;;OQ29xZlb5wE& zlBFscMsl7?W+J&jlAOUYO|>5x6@*@k2#-sY86I|HM@Rj13SPVp z#vuWRKnN0WM^WC1NWdA8h6G#zX-HIcohS-mbf1G6rj#q6tavnUK^!l`_!lyi;8m$} z;P+B2oaV&$Az66)l$2e4zs16PiLr!hN-E0M?zZNWQJg%UT#(4iAgd?Nu^ zr~=Sg0A^OkGV^FD;uPz8L6gAxVtGtD7FNPkNJ_O6SAy#PJMyTE%IOY^J^0oXF`6P4VbI7rg5rK+7TanE_ zqB&KtPI>o`H!gtTHB_d(3Rel=?J#CeWS+Y!T#Cm0#A%nejl05_Tpk-O8&H zo|+BVvd4!`X7zYs!){as4Y(Y@{e+7=CC9M#c~0$XcCupW39a4K?I7A;uijD{Y_-OK z)w9rL;c@s7#&t);TbGZ8&9oMrzL&%VOFVa%GL=i73}g9BRg=dx)k=KJKB~U+QzWy* zt=pAb#Ecu}L-!uo0`z)E4;{Y}IOJT1w#dy;vYDjYQm6&T zFRjd$I8$aN)`Ez|AI^ps9!+PMX$*ngop+}@h@eZ_DvkB*d{c;hr9tR72@ zCh~j8$Dc^Cq7&NtP0<4X?lq<;oM2(TX0vDccfHPZ8!PI@HR!O|D>`X!apiK!Q}K2X za@DE!_5Cz8-r_1D(j%{y#i@caCRSXa673Nl?Tg$VyFF4&g0(xXNigwu>9`C$aZqEi zNQBRvmW?Z6V5qGf9EsPys z0+fCIX+;+o%?ho(pQMbr*o$$X&vnMkOdPPghlQ)5;xwh=&_o$-h=z*tLLO&VcYXZe zSXt9NAMM6QEguQ;3HWO%&;m`*+-e-EYo$krzS|8 zV{nDJk-6)4mZS`w$QMKw*<&Ssv(FzHmE$qGW+Dp~#2B#Ec>VnQex{XhQWeK{e9xk@ zVEdWS5${8Du9ZKIUMN>G5SLZcXuULsNn=>_$x_WEDb`wF1*XGlZ)$FEvKL?dW2eWOe;qp>&Z|ri5kf~ zu&$(qgB*L!$E*Sk$=7eyK8X$tvu7bkl`Oq?a^(mGO65q-f{D~WxtE2Jv2<$?sTSKg zK+b{oZgd`{@I2z7@w0&2*D^ zO||_syzVBdt_!>%he(0N$QIkyOy7wsRmQ1W#@`?#ByUubha-81N)ATyR+Thg0KZZO z|8~Ava1h%WQPhv$K{PvsU5sLWdoSvvy>G$^qS@X{$TQme3h)?gac3Jdi$ekY9j3qW zNixSQ%k};!KTk>vj6t4Vf!lC!m4O_=3~p2SkMUmr zUXa%IN8HmO$5x^( zL=o%*adze5(L>fC8{rkW!m$Qb;eNxwb@+BiM>YR*K!^>=i{pRp?6@QSopXHVEa0LO z0diI8OuQ-zpX6yN`IwNE7dOb!8IOYFy^w0zF{}1jiYocc3pbck)%#jpOMOhFS@v%#zp&t;J4^ z!4yhS{{mh8{*L-{JoWjy*ZMY|QasfF{bSoq3(n(6WO5ZMHq}4YQGb7dz6BYM z1#-GRhw9HU)R$opVX}acSi%V#lZVrOaC`2AnpHLU&YMuVa2dYy7q2Me_xOqlW##xT zs9rcBitkBfS65ZwyRc?L(ZxJDXm7m-e9XD@=6dhu=32l$qmS%S%*TsVLqjvb^p z!`*(0Zi(+>T!$Bn&=rcX2md34NQAVnLZ)tZkWAO?Ny_YZVG4?I zCtV1$r!WgVnyCza4CEvj{6>lN7tL5ZWsilG*yfQP4|f22)u8^AOlxX&i93lp+0Hj-WwxG7k8}^NRp8^TfU2*O zW>Cjbs|Gd~08Bo{99S(eT!*w|R0iwZ1=F>cN%m|scDA*OZ&V(FRyq}2)-e&~x~kQ+ z`-6am>pR0dQ4)^4V%Oo!RCx}TJiB?^9qw`pd_cmlykBK7;#U62rF!K-*2r7l93{2@ zMKT8?4;-UTf#QMPIBbOq2gL&|NG0h!aX@PgT$#9fj(_XewOIabUFqT+JzjCoqjss> zI}wcTD0(JpU-|Z$t6szR^(X{?&CFX#5nS~l#3>*j$4>65V{m(*5E?LW;(-&8>YAVw z`5_f~1w)N18aW36$2tu;gUsn%=624Drd~32mb{iWn@c$iuNY&aytF$j4}-u=yc)bA z?-SJ1OGS|GVVzD|q&n#!YhW5)E5;jsLq(x2dtG7>hz^%H7{qRu$O6&k5(kC0B;54C z&=zzzCF{V@mTotV16W7wqmcuOLXSEH9*tyzKrcm!ICidBcyn|qEy7uHVG)ceD1tHh zMTm#oSQVBDSoFcpU@RwZdMr5|hliWAo|8BnF(~C*K2z+(BbR`Kqex@O${|XEgn+8+Q9-MlM?Agir_aSEPqE;L`U24^{T?g zhP-Z(_`+5!k^Pg{52z=!kyeRLW_~5^R#gsS33*quTAAO?G`VBH>)zuDs+uu@$e!O( zO!mH!Sl9^%)zrS-yAaL3BEz5(gT{Grnh1nxkG+jfrNRlvl?=GqS5BQX^~xRpj|U+} z6x)j8;Ntqch*g{ARGNHUeER>>0JX+yd(Gvu;O|BRxEG*97o9x;==mSYxITopx+T`}Cb0?c!_6s&9+PT0g^%P2Y@# zG49Q3!%NZeZyUNV-VJY$*~x~8r0`b2w(=9uWlu_ZFxbwT3(&*9wZJL_-Q zi5KVohK^8`v=pmwPRuE0NKM~u*Wa+)3N^&VSJRvA#`AtFW1Tbmy&`9h^%HK3y{!`&PrdPPM2*c?HAdI(N4S9DXiAeeX&H#m(3M-KRd=f3u$EZCQpmi{FH64g!x)HFf zWwX=fJ#2F#5bh0N7oX3@1e2b^1j27Cn(ep+t5^p@E0kQs@;nv8`fldQ9vu1OBE8*si-ieQp78GkQZ{ge##1KS(qq7BA35 zUVRlS-4Gl{<4+??Z6*0GYsL^ix|2>sZ-mbX@y=d+IkPSACcy;}cPGuIUeJzZ@ebGV z48%khF7e|aGdci2oQ)pSb(S5^!XAdXa1B39XJp&zmd+OB#Go)9zr{+MXGD+6gJR>+ zJ8<>AF9pyUxYtw)#L-B)0@w|qOZTO~k+@YzDUd$TN*t*%kFNj^wPbh39qz8cC%7}z z!crjBT8G@Sxp`*dg(4JKqt0&&$u@H8BgAEL-6PLkMU>1KRJHkwsP#y?8Z5~lN1u2 zUU{Sn_?ZalnO1GC>ae_bkfWIDz3qwdugExOca5IdHu3KhpO*VrYz!4ApX&5)fwUclU*=8hhH(twXSc>L+2aAbV;6X5P zKM4Mgwz|o<6G;izt_$Ff22eP{sKxCsYnT&#MD|Uq_Q2b*Km~b2=Q9)3Q1`W7=uqfK z7>xqcNXltAl$2u(@8UhsJcUN{)%Xz@LR$5|H_k;B?SXHPQ1{EoTD8xP&S3(bJtI>( zyL0CG{np6mI0^sbTQXkos!nv6Vjc1N0A8^ZmXrB>HM~rLlj5jOb5a}DFtNbRV8#P= z_>1#}!=TjV{~Bj4el>#iW8hLG5BWy~c&XqJ3`4VbaFFSd1A1?`vE%9(+#O;5ir*}$ zys3w$9lZ64XHWSOlt}QX25U1c^_&Qi5$a^w1~9Uqe*uY zaOL8jYNTf}XmBDnGg>3}Jw>a?2v~Iz89#oRjf?6jH{ZMZvYk30UjeSiW3ftHwbbDl zWgyH}K0Vxl+7t63M?xw21E(lTusq6!y=C7A7*@zGf>Ha%`#%A#25|jcxIm64i)|5v#zDk5giFXpI{gr z!kr0*M4Y#SAJmt=6L6;M9{ik?Qs`AVIzS(Q^cc_Ae0kdhLgTk(cOBym;;OFOiFpHA zEqp6JM4(_8*Ny=Z^@xn@$R$(Hg6z!t&Tcp{r|VRiilsK(m>;*`h-|)T2=lYc^vt>! zRVm*bhM#`qgyGB_=cgZ!xs^(ng}>be35FfH2bWjgFikTGAUEvEJYP%$2gl~vn`ID_ z3{WIr9l$;ZTMDHOA`pwas$?dfME^7D3*Cf-KNxvr;5$rPF}x1JZ(Z0b3#BS}H%{+D z4zEci;4u|W5-+%PI0~hc+wq4TD361(s0^EA%{fY4Ay9|f(E}lAQgS_V!()&PrB#sE zW4Ls$KRLt3wdzz)boqet5h0B>%$+4aj>v=gXaalkHZeOo9usw*R^$o22Pc{1#J@$1M`SS4ya9@?p);EgdpqLZ00ka<$NSURWz;IE&l{k; zwHK?#IMtrWyGmYa}hHSf34ZaKp6%885P zxw784r%LMX5y9F$RU(+TQBh%p2Hn;kk%3&B6~GoRV(VtdBW!GKW?N{J(ZC}6L^&P(36Mr~Eg{SK+iB;%_+q%SC?$rvm z8E*2wZ7^qXB;szO!A;!YCYHO2rEX$@BKpsNZxrZcXj8$7dMJ&MR`Y|%*fEANZ5f+R2bT#Vr^ZRmwJL3mH2y9hGeM3 zXqe-ShVh}dKrq=k&Xu&lDlp=K8vJ!uDxtNwys3N~!(ne=9w3$3bGQ2GLKYXQ*wl1g z7i0U<>=lKm9fBAVf@HIW+PFCI%df(HnjF2 zi~`92XXL=+Dv);vQeZrRug^Oww+as zg%lhS3!IAt;$bGf5N>kWbLes8@h~(Nn1p24f#`RKBOx7dAQC~E)gKA|q~z<+-B=xm z*5dkDFWB9KXmkfsZz2`j#`gHy(=za9fdjknwLz@>Dz;Zt-2#rN`a2}leiJwGJHJo} zY>;B&oXp4A!(xA;*{%d;JB;S@2RWNC^Rd>$IPEA&cI+!&_}YLUbK)ps9e;yxAIq#~ zv=?SrT|-!)(B1&L2xl*B-9q#?tQf=Uy6Wqa6a6Az z76qIu|Lf$|P+!+V>UxU0vEZ-FC}HBr!f%nS*vn&f#k%(sE8G0ju}-8bSnhPLZ=DFC zT2rXj6m_TdU|XDy8x{;h ziqs78Qc?}S5al?IGEQM3{9!XY{^NZYazn&A&g%uD0dq}>yAGqw5?YIsYMJ_=uyPZ1Rj$t~lBmXTOxK+* zx=5!zT{>-OZ2_0j^*e3n1Pni9`Y?t8bq;^ohPycEkxWKf5Ce~m8_viW#D|8nN>`hKWTsftZFQ5r93SV^~$K$qbJqJ^@Y^s($pmrj2*cr5g3C)l}7_Wd#KKU{)~bL+&GZ=v+EQ6v5>*0R!!B^?(lSR^%+@f^ zur9Oqlvb>c@M1fh?ut%*yMql$Wl)_rdrFrS9}N>9h1PO5?Ylfnrnr-uWj#jUsT)42 z8+(tDUDRK-DQ$77v##4-(S68t7Z zwaII4R%t|x>9g_%sz$WND%Us#dP8m_@@=I~spK&-Py~L4<6CJ&)D?QPK?MNx8%X^I z4!&_V^AD0(WZe)YnO}8BV4*`kcxvrN~+B3wZEm?n0brD zDkePmY&x#{Nv3|QtK{3N#bkqgm`aO;kx@IO6_--*Vi#N>sBi19YR*@FDd7H0xC;9z~k>Q^c?Ey*=GzMyj)^1OJeXn z9HmmtEER)L$c;8F1~sl8gIOvDrRNPiSZVoNYH7ycHe5zhu@@~ATs9U6VwXsnq+>f6 zJA)9r_rf|nn!^kFfv_?>8$TL>o%wQ3AVVXXtUa*mN_86+&S|eha?&Re9@(xyvPdPP zNQOU+;28%uFzYVC(0c<*|2KK>0v~m8_5W`mUx*q=&_ts~2ofz~&vJM%qrX6DSynVB#tJh@3DY`>7LA9k0WNAb6LV`9UPU=l{ zbnaIk0~bww`xNe(@x!IJ0v`T&zIQCEEs_E&&9oT&@WY`oF3%NYcSR@fW11a*lr3R8 zWBp3pU1K`9tjaGn0RrHxN(PO}n5n8N+wUZ8Z7-mKYfHV;1wykBCXqpMsgYpLl`Wf%VvFY;b}H`zKA%0fM~@6z;Dh#Oz&5fMGh6d$+T&!C2=*Zx2>F2=>UqNj zzX7dXSM1?U4OOx9F>LhpC!D$~mYUF16^qXEdu@N*JF8V5AsV!u_>Uv9=8Y%^;NxOsTI^I%Hkx#*1GYuRu&({kbA_7|*P*fn)bWD=2YL*EjEQ+@4}iR8wP} zcDII&4yTBnP$reNT@?Dff$L6ekD$=1N-STpx@W=irj|iKs50=E4D? z8YVmYNo(Rixh8%&)5Kd-QSG{tK*K+&hMnlOz3K($jS)jD2T{M_v`aG7jsX2iON(QW z$&GE#?Bejd<%CgY!HEjz?T0{g#5U48Ft`W^{#hXx{9cyIT z2Ig6%fs{qf*y{IOSvUjKvW3_rrDRvB#Wj_@CzOw^e||z1v3BjHf$#}SqPT2Gt?n5w zSS~(Jv9X~#Sd}!+dLiVj7p4&SvC>+r8O(fNnh(&rc8vg}w=Oq5Hk5jft6ttsMpp7w z$w?*?e3@)O5%am!2qh0LWyDCR<8(?75|(F(vr7q`5Z0R^%vm&RjOjlO`uITghBryo}>bqZlB_+ndzlOkUbU)}nSxU{XRh`qS z&5CdQ%4P!ab%Lh{P~GctTVV~Yz~0hYqmqaR64CcwBlnjrEU1=|k?p}2C4=2Spdv58QPo zO9zTXg$7hN7UF=)Ok7ckn_T{=MOG;z@{J^!9=D!kL{fe-MUiAS2$PA}dt0ChBP#}J zZfXq{{s^;kWaSR<%qC}utwi6@6YAV#I?Gq??7HlnbgakHB`RT}1Dq9{PFk(ON&H$O za9d&1`@!htXHUpr2QFO(h1jAwKHZU#bcePELx^9H9z^ZflxDXHo8B+XRIwDS>B5Za zI4iGa_q8sn)!d?aOf}EgXC8((8wnWD|NHl~{9Ws|;Lj7BT!4tM67Rf%G3p_|M*rAa zUm6=@GMse@8}J;bS5Y0Q)jS0X&Bdt)c`9{1cxUu?c%*s|sWRB0uWr#Pwth`(dp2ys znX<<61@$DE-h4q^&c+M&m$Ol8a5xl+fjfyQB-MkYWJAL$EK%AT3{yD>Xn(u2to_Mo zHwjaZF}C|9>{_fOB`ie1Qk5rt31r}zynT<}2489|td@Fk3x3Y0px=r1?J(pw01>7=B{WMDCq#PpE$sAil zFT3Q)V3fk=#5Y%nt0Z@L_`*?McIvh`N7EjuausJaKkF~f``{Ysp^V885PWfnogIq1 z96EEkmT##q)$k8f;i*aFu^z+(8MFp>k)oS0?BpGih%@PzD62-C9}u*!b}hH}TWYzW z`B0mWF2bR=X=FbOFExQE1XBjbyDvng;Ml`zXpssuj#3N zHj)OL0`=9rkq{@M<>!JC3}Rxel#jPDohn^t(l zzK_%hB5Qr9dZ}WpLaw5A2N5^5kU9laUGgAAyA=_GdimZWcg_L*lo^w@4$IHpnM%_1 z8f(}(+2>N_KorHRX2#OA!hH>LaxI$L3WaoP9zO=`F8hC3lLnQf7HP7fnI_YH+o6Fq z8AG!**-&e;yG^hQ-Z|Ju%rx27Omx*6lbyvX)>gGhUe#^|w;*iK@Idjmw&(3+p!TFv zhrek}cm@!@PQpo+ZvrgSgl*(wZGNz8^L;__?YXf)e=R30%eVI*YxoE@=VNJGu(2noEhzRr84@c}pbibo#omx9$)l4rEjs^o zW61XXjd%Wv1MB(u_!al1`54Srz8HV7>-x}st|9+QSyd3dha zZa)r5r0(Kpee-aC>XDT9BW1B3E33?Ox;L$n2!5=rOd{X__c%USQevN!`eFzQWdiOf z8=AD}dBRFE*nrd-m@64{nM0VXPb7M!rlSg`qhivlTqw9%8u~2^oe2K2ZJrPxI15t6}KTbhFmeo zV4;W=Hx~uTU{m{s75mt?Z5{+0n7`{W(Il9)oSz`_Rj>GwM%&pG5$VjtmRDK3rsnp6 zZ8u@Rth*u8Qkr6X9sHac?aa4h#Yw>pV^vcZN(9<686^2K#+8vC@`Oew`y_)i3~@bD zV=~xZP0ZX4|JI04(-)G8iBmO*VXPdH`gDHSfne!MGN^Tu@n0CM#v9l4%uGp91vDv^+bYQ@+k%~H~2XcM`u@t)XM z$;Es*gCXjTa_&`fo~JE!&DZLW`$9ryHVH<3EAg8;;){@v@TK?iaYrH_?d7??)^WWR zJVLYMdf!H#?Uxb9%^>0E(n+$1sp?i5+h3$wM*hJ`mRA9bvi)R1Gi*P>eR;MY%a>#O z?a8eNwMH_-g(9}!S`;LM0rm~sZ))F;?Kd`m*KBVxS%Fx30UK+nfAP~DUmNO`ppwsH zR9a`g-V2fv!Q&WGPX>?hi_&obsAE^;btaR?W(~=#0q6ji5}}(8a3Vq3F{O)TQ!O2IN1)+MH|5gyT4=|;6gQLGHAp}mJa|H?EuFJn&|+Cx-Z`W_U6lVfMMho z%D+NU2N);{kbmu)4p462t^@SLpIX&h|t+V&-orJZaHy*Br8-r#c_m8@OPrE zgTp7^FUB**#AocG!Q*6p=~vo0t(6kKw$QZaB{RAI=$_<^I}Dij2lf| zOJ?3lMP<8nA0k+{?zW23bx~es?q`x_zY{3x+lJBnT(SY=mDv><>2~**Zui9YnX1J; zzXC5AT%$B#WShlP2`Vss8mf?43f$^^Lpj4x(E8XcR>gUv^nsw9U?_(h%0W3O-*6Z$ zT?5KqhBDGnw#z}8O)X{>l?b~cK3qq1>@J%8I^r|`Ve5#u`CuLKCmj8?1+REtj-ArB z;8g0)CZ4w7G`#vlmHsolM{bHLy)BsPp{>E0_&95#Fr76yPVQvoUbJX3J0#jLe(UeD zPE4Wm(RDO|u83w`=&`UT0y=H^uiQsqw z)Gtb74R)b1yZyF}N}C#JeVC#25JL zQ4zKWWn(X4Us{PlGQyENi)AWgh7%KG%Q9jg!$~N{p6bp?tQ8%@oW!XDc7gKjEZw>Yw1&@Z@?GzlNj72Si9VMZfOOtoi z9iY4+4QS8`j3j~{A|7lKU*Bm&z7_Ksa(R(R^RZ`|7m^(9HhI3Zs*Q#-kNOp z^?D>|b+X#~qe|Ge)Vup#W!uP4!^xvLO?j7?T)f%+S7Hc-^0$UPhfRW6DhY zTfsl!L8^ZEljTcWkuA)&IOj2gPpJuVUQ|WRQ12W5Dy#VMz5cOag~ySk3(k8tcY$-i z$I-9?&Qo3CBs`8*g5ccJ70wABM_OKR&hH9mjK|U595_Gf3TG>iqpkwZj-7Eb&rG1$ zp&CBg)vCenk@kw<+E^QRy07dFRUNv^eFfy2t!xt=WtDZ%Qf)E9G1c_f7QOtTJg#tg z=q@UTLLutO8*C^k4PSBTe+^BI_%lj8!B6(dp+Z7Jc8!ZUMtPF*DcQhLQVpwQaxU$h z^WNkfrZ;NoTo`Q~L#JLQ_(VG{sc}%T+UA?37@^}d78tg41Eb9LWX2^5WkjP+1y;pW z?e{}Xb@1|im3TDAQwZ)o>t^n}J9?`&MhQ7RT7^SgN}lp`RXjP;j`3)eEMv6sTPJHY z_jkMs5p@j2b+N`x7El78t-9MV~`8l@gYYjOmf53H}s0T7Rv<0zq1X-#F)fAO5A6 zELwwKdB|E8Auh&jhx(-e?&!_M_b7=*2S49AWlEtnnCF}u<)oI6k!O!co{}@kbK7q7?3+4Gd2Yg(YyGGxw4h;+ z*O1z8C4Eo=om`slQu`xz#dAxbUSh>>3t~%##-_%{eCs0`uuW?I#taX;?V7nm?pf*X zLai8FZFYT!obI+(gO@Hm7pYaVdBG5eTSH6Z^Uu*a;wFQhQ?CqngVibT|8_1&`#0IsXqe?OQEC2H-b2O z?3maB^kSi~Zu>|@sn;+im+fE{zC~)UzeRwlvpKPuT?LpNB4g*;af+pmI!}eAIH?K`&9YaRznpmC><61_@V#VDeX6 zbM*`O^+%_Z+!%7hPLePl4GMSYjvEf-T%c?KmD(`0kPTjvd<(l_|BByBT3{7v2uQw2Zw{z>?6^8U&A zZ}tAE_@DRwGw{FU{paF;+5FAb(_Iz3;y-7(&sY8DT=)5!|GeIPcKFYE?z3otiq>2W z%d0l~`Ok;k=gGsVTtZb{t1 z?%Y5$!xidj5G$e!@@;e$_yDV7L#1~%Ed!1UjB;aDa0`!zak^vHVsKOcx-El| zy8qW2K!Tye(AwUOKM~Z(dkbEw-=3Q}Agq>#s*w9RSJ0C(v_Hw{Nja<^Jd7Vq>si^} zaT8GWy;%EI_)`0lZnFIA?U*^2yVSR!;f(okjm>b4q0-f<3d4TMVe1HXLn)!gGGVOL z^P6XxK%qH3Idz_eHg1r*!aQiIG_Cn*Ai{!K%J)e<+$^=%?n7-P9*F~9-_&ytXDTf% zD~u{L_1MLLFrTWSB8*$j9I;i;)j(6HwefSxye!41A}zc~`M%+0y9dcC8N5A2&ucbr zM8IzefY|+$<=0wJs|B5{pc@E6{kVOy{5%V~*MiPb(8UCC?{X9DI}pUikna7TWO+n} zne>^oTUTRD)mIg@%g?6$nf#8&arUKp%*)iA zZqSz>p(yucqby(+inV{u4}p6q@WE_gy87En9`CZ`50G58sshv$|o zGr#e!a!$)pWX&;E$?|JztbENlu6!Hao$ZcQ>!-Hys*on`IJ%CT?(IDoOI;0_?y|R6 ze_(x<&TT<*5G|yuM4R6WH!IV zL5;V|vh0?9EO`)IZ-alhz{^=K??=hhFST6W9Y3`^o8&vKf_hs5S;0NW=ql@9p9sQi z`DeA3$bR{W_@&fcjKTDh_e>^iOKr-N+%(n8eCn??ctt)So0Ee6uyf;m0M~63qKy*J zt9u@C<-rE-ZEffC>`Jh8@3n|u>F4hHn>aR6eE(FfSJLhTV zEOyR9IV4=}sdh?@yKi8$ykReX{&ECA=jyYhnxEq&ZI+=jOdZI^NNQ}EsSqoaPkRRg z6~atKC!ywWt;ltW!R=*q3LWi2CGzxiGkE_l(%2-Eh8rLa`9+~>#i4y&8`xGkH; zrroD;K{gGvpLQsY=Fdu?2P!;cE%GhaF{v8*Hv>zhSSGy(EumXctkg|kbtgb69=xc| zO@Z9-nJ&CzIk~xOOyuUG!lxO-l#TNpOdBfUfZ;80WCrC5O>tf~Rg9nE;;5}V4;SH} zJXho7T8*dt{F|){x}zS5SX!_4 zthGz4EJtGm(W-0JId!M=Z_c{Vo7xcVaPyH;&>q(}45eWjdOj|EXelL=K?Q_&kq%dB z3Gg@kIU}-e_{BO1y>8D-crAvhuPHSmy|V!I4t_)izH53b!6!TT`5E}(;r_1eK1>pa zNC6aA(QwDfmFa`3?0rnre|_|g_}|ddJF}lqMG4~WW+3;k-F%heu>szDXxU&D$`>J2 z@mhqulq@dgeY}^m=d!rF1U88#p!|v;Cp}uWxOB24FT;0O6I+J5BFvS0e#p{3GI?(3 z@_eG(L~hARM7b7cavj`NuBS#L3|6j#eXctD?Mm7=l53ZV)Z`>Wu2%KRor9dQ^u<)s zxUMo^!*CQo?&Voy%WBvJ7YZ+;!3>2piKmwQwNRD_Cl=QD*cNmOpRVp?C9EeSUZ%l* zEgjAK8_1HGVnO{l-9(M|P-FGCB9zQLi$+m5sgh1@gnTIA*)@`nPdzc*^z{53Q5YLA!IOyqdkzx2c8>;MZB-lNy6&vtV?2DPaq9Y=GcL8{S)QY3LXM^G zpP@|4=iiM`Ub9oE4qb`BaQ}R%y4q5W|N5pQbx@PU!+VJDH#QoHm%6x>$kOZEFlzLe z%26B0TsVWNLXC-+iTw`Xwk)0276|a%3!$}Ywu43q<$ZPt1<>e z3pO!J<^qe7R%H|}3mb3EB~}?}mALE5NZsWsb z!yq{)xT@L5Rn4)kYQ}V~nv$7~Ft3Yd)ib5Bx0O3xBj7#_20Xz53(}hiNFs8Mbrspe zRb+okl-l;`E-Nx&kH@*{{2}`93~#B@3te@d8iA`im#h3?)kLb(MX~Dq9Zc-{!fh8@ zb>19}lgnE--07X!%EEDsXoLB6t-lfl1mCA8^U%ir-c{D!k|P8r|u z_%BEB+t!2sh{wM-f`4l+zFYo^tJZNmtHPc4I$v&1&S(0RPKu;-RBlQ+`1^bOF%kTo zbMbR>p2obO6J@8%%?UZ$hx{lnWM3ch1Gzc5rwxMbVBD}?U&r5Fy)O0mPekw^To3+% z9)Ir${;uo67v56ZcJ~PW@b%zt>G3y-;P+k+{=b;sl)k3Pu)J^K@2&2G%xh-Na(NfLeGwbo|qT9Pb747Ug+>h=%BpN zfsxSi+|bl*%naz&Hcy@JJf$gYQ3=vnJ-$I}5F>6unx~vU-x5g!MqY!fCXpL9$=~qj zR?43up?}B=eI*jQtW#)oFsvnW;Xb(+$FYYJ`Zxa*3cw`$t0e$PLXQ zvDTBQr%iIlk4=2YMtLEh^K^)c^$)o@shx7gPzyO;ZcfOdK4kyAko$aUcjTpZoe!Cl z7jmHwX~+vX&WHRYFXR9pvR7WnP#-cVFJxmMvSD7x*M7wRRBld5|K>y9%nNzZhdd)U zhp`?}`n1};xFOTuia)|wIrw__Mfgn-{AugKzrb?jo-%Hj{)zazOMfSyzG^1KAF!VE zm-_Udh@}7EdeXni<6jfOzdRS8POuI!ZrxIOSTwDha!GGFlP{4$!FBt(ulh^+>T9%f zhF_dB!mxf7oBm=`RhECWrii6e9Wu3+vRP zI4ECMh5ikQygK|S;=_lS)jOXBuTNr@+mMpHE!gd|yl?Mgwk@WH%d0URE1fQHydJW1 zNAXogu?Kq%#vT=Nm9!l~TJx80I%LD1=4`(|8t^6yEs#QEPIRfd`ipfEGYZ-Fl5KM# zY(vZ$|17YIC98XcCd1KHmF1$<4bMwzbeBmj?;n)ayPc%8P5O3 zhb)iJxwiTre0Qua8FKzVONN~FcFB;FSCkC->5`HmM?73IWWsGFLk_sAWXN7KtT4XW zq((vIR@%lR0#5r@+E!mUBJ?X!-8$wW5X@KUSQF=*>-j3R_-e{YjlERx5e0SxTHq1h zwqM7ezphu#xwEL-$oChXzdu#)B` z5k>N&7HZvZNB^aZY5x;x{O5|GGuyh(F~XAd!%DmI#s0%D9K~0>?G&|i>$cQEZy6`o zvTLd4(U@tkpFvfzwo)$NkmDUXG*tM^8N2RJQ_$weQuM`-WZS&`3(jEx-(T=2BJj5z zd}{z@Hr9qKnFil@OvZh4IKQ(f!w7td zgZC5s%Lx2#2mj(a-~~Hp%X^iBzb$y52>d(;e^&5{2>e(Fe^~IXBk=tl{06~yiokbp z@EL;d9f5D|;3o-wcm!VH;D-u+Vg%j}JJXJ%1#gVNS2*}U!7q=%A9wH#1pj3Oew%~; z^IG8ZBk+WS|55OT5%`%7zC`dBBk&(P_}zm4B?2Gg;8zL0CITPg;O7bcO$6T0!H*TZ z&o0?^`9k9f{4aR_2>fja-$C#Z5%{wXzPaFIBk+eEyg=|DN8mR&c>6WLPmaK6IQR;| z&x^oMa`49mzaj!Z)WL5P{Ff2S@F9Xf8-Xuz@P2~78i8{VL-qN^)xbZDz^`)fw*~()3r}AN@(Tj?W{5IDhN=EU zfR72dMFfcD%JSO<92Nm`7PowkfV)M2+WkLQzyl*d&3MNNcvKb$XuLp?NstN8ozP~E zHKS_G1-yYa4vWV{9UZY)<6euW>uCOuD9?hA4;d3%IO`wr*doDf{D1YE4!3!^b1s7R zM}@EqgfNfj0rv#6Jn*8(Z4H~$6sKr~h3S>F@N`Kg?8bM(FtfGD{Oqp?YND1|v+X6r z4lh7d&^#(RdZb)-D@HKc_&bAkb&SIckeHeO8V++?8cZihRCd5|ZyPkgNZO1$3NxuP z6-&~ZXfY#-cci?ej=b`IJtjcU=`E$(_UU~^i)7i{KoN%$(B^CfB72NHN1FTLF_h24 zWB$yitOZ#*)DgFnW_%!4$;d&8vT6<#O$YSHiPxOZBO}$#_@@@icNx9|#&Q&J7M>Zn z3EV&6UV*z2E@#DKpW)8N-3)gQ?kZdz0iBEcbKJM6wlmIsclK`!u?E z()pcTQKr1uqNd&5L%VN+>=!B}&118u#Ga?v+Vmi{{C=e~yLvhw(Ur>emPX?Nxp?EM z&xj(O?U1(Vj5Illbg&_H)-;tg&m~76u_;vwZFd0Bd)xDI^+%wAoXKG)4lb-Gzza@u zU!fxw^PQ^tDLsS~6f;gVxyfrSc7kJztjlak;sTH?)iXl8gv?{Rko1_Q`>a+9I6pRz zG(y&ViTz8CoT=({idXLLuBmJboX6Ebu#pWxO>TA@E^C|h?bjF<=sgv#WB=Q1vlj7s z-Ug_+_~R5&Z|`jletYTA82gC@00M5X6giaCj{U*YD3zl^d6QtR++UH)_+yHIMDVOW zkzIXgU(({LyYkqO?2r}l$xwQag5?D*iQr@5MP=AT@D?D(==)|5 zS5w+dt~DU3B7omvh@urW21WY_kVT1U6ZCX=34 z9u={Mff{*>*t+(2q`ZXAgo3S+Y6?OC?go(&2rJ41?-rQt*-X>pk??|Clh=My5L=jEhtK7SG>JR zrA&AWc4K9nTm{UrjihvH$Jpw>Z^@Wg>JF+(*(8JKdT}Tc>_pIlkBY(+sUB3VZr_I? ziwUHA`$t>5C3I)|M}MZ|nfzHOeP8=WS3LF|s$dg{{njeTQkJ2IqRLiOb)+t?*C7Sf z1>=NNIWd{V#1>p&hX@kEd_1mRq&})nk63TpoDX&`VYFpviqEFjHb_u5*u(z{ehJ1B zqc!-n2WMHa3kS&9^zof98ul2Q;IC`J2b zl8NQUSCw+bt(L2+w8o_Jm<%J&C<~&rMS4PdYrfhqfelzI-|{7dc`NVez=A9J4h`{d z(HiUmT?IbpcFsT2`+_YCYh@;IGxsu8jzRuWNp%!%&dVTKrx4yChE~d0MfZLDCz@s; zRh4eJi1(a(uExGKZ8!ZnPwDv^k$ewZ8*uR0`%IiJ7iR8)=G-+ z&ED@f;SFt2Tj~fhU$7Th@vJD%PpI|XK&?Sbj9RCr zzdDn~z%KV{mC+0nAX~Pjo`7^!Gdb|~OeJIfg3FN0muAOq@~mu^C`KZWhKclGY|bV! zi<27JL^dapv%5%yH$5K>8p0F`b5i&fR|RuZ*rBTwFd4q4V`wMtHl3@z;RfG}zqU6P z&Jnud#@N~@cY;<=nIxhgte-=S+w0G!M}hmw=UL9(zBRazJPXta6&aS-s#AH9W&0Gz z{`(cstz~CuJm0B{Fm4l`#;nu9uiDhffGA{fVpTYX6em_BmW5cw?wrS~vWl~zJ9hCb zeroeW+EDURt+d)G+mIrgbwESxjd|hdGZwDb*pqsBA=Ya~(g=5w9=+~hD|fr(bUMKy zv4&k?T3baJeP+g>{LU=bPs<)xu`PmEsfNZ)aOyy`$Eir>Ir$*xvV!nZ9?_``%HX*E?E+MNGL)aG{fo zcbz1ZI+v;9^Ipq|o=0nM{Xi>7C3COh7P zs4vrB8+Jldc5yN|4lawB@9dOV8F4DdWNmvtc@%SW44YF*7F&=+*2I+vD)GUpWp0ix zYu^fPw4nv^vIaJ(LuYuiWad6pa!#1DQTUiEQ8r4VI|H1*xaZpociA_c3YSf{bG4Oq zF69=V`BFv;fK5%3)FL?84v#CbX5X^(_Uo(Vui=KAT8^mq;R@3{(64Q8qcymcxweO9 zJ!VTcAy#~4Lxe1W%K(tNv&?<0a?@{FYj6lr#0p9m4Sv%HQ{C*#u0ev;G9$QKDzn_y zI(cmME-aFnR%h@t`Vai4t_i`b!B4A*KgJWPw>?X?&luElU^xEL;Ti{VXeFZ!{dv+#^IfZaKIN z-7Dflmc$dwGJAU?qKnkKS82)Ic)TUsU5u(|jA<^$j_ZvPT79zFc^`|BzYxBLGNtBy zZ0m(%e7O>4R#dG%iOyDNO9OjL5Dw_LJ3HVXkskFOV!Y^L*dSRHRwrZNFI_Ngvs5Ck$2hMQ`G)nsv;-Z&d%a}>gy_-wGXnF(}! zF>!S2tgZotSLuBE+Uo4B0anNZhQ)Q;R#25}B;gexc*-k&M(M7?>Dh zYtPvjEa}~9{TuL3O*ayL>2WA@5V zH=06^iM78$^B9vf9N{yonN!Kj8+y-+?A-dbHSt#J{9Ce<@_-C#aSvg+xw(~h3I_d( zx;%wyx`Y-~HJR|2L08J-*o_R6PblT8NXl9ysl+vNI;Z?BwwFY5L7E-zpvoto-U;Fd z#Tv~X8>MSY^%{>%EnaWG)D>-z?+}AbC@5vV@-@+x`V+4Ri+&{P5z1JV?z_dAbPI_M z)h0GnOKceIgDz#XmOK~tVne(OvEg#2_>9;vIcq~Z&&sV722r`;@?VQSCI{7#%){Ab z99u)Yfiy)gWjDE71;Lpgnq*N+Vf64q#W_XzD&Uh^`0PKcGB}QWNn-sfgLgjD%y?wR z3bSf5R7!lS%HWd|5J%4Z$Yq1APtsz9L}f4sA2t2It}>X6$oZ{Ru$ngi)+&f-0KzJw zs1cQc)x`-P`nsU?jJur5;9_zxp`{UztC#PhGT1MVFt0KYA60b{Fud&2`f;A@5}P$f zQ*@!Xj}3>4aVynj3yncf$cQnsh#iVCo?rimrj--l?_ye+05Er2xd_@@gMa=rZ(8{( zGOax1rj_6S%TFseYFhdD{k&=AEkJO?w=BgDNN1;&AK+(N`6(%Po>q1y69%+H2>PFx zR+fIRY31Gnpp&9?npR%>j?>D@--px6*2Hkr$|bOe8_~O*R+iqBomR$XP&*I)FZ{v= z>h+}a#xHrrQhPttWly-z<{qp)hzqmP^5&kgk?i-)pmxswpl{9oNV3n)PM5-GA|QWu znz}!;(>~qKPR}yyWM-#2a3QIy*=f7(XQ$o2!|c@l(SLGwYG)GeW_H@+)^3Bg`1Xlw z!Fz7v`Y%jVzx^&_be*Ko|Lin%^(jnK&tZgDQvqkE{}E18@8OG1QzPJhWQXsq*DPs{!fBRqWTG&LGx|7%sy_Fh;8AHqm(rhW(Ccb}1d2X-zEkr}BzU%!G(@Hb-+ zDVRp)NH$psdVnA5BzKI^zCh*~hmi*I^Q@O?^%BC2+pQq%yGSA3V4E1qz@^|fLpJC{ zYp@m}i?l{2f{*YK75!TCuV^}$*VaGjhHN6=g^V8bs_z$L8HfLA=x{#?UUN1uo!#%o z>Fg&NUAEIw+djwf;|MMNGV+9~afE+q;u*%1oG_=w*`{-i=JVsogkGA+RjAj>y%L|V-y2>1*5SmyZ~fkWs&8Q4_-gs)Gr-gYp^oqq_*saQqkh+M{#PV zs+je*_K!tzX}qn_$b%Z-G>7ai7t5XiyP=9uhw$M)S9nr%8j2_V;f*}$-K4rClIkQAg|)jc zMFYE9am>4U$%m6bQS1sbg6JKW2v5-Qt9<sw=9jD5JUzsV}4lj&dil>qI4k#i)`?C%XYbUv(u- z6ZkTEQ5J9lqsxR;6wbJeFD8*uM5}2W<4E6>g>@Gs#S1~Kb!(n~+9)(L?Q6cZezSu1 zzvzQP)#IAS^h=5Zw|%gu6JMQnr7iWQ|JGXCbT9RbI12`YwxzaxfNeDojoXHpp#3~l zCC==`)qADM*hi#=Y#69$IS6r&Fvt)ZVSeaSa_1|5K0s(oooXLywTgl?JDeWpM^T*p z`HmO;2akyH{r1qb>C^BS0LcD%JRl z(fYkjr=XnaHFh$rw}eH$F;*o5gpC}*b03@P%tZLH86kZaSn4C3GsI}LoWedWQwL$6 zE}1#4134G=P+xL9F`G7}J=&21eOZ|F}`>Q;ZXd;FscFKluo z+#Fi9uhPKf*|DLzn)ax&DYNnN@0bKTqx&>&bA{jHd?g;!p3833@FIsz?OSDTs|{AL|Jhln8!<2jV-;3cVu4 zm(1i?jkH~EKBzI?fn?K8;8yq|7|)AO*_E${q1-mNKFVNPoiizG{{y%o3Zrm?jRZo0 z$vw)w5fpK|i+EiGs=DB{5torFV}N}mV@)lUaFja$2J5OyXuk9=nP92kBEkBsOq;&4 z$e2D8rU1{76=od$u6K=F%V1VELmChwo$>*o_Fg5XJM; z5^V{SkFipzMx|TfBLKzZfk>e|iZL8V1TlVPX2w3bFv3_53d=DUv#M(w_3Q52C+zPH zeswPZbnnj_kK@XBwzhkn|6z z&srxxRk0@Z@Ht`Lh;ks7h-nv#V8`X{aTVFhbGlKZHd?@s34S)%Txn zsg3+}PxF1hmXfVc-#Y)(E#kpSWgBSLI@8>T*xA z9PTl?>V$q~>$atzLk`p*ZJ*cDyYR$O*DZbMcWY^xitVbUCFsI=kyG$PGpFDOI#GHg zQ5Te5nmGlJjIYXg=dP{~x!>c4V!J_I;bw8inC!NQ2ua*?1z)S`{qL~wo=wZy{R&qE z5qn%u8#h}2XiMG3N7EYZc)sPSiH=K)HCv>1zW3jLR#$bBGCPl|7<^-^*Jz|(3q2Tj z6>yD~ECy%LU28_+Q)bQ!QDf~nhO#z}e|2ZG?2SuYbdJo~QCQb5_J%>3NuWhu#@k#K zMGlVlZM8vq6^$$*RC_WVhE#i`zCfubn#Xlt^b0&2n}L1{peq|_0+@OiT|k)U(O*-& znH1-Y_a7J|b3zZN8FE@x8@JcC*xiU4N4rHPrB`4#YfML!NJLcfM7gh|%UBfnK~gx- zRm6ktkYn?kku{)OvS1WPQ!3Izt~MmFsl8a4rH^-BYohfx9V5h=Si}07>{$toYhuyl z10}yEZ_Uf?5!2&Z&r*lh16D;+4(K{X@vPwai5#w`{n#UWLyu?E$nIEQ>}VG3{U6Kr z}~+i7JeH&0=vmX?@3OH z;B|bw6U^_=T8__bf!RBB9AsLaSh7$BT@>GgYoPMkx+K+))=pnS;+(Zp9%UVk+q4Cj zlZyUal%sN^{N;9{j8l}3#;skHEgj;qxro0L;-I!*bWUm~_T@rq`Q5elm zA)5mO)L_N*y&_3DedZkHS};<+Vk=(}8jXuc){4}zBK>2iDvmX3<}d1yAXGkqsEe=6 zpsY;qB9x9O%5b5~jiA7n=&XEBAsVzXC;EOsfr42w1L(M@z? zu^+l{PFNp^kLs>$kOW*4spnd&=Zfz6=-GL+_2!NZI<@cv1W}bQ{e-H_FkZ*Xu+cM9 zuNs{_g4eAKbqlNDzeV$@dW)2rf19Zv3boTOuCQZZhiJW?EN{q9I`?jylJ1<~;aw$o zB$9;9hf$e8vDqZsiHAgyjOdf&9F0c-Y#fgwi)-Q6$1w;f)uJr&4S6a)=hBuJPGJ^l z%@#RzCrbxL+}t9})`B%z{_qjGwc{AZN>P*7E6De*KZL|Ae$6WE0D!4OzB@4$T@iB> zLuiCmbDD7?R0%FPHCegtSWAs z^!=*h7cYcW@!%^~72_dk)j{1WXbo|OFJq;z_rlV!(aWcMQ`Re8CA>VZQ)*7CCAITRx7T@3GtC#Oj z@=cd-x#7vzD&OSe@fDFuTW~FXS%0m;Rr0k4N$1Rz!&R|t_;oJe=gvv^@Z;t3$9r8F zUj@UcgKg}6t-%p4T9E*4K@SfngT1Lg{VlA@NF-IqLEdaMtL$g|kx;6~mJ+^lZnDCt za+bj0hNp_S-0oz!c>J9%i1!opYWP^T&-maWvJ9`picWVYR)n-RS4&4Fcc$EMXGU)e z6)g~CVTr)u+d@j^7Xrsp1DNTjmS7I)f<;3eeQ7vL; z5lBV-2aaB#m@k*VIQK#ol)0SoDp?bLpJ4o@Q7n}oN)B8S6^ywN&8Li(3^->HLA!Jn zbn&zz?v^SGJ&U7g1>9Ygi@Z#P(NCFHzwwR;wcI{cghoAUBO(iUcEN~k*d~j$9KrEv zxJcJqMYXTrAK&mzhmcg6O{+_>6jL5gtX{YQpNp=iuCzeg864={^f0yEYR%=h<<#P- zN*0m+nE0G)T^nZdu)Tuo{>Y0ej^R=Z*@jV#+w)&2c(-bq!1G^s2%2a!X6ksEyzT+I z`0i{j?IJl_7+s%i@T6)6;H$g(X z%qCF1)_EE?@63K&DPiymZCvV*G%_D`7aXwCRS|bqvgux@bUE}Jsr?4sV!Hp(OhrGD ztpZXxo`5L#X9($(h+a!O1zdYAO=PF{FzVC0q#k(4chXnQlh;X0M4Sd(y% zSwo56ch=r!vD@P8OB3)F?ju!zl-W;GK$QT<_SEJMzkRS(N2gH|Hs^o6ALg{HL~jl+{$&F?0; zWNu=KS?WK@tM1*L*wAoaG&FB$xH1}=H#D3PhGvF_qk*&rJ3Viwt^M6}I!mxM5M;|Bbw10& z#Vr~|9#>?)AV6V@iVM6ipYwPVZ25@BER*yNmRU@C>LzdUCye!U7^^Zb)^TAhZCg5J zN*L?PFxGpvn2Y8$%*A314`YeAqrwQkBZ3?5KdH?YLMXe1C|3(5rm=TLCzQ=Xl+%S$ zFO&y5p?vbJuZ3|!nJ$!MCzKT-$`DIM6*{#O$^#)vFQHgt?-N1E)cIv0-e0r@$yn;@ zTmji|jCOrATD{utt?jxcalKZ$GR(w^$i=knPOXB`-HLb zi+x5IYgsgwT;JLFW455PP*s#&T zf{Jw3I>T;TxRfXZyJZ;HhK{q5!J+X4#PP`z$60Q2iTuMy(aX1`rdE)4BG^v>$)Mhc zZ_*b08R|tB(CvVx*#ij%Dws$t(K`~sVla}y`41_h#OGzMpN}|-QT!%?o`OKu1&m^sU z;-!_%sV84>kFFZa@|0%^9S{;5jbDY*U$?vj&$;(J>I$8O%v~slEK*}rYp0~@yG`oD z#CJ~0=%`4RCWBSGN{MpTQOd;tkBt&w+BnFzGh%7&`IPyMj5)KaURO!Ljb8UYJ16JU zsIoGh@-8cJR&*C-BP^;C`7mm|i_*_o*w~T#1NMN7&cB6;FB;)-%W`mgWpD$x8drz< zZib(a8>7C&F;ckk|Fq%fWucy2|kM}Q-aUo%9P;qxH2X9 z0PPWmM!~&Kegp2~0CvXJu5|+U z3EX3Ge~&v8_etEPxLOAf!_}Va%Oo@p*I8I_M)G82p}G1lpx9Y(%E2db?*?!>t_Gz3 zxcB1z0{1>#Wp_XB-*F$n9f|uO?v2Kt(z9uZRL{VxnkR!AtG@#2H|2%N@7!2Jc(WZ- zkxp(caikuV(>@Npk5532&|ai(7Znw!KQ&uixSwro?kTPfUkyr;ulh~6i*=u0?I{q%ZlyGW0$y2SvXc%;UY zN6Pw?7B`yV9E?3Ktj}iIi!9>+t7P>(C**@BBPQg=bbnIR2hW&2Hg;^)lmf@HD1HT% zaY4CFYX>;3)`}@qsqu8fhTw>n+Vs|7$rn~3mPuR#r3ZQ(r6UZ~#HunspnuNno*Qu1 zCVUG6GOU44lyYoNb9IZ#HfLh>4PG|qO`v}*%MreAfEV;3(3P|e~KU=(RQQGRQ z2hu%6qs)7nS-6tRG<>)JFk6@&B{MY?cbky*tU4E_=-*$M9?+Oqn9FCYg2T2lPGY-( zJ3(%?q)bIBXiM*=)oVR$#_tU#tcDtDMF_g;;83&OO>n-{xzc?JRloC{jW2;2YOFIl zLot`QQv@E9nCi`Z$swNg^z1lKTm|_1g>RTfCLGe+QpXnCuw~3OTv*>3J+Eo?jhy|*Dhcs-xiFL z&Ore|vjEyWEj2fTY@y*>e_53AU@`;8;6*-BZe2iN?2A5-+tB+J{Jw`$|kw1B}#WE_~spTtB3D88U zBX~-=Y5uTWbzw(&?x7SjuLMtpUm!9pR(peMTzx}l&H%vnptX)B&|%6USgWk zi*?{*tm3YTrzEvO8Rs>_O>O(?UMN4hs5`e5Z|Nm z5^VyCFaC?9R~?Zdy~cS(`UvM0>7(#^((Ca~ce!etSmdgeV%iCo6Y5EOL;g|MlT3gCvJ!0qYqF+YrPJka@1C^>%_Sr|2$Y$)nS?=hAJs+j&_}uy#>Q0pjM+ zX$TylUWaBy^Z*wsG2(N6Cf1kZL+q!j=IKFLTw-j36sc)EFZ_%sb}J=x)BAWV z9r>-4Xzax44lhpcf4;5JIs4($atCpp3{CcF-At`4&>7D!A;Jl|_X(T3hfZ-+A&o+j z=xhyEJYsT}(n2WPk)a2TQJ;tWI4VN@Vq;Huo1y&U2MIDL-?8=~4*DigR>T};#4ssm z9vXIK*L~L=m5SL<3Z4+cWA)gFZGlo0FRhCU>oW&OtXs6pm@qlajiy!Q(@O7O=>nfMl*l1eyq%{({ZjGch$fdRAdeTbAA?m9KTmjk4Q4&W+l31;v$LhCQUlPFr z)mF$XQrsQ!8xv*wkoK)U?R07C7)BQ$b3B9y?p)F;Q?^Z^**wqDhyZG5V8Z1wUs0adfDw^NDUt}jZr;8DIq-P}h$@%CnLrNPQmcj=@ry0k7r z?3U;!T?N@TU(ZJLi;$Fz?ID`nk^5B|jGV%3xkU1wsOOB@M5z>JADF`I11Zct@+0qw z;>~C}wr@t{Y-e)Sob$MWMEJQ@0XFmBob}H0UMj-)9qwS`Iw*km+clFfE?~8ms_v;C z;nL6o+|mmB#Ll24gG+838XFb^8MOH%N{&(h%wm-!daYxfcD2d%%9CkD4#*;={W0r7 z<+tC*T;V`*R_$6_D654^*Gu)AU>}gQ?*Od7_8$=wG<`FY_w*6Kk1Z;qZ>c|5p5xZu zgR-dLDc?j;<#P1VWtncaWf`BtP_gh_rRpT8%Nw+aLs3!JbJ}L~&v`>*fiJF=;P0SH zVOmZPAkU8rYz%oE9;P~fBPTnG*bFJ$DNSq7J%^hv!QJ;#@YzNa^Sx1nY%&KiWKJ=s z3i7L=_%a=^vh0=<|4_@vlkNz9AB{tLKm=!)aO}l6hwv;2$)N4l+=AHpUIb|7m&?qr zhV=Y*m0RBnQsC+^88nl`X!qfl5C~Iq2l> z2-2Yo$xS`nMr+(+eXFOJ%9B0Av3T`i$dSKc(eF;0DRl7~!EOP@`?j~RBS13ZM+s+b zsRKm~Ab%r0Gy(37R22=oloSZYp6#u~9ZEdD3e7g6rZd^YQ)~jsiL_K%HX~u+)KJlaBv3cT_GJ|30~24 zf@yhQ~gU$N&YOs>i#Oz{w^I~kOMKN_D8Jl&=YwIhvs z?Kj_a*ksDg!HviTD&x`xB24nqR1=OmGtEWlXgV{^Nx*2g|IPOzM;On%?|5c}S9NrH zGI9cBW^_agK~)=yD`jodo{b!(5f~F{?%Bxt%(Id8(andAqRE`?bA;RD?R&eAxMNvw z3O5{FUzrif-PX@OccCl)IdP0R1gjX}kc)E8*>I<$M?BDJ>?j>Ol3-YZY#O}&6I|O} z8gvbxjz$PSV84&Xq;on=Eu9$k8IW3ox9|3xuUZT9Y-;Jms5gKM6@48Qh;;G1(j;cp zQ5uliS?e>x%nDZHN!P&7aot}hZQe_~kx?lB1e)<;+o|J`L<{(D`8JAZP$?2*Hdheu?OYb7N^&r76M^c%SnCwO`pLSuF zn61<6Nv`WuayWcgd)U^OGrZD;`T`gD{!QKHpT0gK=$MkE~`k!LaK3KR~V9?QFzz3*O0jI3L2}r!>dE>1LT_k8a7 znJrT5Ex0LV27E?Pm|f|)2-#NGb7|fI`3OB4Hw+u2K$c1B%ymp;m-+(jNt3Qu`HNzP)j;7+ZJKRBzNj5ho8tkc| zs?F*upVfk>x?!E1!SCwrwHjGhAF_y_?POwoXq=zglld8T1V7u~%FpmRuuE^NJlE`1 zmA!M6VsCm(JwX-s^0WB@ezw?^pDl0Zr?QTpt$Op*|0I3}G=pswi(9X@!yPME5?|bT zf{{?{y*p&R+k0W2R|T89D!8rrg{H5bTF*DfJy>jgg{PKW8ajjqjWNHI+pQ$uTNc9kL$29 zhNO2PafQ`+Yu%GQ<^_Qq+m+n1tHi$u~%{t1QWu&LYS@;9?3-zObAy9 zp+yK+=OPFugp-6|dc!$FxGz&tf(apRG^i#|$wjF5HMuPa8CB0B(*#mnYK5W4X>>vx z8ft7)5Bz{|i!xU&9o1pBrA}K<*e%&G$4)R$yscgnyyGNJIkCAZsCa6kIL^S;q06IaEcpJtm=7L(X|1T&<1Mpq^o`aq45lFGb4gxuVsaJN$iM(k93=v5FK7~ z%rhPl#aqwtjqB{Rzz?a2H4O&5|9N{SuJnhW@c*CEXM5ehx7Ks=W%~Gc*l#)JC^z@P zzZj~Cnw9B-1OH7lJ&#=l->3f1(6sBf&=ihhz5}#vUMBb*;f5eWu4)OmZ%J!iRQa*U8mXjeu>FEwB_YEsd{XvPXOy zm~?X8nfS})C+A=N1a56w+pAHE?-;;LeoN_FXvxO{Uvq_!gMlQM4AOigg01iq(pOF* z*wsQd;5QNM#BXbG3cr%4i`sRV4a_@~2I=iCy7041-f)2?_x3ONNd_<6VB62woeCbu z3u;4YYp_iwnU}#L>?k9pE%h#|CMFPVj~oDK;WGGZk(f+{nla4+i&Af#lR0V8up^sf z$B=R|xNa_VYST{={5XNi54L~{6|iE+lEkt^P$wdi!7w?A;71l-!*3#(z%LT7YtCjq z3er1Ms7+j$&y8B$^KNq;q$K}Wdz-rYE<8P5I7Tx7zKswBFgIt|_k?w+C;dTbRcb;7SB3n2@ zl^|=tRp!CVTKoT_FN?YTFDW0`L77i^V2^kHE@{9YXJljKAr&*+K)b5975zUr+dtL+i86`I5H2^g7z=zh5oJU8lO&< zUJ?{VTKb+dG&i*1DR{MT$a24tNXo+8v*fa;NiZyl-zy8xer8^kVp`5A)bdH18bgpf z6RmG)KiKshA&U=Uz7QsLb$kxY=T*{nAoUGuhOTr>XQZkq(xVQ^uHq~8Fr`pqU@2YY zkjleK@@`GL&IpFdC+lmsi4}1+8$%fMC)rgjNXrU?d{FHup0Xn49~@W9IP=MG9*?<-9_salM;at>HxxscuSa=1Ff!hybTMQKCnFy}GR^wu} z&DdcDFG?m02MC`Hb|*ZbkQ{4Y#(ISmERK7A%$|BbBYI5t&L5#PcKFnX5=*>1WNBhm z)7s5SF1wusIO=3AfHj3VD1j|5D_iX#wxv#-fChQ9NC5F|W;mDt?YNwg4fAT0=EJT3 zH1AK^9FkOFwN9QkKu5ot__Bi}7&vQC{VxMRM~kI5@*nuYXs*5-cUH40Zs8Gq8F+>R zx8eZS7c4op`iw;t@r~ou8pl_YtUJ6LKv-K-U_G2D~2+i3x?q5m=}CU9A96 zCa$$O-mkOks;v-i)9X-|7pYAkCc+!eU`ib9Y>%rsmL_xb z0#}-_rV`^TN`r9{ok2lf2|LVmeXho9ToRd@9v9}KhI;z#u%`7WrK(S@Qg=kd;EeyC z+_t$o6Juv$M0xAa6rPtJrc(#*FugSJ2YFLh?VcYntZY&@k&D)T8FMr{6k`fzrl1*fG&-5lpP{U2^*0Rk2W3Bt z_+%d>4Ant0Szh^gBX4;{jh`NpMG$`P1qR(@0b#Lpv2!x|S2n@@F+>iqteX`K_&HKs z;>*OESrhq06{dqNz#qOudsuwW3g+XLY(FY1Qq9NcdO-c{^KII7mwK{MzUD@ zfz%&ZH44oLGrvRchxA;77+d2W^Q~#uqg;rwbFcKWxgxapaj~l|Cap~Dk*8T~*~XVn zzP4R=miUmB>a4!~W-pl3qkHsv`I6=%T8C3v^MJ1cmCur#Zj z-{1zJT3ty?UPq-LPV;Va@x?=Jm2wQxFC~I@wROG^p$n_m{?N_=y>&q$@dvj9dy|Xd z-zpf6_TC%GzMe>x@flBD3XSp6%RMhwGcY(_UZB$<@g`@!)2;5@dj+``bzehs3RdJ) zXM!ypNr6^@PByq;k1SGAYTn-V#jUD_q@LlX_OS)^5dpi!psVZg^|08Na)=b{RgqwWbcFTWdPJ zty^nX;OZJ#5?8m@)VXzQO^RvVT2uS#)|wu5e;KwrBYYIN!95Cmjy(!|uC}et(~i~o zdKCBqJqmoG9tFNgj{;w;M}aTVqrj8@u~qU`b@bzhJ}PI*zxE+$>ZSagq@R-)^YgRU z`8nl%eooz-pVOxEbNZH=0>`@zc}TG-cH7C)KD@yiH@e_y-v<_FV7fzC;$DddlRcB! zIC}~4G7Maj#by|rPo(yCen>!mpMX316-{GzOQZ3i&Un*_6vf-b;cb(PhrAL+`Uq_S zb4AYaEWVHQk(yGaeqwD6K4ej08*nXDz8M9@ME`tpcGun-^J z>Rz05J!=OQP#0-t0!&99;-Y z=-Tr^O9Xq!Nd~*PuVYwlCxgxTNCZRqO$OVT{}AA?Q3;xXb>~@x4{==Aoy6qEFzpUs zH*ER%e9o6IoX5|ix%@1i#ZPKe4H{#T<*&QQ%QBHu=*K)SH4KbIxW~cmpxOqhR}ZHp z#ER$zltLnSbe4#lrF4Sd;3woKF68$X@*@jbAiv_-@S~cxxhL<+%t(o@{L%lz+cWgp zJp~1%s|EVQJJx%1uFh;c&F^8uWnEpJ>Gq0DPzQbb!w8~$t-+(0yUwV~9r`0n-EYue zvd{Yj+K{Uy$;ivhVQbJB#Q2?&PWG%yvN8~ zooNlK$e4?N>$^d7C0Q4^s)GHMso38#*9{sa{1s0DW^d3Snf^E3p!w=D8u`C=gC;f! zJ(;^fQ{=py8<|z=yv%H~D)9PiC{=jbFDBC_-JrP$&;RBPn(6MY4AS1LSW?pKuxd#Jx6D*uyO!U`1({LNt2LJpR*($N#4&M?If0jKu-%sf z@Dg9-#!Q@WcaGNCs(^I6g;A`7Ka~>pP=6Lzo6w_|h6vX~goB=hlbUpTGJh-fQ`WrJ z-7`;kI+*-xA(MgNKt&cN_*k0BqrRww)Dyg~)VYvT(Ca&%k%C-Ip`TD}T!bZL9 zR88y}+?qttaVbSJiu_w!%4lC`Rd9L)a%(j_c-@&M?pK?%+L*|TP)-D!1Zc-mXq4|K zRhtjAYGd$Jv*|BYxH2-bz6XTboh%Z_^>!^694_;}MJbv2lyKVIV}IS5lttzK^f%kZ z7T?BNz^K3!I`+Q>dMF2Ui$JLyP*R|py`mA%6=+fp=mdc-h=4F`S`B53t_LRCj~uJk zT`lj*i5(prNwZ1T-*xi0U}ik6>ahM57n8d_v>f52cx>V+8G$Kfbyg%96bp;|js)F~ zK#h{e9nhP-!tqh|d1QsPOLwDY!F*0%9Nuc`jf2U4e~alZ!Z}CB3!_DrumnspAkW(L zVfge^dvQZOzG6mTK5ETkeXZ|owxK_2p@tyeHBR1JU4t{mm?mRDn^FMLZUvKB>yS#B zXXOhdQGAYlGA-<|k2LpRazC9=c=*=KK#DzXqUnHh5 zBa)0)^&9Goaofc#261rs(T9(1!;ijv)KI+-ezhHw6j6{_+Fqc2ok3dxx75TMA*IiW9(&si_O=dtv%SN9vm(t|$*q3i5o<~womjoCr97^B z+r%H1eA6qjWbud$ww`OPYiik0+$W+DLC0m(?>3Ydk5LV(#W-l&P>t$iVs$l0wV4TK zOk$0jV;(?K4u#!qjDynEbKyZdKUvn4>IK)i^OGeS&UH{S9IEQ2>Y4GuJQ~R+9Y!iG ze)We}omGDbt=Hoe;F^vS*OctITK}Tyb+{4-g`c|m6&uKu6a$&1*ig(oBcD^jmoGpG z@&Cws7dX48>;L;qGT)d)Vg?z8gbW4|K}s+o7z7i7DN#YRK}!^Mn{g)-nN-G+3hL6j z#kERZTDJ(DnFKScXyVdFtE4F3=}9YEmmtjZ{;a*fmviP!(%(6?>>94 zz4qQ~uf5jVYu|`b5#ts|+}Kk}JyOWvicEOGnvlIrj%?*=#gP4mr0}>YF>T6QegQh) zmQ48Zqj5^(sPH_4YpMvdE>Jk>(@KQVAl&5nB%f}65k*SEb6hzl^I}*;`|L}cX#d-P zdV0byxce^ZC}kB9OTr6|ve^8rm_aHo9)^E6$57?ltB@BBF&jzB|6Wn6@}d?fYS@H` zH3fB#qH0r7bCE>(68z_T!*Pn13?J5DesXm$Rnez}P8!U&`&g>t)!*qzI?DWE6ezA5vaOr9cnO zk47d_4=j<2?7ia;mKij3tMm2Q=qv5YuWIJcCVTN`)1&z_>?-~YU&NoyzTwa2&+%u( zp_;hZ#KhClj0IlqHtCl(V^$z&B7vQ!5zNZZTPXnX#%8HjP1DVDlu&&Z0lqec$xX+a z*f`U)BeWas+?Ocxyo>N=qzc3t;pu6-F`a`DxQuf`DNP)`SN*lwy_e?t5kL*f{klY5Sl&AYpesQzs5 ztUk#xXnA#seUMm&&6s#=+Q%j|g6my8h$m4CHwUjYu}DG5$jfeax⪼Y2>=tUAjW- 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ν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ȁTp9`&#(yRVlEeEf&*Xk|3q?%&BQR%+% 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%0AtVk>vwFSCUNh`QG#OL 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 literal 0 HcmV?d00001 diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/healthstatus.sh b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/healthstatus.sh new file mode 100755 index 000000000000..f83293c5643c --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/healthstatus.sh @@ -0,0 +1,101 @@ +#!/bin/bash +normal='0 : normal' +unpowered='2 : unpowered' +fault='4 : fault' +notinstalled='7 : not installed' +FAN_UNPLUG_NUM=0 +FAN_LED_RED='fan_led_red' +NUM=1 +FAN_NUM=5 +FIRST_READ=0 +SECOND_READ=0 + +PSOC_PATH="/tmp/psoc" +CPLD_ADDR="/sys/bus/i2c/devices/i2c-0/0-0077" +ROUTE="/sys/class/hwmon/" + + +#PSU_STAUS='000' +#switch is ready , transfer control of cpld to cpu +echo 1 > $CPLD_ADDR/ctl + +while true +do + +#monitor how many fan modules are unplugged + + +#first check +FAN_UNPLUG_NUM=0 +FAN_ARR=$(cat $PSOC_PATH/$FAN_LED_RED?) + +while read -r line; do + fan_led_red_check=$(echo "$line") + if [ $fan_led_red_check -eq 1 ] + then + let FAN_UNPLUG_NUM=FAN_UNPLUG_NUM+1 + fi +done <<< "$FAN_ARR" +FIRST_READ=$FAN_UNPLUG_NUM + +#second check +FAN_UNPLUG_NUM=0 +FAN_ARR=$(cat $PSOC_PATH/$FAN_LED_RED?) + +while read -r line; do + fan_led_red_check=$(echo "$line") + if [ $fan_led_red_check -eq 1 ] + then + let FAN_UNPLUG_NUM=FAN_UNPLUG_NUM+1 + fi +done <<< "$FAN_ARR" +SECOND_READ=$FAN_UNPLUG_NUM + +if [ $FIRST_READ -ne $SECOND_READ ] +then + #echo "not equl:$FIRST_READ != $SECOND_READ" + continue +fi + +if [ $FAN_UNPLUG_NUM -ge 2 ] +then + #echo "solid red" + echo 7 > $CPLD_ADDR/red_led + echo 0 > $CPLD_ADDR/grn_led + sleep 1 + continue +elif [ $FAN_UNPLUG_NUM -eq 1 ] +then + #solid orange + echo 7 > $CPLD_ADDR/red_led + echo 7 > $CPLD_ADDR/grn_led + sleep 1 + continue +fi + + #echo "normal" + psu0var=$(cat $CPLD_ADDR/psu0) # bottom PSU + psu1var=$(cat $CPLD_ADDR/psu1) # top PSU + + if [ "$psu0var" = "$normal" ] && + [ "$psu1var" = "$normal" ] # PSU normal operatio + then + #solid green + echo 7 > $CPLD_ADDR/grn_led + echo 0 > $CPLD_ADDR/red_led + #echo "solid green" + else + if [ "$psu0var" = "$unpowered" ] || + [ "$psu1var" = "$unpowered" ] + then + #echo solid orange + echo 7 > $CPLD_ADDR/grn_led + echo 7 > $CPLD_ADDR/red_led + fi + + fi + + +sleep 1 +done + diff --git a/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/netberg_nba610_platform.sh b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/netberg_nba610_platform.sh new file mode 100755 index 000000000000..a5e61d83b494 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/aurora-610/utils/netberg_nba610_platform.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Install Netberg Aurora python package +DEVICE="/usr/share/sonic/device" +PLATFORM=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + +if [ -e $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl ]; then + pip install $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl +fi + +depmod -a + +systemctl enable sonic-platform-netberg-aurora-610 +systemctl start sonic-platform-netberg-aurora-610 diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/changelog b/platform/barefoot/sonic-platform-modules-netberg/debian/changelog new file mode 100644 index 000000000000..9948453bcf78 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/changelog @@ -0,0 +1,12 @@ +platform-driver (1.1.0) unstable; urgency=low + + * Add support for Aurora 610 + + -- developer Fri, 26 May 2017 11:00:00 +0800 + +platform-driver (1.0.0) unstable; urgency=low + + * Initial commit + + -- developer Wed, 05 Oct 2016 16:30:45 +0800 + diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/compat b/platform/barefoot/sonic-platform-modules-netberg/debian/compat new file mode 100644 index 000000000000..f599e28b8ab0 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/compat @@ -0,0 +1 @@ +10 diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/control b/platform/barefoot/sonic-platform-modules-netberg/debian/control new file mode 100644 index 000000000000..fb1fb68f6e49 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/control @@ -0,0 +1,11 @@ +Source: platform-driver +Section: unknown +Priority: optional +Maintainer: Netberg +Build-Depends: debhelper (>= 9) +Standards-Version: 1.0.0 + +Package: sonic-platform-netberg-aurora-610 +Architecture: amd64 +Description: This package contains Aurora 610 platform driver utility for SONiC project. + diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/rules b/platform/barefoot/sonic-platform-modules-netberg/debian/rules new file mode 100755 index 000000000000..99c1bcc408cd --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/rules @@ -0,0 +1,47 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +PYTHON3 ?= python3 + +PACKAGE_PRE_NAME := sonic-platform-netberg +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= aurora-610 +MODULE_DIR := modules +UTILS_DIR := utils +SERVICE_DIR := service +CONF_DIR := conf + +%: + dh $@ --with systemd + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + $(PYTHON3) setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko \ + debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \ + cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service \ + debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python3 setup.py install --root=$(MOD_SRC_DIR)/debian/platform-modules-$${mod} --install-layout=deb; \ + cd $(MOD_SRC_DIR); \ + done) + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.init b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.init new file mode 100644 index 000000000000..19cc8d7003b2 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.init @@ -0,0 +1,212 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup Netberg Aurora 610 board. +### END INIT INFO + +case "$1" in +start) + echo "Setting up board... " >> /dev/kmsg + INIT_ERROR="FALSE" + + depmod -a + + # Insert modules by order + rmmod lpc_ich + rmmod gpio_ich + + modprobe gpio_ich gpiobase=0 + modprobe lpc_ich + modprobe i2c-gpio + modprobe i2c-mux-pca954x + modprobe i2c-dev + modprobe net_platform + modprobe net_psoc + modprobe net_cpld + modprobe optoe + + # wait net_platform init complete + # wait hwmon0 (coretemp) load complete to make sure psoc and cpld + PLATFORM_WAITING_COUNT=0 + while [ $PLATFORM_WAITING_COUNT -le 10 ] + do + if [ -d /sys/bus/i2c/devices/i2c-0/ ] && + [ -d /sys/bus/i2c/devices/i2c-2/ ] && + [ -d /sys/bus/i2c/devices/i2c-3/ ] && + [ -d /sys/bus/i2c/devices/i2c-4/ ] && + [ -d /sys/bus/i2c/devices/i2c-5/ ] && + [ -d /sys/bus/i2c/devices/i2c-6/ ] && + [ -d /sys/bus/i2c/devices/i2c-7/ ] && + [ -d /sys/bus/i2c/devices/i2c-8/ ] && + [ -d /sys/class/hwmon/hwmon0/ ] + then + break + else + #200ms for each step + sleep 0.2 + let "PLATFORM_WAITING_COUNT++" + fi + done + + + if [ -d "/sys/bus/i2c/devices/i2c-0/" ] + then + echo net_cpld 0x77 > /sys/bus/i2c/devices/i2c-0/new_device + else + echo "i2c-0 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + # IPMI support + modprobe ipmi_devintf + + # Attach 48 instances of EEPROM driver SFP ports on IO module + #eeprom can dump data using below command + if [ -d "/sys/bus/i2c/devices/i2c-2/" ] + then + for ((i=10;i<=17;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-2/i2c-$i/new_device + done + else + echo "i2c-2 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + if [ -d "/sys/bus/i2c/devices/i2c-3/" ] + then + for ((i=18;i<=25;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-3/i2c-$i/new_device + done + else + echo "i2c-3 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + + if [ -d "/sys/bus/i2c/devices/i2c-4/" ] + then + for ((i=26;i<=33;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-4/i2c-$i/new_device + done + else + echo "i2c-4 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + if [ -d "/sys/bus/i2c/devices/i2c-5/" ] + then + for ((i=34;i<=41;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-5/i2c-$i/new_device + done + else + echo "i2c-5 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + if [ -d "/sys/bus/i2c/devices/i2c-6/" ] + then + for ((i=42;i<=49;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-6/i2c-$i/new_device + done + else + echo "i2c-6 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + if [ -d "/sys/bus/i2c/devices/i2c-7/" ] + then + for ((i=50;i<=57;i++)); + do + echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-7/i2c-$i/new_device + done + else + echo "i2c-7 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + + # Attach 6 instances of EEPROM driver QSFP ports on IO module + #eeprom can dump data using below command + if [ -d "/sys/bus/i2c/devices/i2c-8/" ] + then + for ((i=58;i<=65;i++)); + do + echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-8/i2c-$i/new_device + done + else + echo "i2c-8 error" >> /dev/kmsg + INIT_ERROR="TRUE" + fi + + if [ $INIT_ERROR != "TRUE" ] + then + case "$(cat /proc/cmdline)" in + *fast-reboot*) + modprobe swps io_no_init=1 + ;; + # warm-reboot will be set to fastfast in barefoot + *fastfast*) + modprobe swps io_no_init=1 + ;; + *) + modprobe swps + ;; + esac + modprobe at24 + echo 24c64 0x53 > /sys/bus/i2c/devices/i2c-0/new_device + else + echo " AS: nba610 init fail" >> /dev/kmsg + fi + + # Setting ARP garbage collection threshold values + echo "Setting IPv4 Neighbor GC threshold values." + sysctl -w net.ipv4.neigh.default.gc_thresh1=16384 + sysctl -w net.ipv4.neigh.default.gc_thresh2=32768 + sysctl -w net.ipv4.neigh.default.gc_thresh3=32768 + + echo "done." + ;; + +stop) + exit 0 + # remove modules by order + rmmod at24 + rmmod swps + # rmmod optoe + rmmod net_cpld + rmmod net_psoc + rmmod net_platform + rmmod i2c-dev + rmmod i2c-mux-pca954x + rmmod i2c-gpio + rmmod lpc_ich + rmmod gpio_ich + + echo "done." + ;; + + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/sonic-platform-netberg-aurora-610.init {start|stop}" + exit 1 + ;; +esac + +exit 0 + diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.install b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.install new file mode 100644 index 000000000000..8df18f0f2f34 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.install @@ -0,0 +1,6 @@ +aurora-610/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-netberg_aurora_610-r0 +aurora-610/utils/healthstatus.sh usr/bin/ +aurora-610/utils/netberg_nba610_platform.sh usr/bin/ +aurora-610/utils/Yafuflash usr/share/sonic/platform/plugins +aurora-610/utils/afulnx_64 usr/share/sonic/platform/plugins +aurora-610/utils/cpld usr/share/sonic/platform/plugins diff --git a/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.postinst b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.postinst new file mode 100644 index 000000000000..1168c8f275c1 --- /dev/null +++ b/platform/barefoot/sonic-platform-modules-netberg/debian/sonic-platform-netberg-aurora-610.postinst @@ -0,0 +1 @@ +/usr/bin/netberg_nba610_platform.sh From fe679ac96577f79dcd10634e0b406e78b0490284 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Fri, 1 Jul 2022 03:29:11 +0800 Subject: [PATCH 491/817] [as7816-64x] Update to support DPB (Dynamic Port Breakout) (#10562) Signed-off-by: polly_hsu polly_hsu@edge-core.com Why I did it Update to support as7816-64x DPB (Dynamic Port Breakout) How I did it Download the SONiC master image with commit, 64dc08a dated 2022-04-05 from SONiC Image Azure Pipelines Update the file change of this PR accordingly How to verify it Set the default t1 topology configuration Configure to breakout Ethernet0 from "1x100G[40G]" to "4x25G" $ sudo config interface breakout Ethernet0 "4x25G" -f Check the SONiC DBP interface status is expected $ show interfaces status --- .../Accton-AS7816-64X/hwsku.json | 260 +++++ .../Accton-AS7816-64X/port_config.ini | 128 +-- .../x86_64-accton_as7816_64x-r0/platform.json | 902 ++++++++++++++++++ 3 files changed, 1226 insertions(+), 64 deletions(-) create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/hwsku.json create mode 100755 device/accton/x86_64-accton_as7816_64x-r0/platform.json diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/hwsku.json b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/hwsku.json new file mode 100644 index 000000000000..8cbe06a8f9b3 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/hwsku.json @@ -0,0 +1,260 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet4": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet8": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet12": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet16": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet20": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet24": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet28": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet32": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet36": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet40": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet44": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet48": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet52": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet56": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet60": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet64": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet68": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet72": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet76": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet80": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet84": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet88": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet92": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet96": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet100": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet104": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet108": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet112": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet116": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet120": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet124": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet128": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet132": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet136": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet140": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet144": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet148": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet152": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet156": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet160": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet164": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet168": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet172": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet176": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet180": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet184": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet188": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet192": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet196": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet200": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet204": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet208": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet212": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet216": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet220": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet224": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet228": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet232": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet236": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet240": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet244": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet248": { + "default_brkout_mode": "1x100G[40G]" + }, + + "Ethernet252": { + "default_brkout_mode": "1x100G[40G]" + } + } +} + diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini index 8ebbd52c5543..1b652134fdee 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini +++ b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini @@ -1,65 +1,65 @@ # name lanes alias index speed -Ethernet0 73,74,75,76 hundredGigE1 1 100000 -Ethernet4 65,66,67,68 hundredGigE2 2 100000 -Ethernet8 81,82,83,84 hundredGigE3 3 100000 -Ethernet12 89,90,91,92 hundredGigE4 4 100000 -Ethernet16 105,106,107,108 hundredGigE5 5 100000 -Ethernet20 97,98,99,100 hundredGigE6 6 100000 -Ethernet24 113,114,115,116 hundredGigE7 7 100000 -Ethernet28 121,122,123,124 hundredGigE8 8 100000 -Ethernet32 41,42,43,44 hundredGigE9 9 100000 -Ethernet36 33,34,35,36 hundredGigE10 10 100000 -Ethernet40 49,50,51,52 hundredGigE11 11 100000 -Ethernet44 57,58,59,60 hundredGigE12 12 100000 -Ethernet48 137,138,139,140 hundredGigE13 13 100000 -Ethernet52 129,130,131,132 hundredGigE14 14 100000 -Ethernet56 145,146,147,148 hundredGigE15 15 100000 -Ethernet60 153,154,155,156 hundredGigE16 16 100000 -Ethernet64 173,174,175,176 hundredGigE17 17 100000 -Ethernet68 165,166,167,168 hundredGigE18 18 100000 -Ethernet72 181,182,183,184 hundredGigE19 19 100000 -Ethernet76 189,190,191,192 hundredGigE20 20 100000 -Ethernet80 13,14,15,16 hundredGigE21 21 100000 -Ethernet84 5,6,7,8 hundredGigE22 22 100000 -Ethernet88 29,30,31,32 hundredGigE23 23 100000 -Ethernet92 21,22,23,24 hundredGigE24 24 100000 -Ethernet96 205,206,207,208 hundredGigE25 25 100000 -Ethernet100 197,198,199,200 hundredGigE26 26 100000 -Ethernet104 213,214,215,216 hundredGigE27 27 100000 -Ethernet108 221,222,223,224 hundredGigE28 28 100000 -Ethernet112 229,230,231,232 hundredGigE29 29 100000 -Ethernet116 237,238,239,240 hundredGigE30 30 100000 -Ethernet120 245,246,247,248 hundredGigE31 31 100000 -Ethernet124 253,254,255,256 hundredGigE32 32 100000 -Ethernet128 69,70,71,72 hundredGigE33 33 100000 -Ethernet132 77,78,79,80 hundredGigE34 34 100000 -Ethernet136 93,94,95,96 hundredGigE35 35 100000 -Ethernet140 85,86,87,88 hundredGigE36 36 100000 -Ethernet144 101,102,103,104 hundredGigE37 37 100000 -Ethernet148 109,110,111,112 hundredGigE38 38 100000 -Ethernet152 125,126,127,128 hundredGigE39 39 100000 -Ethernet156 117,118,119,120 hundredGigE40 40 100000 -Ethernet160 37,38,39,40 hundredGigE41 41 100000 -Ethernet164 45,46,47,48 hundredGigE42 42 100000 -Ethernet168 61,62,63,64 hundredGigE43 43 100000 -Ethernet172 53,54,55,56 hundredGigE44 44 100000 -Ethernet176 133,134,135,136 hundredGigE45 45 100000 -Ethernet180 141,142,143,144 hundredGigE46 46 100000 -Ethernet184 157,158,159,160 hundredGigE47 47 100000 -Ethernet188 149,150,151,152 hundredGigE48 48 100000 -Ethernet192 161,162,163,164 hundredGigE49 49 100000 -Ethernet196 169,170,171,172 hundredGigE50 50 100000 -Ethernet200 185,186,187,188 hundredGigE51 51 100000 -Ethernet204 177,178,179,180 hundredGigE52 52 100000 -Ethernet208 1,2,3,4 hundredGigE53 53 100000 -Ethernet212 9,10,11,12 hundredGigE54 54 100000 -Ethernet216 25,26,27,28 hundredGigE55 55 100000 -Ethernet220 17,18,19,20 hundredGigE56 56 100000 -Ethernet224 193,194,195,196 hundredGigE57 57 100000 -Ethernet228 201,202,203,204 hundredGigE58 58 100000 -Ethernet232 217,218,219,220 hundredGigE59 59 100000 -Ethernet236 209,210,211,212 hundredGigE60 60 100000 -Ethernet240 225,226,227,228 hundredGigE61 61 100000 -Ethernet244 233,234,235,236 hundredGigE62 62 100000 -Ethernet248 249,250,251,252 hundredGigE63 63 100000 -Ethernet252 241,242,243,244 hundredGigE64 64 100000 +Ethernet0 73,74,75,76 Eth1(Port1) 1 100000 +Ethernet4 65,66,67,68 Eth2(Port2) 2 100000 +Ethernet8 81,82,83,84 Eth3(Port3) 3 100000 +Ethernet12 89,90,91,92 Eth4(Port4) 4 100000 +Ethernet16 105,106,107,108 Eth5(Port5) 5 100000 +Ethernet20 97,98,99,100 Eth6(Port6) 6 100000 +Ethernet24 113,114,115,116 Eth7(Port7) 7 100000 +Ethernet28 121,122,123,124 Eth8(Port8) 8 100000 +Ethernet32 41,42,43,44 Eth9(Port9) 9 100000 +Ethernet36 33,34,35,36 Eth10(Port10) 10 100000 +Ethernet40 49,50,51,52 Eth11(Port11) 11 100000 +Ethernet44 57,58,59,60 Eth12(Port12) 12 100000 +Ethernet48 137,138,139,140 Eth13(Port13) 13 100000 +Ethernet52 129,130,131,132 Eth14(Port14) 14 100000 +Ethernet56 145,146,147,148 Eth15(Port15) 15 100000 +Ethernet60 153,154,155,156 Eth16(Port16) 16 100000 +Ethernet64 173,174,175,176 Eth17(Port17) 17 100000 +Ethernet68 165,166,167,168 Eth18(Port18) 18 100000 +Ethernet72 181,182,183,184 Eth19(Port19) 19 100000 +Ethernet76 189,190,191,192 Eth20(Port20) 20 100000 +Ethernet80 13,14,15,16 Eth21(Port21) 21 100000 +Ethernet84 5,6,7,8 Eth22(Port22) 22 100000 +Ethernet88 29,30,31,32 Eth23(Port23) 23 100000 +Ethernet92 21,22,23,24 Eth24(Port24) 24 100000 +Ethernet96 205,206,207,208 Eth25(Port25) 25 100000 +Ethernet100 197,198,199,200 Eth26(Port26) 26 100000 +Ethernet104 213,214,215,216 Eth27(Port27) 27 100000 +Ethernet108 221,222,223,224 Eth28(Port28) 28 100000 +Ethernet112 229,230,231,232 Eth29(Port29) 29 100000 +Ethernet116 237,238,239,240 Eth30(Port30) 30 100000 +Ethernet120 245,246,247,248 Eth31(Port31) 31 100000 +Ethernet124 253,254,255,256 Eth32(Port32) 32 100000 +Ethernet128 69,70,71,72 Eth33(Port33) 33 100000 +Ethernet132 77,78,79,80 Eth34(Port34) 34 100000 +Ethernet136 93,94,95,96 Eth35(Port35) 35 100000 +Ethernet140 85,86,87,88 Eth36(Port36) 36 100000 +Ethernet144 101,102,103,104 Eth37(Port37) 37 100000 +Ethernet148 109,110,111,112 Eth38(Port38) 38 100000 +Ethernet152 125,126,127,128 Eth39(Port39) 39 100000 +Ethernet156 117,118,119,120 Eth40(Port40) 40 100000 +Ethernet160 37,38,39,40 Eth41(Port41) 41 100000 +Ethernet164 45,46,47,48 Eth42(Port42) 42 100000 +Ethernet168 61,62,63,64 Eth43(Port43) 43 100000 +Ethernet172 53,54,55,56 Eth44(Port44) 44 100000 +Ethernet176 133,134,135,136 Eth45(Port45) 45 100000 +Ethernet180 141,142,143,144 Eth46(Port46) 46 100000 +Ethernet184 157,158,159,160 Eth47(Port47) 47 100000 +Ethernet188 149,150,151,152 Eth48(Port48) 48 100000 +Ethernet192 161,162,163,164 Eth49(Port49) 49 100000 +Ethernet196 169,170,171,172 Eth50(Port50) 50 100000 +Ethernet200 185,186,187,188 Eth51(Port51) 51 100000 +Ethernet204 177,178,179,180 Eth52(Port52) 52 100000 +Ethernet208 1,2,3,4 Eth53(Port53) 53 100000 +Ethernet212 9,10,11,12 Eth54(Port54) 54 100000 +Ethernet216 25,26,27,28 Eth55(Port55) 55 100000 +Ethernet220 17,18,19,20 Eth56(Port56) 56 100000 +Ethernet224 193,194,195,196 Eth57(Port57) 57 100000 +Ethernet228 201,202,203,204 Eth58(Port58) 58 100000 +Ethernet232 217,218,219,220 Eth59(Port59) 59 100000 +Ethernet236 209,210,211,212 Eth60(Port60) 60 100000 +Ethernet240 225,226,227,228 Eth61(Port61) 61 100000 +Ethernet244 233,234,235,236 Eth62(Port62) 62 100000 +Ethernet248 249,250,251,252 Eth63(Port63) 63 100000 +Ethernet252 241,242,243,244 Eth64(Port64) 64 100000 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/platform.json b/device/accton/x86_64-accton_as7816_64x-r0/platform.json new file mode 100755 index 000000000000..aa0f78a032ad --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/platform.json @@ -0,0 +1,902 @@ +{ + "chassis": { + "name": "7816-64X", + "components": [ + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "CPLD3" + }, + { + "name": "CPLD4" + }, + { + "name": "BIOS" + } + ], + "fans": [ + { + "name": "FAN-1F" + }, + { + "name": "FAN-1R" + }, + { + "name": "FAN-2F" + }, + { + "name": "FAN-2R" + }, + { + "name": "FAN-3F" + }, + { + "name": "FAN-3R" + }, + { + "name": "FAN-4F" + }, + { + "name": "FAN-4R" + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "num_fans" : 2, + "fans": [ + { + "name": "FAN-1F" + }, + { + "name": "FAN-1R" + } + ] + }, + { + "name": "FanTray2", + "num_fans" : 2, + "fans": [ + { + "name": "FAN-2F" + }, + { + "name": "FAN-2R" + } + ] + }, + { + "name": "FanTray3", + "num_fans" : 2, + "fans": [ + { + "name": "FAN-3F" + }, + { + "name": "FAN-3R" + } + ] + }, + { + "name": "FanTray4", + "num_fans" : 2, + "fans": [ + { + "name": "FAN-4F" + }, + { + "name": "FAN-4R" + } + ] + } + ], + "psus": [ + { + "name": "PSU-1", + "fans": [ + { + "name": "PSU-1 FAN-1" + } + ], + "thermals": [ + { + "name": "PSU-1 temp sensor 1" + } + ] + }, + { + "name": "PSU-2", + "fans": [ + { + "name": "PSU-2 FAN-1" + } + ], + "thermals": [ + { + "name": "PSU-2 temp sensor 2" + } + ] + } + ], + "thermals": [ + { + "name": "Temp sensor 1" + }, + { + "name": "Temp sensor 2" + }, + { + "name": "Temp sensor 3" + }, + { + "name": "Temp sensor 4" + }, + { + "name": "Temp sensor 5" + }, + { + "name": "Temp sensor 6" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet4" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet12" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet20" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet28" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet36" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet44" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet52" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet60" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet68" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet76" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet84" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet92" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet100" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet108" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet116" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet124" + }, + { + "name": "Ethernet128" + }, + { + "name": "Ethernet132" + }, + { + "name": "Ethernet136" + }, + { + "name": "Ethernet140" + }, + { + "name": "Ethernet144" + }, + { + "name": "Ethernet148" + }, + { + "name": "Ethernet152" + }, + { + "name": "Ethernet156" + }, + { + "name": "Ethernet160" + }, + { + "name": "Ethernet164" + }, + { + "name": "Ethernet168" + }, + { + "name": "Ethernet172" + }, + { + "name": "Ethernet176" + }, + { + "name": "Ethernet180" + }, + { + "name": "Ethernet184" + }, + { + "name": "Ethernet188" + }, + { + "name": "Ethernet192" + }, + { + "name": "Ethernet196" + }, + { + "name": "Ethernet200" + }, + { + "name": "Ethernet204" + }, + { + "name": "Ethernet208" + }, + { + "name": "Ethernet212" + }, + { + "name": "Ethernet216" + }, + { + "name": "Ethernet220" + }, + { + "name": "Ethernet224" + }, + { + "name": "Ethernet228" + }, + { + "name": "Ethernet232" + }, + { + "name": "Ethernet236" + }, + { + "name": "Ethernet240" + }, + { + "name": "Ethernet244" + }, + { + "name": "Ethernet248" + }, + { + "name": "Ethernet252" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "1,1,1,1", + "lanes": "73,74,75,76", + "breakout_modes": { + "1x100G[40G]": ["Eth1(Port1)"], + "2x50G": ["Eth1/1(Port1)", "Eth1/2(Port1)"], + "4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"], + "4x10G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"] + } + }, + + "Ethernet4": { + "index": "2,2,2,2", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G[40G]": ["Eth2(Port2)"] + } + }, + + "Ethernet8": { + "index": "3,3,3,3", + "lanes": "81,82,83,84", + "breakout_modes": { + "1x100G[40G]": ["Eth3(Port3)"], + "2x50G": ["Eth3/1(Port3)", "Eth3/2(Port3)"], + "4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"], + "4x10G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"] + } + }, + + "Ethernet12": { + "index": "4,4,4,4", + "lanes": "89,90,91,92", + "breakout_modes": { + "1x100G[40G]": ["Eth4(Port4)"] + } + }, + + "Ethernet16": { + "index": "5,5,5,5", + "lanes": "105,106,107,108", + "breakout_modes": { + "1x100G[40G]": ["Eth5(Port5)"], + "2x50G": ["Eth5/1(Port5)", "Eth5/2(Port5)"], + "4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"], + "4x10G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"] + } + }, + + "Ethernet20": { + "index": "6,6,6,6", + "lanes": "97,98,99,100", + "breakout_modes": { + "1x100G[40G]": ["Eth6(Port6)"] + } + }, + + "Ethernet24": { + "index": "7,7,7,7", + "lanes": "113,114,115,116", + "breakout_modes": { + "1x100G[40G]": ["Eth7(Port7)"], + "2x50G": ["Eth7/1(Port7)", "Eth7/2(Port7)"], + "4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"], + "4x10G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"] + } + }, + + "Ethernet28": { + "index": "8,8,8,8", + "lanes": "121,122,123,124", + "breakout_modes": { + "1x100G[40G]": ["Eth8(Port8)"] + } + }, + + "Ethernet32": { + "index": "9,9,9,9", + "lanes": "41,42,43,44", + "breakout_modes": { + "1x100G[40G]": ["Eth9(Port9)"], + "2x50G": ["Eth9/1(Port9)", "Eth9/2(Port9)"], + "4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"], + "4x10G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"] + } + }, + + "Ethernet36": { + "index": "10,10,10,10", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]": ["Eth10(Port10)"] + } + }, + + "Ethernet40": { + "index": "11,11,11,11", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]": ["Eth11(Port11)"], + "2x50G": ["Eth11/1(Port11)", "Eth11/2(Port11)"], + "4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"], + "4x10G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"] + } + }, + + "Ethernet44": { + "index": "12,12,12,12", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]": ["Eth12(Port12)"] + } + }, + + "Ethernet48": { + "index": "13,13,13,13", + "lanes": "137,138,139,140", + "breakout_modes": { + "1x100G[40G]": ["Eth13(Port13)"], + "2x50G": ["Eth13/1(Port13)", "Eth13/2(Port13)"], + "4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"], + "4x10G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"] + } + }, + + "Ethernet52": { + "index": "14,14,14,14", + "lanes": "129,130,131,132", + "breakout_modes": { + "1x100G[40G]": ["Eth14(Port14)"] + } + }, + + "Ethernet56": { + "index": "15,15,15,15", + "lanes": "145,146,147,148", + "breakout_modes": { + "1x100G[40G]": ["Eth15(Port15)"], + "2x50G": ["Eth15/1(Port15)", "Eth15/2(Port15)"], + "4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"], + "4x10G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"] + } + }, + + "Ethernet60": { + "index": "16,16,16,16", + "lanes": "153,154,155,156", + "breakout_modes": { + "1x100G[40G]": ["Eth16(Port16)"] + } + }, + + "Ethernet64": { + "index": "17,17,17,17", + "lanes": "173,174,175,176", + "breakout_modes": { + "1x100G[40G]": ["Eth17(Port17)"], + "2x50G": ["Eth17/1(Port17)", "Eth17/2(Port17)"], + "4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"], + "4x10G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"] + } + }, + + "Ethernet68": { + "index": "18,18,18,18", + "lanes": "165,166,167,168", + "breakout_modes": { + "1x100G[40G]": ["Eth18(Port18)"] + } + }, + + "Ethernet72": { + "index": "19,19,19,19", + "lanes": "181,182,183,184", + "breakout_modes": { + "1x100G[40G]": ["Eth19(Port19)"], + "2x50G": ["Eth19/1(Port19)", "Eth19/2(Port19)"], + "4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"], + "4x10G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"] + } + }, + + "Ethernet76": { + "index": "20,20,20,20", + "lanes": "189,190,191,192", + "breakout_modes": { + "1x100G[40G]": ["Eth20(Port20)"] + } + }, + + "Ethernet80": { + "index": "21,21,21,21", + "lanes": "13,14,15,16", + "breakout_modes": { + "1x100G[40G]": ["Eth21(Port21)"], + "2x50G": ["Eth21/1(Port21)", "Eth21/2(Port21)"], + "4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"], + "4x10G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"] + } + }, + + "Ethernet84": { + "index": "22,22,22,22", + "lanes": "5,6,7,8", + "breakout_modes": { + "1x100G[40G]": ["Eth22(Port22)"] + } + }, + + "Ethernet88": { + "index": "23,23,23,23", + "lanes": "29,30,31,32", + "breakout_modes": { + "1x100G[40G]": ["Eth23(Port23)"], + "2x50G": ["Eth23/1(Port23)", "Eth23/2(Port23)"], + "4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"], + "4x10G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"] + } + }, + + "Ethernet92": { + "index": "24,24,24,24", + "lanes": "21,22,23,24", + "breakout_modes": { + "1x100G[40G]": ["Eth24(Port24)"] + } + }, + + "Ethernet96": { + "index": "25,25,25,25", + "lanes": "205,206,207,208", + "breakout_modes": { + "1x100G[40G]": ["Eth25(Port25)"], + "2x50G": ["Eth25/1(Port25)", "Eth25/2(Port25)"], + "4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"], + "4x10G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"] + } + }, + + "Ethernet100": { + "index": "26,26,26,26", + "lanes": "197,198,199,200", + "breakout_modes": { + "1x100G[40G]": ["Eth26(Port26)"] + } + }, + + "Ethernet104": { + "index": "27,27,27,27", + "lanes": "213,214,215,216", + "breakout_modes": { + "1x100G[40G]": ["Eth27(Port27)"], + "2x50G": ["Eth27/1(Port27)", "Eth27/2(Port27)"], + "4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"], + "4x10G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"] + } + }, + + "Ethernet108": { + "index": "28,28,28,28", + "lanes": "221,222,223,224", + "breakout_modes": { + "1x100G[40G]": ["Eth28(Port28)"] + } + }, + + "Ethernet112": { + "index": "29,29,29,29", + "lanes": "229,230,231,232", + "breakout_modes": { + "1x100G[40G]": ["Eth29(Port29)"], + "2x50G": ["Eth29/1(Port29)", "Eth29/2(Port29)"], + "4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"], + "4x10G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"] + } + }, + + "Ethernet116": { + "index": "30,30,30,30", + "lanes": "237,238,239,240", + "breakout_modes": { + "1x100G[40G]": ["Eth30(Port30)"] + } + }, + + "Ethernet120": { + "index": "31,31,31,31", + "lanes": "245,246,247,248", + "breakout_modes": { + "1x100G[40G]": ["Eth31(Port31)"], + "2x50G": ["Eth31/1(Port31)", "Eth31/2(Port31)"], + "4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"], + "4x10G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"] + } + }, + + "Ethernet124": { + "index": "32,32,32,32", + "lanes": "253,254,255,256", + "breakout_modes": { + "1x100G[40G]": ["Eth32(Port32)"] + } + }, + + "Ethernet128": { + "index": "33,33,33,33", + "lanes": "69,70,71,72", + "breakout_modes": { + "1x100G[40G]": ["Eth33(Port33)"] + } + }, + + "Ethernet132": { + "index": "34,34,34,34", + "lanes": "77,78,79,80", + "breakout_modes": { + "1x100G[40G]": ["Eth34(Port34)"] + } + }, + + "Ethernet136": { + "index": "35,35,35,35", + "lanes": "93,94,95,96", + "breakout_modes": { + "1x100G[40G]": ["Eth35(Port35)"] + } + }, + + "Ethernet140": { + "index": "36,36,36,36", + "lanes": "85,86,87,88", + "breakout_modes": { + "1x100G[40G]": ["Eth36(Port36)"] + } + }, + + "Ethernet144": { + "index": "37,37,37,37", + "lanes": "101,102,103,104", + "breakout_modes": { + "1x100G[40G]": ["Eth37(Port37)"] + } + }, + + "Ethernet148": { + "index": "38,38,38,38", + "lanes": "109,110,111,112", + "breakout_modes": { + "1x100G[40G]": ["Eth38(Port38)"] + } + }, + + "Ethernet152": { + "index": "39,39,39,39", + "lanes": "125,126,127,128", + "breakout_modes": { + "1x100G[40G]": ["Eth39(Port39)"] + } + }, + + "Ethernet156": { + "index": "40,40,40,40", + "lanes": "117,118,119,120", + "breakout_modes": { + "1x100G[40G]": ["Eth40(Port40)"] + } + }, + + "Ethernet160": { + "index": "41,41,41,41", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]": ["Eth41(Port41)"] + } + }, + + "Ethernet164": { + "index": "42,42,42,42", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]": ["Eth42(Port42)"] + } + }, + + "Ethernet168": { + "index": "43,43,43,43", + "lanes": "61,62,63,64", + "breakout_modes": { + "1x100G[40G]": ["Eth43(Port43)"] + } + }, + + "Ethernet172": { + "index": "44,44,44,44", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]": ["Eth44(Port44)"] + } + }, + + "Ethernet176": { + "index": "45,45,45,45", + "lanes": "133,134,135,136", + "breakout_modes": { + "1x100G[40G]": ["Eth45(Port45)"] + } + }, + + "Ethernet180": { + "index": "46,46,46,46", + "lanes": "141,142,143,144", + "breakout_modes": { + "1x100G[40G]": ["Eth46(Port46)"] + } + }, + + "Ethernet184": { + "index": "47,47,47,47", + "lanes": "157,158,159,160", + "breakout_modes": { + "1x100G[40G]": ["Eth47(Port47)"] + } + }, + + "Ethernet188": { + "index": "48,48,48,48", + "lanes": "149,150,151,152", + "breakout_modes": { + "1x100G[40G]": ["Eth48(Port48)"] + } + }, + + "Ethernet192": { + "index": "49,49,49,49", + "lanes": "161,162,163,164", + "breakout_modes": { + "1x100G[40G]": ["Eth49(Port49)"] + } + }, + + "Ethernet196": { + "index": "50,50,50,50", + "lanes": "169,170,171,172", + "breakout_modes": { + "1x100G[40G]": ["Eth50(Port50)"] + } + }, + + "Ethernet200": { + "index": "51,51,51,51", + "lanes": "185,186,187,188", + "breakout_modes": { + "1x100G[40G]": ["Eth51(Port51)"] + } + }, + + "Ethernet204": { + "index": "52,52,52,52", + "lanes": "177,178,179,180", + "breakout_modes": { + "1x100G[40G]": ["Eth52(Port52)"] + } + }, + + "Ethernet208": { + "index": "53,53,53,53", + "lanes": "1,2,3,4", + "breakout_modes": { + "1x100G[40G]": ["Eth53(Port53)"] + } + }, + + "Ethernet212": { + "index": "54,54,54,54", + "lanes": "9,10,11,12", + "breakout_modes": { + "1x100G[40G]": ["Eth54(Port54)"] + } + }, + + "Ethernet216": { + "index": "55,55,55,55", + "lanes": "25,26,27,28", + "breakout_modes": { + "1x100G[40G]": ["Eth55(Port55)"] + } + }, + + "Ethernet220": { + "index": "56,56,56,56", + "lanes": "17,18,19,20", + "breakout_modes": { + "1x100G[40G]": ["Eth56(Port56)"] + } + }, + + "Ethernet224": { + "index": "57,57,57,57", + "lanes": "193,194,195,196", + "breakout_modes": { + "1x100G[40G]": ["Eth57(Port57)"] + } + }, + + "Ethernet228": { + "index": "58,58,58,58", + "lanes": "201,202,203,204", + "breakout_modes": { + "1x100G[40G]": ["Eth58(Port58)"] + } + }, + + "Ethernet232": { + "index": "59,59,59,59", + "lanes": "217,218,219,220", + "breakout_modes": { + "1x100G[40G]": ["Eth59(Port59)"] + } + }, + + "Ethernet236": { + "index": "60,60,60,60", + "lanes": "209,210,211,212", + "breakout_modes": { + "1x100G[40G]": ["Eth60(Port60)"] + } + }, + + "Ethernet240": { + "index": "61,61,61,61", + "lanes": "225,226,227,228", + "breakout_modes": { + "1x100G[40G]": ["Eth61(Port61)"] + } + }, + + "Ethernet244": { + "index": "62,62,62,62", + "lanes": "233,234,235,236", + "breakout_modes": { + "1x100G[40G]": ["Eth62(Port62)"] + } + }, + + "Ethernet248": { + "index": "63,63,63,63", + "lanes": "249,250,251,252", + "breakout_modes": { + "1x100G[40G]": ["Eth63(Port63)"] + } + }, + + "Ethernet252": { + "index": "64,64,64,64", + "lanes": "241,242,243,244", + "breakout_modes": { + "1x100G[40G]": ["Eth64(Port64)"] + } + } + } +} + From f977f2f36f5796699ed25d02541fc282368a1662 Mon Sep 17 00:00:00 2001 From: Rajkumar-Marvell <54936542+rajkumar38@users.noreply.github.com> Date: Fri, 1 Jul 2022 01:51:30 +0530 Subject: [PATCH 492/817] [Marvell] Update armhf sai deb (#11296) 1) Migrate SAI to 1.10.2 2) MRVL-SAI fixes from 202012 branch Signed-off-by: rajkumar38 --- platform/marvell-armhf/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/marvell-armhf/sai.mk b/platform/marvell-armhf/sai.mk index 4ecfdce244a1..5fc14f988aee 100644 --- a/platform/marvell-armhf/sai.mk +++ b/platform/marvell-armhf/sai.mk @@ -1,6 +1,6 @@ # Marvell SAI -export MRVL_SAI_VERSION = 1.9.1-2 +export MRVL_SAI_VERSION = 1.10.2-1 export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION)_$(PLATFORM_ARCH).deb $(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai From 77acae7ffb3c4e72dac5ec15d79dd435b83f6386 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 1 Jul 2022 21:12:16 +0800 Subject: [PATCH 493/817] [Build] Add the missing debian security mirrors in slave images (#11305) Why I did it The build below was broken, it was caused by one of the required debian mirror missing. https://dev.azure.com/mssonic/build/_build/results?buildId=116719&view=logs&j=88ce9a53-729c-5fa9-7b6e-3d98f2488e3f&t=88f376cf-c35d-5783-0a48-9ad83a873284 libpci-dev : Depends: libudev-dev (>= 196) but it is not going to be installed libsystemd-dev : Depends: libsystemd0 (= 232-25+deb9u14) but 232-25+deb9u13 is to be installed How I did it Add the missing mirrors for buster and stretch. --- sonic-slave-buster/Dockerfile.j2 | 9 ++++++--- sonic-slave-stretch/Dockerfile.j2 | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 2a9b49b82811..2f3cadf0a4b4 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -19,7 +19,8 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bust echo "deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ buster/updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian buster-backports main" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list {%- if CONFIGURED_ARCH == "armhf" %} RUN echo "deb [arch=armhf] http://deb.debian.org/debian buster main contrib non-free" > /etc/apt/sources.list && \ @@ -30,7 +31,8 @@ RUN echo "deb [arch=armhf] http://deb.debian.org/debian buster main contrib non- echo "deb-src [arch=armhf] http://security.debian.org buster/updates main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=armhf] http://ftp.debian.org/debian buster-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list + echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list {%- elif CONFIGURED_ARCH == "arm64" %} RUN echo "deb [arch=arm64] http://deb.debian.org/debian buster main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=arm64] http://deb.debian.org/debian buster main contrib non-free" >> /etc/apt/sources.list && \ @@ -40,7 +42,8 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian buster main contrib non- echo "deb-src [arch=arm64] http://security.debian.org buster/updates main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=arm64] http://ftp.debian.org/debian buster-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list {%- endif %} ## Make apt-get non-interactive diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2 index ad13ed0c124a..e3815eab2d36 100644 --- a/sonic-slave-stretch/Dockerfile.j2 +++ b/sonic-slave-stretch/Dockerfile.j2 @@ -18,6 +18,7 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ stre echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian stretch-backports main" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian stretch main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian stretch-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security stretch_updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.microsoft.com/debian/9/prod stretch main" >> /etc/apt/sources.list {%- if CONFIGURED_ARCH == "armhf" %} @@ -29,7 +30,8 @@ RUN echo "deb [arch=armhf] http://deb.debian.org/debian stretch main contrib non echo "deb-src [arch=armhf] http://security.debian.org stretch/updates main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=armhf] http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian stretch main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian stretch-updates main contrib non-free" >> /etc/apt/sources.list + echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian stretch-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian-security stretch_updates main contrib non-free" >> /etc/apt/sources.list {%- elif CONFIGURED_ARCH == "arm64" %} RUN echo "deb [arch=arm64] http://deb.debian.org/debian stretch main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=arm64] http://deb.debian.org/debian stretch main contrib non-free" >> /etc/apt/sources.list && \ @@ -39,7 +41,8 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian stretch main contrib non echo "deb-src [arch=arm64] http://security.debian.org stretch/updates main contrib non-free" >> /etc/apt/sources.list && \ echo 'deb [arch=arm64] http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian stretch main contrib non-free" >> /etc/apt/sources.list && \ - echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian stretch-updates main contrib non-free" >> /etc/apt/sources.list + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian stretch-updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security stretch_updates main contrib non-free" >> /etc/apt/sources.list {%- endif %} ## Make apt-get non-interactive From baaf8b085f0d22b6572fe74f468c77f26c6d1370 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Fri, 1 Jul 2022 11:00:30 -0700 Subject: [PATCH 494/817] Revert "Update include_macsec flag if type is SpineRouter (#11141)" (#11306) This reverts commit c9f36957db687d231e0ccd2b648fa3a4c4ed457b. --- files/build_templates/init_cfg.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index 5fd9ac10cd25..ca5a0756f954 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -46,7 +46,7 @@ {%- if include_p4rt == "y" %}{% do features.append(("p4rt", "enabled", false, "enabled")) %}{% endif %} {%- if include_restapi == "y" %}{% do features.append(("restapi", "enabled", false, "enabled")) %}{% endif %} {%- if include_sflow == "y" %}{% do features.append(("sflow", "disabled", false, "enabled")) %}{% endif %} -{%- if include_macsec == "y" %}{% do features.append(("macsec", "{% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'SpineRouter' %}enabled{% else %}disabled{% endif %}", false, "enabled")) %}{% endif %} +{%- if include_macsec == "y" %}{% do features.append(("macsec", "disabled", false, "enabled")) %}{% endif %} {%- if include_system_telemetry == "y" %}{% do features.append(("telemetry", "enabled", true, "enabled")) %}{% endif %} "FEATURE": { {# has_timer field if set, will start the feature systemd .timer unit instead of .service unit #} From 23d68883f519d700e79ac7eda32514ae12c544be Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Fri, 1 Jul 2022 17:29:07 -0700 Subject: [PATCH 495/817] [Mellanox]Check dmi file permission before access (#11309) Signed-off-by: Sudharsan Dhamal Gopalarathnam sudharsand@nvidia.com Why I did it During the system boot up when 'show platform status' or 'show version' command is executed before STATE_DB CHASSIS_INFO table is populated, the show will try to fallback to use the platform API. The DMI file in mellanox platforms require root permission for access. So if the show commands are executed as admin or any other user, the following error log will appear in the syslog Jun 28 17:21:25.612123 sonic ERR show: Fail to decode DMI /sys/firmware/dmi/entries/2-0/raw due to PermissionError(13, 'Permission denied') How I did it Check the file permission before accessing it. How to verify it Added UT to verify. Manually verified if the error log is not thrown. --- .../mlnx-platform-api/sonic_platform/chassis.py | 3 +++ .../mlnx-platform-api/tests/test_chassis.py | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index dc48e11da272..ea4d7df30f9a 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -649,6 +649,9 @@ def _parse_dmi(self, filename): """ result = {} try: + if not os.access(filename, os.R_OK): + return result + with open(filename, "rb") as fileobj: data = fileobj.read() diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index 7b153813460b..c6235b195a02 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -269,3 +269,16 @@ def test_module(self): module_list = chassis.get_all_modules() assert len(module_list) == 3 assert chassis.module_initialized_count == 3 + + def test_revision_permission(self): + old_dmi_file = sonic_platform.chassis.DMI_FILE + #Override the dmi file + sonic_platform.chassis.DMI_FILE = "/tmp/dmi_file" + new_dmi_file = sonic_platform.chassis.DMI_FILE + os.system("touch " + new_dmi_file) + os.system("chmod -r " + new_dmi_file) + chassis = Chassis() + rev = chassis.get_revision() + sonic_platform.chassis.DMI_FILE = old_dmi_file + os.system("rm -f " + new_dmi_file) + assert rev == "N/A" From 15686670116bf4ca01842a3e6f681a751e716bb5 Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Mon, 4 Jul 2022 03:40:04 +0300 Subject: [PATCH 496/817] [ci] add docker-sonic-vs with ASAN build (#11297) The asan-enabled docker image will be used in other CIs that run DVS tests. Why I did it To add a possibility to run DVS tests with ASAN for other CIs (e.g. swss). How I did it Added the 'asan_image' flag to the vs job group. How to verify it Run the CI and check the docker-sonic-vs-asan.gz artifact. --- .azure-pipelines/azure-pipelines-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index f7eeb8c95d9b..73cf108df668 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -30,6 +30,7 @@ jobs: BUILD_OPTIONS: ${{ parameters.buildOptions }} DOCKER_DATA_ROOT_FOR_MULTIARCH: /data/march/docker dbg_image: no + asan_image: no swi_image: no raw_image: no docker_syncd_rpc_image: no @@ -42,6 +43,7 @@ jobs: - name: vs variables: dbg_image: yes + asan_image: yes - name: barefoot variables: @@ -106,6 +108,10 @@ jobs: make $BUILD_OPTIONS INSTALL_DEBUG_TOOLS=y target/sonic-vs.img.gz mv target/sonic-vs.img.gz target/sonic-vs-dbg.img.gz fi + if [ $(asan_image) == yes ]; then + make $BUILD_OPTIONS ENABLE_ASAN=y target/docker-sonic-vs.gz + mv target/docker-sonic-vs.gz target/docker-sonic-vs-asan.gz + fi make $BUILD_OPTIONS target/docker-sonic-vs.gz target/sonic-vs.img.gz target/docker-ptf.gz if [ $(Build.Reason) != 'PullRequest' ];then gzip -kd target/sonic-vs.img.gz From 8fb534effb7f7b9b8584b31c5ae593bf0bbe48f6 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 4 Jul 2022 12:37:21 +0800 Subject: [PATCH 497/817] Add the branch 202205 and branch 202111 in the README.md (#11311) Why I did it Add the branch 202205 and branch 202111 in the README.md --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index aada8a53084b..5334bbe18dbd 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,30 @@ [![P4](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon?subject=P4)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all) [![VS](https://dev.azure.com/mssonic/build/_apis/build/status/vs/Azure.sonic-buildimage.official.vs?branchName=master&label=VS)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=master) +*202205 builds*: + +[![Barefoot](https://dev.azure.com/mssonic/build/_apis/build/status/barefoot/Azure.sonic-buildimage.official.barefoot?branchName=202205&label=Barefoot)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=146&branchName=202205) +[![Broadcom](https://dev.azure.com/mssonic/build/_apis/build/status/broadcom/Azure.sonic-buildimage.official.broadcom?branchName=202205&label=Broadcom)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202205) +[![Centec](https://dev.azure.com/mssonic/build/_apis/build/status/centec/Azure.sonic-buildimage.official.centec?branchName=202205&label=Centec)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=143&branchName=202205) +[![Centec(arm64)](https://dev.azure.com/mssonic/build/_apis/build/status/centec/Azure.sonic-buildimage.official.centec-arm64?branchName=202205&label=Centec-arm64)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=140&branchName=202205) +[![Innovium](https://dev.azure.com/mssonic/build/_apis/build/status/innovium/Azure.sonic-buildimage.official.innovium?branchName=202205&label=Innovium)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=148&branchName=202205) +[![Mellanox](https://dev.azure.com/mssonic/build/_apis/build/status/mellanox/Azure.sonic-buildimage.official.mellanox?branchName=202205&label=Mellanox)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202205) +[![Marvell(armhf)](https://dev.azure.com/mssonic/build/_apis/build/status/marvell/Azure.sonic-buildimage.official.marvell-armhf?branchName=202205&label=Marvell-armhf)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202205) +[![Nephos](https://dev.azure.com/mssonic/build/_apis/build/status/nephos/Azure.sonic-buildimage.official.nephos?branchName=202205&label=Nephos)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=149&branchName=202205) +[![VS](https://dev.azure.com/mssonic/build/_apis/build/status/vs/Azure.sonic-buildimage.official.vs?branchName=202205&label=VS)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202205) + +*202111 builds* + +[![Barefoot](https://dev.azure.com/mssonic/build/_apis/build/status/barefoot/Azure.sonic-buildimage.official.barefoot?branchName=202111&label=Barefoot)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=146&branchName=202111) +[![Broadcom](https://dev.azure.com/mssonic/build/_apis/build/status/broadcom/Azure.sonic-buildimage.official.broadcom?branchName=202111&label=Broadcom)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202111) +[![Centec](https://dev.azure.com/mssonic/build/_apis/build/status/centec/Azure.sonic-buildimage.official.centec?branchName=202111&label=Centec)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=143&branchName=202111) +[![Centec(arm64)](https://dev.azure.com/mssonic/build/_apis/build/status/centec/Azure.sonic-buildimage.official.centec-arm64?branchName=202111&label=Centec-arm64)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=140&branchName=202111) +[![Innovium](https://dev.azure.com/mssonic/build/_apis/build/status/innovium/Azure.sonic-buildimage.official.innovium?branchName=202111&label=Innovium)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=148&branchName=202111) +[![Mellanox](https://dev.azure.com/mssonic/build/_apis/build/status/mellanox/Azure.sonic-buildimage.official.mellanox?branchName=202111&label=Mellanox)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202111) +[![Marvell(armhf)](https://dev.azure.com/mssonic/build/_apis/build/status/marvell/Azure.sonic-buildimage.official.marvell-armhf?branchName=202111&label=Marvell-armhf)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202111) +[![Nephos](https://dev.azure.com/mssonic/build/_apis/build/status/nephos/Azure.sonic-buildimage.official.nephos?branchName=202111&label=Nephos)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=149&branchName=202111) +[![VS](https://dev.azure.com/mssonic/build/_apis/build/status/vs/Azure.sonic-buildimage.official.vs?branchName=202111&label=VS)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202111) + *202012 builds*: [![Barefoot](https://dev.azure.com/mssonic/build/_apis/build/status/barefoot/Azure.sonic-buildimage.official.barefoot?branchName=202012&label=Barefoot)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=146&branchName=202012) From 201ae28c509471b0543dafa728fed623a988dd72 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Mon, 4 Jul 2022 15:23:13 +0800 Subject: [PATCH 498/817] Add Yang model for `SYSTEM_DEFAULTS` table (#11117) * Add Yang model for SYSTEM_DEFAULTS table Signed-off-by: bingwang --- src/sonic-yang-models/doc/Configuration.md | 31 ++++++++++++++- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 6 ++- .../tests/system_defaults.json | 9 +++++ .../tests_config/system_defaults.json | 26 +++++++++++++ .../yang-models/sonic-system-defaults.yang | 39 +++++++++++++++++++ 6 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/system_defaults.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json create mode 100644 src/sonic-yang-models/yang-models/sonic-system-defaults.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index d0f4b3cb6e67..ab51762e5d7e 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -25,7 +25,7 @@ Table of Contents * [Device neighbor metada](#device-neighbor-metada) * [DSCP_TO_TC_MAP](#dscp_to_tc_map) * [FLEX_COUNTER_TABLE](#flex_counter_table) - * [KDUMP](#kdump) + * [KDUMP](#kdump) * [L2 Neighbors](#l2-neighbors) * [Loopback Interface](#loopback-interface) * [LOSSLESS_TRAFFIC_PATTERN](#LOSSLESS_TRAFFIC_PATTERN) @@ -51,7 +51,8 @@ Table of Contents * [VLAN_MEMBER](#vlan_member) * [Virtual router](#virtual-router) * [WRED_PROFILE](#wred_profile) - * [PASSWORD_HARDENING](#password_hardening) + * [PASSWORD_HARDENING](#password_hardening) + * [SYSTEM_DEFAULTS table](#systemdefaults-table) * [For Developers](#for-developers) * [Generating Application Config by Jinja2 Template](#generating-application-config-by-jinja2-template) * [Incremental Configuration by Subscribing to ConfigDB](#incremental-configuration-by-subscribing-to-configdb) @@ -1617,6 +1618,32 @@ The method could be: } ``` +### SYSTEM_DEFAULTS table +To have a better management of the features in SONiC, a new table `SYSTEM_DEFAULTS` is introduced. + +``` +"SYSTEM_DEFAULTS": { + "tunnel_qos_remap": { + "status": "enabled" + } + "default_bgp_status": { + "status": "down" + } + "synchronous_mode": { + "status": "enable" + } + "dhcp_server": { + "status": "enable" + } + } +``` +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) + +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. 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 Developers ============== diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 4d61be960c3b..1c2bfaf2755a 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -105,6 +105,7 @@ def run(self): './yang-models/sonic-extension.yang', './yang-models/sonic-flex_counter.yang', './yang-models/sonic-feature.yang', + './yang-models/sonic-system-defaults.yang', './yang-models/sonic-interface.yang', './yang-models/sonic-kdump.yang', './yang-models/sonic-loopback-interface.yang', @@ -168,6 +169,7 @@ def run(self): './cvlyang-models/sonic-extension.yang', './cvlyang-models/sonic-flex_counter.yang', './cvlyang-models/sonic-feature.yang', + './cvlyang-models/sonic-system-defaults.yang', './cvlyang-models/sonic-interface.yang', './cvlyang-models/sonic-kdump.yang', './cvlyang-models/sonic-loopback-interface.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index cee594b23634..97a02004306e 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1897,8 +1897,12 @@ "LAG" ] } + }, + "SYSTEM_DEFAULTS": { + "tunnel_qos_remap": { + "status": "enabled" + } }, - "LOSSLESS_TRAFFIC_PATTERN": { "AZURE": { "mtu": "1024", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/system_defaults.json b/src/sonic-yang-models/tests/yang_model_tests/tests/system_defaults.json new file mode 100644 index 000000000000..7d02dae1f95c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/system_defaults.json @@ -0,0 +1,9 @@ +{ + "SYSTEM_DEFAULTS_WITH_CORRECT_VALUES": { + "desc": "CONFIG SYSTEM_DEFAULTS TABLE WITH ALL THE CORRECT VALUES" + }, + "SYSTEM_DEFAULTS_WITH_INVALID_STATUS_VALUE" : { + "desc": "Referring invalid status value", + "eStrKey": "InvalidValue" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json new file mode 100644 index 000000000000..a8ccc13c099d --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json @@ -0,0 +1,26 @@ +{ + "SYSTEM_DEFAULTS_WITH_CORRECT_VALUES": { + "sonic-system-defaults:sonic-system-defaults": { + "sonic-system-defaults:SYSTEM_DEFAULTS": { + "SYSTEM_DEFAULTS_LIST": [ + { + "name": "tunnel_qos_remap", + "status": "enabled" + } + ] + } + } + }, + "SYSTEM_DEFAULTS_WITH_INVALID_STATUS_VALUE": { + "sonic-system-defaults:sonic-system-defaults": { + "sonic-system-defaults:SYSTEM_DEFAULTS": { + "SYSTEM_DEFAULTS_LIST": [ + { + "name": "tunnel_qos_remap", + "status": "invalid_status" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-system-defaults.yang b/src/sonic-yang-models/yang-models/sonic-system-defaults.yang new file mode 100644 index 000000000000..a5160899777a --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-system-defaults.yang @@ -0,0 +1,39 @@ +module sonic-system-defaults{ + + yang-version 1.1; + + namespace "http://github.com/Azure/system-defaults"; + prefix system-defaults; + + import sonic-types { + prefix stypes; + } + + description "SYSTEM_DEFAULTS Table yang Module for SONiC"; + + container sonic-system-defaults { + + container SYSTEM_DEFAULTS { + + description "system_defaults table in config_db.json"; + + list SYSTEM_DEFAULTS_LIST { + + key "name"; + + leaf name { + description "feature name in SYSTEM_DEFAULTS table"; + type string { + length 1..32; + } + } + + leaf status { + description "default status of the feature"; + type stypes:admin_mode; + } + + } + } + } +} From 4fb6cf03e68856620038a1d3577ede15e89f8211 Mon Sep 17 00:00:00 2001 From: youshcentec <63637102+youshcentec@users.noreply.github.com> Date: Tue, 5 Jul 2022 09:16:51 +0800 Subject: [PATCH 499/817] for fixing centec-arm64 compile error (#11186) Why I did it Fix Centec-Arm64 compile error, Centec SAI Dev package reference is error How I did it Modify sai.mk of arm64 platform for Centec How to verify it Build centec amd64 and arm64 sonic image --- platform/centec-arm64/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/centec-arm64/sai.mk b/platform/centec-arm64/sai.mk index 82dc1de5eadf..b07f334c2f02 100755 --- a/platform/centec-arm64/sai.mk +++ b/platform/centec-arm64/sai.mk @@ -5,7 +5,7 @@ export CENTEC_SAI = libsai_$(CENTEC_SAI_VERSION)_$(PLATFORM_ARCH).deb export CENTEC_SAI_DEV = libsai-dev_$(CENTEC_SAI_VERSION)_$(PLATFORM_ARCH).deb $(CENTEC_SAI)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI) -$(CENTEC_SAI)_DEV_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI_DEV) +$(CENTEC_SAI_DEV)_URL = https://github.com/CentecNetworks/sonic-binaries/raw/master/$(PLATFORM_ARCH)/sai/$(CENTEC_SAI_DEV) $(eval $(call add_conflict_package,$(CENTEC_SAI_DEV),$(LIBSAIVS_DEV))) SONIC_ONLINE_DEBS += $(CENTEC_SAI) From ebe4a84eee3d299b11de8ca54a795ba8aec0c102 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Tue, 5 Jul 2022 09:36:12 -0700 Subject: [PATCH 500/817] [yang] Adding a tool for generating documentation based on yang model (#11291) #### Why I did it Added a tool to generate configuration based on yang model #### How I did it Parse the yang model and create documentation based on description field. #### How to verify it Added UT to verify it. --- src/sonic-yang-mgmt/setup.py | 4 + src/sonic-yang-mgmt/sonic-cfg-help | 205 ++++++++++++++++++++++ src/sonic-yang-mgmt/tests/test_cfghelp.py | 170 ++++++++++++++++++ 3 files changed, 379 insertions(+) create mode 100755 src/sonic-yang-mgmt/sonic-cfg-help create mode 100644 src/sonic-yang-mgmt/tests/test_cfghelp.py diff --git a/src/sonic-yang-mgmt/setup.py b/src/sonic-yang-mgmt/setup.py index e97343ac0e0a..d513507dd17c 100644 --- a/src/sonic-yang-mgmt/setup.py +++ b/src/sonic-yang-mgmt/setup.py @@ -24,10 +24,14 @@ description="Package contains Python Library for YANG for sonic.", license="GNU General Public License v3", long_description=readme + '\n\n', + scripts = [ + 'sonic-cfg-help', + ], install_requires = [ 'xmltodict==0.12.0', 'ijson==2.6.1', 'jsondiff>=1.2.0', + 'tabulate==0.8.2' ], tests_require = [ 'pytest>3', diff --git a/src/sonic-yang-mgmt/sonic-cfg-help b/src/sonic-yang-mgmt/sonic-cfg-help new file mode 100755 index 000000000000..4c14cebc44b8 --- /dev/null +++ b/src/sonic-yang-mgmt/sonic-cfg-help @@ -0,0 +1,205 @@ +#!/usr/bin/env python3 + +import argparse +from tabulate import tabulate +import re +import textwrap + +import sonic_yang + +YANG_MODELS_DIR = "/usr/local/yang-models" + + +class SonicCfgDescriber: + + def __init__(self, table_name, field, print_format, + yang_models_dir=YANG_MODELS_DIR): + self.yang_models_dir = yang_models_dir + self.yang_parser = sonic_yang.SonicYang(self.yang_models_dir) + self.yang_parser.loadYangModel() + self.table_descr = {} + self.table_name = table_name + self.field = field + self.print_format = print_format + + def print_documentation(self): + for j in self.yang_parser.yJson: + toplevel = j['module'].get('container') + if toplevel is not None: + container = toplevel.get('container') + if isinstance(container, list): + for c in container: + if c.get('@name') == self.table_name or \ + not self.table_name: + self.print_table(c, self.field) + elif isinstance(container, dict): + if container.get('@name') == self.table_name or \ + not self.table_name: + self.print_table(container, self.field) + + def print_table(self, table, field): + if table is None: + return + print("\n" + table.get('@name')) + if table.get('description', {}).get('text') is not None: + print("Description: " + table.get('description').get('text')) + print () + + if table.get('list') is not None: + if (isinstance(table['list'], list)): + for schema in table['list']: + self.print_field_desc(schema, field) + print() + else: + self.print_field_desc(table['list'], field) + print() + elif table.get('container') is not None: + self.print_field_desc(table.get('container'), field) + print() + + def get_referenced_table_field(self, ref): + if 'LIST' in ref.split('/')[-2]: + table = ref.split('/')[-3].split(':')[-1] + else: + table = ref.split('/')[-2].split(':')[-1] + field = ref.split('/')[-1].split(':')[-1] + return(table + ":" + field) + + def parse_when_condition(self, table): + condition = table['@condition'] + desc = "" + if "boolean" in condition: + values = re.findall("\'(.*?)\'", condition, re.DOTALL) + field = re.search("boolean\((.*?)\[", condition) + desc = "when " + field.group(1) + " in " + ",".join(values) + elif condition.startswith("(/"): + field = re.search("/(.*)\:(.*) \=", condition) + ref_table = condition.split("/")[2].split(':')[-1] + values = re.findall("\'(.*?)\'", condition, re.DOTALL) + desc = "when " + ref_table + ":" + field.group(2) + \ + " in " + ",".join(values) + + return desc + + def parse_choice(self, table, field): + out = [] + for keys in table['case']: + desc = "Mutually exclusive in group " + table['@name'] + if 'when' in keys: + desc += "\n" + self.parse_when_condition(keys['when']) + out += self.validate_and_parse_leaf(keys, field, desc) + return out + + def parse_leaf(self, key, field, desc=""): + mandatory = '' + default = '' + out = [] + reference = '' + name = key.get('@name') + if field and name != field: + return [] + if isinstance(key, dict): + if key.get('description', {}).get('text') is not None: + desc += "\n".join(textwrap.wrap(re.sub(r"\s+", " ", + key['description']['text']), width=50)) + if key.get('mandatory') is not None: + mandatory = key.get('mandatory').get('@value') + if key.get('default') is not None: + default = key.get('default').get('@value') + if key.get('type') is not None: + if key['type'].get('@name') == 'leafref': + reference = self.get_referenced_table_field( + key['type']['path'].get('@value')) + elif key['type'].get('@name') == 'union': + for types in key['type']['type']: + if 'path' in types: + val = self.get_referenced_table_field( + types['path'].get('@value')) + if not reference: + reference = val + else: + reference += "\n" + val + out.append([name, desc, mandatory, default, reference]) + return out + + def validate_and_parse_leaf(self, table, field, desc=""): + out = [] + if 'leaf' in table: + if isinstance(table['leaf'], list): + for key in table['leaf']: + ret = self.parse_leaf(key, field, desc) + out = out + ret + elif isinstance(table['leaf'], dict): + ret = self.parse_leaf(table['leaf'], field, desc) + out = out + ret + + if 'leaf-list' in table: + if desc: + desc = desc + "\n" + desc = desc + "The field contains list of unique members" + if isinstance(table['leaf-list'], list): + for key in table['leaf-list']: + ret = self.parse_leaf(key, field, desc) + out = out + ret + elif isinstance(table['leaf-list'], dict): + ret = self.parse_leaf(table['leaf-list'], field, desc) + out = out + ret + return out + + def print_field_desc(self, table, field): + if table is None: + return + + header = ['Field', 'Description', 'Mandatory', 'Default', 'Reference'] + out = [] + if 'key' in table: + print("key - " + ":".join(table['key']['@value'].split())) + + out += self.validate_and_parse_leaf(table, field) + + if 'choice' in table: + if isinstance(table['choice'], list): + for key in table['choice']: + out += self.parse_choice(key, field) + elif isinstance(table['choice'], dict): + out += self.parse_choice(table['choice'], field) + + if 'list' in table: + out += self.validate_and_parse_leaf(table['list'], field, + "This field is for storing " + + "mapping between two fields") + + print(tabulate(out, header, tablefmt=self.print_format)) + + +def main(): + parser = argparse.ArgumentParser(description="Description of table name") + parser.add_argument("-t", "--table", help="Table name", default='') + parser.add_argument("-f", "--field", help="Field", default='') + parser.add_argument("-p", "--print_format", help="Print format", + default='grid') + parser.add_argument('-a', "--all", action="store_true", default=False, + help="Print all tables") + args = parser.parse_args() + if not (args.table or args.all): + print("Error: Table or all option is required") + parser.print_help() + return -1 + + if args.table and args.all: + print("Cannot have table and all option together") + parser.print_help() + return -1 + + if args.field and not args.table: + print("Error: Filter by field requires table to be specified") + parser.print_help() + return -1 + + yang_cfg = SonicCfgDescriber(args.table, args.field, args.print_format) + yang_cfg.print_documentation() + + +if __name__ == "__main__": + main() + diff --git a/src/sonic-yang-mgmt/tests/test_cfghelp.py b/src/sonic-yang-mgmt/tests/test_cfghelp.py new file mode 100644 index 000000000000..2c09625a0e6a --- /dev/null +++ b/src/sonic-yang-mgmt/tests/test_cfghelp.py @@ -0,0 +1,170 @@ +import json +import subprocess +import os + +from unittest import TestCase + +output1="""\ +Error: Table or all option is required +usage: sonic-cfg-help [-h] [-t TABLE] [-f FIELD] [-p PRINT_FORMAT] [-a] + +Description of table name + +optional arguments: + -h, --help show this help message and exit + -t TABLE, --table TABLE + Table name + -f FIELD, --field FIELD + Field + -p PRINT_FORMAT, --print_format PRINT_FORMAT + Print format + -a, --all Print all tables +""" + +techsupport_table_output="""\ + +AUTO_TECHSUPPORT +Description: AUTO_TECHSUPPORT part of config_db.json + ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++=========================+====================================================+=============+===========+=============+ +| state | Knob to make techsupport invocation event-driven | | | | +| | based on core-dump generation | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| rate_limit_interval | Minimum time in seconds between two successive | | | | +| | techsupport invocations. Configure 0 to explicitly | | | | +| | disable | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| max_techsupport_limit | Max Limit in percentage for the cummulative size | | | | +| | of ts dumps. No cleanup is performed if the value | | | | +| | isn't configured or is 0.0 | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| max_core_limit | Max Limit in percentage for the cummulative size | | | | +| | of core dumps. No cleanup is performed if the | | | | +| | value isn't congiured or is 0.0 | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| available_mem_threshold | Memory threshold; 0 to disable techsupport | | 10.0 | | +| | invocation on memory usage threshold crossing | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| min_available_mem | Minimum Free memory (in MB) that should be | | 200 | | +| | available for the techsupport execution to start | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ +| since | Only collect the logs & core-dumps generated since | | | | +| | the time provided. A default value of '2 days ago' | | | | +| | is used if this value is not set explicitly or a | | | | +| | non-valid string is provided | | | | ++-------------------------+----------------------------------------------------+-------------+-----------+-------------+ + +""" + +techsupport_table_field_output="""\ + +AUTO_TECHSUPPORT +Description: AUTO_TECHSUPPORT part of config_db.json + ++---------+--------------------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++=========+==================================================+=============+===========+=============+ +| state | Knob to make techsupport invocation event-driven | | | | +| | based on core-dump generation | | | | ++---------+--------------------------------------------------+-------------+-----------+-------------+ + +""" + +portchannel_table_field_output="""\ + +PORTCHANNEL +Description: PORTCHANNEL part of config_db.json + +key - name ++---------+-------------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++=========+===========================================+=============+===========+=============+ +| members | The field contains list of unique members | | | PORT:name | ++---------+-------------------------------------------+-------------+-----------+-------------+ + +""" + +dscp_to_tc_table_field_output="""\ + +DSCP_TO_TC_MAP +Description: DSCP_TO_TC_MAP part of config_db.json + +key - name ++---------+------------------------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++=========+======================================================+=============+===========+=============+ +| name | | | | | ++---------+------------------------------------------------------+-------------+-----------+-------------+ +| dscp | This field is for storing mapping between two fields | | | | ++---------+------------------------------------------------------+-------------+-----------+-------------+ +| tc | This field is for storing mapping between two fields | | | | ++---------+------------------------------------------------------+-------------+-----------+-------------+ + +""" + +acl_rule_table_field_output="""\ + +ACL_RULE +Description: ACL_RULE part of config_db.json + +key - ACL_TABLE_NAME:RULE_NAME ++-----------+-----------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++===========+=========================================+=============+===========+=============+ +| ICMP_TYPE | Mutually exclusive in group icmp | | | | +| | when IP_TYPE in ANY,IP,IPV4,IPv4ANY,ARP | | | | ++-----------+-----------------------------------------+-------------+-----------+-------------+ + +""" + +class TestCfgHelp(TestCase): + + def setUp(self): + self.test_dir = os.path.dirname(os.path.realpath(__file__)) + self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfg-help') + + def run_script(self, argument): + print('\n Running sonic-cfg-help ' + argument) + output = subprocess.check_output(self.script_file + ' ' + argument, shell=True) + + output = output.decode() + + linecount = output.strip().count('\n') + if linecount <= 0: + print(' Output: ' + output.strip()) + else: + print(' Output: ({0} lines, {1} bytes)'.format(linecount + 1, len(output))) + return output + + def test_dummy_run(self): + argument = '' + output = self.run_script(argument) + self.assertEqual(output, output1) + + def test_single_table(self): + argument = '-t AUTO_TECHSUPPORT' + output = self.run_script(argument) + self.assertEqual(output, techsupport_table_output) + + def test_single_field(self): + argument = '-t AUTO_TECHSUPPORT -f state' + output = self.run_script(argument) + self.assertEqual(output, techsupport_table_field_output) + + def test_leaf_list(self): + argument = '-t PORTCHANNEL -f members' + output = self.run_script(argument) + self.assertEqual(output, portchannel_table_field_output) + + def test_leaf_list_map(self): + argument = '-t DSCP_TO_TC_MAP' + output = self.run_script(argument) + self.maxDiff = None + self.assertEqual(output, dscp_to_tc_table_field_output) + + def test_when_condition(self): + argument = '-t ACL_RULE -f ICMP_TYPE' + output = self.run_script(argument) + self.assertEqual(output, acl_rule_table_field_output) From b9a76656621a277055e94388d9dd2406d16944f2 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Wed, 6 Jul 2022 06:50:05 +0800 Subject: [PATCH 501/817] [minigraph][dualtor] Support parsing `soc_ip` out of dpg (#11207) Why I did it To further support parse out soc_ipv4 and soc_ipv6 out of Dpg: LoopbackInterface HostIP Loopback0 10.10.10.2/32 10.10.10.2/32 LoopbackInterface HostIP1 Loopback0 fe80::0002/128 fe80::0002/128 LoopbackInterface SoCHostIP0 server2SOC 10.10.10.3/32 10.10.10.3/32 LoopbackInterface SoCHostIP1 server2SOC fe80::0003/128 fe80::0003/128 Signed-off-by: Longxiang Lyu lolv@microsoft.com How I did it For servers loopback definitions in Dpg, if they contain LoopbackIPInterface with tags AttachTo, which has value of format like SOC, the address will be regarded as a SoC IP, and sonic-cfggen now will treat the port connected to the server as active-active if the redundancy_type is either Libra or Mixed. How to verify it Pass the unittest. Signed-off-by: Longxiang Lyu --- src/sonic-config-engine/minigraph.py | 125 ++++++++++++------ .../tests/simple-sample-graph-case.xml | 91 ++++++++----- .../tests/test_minigraph_case.py | 9 +- 3 files changed, 143 insertions(+), 82 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2bcef2232aef..b79ffff039c6 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -185,6 +185,7 @@ def formulate_fine_grained_ecmp(version, dpg_ecmp_content, port_device_map, port fine_grained_content = {"FG_NHG_MEMBER": FG_NHG_MEMBER, "FG_NHG": FG_NHG, "NEIGH": NEIGH} return fine_grained_content + def parse_png(png, hname, dpg_ecmp_content = None): neighbors = {} devices = {} @@ -400,9 +401,9 @@ def parse_asic_png(png, asic_name, hostname): device_data['lo_addr_v6']= lo_prefix_v6 devices[name] = device_data - return (neighbors, devices, port_speeds) + def parse_loopback_intf(child): lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = {} @@ -412,6 +413,7 @@ def parse_loopback_intf(child): lo_intfs[(intfname, ipprefix)] = {} return lo_intfs + def parse_dpg(dpg, hname): aclintfs = None mgmtintfs = None @@ -455,7 +457,7 @@ def parse_dpg(dpg, hname): ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text intfs[(intfname, ipprefix)] = {} ip_intfs_map[ipprefix] = intfalias - lo_intfs = parse_loopback_intf(child) + lo_intfs = parse_loopback_intf(child) subintfs = child.find(str(QName(ns, "SubInterfaces"))) if subintfs is not None: @@ -757,7 +759,6 @@ def parse_dpg(dpg, hname): return None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None - def parse_host_loopback(dpg, hname): for child in dpg: hostname = child.find(str(QName(ns, "Hostname"))) @@ -766,6 +767,7 @@ def parse_host_loopback(dpg, hname): lo_intfs = parse_loopback_intf(child) return lo_intfs + def parse_cpg(cpg, hname, local_devices=[]): bgp_sessions = {} bgp_internal_sessions = {} @@ -891,6 +893,7 @@ def parse_meta(meta, hname): max_cores = None kube_data = {} macsec_profile = {} + redundancy_type = None device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower(): @@ -933,7 +936,9 @@ def parse_meta(meta, hname): kube_data["ip"] = value elif name == 'MacSecProfile': macsec_profile = parse_macsec_profile(value) - return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile + elif name == "RedundancyType": + redundancy_type = value + return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type def parse_system_defaults(meta): @@ -1313,6 +1318,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw static_routes = {} system_defaults = {} macsec_profile = {} + redundancy_type = None hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -1343,7 +1349,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1567,11 +1573,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if macsec_enabled and 'PrimaryKey' in macsec_profile: port['macsec'] = macsec_profile['PrimaryKey'] - # If connected to a smart cable, get the connection position - for port_name, port in ports.items(): - if port_name in mux_cable_ports: - port['mux_cable'] = "true" - # set port description if parsed from deviceinfo for port_name in port_descriptions: # ignore port not in port_config.ini @@ -1713,7 +1714,13 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw # Add src_ip and qos remapping config into TUNNEL table if tunnel_qos_remap is enabled results['TUNNEL'] = get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, system_defaults.get('tunnel_qos_remap', {}), mux_tunnel_name, peer_switch_ip) - results['MUX_CABLE'] = get_mux_cable_entries(mux_cable_ports, neighbors, devices) + active_active_ports = get_ports_in_active_active(root, devices, neighbors) + results['MUX_CABLE'] = get_mux_cable_entries(ports, mux_cable_ports, active_active_ports, neighbors, devices, redundancy_type) + + # If connected to a smart cable, get the connection position + for port_name, port in results['PORT'].items(): + if port_name in results['MUX_CABLE']: + port['mux_cable'] = "true" if static_routes: results['STATIC_ROUTE'] = static_routes @@ -1826,46 +1833,76 @@ def get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, tu return tunnels -def get_mux_cable_entries(mux_cable_ports, neighbors, devices): + +def get_ports_in_active_active(root, devices, neighbors): + """Parse out ports in active-active cable type.""" + servers = {hostname.lower(): device_data for hostname, device_data in devices.items() if device_data["type"] == "Server"} + ports_in_active_active = {} + dpg_section = root.find(str(QName(ns, "DpgDec"))) + neighbor_to_port_mapping = {neighbor["name"].lower(): port for port, neighbor in neighbors.items()} + if dpg_section is not None: + for child in dpg_section: + hostname = child.find(str(QName(ns, "Hostname"))) + if hostname is None: + continue + hostname = hostname.text.lower() + if hostname not in servers: + continue + lo_intfs = parse_loopback_intf(child) + soc_intfs = {} + for intfname, ipprefix in lo_intfs.keys(): + intfname_lower = intfname.lower() + if hostname + "soc" == intfname_lower: + ipprefix = str(ipaddress.ip_network(UNICODE_TYPE(ipprefix.split("/")[0]))) + if "." in ipprefix: + soc_intfs["soc_ipv4"] = ipprefix + elif ":" in ipprefix: + soc_intfs["soc_ipv6"] = ipprefix + if hostname in neighbor_to_port_mapping and soc_intfs: + ports_in_active_active[neighbor_to_port_mapping[hostname]] = soc_intfs + return ports_in_active_active + + +def get_mux_cable_entries(ports, mux_cable_ports, active_active_ports, neighbors, devices, redundancy_type): mux_cable_table = {} + if redundancy_type: + redundancy_type = redundancy_type.lower() + + for port in ports: + is_active_active = redundancy_type in ("libra", "mixed") and port in active_active_ports + is_active_standby = port in mux_cable_ports + if is_active_active and is_active_standby: + print("Warning: skip %s as it is defined as active-standby and actie-active" % port, file=sys.stderr) + continue + if not (is_active_active or is_active_standby): + continue - for intf, cable_name in mux_cable_ports.items(): - if intf in neighbors: - entry = {} - neighbor = neighbors[intf]['name'] - entry['state'] = 'auto' - - if devices[neighbor]['lo_addr'] is not None: - # Always force a /32 prefix for server IPv4 loopbacks - server_ipv4_lo_addr = devices[neighbor]['lo_addr'].split("/")[0] - server_ipv4_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv4_lo_addr)) - entry['server_ipv4'] = str(server_ipv4_lo_prefix) - - if 'lo_addr_v6' in devices[neighbor] and devices[neighbor]['lo_addr_v6'] is not None: - server_ipv6_lo_addr = devices[neighbor]['lo_addr_v6'].split('/')[0] - server_ipv6_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv6_lo_addr)) - entry['server_ipv6'] = str(server_ipv6_lo_prefix) - mux_cable_table[intf] = entry - else: - print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor), file=sys.stderr) + entry = {} + neighbor = neighbors[port]['name'] + entry['state'] = 'auto' - if cable_name in devices: - cable_type = devices[cable_name].get('subtype') - if cable_type is None: - continue - if cable_type in dualtor_cable_types: - mux_cable_table[intf]['cable_type'] = cable_type - if cable_type == 'active-active': - soc_ipv4 = devices[cable_name]['lo_addr'].split('/')[0] - soc_ipv4_prefix = ipaddress.ip_network(UNICODE_TYPE(soc_ipv4)) - mux_cable_table[intf]['soc_ipv4'] = str(soc_ipv4_prefix) - else: - print("Warning: skip parsing device %s for mux cable entry, cable type %s not supported" % (cable_name, cable_type), file=sys.stderr) + if devices[neighbor]['lo_addr'] is not None: + # Always force a /32 prefix for server IPv4 loopbacks + server_ipv4_lo_addr = devices[neighbor]['lo_addr'].split("/")[0] + server_ipv4_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv4_lo_addr)) + entry['server_ipv4'] = str(server_ipv4_lo_prefix) + + if 'lo_addr_v6' in devices[neighbor] and devices[neighbor]['lo_addr_v6'] is not None: + server_ipv6_lo_addr = devices[neighbor]['lo_addr_v6'].split('/')[0] + server_ipv6_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv6_lo_addr)) + entry['server_ipv6'] = str(server_ipv6_lo_prefix) + + if is_active_active: + entry['cable_type'] = 'active-active' + entry.update(active_active_ports[port]) + + mux_cable_table[port] = entry else: - print("Warning: skip parsing device %s for mux cable entry, device definition not found" % cable_name, file=sys.stderr) + print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor), file=sys.stderr) return mux_cable_table + def parse_device_desc_xml(filename): root = ET.parse(filename).getroot() (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, hostname, hwsku, d_type, _, _, _) = parse_device(root) diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case.xml b/src/sonic-config-engine/tests/simple-sample-graph-case.xml index 7bbef28aaa38..4165647a9aa3 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case.xml @@ -198,6 +198,62 @@ + + + + + LoopbackInterface + HostIP + Loopback0 + + 10.10.10.2/32 + + 10.10.10.2/32 + + + LoopbackInterface + HostIP1 + Loopback0 + + fe80::0002/128 + + fe80::0002/128 + + + LoopbackInterface + SoCHostIP0 + server2SOC + + 10.10.10.3/32 + + 10.10.10.3/32 + + + LoopbackInterface + SoCHostIP1 + server2SOC + + fe80::0003/128 + + fe80::0003/128 + + + + + + + + server2 + + + + + + + + + + @@ -262,17 +318,6 @@ L true - - LogicalLink - 10000 - false - switch-t0 - fortyGigE0/8 - true - server2-SC - U - true - LogicalLink 0 @@ -349,25 +394,6 @@ server1 server-sku - - SmartCable - active-active -
- 10.10.10.3/32 -
- - ::/0 - - - 0.0.0.0/0 - - - ::/0 - - - server2-SC - smartcable-sku -
Server
@@ -506,6 +532,11 @@ Storage + + RedundancyType + + Mixed + diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 16ad019032f2..bfee76c7546e 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -236,14 +236,6 @@ def test_minigraph_neighbor_metadata(self): 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'type': 'SmartCable' - }, - 'server2-SC': { - 'hwsku': 'smartcable-sku', - 'lo_addr': '10.10.10.3/32', - 'lo_addr_v6': '::/0', - 'mgmt_addr': '0.0.0.0/0', - 'type': 'SmartCable', - 'subtype': 'active-active' } } output = self.run_script(argument) @@ -421,6 +413,7 @@ def test_minigraph_mux_cable_table(self): 'server_ipv4': '10.10.10.2/32', 'server_ipv6': 'fe80::2/128', 'soc_ipv4': '10.10.10.3/32', + 'soc_ipv6': 'fe80::3/128', 'cable_type': 'active-active' } } From 25bc8c40548b3cde997977ac5586884e3a0ebe91 Mon Sep 17 00:00:00 2001 From: LuiSzee Date: Wed, 6 Jul 2022 09:05:03 +0800 Subject: [PATCH 502/817] [centec] fix some bugs on centec tsingma bsp and v682 sonic_platform package (#10685) #### Why I did it Fix some bugs on centec tsingma bsp and v682 sonic_platform package. #### How I did it 1. add module license for centec mars phy driver 2. Fix i2c function ability setting for tsingma soc i2c controller 3. Fix eeprom read error on v682 sonic_platform sfp module #### How to verify it Build SONiC image and verify it on centec E530-48T4X and V682-48Y8C board. --- platform/centec-arm64/tsingma-bsp/src/ctc-phy/mars.c | 3 +++ platform/centec-arm64/tsingma-bsp/src/i2c-ctc/i2c-ctc.c | 5 +++++ .../sonic-platform-modules-v682/48x8c/sonic_platform/sfp.py | 2 +- .../sonic-platform-modules-v682/48y8c/sonic_platform/sfp.py | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/platform/centec-arm64/tsingma-bsp/src/ctc-phy/mars.c b/platform/centec-arm64/tsingma-bsp/src/ctc-phy/mars.c index 675ba528fe68..7f1cdafe2254 100644 --- a/platform/centec-arm64/tsingma-bsp/src/ctc-phy/mars.c +++ b/platform/centec-arm64/tsingma-bsp/src/ctc-phy/mars.c @@ -314,3 +314,6 @@ static struct mdio_device_id __maybe_unused mars_tbl[] = { }; MODULE_DEVICE_TABLE(mdio, mars_tbl); + +MODULE_AUTHOR("Centec, Inc."); +MODULE_LICENSE("GPL"); diff --git a/platform/centec-arm64/tsingma-bsp/src/i2c-ctc/i2c-ctc.c b/platform/centec-arm64/tsingma-bsp/src/i2c-ctc/i2c-ctc.c index 0d6b97f2b378..d6b95aec3066 100755 --- a/platform/centec-arm64/tsingma-bsp/src/i2c-ctc/i2c-ctc.c +++ b/platform/centec-arm64/tsingma-bsp/src/i2c-ctc/i2c-ctc.c @@ -789,6 +789,11 @@ static int ctc_i2c_plat_probe(struct platform_device *pdev) of_property_read_u32(pdev->dev.of_node, "clock-frequency", &clk_freq); dev->clk_freq = clk_freq; + + dev->functionality = I2C_FUNC_10BIT_ADDR | CTC_IC_DEFAULT_FUNCTIONALITY; + dev->master_cfg = CTC_IC_CON_MASTER | CTC_IC_CON_SLAVE_DISABLE | + CTC_IC_CON_RESTART_EN; + if (dev->clk_freq <= 100000) dev->master_cfg |= CTC_IC_CON_SPEED_STD; else if (dev->clk_freq <= 400000) diff --git a/platform/centec/sonic-platform-modules-v682/48x8c/sonic_platform/sfp.py b/platform/centec/sonic-platform-modules-v682/48x8c/sonic_platform/sfp.py index 1d4154ff8384..c2e238a4e306 100644 --- a/platform/centec/sonic-platform-modules-v682/48x8c/sonic_platform/sfp.py +++ b/platform/centec/sonic-platform-modules-v682/48x8c/sonic_platform/sfp.py @@ -383,7 +383,7 @@ def get_presence(self): try: with open(self.port_to_eeprom_mapping[self.port_num], mode='rb', buffering=0) as fd: - fd.read() + fd.read(256) except IOError: return False diff --git a/platform/centec/sonic-platform-modules-v682/48y8c/sonic_platform/sfp.py b/platform/centec/sonic-platform-modules-v682/48y8c/sonic_platform/sfp.py index 3475753cd49d..952b64b521ba 100644 --- a/platform/centec/sonic-platform-modules-v682/48y8c/sonic_platform/sfp.py +++ b/platform/centec/sonic-platform-modules-v682/48y8c/sonic_platform/sfp.py @@ -383,7 +383,7 @@ def get_presence(self): try: with open(self.port_to_eeprom_mapping[self.port_num], mode='rb', buffering=0) as fd: - fd.read() + fd.read(256) except IOError: return False From 7b98cf35c3b03b5e9cdcfffe19489e121d85d55c Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 6 Jul 2022 03:57:52 +0200 Subject: [PATCH 503/817] [Arista] Update configurations for 7800R3A-36D2 (#10987) Why I did it This linecard runs in multi-asic mode and therefore needs the use_pcie_id_chassis file to work properly. The default_sku file was also missing which would break the boot when no minigraph is provided. Description for the changelog Add missing default_sku and use_pci_id_chassis configs for 7800R3A-36D2 --- device/arista/x86_64-arista_7800r3a_36d2_lc/default_sku | 1 + device/arista/x86_64-arista_7800r3a_36d2_lc/use_pci_id_chassis | 0 2 files changed, 1 insertion(+) create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/default_sku create mode 100644 device/arista/x86_64-arista_7800r3a_36d2_lc/use_pci_id_chassis diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/default_sku b/device/arista/x86_64-arista_7800r3a_36d2_lc/default_sku new file mode 100644 index 000000000000..2aa543267cef --- /dev/null +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/default_sku @@ -0,0 +1 @@ +Arista-7800R3A-36D2-C72 t1 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/use_pci_id_chassis b/device/arista/x86_64-arista_7800r3a_36d2_lc/use_pci_id_chassis new file mode 100644 index 000000000000..e69de29bb2d1 From 40cbd3fe878263a8d707c15369b3223969188602 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Wed, 6 Jul 2022 09:58:15 +0300 Subject: [PATCH 504/817] [Mellanox] Update SAI version 1.21.2.0 (#11326) - Why I did it Advance to new SAI version for bugs fixes as well as new features/enhacements: New: - ARM64 support - FG ECMP performance optimization - Support setting empty list for port ingress/egress buffer profile list - Add service port for SN5600 - Add CR8/SR8/LR8/KR8 interface type - Disable mlxtrace during debug dump Fixes: - Fix SAI_ACL_ENTRY_ATTR_FIELD_TC - Fix Packets loop back if no member in portchannel - Fix optimize descriptors apply time (and fast boot time) - Add flush fdb entries for vxlan tunnel bridge port - Don't disable used tunnel underlay interfaces - How I did it Advanced SAI submodule - How to verify it make configure PLATFORM=mellanox make target/sonic-mellanox.bin Signed-off-by: Nazarii Hnydyn --- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/mlnx-sai/SAI-Implementation | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 69279d0844d5..3202b9564051 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,6 +1,6 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIRel1.21.1.0 +MLNX_SAI_VERSION = SAIRel1.21.2.0 export MLNX_SAI_VERSION diff --git a/platform/mellanox/mlnx-sai/SAI-Implementation b/platform/mellanox/mlnx-sai/SAI-Implementation index d6eb22a12cc0..f9a21df71363 160000 --- a/platform/mellanox/mlnx-sai/SAI-Implementation +++ b/platform/mellanox/mlnx-sai/SAI-Implementation @@ -1 +1 @@ -Subproject commit d6eb22a12cc0f01e84a71d367f7c4ebe19f58a40 +Subproject commit f9a21df713636fe648b8bb190698e4494a0f5239 From 5873e8ef9c05faf59bdfc7e0552ed37f60c6af89 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Wed, 6 Jul 2022 16:59:19 +0800 Subject: [PATCH 505/817] Upgrade snappi version to 0.7.44 (#11335) Why I did it Keysight provide a new version with some snappi API source code related fix: snappi[ixnetwork,convergence]==0.7.44 How I did it Upgrade snappi version to 0.7.44 How to verify it Whether it's installed in sonic-mgmt docker container --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 99ad9fa8fb80..6435a2114ecb 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -43,7 +43,7 @@ RUN pip install cffi==1.10.0 \ ipython==5.4.1 \ ixnetwork-restpy==1.0.64 \ ixnetwork-open-traffic-generator==0.0.79 \ - snappi[ixnetwork,convergence]==0.5.11 \ + snappi[ixnetwork,convergence]==0.7.44 \ jinja2==2.7.2 \ jsonpatch \ lxml \ @@ -207,7 +207,7 @@ RUN python3 -m pip install setuptools-rust \ ipython==5.4.1 \ ixnetwork-restpy==1.0.64 \ ixnetwork-open-traffic-generator==0.0.79 \ - snappi[ixnetwork,convergence]==0.5.11 \ + snappi[ixnetwork,convergence]==0.7.44 \ jinja2==2.7.2 \ jsonpatch \ lxml \ From 6f82935d8a07714bb7a734fce4ef4d659dba8fe2 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Wed, 6 Jul 2022 12:49:01 +0300 Subject: [PATCH 506/817] [submodule] Advance sonic-swss-common pointer (#11301) 10cd834 [select] break the select loop if interrupt_on_signal flag is set (#624) d0cd8a0 Fix: missing sonic-db-cli in docker-sonic-vs image (#640) 567f0df Change diff coverage threshold to 80% (#630) Signed-off-by: Stepan Blyschak --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 34c4b059e545..10cd834d067f 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 34c4b059e545caff775d6be903206c7f39c5c112 +Subproject commit 10cd834d067fc2bd80ef04184e72f3ba0139398e From ef8675d7ab73e23b9d5b72f34785dcd745beb13a Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Wed, 6 Jul 2022 14:03:31 +0300 Subject: [PATCH 507/817] [sonic_debian_extension] install systemd-bootchart (#11047) - Why I did it Implemented sonic-net/SONiC#1001 - How I did it Install systemd-bootchart tool and provide default config for it. - How to verify it Run build and verify systemd-bootchart is installed. Signed-off-by: Stepan Blyschak --- Makefile.work | 8 ++++++++ .../build_templates/sonic_debian_extension.j2 | 12 ++++++++++++ rules/config | 6 ++++++ slave.mk | 19 ++++++++++++++++--- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Makefile.work b/Makefile.work index 0428c3cbc553..b9d930a5d93e 100644 --- a/Makefile.work +++ b/Makefile.work @@ -43,6 +43,12 @@ # * ENABLE_AUTO_TECH_SUPPORT: Enable the configuration for event-driven techsupport & coredump mgmt feature # * Default: y # * Values: y,n +# * INCLUDE_BOOTCHART: Install SONiC bootchart +# * Default: y +# * Values: y,n +# * ENABLE_BOOTCHART: Enable SONiC bootchart +# * Default: n +# * Values: y,n # ############################################################################### @@ -381,6 +387,8 @@ SONIC_BUILD_INSTRUCTION := make \ ENABLE_AUTO_TECH_SUPPORT=$(ENABLE_AUTO_TECH_SUPPORT) \ BUILD_MULTIASIC_KVM=$(BUILD_MULTIASIC_KVM) \ ENABLE_ASAN=$(ENABLE_ASAN) \ + SONIC_INCLUDE_BOOTCHART=$(INCLUDE_BOOTCHART) \ + SONIC_ENABLE_BOOTCHART=$(ENABLE_BOOTCHART) \ ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) \ ENABLE_FIPS=$(ENABLE_FIPS) \ SONIC_SLAVE_DOCKER_DRIVER=$(SONIC_SLAVE_DOCKER_DRIVER) \ diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index d3caf046ccf9..1839df4c73b1 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -427,6 +427,18 @@ sudo chmod og-rw $FILESYSTEM_ROOT_ETC_SONIC/core_analyzer.rc.json sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install libffi-dev libssl-dev +{% if include_bootchart == 'y' %} +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install systemd-bootchart +sudo tee $FILESYSTEM_ROOT_ETC/systemd/bootchart.conf > /dev/null < docker-swss-: # $(call docker-image-save,from,to) -# Sonic docker images are always created with username as extension. During the save operation, +# Sonic docker images are always created with username as extension. During the save operation, # it removes the username extension from docker image and saved them as compressed tar file for SONiC image generation. # The save operation is protected with lock for parallel build. # @@ -404,7 +415,7 @@ define docker-image-save endef # $(call docker-image-load,from) -# Sonic docker images are always created with username as extension. During the load operation, +# Sonic docker images are always created with username as extension. During the load operation, # it loads the docker image from compressed tar file and tag them with username as extension. # The load operation is protected with lock for parallel build. # @@ -1152,6 +1163,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(shell [[ ! -z '$($(component)_VERSION)' && ! -z '$($(component)_NAME)' ]] && \ echo $($(component)_NAME)==$($(component)_VERSION)))" export include_mux="$(INCLUDE_MUX)" + export include_bootchart="$(INCLUDE_BOOTCHART)" + export enable_bootchart="$(ENABLE_BOOTCHART)" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" export docker_image_name="$(basename $(docker))" From 7cd10019b8d1c02aca611437a6f5fb7b982ce5f1 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Wed, 6 Jul 2022 10:24:16 -0700 Subject: [PATCH 508/817] Add backend acl template (#11220) Why I did it Storage backend has all vlan members tagged. If untagged packets are received on those links, they are accounted as RX_DROPS which can lead to false alarms in monitoring tools. Using this acl to hide these drops. How I did it Created a acl template which will be loaded during minigraph load for backend. This template will allow tagged vlan packets and dropped untagged How to verify it Unit tests Signed-off-by: Neetha John --- files/build_templates/backend_acl.j2 | 51 ++++++++++++++ .../build_templates/sonic_debian_extension.j2 | 3 + .../data/backend_acl/acl_multi_vlan.json | 59 ++++++++++++++++ .../data/backend_acl/acl_single_vlan.json | 38 ++++++++++ .../tests/data/backend_acl/multi_vlan.json | 69 +++++++++++++++++++ .../tests/data/backend_acl/single_vlan.json | 66 ++++++++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 28 ++++++++ 7 files changed, 314 insertions(+) create mode 100644 files/build_templates/backend_acl.j2 create mode 100644 src/sonic-config-engine/tests/data/backend_acl/acl_multi_vlan.json create mode 100644 src/sonic-config-engine/tests/data/backend_acl/acl_single_vlan.json create mode 100644 src/sonic-config-engine/tests/data/backend_acl/multi_vlan.json create mode 100644 src/sonic-config-engine/tests/data/backend_acl/single_vlan.json diff --git a/files/build_templates/backend_acl.j2 b/files/build_templates/backend_acl.j2 new file mode 100644 index 000000000000..f5468e6c12cb --- /dev/null +++ b/files/build_templates/backend_acl.j2 @@ -0,0 +1,51 @@ +{%- set vlan2ports = {} %} +{%- for vlan in VLAN %} + {% set portlist = [] %} + {%- for vlan_name, port in VLAN_MEMBER %} + {%- if vlan_name == vlan %} + {%- if portlist.append(port) %}{%- endif %} + {%- endif %} + {%- endfor %} + {%- set _ = vlan2ports.update({vlan: portlist| sort | join(',')}) %} +{%- endfor %} + + +{ + "acl": { + "acl-sets": { + "acl-set": { + "DATAACL": { + "acl-entries": { + "acl-entry": { + {% for vlan, vlan_entries in VLAN.items() %} + "{{ loop.index }}": { + "config": { + "sequence-id": {{ loop.index }} + }, + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "l2": { + "config": { + "vlan_id": "{{ vlan_entries['vlanid'] }}" + } + }, + "input_interface": { + "interface_ref": { + "config": { + "interface": "{{ vlan2ports[vlan] }}" + } + } + } + + }{% if not loop.last %},{% endif %} + {% endfor -%} + } + } + } + } + } + } +} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 1839df4c73b1..db35658ed901 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -536,6 +536,9 @@ then fi {% endif %} +# Copy backend acl template +sudo cp $BUILD_TEMPLATES/backend_acl.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ + # Copy hostname configuration scripts sudo cp $IMAGE_CONFIGS/hostname/hostname-config.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM echo "hostname-config.service" | sudo tee -a $GENERATED_SERVICE_FILE diff --git a/src/sonic-config-engine/tests/data/backend_acl/acl_multi_vlan.json b/src/sonic-config-engine/tests/data/backend_acl/acl_multi_vlan.json new file mode 100644 index 000000000000..53cd50d0f2d1 --- /dev/null +++ b/src/sonic-config-engine/tests/data/backend_acl/acl_multi_vlan.json @@ -0,0 +1,59 @@ + +{ + "acl": { + "acl-sets": { + "acl-set": { + "DATAACL": { + "acl-entries": { + "acl-entry": { + "1": { + "config": { + "sequence-id": 1 + }, + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "l2": { + "config": { + "vlan_id": "1000" + } + }, + "input_interface": { + "interface_ref": { + "config": { + "interface": "Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76" + } + } + } + + }, "2": { + "config": { + "sequence-id": 2 + }, + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "l2": { + "config": { + "vlan_id": "2000" + } + }, + "input_interface": { + "interface_ref": { + "config": { + "interface": "Ethernet4,Ethernet8" + } + } + } + + } } + } + } + } + } + } +} diff --git a/src/sonic-config-engine/tests/data/backend_acl/acl_single_vlan.json b/src/sonic-config-engine/tests/data/backend_acl/acl_single_vlan.json new file mode 100644 index 000000000000..86dcc80d08d1 --- /dev/null +++ b/src/sonic-config-engine/tests/data/backend_acl/acl_single_vlan.json @@ -0,0 +1,38 @@ + +{ + "acl": { + "acl-sets": { + "acl-set": { + "DATAACL": { + "acl-entries": { + "acl-entry": { + "1": { + "config": { + "sequence-id": 1 + }, + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "l2": { + "config": { + "vlan_id": "1000" + } + }, + "input_interface": { + "interface_ref": { + "config": { + "interface": "Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet4,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet8" + } + } + } + + } + } + } + } + } + } + } +} diff --git a/src/sonic-config-engine/tests/data/backend_acl/multi_vlan.json b/src/sonic-config-engine/tests/data/backend_acl/multi_vlan.json new file mode 100644 index 000000000000..13acff414a1f --- /dev/null +++ b/src/sonic-config-engine/tests/data/backend_acl/multi_vlan.json @@ -0,0 +1,69 @@ +{ + "VLAN": { + "Vlan1000": { + "vlanid": "1000" + }, + "Vlan2000": { + "vlanid": "2000" + } + }, + "VLAN_MEMBER": { + "Vlan1000|Ethernet12": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet16": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet20": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet24": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet28": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet32": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet36": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet40": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet44": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet48": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet52": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet56": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet60": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet68": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet72": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet76": { + "tagging_mode": "tagged" + }, + "Vlan2000|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan2000|Ethernet8": { + "tagging_mode": "tagged" + } + } +} diff --git a/src/sonic-config-engine/tests/data/backend_acl/single_vlan.json b/src/sonic-config-engine/tests/data/backend_acl/single_vlan.json new file mode 100644 index 000000000000..1023e990a72f --- /dev/null +++ b/src/sonic-config-engine/tests/data/backend_acl/single_vlan.json @@ -0,0 +1,66 @@ +{ + "VLAN": { + "Vlan1000": { + "vlanid": "1000" + } + }, + "VLAN_MEMBER": { + "Vlan1000|Ethernet4": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet8": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet12": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet16": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet20": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet24": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet28": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet32": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet36": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet40": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet44": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet48": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet52": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet56": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet60": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet64": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet68": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet72": { + "tagging_mode": "tagged" + }, + "Vlan1000|Ethernet76": { + "tagging_mode": "tagged" + } + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index b93d26ef368f..247615ca6973 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -606,6 +606,34 @@ def test_ntp_conf(self): self.run_script(argument) assert utils.cmp(expected, self.output_file), self.run_diff(expected, self.output_file) + def test_backend_acl_template_render(self): + acl_template = os.path.join( + self.test_dir, '..', '..', '..', 'files', 'build_templates', + 'backend_acl.j2' + ) + test_list = { + 'single_vlan': { + 'input': 'single_vlan.json', + 'output': 'acl_single_vlan.json' + }, + 'multi_vlan': { + 'input': 'multi_vlan.json', + 'output': 'acl_multi_vlan.json' + }, + } + for _, v in test_list.items(): + input_file = os.path.join( + self.test_dir, 'data', 'backend_acl', v['input'] + ) + argument = " -j {} -t {} > {}".format( + input_file, acl_template, self.output_file + ) + sample_output_file = os.path.join( + self.test_dir, 'data', 'backend_acl', v['output'] + ) + self.run_script(argument) + assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) + def tearDown(self): os.environ["CFGGEN_UNIT_TESTING"] = "" try: From 94f9f9c573cafee4b8955eafea4cdaae571104cd Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Wed, 6 Jul 2022 10:26:17 -0700 Subject: [PATCH 509/817] [sonic-utilities]: Advance submodule (#11344) Update sonic-utilities submodule to include below commits: 7070794 Fix DBConfig not initialize issue in pfcwd (#2238) b5d6659 [config/load_mgmt_config] Support load IPv6 mgmt IP (#2206) 3274b0e Added bf_drivers.log to zipped dump after execution of "show techsupport" (#2164) 8dee36c [portstat] Update portstat to use CounterTable API (#2207) 7d9faf3 Added support for Sonic cross-compilation build. (#2233) c3620fc [GCU] Moving UniqueLanes from only validating moves, to be a supplemental YANG validator (#2234) Signed-off-by: Suvarna Meenakshi --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index f64d2807381b..7070794d1378 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit f64d2807381bc4faf0b8d66c73b3a14b277d0408 +Subproject commit 7070794d1378802a8d452f8f2c4b1c66335f18cc From 05ab00459346bb0f3489398ac38ca7fa41bbdce1 Mon Sep 17 00:00:00 2001 From: Neetha John Date: Wed, 6 Jul 2022 10:27:05 -0700 Subject: [PATCH 510/817] Minigraph parser changes for storage backend acl (#11221) Signed-off-by: Neetha John nejo@microsoft.com Why I did it For storage backend, certain rules will be applied to the DATAACL table to allow only vlan tagged packets and drop untagged packets. How I did it Create DATAACL table if the device is a storage backend device To avoid ACL resource issues, remove EVERFLOW related tables if the device is a storage backend device How to verify it Added the following unit tests - verify that EVERFLOW acl tables is removed and DATAACL table is added for storage backend tor - verify that no DATAACL tables are created and EVERFLOW tables exist for storage backend leaf --- src/sonic-config-engine/minigraph.py | 23 +- .../tests/sample-graph-storage-backend.xml | 781 ++++++++++++++++++ .../tests/sample-graph-subintf.xml | 44 - src/sonic-config-engine/tests/test_cfggen.py | 41 +- 4 files changed, 838 insertions(+), 51 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample-graph-storage-backend.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index b79ffff039c6..bee0d89af989 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1172,7 +1172,26 @@ def parse_spine_chassis_fe(results, vni, lo_intfs, phyport_intfs, pc_intfs, pc_m # ############################################################################### -def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role): +def filter_acl_table_for_backend(acls, vlan_members): + filter_acls = {} + for acl_name, value in acls.items(): + if 'everflow' not in acl_name.lower(): + filter_acls[acl_name] = value + + ports = set() + for vlan, member in vlan_members: + ports.add(member) + filter_acls['DATAACL'] = { 'policy_desc': 'DATAACL', + 'stage': 'ingress', + 'type': 'L3', + 'ports': list(ports) + } + return filter_acls + +def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role, device_type, is_storage_device, vlan_members): + if device_type == 'BackEndToRRouter' and is_storage_device: + return filter_acl_table_for_backend(acls, vlan_members) + filter_acls = {} # If the asic role is BackEnd no ACL Table (Ctrl/Data/Everflow) is binded. @@ -1741,7 +1760,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['DHCP_RELAY'] = dhcp_relay_table results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers) - results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role) + results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role, current_device['type'], is_storage_device, vlan_members) results['FEATURE'] = { 'telemetry': { 'state': 'enabled' diff --git a/src/sonic-config-engine/tests/sample-graph-storage-backend.xml b/src/sonic-config-engine/tests/sample-graph-storage-backend.xml new file mode 100644 index 000000000000..837400b2d5e4 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-graph-storage-backend.xml @@ -0,0 +1,781 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.2.0.20 + CHASSIS_PEER + 10.2.0.21 + 1 + 180 + 60 + voq + + + + + 1 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
+ + 65100 + switch-t0 + + +
10.0.0.59
+ + + +
+ +
10.2.0.21
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + + + 65100 + CHASSIS_PEER + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel1 + fortyGigE0/4 + + + + + + ab1 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1000 + 1000 + 192.168.0.0/27 + + + ab4 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1001 + 1001 + 192.168.0.32/27 + + + kk1 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2020 + 2020 + Tagged + 192.168.0.0/28 + + + ab2 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2000 + 2000 + Tagged + 192.168.0.240/27 + + + ab3 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2001 + 2001 + 192.168.0.240/27 + + + + + + PortChannel1 + 10.0.0.56/31 + + + + PortChannel1 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + ab1 + 192.168.0.1/27 + + + + + + DataAcl + + ERSPAN + everflow + Everflow + 0 + everflow.xml + + + DataAcl + + ERSPANv6 + everflowV6 + Everflow + 0 + everflow.xml + + + DataAcl + + Loopback0 + ipv6-mgmt-only + Management + 0 + + + + DataAcl + + Loopback0 + mgmt-only + Management + 0 + + + + DataAcl + + StaticERSPAN + everflowStatic + Everflow + 0 + everflow.xml + + + + + + + + + + DeviceInterfaceLink + 1000 + ARISTA01T1 + et1 + true + switch-t0 + fortyGigE0/8 + true + + + DeviceMgmtLink + 1000 + switch-t0 + fortyGigE0/16 + true + ChassisMTS1 + mgmt0 + true + + + + + switch-t0 + Arista-7050-QX-32S + AAA00PrdStr00 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet1 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet2 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + true + 0 + Arista-7050-QX-32S + + + DeviceInterface + + 1 + Management1 + false + mgmt1 + 1000 + + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + ResourceType + + Storage + + + + + + + switch-t0 + Arista-7050-QX-32S +
diff --git a/src/sonic-config-engine/tests/sample-graph-subintf.xml b/src/sonic-config-engine/tests/sample-graph-subintf.xml index 7fa35c44cbe4..6dab0ecd4e14 100644 --- a/src/sonic-config-engine/tests/sample-graph-subintf.xml +++ b/src/sonic-config-engine/tests/sample-graph-subintf.xml @@ -11,25 +11,6 @@ 10 3 - - false - switch-t0 - 10.0.0.56 - ARISTA01T1 - 10.0.0.57 - 1 - 180 - 60 - - - switch-t0 - FC00::71 - ARISTA01T1 - FC00::72 - 1 - 180 - 60 - false switch-t0 @@ -90,12 +71,6 @@ 65100 switch-t0 - -
10.0.0.57
- - - -
10.0.0.59
@@ -253,16 +228,6 @@ PortChannel1 FC00::71/126 - - - PortChannel1001 - 10.0.0.57/31 - - - - PortChannel1001 - FC00::72/126 - ab1 @@ -308,15 +273,6 @@ mgmt0 true - - DeviceMgmtLink - 1000 - switch-t0 - Management1 - switch-m0 - Management1 - true - diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 0c3519068e90..232fded47eb5 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -39,6 +39,7 @@ def setUp(self): self.packet_chassis_graph = os.path.join(self.test_dir, 'sample-chassis-packet-lc-graph.xml') self.packet_chassis_port_ini = os.path.join(self.test_dir, 'sample-chassis-packet-lc-port-config.ini') self.macsec_profile = os.path.join(self.test_dir, 'macsec_profile.json') + self.sample_backend_graph = os.path.join(self.test_dir, 'sample-graph-storage-backend.xml') # To ensure that mock config_db data is used for unit-test cases os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -710,14 +711,11 @@ def test_minigraph_bgp_voq_chassis_peer(self): output = self.run_script(argument) self.assertEqual(output.strip(), "") - def test_minigraph_sub_port_interfaces(self, check_stderr=True): - self.verify_sub_intf(check_stderr=check_stderr) - def test_minigraph_sub_port_intf_resource_type_non_backend_tor(self, check_stderr=True): self.verify_sub_intf_non_backend_tor(graph_file=self.sample_resource_graph, check_stderr=check_stderr) - def test_minigraph_sub_port_intf_resource_type(self, check_stderr=True): - self.verify_sub_intf(graph_file=self.sample_resource_graph, check_stderr=check_stderr) + def test_minigraph_sub_port_intf_hwsku(self, check_stderr=True): + self.verify_sub_intf(graph_file=self.sample_backend_graph, check_stderr=check_stderr) def test_minigraph_sub_port_intf_sub(self, check_stderr=True): self.verify_sub_intf(graph_file=self.sample_subintf_graph, check_stderr=check_stderr) @@ -725,6 +723,32 @@ def test_minigraph_sub_port_intf_sub(self, check_stderr=True): def test_minigraph_no_vlan_member(self, check_stderr=True): self.verify_no_vlan_member() + def test_minigraph_backend_acl_leaf(self, check_stderr=True): + try: + print('\n Change device type to %s' % (BACKEND_LEAF_ROUTER)) + if check_stderr: + output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (TOR_ROUTER, BACKEND_LEAF_ROUTER, self.sample_backend_graph), stderr=subprocess.STDOUT, shell=True) + else: + output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (TOR_ROUTER, BACKEND_LEAF_ROUTER, self.sample_backend_graph), shell=True) + + self.test_jinja_expression(self.sample_backend_graph, self.port_config, BACKEND_LEAF_ROUTER) + + # ACL_TABLE should contain EVERFLOW related entries + argument = '-m "' + self.sample_backend_graph + '" -p "' + self.port_config + '" -v "ACL_TABLE"' + output = self.run_script(argument) + sample_output = utils.to_dict(output.strip()).keys() + assert 'DATAACL' not in sample_output, sample_output + assert 'EVERFLOW' in sample_output, sample_output + + finally: + print('\n Change device type back to %s' % (TOR_ROUTER)) + if check_stderr: + output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (BACKEND_LEAF_ROUTER, TOR_ROUTER, self.sample_backend_graph), stderr=subprocess.STDOUT, shell=True) + else: + output = subprocess.check_output("sed -i \'s/%s/%s/g\' %s" % (BACKEND_LEAF_ROUTER, TOR_ROUTER, self.sample_backend_graph), shell=True) + + self.test_jinja_expression(self.sample_backend_graph, self.port_config, TOR_ROUTER) + def test_minigraph_sub_port_no_vlan_member(self, check_stderr=True): try: print('\n Change device type to %s' % (BACKEND_LEAF_ROUTER)) @@ -780,6 +804,13 @@ def verify_sub_intf(self, **kwargs): output = self.run_script(argument) self.assertEqual(output.strip(), "") + # ACL_TABLE should not contain EVERFLOW related entries + argument = '-m "' + graph_file + '" -p "' + self.port_config + '" -v "ACL_TABLE"' + output = self.run_script(argument) + sample_output = utils.to_dict(output.strip()).keys() + assert 'DATAACL' in sample_output, sample_output + assert 'EVERFLOW' not in sample_output, sample_output + # All the other tables stay unchanged self.test_minigraph_vlans(graph_file=graph_file) self.test_minigraph_vlan_interfaces(graph_file=graph_file) From 46fc6b5f14b31ee828b92a74b66bf53671ae8861 Mon Sep 17 00:00:00 2001 From: byu343 Date: Wed, 6 Jul 2022 14:40:13 -0700 Subject: [PATCH 511/817] [Arista][phy-credo]: update deb for speed change and bug fix (#10990) Add support for reacting to speed change between 40G and 100G in CONFIG_DB Fix a bug on optical bit setting. Avoid the random error in shutdown for issue: aristanetworks/sonic#40 Avoid to run on SmartsvilleBkMs, which depends on a different driver (credo-sai). How I did it How to verify it Verified on the duts that the commands printed in the log are matching the expectation and the interfaces are up. --- rules/phy-credo.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/phy-credo.mk b/rules/phy-credo.mk index 0218fdf6f691..197888e518bf 100644 --- a/rules/phy-credo.mk +++ b/rules/phy-credo.mk @@ -1,3 +1,3 @@ PHY_CREDO = phy-credo_1.0_amd64.deb -$(PHY_CREDO)_URL = "https://github.com/aristanetworks/sonic-firmware/raw/d227160f981f27df020ab50b9e0f16b1bd9166ea/phy/phy-credo_1.0_amd64.deb" +$(PHY_CREDO)_URL = "https://github.com/aristanetworks/sonic-firmware/raw/e89a1696954fd381e1e95edf208cffc97caf15d4/phy/phy-credo_1.0_amd64.deb" SONIC_ONLINE_DEBS += $(PHY_CREDO) From a4b9838231b50018193d7ac2927067f0a03b8582 Mon Sep 17 00:00:00 2001 From: kenneth-arista <93353051+kenneth-arista@users.noreply.github.com> Date: Wed, 6 Jul 2022 14:42:45 -0700 Subject: [PATCH 512/817] [Arista] Enable larger number of LAGs on 7800 LCs (#11070) For 7800 LCs, set LAG mode to support 1024 number of 16-member system LAGs. Why I did it The SOC property changes are necessary to match #10519 which increases the number of system LAG IDs to 1024. Description for the changelog For 7800 LCs, set LAG mode to support 1024 number of 16-member system LAGs. --- .../jr2-a7280cr3-32d4-40x100G.config.bcm | 2 +- .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 3 +++ .../1/j2p-a7800r3a-36d-36x400G.config.bcm | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm index f995ec79c769..f20ea81049fb 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm @@ -7,7 +7,7 @@ system_headers_mode=1 suppress_unknown_prop_warnings=1 l4_protocols_load_balancing_enable=1 fabric_logical_port_base=512 -trunk_group_max_members=128 +trunk_group_max_members=16 num_olp_tm_ports.BCM8869X=1 # nif diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm index 652815971716..e32603e1da0c 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -22,6 +22,9 @@ pmf_sexem3_stage=IPMF2 # Jericho2-mode (description 0x1 used for Jericho 2 mode) system_headers_mode=1 +# HW mode to support 1024 16-member system wide LAGs +trunk_group_max_members=16 + # Disable link-training port_init_cl72=0 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm index fe67582df2f5..c2a1d4229f24 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C72/1/j2p-a7800r3a-36d-36x400G.config.bcm @@ -21,6 +21,9 @@ pmf_sexem3_stage=IPMF2 # Jericho2-mode (description 0x1 used for Jericho 2 mode) system_headers_mode=1 +# HW mode to support 1024 16-member system wide LAGs +trunk_group_max_members=16 + # Disable link-training port_init_cl72=0 From e8254bbd360570cec1a8e197d40df49b00365cad Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 7 Jul 2022 09:43:48 +0800 Subject: [PATCH 513/817] Porting util.py and port_util.py from py-swsssdk to sonic-py-common (#11347) #### Why I did it To deprecate sonic-py-swsssdk, need move some code to sonic-py-common. #### How I did it Porting util.py and port_util.py from sonic-py-swsssdk to sonic-py-common. #### How to verify it Pass UT. Pass all E2E test. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Porting util.py and port_util.py from sonic-py-swsssdk to sonic-py-common. Co-authored-by: liuh-80 --- .../sonic_py_common/port_util.py | 196 ++++++++++++++++++ src/sonic-py-common/sonic_py_common/util.py | 67 ++++++ src/sonic-py-common/tests/test_port_util.py | 19 ++ 3 files changed, 282 insertions(+) create mode 100644 src/sonic-py-common/sonic_py_common/port_util.py create mode 100755 src/sonic-py-common/sonic_py_common/util.py create mode 100644 src/sonic-py-common/tests/test_port_util.py diff --git a/src/sonic-py-common/sonic_py_common/port_util.py b/src/sonic-py-common/sonic_py_common/port_util.py new file mode 100644 index 000000000000..cb79be2742c4 --- /dev/null +++ b/src/sonic-py-common/sonic_py_common/port_util.py @@ -0,0 +1,196 @@ +""" +Bridge/Port mapping utility library. +""" +from swsscommon import swsscommon +import re + + +SONIC_ETHERNET_RE_PATTERN = "^Ethernet(\d+)$" +""" +Ethernet-BP refers to BackPlane interfaces +in multi-asic platform. +""" +SONIC_ETHERNET_BP_RE_PATTERN = "^Ethernet-BP(\d+)$" +SONIC_VLAN_RE_PATTERN = "^Vlan(\d+)$" +SONIC_PORTCHANNEL_RE_PATTERN = "^PortChannel(\d+)$" +SONIC_MGMT_PORT_RE_PATTERN = "^eth(\d+)$" +SONIC_ETHERNET_IB_RE_PATTERN = "^Ethernet-IB(\d+)$" +SONIC_ETHERNET_REC_RE_PATTERN = "^Ethernet-Rec(\d+)$" + +class BaseIdx: + ethernet_base_idx = 1 + vlan_interface_base_idx = 2000 + ethernet_bp_base_idx = 9000 + portchannel_base_idx = 1000 + mgmt_port_base_idx = 10000 + ethernet_ib_base_idx = 11000 + ethernet_rec_base_idx = 12000 + +def get_index(if_name): + """ + OIDs are 1-based, interfaces are 0-based, return the 1-based index + Ethernet N = N + 1 + Vlan N = N + 2000 + Ethernet_BP N = N + 9000 + PortChannel N = N + 1000 + eth N = N + 10000 + Ethernet_IB N = N + 11000 + Ethernet_Rec N = N + 12000 + """ + return get_index_from_str(if_name.decode()) + + +def get_index_from_str(if_name): + """ + OIDs are 1-based, interfaces are 0-based, return the 1-based index + Ethernet N = N + 1 + Vlan N = N + 2000 + Ethernet_BP N = N + 9000 + PortChannel N = N + 1000 + eth N = N + 10000 + Ethernet_IB N = N + 11000 + Ethernet_Rec N = N + 12000 + """ + patterns = { + SONIC_ETHERNET_RE_PATTERN: BaseIdx.ethernet_base_idx, + SONIC_ETHERNET_BP_RE_PATTERN: BaseIdx.ethernet_bp_base_idx, + SONIC_VLAN_RE_PATTERN: BaseIdx.vlan_interface_base_idx, + SONIC_PORTCHANNEL_RE_PATTERN: BaseIdx.portchannel_base_idx, + SONIC_MGMT_PORT_RE_PATTERN: BaseIdx.mgmt_port_base_idx, + SONIC_ETHERNET_IB_RE_PATTERN: BaseIdx.ethernet_ib_base_idx, + SONIC_ETHERNET_REC_RE_PATTERN: BaseIdx.ethernet_rec_base_idx + } + + for pattern, baseidx in patterns.items(): + match = re.match(pattern, if_name) + if match: + return int(match.group(1)) + baseidx + +def get_interface_oid_map(db, blocking=True): + """ + Get the Interface names from Counters DB + """ + db.connect('COUNTERS_DB') + if_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_PORT_NAME_MAP', blocking=blocking) + if_lag_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_LAG_NAME_MAP', blocking=blocking) + if_name_map.update(if_lag_name_map) + + if not if_name_map: + return {}, {} + + oid_pfx = len("oid:0x") + if_name_map = {if_name: sai_oid[oid_pfx:] for if_name, sai_oid in if_name_map.items()} + + # TODO: remove the first branch after all SonicV2Connector are migrated to decode_responses + if isinstance(db, swsscommon.SonicV2Connector) == False and db.dbintf.redis_kwargs.get('decode_responses', False) == False: + get_index_func = get_index + else: + get_index_func = get_index_from_str + + if_id_map = {sai_oid: if_name for if_name, sai_oid in if_name_map.items() + # only map the interface if it's a style understood to be a SONiC interface. + if get_index_func(if_name) is not None} + + return if_name_map, if_id_map + +def get_bridge_port_map(db): + """ + Get the Bridge port mapping from ASIC DB + """ + db.connect('ASIC_DB') + br_port_str = db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:*") + if not br_port_str: + return {} + + if_br_oid_map = {} + offset = len("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:") + oid_pfx = len("oid:0x") + for br_s in br_port_str: + # Example output: ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000616 + br_port_id = br_s[(offset + oid_pfx):] + ent = db.get_all('ASIC_DB', br_s, blocking=True) + # TODO: remove the first branch after all SonicV2Connector are migrated to decode_responses + if isinstance(db, swsscommon.SonicV2Connector) == False and db.dbintf.redis_kwargs.get('decode_responses', False) == False: + if b"SAI_BRIDGE_PORT_ATTR_PORT_ID" in ent: + port_id = ent[b"SAI_BRIDGE_PORT_ATTR_PORT_ID"][oid_pfx:] + if_br_oid_map[br_port_id] = port_id + else: + if "SAI_BRIDGE_PORT_ATTR_PORT_ID" in ent: + port_id = ent["SAI_BRIDGE_PORT_ATTR_PORT_ID"][oid_pfx:] + if_br_oid_map[br_port_id] = port_id + + return if_br_oid_map + +def get_vlan_id_from_bvid(db, bvid): + """ + Get the Vlan Id from Bridge Vlan Object + """ + db.connect('ASIC_DB') + vlan_obj = db.keys('ASIC_DB', str("ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid)) + vlan_entry = db.get_all('ASIC_DB', vlan_obj[0], blocking=True) + vlan_id = None + # TODO: remove the first branch after all SonicV2Connector are migrated to decode_responses + if isinstance(db, swsscommon.SonicV2Connector) == False and db.dbintf.redis_kwargs.get('decode_responses', False) == False: + if b"SAI_VLAN_ATTR_VLAN_ID" in vlan_entry: + vlan_id = vlan_entry[b"SAI_VLAN_ATTR_VLAN_ID"] + else: + if "SAI_VLAN_ATTR_VLAN_ID" in vlan_entry: + vlan_id = vlan_entry["SAI_VLAN_ATTR_VLAN_ID"] + + return vlan_id + +def get_rif_port_map(db): + """ + Get the RIF port mapping from ASIC DB + """ + db.connect('ASIC_DB') + rif_keys_str = db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:*") + if not rif_keys_str: + return {} + + rif_port_oid_map = {} + for rif_s in rif_keys_str: + rif_id = rif_s[len("ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x"):] + ent = db.get_all('ASIC_DB', rif_s, blocking=True) + # TODO: remove the first branch after all SonicV2Connector are migrated to decode_responses + if isinstance(db, swsscommon.SonicV2Connector) == False and db.dbintf.redis_kwargs.get('decode_responses', False) == False: + if b"SAI_ROUTER_INTERFACE_ATTR_PORT_ID" in ent: + port_id = ent[b"SAI_ROUTER_INTERFACE_ATTR_PORT_ID"].lstrip(b"oid:0x") + rif_port_oid_map[rif_id] = port_id + else: + if "SAI_ROUTER_INTERFACE_ATTR_PORT_ID" in ent: + port_id = ent["SAI_ROUTER_INTERFACE_ATTR_PORT_ID"].lstrip("oid:0x") + rif_port_oid_map[rif_id] = port_id + + return rif_port_oid_map + +def get_vlan_interface_oid_map(db, blocking=True): + """ + Get Vlan Interface names and sai oids + """ + db.connect('COUNTERS_DB') + + rif_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_NAME_MAP', blocking=blocking) + rif_type_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_TYPE_MAP', blocking=blocking) + + if not rif_name_map or not rif_type_name_map: + return {} + + oid_pfx = len("oid:0x") + vlan_if_name_map = {} + + # TODO: remove the first branch after all SonicV2Connector are migrated to decode_responses + if isinstance(db, swsscommon.SonicV2Connector) == False and db.dbintf.redis_kwargs.get('decode_responses', False) == False: + get_index_func = get_index + else: + get_index_func = get_index_from_str + + for if_name, sai_oid in rif_name_map.items(): + # Check if RIF is l3 vlan interface + # TODO: remove the first candidate after all SonicV2Connector are migrated to decode_responses + if rif_type_name_map[sai_oid] in (b'SAI_ROUTER_INTERFACE_TYPE_VLAN', 'SAI_ROUTER_INTERFACE_TYPE_VLAN'): + # Check if interface name is in style understood to be a SONiC interface + if get_index_func(if_name): + vlan_if_name_map[sai_oid[oid_pfx:]] = if_name + + return vlan_if_name_map diff --git a/src/sonic-py-common/sonic_py_common/util.py b/src/sonic-py-common/sonic_py_common/util.py new file mode 100755 index 000000000000..a63c98a38ff8 --- /dev/null +++ b/src/sonic-py-common/sonic_py_common/util.py @@ -0,0 +1,67 @@ +""" +Syslog and daemon script utility library. +""" + +from __future__ import print_function +import json +import logging +import logging.config +import sys +from getopt import getopt + + +# TODO: move to dbsync project. +def usage(script_name): + print('Usage: python ', script_name, + '-t [host] -p [port] -s [unix_socket_path] -d [logging_level] -f [update_frequency] -h [help]') + + +# TODO: move to dbsync project. +def process_options(script_name): + """ + Process command line options + """ + options, remainders = getopt(sys.argv[1:], "t:p:s:d:f:h", ["host=", "port=", "unix_socket_path=", "debug=", "frequency=", "help"]) + + args = {} + for (opt, arg) in options: + try: + if opt in ('-d', '--debug'): + args['log_level'] = int(arg) + elif opt in ('-t', '--host'): + args['host'] = arg + elif opt in ('-p', '--port'): + args['port'] = int(arg) + elif opt in ('-s', 'unix_socket_path'): + args['unix_socket_path'] = arg + elif opt in ('-f', '--frequency'): + args['update_frequency'] = int(arg) + elif opt in ('-h', '--help'): + usage(script_name) + except ValueError as e: + print('Invalid option for {}: {}'.format(opt, e)) + sys.exit(1) + + return args + + +# TODO: move +def setup_logging(config_file_path, log_level=logging.INFO): + """ + Logging configuration helper. + + :param config_file_path: file path to logging configuration file. + https://docs.python.org/3/library/logging.config.html#object-connections + :param log_level: defaults to logging.INFO + :return: None - access the logger by name as described in the config--or the "root" logger as a backup. + """ + try: + with open(config_file_path, 'rt') as f: + config = json.load(f) + logging.config.dictConfig(config) + except (ValueError, IOError, OSError): + # json.JSONDecodeError is throwable in Python3.5+ -- subclass of ValueError + logging.basicConfig(log_level=log_level) + logging.root.exception( + "Could not load specified logging configuration '{}'. Verify the filepath exists and is compliant with: " + "[https://docs.python.org/3/library/logging.config.html#object-connections]".format(config_file_path)) diff --git a/src/sonic-py-common/tests/test_port_util.py b/src/sonic-py-common/tests/test_port_util.py new file mode 100644 index 000000000000..2281f43d9a82 --- /dev/null +++ b/src/sonic-py-common/tests/test_port_util.py @@ -0,0 +1,19 @@ +import os +import sys + +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +class TestPortUtil: + def test_get_vlan_interface_oid_map(self): + db = mock.MagicMock() + db.get_all = mock.MagicMock() + db.get_all.return_value = {} + + from swsssdk.port_util import get_vlan_interface_oid_map + assert not get_vlan_interface_oid_map(db, True) From deb3e878d7b64196ba4accfcf0ecd032ec2c351b Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 7 Jul 2022 12:37:57 +0800 Subject: [PATCH 514/817] [Build] Fix the missing debian package for reproducible build issue (#11333) Why I did it Fix the missing debian package for reproducible build issue. The gnupg2 should be added into the version file. https://dev.azure.com/mssonic/build/_build/results?buildId=118139&view=logs&j=88ce9a53-729c-5fa9-7b6e-3d98f2488e3f&t=8d99be27-49d0-54d0-99b1-cfc0d47f0318 The following packages have unmet dependencies: gnupg2 : Depends: gnupg (>= 2.2.27-2+deb11u2) but 2.2.27-2+deb11u1 is to be installed E: Unable to correct problems, you have held broken packages. The issue was caused by the gnupg2 removed, and not detected. sonic-buildimage/build_debian.sh Line 250 in 4fb6cf0 sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove software-properties-common gnupg2 python3-gi How I did it Export the debian packages when any debian package being removed. --- src/sonic-build-hooks/hooks/apt-get | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-build-hooks/hooks/apt-get b/src/sonic-build-hooks/hooks/apt-get index bdff703d01d7..068293a3e352 100755 --- a/src/sonic-build-hooks/hooks/apt-get +++ b/src/sonic-build-hooks/hooks/apt-get @@ -20,7 +20,7 @@ if [ "$INSTALL" == y ]; then [ "$lock_result" == y ] && release_apt_installation_lock exit $command_result else - if [[ "$1" == "purge" || "$@" == *" purge "* ]]; then + if [[ "$1" == "purge" || "$@" == *" purge "* || "$@" == *" remove "* ]]; then # When running the purge command, collect the debian versions dpkg-query -W -f '${Package}==${Version}\n' >> $POST_VERSION_PATH/purge-versions-deb chmod a+wr $POST_VERSION_PATH/purge-versions-deb From 80c0942cc734f04c0cbbb029c53677c02cd5cce6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Jul 2022 23:32:15 -0700 Subject: [PATCH 515/817] Bump lxml from 4.6.5 to 4.9.1 in /src/sonic-config-engine (#11366) Bumps [lxml](https://github.com/lxml/lxml) from 4.6.5 to 4.9.1. - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.5...lxml-4.9.1) --- updated-dependencies: - dependency-name: lxml dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/sonic-config-engine/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 50cd296dccd1..aa340995b60b 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -7,7 +7,7 @@ dependencies = [ 'bitarray==1.5.3', 'ipaddress==1.0.23', - 'lxml==4.6.5', + 'lxml==4.9.1', 'netaddr==0.8.0', 'pyyaml==5.4.1', 'sonic-py-common', From c48e0ae3e3e77084a1b3584b3efb0ab941ad3170 Mon Sep 17 00:00:00 2001 From: pavannaregundi <92989231+pavannaregundi@users.noreply.github.com> Date: Thu, 7 Jul 2022 23:34:46 +0530 Subject: [PATCH 516/817] [Marvell-armhf] Fix kernel hang due to kernel upgrade to 5.10.103 (#11298) Give more room for the kernel image in memory Change-Id: I015856d173d50d94e30d8c555590efb70eb712ae Signed-off-by: Pavan Naregundi --- platform/marvell-armhf/platform.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/marvell-armhf/platform.conf b/platform/marvell-armhf/platform.conf index 2f2a22cd8640..bab1b62f745e 100644 --- a/platform/marvell-armhf/platform.conf +++ b/platform/marvell-armhf/platform.conf @@ -6,9 +6,9 @@ echo "Preparing for installation ... " # global defines kernel_addr=0x1100000 -fdt_addr=0x1000000 -fdt_high=0x10fffff -initrd_addr=0x2000000 +fdt_addr=0x2800000 +fdt_high=0x28fffff +initrd_addr=0x2900000 kernel_fname="/boot/vmlinuz-5.10.0-12-2-armmp" initrd_fname="/boot/initrd.img-5.10.0-12-2-armmp" From 6e74e71aa4b5322643a4723ae62f0d2e0393b30c Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Thu, 7 Jul 2022 14:20:13 -0700 Subject: [PATCH 517/817] Advance sonic-swss-common submodule (#11370) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 10cd834d067f..c30c34f7edea 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 10cd834d067fc2bd80ef04184e72f3ba0139398e +Subproject commit c30c34f7edea01b0391e615d9a24e9e24d07a142 From 205eb59a6d5afe8ad3194a7e070e30b8286529d7 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Fri, 8 Jul 2022 11:32:30 +0800 Subject: [PATCH 518/817] [ci] Fix test stage dependency issue. (#11386) Why I did it When any of the test job failed in the test stage, the rerun will not work, the test stage will be skipped automaticall, so we do not have chance to rerun the test stage again, and the checks of the test will be always in failed status, block the PR to merge forever. It should be caused by the condition in the Test stage, we should specify the status of the BuildVS stage. How I did it Fix stage dependency logic. --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 345fb9b57a5f..f39387effb67 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -77,7 +77,7 @@ stages: - stage: Test dependsOn: BuildVS - condition: and(ne(stageDependencies.BuildVS.outputs['vs.SetVar.SKIP_VSTEST'], 'YES'), succeeded()) + condition: and(ne(stageDependencies.BuildVS.outputs['vs.SetVar.SKIP_VSTEST'], 'YES'), in(dependencies.BuildVS.result, 'Succeeded', 'SucceededWithIssues')) variables: - name: inventory value: veos_vtb From f78807230f4b73536128e1e4fa0eacc65f1746df Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 8 Jul 2022 04:11:35 +0000 Subject: [PATCH 519/817] [dhcp6relay] Check interface address is not NULL (#11359) Why I did it Daemon dhcp6relay may crash due to null pointer access to ifa_addr member of struct ifaddrs. It's not guaranteed that the interface must have available ifa_addr. That is true for some special virtual/pseudo interfaces. How I did it Check the pointer to ifa_addr is valid ahead of accessing it. --- src/dhcp6relay/src/relay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp index 4b3b4d4010bf..5233fe579fdc 100644 --- a/src/dhcp6relay/src/relay.cpp +++ b/src/dhcp6relay/src/relay.cpp @@ -344,7 +344,7 @@ void prepare_relay_config(relay_config *interface_config, int *local_sock, int f ifa_tmp = ifa; while (ifa_tmp) { - if (ifa_tmp->ifa_addr->sa_family == AF_INET6) { + if (ifa_tmp->ifa_addr && ifa_tmp->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if((strcmp(ifa_tmp->ifa_name, interface_config->interface.c_str()) == 0) && !IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { non_link_local = *in6; @@ -402,7 +402,7 @@ void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int else { ifa_tmp = ifa; while (ifa_tmp) { - if ((ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { + if (ifa_tmp->ifa_addr && (ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; if(!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { bind_addr = true; From 3ba5cdcaa0d300f73d88a8637ad97e3909f9d77e Mon Sep 17 00:00:00 2001 From: Rajesh Sankaran <48232228+srj102@users.noreply.github.com> Date: Fri, 8 Jul 2022 09:57:52 +0530 Subject: [PATCH 520/817] [YANG MODEL] SONiC Yang support for VXLAN (#7294) Why I did it SONiC Yang support for VXLAN How I did it Added a new sonic-vxlan.yang file. Please refer to EVPN VXLAN HLD for DB details https://github.com/Azure/SONiC/tree/master/doc/vxlan/EVPN How to verify it Added tests for sonic vxlan yang. --- src/sonic-yang-models/doc/Configuration.md | 32 +++++ src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 23 +++- .../tests/yang_model_tests/tests/vxlan.json | 17 +++ .../yang_model_tests/tests_config/vxlan.json | 129 ++++++++++++++++++ .../yang-models/sonic-vxlan.yang | 126 +++++++++++++++++ .../yang-templates/sonic-types.yang.j2 | 8 ++ 7 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/vxlan.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/vxlan.json create mode 100644 src/sonic-yang-models/yang-models/sonic-vxlan.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index ab51762e5d7e..1baa2c81e1db 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -49,6 +49,7 @@ Table of Contents * [Versions](#versions) * [VLAN](#vlan) * [VLAN_MEMBER](#vlan_member) + * [VXLAN](#vxlan) * [Virtual router](#virtual-router) * [WRED_PROFILE](#wred_profile) * [PASSWORD_HARDENING](#password_hardening) @@ -1460,6 +1461,37 @@ channel name as object key, and tagging mode as attributes. } ``` +### VXLAN + +VXLAN_TUNNEL holds the VTEP source ip configuration. +VXLAN_TUNNEL_MAP holds the vlan to vni and vni to vlan mapping configuration. +VXLAN_EVPN_NVO holds the VXLAN_TUNNEL object to be used for BGP-EVPN discovered tunnels. + +``` +{ +"VXLAN_TUNNEL": { + "vtep1": { + "src_ip": "10.10.10.10" + } + } +"VXLAN_TUNNEL_MAP" : { + "vtep1|map_1000_Vlan100": { + "vni": "1000", + "vlan": "100" + }, + "vtep1|testmap": { + "vni": "22000", + "vlan": "70" + }, + } + "VXLAN_EVPN_NVO": { + "nvo1": { + "source_vtep": "vtep1" + } + } +} +``` + ### Virtual router The virtual router table allows to insert or update a new virtual router diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 1c2bfaf2755a..6a7d78bdf4ef 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -134,6 +134,7 @@ def run(self): './yang-models/sonic-types.yang', './yang-models/sonic-versions.yang', './yang-models/sonic-vlan.yang', + './yang-models/sonic-vxlan.yang', './yang-models/sonic-vrf.yang', './yang-models/sonic-mclag.yang', './yang-models/sonic-vlan-sub-interface.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 97a02004306e..be8e6fb659c2 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -332,6 +332,12 @@ } }, "VLAN": { + "Vlan100": { + "description": "vxlan", + "vlanid": "100", + "mtu": "9216", + "admin_status": "up" + }, "Vlan111": { "description": "svlan", "dhcp_servers": [ @@ -1703,7 +1709,22 @@ "4": "4" } }, - + "VXLAN_TUNNEL": { + "vtep1": { + "src_ip": "1.2.3.4" + } + }, + "VXLAN_EVPN_NVO": { + "nvo1": { + "source_vtep": "vtep1" + } + }, + "VXLAN_TUNNEL_MAP": { + "vtep1|map_100_Vlan100": { + "vni" : "100", + "vlan": "Vlan100" + } + }, "PORT_QOS_MAP": { "Ethernet0": { "dot1p_to_tc_map" : "Dot1p_to_tc_map1", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vxlan.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vxlan.json new file mode 100644 index 000000000000..6bb0507fb050 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vxlan.json @@ -0,0 +1,17 @@ +{ + "VXLAN_VALID_TEST": { + "desc": "Valid VXLAN Configuration." + }, + "VXLAN_EVPN_NVO_WITHOUT_VTEP": { + "desc": "Configure EVPN_NVO without VXLAN_TUNNEL entry", + "eStrKey" : "LeafRef" + }, + "VXLAN_MAP_WITHOUT_VTEP": { + "desc": "Configure VXLAN_TUNNEL_MAP without VXLAN_TUNNEL entry", + "eStrKey" : "LeafRef" + }, + "VXLAN_MAP_OOR_VNI": { + "desc": "VNI Out of Range in VXLAN_TUNNEL_MAP TABLE", + "eStrKey": "Range" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vxlan.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vxlan.json new file mode 100644 index 000000000000..90e71063cb24 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vxlan.json @@ -0,0 +1,129 @@ +{ + "VXLAN_VALID_TEST": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan100" + } + ] + } + }, + "sonic-vxlan:sonic-vxlan": { + "sonic-vxlan:VXLAN_TUNNEL": { + "VXLAN_TUNNEL_LIST": [ + { + "name": "vtep1", + "src_ip": "1.2.3.4" + } + ] + }, + "sonic-vxlan:VXLAN_EVPN_NVO": { + "VXLAN_EVPN_NVO_LIST": [ + { + "name": "nvo1", + "source_vtep": "vtep1" + } + ] + }, + "sonic-vxlan:VXLAN_TUNNEL_MAP": { + "VXLAN_TUNNEL_MAP_LIST": [ + { + "name": "vtep1", + "mapname": "map_100_Vlan100", + "vlan": "Vlan100", + "vni": "100" + } + ] + } + } + }, + "VXLAN_EVPN_NVO_WITHOUT_VTEP": { + "sonic-vxlan:sonic-vxlan": { + "sonic-vxlan:VXLAN_EVPN_NVO": { + "VXLAN_EVPN_NVO_LIST": [ + { + "name": "nvo1", + "source_vtep": "vtep1" + } + ] + } + } + }, + "VXLAN_MAP_WITHOUT_VTEP": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan100" + } + ] + } + }, + "sonic-vxlan:sonic-vxlan": { + "sonic-vxlan:VXLAN_TUNNEL_MAP": { + "VXLAN_TUNNEL_MAP_LIST": [ + { + "name": "vtep1", + "mapname": "map_100_Vlan100", + "vlan": "Vlan100", + "vni": "100" + } + ] + } + } + }, + "VXLAN_MAP_WITHOUT_VLAN": { + "sonic-vxlan:sonic-vxlan": { + "sonic-vxlan:VXLAN_TUNNEL": { + "VXLAN_TUNNEL_LIST": [ + { + "name": "vtep1", + "src_ip": "1.2.3.4" + } + ] + }, + "sonic-vxlan:VXLAN_TUNNEL_MAP": { + "VXLAN_TUNNEL_MAP_LIST": [ + { + "name": "vtep1", + "mapname": "map_100_Vlan100", + "vlan": "Vlan100", + "vni": "100" + } + ] + } + } + }, + "VXLAN_MAP_OOR_VNI": { + "sonic-vlan:sonic-vlan": { + "sonic-vlan:VLAN": { + "VLAN_LIST": [ + { + "name": "Vlan100" + } + ] + } + }, + "sonic-vxlan:sonic-vxlan": { + "sonic-vxlan:VXLAN_TUNNEL": { + "VXLAN_TUNNEL_LIST": [ + { + "name": "vtep1", + "src_ip": "1.2.3.4" + } + ] + }, + "sonic-vxlan:VXLAN_TUNNEL_MAP": { + "VXLAN_TUNNEL_MAP_LIST": [ + { + "name": "vtep1", + "mapname": "map_100_Vlan100", + "vlan": "Vlan100", + "vni": "16777299" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-vxlan.yang b/src/sonic-yang-models/yang-models/sonic-vxlan.yang new file mode 100644 index 000000000000..6a9b4ffb5e3b --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-vxlan.yang @@ -0,0 +1,126 @@ +module sonic-vxlan { + yang-version 1.1; + namespace "http://github.com/Azure/sonic-vxlan"; + prefix svxlan; + + import ietf-yang-types { + prefix yang; + } + + import ietf-inet-types { + prefix inet; + } + + import sonic-extension { + prefix sonic-ext; + } + // Comment sonic-vlan import here until libyang back-links issue is resolved for VLAN leaf reference. + //import sonic-vlan { + // prefix svlan; + //} + import sonic-types { + prefix stypes; + } + + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC VXLAN"; + + revision 2021-04-12 { + description + "First revision."; + } + + container sonic-vxlan { + + container VXLAN_TUNNEL { + + description "config db VXLAN_TUNNEL table"; + + list VXLAN_TUNNEL_LIST { + + key "name"; + max-elements 1; + + leaf name { + /* vni devices are created of the form 'name'-vlanid + The kernel has a max limit of 15 chars for netdevices. + keeping aside 5 chars for hyphen and vlanid the + name should have a max of 10 chars */ + + type string { + length 1..10; + } + } + + leaf src_ip { + type inet:ipv4-address; + } + } + } + + container VXLAN_TUNNEL_MAP { + + description "config db VXLAN_TUNNEL_MAP table"; + + list VXLAN_TUNNEL_MAP_LIST { + key "name mapname"; + + leaf name { + type leafref { + path "/svxlan:sonic-vxlan/svxlan:VXLAN_TUNNEL/svxlan:VXLAN_TUNNEL_LIST/svxlan:name"; + } + } + + leaf mapname { + type string; + } + + leaf vlan { + mandatory true; + // Comment VLAN leaf reference here until libyang back-links issue is resolved and use VLAN string pattern + // type leafref { + // path "/svlan:sonic-vlan/svlan:VLAN/svlan:VLAN_LIST/svlan:name"; + //} + type string { + pattern 'Vlan([0-9]{1,3}|[1-3][0-9]{3}|[4][0][0-8][0-9]|[4][0][9][0-4])'; + } + + } + + leaf vni { + mandatory true; + type stypes:vnid_type; + } + } + } + + container VXLAN_EVPN_NVO { + + description "config db VXLAN_EVPN_NVO table"; + + list VXLAN_EVPN_NVO_LIST { + + key "name"; + max-elements 1; + + leaf name { + type string; + } + + leaf source_vtep { + mandatory true; + type leafref { + path "/svxlan:sonic-vxlan/svxlan:VXLAN_TUNNEL/svxlan:VXLAN_TUNNEL_LIST/svxlan:name"; + } + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 index 6d8bd198d216..f8d9d2c30586 100644 --- a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 @@ -262,6 +262,14 @@ module sonic-types { } } + typedef vnid_type { + type uint32 { + range "1..16777215"; + } + description + "VXLAN Network Identifier"; + } + {% if yang_model_type == "cvl" %} /* Required for CVL */ container operation { From 1b7fcb4659052607014994c17e57dae8818248a7 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 7 Jul 2022 22:31:21 -0700 Subject: [PATCH 521/817] [device]: Add SAI checksum verify to TD3 config (#8857) * [device]: Add SAI checksum verify to TD3 config * A new config option was added to control the value of IPV4_INCR_CHECKSUM_ORIGINAL_VALUE_VERIFY in the EGR_FLEX_CONFIG control register (this prevents checksums of 0xffff from being propagated to other devices) --- .../Arista-7050CX3-32S-C32/config.bcm.j2 | 1 + .../Arista-7050CX3-32S-D48C8/config.bcm.j2 | 1 + src/sonic-device-data/tests/permitted_list | 1 + 3 files changed, 3 insertions(+) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 index 3f81bfcc9951..6cc4540921e4 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/config.bcm.j2 @@ -9,6 +9,7 @@ sai_load_hw_config=/etc/bcm/flex/bcm56870_a0_premium_issu/b870.6.4.1/ l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +sai_verify_incoming_chksum=0 {{ map_prio }} host_as_route_disable=1 use_all_splithorizon_groups=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 index da09c09b167e..a68ff78bab3c 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/config.bcm.j2 @@ -9,6 +9,7 @@ sai_load_hw_config=/etc/bcm/flex/bcm56870_a0_premium_issu/b870.6.4.1/ l3_alpm_hit_skip=1 sai_adjust_acl_drop_in_rx_drop=1 +sai_verify_incoming_chksum=0 {{ map_prio }} host_as_route_disable=1 use_all_splithorizon_groups=1 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 0ef2b8a467e1..012e547f62ea 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -313,6 +313,7 @@ port_gmii_mode phy_force_firmware_load phy_pcs_repeater l3_alpm_hit_skip +sai_verify_incoming_chksum phy_an_lt_msft system_ref_core_clock_khz xflow_macsec_secure_chan_to_num_secure_assoc_encrypt From e6463ad6d37ea686da046915e8be11ad41a68f0c Mon Sep 17 00:00:00 2001 From: Sujin Kang Date: Fri, 8 Jul 2022 14:40:33 -0700 Subject: [PATCH 522/817] add dependancy of determine-reboot-cause sevice to process-reboot-cause service (#11213) Why I did it Database container takes long time ( more than 1.5 minutes ) on some vendor platforms. This makes the determine-reboot-cause starts later than process-reboot-cause service. And that results in the incorrect reboot-cause determination. How I did it Add the dependency of determine-reboot-cause service to process-reboot-cause service --- .../sonic-host-services-data.process-reboot-cause.service | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-host-services-data/debian/sonic-host-services-data.process-reboot-cause.service b/src/sonic-host-services-data/debian/sonic-host-services-data.process-reboot-cause.service index 32c2d0bb927a..14af8868e164 100644 --- a/src/sonic-host-services-data/debian/sonic-host-services-data.process-reboot-cause.service +++ b/src/sonic-host-services-data/debian/sonic-host-services-data.process-reboot-cause.service @@ -1,7 +1,7 @@ [Unit] Description=Retrieve the reboot cause from the history files and save them to StateDB -Requires=database.service -After=database.service +Requires=database.service determine-reboot-cause.service +After=database.service determine-reboot-cause.service [Service] Type=simple From 23dffe596a89d90d9d9cc9efa48985db7425cd5c Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Sat, 9 Jul 2022 08:04:39 +0800 Subject: [PATCH 523/817] [Submodule] update sonic-utilities (#11397) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 7070794d1378..04dbdf6f2c12 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 7070794d1378802a8d452f8f2c4b1c66335f18cc +Subproject commit 04dbdf6f2c12a8d8f5d09ff466ccd6ea9dfd5c20 From 27d53cbba7573c61a3a724aabcc217e781a40496 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Sat, 9 Jul 2022 19:02:10 +0800 Subject: [PATCH 524/817] FIX the build error introduced by textfsm 1.1.3(Published on 2022/7/6) (#11394) Why I did it sonic-mgmt docker image build error, because of the textfsm new version(1.1.3). https://dev.azure.com/mssonic/build/_build/results?buildId=119147&view=logs&j=3dc8fd7e-4368-5a92-293e-d53cefc8c4b3&t=44e6c678-cb87-52d9-8547-bcdbd0ad6ae4&l=43043 How I did it Fix textfsm version to 1.1.2 How to verify it I build the image on my local env, and reproduce the issue with 1.1.3, it's fixed after I change the version to 1.1.2 . Signed-off-by: jianquanye@microsoft.com --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 6435a2114ecb..06267ccaf6a3 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -71,7 +71,7 @@ RUN pip install cffi==1.10.0 \ six \ tabulate \ statistics \ - textfsm \ + textfsm==1.1.2 \ virtualenv \ retry \ thrift==0.11.0 \ @@ -233,7 +233,7 @@ RUN python3 -m pip install setuptools-rust \ rpyc \ six \ tabulate \ - textfsm \ + textfsm==1.1.2 \ virtualenv \ wheel==0.33.6 \ pysubnettree \ From 9fbd774cfc3138e3a96ebb54958804aa01d82b84 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:10:06 +0800 Subject: [PATCH 525/817] Upgrade openssh to 8.4p1-5+deb11u1 (#11405) Why I did it Fix the openssh build issue, upgrade from 8.4p1-5 to 8.4p1-5+deb11u1. https://dev.azure.com/mssonic/build/_build/results?buildId=120209&view=logs&j=88ce9a53-729c-5fa9-7b6e-3d98f2488e3f&t=8d99be27-49d0-54d0-99b1-cfc0d47f0318 + sudo dpkg --root=./fsroot-broadcom -i target/debs/bullseye/openssh-server_8.4p1-5_amd64.deb dpkg: warning: downgrading openssh-server from 1:8.4p1-5+deb11u1 to 1:8.4p1-5 (Reading database ... 44818 files and directories currently installed.) Preparing to unpack .../openssh-server_8.4p1-5_amd64.deb ... Unpacking openssh-server (1:8.4p1-5) over (1:8.4p1-5+deb11u1) ... dpkg: dependency problems prevent configuration of openssh-server: openssh-server depends on openssh-client (= 1:8.4p1-5); however: Version of openssh-client on system is 1:8.4p1-5+deb11u1. dpkg: error processing package openssh-server (--install): dependency problems - leaving unconfigured Errors were encountered while processing: openssh-server + clean_sys How I did it Upgrade openssh from 8.4p1-5 to 8.4p1-5+deb11u1. --- rules/openssh.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/openssh.mk b/rules/openssh.mk index 0e4696ed9d27..53438b76ab73 100644 --- a/rules/openssh.mk +++ b/rules/openssh.mk @@ -1,6 +1,6 @@ # openssh package -OPENSSH_VERSION = 8.4p1-5 +OPENSSH_VERSION = 8.4p1-5+deb11u1 export OPENSSH_VERSION From 7b5e9f4928c04ae1324a0b41d2fe1d98b8770f88 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Mon, 11 Jul 2022 09:55:54 +0800 Subject: [PATCH 526/817] [Submodule] Update src/sonic-py-swsssdk (#11385) Updating sonic-utilities sub module with the following commits cc847a2 Change diff coverage threshold to 80% ca785a2 Remove sonic-db-cli #### Why I did it To fix sonic-db-cli high CPU usage on SONiC startup issue: https://github.com/Azure/sonic-buildimage/issues/10218 sonic-db-cli re-write with c++ and move to sonic-swss-common repo. #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) #### Description for the changelog cc847a2 Change diff coverage threshold to 80% ca785a2 Remove sonic-db-cli #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 653bdba51750..cc847a2e11b3 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 653bdba51750cac95feb3dd47904bf4de2353fec +Subproject commit cc847a2e11b3dd6d7f9630bfcac2ac3af2912eba From a9b7a1facd0c004b4a230ecac915a85d664ebb3c Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Mon, 11 Jul 2022 10:01:10 +0800 Subject: [PATCH 527/817] Replace swsssdk with swsscommon (#11215) #### Why I did it Update scripts in sonic-buildimage from py-swsssdk to swsscommon #### How I did it Change code to use swsscommon. #### How to verify it Pass all E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Update scripts in sonic-buildimage from py-swsssdk to swsscommon #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- dockers/docker-database/flush_unused_database | 10 +++++----- dockers/docker-orchagent/enable_counters.py | 6 +++--- dockers/docker-orchagent/tunnel_packet_handler.py | 2 +- dockers/docker-sflow/port_index_mapper.py | 4 ++-- dockers/docker-snmp/snmp_yml_to_configdb.py | 2 +- src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py | 2 +- src/sonic-frr-mgmt-framework/tests/test_config.py | 8 +++++--- src/sonic-frr-mgmt-framework/tests/test_constructor.py | 6 ++++-- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/dockers/docker-database/flush_unused_database b/dockers/docker-database/flush_unused_database index e1f7394d9776..82a87392fdb3 100755 --- a/dockers/docker-database/flush_unused_database +++ b/dockers/docker-database/flush_unused_database @@ -1,5 +1,5 @@ #!/usr/bin/python3 -import swsssdk +from swsscommon import swsscommon import redis import subprocess import time @@ -11,15 +11,15 @@ while(True): break time.sleep(1) -instlists = swsssdk.SonicDBConfig.get_instancelist() +instlists = swsscommon.SonicDBConfig.get_instancelist() for instname, v in instlists.items(): insthost = v['hostname'] instsocket = v['unix_socket_path'] - dblists = swsssdk.SonicDBConfig.get_dblist() + dblists = swsscommon.SonicDBConfig.get_dblist() for dbname in dblists: - dbid = swsssdk.SonicDBConfig.get_dbid(dbname) - dbinst = swsssdk.SonicDBConfig.get_instancename(dbname) + dbid = swsscommon.SonicDBConfig.get_dbid(dbname) + dbinst = swsscommon.SonicDBConfig.get_instancename(dbname) # this DB is on current instance, skip flush if dbinst == instname: diff --git a/dockers/docker-orchagent/enable_counters.py b/dockers/docker-orchagent/enable_counters.py index c45a931e0553..6054503892d0 100755 --- a/dockers/docker-orchagent/enable_counters.py +++ b/dockers/docker-orchagent/enable_counters.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import time -import swsssdk +from swsscommon import swsscommon # ALPHA defines the size of the window over which we calculate the average value. ALPHA is 2/(N+1) where N is the interval(window size) # In this case we configure the window to be 10s. This way if we have a huge 1s spike in traffic, @@ -23,7 +23,7 @@ def enable_counter_group(db, name): def enable_rates(): # set the default interval for rates - counters_db = swsssdk.SonicV2Connector() + counters_db = swsscommon.SonicV2Connector() counters_db.connect('COUNTERS_DB') counters_db.set('COUNTERS_DB', 'RATES:PORT', 'PORT_SMOOTH_INTERVAL', DEFAULT_SMOOTH_INTERVAL) counters_db.set('COUNTERS_DB', 'RATES:PORT', 'PORT_ALPHA', DEFAULT_ALPHA) @@ -36,7 +36,7 @@ def enable_rates(): def enable_counters(): - db = swsssdk.ConfigDBConnector() + db = swsscommon.ConfigDBConnector() db.connect() default_enabled_counters = ['PORT', 'RIF', 'QUEUE', 'PFCWD', 'PG_WATERMARK', 'PG_DROP', 'QUEUE_WATERMARK', 'BUFFER_POOL_WATERMARK', 'PORT_BUFFER_DROP', 'ACL'] diff --git a/dockers/docker-orchagent/tunnel_packet_handler.py b/dockers/docker-orchagent/tunnel_packet_handler.py index 3d75fdd94a0c..1ba29a542148 100755 --- a/dockers/docker-orchagent/tunnel_packet_handler.py +++ b/dockers/docker-orchagent/tunnel_packet_handler.py @@ -12,7 +12,7 @@ from datetime import datetime from ipaddress import ip_interface -from swsssdk import ConfigDBConnector, SonicV2Connector +from swsscommon.swsscommon import ConfigDBConnector, SonicV2Connector from sonic_py_common import logger as log from pyroute2 import IPRoute diff --git a/dockers/docker-sflow/port_index_mapper.py b/dockers/docker-sflow/port_index_mapper.py index 3ee73181a5b4..ee9dba15a407 100755 --- a/dockers/docker-sflow/port_index_mapper.py +++ b/dockers/docker-sflow/port_index_mapper.py @@ -5,7 +5,7 @@ import traceback from sonic_py_common.logger import Logger from socket import if_nametoindex -from swsssdk import SonicV2Connector, port_util +from sonic_py_common import port_util from swsscommon import swsscommon SYSLOG_IDENTIFIER = 'port_index_mapper' @@ -26,7 +26,7 @@ def __init__(self): REDIS_TIMEOUT_MS, True) - self.state_db = SonicV2Connector(host='127.0.0.1', decode_responses=True) + self.state_db = swsscommon.SonicV2Connector(host='127.0.0.1', decode_responses=True) self.state_db.connect(self.state_db.STATE_DB, False) self.sel = swsscommon.Select() self.tbls = [swsscommon.SubscriberStateTable(self.appl_db, t) diff --git a/dockers/docker-snmp/snmp_yml_to_configdb.py b/dockers/docker-snmp/snmp_yml_to_configdb.py index 7d4289926240..3b031d4a27f0 100755 --- a/dockers/docker-snmp/snmp_yml_to_configdb.py +++ b/dockers/docker-snmp/snmp_yml_to_configdb.py @@ -5,7 +5,7 @@ import yaml from sonic_py_common.logger import Logger -from swsssdk import ConfigDBConnector +from swsscommon.swsscommon import ConfigDBConnector db = ConfigDBConnector() db.connect() diff --git a/src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py b/src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py index f189789914ed..bb6d7730f141 100755 --- a/src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py +++ b/src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py @@ -5,7 +5,7 @@ import time import syslog import os -from swsssdk import ConfigDBConnector +from swsscommon.swsscommon import ConfigDBConnector import socket import threading import queue diff --git a/src/sonic-frr-mgmt-framework/tests/test_config.py b/src/sonic-frr-mgmt-framework/tests/test_config.py index ed31c1e28ec8..02c5181c2ce5 100644 --- a/src/sonic-frr-mgmt-framework/tests/test_config.py +++ b/src/sonic-frr-mgmt-framework/tests/test_config.py @@ -2,9 +2,11 @@ import re from unittest.mock import MagicMock, NonCallableMagicMock, patch -swsssdk_module_mock = MagicMock(ConfigDBConnector = NonCallableMagicMock) +swsscommon_module_mock = MagicMock(ConfigDBConnector = NonCallableMagicMock) +# because can’t use dotted names directly in a call, have to create a dictionary and unpack it using **: +mockmapping = {'swsscommon.swsscommon': swsscommon_module_mock} -@patch.dict('sys.modules', swsssdk = swsssdk_module_mock) +@patch.dict('sys.modules', **mockmapping) def test_contructor(): from frrcfgd.frrcfgd import BGPConfigDaemon daemon = BGPConfigDaemon() @@ -147,7 +149,7 @@ def hdl_confed_peers_cmd(is_del, cmd_list, chk_data): conf_bgp_af_cmd('Vrf_red', 200, 'ipv6') + ['{}import vrf route-map test_map']), ] -@patch.dict('sys.modules', swsssdk = swsssdk_module_mock) +@patch.dict('sys.modules', **mockmapping) @patch('frrcfgd.frrcfgd.g_run_command') def data_set_del_test(test_data, run_cmd): from frrcfgd.frrcfgd import BGPConfigDaemon diff --git a/src/sonic-frr-mgmt-framework/tests/test_constructor.py b/src/sonic-frr-mgmt-framework/tests/test_constructor.py index 14faa36d2e66..93a09664c3c8 100644 --- a/src/sonic-frr-mgmt-framework/tests/test_constructor.py +++ b/src/sonic-frr-mgmt-framework/tests/test_constructor.py @@ -2,9 +2,11 @@ import pytest from unittest.mock import MagicMock, NonCallableMagicMock, patch -swsssdk_module_mock = MagicMock(ConfigDBConnector = NonCallableMagicMock) +swsscommon_module_mock = MagicMock(ConfigDBConnector = NonCallableMagicMock) +# because can’t use dotted names directly in a call, have to create a dictionary and unpack it using **: +mockmapping = {'swsscommon.swsscommon': swsscommon_module_mock} -with patch.dict('sys.modules', swsssdk = swsssdk_module_mock): +with patch.dict('sys.modules', **mockmapping): from frrcfgd.frrcfgd import CachedDataWithOp from frrcfgd.frrcfgd import BGPPeerGroup from frrcfgd.frrcfgd import BGPKeyMapInfo From e1f25162f103bdc93c3fe3bab1233c086722cd22 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Tue, 12 Jul 2022 02:36:59 +0800 Subject: [PATCH 528/817] [submodule] Advance sonic-platform-common pointer (#11401) 912797e2 Support get_port_or_cage_type (#288) d8abf477 Microsoft mandatory file (#284) Signed-off-by: Stephen Sun --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 0d45adb62f48..912797e2cabc 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 0d45adb62f48637a575e09da7c61c58a7020e40e +Subproject commit 912797e2cabcd25a9a469827eb35807031ae13b5 From 827fa5a84c38363c9c04a4a73d8c0f19ecfcd967 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 11 Jul 2022 17:53:32 -0700 Subject: [PATCH 529/817] [master][sonic-linkmgrd] submodule update (#11372) [master][sonic-linkmgrd] submodule update 58d8aae Longxiang Lyu Sat Jul 2 10:14:50 2022 +0800 Enforce switch after config mux to active (Azure/sonic-linkmgrd#95) 600df46 Longxiang Lyu Thu Jun 30 15:09:10 2022 +0800 Add unittest to verify mux toggle active (Azure/sonic-linkmgrd#94) 400b1b8 gregshpit Wed Jun 29 21:32:45 2022 +0300 For Sonic cross-compilation build. CC variable is used as gcc compiler. CXX variable is used as g++ compiler. (Azure/sonic-linkmgrd#91) a516668 Jing Zhang Tue Jun 28 11:07:23 2022 -0700 Use Vlan MAC as src MAC for link prober by default (Azure/sonic-linkmgrd#93) 6b5d739 Longxiang Lyu Tue Jun 28 22:46:12 2022 +0800 Fix inconsistent mux state (Azure/sonic-linkmgrd#92) 9265497 Jing Zhang Fri Jun 24 09:10:12 2022 -0700 Remove exception throwing when initializing missing loopback interface (Azure/sonic-linkmgrd#90) sign-off: Jing Zhang zhangjing@microsoft.com --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index e7e00f2aac1e..58d8aae2db7e 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit e7e00f2aac1e93e5bfe6a5e8edd415e343d2b442 +Subproject commit 58d8aae2db7ede644f6b0b48c8b6188c22d9028b From 849eb4bf32e2f75aabc998076ae76d35824f9d83 Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Tue, 12 Jul 2022 00:22:48 -0700 Subject: [PATCH 530/817] Changes to persist TSA/B state across reloads (#11257) --- dockers/docker-fpm-frr/base_image_files/TS | 25 +++- dockers/docker-fpm-frr/base_image_files/TSA | 24 ++-- dockers/docker-fpm-frr/base_image_files/TSB | 19 +++- files/build_templates/init_cfg.json.j2 | 5 + src/sonic-bgpcfgd/bgpcfgd/main.py | 4 + src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py | 7 +- .../bgpcfgd/managers_device_global.py | 101 +++++++++++++++++ .../peer-group.conf/result_all_isolate.conf | 33 ++++++ .../peer-group.conf/result_all_unisolate.conf | 29 +++++ .../peer-group.conf/result_isolate.conf | 11 ++ .../peer-group.conf/result_unisolate.conf | 7 ++ src/sonic-bgpcfgd/tests/test_device_global.py | 107 ++++++++++++++++++ 12 files changed, 354 insertions(+), 18 deletions(-) create mode 100644 src/sonic-bgpcfgd/bgpcfgd/managers_device_global.py create mode 100644 src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_isolate.conf create mode 100644 src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_unisolate.conf create mode 100644 src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_isolate.conf create mode 100644 src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_unisolate.conf create mode 100644 src/sonic-bgpcfgd/tests/test_device_global.py diff --git a/dockers/docker-fpm-frr/base_image_files/TS b/dockers/docker-fpm-frr/base_image_files/TS index de1e50b7a306..4ee085282be8 100755 --- a/dockers/docker-fpm-frr/base_image_files/TS +++ b/dockers/docker-fpm-frr/base_image_files/TS @@ -5,6 +5,12 @@ PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} +if [[ $1 == "TSA" ]]; then + TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "true"}}}' +elif [[ $1 == "TSB" ]]; then + TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "false"}}}' +fi + # Parse the device specific asic conf file, if it exists ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf [ -f $ASIC_CONF ] && . $ASIC_CONF @@ -20,10 +26,25 @@ if [[ ($NUM_ASIC -gt 1) ]]; then if [ $sub_role == 'FrontEnd' ] then echo -e "BGP"$asic" : \c" - docker exec -i bgp$asic /usr/bin/$1 + if [[ -n "$TSA_STATE_UPDATE" ]]; then + sonic-cfggen -a "$TSA_STATE_UPDATE" -w -n $NAMESPACE_PREFIX$asic + logger -t $1 -p user.info "BGP$asic: System Mode: Normal -> Maintenance" + echo "BGP$asic: System Mode: Normal -> Maintenance" + else + # If TSC is executed, invoke FRR script to check installed route-maps + docker exec -i bgp$asic /usr/bin/$1 + fi fi asic=$[$asic+1] done else - docker exec -i bgp /usr/bin/$1 + if [[ -n "$TSA_STATE_UPDATE" ]]; then + sonic-cfggen -a "$TSA_STATE_UPDATE" -w + logger -t $1 -p user.info "System Mode: Normal -> Maintenance" + echo "System Mode: Normal -> Maintenance" + else + # If TSC is executed, invoke FRR script to check installed route-maps + docker exec -i bgp /usr/bin/$1 + fi fi + diff --git a/dockers/docker-fpm-frr/base_image_files/TSA b/dockers/docker-fpm-frr/base_image_files/TSA index 6b2ddb264834..8c37525ef0a9 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSA +++ b/dockers/docker-fpm-frr/base_image_files/TSA @@ -1,12 +1,20 @@ #!/bin/bash -# toggle the mux to standby if dualtor and any mux active -if -[[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]] && -[[ $(show mux status | grep active | wc -l) > 0 ]]; -then - logger -t TSA -p user.info "Toggle all mux mode to standby" - sudo config mux mode standby all + +if [[ "$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled)" == "true" ]]; then + echo "System is already in Maintenance" + logger -t TSA -p user.info "System is already in Maintenance" +else + # toggle the mux to standby if dualtor and any mux active + if + [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]] && + [[ $(show mux status | grep active | wc -l) > 0 ]]; + then + logger -t TSA -p user.info "Toggle all mux mode to standby" + sudo config mux mode standby all + fi + + /usr/bin/TS TSA + echo "Please execute 'config save' to preserve System mode in Maintenance after reboot or config reload" fi -/usr/bin/TS TSA diff --git a/dockers/docker-fpm-frr/base_image_files/TSB b/dockers/docker-fpm-frr/base_image_files/TSB index 3fed7bb644f5..5f8d90160fcb 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSB +++ b/dockers/docker-fpm-frr/base_image_files/TSB @@ -1,10 +1,17 @@ #!/bin/bash -# toggle the mux to auto if dualtor -if [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]]; -then - logger -t TSB -p user.info "Toggle all mux mode to auto" - sudo config mux mode auto all +if [[ "$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled)" == "false" ]]; then + echo "System is already in Normal mode" + logger -t TSB -p user.info "System is already in Normal mode" +else + # toggle the mux to auto if dualtor + if [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]]; + then + logger -t TSB -p user.info "Toggle all mux mode to auto" + sudo config mux mode auto all + fi + + /usr/bin/TS TSB + echo "Please execute 'config save' to preserve System mode in Normal state after reboot or config reload" fi -/usr/bin/TS TSB diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index ca5a0756f954..7de0ad977807 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -27,6 +27,11 @@ "POLL_INTERVAL": "10000" } }, + "BGP_DEVICE_GLOBAL": { + "STATE": { + "tsa_enabled": "false" + } + }, {%- set features = [("bgp", "enabled", false, "enabled"), ("database", "always_enabled", false, "always_enabled"), ("lldp", "enabled", true, "enabled"), diff --git a/src/sonic-bgpcfgd/bgpcfgd/main.py b/src/sonic-bgpcfgd/bgpcfgd/main.py index 7b4291b4d4a3..f777867eaacc 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/main.py +++ b/src/sonic-bgpcfgd/bgpcfgd/main.py @@ -18,6 +18,7 @@ from .managers_setsrc import ZebraSetSrc from .managers_static_rt import StaticRouteMgr from .managers_rm import RouteMapMgr +from .managers_device_global import DeviceGlobalCfgMgr from .runner import Runner, signal_handler from .template import TemplateFabric from .utils import read_constants @@ -64,6 +65,8 @@ def do_work(): # Route Advertisement Managers AdvertiseRouteMgr(common_objs, "STATE_DB", swsscommon.STATE_ADVERTISE_NETWORK_TABLE_NAME), RouteMapMgr(common_objs, "APPL_DB", swsscommon.APP_BGP_PROFILE_TABLE_NAME), + # Device Global Manager + DeviceGlobalCfgMgr(common_objs, "CONFIG_DB", swsscommon.CFG_BGP_DEVICE_GLOBAL_TABLE_NAME), ] runner = Runner(common_objs['cfg_mgr']) for mgr in managers: @@ -96,3 +99,4 @@ def main(): sys.exit(rc) except SystemExit: os._exit(rc) + diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py b/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py index c787ae2abe69..55a16a273993 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py @@ -8,6 +8,7 @@ from .manager import Manager from .template import TemplateFabric from .utils import run_command +from .managers_device_global import DeviceGlobalCfgMgr class BGPPeerGroupMgr(object): @@ -23,6 +24,7 @@ def __init__(self, common_objs, base_template): tf = common_objs['tf'] self.policy_template = tf.from_file(base_template + "policies.conf.j2") self.peergroup_template = tf.from_file(base_template + "peer-group.conf.j2") + self.device_global_cfgmgr = DeviceGlobalCfgMgr(common_objs, "CONFIG_DB", swsscommon.CFG_BGP_DEVICE_GLOBAL_TABLE_NAME) def update(self, name, **kwargs): """ @@ -56,14 +58,15 @@ def update_pg(self, name, **kwargs): """ try: pg = self.peergroup_template.render(**kwargs) + tsa_rm = self.device_global_cfgmgr.check_state_and_get_tsa_routemaps(pg) except jinja2.TemplateError as e: log_err("Can't render peer-group template: '%s': %s" % (name, str(e))) return False if kwargs['vrf'] == 'default': - cmd = ('router bgp %s\n' % kwargs['bgp_asn']) + pg + cmd = ('router bgp %s\n' % kwargs['bgp_asn']) + pg + tsa_rm else: - cmd = ('router bgp %s vrf %s\n' % (kwargs['bgp_asn'], kwargs['vrf'])) + pg + cmd = ('router bgp %s vrf %s\n' % (kwargs['bgp_asn'], kwargs['vrf'])) + pg + tsa_rm self.update_entity(cmd, "Peer-group for peer '%s'" % name) return True diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_device_global.py b/src/sonic-bgpcfgd/bgpcfgd/managers_device_global.py new file mode 100644 index 000000000000..1d30a5b94a64 --- /dev/null +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_device_global.py @@ -0,0 +1,101 @@ +from .manager import Manager +from .log import log_err, log_debug, log_notice +import re +from swsscommon import swsscommon + +class DeviceGlobalCfgMgr(Manager): + """This class responds to change in device-specific state""" + + def __init__(self, common_objs, db, table): + """ + Initialize the object + :param common_objs: common object dictionary + :param db: name of the db + :param table: name of the table in the db + """ + self.directory = common_objs['directory'] + self.cfg_mgr = common_objs['cfg_mgr'] + self.constants = common_objs['constants'] + self.tsa_template = common_objs['tf'].from_file("bgpd/tsa/bgpd.tsa.isolate.conf.j2") + self.tsb_template = common_objs['tf'].from_file("bgpd/tsa/bgpd.tsa.unisolate.conf.j2") + super(DeviceGlobalCfgMgr, self).__init__( + common_objs, + [], + db, + table, + ) + + def set_handler(self, key, data): + log_debug("DeviceGlobalCfgMgr:: set handler") + """ Handle device tsa_enabled state change """ + if not data: + log_err("DeviceGlobalCfgMgr:: data is None") + return False + + if "tsa_enabled" in data: + self.cfg_mgr.commit() + self.cfg_mgr.update() + self.isolate_unisolate_device(data["tsa_enabled"]) + self.directory.put(self.db_name, self.table_name, "tsa_enabled", data["tsa_enabled"]) + return True + return False + + def del_handler(self, key): + log_debug("DeviceGlobalCfgMgr:: del handler") + return True + + def check_state_and_get_tsa_routemaps(self, cfg): + """ API to get TSA route-maps if device is isolated""" + cmd = "" + if self.directory.path_exist("CONFIG_DB", swsscommon.CFG_BGP_DEVICE_GLOBAL_TABLE_NAME, "tsa_enabled"): + tsa_status = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_BGP_DEVICE_GLOBAL_TABLE_NAME)["tsa_enabled"] + if tsa_status == "true": + cmds = cfg.replace("#012", "\n").split("\n") + log_notice("DeviceGlobalCfgMgr:: Device is isolated. Applying TSA route-maps") + cmd = self.get_ts_routemaps(cmds, self.tsa_template) + return cmd + + def isolate_unisolate_device(self, tsa_status): + """ API to get TSA/TSB route-maps and apply configuration""" + cmd = "\n" + if tsa_status == "true": + log_notice("DeviceGlobalCfgMgr:: Device isolated. Executing TSA") + cmd += self.get_ts_routemaps(self.cfg_mgr.get_text(), self.tsa_template) + else: + log_notice("DeviceGlobalCfgMgr:: Device un-isolated. Executing TSB") + cmd += self.get_ts_routemaps(self.cfg_mgr.get_text(), self.tsb_template) + + self.cfg_mgr.push(cmd) + log_debug("DeviceGlobalCfgMgr::Done") + + def get_ts_routemaps(self, cmds, ts_template): + if not cmds: + return "" + + route_map_names = self.__extract_out_route_map_names(cmds) + return self.__generate_routemaps_from_template(route_map_names, ts_template) + + def __generate_routemaps_from_template(self, route_map_names, template): + cmd = "\n" + for rm in sorted(route_map_names): + if "_INTERNAL_" in rm: + continue + if "V4" in rm: + ipv="V4" ; ipp="ip" + elif "V6" in rm: + ipv="V6" ; ipp="ipv6" + else: + continue + cmd += template.render(route_map_name=rm,ip_version=ipv,ip_protocol=ipp, constants=self.constants) + cmd += "\n" + return cmd + + def __extract_out_route_map_names(self, cmds): + route_map_names = set() + out_route_map = re.compile(r'^\s*neighbor \S+ route-map (\S+) out$') + for line in cmds: + result = out_route_map.match(line) + if result: + route_map_names.add(result.group(1)) + return route_map_names + diff --git a/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_isolate.conf b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_isolate.conf new file mode 100644 index 000000000000..a078dadd6f04 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_isolate.conf @@ -0,0 +1,33 @@ +! +! template: bgpd/templates/general/peer-group.conf.j2 +! + neighbor PEER_V4 peer-group + neighbor PEER_V6 peer-group + address-family ipv4 + neighbor PEER_V4 allowas-in 1 + neighbor PEER_V4 soft-reconfiguration inbound + neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in + neighbor PEER_V4 route-map TO_BGP_PEER_V4 out + exit-address-family + address-family ipv6 + neighbor PEER_V6 allowas-in 1 + neighbor PEER_V6 soft-reconfiguration inbound + neighbor PEER_V6 route-map FROM_BGP_PEER_V6 in + neighbor PEER_V6 route-map TO_BGP_PEER_V6 out + exit-address-family +! +! end of template: bgpd/templates/general/peer-group.conf.j2 +! + + +route-map TO_BGP_PEER_V4 permit 20 + match ip address prefix-list PL_LoopbackV4 + set community 12345:12345 +route-map TO_BGP_PEER_V4 deny 30 +! +route-map TO_BGP_PEER_V6 permit 20 + match ipv6 address prefix-list PL_LoopbackV6 + set community 12345:12345 +route-map TO_BGP_PEER_V6 deny 30 +! + diff --git a/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_unisolate.conf b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_unisolate.conf new file mode 100644 index 000000000000..1cd4442f4f3d --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_all_unisolate.conf @@ -0,0 +1,29 @@ +! +! template: bgpd/templates/general/peer-group.conf.j2 +! + neighbor PEER_V4 peer-group + neighbor PEER_V6 peer-group + address-family ipv4 + neighbor PEER_V4 allowas-in 1 + neighbor PEER_V4 soft-reconfiguration inbound + neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in + neighbor PEER_V4 route-map TO_BGP_PEER_V4 out + exit-address-family + address-family ipv6 + neighbor PEER_V6 allowas-in 1 + neighbor PEER_V6 soft-reconfiguration inbound + neighbor PEER_V6 route-map FROM_BGP_PEER_V6 in + neighbor PEER_V6 route-map TO_BGP_PEER_V6 out + exit-address-family +! +! end of template: bgpd/templates/general/peer-group.conf.j2 +! + + +no route-map TO_BGP_PEER_V4 permit 20 +no route-map TO_BGP_PEER_V4 deny 30 +! +no route-map TO_BGP_PEER_V6 permit 20 +no route-map TO_BGP_PEER_V6 deny 30 +! + diff --git a/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_isolate.conf b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_isolate.conf new file mode 100644 index 000000000000..902b8cfcdab9 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_isolate.conf @@ -0,0 +1,11 @@ + +route-map TO_BGP_PEER_V4 permit 20 + match ip address prefix-list PL_LoopbackV4 + set community 12345:12345 +route-map TO_BGP_PEER_V4 deny 30 +! +route-map TO_BGP_PEER_V6 permit 20 + match ipv6 address prefix-list PL_LoopbackV6 + set community 12345:12345 +route-map TO_BGP_PEER_V6 deny 30 +! diff --git a/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_unisolate.conf b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_unisolate.conf new file mode 100644 index 000000000000..8fd9fde7f759 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/general/peer-group.conf/result_unisolate.conf @@ -0,0 +1,7 @@ + +no route-map TO_BGP_PEER_V4 permit 20 +no route-map TO_BGP_PEER_V4 deny 30 +! +no route-map TO_BGP_PEER_V6 permit 20 +no route-map TO_BGP_PEER_V6 deny 30 +! diff --git a/src/sonic-bgpcfgd/tests/test_device_global.py b/src/sonic-bgpcfgd/tests/test_device_global.py new file mode 100644 index 000000000000..eae1ff424e1f --- /dev/null +++ b/src/sonic-bgpcfgd/tests/test_device_global.py @@ -0,0 +1,107 @@ +from unittest.mock import MagicMock, patch + +import os +from bgpcfgd.directory import Directory +from bgpcfgd.template import TemplateFabric +from . import swsscommon_test +from .util import load_constants +import bgpcfgd.managers_device_global +from swsscommon import swsscommon + +TEMPLATE_PATH = os.path.abspath('../../dockers/docker-fpm-frr/frr') +BASE_PATH = os.path.abspath('../sonic-bgpcfgd/tests/data/general/peer-group.conf/') + +def constructor(): + cfg_mgr = MagicMock() + def get_text(): + text = [] + for line in cfg_mgr.changes.split('\n'): + if line.lstrip().startswith('!'): + continue + text.append(line) + text += [" "] + return text + def update(): + cfg_mgr.changes = get_string_from_file("/result_all.conf") + def push(cfg): + cfg_mgr.changes += cfg + "\n" + def get_config(): + return cfg_mgr.changes + cfg_mgr.get_text = get_text + cfg_mgr.update = update + cfg_mgr.push = push + cfg_mgr.get_config = get_config + + constants = load_constants()['constants'] + common_objs = { + 'directory': Directory(), + 'cfg_mgr': cfg_mgr, + 'tf': TemplateFabric(TEMPLATE_PATH), + 'constants': constants + } + mgr = bgpcfgd.managers_device_global.DeviceGlobalCfgMgr(common_objs, "CONFIG_DB", swsscommon.CFG_BGP_DEVICE_GLOBAL_TABLE_NAME) + cfg_mgr.update() + return mgr + + +@patch('bgpcfgd.managers_device_global.log_debug') +def test_isolate_device(mocked_log_info): + m = constructor() + res = m.set_handler("STATE", {"tsa_enabled": "true"}) + assert res, "Expect True return value for set_handler" + mocked_log_info.assert_called_with("DeviceGlobalCfgMgr::Done") + assert m.cfg_mgr.get_config() == get_string_from_file("/result_all_isolate.conf") + +@patch('bgpcfgd.managers_device_global.log_debug') +def test_unisolate_device(mocked_log_info): + m = constructor() + res = m.set_handler("STATE", {"tsa_enabled": "false"}) + assert res, "Expect True return value for set_handler" + mocked_log_info.assert_called_with("DeviceGlobalCfgMgr::Done") + assert m.cfg_mgr.get_config() == get_string_from_file("/result_all_unisolate.conf") + +def test_check_state_and_get_tsa_routemaps(): + m = constructor() + m.set_handler("STATE", {"tsa_enabled": "true"}) + res = m.check_state_and_get_tsa_routemaps(m.cfg_mgr.get_config()) + assert res == get_string_from_file("/result_isolate.conf") + + m.set_handler("STATE", {"tsa_enabled": "false"}) + res = m.check_state_and_get_tsa_routemaps(m.cfg_mgr.get_config()) + assert res == "" + +def test_get_tsa_routemaps(): + m = constructor() + assert m.get_ts_routemaps([], m.tsa_template) == "" + + res = m.get_ts_routemaps(m.cfg_mgr.get_text(), m.tsa_template) + expected_res = get_string_from_file("/result_isolate.conf") + assert res == expected_res + +def test_get_tsb_routemaps(): + m = constructor() + assert m.get_ts_routemaps([], m.tsb_template) == "" + + res = m.get_ts_routemaps(m.cfg_mgr.get_text(), m.tsb_template) + expected_res = get_string_from_file("/result_unisolate.conf") + assert res == expected_res + +def get_string_from_file(filename): + fp = open(BASE_PATH + filename, "r") + cfg = fp.read() + fp.close() + + return cfg + +@patch('bgpcfgd.managers_device_global.log_err') +def test_set_handler_failure_case(mocked_log_info): + m = constructor() + res = m.set_handler("STATE", {}) + assert res == False, "Expect False return value for invalid data passed to set_handler" + mocked_log_info.assert_called_with("DeviceGlobalCfgMgr:: data is None") + +def test_del_handler(): + m = constructor() + res = m.del_handler("STATE") + assert res, "Expect True return value for del_handler" + From 9056232bfd9d69cba275aa1e411825013de7b2fc Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 12 Jul 2022 17:57:16 +0800 Subject: [PATCH 531/817] [Build] Cleanup the version deb preference file after build (#11414) Why I did it Cleanup the version deb preference file after build. The version file is no use after build. How I did it Remove the no use version file. --- src/sonic-build-hooks/scripts/post_run_buildinfo | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sonic-build-hooks/scripts/post_run_buildinfo b/src/sonic-build-hooks/scripts/post_run_buildinfo index e0d84d35bb08..97f47f7efcf1 100755 --- a/src/sonic-build-hooks/scripts/post_run_buildinfo +++ b/src/sonic-build-hooks/scripts/post_run_buildinfo @@ -11,3 +11,6 @@ rm -rf $BUILD_VERSION_PATH/* # Disable the build hooks symlink_build_hooks -d set_reproducible_mirrors -d + +# Remove the version deb preference +rm -f $VERSION_DEB_PREFERENCE From f4d9c94072190dd6c3a4b1fedda4a0270e3415f6 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 12 Jul 2022 07:38:41 -0700 Subject: [PATCH 532/817] Change dhcp6relay to be a submodule, and rename it to dhcprelay (#10711) Why I did it src/dhcprelay is being split out to be its own submodule. How I did it Add existing dhcprelay commits into the new repo. Clean up Makefile (sonic-net/sonic-dhcp-relay@772625f) Add LGTM config (sonic-net/sonic-dhcp-relay@5cc0889) Add Azure pipeline config (sonic-net/sonic-dhcp-relay@c79cdb7) Add submodule reference, renaming most references of dhcp6relay to dhcprelay (to reflect that this will not just be for IPv6 in the future). How to verify it Successful run of LGTM is tested at sonic-net/sonic-dhcp-relay#4. Failure run of LGTM is tested at sonic-net/sonic-dhcp-relay#3. Azure pipeline is run for each commit/PR, and will build for amd64, armhf, and arm64. UT/code coverage check is not yet done. Signed-off-by: Saikrishna Arcot --- .gitmodules | 3 + rules/dhcp6relay.dep | 9 - rules/dhcp6relay.mk | 12 - rules/dhcprelay.dep | 11 + rules/dhcprelay.mk | 12 + rules/docker-dhcp-relay.mk | 4 +- src/dhcp6relay/.gitignore | 5 - src/dhcp6relay/Makefile | 42 -- src/dhcp6relay/debian/changelog | 5 - src/dhcp6relay/debian/compat | 1 - src/dhcp6relay/debian/control | 14 - src/dhcp6relay/debian/rules | 6 - src/dhcp6relay/src/configInterface.cpp | 152 ----- src/dhcp6relay/src/configInterface.h | 75 --- src/dhcp6relay/src/main.cpp | 18 - src/dhcp6relay/src/relay.cpp | 861 ------------------------- src/dhcp6relay/src/relay.h | 358 ---------- src/dhcp6relay/src/subdir.mk | 23 - src/dhcprelay | 1 + 19 files changed, 29 insertions(+), 1583 deletions(-) delete mode 100644 rules/dhcp6relay.dep delete mode 100644 rules/dhcp6relay.mk create mode 100644 rules/dhcprelay.dep create mode 100644 rules/dhcprelay.mk delete mode 100644 src/dhcp6relay/.gitignore delete mode 100644 src/dhcp6relay/Makefile delete mode 100644 src/dhcp6relay/debian/changelog delete mode 100644 src/dhcp6relay/debian/compat delete mode 100644 src/dhcp6relay/debian/control delete mode 100755 src/dhcp6relay/debian/rules delete mode 100644 src/dhcp6relay/src/configInterface.cpp delete mode 100644 src/dhcp6relay/src/configInterface.h delete mode 100644 src/dhcp6relay/src/main.cpp delete mode 100644 src/dhcp6relay/src/relay.cpp delete mode 100644 src/dhcp6relay/src/relay.h delete mode 100644 src/dhcp6relay/src/subdir.mk create mode 160000 src/dhcprelay diff --git a/.gitmodules b/.gitmodules index 3d1a042fb025..0b0b1aa87ce3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -106,3 +106,6 @@ [submodule "src/ptf-py3"] path = src/ptf-py3 url = https://github.com/p4lang/ptf.git +[submodule "src/dhcprelay"] + path = src/dhcprelay + url = https://github.com/sonic-net/sonic-dhcp-relay.git diff --git a/rules/dhcp6relay.dep b/rules/dhcp6relay.dep deleted file mode 100644 index be82d326fe21..000000000000 --- a/rules/dhcp6relay.dep +++ /dev/null @@ -1,9 +0,0 @@ - -SPATH := $($(SONIC_DHCP6RELAY)_SRC_PATH) -DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/dhcp6relay.mk rules/dhcp6relay.dep -DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) -DEP_FILES += $(shell git ls-files $(SPATH)) - -$(SONIC_DHCP6RELAY)_CACHE_MODE := GIT_CONTENT_SHA -$(SONIC_DHCP6RELAY)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) -$(SONIC_DHCP6RELAY)_DEP_FILES := $(DEP_FILES) diff --git a/rules/dhcp6relay.mk b/rules/dhcp6relay.mk deleted file mode 100644 index 204bf6fa34dd..000000000000 --- a/rules/dhcp6relay.mk +++ /dev/null @@ -1,12 +0,0 @@ -# SONiC DHCPV6 RELAY Package - -SONIC_DHCP6RELAY_VERSION = 1.0.0-0 -SONIC_DHCP6RELAY_PKG_NAME = dhcp6relay - -SONIC_DHCP6RELAY = sonic-$(SONIC_DHCP6RELAY_PKG_NAME)_$(SONIC_DHCP6RELAY_VERSION)_$(CONFIGURED_ARCH).deb -$(SONIC_DHCP6RELAY)_DEPENDS = $(LIBSWSSCOMMON) $(LIBHIREDIS) $(LIBSWSSCOMMON_DEV) $(LIBHIREDIS_DEV) -$(SONIC_DHCP6RELAY)_SRC_PATH = $(SRC_PATH)/$(SONIC_DHCP6RELAY_PKG_NAME) -SONIC_DPKG_DEBS += $(SONIC_DHCP6RELAY) - -SONIC_DHCP6RELAY_DBG = sonic-$(SONIC_DHCP6RELAY_PKG_NAME)-dbgsym_$(SONIC_DHCP6RELAY_VERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(SONIC_DHCP6RELAY),$(SONIC_DHCP6RELAY_DBG))) diff --git a/rules/dhcprelay.dep b/rules/dhcprelay.dep new file mode 100644 index 000000000000..5f6d77a84fc3 --- /dev/null +++ b/rules/dhcprelay.dep @@ -0,0 +1,11 @@ + +SPATH := $($(SONIC_DHCPRELAY)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/dhcprelay.mk rules/dhcprelay.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + +$(SONIC_DHCPRELAY)_CACHE_MODE := GIT_CONTENT_SHA +$(SONIC_DHCPRELAY)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SONIC_DHCPRELAY)_DEP_FILES := $(DEP_FILES) +$(SONIC_DHCPRELAY)_SMDEP_FILES := $(SMDEP_FILES) +$(SONIC_DHCPRELAY)_SMDEP_PATHS := $(SPATH) diff --git a/rules/dhcprelay.mk b/rules/dhcprelay.mk new file mode 100644 index 000000000000..0a32d7d54297 --- /dev/null +++ b/rules/dhcprelay.mk @@ -0,0 +1,12 @@ +# SONiC DHCPV6 RELAY Package + +SONIC_DHCPRELAY_VERSION = 1.0.0-0 +SONIC_DHCPRELAY_PKG_NAME = dhcp6relay + +SONIC_DHCPRELAY = sonic-$(SONIC_DHCPRELAY_PKG_NAME)_$(SONIC_DHCPRELAY_VERSION)_$(CONFIGURED_ARCH).deb +$(SONIC_DHCPRELAY)_DEPENDS = $(LIBSWSSCOMMON) $(LIBHIREDIS) $(LIBSWSSCOMMON_DEV) $(LIBHIREDIS_DEV) +$(SONIC_DHCPRELAY)_SRC_PATH = $(SRC_PATH)/dhcprelay +SONIC_DPKG_DEBS += $(SONIC_DHCPRELAY) + +SONIC_DHCPRELAY_DBG = sonic-$(SONIC_DHCPRELAY_PKG_NAME)-dbgsym_$(SONIC_DHCPRELAY_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(SONIC_DHCPRELAY),$(SONIC_DHCPRELAY_DBG))) diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index b742bff43b0d..c2db8d7ba538 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -6,10 +6,10 @@ DOCKER_DHCP_RELAY_DBG = $(DOCKER_DHCP_RELAY_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/$(DOCKER_DHCP_RELAY_STEM) -$(DOCKER_DHCP_RELAY)_DEPENDS += $(ISC_DHCP_RELAY) $(SONIC_DHCPMON) $(SONIC_DHCP6RELAY) $(LIBSWSSCOMMON) +$(DOCKER_DHCP_RELAY)_DEPENDS += $(ISC_DHCP_RELAY) $(SONIC_DHCPMON) $(SONIC_DHCPRELAY) $(LIBSWSSCOMMON) $(DOCKER_DHCP_RELAY)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) -$(DOCKER_DHCP_RELAY)_DBG_DEPENDS += $(ISC_DHCP_RELAY_DBG) $(SONIC_DHCP6RELAY_DBG) $(SONIC_DHCPMON_DBG) +$(DOCKER_DHCP_RELAY)_DBG_DEPENDS += $(ISC_DHCP_RELAY_DBG) $(SONIC_DHCPRELAY_DBG) $(SONIC_DHCPMON_DBG) $(DOCKER_DHCP_RELAY)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) diff --git a/src/dhcp6relay/.gitignore b/src/dhcp6relay/.gitignore deleted file mode 100644 index 9d09ae6b3f1a..000000000000 --- a/src/dhcp6relay/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -debian/* -!debian/changelog -!debian/compat -!debian/control -!debian/rules diff --git a/src/dhcp6relay/Makefile b/src/dhcp6relay/Makefile deleted file mode 100644 index dd384452a5fc..000000000000 --- a/src/dhcp6relay/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -RM := rm -rf -DHCP6RELAY_TARGET := dhcp6relay -CP := cp -MKDIR := mkdir -CC := g++ -MV := mv -LIBS := -levent -lhiredis -lswsscommon -pthread -lboost_thread -lboost_system -CFLAGS += -Wall -std=c++17 -fPIE -I$(PWD)/../sonic-swss-common/common -PWD := $(shell pwd) - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(strip $(C_DEPS)),) --include $(C_DEPS) $(OBJS) -endif -endif - --include src/subdir.mk - -all: sonic-dhcp6relay - -sonic-dhcp6relay: $(OBJS) - @echo 'Building target: $@' - @echo 'Invoking: G++ Linker' - $(CC) $(LDFLAGS) -o $(DHCP6RELAY_TARGET) $(OBJS) $(LIBS) - @echo 'Finished building target: $@' - @echo ' ' - -install: - $(MKDIR) -p $(DESTDIR)/usr/sbin - $(MV) $(DHCP6RELAY_TARGET) $(DESTDIR)/usr/sbin - -deinstall: - $(RM) $(DESTDIR)/usr/sbin/$(DHCP6RELAY_TARGET) - $(RM) -rf $(DESTDIR)/usr/sbin - -clean: - -$(RM) $(EXECUTABLES) $(C_DEPS) $(OBJS) $(DHCP6RELAY_TARGET) - -@echo ' ' - -.PHONY: all clean dependents - - diff --git a/src/dhcp6relay/debian/changelog b/src/dhcp6relay/debian/changelog deleted file mode 100644 index 67ed277049e5..000000000000 --- a/src/dhcp6relay/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -sonic-dhcp6relay (1.0.0-0) UNRELEASED; urgency=medium - - * Initial release. - --- Kelly Yeh diff --git a/src/dhcp6relay/debian/compat b/src/dhcp6relay/debian/compat deleted file mode 100644 index 48082f72f087..000000000000 --- a/src/dhcp6relay/debian/compat +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/src/dhcp6relay/debian/control b/src/dhcp6relay/debian/control deleted file mode 100644 index af7877fef9a8..000000000000 --- a/src/dhcp6relay/debian/control +++ /dev/null @@ -1,14 +0,0 @@ -Source: sonic-dhcp6relay -Section: devel -Priority: optional -Maintainer: Kelly Yeh -Build-Depends: debhelper (>= 12.0.0), libevent-dev, libboost-thread-dev, libboost-system-dev, libswsscommon-dev -Standards-Version: 3.9.3 -Homepage: https://github.com/Azure/sonic-buildimage -XS-Go-Import-Path: github.com/Azure/sonic-buildimage - -Package: sonic-dhcp6relay -Architecture: any -Built-Using: ${misc:Built-Using} -Depends: ${shlibs:Depends} -Description: SONiC DHCPv6 Relay diff --git a/src/dhcp6relay/debian/rules b/src/dhcp6relay/debian/rules deleted file mode 100755 index ac2cd63889ef..000000000000 --- a/src/dhcp6relay/debian/rules +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/make -f - -export DEB_BUILD_MAINT_OPTIONS=hardening=+all - -%: - dh $@ --parallel diff --git a/src/dhcp6relay/src/configInterface.cpp b/src/dhcp6relay/src/configInterface.cpp deleted file mode 100644 index ca78d80e63da..000000000000 --- a/src/dhcp6relay/src/configInterface.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include "configInterface.h" - -constexpr auto DEFAULT_TIMEOUT_MSEC = 1000; - -bool pollSwssNotifcation = true; -std::shared_ptr mSwssThreadPtr; - -std::shared_ptr configDbPtr = std::make_shared ("CONFIG_DB", 0); -swss::SubscriberStateTable ipHelpersTable(configDbPtr.get(), "DHCP_RELAY"); -swss::Select swssSelect; - -/** - * @code void initialize_swss() - * - * @brief initialize DB tables and start SWSS listening thread - * - * @return none - */ -void initialize_swss(std::vector *vlans) -{ - try { - swssSelect.addSelectable(&ipHelpersTable); - get_dhcp(vlans); - mSwssThreadPtr = std::make_shared (&handleSwssNotification, vlans); - } - catch (const std::bad_alloc &e) { - syslog(LOG_ERR, "Failed allocate memory. Exception details: %s", e.what()); - } -} - -/** - * @code void deinitialize_swss() - * - * @brief deinitialize DB interface and join SWSS listening thread - * - * @return none - */ -void deinitialize_swss() -{ - stopSwssNotificationPoll(); - mSwssThreadPtr->interrupt(); -} - - -/** - * @code void get_dhcp(std::vector *vlans) - * - * @brief initialize and get vlan table information from DHCP_RELAY - * - * @return none - */ -void get_dhcp(std::vector *vlans) { - swss::Selectable *selectable; - int ret = swssSelect.select(&selectable, DEFAULT_TIMEOUT_MSEC); - if (ret == swss::Select::ERROR) { - syslog(LOG_WARNING, "Select: returned ERROR"); - } else if (ret == swss::Select::TIMEOUT) { - } - if (selectable == static_cast (&ipHelpersTable)) { - handleRelayNotification(ipHelpersTable, vlans); - } -} -/** - * @code void handleSwssNotification(std::vector *vlans) - * - * @brief main thread for handling SWSS notification - * - * @param context list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void handleSwssNotification(std::vector *vlans) -{ - while (pollSwssNotifcation) { - get_dhcp(vlans); - } -} - -/** - * @code void handleRelayNotification(swss::SubscriberStateTable &ipHelpersTable, std::vector *vlans) - * - * @brief handles DHCPv6 relay configuration change notification - * - * @param ipHelpersTable DHCP table - * @param vlans list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void handleRelayNotification(swss::SubscriberStateTable &ipHelpersTable, std::vector *vlans) -{ - std::deque entries; - - ipHelpersTable.pops(entries); - processRelayNotification(entries, vlans); -} - -/** - * @code void processRelayNotification(std::deque &entries, std::vector *vlans) - * - * @brief process DHCPv6 relay servers and options configuration change notification - * - * @param entries queue of std::tuple> entries in DHCP table - * @param vlans list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void processRelayNotification(std::deque &entries, std::vector *vlans) -{ - std::vector servers; - - for (auto &entry: entries) { - std::string vlan = kfvKey(entry); - std::string operation = kfvOp(entry); - std::vector fieldValues = kfvFieldsValues(entry); - - relay_config intf; - intf.is_option_79 = true; - intf.interface = vlan; - intf.db = nullptr; - for (auto &fieldValue: fieldValues) { - std::string f = fvField(fieldValue); - std::string v = fvValue(fieldValue); - if(f == "dhcpv6_servers") { - std::stringstream ss(v); - while (ss.good()) { - std::string substr; - getline(ss, substr, ','); - intf.servers.push_back(substr); - } - syslog(LOG_DEBUG, "key: %s, Operation: %s, f: %s, v: %s", vlan.c_str(), operation.c_str(), f.c_str(), v.c_str()); - } - if(f == "dhcpv6_option|rfc6939_support" && v == "false") { - intf.is_option_79 = false; - } - } - vlans->push_back(intf); - } -} - -/** -*@code stopSwssNotificationPoll -* -*@brief stop SWSS listening thread -* -*@return none -*/ -void stopSwssNotificationPoll() { - pollSwssNotifcation = false; -}; diff --git a/src/dhcp6relay/src/configInterface.h b/src/dhcp6relay/src/configInterface.h deleted file mode 100644 index 20b0912c5cef..000000000000 --- a/src/dhcp6relay/src/configInterface.h +++ /dev/null @@ -1,75 +0,0 @@ -#include -#include "subscriberstatetable.h" -#include "select.h" -#include "relay.h" - -/** - * @code void initialize_swss() - * - * @brief initialize DB tables and start SWSS listening thread - * - * @return none - */ -void initialize_swss(std::vector *vlans); - -/** - * @code void deinitialize_swss() - * - * @brief deinitialize DB interface and join SWSS listening thread - * - * @return none - */ -void deinitialize_swss(); - -/** - * @code void get_dhcp(std::vector *vlans) - * - * @brief initialize and get vlan information from DHCP_RELAY - * - * @return none - */ -void get_dhcp(std::vector *vlans); - -/** - * @code void handleSwssNotification(std::vector *vlans) - * - * @brief main thread for handling SWSS notification - * - * @param vlans list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void handleSwssNotification(std::vector *vlans); - -/** - * @code void handleRelayNotification(swss::SubscriberStateTable &ipHelpersTable, std::vector *vlans) - * - * @brief handles DHCPv6 relay configuration change notification - * - * @param ipHelpersTable DHCP table - * @param vlans list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void handleRelayNotification(swss::SubscriberStateTable &configMuxTable, std::vector *vlans); - -/** - * @code void processRelayNotification(std::deque &entries, std::vector *vlans) - * - * @brief process DHCPv6 relay servers and options configuration change notification - * - * @param entries queue of std::tuple> entries in DHCP table - * @param context list of vlans/argument config that contains strings of server and option - * - * @return none - */ -void processRelayNotification(std::deque &entries, std::vector *vlans); - -/** -*@code stopSwssNotificationPoll -* -*@brief stop SWSS listening thread -* -*@return none -*/ -void stopSwssNotificationPoll(); diff --git a/src/dhcp6relay/src/main.cpp b/src/dhcp6relay/src/main.cpp deleted file mode 100644 index 9f5bc74bcfa0..000000000000 --- a/src/dhcp6relay/src/main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include "configInterface.h" - -int main(int argc, char *argv[]) { - try { - std::vector vlans; - swss::DBConnector state_db("STATE_DB", 0); - initialize_swss(&vlans); - loop_relay(&vlans, &state_db); - } - catch (std::exception &e) - { - syslog(LOG_ERR, "An exception occurred.\n"); - return 1; - } - return 0; -} diff --git a/src/dhcp6relay/src/relay.cpp b/src/dhcp6relay/src/relay.cpp deleted file mode 100644 index 5233fe579fdc..000000000000 --- a/src/dhcp6relay/src/relay.cpp +++ /dev/null @@ -1,861 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "configdb.h" -#include "sonicv2connector.h" -#include "dbconnector.h" -#include "configInterface.h" - - -struct event *listen_event; -struct event *server_listen_event; -struct event_base *base; -struct event *ev_sigint; -struct event *ev_sigterm; -static std::string counter_table = "DHCPv6_COUNTER_TABLE|"; - -/* DHCPv6 filter */ -/* sudo tcpdump -dd "ip6 dst ff02::1:2 && udp dst port 547" */ - -static struct sock_filter ether_relay_filter[] = { - - { 0x28, 0, 0, 0x0000000c }, - { 0x15, 0, 13, 0x000086dd }, - { 0x20, 0, 0, 0x00000026 }, - { 0x15, 0, 11, 0xff020000 }, - { 0x20, 0, 0, 0x0000002a }, - { 0x15, 0, 9, 0x00000000 }, - { 0x20, 0, 0, 0x0000002e }, - { 0x15, 0, 7, 0x00000000 }, - { 0x20, 0, 0, 0x00000032 }, - { 0x15, 0, 5, 0x00010002 }, - { 0x30, 0, 0, 0x00000014 }, - { 0x15, 0, 3, 0x00000011 }, - { 0x28, 0, 0, 0x00000038 }, - { 0x15, 0, 1, 0x00000223 }, - { 0x6, 0, 0, 0x00040000 }, - { 0x6, 0, 0, 0x00000000 }, -}; -const struct sock_fprog ether_relay_fprog = { - lengthof(ether_relay_filter), - ether_relay_filter -}; - -/* DHCPv6 Counter */ -uint64_t counters[DHCPv6_MESSAGE_TYPE_COUNT]; -std::map counterMap = {{DHCPv6_MESSAGE_TYPE_UNKNOWN, "Unknown"}, - {DHCPv6_MESSAGE_TYPE_SOLICIT, "Solicit"}, - {DHCPv6_MESSAGE_TYPE_ADVERTISE, "Advertise"}, - {DHCPv6_MESSAGE_TYPE_REQUEST, "Request"}, - {DHCPv6_MESSAGE_TYPE_CONFIRM, "Confirm"}, - {DHCPv6_MESSAGE_TYPE_RENEW, "Renew"}, - {DHCPv6_MESSAGE_TYPE_REBIND, "Rebind"}, - {DHCPv6_MESSAGE_TYPE_REPLY, "Reply"}, - {DHCPv6_MESSAGE_TYPE_RELEASE, "Release"}, - {DHCPv6_MESSAGE_TYPE_DECLINE, "Decline"}, - {DHCPv6_MESSAGE_TYPE_RECONFIGURE, "Reconfigure"}, - {DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST, "Information-Request"}, - {DHCPv6_MESSAGE_TYPE_RELAY_FORW, "Relay-Forward"}, - {DHCPv6_MESSAGE_TYPE_RELAY_REPL, "Relay-Reply"}, - {DHCPv6_MESSAGE_TYPE_MALFORMED, "Malformed"}}; - -/** - * @code void initialize_counter(swss::DBConnector *db, std::string counterVlan); - * - * @brief initialize the counter by each Vlan - * - * @param swss::DBConnector *db state_db connector - * @param counterVlan counter table with interface name - * - * @return none - */ -void initialize_counter(swss::DBConnector *db, std::string counterVlan) { - db->hset(counterVlan, "Unknown", toString(counters[DHCPv6_MESSAGE_TYPE_UNKNOWN])); - db->hset(counterVlan, "Solicit", toString(counters[DHCPv6_MESSAGE_TYPE_SOLICIT])); - db->hset(counterVlan, "Advertise", toString(counters[DHCPv6_MESSAGE_TYPE_ADVERTISE])); - db->hset(counterVlan, "Request", toString(counters[DHCPv6_MESSAGE_TYPE_REQUEST])); - db->hset(counterVlan, "Confirm", toString(counters[DHCPv6_MESSAGE_TYPE_CONFIRM])); - db->hset(counterVlan, "Renew", toString(counters[DHCPv6_MESSAGE_TYPE_RENEW])); - db->hset(counterVlan, "Rebind", toString(counters[DHCPv6_MESSAGE_TYPE_REBIND])); - db->hset(counterVlan, "Reply", toString(counters[DHCPv6_MESSAGE_TYPE_REPLY])); - db->hset(counterVlan, "Release", toString(counters[DHCPv6_MESSAGE_TYPE_RELEASE])); - db->hset(counterVlan, "Decline", toString(counters[DHCPv6_MESSAGE_TYPE_DECLINE])); - db->hset(counterVlan, "Reconfigure", toString(counters[DHCPv6_MESSAGE_TYPE_RECONFIGURE])); - db->hset(counterVlan, "Information-Request", toString(counters[DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST])); - db->hset(counterVlan, "Relay-Forward", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_FORW])); - db->hset(counterVlan, "Relay-Reply", toString(counters[DHCPv6_MESSAGE_TYPE_RELAY_REPL])); - db->hset(counterVlan, "Malformed", toString(counters[DHCPv6_MESSAGE_TYPE_MALFORMED])); -} - -/** - * @code void update_counter(swss::DBConnector *db, std::string CounterVlan, uint8_t msg_type); - * - * @brief update the counter in state_db with count of each DHCPv6 message type - * - * @param swss::DBConnector *db state_db connector - * @param counterVlan counter table with interface name - * @param msg_type dhcpv6 message type to be updated in counter - * - * @return none - */ -void update_counter(swss::DBConnector *db, std::string counterVlan, uint8_t msg_type) { - db->hset(counterVlan, counterMap.find(msg_type)->second, toString(counters[msg_type])); -} - -/** - * @code std::string toString(uint16_t count); - * - * @brief convert uint16_t to string - * - * @param count count of messages in counter - * - * @return count in string - */ -std::string toString(uint16_t count) { - std::stringstream ss; - ss << count; - std::string countValue = ss.str(); - return countValue; -} - -/** - * @code const struct ether_header *parse_ether_frame(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through ethernet frame - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return ether_header end of ethernet header position - */ -const struct ether_header *parse_ether_frame(const uint8_t *buffer, const uint8_t **out_end) { - (*out_end) = buffer + sizeof(struct ether_header); - return (const struct ether_header *)buffer; -} - -/** - * @code const struct ip6_hdr *parse_ip6_hdr(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through ipv6 header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return ip6_hdr end of ipv6 header position - */ -const struct ip6_hdr *parse_ip6_hdr(const uint8_t *buffer, const uint8_t **out_end) { - (*out_end) = buffer + sizeof(struct ip6_hdr); - return (struct ip6_hdr *)buffer; -} - -/** - * @code const struct udphdr *parse_udp(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through udp header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return udphdr end of udp header position - */ -const struct udphdr *parse_udp(const uint8_t *buffer, const uint8_t **out_end) { - (*out_end) = buffer + sizeof(struct udphdr); - return (const struct udphdr *)buffer; -} - -/** - * @code const struct dhcpv6_msg *parse_dhcpv6_hdr(const uint8_t *buffer); - * - * @brief parse through dhcpv6 header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_msg end of dhcpv6 header position - */ -const struct dhcpv6_msg *parse_dhcpv6_hdr(const uint8_t *buffer) { - return (const struct dhcpv6_msg *)buffer; -} - -/** - * @code const struct dhcpv6_relay_msg *parse_dhcpv6_relay(const uint8_t *buffer); - * - * @brief parse through dhcpv6 relay message - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_relay_msg start of dhcpv6 relay message or end of dhcpv6 message type position - */ -const struct dhcpv6_relay_msg *parse_dhcpv6_relay(const uint8_t *buffer) { - return (const struct dhcpv6_relay_msg *)buffer; -} - -/** - * @code const struct dhcpv6_option *parse_dhcpv6_opt(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through dhcpv6 option - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_option end of dhcpv6 message option - */ -const struct dhcpv6_option *parse_dhcpv6_opt(const uint8_t *buffer, const uint8_t **out_end) { - auto option = (const struct dhcpv6_option *)buffer; - uint8_t size = 4; // option-code + option-len - size += *(uint16_t *)(buffer); - (*out_end) = buffer + size + ntohs(option->option_length); - - return option; -} - -/** - * @code void send_udp(int sock, uint8_t *buffer, struct sockaddr_in6 target, uint32_t n, relay_config *config, uint8_t msg_type); - * - * @brief send udp packet - * - * @param *buffer message buffer - * @param sockaddr_in6 target target socket - * @param n length of message - * @param relay_config *config pointer to relay_config - * @param uint8_t msg_type message type of dhcpv6 option of relayed message - * - * @return dhcpv6_option end of dhcpv6 message option - */ -void send_udp(int sock, uint8_t *buffer, struct sockaddr_in6 target, uint32_t n, relay_config *config, uint8_t msg_type) { - std::string counterVlan = counter_table; - if(sendto(sock, buffer, n, 0, (const struct sockaddr *)&target, sizeof(target)) == -1) - syslog(LOG_ERR, "sendto: Failed to send to target address\n"); - else if (counterMap.find(msg_type) != counterMap.end()) { - counters[msg_type]++; - update_counter(config->db, counterVlan.append(config->interface), msg_type); - } else { - syslog(LOG_WARNING, "unexpected message type %d(0x%x)\n", msg_type, msg_type); - } -} - -/** - * @code relay_forward(uint8_t *buffer, const struct dhcpv6_msg *msg, uint16_t msg_length); - * - * @brief embed the DHCPv6 message received into DHCPv6 relay forward message - * - * @param buffer pointer to buffer - * @param msg pointer to parsed DHCPv6 message - * @param msg_length length of DHCPv6 message - * - * @return none - */ -void relay_forward(uint8_t *buffer, const struct dhcpv6_msg *msg, uint16_t msg_length) { - struct dhcpv6_option option; - option.option_code = htons(OPTION_RELAY_MSG); - option.option_length = htons(msg_length); - memcpy(buffer, &option, sizeof(struct dhcpv6_option)); - memcpy(buffer + sizeof(struct dhcpv6_option), msg, msg_length); -} - -/** - * @code sock_open(int ifindex, const struct sock_fprog *fprog); - * - * @brief prepare L2 socket to attach to "udp and port 547" filter - * - * @param ifindex interface index - * @param fprog bpf filter "udp and port 547" - * - * @return socket descriptor - */ -int sock_open(int ifindex, const struct sock_fprog *fprog) -{ - if (!ifindex) { - errno = EINVAL; - return -1; - } - - int s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); - if (s == -1) { - syslog(LOG_ERR, "socket: Failed to create socket\n"); - return -1; - } - - struct sockaddr_ll sll = { - .sll_family = AF_PACKET, - .sll_protocol = htons(ETH_P_ALL), - .sll_ifindex = ifindex - }; - - if (bind(s, (struct sockaddr *)&sll, sizeof sll) == -1) { - syslog(LOG_ERR, "bind: Failed to bind to specified interface\n"); - (void) close(s); - return -1; - } - - if (fprog && setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, fprog, sizeof *fprog) == -1) - { - syslog(LOG_ERR, "setsockopt: Failed to attach filter\n"); - (void) close(s); - return -1; - } - - return s; -} - -/** - * @code prepare_relay_config(relay_config *interface_config, int local_sock, int filter); - * - * @brief prepare for specified relay interface config: server and link address - * - * @param interface_config pointer to relay config to be prepared - * @param local_sock L3 socket used for relaying messages - * @param filter socket attached with filter - * - * @return none - */ -void prepare_relay_config(relay_config *interface_config, int *local_sock, int filter) { - struct ifaddrs *ifa, *ifa_tmp; - sockaddr_in6 non_link_local; - sockaddr_in6 link_local; - - interface_config->local_sock = *local_sock; - interface_config->filter = filter; - - for(auto server: interface_config->servers) { - sockaddr_in6 tmp; - if(inet_pton(AF_INET6, server.c_str(), &tmp.sin6_addr) != 1) - { - syslog(LOG_WARNING, "inet_pton: Failed to convert IPv6 address\n"); - } - tmp.sin6_family = AF_INET6; - tmp.sin6_flowinfo = 0; - tmp.sin6_port = htons(RELAY_PORT); - tmp.sin6_scope_id = 0; - interface_config->servers_sock.push_back(tmp); - } - - if (getifaddrs(&ifa) == -1) { - syslog(LOG_WARNING, "getifaddrs: Unable to get network interfaces\n"); - exit(1); - } - - ifa_tmp = ifa; - while (ifa_tmp) { - if (ifa_tmp->ifa_addr && ifa_tmp->ifa_addr->sa_family == AF_INET6) { - struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; - if((strcmp(ifa_tmp->ifa_name, interface_config->interface.c_str()) == 0) && !IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - non_link_local = *in6; - break; - } - if((strcmp(ifa_tmp->ifa_name, interface_config->interface.c_str()) == 0) && IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - link_local = *in6; - } - } - ifa_tmp = ifa_tmp->ifa_next; - } - freeifaddrs(ifa); - - if(!IN6_IS_ADDR_LINKLOCAL(&non_link_local.sin6_addr)) { - interface_config->link_address = non_link_local; - } - else { - interface_config->link_address = link_local; - } -} - -/** - * @code prepare_socket(int *local_sock, int *server_sock, relay_config *config, int index); - * - * @brief prepare L3 socket for sending - * - * @param local_sock pointer to socket binded to global address for relaying client message to server and listening for server message - * @param server_sock pointer to socket binded to link_local address for relaying server message to client - * @param index scope id of interface - * - * @return none - */ -void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int index) { - struct ifaddrs *ifa, *ifa_tmp; - sockaddr_in6 addr; - sockaddr_in6 ll_addr; - memset(&addr, 0, sizeof(addr)); - memset(&ll_addr, 0, sizeof(ll_addr)); - - if ((*local_sock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket: Failed to create socket on interface %s\n", config->interface.c_str()); - } - - if ((*server_sock= socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket: Failed to create socket on interface %s\n", config->interface.c_str()); - } - - int retry = 0; - bool bind_addr = false; - bool bind_ll_addr = false; - do { - if (getifaddrs(&ifa) == -1) { - syslog(LOG_WARNING, "getifaddrs: Unable to get network interfaces with %s\n", strerror(errno)); - } - else { - ifa_tmp = ifa; - while (ifa_tmp) { - if (ifa_tmp->ifa_addr && (ifa_tmp->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa_tmp->ifa_name, config->interface.c_str()) == 0)) { - struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr; - if(!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - bind_addr = true; - in6->sin6_family = AF_INET6; - in6->sin6_port = htons(RELAY_PORT); - addr = *in6; - } - if(IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr)) { - bind_ll_addr = true; - in6->sin6_family = AF_INET6; - in6->sin6_port = htons(RELAY_PORT); - ll_addr = *in6; - } - } - ifa_tmp = ifa_tmp->ifa_next; - } - freeifaddrs(ifa); - } - - if (bind_addr && bind_ll_addr) { - break; - } - - syslog(LOG_WARNING, "Retry #%d to bind to sockets on interface %s\n", ++retry, config->interface.c_str()); - sleep(5); - } while (retry < 6); - - if ((!bind_addr) || (bind(*local_sock, (sockaddr *)&addr, sizeof(addr)) == -1)) { - syslog(LOG_ERR, "bind: Failed to bind socket to global ipv6 address on interface %s after %d retries with %s\n", config->interface.c_str(), retry, strerror(errno)); - } - - if ((!bind_ll_addr) || (bind(*server_sock, (sockaddr *)&ll_addr, sizeof(addr)) == -1)) { - syslog(LOG_ERR, "bind: Failed to bind socket to link local ipv6 address on interface %s after %d retries with %s\n", config->interface.c_str(), retry, strerror(errno)); - } -} - - -/** - * @code relay_client(int sock, const uint8_t *msg, int32_t len, ip6_hdr *ip_hdr, const ether_header *ether_hdr, relay_config *config); - * - * @brief construct relay-forward message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param ip_hdr pointer to IPv6 header - * @param ether_hdr pointer to Ethernet header - * @param config pointer to the relay interface config - * - * @return none - */ -void relay_client(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, const ether_header *ether_hdr, relay_config *config) { - static uint8_t buffer[4096]; - auto current_buffer_position = buffer; - dhcpv6_relay_msg new_message; - new_message.msg_type = DHCPv6_MESSAGE_TYPE_RELAY_FORW; - memcpy(&new_message.peer_address, &ip_hdr->ip6_src, sizeof(in6_addr)); - new_message.hop_count = 0; - - memcpy(&new_message.link_address, &config->link_address.sin6_addr, sizeof(in6_addr)); - memcpy(current_buffer_position, &new_message, sizeof(dhcpv6_relay_msg)); - current_buffer_position += sizeof(dhcpv6_relay_msg); - - if(config->is_option_79) { - linklayer_addr_option option79; - option79.link_layer_type = htons(1); - option79.option_code = htons(OPTION_CLIENT_LINKLAYER_ADDR); - option79.option_length = htons(2 + 6); // link_layer_type field + address - - memcpy(current_buffer_position, &option79, sizeof(linklayer_addr_option)); - current_buffer_position += sizeof(linklayer_addr_option); - - memcpy(current_buffer_position, ðer_hdr->ether_shost, sizeof(ether_hdr->ether_shost)); - current_buffer_position += sizeof(ether_hdr->ether_shost); - } - - auto dhcp_message_length = len; - relay_forward(current_buffer_position, parse_dhcpv6_hdr(msg), dhcp_message_length); - current_buffer_position += dhcp_message_length + sizeof(dhcpv6_option); - - for(auto server: config->servers_sock) { - send_udp(sock, buffer, server, current_buffer_position - buffer, config, new_message.msg_type); - } -} - -/** - * @code relay_relay_forw(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, relay_config *config) - * - * @brief construct a relay-forward message encapsulated relay-forward message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param ip_hdr pointer to IPv6 header - * @param config pointer to the relay interface config - * - * @return none - */ -void relay_relay_forw(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, relay_config *config) { - static uint8_t buffer[4096]; - dhcpv6_relay_msg new_message; - auto current_buffer_position = buffer; - auto dhcp_relay_header = parse_dhcpv6_relay(msg); - - if (dhcp_relay_header->hop_count >= HOP_LIMIT) - return; - - new_message.msg_type = DHCPv6_MESSAGE_TYPE_RELAY_FORW; - memcpy(&new_message.peer_address, &ip_hdr->ip6_src, sizeof(in6_addr)); - new_message.hop_count = dhcp_relay_header->hop_count + 1; - - memset(&new_message.link_address, 0, sizeof(in6_addr)); - - memcpy(current_buffer_position, &new_message, sizeof(dhcpv6_relay_msg)); - current_buffer_position += sizeof(dhcpv6_relay_msg); - - auto dhcp_message_length = len; - relay_forward(current_buffer_position, parse_dhcpv6_hdr(msg), dhcp_message_length); - current_buffer_position += dhcp_message_length + sizeof(dhcpv6_option); - - for(auto server: config->servers_sock) { - send_udp(sock, buffer, server, current_buffer_position - buffer, config, new_message.msg_type); - } -} - -/** - * @code relay_relay_reply(int sock, const uint8_t *msg, int32_t len, relay_config *configs); - * - * @brief relay and unwrap a relay-reply message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param config relay interface config - * - * @return none - */ - void relay_relay_reply(int sock, const uint8_t *msg, int32_t len, relay_config *config) { - static uint8_t buffer[4096]; - uint8_t type = 0; - struct sockaddr_in6 target_addr; - auto current_buffer_position = buffer; - auto current_position = msg; - const uint8_t *tmp = NULL; - auto dhcp_relay_header = parse_dhcpv6_relay(msg); - current_position += sizeof(struct dhcpv6_relay_msg); - - auto position = current_position + sizeof(struct dhcpv6_option); - auto dhcpv6msg = parse_dhcpv6_hdr(position); - - while ((current_position - msg) < len) { - auto option = parse_dhcpv6_opt(current_position, &tmp); - current_position = tmp; - if (current_position - msg > len || ntohs(option->option_length) > sizeof(buffer) - (current_buffer_position - buffer)) { - break; - } - switch (ntohs(option->option_code)) { - case OPTION_RELAY_MSG: - memcpy(current_buffer_position, ((uint8_t *)option) + sizeof(struct dhcpv6_option), ntohs(option->option_length)); - current_buffer_position += ntohs(option->option_length); - type = dhcpv6msg->msg_type; - break; - default: - break; - } - } - - memcpy(&target_addr.sin6_addr, &dhcp_relay_header->peer_address, sizeof(struct in6_addr)); - target_addr.sin6_family = AF_INET6; - target_addr.sin6_flowinfo = 0; - target_addr.sin6_port = htons(CLIENT_PORT); - target_addr.sin6_scope_id = if_nametoindex(config->interface.c_str()); - - send_udp(sock, buffer, target_addr, current_buffer_position - buffer, config, type); -} - - -/** - * @code callback(evutil_socket_t fd, short event, void *arg); - * - * @brief callback for libevent that is called everytime data is received at the filter socket - * - * @param fd filter socket - * @param event libevent triggered event - * @param arg callback argument provided by user - * - * @return none - */ -void callback(evutil_socket_t fd, short event, void *arg) { - struct relay_config *config = (struct relay_config *)arg; - static uint8_t message_buffer[4096]; - std::string counterVlan = counter_table; - int32_t len = recv(config->filter, message_buffer, 4096, 0); - if (len <= 0) { - syslog(LOG_WARNING, "recv: Failed to receive data at filter socket: %s\n", strerror(errno)); - return; - } - - char* ptr = (char *)message_buffer; - const uint8_t *current_position = (uint8_t *)ptr; - const uint8_t *tmp = NULL; - const uint8_t *prev = NULL; - - auto ether_header = parse_ether_frame(current_position, &tmp); - current_position = tmp; - - auto ip_header = parse_ip6_hdr(current_position, &tmp); - current_position = tmp; - - prev = current_position; - if (ip_header->ip6_ctlun.ip6_un1.ip6_un1_nxt != IPPROTO_UDP) { - const struct ip6_ext *ext_header; - do { - ext_header = (const struct ip6_ext *)current_position; - current_position += ext_header->ip6e_len; - if((current_position == prev) || (current_position >= (uint8_t *)ptr + sizeof(message_buffer))) { - return; - } - prev = current_position; - } - while (ext_header->ip6e_nxt != IPPROTO_UDP); - } - - auto udp_header = parse_udp(current_position, &tmp); - current_position = tmp; - - auto msg = parse_dhcpv6_hdr(current_position); - auto option_position = current_position + sizeof(struct dhcpv6_msg); - - switch (msg->msg_type) { - case DHCPv6_MESSAGE_TYPE_RELAY_FORW: - { - relay_relay_forw(config->local_sock, current_position, ntohs(udp_header->len) - sizeof(udphdr), ip_header, config); - break; - } - case DHCPv6_MESSAGE_TYPE_SOLICIT: - case DHCPv6_MESSAGE_TYPE_REQUEST: - case DHCPv6_MESSAGE_TYPE_CONFIRM: - case DHCPv6_MESSAGE_TYPE_RENEW: - case DHCPv6_MESSAGE_TYPE_REBIND: - case DHCPv6_MESSAGE_TYPE_RELEASE: - case DHCPv6_MESSAGE_TYPE_DECLINE: - case DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST: - { - while (option_position - message_buffer < len) { - auto option = parse_dhcpv6_opt(option_position, &tmp); - option_position = tmp; - if (ntohs(option->option_code) > DHCPv6_OPTION_LIMIT) { - counters[DHCPv6_MESSAGE_TYPE_MALFORMED]++; - update_counter(config->db, counterVlan.append(config->interface), DHCPv6_MESSAGE_TYPE_MALFORMED); - syslog(LOG_WARNING, "DHCPv6 option is invalid or contains malformed payload\n"); - return; - } - } - counters[msg->msg_type]++; - update_counter(config->db, counterVlan.append(config->interface), msg->msg_type); - relay_client(config->local_sock, current_position, ntohs(udp_header->len) - sizeof(udphdr), ip_header, ether_header, config); - break; - } - default: - { - syslog(LOG_WARNING, "DHCPv6 client message received was not relayed\n"); - break; - } - } -} - -/** - * @code void server_callback(evutil_socket_t fd, short event, void *arg); - * - * @brief callback for libevent that is called everytime data is received at the server socket - * - * @param fd filter socket - * @param event libevent triggered event - * @param arg callback argument provided by user - * - * @return none - */ -void server_callback(evutil_socket_t fd, short event, void *arg) { - struct relay_config *config = (struct relay_config *)arg; - sockaddr_in6 from; - socklen_t len = sizeof(from); - int32_t data = 0; - static uint8_t message_buffer[4096]; - - if ((data = recvfrom(config->local_sock, message_buffer, 4096, 0, (sockaddr *)&from, &len)) == -1) { - syslog(LOG_WARNING, "recv: Failed to receive data from server\n"); - } - - auto msg = parse_dhcpv6_hdr(message_buffer); - counters[msg->msg_type]++; - std::string counterVlan = counter_table; - update_counter(config->db, counterVlan.append(config->interface), msg->msg_type); - if (msg->msg_type == DHCPv6_MESSAGE_TYPE_RELAY_REPL) { - relay_relay_reply(config->server_sock, message_buffer, data, config); - } -} - -/** - * @code signal_init(); - * - * @brief initialize DHCPv6 Relay libevent signals - */ -int signal_init() { - int rv = -1; - do { - ev_sigint = evsignal_new(base, SIGINT, signal_callback, base); - if (ev_sigint == NULL) { - syslog(LOG_ERR, "Could not create SIGINT libevent signal\n"); - break; - } - - ev_sigterm = evsignal_new(base, SIGTERM, signal_callback, base); - if (ev_sigterm == NULL) { - syslog(LOG_ERR, "Could not create SIGTERM libevent signal\n"); - break; - } - rv = 0; - } while(0); - return rv; -} - -/** - * @code signal_start(); - * - * @brief start DHCPv6 Relay libevent base and add signals - */ -int signal_start() -{ - int rv = -1; - do - { - if (evsignal_add(ev_sigint, NULL) != 0) { - syslog(LOG_ERR, "Could not add SIGINT libevent signal\n"); - break; - } - - if (evsignal_add(ev_sigterm, NULL) != 0) { - syslog(LOG_ERR, "Could not add SIGTERM libevent signal\n"); - break; - } - - if (event_base_dispatch(base) != 0) { - syslog(LOG_ERR, "Could not start libevent dispatching loop\n"); - } - - rv = 0; - } while (0); - - return rv; -} - -/** - * @code signal_callback(fd, event, arg); - * - * @brief signal handler for dhcp6relay. Initiate shutdown when signal is caught - * - * @param fd libevent socket - * @param event event triggered - * @param arg pointer to libevent base - * - * @return none - */ -void signal_callback(evutil_socket_t fd, short event, void *arg) -{ - syslog(LOG_ALERT, "Received signal: '%s'\n", strsignal(fd)); - if ((fd == SIGTERM) || (fd == SIGINT)) { - dhcp6relay_stop(); - } -} - -/** - * @code dhcp6relay_stop(); - * - * @brief stop DHCPv6 Relay libevent loop upon signal - */ -void dhcp6relay_stop() -{ - event_base_loopexit(base, NULL); -} - -/** - * @code loop_relay(std::vector *vlans, swss::DBConnector *db); - * - * @brief main loop: configure sockets, create libevent base, start server listener thread - * - * @param vlans list of vlans retrieved from config_db - * @param db state_db connector - */ -void loop_relay(std::vector *vlans, swss::DBConnector *db) { - std::vector sockets; - base = event_base_new(); - if(base == NULL) { - syslog(LOG_ERR, "libevent: Failed to create base\n"); - } - - for(relay_config &vlan : *vlans) { - relay_config *config = &vlan; - int filter = 0; - int local_sock = 0; - int server_sock = 0; - int index = if_nametoindex(config->interface.c_str()); - config->db = db; - - std::string counterVlan = counter_table; - initialize_counter(config->db, counterVlan.append(config->interface)); - - filter = sock_open(index, ðer_relay_fprog); - prepare_socket(&local_sock, &server_sock, config, index); - - config->local_sock = local_sock; - config->server_sock = server_sock; - - sockets.push_back(filter); - sockets.push_back(local_sock); - sockets.push_back(server_sock); - - prepare_relay_config(config, &local_sock, filter); - - evutil_make_listen_socket_reuseable(filter); - evutil_make_socket_nonblocking(filter); - - evutil_make_listen_socket_reuseable(local_sock); - evutil_make_socket_nonblocking(local_sock); - - listen_event = event_new(base, filter, EV_READ|EV_PERSIST, callback, config); - server_listen_event = event_new(base, local_sock, EV_READ|EV_PERSIST, server_callback, config); - if (listen_event == NULL || server_listen_event == NULL) { - syslog(LOG_ERR, "libevent: Failed to create libevent\n"); - } - - event_add(listen_event, NULL); - event_add(server_listen_event, NULL); - } - - if((signal_init() == 0) && signal_start() == 0) { - shutdown(); - for(std::size_t i = 0; i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define PACKED __attribute__ ((packed)) - -#define RELAY_PORT 547 -#define CLIENT_PORT 546 -#define HOP_LIMIT 8 //HOP_LIMIT reduced from 32 to 8 as stated in RFC8415 -#define DHCPv6_OPTION_LIMIT 56 // DHCPv6 option code greater than 56 are currently unassigned - -#define lengthof(A) (sizeof (A) / sizeof (A)[0]) - -#define OPTION_RELAY_MSG 9 -#define OPTION_CLIENT_LINKLAYER_ADDR 79 - -/* DHCPv6 message types */ -typedef enum -{ - DHCPv6_MESSAGE_TYPE_UNKNOWN = 0, - DHCPv6_MESSAGE_TYPE_SOLICIT = 1, - DHCPv6_MESSAGE_TYPE_ADVERTISE = 2, - DHCPv6_MESSAGE_TYPE_REQUEST = 3, - DHCPv6_MESSAGE_TYPE_CONFIRM = 4, - DHCPv6_MESSAGE_TYPE_RENEW = 5, - DHCPv6_MESSAGE_TYPE_REBIND = 6, - DHCPv6_MESSAGE_TYPE_REPLY = 7, - DHCPv6_MESSAGE_TYPE_RELEASE = 8, - DHCPv6_MESSAGE_TYPE_DECLINE = 9, - DHCPv6_MESSAGE_TYPE_RECONFIGURE = 10, - DHCPv6_MESSAGE_TYPE_INFORMATION_REQUEST = 11, - DHCPv6_MESSAGE_TYPE_RELAY_FORW = 12, - DHCPv6_MESSAGE_TYPE_RELAY_REPL = 13, - DHCPv6_MESSAGE_TYPE_MALFORMED = 14, - - DHCPv6_MESSAGE_TYPE_COUNT -} dhcp_message_type_t; - -struct relay_config { - int local_sock; - int server_sock; - int filter; - sockaddr_in6 link_address; - swss::DBConnector *db; - std::string interface; - std::vector servers; - std::vector servers_sock; - bool is_option_79; -}; - - -/* DHCPv6 messages and options */ - -struct dhcpv6_msg { - uint8_t msg_type; - uint8_t xid[3]; -}; - -struct PACKED dhcpv6_relay_msg { - uint8_t msg_type; - uint8_t hop_count; - struct in6_addr link_address; - struct in6_addr peer_address; -}; - - -struct dhcpv6_option { - uint16_t option_code; - uint16_t option_length; -}; - -struct linklayer_addr_option { - uint16_t option_code; - uint16_t option_length; - uint16_t link_layer_type; -}; - -/** - * @code sock_open(int ifindex, const struct sock_fprog *fprog); - * - * @brief prepare L2 socket to attach to "udp and port 547" filter - * - * @param ifindex interface index - * @param fprog bpf filter "udp and port 547" - * - * @return socket descriptor - */ -int sock_open(int ifindex, const struct sock_fprog *fprog); - -/** - * @code prepare_socket(int *local_sock, int *server_sock, relay_config *config, int index); - * - * @brief prepare L3 socket for sending - * - * @param local_sock pointer to socket binded to global address for relaying client message to server and listening for server message - * @param server_sock pointer to socket binded to link_local address for relaying server message to client - * @param index scope id of interface - * - * @return none - */ -void prepare_socket(int *local_sock, int *server_sock, relay_config *config, int index); - -/** - * @code prepare_relay_config(relay_config *interface_config, int local_sock, int filter); - * - * @brief prepare for specified relay interface config: server and link address - * - * @param interface_config pointer to relay config to be prepared - * @param local_sock L3 socket used for relaying messages - * @param filter socket attached with filter - * - * @return none - */ -void prepare_relay_config(relay_config *interface_config, int *local_sock, int filter); - -/** - * @code relay_forward(uint8_t *buffer, const struct dhcpv6_msg *msg, uint16_t msg_length); - * - * @brief embed the DHCPv6 message received into DHCPv6 relay forward message - * - * @param buffer pointer to buffer - * @param msg pointer to parsed DHCPv6 message - * @param msg_length length of DHCPv6 message - * - * @return none - */ -void relay_forward(uint8_t *buffer, const struct dhcpv6_msg *msg, uint16_t msg_length); - -/** - * @code relay_client(int sock, const uint8_t *msg, int32_t len, ip6_hdr *ip_hdr, const ether_header *ether_hdr, relay_config *config); - * - * @brief construct relay-forward message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param ip_hdr pointer to IPv6 header - * @param ether_hdr pointer to Ethernet header - * @param config pointer to the relay interface config - * - * @return none - */ -void relay_client(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, const ether_header *ether_hdr, relay_config *config); - -/** - * @code relay_relay_forw(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, relay_config *config) - * - * @brief construct a relay-forward message encapsulated relay-forward message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param ip_hdr pointer to IPv6 header - * @param config pointer to the relay interface config - * - * @return none - */ -void relay_relay_forw(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_hdr, relay_config *config); - -/** - * @code relay_relay_reply(int sock, const uint8_t *msg, int32_t len, relay_config *configs); - * - * @brief relay and unwrap a relay-reply message - * - * @param sock L3 socket for sending data to servers - * @param msg pointer to dhcpv6 message header position - * @param len size of data received - * @param config relay interface config - * - * @return none - */ -void relay_relay_reply(int sock, const uint8_t *msg, int32_t len, relay_config *configs); - -/** - * @code loop_relay(std::vector *vlans, swss::DBConnector *db); - * - * @brief main loop: configure sockets, create libevent base, start server listener thread - * - * @param vlans list of vlans retrieved from config_db - * @param db state_db connector - */ -void loop_relay(std::vector *vlans, swss::DBConnector *db); - -/** - * @code signal_init(); - * - * @brief initialize DHCPv6 Relay libevent signals - */ -int signal_init(); - -/** - * @code signal_start(); - * - * @brief start DHCPv6 Relay libevent base and add signals - */ -int signal_start(); - -/** - * @code dhcp6relay_stop(); - * - * @brief stop DHCPv6 Relay libevent loop upon signal - */ -void dhcp6relay_stop(); - -/** - * @code signal_callback(fd, event, arg); - * - * @brief signal handler for dhcp6relay. Initiate shutdown when signal is caught - * - * @param fd libevent socket - * @param event event triggered - * @param arg pointer to libevent base - * - * @return none - */ -void signal_callback(evutil_socket_t fd, short event, void *arg); - -/** - * @code shutdown(); - * - * @brief free signals and terminate threads - */ -void shutdown(); - -/** - * @code void initialize_counter(swss::DBConnector *db, std::string counterVlan); - * - * @brief initialize the counter by each Vlan - * - * @param swss::DBConnector *db state_db connector - * @param counterVlan counter table with interface name - * - * @return none - */ -void initialize_counter(swss::DBConnector *db, std::string counterVlan); - -/** - * @code void update_counter(swss::DBConnector *db, std::string CounterVlan, uint8_t msg_type); - * - * @brief update the counter in state_db with count of each DHCPv6 message type - * - * @param swss::DBConnector *db state_db connector - * @param counterVlan counter table with interface name - * @param msg_type dhcpv6 message type to be updated in counter - * - * @return none - */ -void update_counter(swss::DBConnector *db, std::string counterVlan, uint8_t msg_type); - -/* Helper functions */ - -/** - * @code std::string toString(uint16_t count); - * - * @brief convert uint16_t to string - * - * @param count count of messages in counter - * - * @return count in string - */ -std::string toString(uint16_t count); - -/** - * @code const struct ether_header *parse_ether_frame(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through ethernet frame - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return ether_header end of ethernet header position - */ -const struct ether_header *parse_ether_frame(const uint8_t *buffer, const uint8_t **out_end); - -/** - * @code const struct ip6_hdr *parse_ip6_hdr(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through ipv6 header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return ip6_hdr end of ipv6 header position - */ -const struct ip6_hdr *parse_ip6_hdr(const uint8_t *buffer, const uint8_t **out_end); - -/** - * @code const struct udphdr *parse_udp(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through udp header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return udphdr end of udp header position - */ -const struct udphdr *parse_udp(const uint8_t *buffer, const uint8_t **out_end); - -/** - * @code const struct dhcpv6_msg *parse_dhcpv6_hdr(const uint8_t *buffer); - * - * @brief parse through dhcpv6 header - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_msg end of dhcpv6 header position - */ -const struct dhcpv6_msg *parse_dhcpv6_hdr(const uint8_t *buffer); - -/** - * @code const struct dhcpv6_relay_msg *parse_dhcpv6_relay(const uint8_t *buffer); - * - * @brief parse through dhcpv6 relay message - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_relay_msg start of dhcpv6 relay message or end of dhcpv6 message type position - */ -const struct dhcpv6_relay_msg *parse_dhcpv6_relay(const uint8_t *buffer); - -/** - * @code const struct dhcpv6_option *parse_dhcpv6_opt(const uint8_t *buffer, const uint8_t **out_end); - * - * @brief parse through dhcpv6 option - * - * @param *buffer message buffer - * @param **out_end pointer - * - * @return dhcpv6_option end of dhcpv6 message option - */ -const struct dhcpv6_option *parse_dhcpv6_opt(const uint8_t *buffer, const uint8_t **out_end); - -/** - * @code void send_udp(int sock, uint8_t *buffer, struct sockaddr_in6 target, uint32_t n, relay_config *config, uint8_t msg_type); - * - * @brief send udp packet - * - * @param *buffer message buffer - * @param sockaddr_in6 target target socket - * @param n length of message - * @param relay_config *config pointer to relay_config - * @param uint8_t msg_type message type of dhcpv6 option of relayed message - * - * @return dhcpv6_option end of dhcpv6 message option - */ -void send_udp(int sock, uint8_t *buffer, struct sockaddr_in6 target, uint32_t n, relay_config *config, uint8_t msg_type); - diff --git a/src/dhcp6relay/src/subdir.mk b/src/dhcp6relay/src/subdir.mk deleted file mode 100644 index 1c93d490ec63..000000000000 --- a/src/dhcp6relay/src/subdir.mk +++ /dev/null @@ -1,23 +0,0 @@ -CC := g++ - -C_SRCS += \ -../src/relay.c \ -../src/configInterface.c \ -../src/main.c - -OBJS += \ -./src/relay.o \ -./src/configInterface.o \ -./src/main.o - -C_DEPS += \ -./src/relay.d \ -./src/configInterface.d \ -./src/main.d - -src/%.o: src/%.cpp - @echo 'Building file: $<' - @echo 'Invoking: GCC C++ Compiler' - $(CC) -D__FILENAME__="$(subst src/,,$<)" $(CFLAGS) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' diff --git a/src/dhcprelay b/src/dhcprelay new file mode 160000 index 000000000000..6f94c2ededb3 --- /dev/null +++ b/src/dhcprelay @@ -0,0 +1 @@ +Subproject commit 6f94c2ededb39ef4cdab788e295a041b2aec12b4 From d0ae99d979433249f3d96ac0028d0f64a4953cf2 Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Tue, 12 Jul 2022 10:07:50 -0700 Subject: [PATCH 533/817] [submodule] Advance sonic-utilties submodule (#11402) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 04dbdf6f2c12..28926b0f80ae 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 04dbdf6f2c12a8d8f5d09ff466ccd6ea9dfd5c20 +Subproject commit 28926b0f80ae5fb4228d5ba2743ec146f69c7963 From 4f959746696dcf010bb1d4906f63df1d0c540e1f Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Tue, 12 Jul 2022 10:08:58 -0700 Subject: [PATCH 534/817] Add load_minigraph option to include traffic-shift-away during config migration (#11403) --- files/image_config/config-setup/config-setup | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/files/image_config/config-setup/config-setup b/files/image_config/config-setup/config-setup index b151437b9e25..7ddf4530fe5d 100755 --- a/files/image_config/config-setup/config-setup +++ b/files/image_config/config-setup/config-setup @@ -109,7 +109,15 @@ run_hookdir() { reload_minigraph() { echo "Reloading minigraph..." - config load_minigraph -y -n + if + [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]] || + [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.type | tr [:upper:] [:lower:])" == *"leafrouter"* ]]; + then + #Keep device isolated with traffic-shift-away option on LeafRouter and Dualtor + config load_minigraph -y -n -t + else + config load_minigraph -y -n + fi config save -y } From 61b52a2af7c74cc78f3b265de42e21a30cc30212 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 26 Apr 2022 21:26:52 +0000 Subject: [PATCH 535/817] [buffer] create infrastructure to enable buffer/QoS profiles Signed-off-by: Ying Xie --- .../Celestica-DX010-C32/BALANCED | 1 + .../Celestica-DX010-C32/RDMA-CENTRIC | 1 + .../Celestica-DX010-C32/TCP-CENTRIC | 1 + .../Celestica-DX010-C32/buffer_ports_t0.j2 | 13 +++++ .../Celestica-DX010-C32/buffer_ports_t1.j2 | 13 +++++ .../buffers_defaults_t0.j2 | 55 +------------------ .../buffers_defaults_t1.j2 | 55 +------------------ .../Celestica-DX010-C32/pg_profile_lookup.ini | 18 +----- .../Celestica-DX010-C32/qos.json.j2 | 22 +------- .../th/gen/BALANCED/buffers_defaults_t0.j2 | 41 ++++++++++++++ .../th/gen/BALANCED/buffers_defaults_t1.j2 | 41 ++++++++++++++ .../th/gen/BALANCED/pg_profile_lookup.ini | 17 ++++++ .../profiles/th/gen/BALANCED/qos.json.j2 | 21 +++++++ .../gen/RDMA-CENTRIC/buffers_defaults_t0.j2 | 41 ++++++++++++++ .../gen/RDMA-CENTRIC/buffers_defaults_t1.j2 | 41 ++++++++++++++ .../th/gen/RDMA-CENTRIC/pg_profile_lookup.ini | 17 ++++++ .../profiles/th/gen/RDMA-CENTRIC/qos.json.j2 | 21 +++++++ device/common/profiles/th/gen/TCP-CENTRIC | 1 + 18 files changed, 274 insertions(+), 146 deletions(-) create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 create mode 100644 device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini create mode 100644 device/common/profiles/th/gen/BALANCED/qos.json.j2 create mode 100644 device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini create mode 100644 device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 create mode 120000 device/common/profiles/th/gen/TCP-CENTRIC diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC new file mode 120000 index 000000000000..a05581efb9ff --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 new file mode 100644 index 000000000000..c33d873068a4 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 @@ -0,0 +1,13 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 new file mode 100644 index 000000000000..c33d873068a4 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 @@ -0,0 +1,13 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 deleted file mode 100644 index c90327229bbe..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,54 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '300m' - } --%} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,32) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 deleted file mode 100644 index c79f848645cc..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,54 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '300m' - } --%} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,32) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9bb..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..b96563b0a796 --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..56df5787c56a --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini new file mode 100644 index 000000000000..673df369a9bb --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 90272 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 53248 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 96096 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/gen/BALANCED/qos.json.j2 b/device/common/profiles/th/gen/BALANCED/qos.json.j2 new file mode 100644 index 000000000000..34002048afdb --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..b96563b0a796 --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..56df5787c56a --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 000000000000..673df369a9bb --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 90272 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 53248 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 96096 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 000000000000..34002048afdb --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/gen/TCP-CENTRIC b/device/common/profiles/th/gen/TCP-CENTRIC new file mode 120000 index 000000000000..d6f7127aa748 --- /dev/null +++ b/device/common/profiles/th/gen/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file From cd21ee33dce186ae5ba0a388df09b4e51ad74375 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 27 Apr 2022 20:35:41 +0800 Subject: [PATCH 536/817] [Buffer] Separate buffer profile for Force10-S6100 Signed-off-by: Kevin Wang --- .../th/6100/BALANCED/buffers_defaults_t0.j2 | 42 ++++++++++++++++ .../th/6100/BALANCED/buffers_defaults_t1.j2 | 42 ++++++++++++++++ .../th/6100/BALANCED/pg_profile_lookup.ini | 17 +++++++ .../profiles/th/6100/BALANCED/qos.json.j2 | 21 ++++++++ .../6100/RDMA-CENTRIC/buffers_defaults_t0.j2 | 42 ++++++++++++++++ .../6100/RDMA-CENTRIC/buffers_defaults_t1.j2 | 42 ++++++++++++++++ .../6100/RDMA-CENTRIC/pg_profile_lookup.ini | 17 +++++++ .../profiles/th/6100/RDMA-CENTRIC/qos.json.j2 | 21 ++++++++ device/common/profiles/th/6100/TCP-CENTRIC | 1 + .../Force10-S6100/BALANCED | 1 + .../Force10-S6100/RDMA-CENTRIC | 1 + .../Force10-S6100/TCP-CENTRIC | 1 + .../Force10-S6100/buffer_ports_t0.j2 | 6 +++ .../Force10-S6100/buffer_ports_t1.j2 | 6 +++ .../Force10-S6100/buffers_defaults_t0.j2 | 48 +------------------ .../Force10-S6100/buffers_defaults_t1.j2 | 48 +------------------ .../Force10-S6100/pg_profile_lookup.ini | 18 +------ .../Force10-S6100/qos.json.j2 | 22 +-------- 18 files changed, 264 insertions(+), 132 deletions(-) create mode 100644 device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini create mode 100644 device/common/profiles/th/6100/BALANCED/qos.json.j2 create mode 100644 device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini create mode 100644 device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 create mode 120000 device/common/profiles/th/6100/TCP-CENTRIC create mode 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED create mode 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC create mode 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 mode change 100644 => 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 mode change 100644 => 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 mode change 100644 => 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini mode change 100644 => 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 diff --git a/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..ec7e2a23b566 --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..e408a5c92cf6 --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini new file mode 100644 index 000000000000..0b5d680edda7 --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 79872 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 56160 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 85696 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/6100/BALANCED/qos.json.j2 b/device/common/profiles/th/6100/BALANCED/qos.json.j2 new file mode 100644 index 000000000000..34002048afdb --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..ec7e2a23b566 --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..e408a5c92cf6 --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 000000000000..0b5d680edda7 --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 79872 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 56160 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 85696 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 000000000000..34002048afdb --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/6100/TCP-CENTRIC b/device/common/profiles/th/6100/TCP-CENTRIC new file mode 120000 index 000000000000..d6f7127aa748 --- /dev/null +++ b/device/common/profiles/th/6100/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED new file mode 120000 index 000000000000..6f064064664a --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/6100/BALANCED \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC new file mode 120000 index 000000000000..4ab30f5ff42f --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/6100/RDMA-CENTRIC \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC new file mode 120000 index 000000000000..d5d3a5b671b5 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/6100/TCP-CENTRIC \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 new file mode 100644 index 000000000000..ae201eb2593a --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 new file mode 100644 index 000000000000..ae201eb2593a --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 deleted file mode 100644 index 048188a39e95..000000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 deleted file mode 100644 index 1c825b21640c..000000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini deleted file mode 100644 index 0b5d680edda7..000000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 79872 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 56160 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 85696 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From e5d77d779d43d078b3457907472ea4daf817d5ed Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 27 Apr 2022 19:38:44 +0800 Subject: [PATCH 537/817] [Buffer] Separate buffer profile for Celestica-DX010-D48C8 Signed-off-by: Kevin Wang --- .../Celestica-DX010-D48C8/BALANCED | 1 + .../Celestica-DX010-D48C8/RDMA-CENTRIC | 1 + .../Celestica-DX010-D48C8/TCP-CENTRIC | 1 + .../Celestica-DX010-D48C8/buffer_ports_t0.j2 | 28 ++++++++ .../buffers_defaults_t0.j2 | 70 +------------------ .../pg_profile_lookup.ini | 18 +---- .../Celestica-DX010-D48C8/qos.json.j2 | 22 +----- 7 files changed, 34 insertions(+), 107 deletions(-) create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC create mode 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini mode change 100644 => 120000 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC new file mode 120000 index 000000000000..a05581efb9ff --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 new file mode 100644 index 000000000000..b4f4f7bab3f3 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 @@ -0,0 +1,28 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,9) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(14,17) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,31) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,13) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(18,21) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 deleted file mode 100644 index 046ec1e65450..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,69 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '300m' - } --%} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,9) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(14,17) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(22,31) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(10,13) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(18,21) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9bb..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From 12197666008e55363f4e3e85f822e4c5c68e2d84 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 27 Apr 2022 21:57:50 +0800 Subject: [PATCH 538/817] [Buffer] Separate buffer profile for Arista-7060CX-32S-Q32 Signed-off-by: Kevin Wang --- .../Arista-7060CX-32S-Q32/BALANCED | 1 + .../Arista-7060CX-32S-Q32/RDMA-CENTRIC | 1 + .../Arista-7060CX-32S-Q32/TCP-CENTRIC | 1 + .../Arista-7060CX-32S-Q32/buffer_ports_t0.j2 | 6 +++ .../Arista-7060CX-32S-Q32/buffer_ports_t1.j2 | 6 +++ .../buffers_defaults_t0.j2 | 48 +------------------ .../buffers_defaults_t1.j2 | 48 +------------------ .../pg_profile_lookup.ini | 18 +------ .../Arista-7060CX-32S-Q32/qos.json.j2 | 22 +-------- 9 files changed, 19 insertions(+), 132 deletions(-) create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC new file mode 120000 index 000000000000..a05581efb9ff --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 new file mode 100644 index 000000000000..2f41924b4fcf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 new file mode 100644 index 000000000000..2f41924b4fcf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 deleted file mode 100644 index 1876253b33c2..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 deleted file mode 100644 index e1a7200cc57f..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9bb..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From 686ad1883d8e999ef8c175eed4e4433646207afa Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 27 Apr 2022 21:53:28 +0800 Subject: [PATCH 539/817] [Buffer] Separate buffer profile for Arista-7060CX-32S-D48C8 Signed-off-by: Kevin Wang --- .../Arista-7060CX-32S-D48C8/BALANCED | 1 + .../Arista-7060CX-32S-D48C8/RDMA-CENTRIC | 1 + .../Arista-7060CX-32S-D48C8/TCP-CENTRIC | 1 + .../buffer_ports_t0.j2 | 21 +++++++ .../buffers_defaults_t0.j2 | 62 +------------------ .../pg_profile_lookup.ini | 18 +----- .../Arista-7060CX-32S-D48C8/qos.json.j2 | 22 +------ 7 files changed, 27 insertions(+), 99 deletions(-) create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC new file mode 120000 index 000000000000..a05581efb9ff --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 new file mode 100644 index 000000000000..fdbff09c12d4 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 @@ -0,0 +1,21 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,6) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,22) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(24,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(6,10) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,24) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 deleted file mode 100644 index f7d50aa4f35e..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,61 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,6) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(10,22) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(26,32) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(6,10) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(22,26) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini deleted file mode 100644 index 0b5d680edda7..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 79872 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 56160 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 85696 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From fc88c1350e198a183531609e16acff40e906a356 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Wed, 27 Apr 2022 20:59:30 +0800 Subject: [PATCH 540/817] [Buffer] Separate buffer profile for Arista-7060CX-32S-C32 Signed-off-by: Kevin Wang --- .../Arista-7060CX-32S-C32/BALANCED | 1 + .../Arista-7060CX-32S-C32/RDMA-CENTRIC | 1 + .../Arista-7060CX-32S-C32/TCP-CENTRIC | 1 + .../Arista-7060CX-32S-C32/buffer_ports_t0.j2 | 6 +++ .../Arista-7060CX-32S-C32/buffer_ports_t1.j2 | 6 +++ .../buffers_defaults_t0.j2 | 48 +------------------ .../buffers_defaults_t1.j2 | 48 +------------------ .../pg_profile_lookup.ini | 18 +------ .../Arista-7060CX-32S-C32/qos.json.j2 | 22 +-------- 9 files changed, 19 insertions(+), 132 deletions(-) create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC new file mode 120000 index 000000000000..a05581efb9ff --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 new file mode 100644 index 000000000000..2f41924b4fcf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 new file mode 100644 index 000000000000..2f41924b4fcf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 deleted file mode 100644 index 1876253b33c2..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 deleted file mode 100644 index e1a7200cc57f..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9bb..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 deleted file mode 100644 index 34002048afdb..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From dba7b21b30d8b639bc13a70bcb9c0c7574015318 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Thu, 28 Apr 2022 17:13:16 +0800 Subject: [PATCH 541/817] [Buffer] Separate buffer profile for Arista-7260CX3-C64 50G data is not accurate, needs further update. Signed-off-by: Kevin Wang --- .../Arista-7260CX3-C64/BALANCED | 1 + .../Arista-7260CX3-C64/RDMA-CENTRIC | 1 + .../Arista-7260CX3-C64/TCP-CENTRIC | 1 + .../Arista-7260CX3-C64/buffer_ports_t0.j2 | 6 + .../Arista-7260CX3-C64/buffer_ports_t1.j2 | 6 + .../Arista-7260CX3-C64/buffers_defaults_t0.j2 | 57 +--- .../Arista-7260CX3-C64/buffers_defaults_t1.j2 | 67 +--- .../Arista-7260CX3-C64/pg_profile_lookup.ini | 9 +- .../Arista-7260CX3-C64/qos.json.j2 | 293 +----------------- .../th2/7260/BALANCED/buffers_defaults_t0.j2 | 51 +++ .../th2/7260/BALANCED/buffers_defaults_t1.j2 | 61 ++++ .../th2/7260/BALANCED/pg_profile_lookup.ini | 11 + .../profiles/th2/7260/BALANCED/qos.json.j2 | 292 +++++++++++++++++ .../7260/RDMA-CENTRIC/buffers_defaults_t0.j2 | 51 +++ .../7260/RDMA-CENTRIC/buffers_defaults_t1.j2 | 61 ++++ .../7260/RDMA-CENTRIC/pg_profile_lookup.ini | 11 + .../th2/7260/RDMA-CENTRIC/qos.json.j2 | 292 +++++++++++++++++ device/common/profiles/th2/7260/TCP-CENTRIC | 1 + 18 files changed, 850 insertions(+), 422 deletions(-) create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 create mode 100644 device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini create mode 100644 device/common/profiles/th2/7260/BALANCED/qos.json.j2 create mode 100644 device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 create mode 100644 device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 create mode 100644 device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini create mode 100644 device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 create mode 120000 device/common/profiles/th2/7260/TCP-CENTRIC diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED new file mode 120000 index 000000000000..a270c70ffc36 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC new file mode 120000 index 000000000000..8d1ec6d277a8 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC new file mode 120000 index 000000000000..7ee783aac6a4 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 new file mode 100644 index 000000000000..2d56c4b38f9e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 new file mode 100644 index 000000000000..2d56c4b38f9e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 deleted file mode 100644 index bee86a9b3a85..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 +++ /dev/null @@ -1,56 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} -{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} -{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "{{ ingress_lossless_pool_size }}", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "{{ egress_lossy_pool_size }}", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{% import 'buffers_extra_queues.j2' as defs with context %} - -{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 deleted file mode 100644 index 469f5fc4001a..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 +++ /dev/null @@ -1,66 +0,0 @@ -{%- set default_cable = '300m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- import 'buffers_pool_sizes_t1.j2' as defs with context %} -{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} -{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - {# SS Tab2 Row 71 #} - "size": "{{ ingress_lossless_pool_size }}", - "type": "ingress", - "mode": "dynamic", - {# SS Tab2 Row 68 #} - "xoff": "8965632" - }, - "egress_lossy_pool": { - {# SS Tab2 Row 60 #} - "size": "{{ egress_lossy_pool_size }}", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - {# SS Tab2 Row 56 #} - "size": "43481152", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - {# SS Tab1 Row 9 #} - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"0", - {# SS Tab2 Row 56 #} - "static_th":"43481152" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{% import 'buffers_extra_queues.j2' as defs1 with context %} -{% import 'buffers_extra_pgs.j2' as defs2 with context %} - -{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} -{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} -{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini deleted file mode 100644 index 0e71479fc2c2..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini +++ /dev/null @@ -1,8 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 100000 5m 1248 1248 54080 -3 2496 - 100000 40m 1248 1248 59696 -3 2496 - 100000 300m 1248 1248 101088 -3 2496 - 40000 5m 1248 1248 29536 -3 2496 - 40000 40m 1248 1248 31616 -3 2496 - 40000 300m 1248 1248 48256 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 deleted file mode 100644 index cb3ad17faa39..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 +++ /dev/null @@ -1,292 +0,0 @@ -{% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} -{%- macro generate_dscp_to_tc_map() %} - "DSCP_TO_TC_MAP": { - "AZURE": { - "0" : "1", - "1" : "1", - "2" : "2", - "3" : "3", - "4" : "4", - "5" : "1", - "6" : "6", - "7" : "1", - "8" : "0", - "9" : "1", - "10": "1", - "11": "1", - "12": "1", - "13": "1", - "14": "1", - "15": "1", - "16": "1", - "17": "1", - "18": "1", - "19": "1", - "20": "1", - "21": "1", - "22": "1", - "23": "1", - "24": "1", - "25": "1", - "26": "1", - "27": "1", - "28": "1", - "29": "1", - "30": "1", - "31": "1", - "32": "1", - "33": "1", - "34": "1", - "35": "1", - "36": "1", - "37": "1", - "38": "1", - "39": "1", - "40": "1", - "41": "1", - "42": "1", - "43": "1", - "44": "1", - "45": "1", - "46": "5", - "47": "1", - "48": "7", - "49": "1", - "50": "1", - "51": "1", - "52": "1", - "53": "1", - "54": "1", - "55": "1", - "56": "1", - "57": "1", - "58": "1", - "59": "1", - "60": "1", - "61": "1", - "62": "1", - "63": "1" - } - }, -{%- endmacro %} -{%- macro generate_tc_to_pg_map() %} - "TC_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "0", - "2": "2", - "3": "3", - "4": "4", - "5": "0", - "6": "6", - "7": "0" - } - }, -{%- endmacro %} -{% elif ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR') %} -{%- macro generate_dscp_to_tc_map() %} - "DSCP_TO_TC_MAP": { - "AZURE": { - "0" : "1", - "1" : "1", - "2" : "1", - "3" : "3", - "4" : "4", - "5" : "1", - "6" : "1", - "7" : "1", - "8" : "0", - "9" : "1", - "10": "1", - "11": "1", - "12": "1", - "13": "1", - "14": "1", - "15": "1", - "16": "1", - "17": "1", - "18": "1", - "19": "1", - "20": "1", - "21": "1", - "22": "1", - "23": "1", - "24": "1", - "25": "1", - "26": "1", - "27": "1", - "28": "1", - "29": "1", - "30": "1", - "31": "1", - "32": "1", - "33": "8", - "34": "1", - "35": "1", - "36": "1", - "37": "1", - "38": "1", - "39": "1", - "40": "1", - "41": "1", - "42": "1", - "43": "1", - "44": "1", - "45": "1", - "46": "5", - "47": "1", - "48": "7", - "49": "1", - "50": "1", - "51": "1", - "52": "1", - "53": "1", - "54": "1", - "55": "1", - "56": "1", - "57": "1", - "58": "1", - "59": "1", - "60": "1", - "61": "1", - "62": "1", - "63": "1" - }, - "AZURE_TUNNEL": { - "0" : "1", - "1" : "1", - "2" : "1", - "3" : "3", - "4" : "4", - "5" : "1", - "6" : "1", - "7" : "1", - "8" : "0", - "9" : "1", - "10": "1", - "11": "1", - "12": "1", - "13": "1", - "14": "1", - "15": "1", - "16": "1", - "17": "1", - "18": "1", - "19": "1", - "20": "1", - "21": "1", - "22": "1", - "23": "1", - "24": "1", - "25": "1", - "26": "1", - "27": "1", - "28": "1", - "29": "1", - "30": "1", - "31": "1", - "32": "1", - "33": "8", - "34": "1", - "35": "1", - "36": "1", - "37": "1", - "38": "1", - "39": "1", - "40": "1", - "41": "1", - "42": "1", - "43": "1", - "44": "1", - "45": "1", - "46": "5", - "47": "1", - "48": "7", - "49": "1", - "50": "1", - "51": "1", - "52": "1", - "53": "1", - "54": "1", - "55": "1", - "56": "1", - "57": "1", - "58": "1", - "59": "1", - "60": "1", - "61": "1", - "62": "1", - "63": "1" - } - }, -{%- endmacro %} -{%- macro generate_tc_to_pg_map() %} - "TC_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "0", - "2": "2", - "3": "3", - "4": "4", - "5": "0", - "6": "6", - "7": "0", - "8": "0" - }, - "AZURE_TUNNEL": { - "0": "0", - "1": "0", - "2": "0", - "3": "2", - "4": "6", - "5": "0", - "6": "0", - "7": "0", - "8": "0" - } - }, -{%- endmacro %} -{%- macro generate_tc_to_queue_map() %} - "TC_TO_QUEUE_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "2": "1", - "3": "3", - "4": "4", - "5": "5", - "6": "6", - "7": "7", - "8": "1" - }, - "AZURE_TUNNEL": { - "0": "0", - "1": "1", - "2": "1", - "3": "2", - "4": "6", - "5": "5", - "6": "1", - "7": "7", - "8": "1" - } - }, -{%- endmacro %} -{%- macro generate_tc_to_dscp_map() %} - "TC_TO_DSCP_MAP": { - "AZURE_TUNNEL": { - "0": "8", - "1": "0", - "2": "0", - "3": "2", - "4": "6", - "5": "46", - "6": "0", - "7": "48", - "8": "33" - } - }, -{%- endmacro %} -{% endif %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..2d8e7cafe17e --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,51 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..118dba43177a --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,61 @@ +{%- set default_cable = '300m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- import 'buffers_pool_sizes_t1.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + {# SS Tab2 Row 71 #} + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic", + {# SS Tab2 Row 68 #} + "xoff": "8965632" + }, + "egress_lossy_pool": { + {# SS Tab2 Row 60 #} + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + {# SS Tab2 Row 56 #} + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + {# SS Tab1 Row 9 #} + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + {# SS Tab2 Row 56 #} + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs1 with context %} +{% import 'buffers_extra_pgs.j2' as defs2 with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} +{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} +{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini new file mode 100644 index 000000000000..9d94e3fc1e52 --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,11 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 5m 1248 1248 54080 -3 2496 + 100000 40m 1248 1248 59696 -3 2496 + 100000 300m 1248 1248 101088 -3 2496 + 50000 5m 1248 1248 54080 -3 2496 + 50000 40m 1248 1248 59696 -3 2496 + 50000 300m 1248 1248 101088 -3 2496 + 40000 5m 1248 1248 29536 -3 2496 + 40000 40m 1248 1248 31616 -3 2496 + 40000 300m 1248 1248 48256 -3 2496 diff --git a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 new file mode 100644 index 000000000000..cb3ad17faa39 --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 @@ -0,0 +1,292 @@ +{% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0" + } + }, +{%- endmacro %} +{% elif ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "8", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "8", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0", + "8": "0" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0", + "8": "0" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_queue_map() %} + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "1" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7", + "8": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_dscp_map() %} + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48", + "8": "33" + } + }, +{%- endmacro %} +{% endif %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..2d8e7cafe17e --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,51 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..118dba43177a --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,61 @@ +{%- set default_cable = '300m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- import 'buffers_pool_sizes_t1.j2' as defs with context %} +{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} +{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + {# SS Tab2 Row 71 #} + "size": "{{ ingress_lossless_pool_size }}", + "type": "ingress", + "mode": "dynamic", + {# SS Tab2 Row 68 #} + "xoff": "8965632" + }, + "egress_lossy_pool": { + {# SS Tab2 Row 60 #} + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + {# SS Tab2 Row 56 #} + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + {# SS Tab1 Row 9 #} + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + {# SS Tab2 Row 56 #} + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} + +{% import 'buffers_extra_queues.j2' as defs1 with context %} +{% import 'buffers_extra_pgs.j2' as defs2 with context %} + +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} +{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} +{%- endmacro %} +{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} +{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 000000000000..9d94e3fc1e52 --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,11 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 5m 1248 1248 54080 -3 2496 + 100000 40m 1248 1248 59696 -3 2496 + 100000 300m 1248 1248 101088 -3 2496 + 50000 5m 1248 1248 54080 -3 2496 + 50000 40m 1248 1248 59696 -3 2496 + 50000 300m 1248 1248 101088 -3 2496 + 40000 5m 1248 1248 29536 -3 2496 + 40000 40m 1248 1248 31616 -3 2496 + 40000 300m 1248 1248 48256 -3 2496 diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 000000000000..cb3ad17faa39 --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,292 @@ +{% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0" + } + }, +{%- endmacro %} +{% elif ('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR') %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "8", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + }, + "AZURE_TUNNEL": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "8", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0", + "8": "0" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "0", + "8": "0" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_queue_map() %} + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "1", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "1" + }, + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7", + "8": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_dscp_map() %} + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48", + "8": "33" + } + }, +{%- endmacro %} +{% endif %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/TCP-CENTRIC b/device/common/profiles/th2/7260/TCP-CENTRIC new file mode 120000 index 000000000000..d6f7127aa748 --- /dev/null +++ b/device/common/profiles/th2/7260/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file From 96dc42d0b9eb6b8b816912d8fb7ef7b6c56afe78 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Thu, 28 Apr 2022 17:19:43 +0800 Subject: [PATCH 542/817] [Buffer] Separate buffer profile for Arista-7260CX3-D108C8 Signed-off-by: Kevin Wang --- .../Arista-7260CX3-D108C8/BALANCED | 1 + .../Arista-7260CX3-D108C8/RDMA-CENTRIC | 1 + .../Arista-7260CX3-D108C8/TCP-CENTRIC | 1 + .../Arista-7260CX3-D108C8/buffer_ports_t0.j2 | 14 ++++ .../buffers_defaults_t0.j2 | 65 +------------------ .../pg_profile_lookup.ini | 9 +-- .../Arista-7260CX3-D108C8/qos.json.j2 | 2 +- 7 files changed, 20 insertions(+), 73 deletions(-) create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED new file mode 120000 index 000000000000..a270c70ffc36 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC new file mode 120000 index 000000000000..8d1ec6d277a8 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC new file mode 120000 index 000000000000..7ee783aac6a4 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 new file mode 100644 index 000000000000..3e209865c308 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 @@ -0,0 +1,14 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,12) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(20,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(12,20) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 deleted file mode 100644 index 5ac1d2d2aef9..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,64 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,12) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(20,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(12,20) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} -{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} -{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "{{ ingress_lossless_pool_size }}", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "{{ egress_lossy_pool_size }}", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{% import 'buffers_extra_queues.j2' as defs with context %} - -{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini deleted file mode 100644 index ed0005610b71..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini +++ /dev/null @@ -1,8 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 50000 40m 1248 1248 96096 -3 2496 - 100000 40m 1248 1248 177632 -3 2496 - 50000 300m 1248 1248 141856 -3 2496 - 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 index f0ee02749724..aef6b6765cf2 120000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 @@ -1 +1 @@ -../Arista-7260CX3-C64/qos.json.j2 \ No newline at end of file +BALANCED/qos.json.j2 \ No newline at end of file From b8b7a0f4fc87cc4cdfba47a38797f688aecc269b Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Thu, 28 Apr 2022 17:21:46 +0800 Subject: [PATCH 543/817] [Buffer] Separate buffer profile for Arista-7260CX3-Q64 Signed-off-by: Kevin Wang --- .../Arista-7260CX3-Q64/BALANCED | 1 + .../Arista-7260CX3-Q64/RDMA-CENTRIC | 1 + .../Arista-7260CX3-Q64/TCP-CENTRIC | 1 + .../Arista-7260CX3-Q64/buffer_ports_t0.j2 | 6 ++ .../Arista-7260CX3-Q64/buffer_ports_t1.j2 | 6 ++ .../Arista-7260CX3-Q64/buffers_defaults_t0.j2 | 57 +---------------- .../Arista-7260CX3-Q64/buffers_defaults_t1.j2 | 61 +------------------ .../buffers_pool_sizes_t1.j2 | 1 + .../Arista-7260CX3-Q64/pg_profile_lookup.ini | 12 +--- .../Arista-7260CX3-Q64/qos.json.j2 | 2 +- 10 files changed, 20 insertions(+), 128 deletions(-) create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 create mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t1.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED new file mode 120000 index 000000000000..a270c70ffc36 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC new file mode 120000 index 000000000000..8d1ec6d277a8 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC new file mode 120000 index 000000000000..7ee783aac6a4 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 new file mode 100644 index 000000000000..2d56c4b38f9e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t1.j2 new file mode 100644 index 000000000000..2d56c4b38f9e --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 deleted file mode 100644 index bee86a9b3a85..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 +++ /dev/null @@ -1,56 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} -{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} -{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "{{ ingress_lossless_pool_size }}", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "{{ egress_lossy_pool_size }}", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{% import 'buffers_extra_queues.j2' as defs with context %} - -{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 deleted file mode 100644 index c73fde73562b..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 +++ /dev/null @@ -1,60 +0,0 @@ -{%- set default_cable = '300m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- import 'buffers_pool_sizes_t0.j2' as defs with context %} -{%- set ingress_lossless_pool_size = defs.ingress_lossless_pool_size %} -{%- set egress_lossy_pool_size = defs.egress_lossy_pool_size %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "{{ ingress_lossless_pool_size }}", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "{{ egress_lossy_pool_size }}", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} - -{% import 'buffers_extra_queues.j2' as defs1 with context %} -{% import 'buffers_extra_pgs.j2' as defs2 with context %} - -{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} -{{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} -{%- endmacro %} -{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} -{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 new file mode 120000 index 000000000000..c25cc95d6d57 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t1.j2 new file mode 120000 index 000000000000..138e7f373e74 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_pool_sizes_t1.j2 @@ -0,0 +1 @@ +../Arista-7260CX3-C64/buffers_pool_sizes_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini deleted file mode 100644 index ac33b4f961fb..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini +++ /dev/null @@ -1,11 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 40000 5m 1248 1248 56160 -3 2496 - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 40000 40m 1248 1248 71552 -3 2496 - 50000 40m 1248 1248 96096 -3 2496 - 100000 40m 1248 1248 177632 -3 2496 - 40000 300m 1248 1248 108160 -3 2496 - 50000 300m 1248 1248 141856 -3 2496 - 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 index f0ee02749724..aef6b6765cf2 120000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 @@ -1 +1 @@ -../Arista-7260CX3-C64/qos.json.j2 \ No newline at end of file +BALANCED/qos.json.j2 \ No newline at end of file From 55e72a3397bff7f19a35a284e55789355249e467 Mon Sep 17 00:00:00 2001 From: zzhiyuan Date: Tue, 22 Feb 2022 09:11:05 -0800 Subject: [PATCH 544/817] [Arista] [201811] Add Arista-7260CX3-D96C16 HWSKU (#10034) Why I did it This was an ask by Microsoft to provide: 7260 config.bcm file for hardware sku Arista-7260CX3-D92C16 (Named Arista-7260CX3-D96C16). There are 16 100G uplinks: Ethernet13-20/1 Ethernet45-52/1 All other ports are breakout to 2 50G ports. How I did it Copied existing Arista-7260CX3-D108C8 HWSKU and altered the bcm.config and port_config.ini files. How to verify it The new 100G ports do come up with a 201811 image using this HWSKU. Co-authored-by: Zhi Yuan (Carl) Zhao --- .../Arista-7260CX3-D96C16/buffers.json.j2 | 3 + .../buffers_defaults_t0.j2 | 61 ++ .../pg_profile_lookup.ini | 8 + .../Arista-7260CX3-D96C16/port_config.ini | 115 +++ .../Arista-7260CX3-D96C16/qos.json.j2 | 1 + .../Arista-7260CX3-D96C16/sai.profile | 1 + .../th2-a7260cx3-64-96x50G+16x100G.config.bcm | 922 ++++++++++++++++++ 7 files changed, 1111 insertions(+) create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 new file mode 100644 index 000000000000..e6e9e844469b --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't0' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..178502e287ae --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 @@ -0,0 +1,61 @@ +{%- set default_cable = '5m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,12) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(12,20) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(20,44) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(44,52) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(52,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33329088", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "26663272", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini new file mode 100644 index 000000000000..ed0005610b71 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini @@ -0,0 +1,8 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 50000 5m 1248 1248 56160 -3 2496 + 100000 5m 1248 1248 96928 -3 2496 + 50000 40m 1248 1248 96096 -3 2496 + 100000 40m 1248 1248 177632 -3 2496 + 50000 300m 1248 1248 141856 -3 2496 + 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini new file mode 100644 index 000000000000..49bd6fd68856 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini @@ -0,0 +1,115 @@ +# name lanes alias index speed +Ethernet0 77,78 Ethernet1/1 1 50000 +Ethernet2 79,80 Ethernet1/3 1 50000 +Ethernet4 65,66 Ethernet2/1 2 50000 +Ethernet6 67,68 Ethernet2/3 2 50000 +Ethernet8 85,86 Ethernet3/1 3 50000 +Ethernet10 87,88 Ethernet3/3 3 50000 +Ethernet12 89,90 Ethernet4/1 4 50000 +Ethernet14 91,92 Ethernet4/3 4 50000 +Ethernet16 109,110 Ethernet5/1 5 50000 +Ethernet18 111,112 Ethernet5/3 5 50000 +Ethernet20 97,98 Ethernet6/1 6 50000 +Ethernet22 99,100 Ethernet6/3 6 50000 +Ethernet24 5,6 Ethernet7/1 7 50000 +Ethernet26 7,8 Ethernet7/3 7 50000 +Ethernet28 13,14 Ethernet8/1 8 50000 +Ethernet30 15,16 Ethernet8/3 8 50000 +Ethernet32 25,26 Ethernet9/1 9 50000 +Ethernet34 27,28 Ethernet9/3 9 50000 +Ethernet36 21,22 Ethernet10/1 10 50000 +Ethernet38 23,24 Ethernet10/3 10 50000 +Ethernet40 37,38 Ethernet11/1 11 50000 +Ethernet42 39,40 Ethernet11/3 11 50000 +Ethernet44 45,46 Ethernet12/1 12 50000 +Ethernet46 47,48 Ethernet12/3 12 50000 +Ethernet48 57,58,59,60 Ethernet13/1 13 100000 +Ethernet52 53,54,55,56 Ethernet14/1 14 100000 +Ethernet56 117,118,119,120 Ethernet15/1 15 100000 +Ethernet60 121,122,123,124 Ethernet16/1 16 100000 +Ethernet64 141,142,143,144 Ethernet17/1 17 100000 +Ethernet68 133,134,135,136 Ethernet18/1 18 100000 +Ethernet72 197,198,199,200 Ethernet19/1 19 100000 +Ethernet76 205,206,207,208 Ethernet20/1 20 100000 +Ethernet80 217,218 Ethernet21/1 21 50000 +Ethernet82 219,220 Ethernet21/3 21 50000 +Ethernet84 213,214 Ethernet22/1 22 50000 +Ethernet86 215,216 Ethernet22/3 22 50000 +Ethernet88 229,230 Ethernet23/1 23 50000 +Ethernet90 231,232 Ethernet23/3 23 50000 +Ethernet92 237,238 Ethernet24/1 24 50000 +Ethernet94 239,240 Ethernet24/3 24 50000 +Ethernet96 249,250 Ethernet25/1 25 50000 +Ethernet98 251,252 Ethernet25/3 25 50000 +Ethernet100 245,246 Ethernet26/1 26 50000 +Ethernet102 247,248 Ethernet26/3 26 50000 +Ethernet104 149,150 Ethernet27/1 27 50000 +Ethernet106 151,152 Ethernet27/3 27 50000 +Ethernet108 153,154 Ethernet28/1 28 50000 +Ethernet110 155,156 Ethernet28/3 28 50000 +Ethernet112 173,174 Ethernet29/1 29 50000 +Ethernet114 175,176 Ethernet29/3 29 50000 +Ethernet116 161,162 Ethernet30/1 30 50000 +Ethernet118 163,164 Ethernet30/3 30 50000 +Ethernet120 181,182 Ethernet31/1 31 50000 +Ethernet122 183,184 Ethernet31/3 31 50000 +Ethernet124 185,186 Ethernet32/1 32 50000 +Ethernet126 187,188 Ethernet32/3 32 50000 +Ethernet128 69,70 Ethernet33/1 33 50000 +Ethernet130 71,72 Ethernet33/3 33 50000 +Ethernet132 73,74 Ethernet34/1 34 50000 +Ethernet134 75,76 Ethernet34/3 34 50000 +Ethernet136 93,94 Ethernet35/1 35 50000 +Ethernet138 95,96 Ethernet35/3 35 50000 +Ethernet140 81,82 Ethernet36/1 36 50000 +Ethernet142 83,84 Ethernet36/3 36 50000 +Ethernet144 101,102 Ethernet37/1 37 50000 +Ethernet146 103,104 Ethernet37/3 37 50000 +Ethernet148 105,106 Ethernet38/1 38 50000 +Ethernet150 107,108 Ethernet38/3 38 50000 +Ethernet152 9,10 Ethernet39/1 39 50000 +Ethernet154 11,12 Ethernet39/3 39 50000 +Ethernet156 1,2 Ethernet40/1 40 50000 +Ethernet158 3,4 Ethernet40/3 40 50000 +Ethernet160 17,18 Ethernet41/1 41 50000 +Ethernet162 19,20 Ethernet41/3 41 50000 +Ethernet164 29,30 Ethernet42/1 42 50000 +Ethernet166 31,32 Ethernet42/3 42 50000 +Ethernet168 41,42 Ethernet43/1 43 50000 +Ethernet170 43,44 Ethernet43/3 43 50000 +Ethernet172 33,34 Ethernet44/1 44 50000 +Ethernet174 35,36 Ethernet44/3 44 50000 +Ethernet176 49,50,51,52 Ethernet45/1 45 100000 +Ethernet180 61,62,63,64 Ethernet46/1 46 100000 +Ethernet184 125,126,127,128 Ethernet47/1 47 100000 +Ethernet188 113,114,115,116 Ethernet48/1 48 100000 +Ethernet192 129,130,131,132 Ethernet49/1 49 100000 +Ethernet196 137,138,139,140 Ethernet50/1 50 100000 +Ethernet200 201,202,203,204 Ethernet51/1 51 100000 +Ethernet204 193,194,195,196 Ethernet52/1 52 100000 +Ethernet208 209,210 Ethernet53/1 53 50000 +Ethernet210 211,212 Ethernet53/3 53 50000 +Ethernet212 221,222 Ethernet54/1 54 50000 +Ethernet214 223,224 Ethernet54/3 54 50000 +Ethernet216 233,234 Ethernet55/1 55 50000 +Ethernet218 235,236 Ethernet55/3 55 50000 +Ethernet220 225,226 Ethernet56/1 56 50000 +Ethernet222 227,228 Ethernet56/3 56 50000 +Ethernet224 241,242 Ethernet57/1 57 50000 +Ethernet226 243,244 Ethernet57/3 57 50000 +Ethernet228 253,254 Ethernet58/1 58 50000 +Ethernet230 255,256 Ethernet58/3 58 50000 +Ethernet232 157,158 Ethernet59/1 59 50000 +Ethernet234 159,160 Ethernet59/3 59 50000 +Ethernet236 145,146 Ethernet60/1 60 50000 +Ethernet238 147,148 Ethernet60/3 60 50000 +Ethernet240 165,166 Ethernet61/1 61 50000 +Ethernet242 167,168 Ethernet61/3 61 50000 +Ethernet244 169,170 Ethernet62/1 62 50000 +Ethernet246 171,172 Ethernet62/3 62 50000 +Ethernet248 189,190 Ethernet63/1 63 50000 +Ethernet250 191,192 Ethernet63/3 63 50000 +Ethernet252 177,178 Ethernet64/1 64 50000 +Ethernet254 179,180 Ethernet64/3 64 50000 +Ethernet256 257 Ethernet65 65 10000 +Ethernet260 259 Ethernet66 66 10000 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile new file mode 100644 index 000000000000..d18e31d2c2a4 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-96x50G+16x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm new file mode 100644 index 000000000000..91f61f4b24d6 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm @@ -0,0 +1,922 @@ +PHY_AN_ALLOW_PLL_CHANGE=1 +arl_clean_timeout_usec=15000000 +asf_mem_profile=2 +bcm_num_cos=8 +bcm_stat_flags=1 +bcm_stat_jumbo=9236 +cdma_timeout_usec=15000000 +core_clock_frequency=1700 +dma_desc_timeout_usec=15000000 +dpp_clock_ratio=2:3 +higig2_hdr_mode=1 +ipv6_lpm_128b_enable=1 +l3_alpm_enable=2 +lpm_scaling_enable=0 +l2xmsg_mode=1 +max_vp_lags=0 +mem_scan_enable=1 +miim_intr_enable=0 +module_64ports=1 +os=unix +oversubscribe_mode=1 +pbmp_xport_xe=0xfffffffd3fffffff4fffffffc7ffffffe +#pbmp_xport_xe=0x47fffffff1fffffffcfffffffe7ffffffe +phy_an_allow_pll_change_hg=0 +phy_an_c73=1 +phy_chain_rx_lane_map_physical{1.0}=0x3210 +phy_chain_rx_lane_map_physical{101.0}=0x0123 +phy_chain_rx_lane_map_physical{105.0}=0x0123 +phy_chain_rx_lane_map_physical{109.0}=0x0123 +phy_chain_rx_lane_map_physical{113.0}=0x2301 +phy_chain_rx_lane_map_physical{117.0}=0x3210 +phy_chain_rx_lane_map_physical{121.0}=0x3210 +phy_chain_rx_lane_map_physical{125.0}=0x1203 +phy_chain_rx_lane_map_physical{129.0}=0x3210 +phy_chain_rx_lane_map_physical{13.0}=0x0321 +phy_chain_rx_lane_map_physical{133.0}=0x1032 +phy_chain_rx_lane_map_physical{137.0}=0x3210 +phy_chain_rx_lane_map_physical{141.0}=0x0123 +phy_chain_rx_lane_map_physical{145.0}=0x3210 +phy_chain_rx_lane_map_physical{149.0}=0x2310 +phy_chain_rx_lane_map_physical{153.0}=0x0132 +phy_chain_rx_lane_map_physical{157.0}=0x1302 +phy_chain_rx_lane_map_physical{161.0}=0x3021 +phy_chain_rx_lane_map_physical{165.0}=0x2031 +phy_chain_rx_lane_map_physical{169.0}=0x2031 +phy_chain_rx_lane_map_physical{17.0}=0x3210 +phy_chain_rx_lane_map_physical{173.0}=0x1302 +phy_chain_rx_lane_map_physical{177.0}=0x2031 +phy_chain_rx_lane_map_physical{181.0}=0x0213 +phy_chain_rx_lane_map_physical{185.0}=0x0213 +phy_chain_rx_lane_map_physical{189.0}=0x1302 +phy_chain_rx_lane_map_physical{193.0}=0x3120 +phy_chain_rx_lane_map_physical{197.0}=0x0231 +phy_chain_rx_lane_map_physical{201.0}=0x2031 +phy_chain_rx_lane_map_physical{205.0}=0x0213 +phy_chain_rx_lane_map_physical{209.0}=0x2013 +phy_chain_rx_lane_map_physical{21.0}=0x3021 +phy_chain_rx_lane_map_physical{213.0}=0x3021 +phy_chain_rx_lane_map_physical{217.0}=0x0231 +phy_chain_rx_lane_map_physical{221.0}=0x2031 +phy_chain_rx_lane_map_physical{225.0}=0x1203 +phy_chain_rx_lane_map_physical{229.0}=0x1230 +phy_chain_rx_lane_map_physical{233.0}=0x3021 +phy_chain_rx_lane_map_physical{237.0}=0x1032 +phy_chain_rx_lane_map_physical{241.0}=0x2301 +phy_chain_rx_lane_map_physical{245.0}=0x0321 +phy_chain_rx_lane_map_physical{249.0}=0x2301 +phy_chain_rx_lane_map_physical{25.0}=0x2301 +phy_chain_rx_lane_map_physical{253.0}=0x2301 +phy_chain_rx_lane_map_physical{257.0}=0x3210 +phy_chain_rx_lane_map_physical{29.0}=0x3021 +phy_chain_rx_lane_map_physical{33.0}=0x1302 +phy_chain_rx_lane_map_physical{37.0}=0x2031 +phy_chain_rx_lane_map_physical{41.0}=0x3021 +phy_chain_rx_lane_map_physical{45.0}=0x1023 +phy_chain_rx_lane_map_physical{49.0}=0x0213 +phy_chain_rx_lane_map_physical{5.0}=0x3201 +phy_chain_rx_lane_map_physical{53.0}=0x3201 +phy_chain_rx_lane_map_physical{57.0}=0x2013 +phy_chain_rx_lane_map_physical{61.0}=0x0213 +phy_chain_rx_lane_map_physical{65.0}=0x1203 +phy_chain_rx_lane_map_physical{69.0}=0x0213 +phy_chain_rx_lane_map_physical{73.0}=0x0213 +phy_chain_rx_lane_map_physical{77.0}=0x3120 +phy_chain_rx_lane_map_physical{81.0}=0x0213 +phy_chain_rx_lane_map_physical{85.0}=0x2031 +phy_chain_rx_lane_map_physical{89.0}=0x2031 +phy_chain_rx_lane_map_physical{9.0}=0x0321 +phy_chain_rx_lane_map_physical{93.0}=0x3120 +phy_chain_rx_lane_map_physical{97.0}=0x1203 +phy_chain_rx_polarity_flip_physical{1.0}=0x1 +phy_chain_rx_polarity_flip_physical{10.0}=0x0 +phy_chain_rx_polarity_flip_physical{100.0}=0x1 +phy_chain_rx_polarity_flip_physical{101.0}=0x1 +phy_chain_rx_polarity_flip_physical{102.0}=0x0 +phy_chain_rx_polarity_flip_physical{103.0}=0x1 +phy_chain_rx_polarity_flip_physical{104.0}=0x0 +phy_chain_rx_polarity_flip_physical{105.0}=0x1 +phy_chain_rx_polarity_flip_physical{106.0}=0x0 +phy_chain_rx_polarity_flip_physical{107.0}=0x1 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 +phy_chain_rx_polarity_flip_physical{109.0}=0x0 +phy_chain_rx_polarity_flip_physical{11.0}=0x1 +phy_chain_rx_polarity_flip_physical{110.0}=0x1 +phy_chain_rx_polarity_flip_physical{111.0}=0x0 +phy_chain_rx_polarity_flip_physical{112.0}=0x1 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{114.0}=0x0 +phy_chain_rx_polarity_flip_physical{115.0}=0x1 +phy_chain_rx_polarity_flip_physical{116.0}=0x0 +phy_chain_rx_polarity_flip_physical{117.0}=0x0 +phy_chain_rx_polarity_flip_physical{118.0}=0x0 +phy_chain_rx_polarity_flip_physical{119.0}=0x1 +phy_chain_rx_polarity_flip_physical{12.0}=0x1 +phy_chain_rx_polarity_flip_physical{120.0}=0x0 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x0 +phy_chain_rx_polarity_flip_physical{123.0}=0x1 +phy_chain_rx_polarity_flip_physical{124.0}=0x0 +phy_chain_rx_polarity_flip_physical{125.0}=0x0 +phy_chain_rx_polarity_flip_physical{126.0}=0x1 +phy_chain_rx_polarity_flip_physical{127.0}=0x1 +phy_chain_rx_polarity_flip_physical{128.0}=0x1 +phy_chain_rx_polarity_flip_physical{129.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x1 +phy_chain_rx_polarity_flip_physical{130.0}=0x1 +phy_chain_rx_polarity_flip_physical{131.0}=0x1 +phy_chain_rx_polarity_flip_physical{132.0}=0x0 +phy_chain_rx_polarity_flip_physical{133.0}=0x1 +phy_chain_rx_polarity_flip_physical{134.0}=0x1 +phy_chain_rx_polarity_flip_physical{135.0}=0x1 +phy_chain_rx_polarity_flip_physical{136.0}=0x0 +phy_chain_rx_polarity_flip_physical{137.0}=0x0 +phy_chain_rx_polarity_flip_physical{138.0}=0x0 +phy_chain_rx_polarity_flip_physical{139.0}=0x1 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{140.0}=0x0 +phy_chain_rx_polarity_flip_physical{141.0}=0x1 +phy_chain_rx_polarity_flip_physical{142.0}=0x0 +phy_chain_rx_polarity_flip_physical{143.0}=0x1 +phy_chain_rx_polarity_flip_physical{144.0}=0x0 +phy_chain_rx_polarity_flip_physical{145.0}=0x1 +phy_chain_rx_polarity_flip_physical{146.0}=0x0 +phy_chain_rx_polarity_flip_physical{147.0}=0x1 +phy_chain_rx_polarity_flip_physical{148.0}=0x0 +phy_chain_rx_polarity_flip_physical{149.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x1 +phy_chain_rx_polarity_flip_physical{150.0}=0x1 +phy_chain_rx_polarity_flip_physical{151.0}=0x1 +phy_chain_rx_polarity_flip_physical{152.0}=0x0 +phy_chain_rx_polarity_flip_physical{153.0}=0x0 +phy_chain_rx_polarity_flip_physical{154.0}=0x1 +phy_chain_rx_polarity_flip_physical{155.0}=0x1 +phy_chain_rx_polarity_flip_physical{156.0}=0x0 +phy_chain_rx_polarity_flip_physical{157.0}=0x0 +phy_chain_rx_polarity_flip_physical{158.0}=0x0 +phy_chain_rx_polarity_flip_physical{159.0}=0x1 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{160.0}=0x0 +phy_chain_rx_polarity_flip_physical{161.0}=0x1 +phy_chain_rx_polarity_flip_physical{162.0}=0x1 +phy_chain_rx_polarity_flip_physical{163.0}=0x0 +phy_chain_rx_polarity_flip_physical{164.0}=0x1 +phy_chain_rx_polarity_flip_physical{165.0}=0x0 +phy_chain_rx_polarity_flip_physical{166.0}=0x0 +phy_chain_rx_polarity_flip_physical{167.0}=0x1 +phy_chain_rx_polarity_flip_physical{168.0}=0x1 +phy_chain_rx_polarity_flip_physical{169.0}=0x1 +phy_chain_rx_polarity_flip_physical{17.0}=0x1 +phy_chain_rx_polarity_flip_physical{170.0}=0x1 +phy_chain_rx_polarity_flip_physical{171.0}=0x0 +phy_chain_rx_polarity_flip_physical{172.0}=0x0 +phy_chain_rx_polarity_flip_physical{173.0}=0x0 +phy_chain_rx_polarity_flip_physical{174.0}=0x0 +phy_chain_rx_polarity_flip_physical{175.0}=0x1 +phy_chain_rx_polarity_flip_physical{176.0}=0x1 +phy_chain_rx_polarity_flip_physical{177.0}=0x1 +phy_chain_rx_polarity_flip_physical{178.0}=0x1 +phy_chain_rx_polarity_flip_physical{179.0}=0x0 +phy_chain_rx_polarity_flip_physical{18.0}=0x0 +phy_chain_rx_polarity_flip_physical{180.0}=0x0 +phy_chain_rx_polarity_flip_physical{181.0}=0x1 +phy_chain_rx_polarity_flip_physical{182.0}=0x1 +phy_chain_rx_polarity_flip_physical{183.0}=0x0 +phy_chain_rx_polarity_flip_physical{184.0}=0x0 +phy_chain_rx_polarity_flip_physical{185.0}=0x0 +phy_chain_rx_polarity_flip_physical{186.0}=0x0 +phy_chain_rx_polarity_flip_physical{187.0}=0x1 +phy_chain_rx_polarity_flip_physical{188.0}=0x1 +phy_chain_rx_polarity_flip_physical{189.0}=0x0 +phy_chain_rx_polarity_flip_physical{19.0}=0x1 +phy_chain_rx_polarity_flip_physical{190.0}=0x0 +phy_chain_rx_polarity_flip_physical{191.0}=0x1 +phy_chain_rx_polarity_flip_physical{192.0}=0x0 +phy_chain_rx_polarity_flip_physical{193.0}=0x0 +phy_chain_rx_polarity_flip_physical{194.0}=0x0 +phy_chain_rx_polarity_flip_physical{195.0}=0x1 +phy_chain_rx_polarity_flip_physical{196.0}=0x1 +phy_chain_rx_polarity_flip_physical{197.0}=0x1 +phy_chain_rx_polarity_flip_physical{198.0}=0x1 +phy_chain_rx_polarity_flip_physical{199.0}=0x0 +phy_chain_rx_polarity_flip_physical{2.0}=0x0 +phy_chain_rx_polarity_flip_physical{20.0}=0x0 +phy_chain_rx_polarity_flip_physical{200.0}=0x0 +phy_chain_rx_polarity_flip_physical{201.0}=0x0 +phy_chain_rx_polarity_flip_physical{202.0}=0x0 +phy_chain_rx_polarity_flip_physical{203.0}=0x1 +phy_chain_rx_polarity_flip_physical{204.0}=0x0 +phy_chain_rx_polarity_flip_physical{205.0}=0x1 +phy_chain_rx_polarity_flip_physical{206.0}=0x1 +phy_chain_rx_polarity_flip_physical{207.0}=0x0 +phy_chain_rx_polarity_flip_physical{208.0}=0x0 +phy_chain_rx_polarity_flip_physical{209.0}=0x1 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{210.0}=0x1 +phy_chain_rx_polarity_flip_physical{211.0}=0x0 +phy_chain_rx_polarity_flip_physical{212.0}=0x0 +phy_chain_rx_polarity_flip_physical{213.0}=0x0 +phy_chain_rx_polarity_flip_physical{214.0}=0x0 +phy_chain_rx_polarity_flip_physical{215.0}=0x1 +phy_chain_rx_polarity_flip_physical{216.0}=0x0 +phy_chain_rx_polarity_flip_physical{217.0}=0x0 +phy_chain_rx_polarity_flip_physical{218.0}=0x0 +phy_chain_rx_polarity_flip_physical{219.0}=0x1 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{220.0}=0x1 +phy_chain_rx_polarity_flip_physical{221.0}=0x0 +phy_chain_rx_polarity_flip_physical{222.0}=0x0 +phy_chain_rx_polarity_flip_physical{223.0}=0x1 +phy_chain_rx_polarity_flip_physical{224.0}=0x1 +phy_chain_rx_polarity_flip_physical{225.0}=0x1 +phy_chain_rx_polarity_flip_physical{226.0}=0x0 +phy_chain_rx_polarity_flip_physical{227.0}=0x0 +phy_chain_rx_polarity_flip_physical{228.0}=0x1 +phy_chain_rx_polarity_flip_physical{229.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x1 +phy_chain_rx_polarity_flip_physical{230.0}=0x0 +phy_chain_rx_polarity_flip_physical{231.0}=0x1 +phy_chain_rx_polarity_flip_physical{232.0}=0x1 +phy_chain_rx_polarity_flip_physical{233.0}=0x1 +phy_chain_rx_polarity_flip_physical{234.0}=0x0 +phy_chain_rx_polarity_flip_physical{235.0}=0x0 +phy_chain_rx_polarity_flip_physical{236.0}=0x0 +phy_chain_rx_polarity_flip_physical{237.0}=0x1 +phy_chain_rx_polarity_flip_physical{238.0}=0x0 +phy_chain_rx_polarity_flip_physical{239.0}=0x1 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{240.0}=0x0 +phy_chain_rx_polarity_flip_physical{241.0}=0x1 +phy_chain_rx_polarity_flip_physical{242.0}=0x0 +phy_chain_rx_polarity_flip_physical{243.0}=0x1 +phy_chain_rx_polarity_flip_physical{244.0}=0x0 +phy_chain_rx_polarity_flip_physical{245.0}=0x1 +phy_chain_rx_polarity_flip_physical{246.0}=0x1 +phy_chain_rx_polarity_flip_physical{247.0}=0x1 +phy_chain_rx_polarity_flip_physical{248.0}=0x0 +phy_chain_rx_polarity_flip_physical{249.0}=0x0 +phy_chain_rx_polarity_flip_physical{25.0}=0x1 +phy_chain_rx_polarity_flip_physical{250.0}=0x1 +phy_chain_rx_polarity_flip_physical{251.0}=0x0 +phy_chain_rx_polarity_flip_physical{252.0}=0x1 +phy_chain_rx_polarity_flip_physical{253.0}=0x1 +phy_chain_rx_polarity_flip_physical{254.0}=0x0 +phy_chain_rx_polarity_flip_physical{255.0}=0x1 +phy_chain_rx_polarity_flip_physical{256.0}=0x0 +phy_chain_rx_polarity_flip_physical{257.0}=0x0 +phy_chain_rx_polarity_flip_physical{259.0}=0x0 +phy_chain_rx_polarity_flip_physical{26.0}=0x0 +phy_chain_rx_polarity_flip_physical{27.0}=0x1 +phy_chain_rx_polarity_flip_physical{28.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{3.0}=0x1 +phy_chain_rx_polarity_flip_physical{30.0}=0x0 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x1 +phy_chain_rx_polarity_flip_physical{33.0}=0x0 +phy_chain_rx_polarity_flip_physical{34.0}=0x0 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x1 +phy_chain_rx_polarity_flip_physical{37.0}=0x1 +phy_chain_rx_polarity_flip_physical{38.0}=0x1 +phy_chain_rx_polarity_flip_physical{39.0}=0x0 +phy_chain_rx_polarity_flip_physical{4.0}=0x0 +phy_chain_rx_polarity_flip_physical{40.0}=0x0 +phy_chain_rx_polarity_flip_physical{41.0}=0x0 +phy_chain_rx_polarity_flip_physical{42.0}=0x1 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{45.0}=0x1 +phy_chain_rx_polarity_flip_physical{46.0}=0x0 +phy_chain_rx_polarity_flip_physical{47.0}=0x0 +phy_chain_rx_polarity_flip_physical{48.0}=0x1 +phy_chain_rx_polarity_flip_physical{49.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x1 +phy_chain_rx_polarity_flip_physical{50.0}=0x1 +phy_chain_rx_polarity_flip_physical{51.0}=0x0 +phy_chain_rx_polarity_flip_physical{52.0}=0x0 +phy_chain_rx_polarity_flip_physical{53.0}=0x0 +phy_chain_rx_polarity_flip_physical{54.0}=0x0 +phy_chain_rx_polarity_flip_physical{55.0}=0x1 +phy_chain_rx_polarity_flip_physical{56.0}=0x0 +phy_chain_rx_polarity_flip_physical{57.0}=0x0 +phy_chain_rx_polarity_flip_physical{58.0}=0x0 +phy_chain_rx_polarity_flip_physical{59.0}=0x1 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{60.0}=0x1 +phy_chain_rx_polarity_flip_physical{61.0}=0x0 +phy_chain_rx_polarity_flip_physical{62.0}=0x0 +phy_chain_rx_polarity_flip_physical{63.0}=0x1 +phy_chain_rx_polarity_flip_physical{64.0}=0x1 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 +phy_chain_rx_polarity_flip_physical{67.0}=0x0 +phy_chain_rx_polarity_flip_physical{68.0}=0x1 +phy_chain_rx_polarity_flip_physical{69.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{70.0}=0x0 +phy_chain_rx_polarity_flip_physical{71.0}=0x1 +phy_chain_rx_polarity_flip_physical{72.0}=0x1 +phy_chain_rx_polarity_flip_physical{73.0}=0x1 +phy_chain_rx_polarity_flip_physical{74.0}=0x1 +phy_chain_rx_polarity_flip_physical{75.0}=0x0 +phy_chain_rx_polarity_flip_physical{76.0}=0x0 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 +phy_chain_rx_polarity_flip_physical{78.0}=0x0 +phy_chain_rx_polarity_flip_physical{79.0}=0x1 +phy_chain_rx_polarity_flip_physical{8.0}=0x1 +phy_chain_rx_polarity_flip_physical{80.0}=0x1 +phy_chain_rx_polarity_flip_physical{81.0}=0x1 +phy_chain_rx_polarity_flip_physical{82.0}=0x1 +phy_chain_rx_polarity_flip_physical{83.0}=0x0 +phy_chain_rx_polarity_flip_physical{84.0}=0x0 +phy_chain_rx_polarity_flip_physical{85.0}=0x1 +phy_chain_rx_polarity_flip_physical{86.0}=0x1 +phy_chain_rx_polarity_flip_physical{87.0}=0x0 +phy_chain_rx_polarity_flip_physical{88.0}=0x0 +phy_chain_rx_polarity_flip_physical{89.0}=0x0 +phy_chain_rx_polarity_flip_physical{9.0}=0x1 +phy_chain_rx_polarity_flip_physical{90.0}=0x0 +phy_chain_rx_polarity_flip_physical{91.0}=0x1 +phy_chain_rx_polarity_flip_physical{92.0}=0x1 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 +phy_chain_rx_polarity_flip_physical{94.0}=0x0 +phy_chain_rx_polarity_flip_physical{95.0}=0x1 +phy_chain_rx_polarity_flip_physical{96.0}=0x0 +phy_chain_rx_polarity_flip_physical{97.0}=0x1 +phy_chain_rx_polarity_flip_physical{98.0}=0x1 +phy_chain_rx_polarity_flip_physical{99.0}=0x0 +phy_chain_tx_lane_map_physical{1.0}=0x2031 +phy_chain_tx_lane_map_physical{101.0}=0x1023 +phy_chain_tx_lane_map_physical{105.0}=0x1302 +phy_chain_tx_lane_map_physical{109.0}=0x0321 +phy_chain_tx_lane_map_physical{113.0}=0x2301 +phy_chain_tx_lane_map_physical{117.0}=0x3120 +phy_chain_tx_lane_map_physical{121.0}=0x3102 +phy_chain_tx_lane_map_physical{125.0}=0x3210 +phy_chain_tx_lane_map_physical{129.0}=0x1023 +phy_chain_tx_lane_map_physical{13.0}=0x3021 +phy_chain_tx_lane_map_physical{133.0}=0x3210 +phy_chain_tx_lane_map_physical{137.0}=0x2031 +phy_chain_tx_lane_map_physical{141.0}=0x1302 +phy_chain_tx_lane_map_physical{145.0}=0x3210 +phy_chain_tx_lane_map_physical{149.0}=0x0213 +phy_chain_tx_lane_map_physical{153.0}=0x3210 +phy_chain_tx_lane_map_physical{157.0}=0x1320 +phy_chain_tx_lane_map_physical{161.0}=0x3210 +phy_chain_tx_lane_map_physical{165.0}=0x0231 +phy_chain_tx_lane_map_physical{169.0}=0x3120 +phy_chain_tx_lane_map_physical{17.0}=0x1032 +phy_chain_tx_lane_map_physical{173.0}=0x0312 +phy_chain_tx_lane_map_physical{177.0}=0x0231 +phy_chain_tx_lane_map_physical{181.0}=0x3210 +phy_chain_tx_lane_map_physical{185.0}=0x3210 +phy_chain_tx_lane_map_physical{189.0}=0x1320 +phy_chain_tx_lane_map_physical{193.0}=0x0321 +phy_chain_tx_lane_map_physical{197.0}=0x3120 +phy_chain_tx_lane_map_physical{201.0}=0x3120 +phy_chain_tx_lane_map_physical{205.0}=0x0123 +phy_chain_tx_lane_map_physical{209.0}=0x3120 +phy_chain_tx_lane_map_physical{21.0}=0x0213 +phy_chain_tx_lane_map_physical{213.0}=0x3021 +phy_chain_tx_lane_map_physical{217.0}=0x0312 +phy_chain_tx_lane_map_physical{221.0}=0x2301 +phy_chain_tx_lane_map_physical{225.0}=0x0123 +phy_chain_tx_lane_map_physical{229.0}=0x2031 +phy_chain_tx_lane_map_physical{233.0}=0x0231 +phy_chain_tx_lane_map_physical{237.0}=0x0213 +phy_chain_tx_lane_map_physical{241.0}=0x1320 +phy_chain_tx_lane_map_physical{245.0}=0x2031 +phy_chain_tx_lane_map_physical{249.0}=0x3120 +phy_chain_tx_lane_map_physical{25.0}=0x0231 +phy_chain_tx_lane_map_physical{253.0}=0x0321 +phy_chain_tx_lane_map_physical{257.0}=0x3210 +phy_chain_tx_lane_map_physical{29.0}=0x1230 +phy_chain_tx_lane_map_physical{33.0}=0x1032 +phy_chain_tx_lane_map_physical{37.0}=0x0123 +phy_chain_tx_lane_map_physical{41.0}=0x0213 +phy_chain_tx_lane_map_physical{45.0}=0x0132 +phy_chain_tx_lane_map_physical{49.0}=0x2031 +phy_chain_tx_lane_map_physical{5.0}=0x2301 +phy_chain_tx_lane_map_physical{53.0}=0x2301 +phy_chain_tx_lane_map_physical{57.0}=0x2031 +phy_chain_tx_lane_map_physical{61.0}=0x2031 +phy_chain_tx_lane_map_physical{65.0}=0x1230 +phy_chain_tx_lane_map_physical{69.0}=0x2013 +phy_chain_tx_lane_map_physical{73.0}=0x0213 +phy_chain_tx_lane_map_physical{77.0}=0x2310 +phy_chain_tx_lane_map_physical{81.0}=0x0321 +phy_chain_tx_lane_map_physical{85.0}=0x2013 +phy_chain_tx_lane_map_physical{89.0}=0x0213 +phy_chain_tx_lane_map_physical{9.0}=0x3012 +phy_chain_tx_lane_map_physical{93.0}=0x3102 +phy_chain_tx_lane_map_physical{97.0}=0x3210 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 +phy_chain_tx_polarity_flip_physical{10.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x0 +phy_chain_tx_polarity_flip_physical{101.0}=0x0 +phy_chain_tx_polarity_flip_physical{102.0}=0x1 +phy_chain_tx_polarity_flip_physical{103.0}=0x0 +phy_chain_tx_polarity_flip_physical{104.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x0 +phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x1 +phy_chain_tx_polarity_flip_physical{109.0}=0x0 +phy_chain_tx_polarity_flip_physical{11.0}=0x1 +phy_chain_tx_polarity_flip_physical{110.0}=0x0 +phy_chain_tx_polarity_flip_physical{111.0}=0x0 +phy_chain_tx_polarity_flip_physical{112.0}=0x1 +phy_chain_tx_polarity_flip_physical{113.0}=0x1 +phy_chain_tx_polarity_flip_physical{114.0}=0x1 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{117.0}=0x1 +phy_chain_tx_polarity_flip_physical{118.0}=0x0 +phy_chain_tx_polarity_flip_physical{119.0}=0x0 +phy_chain_tx_polarity_flip_physical{12.0}=0x0 +phy_chain_tx_polarity_flip_physical{120.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x0 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x0 +phy_chain_tx_polarity_flip_physical{124.0}=0x1 +phy_chain_tx_polarity_flip_physical{125.0}=0x0 +phy_chain_tx_polarity_flip_physical{126.0}=0x1 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 +phy_chain_tx_polarity_flip_physical{129.0}=0x1 +phy_chain_tx_polarity_flip_physical{13.0}=0x0 +phy_chain_tx_polarity_flip_physical{130.0}=0x0 +phy_chain_tx_polarity_flip_physical{131.0}=0x1 +phy_chain_tx_polarity_flip_physical{132.0}=0x0 +phy_chain_tx_polarity_flip_physical{133.0}=0x1 +phy_chain_tx_polarity_flip_physical{134.0}=0x1 +phy_chain_tx_polarity_flip_physical{135.0}=0x1 +phy_chain_tx_polarity_flip_physical{136.0}=0x1 +phy_chain_tx_polarity_flip_physical{137.0}=0x1 +phy_chain_tx_polarity_flip_physical{138.0}=0x1 +phy_chain_tx_polarity_flip_physical{139.0}=0x1 +phy_chain_tx_polarity_flip_physical{14.0}=0x1 +phy_chain_tx_polarity_flip_physical{140.0}=0x1 +phy_chain_tx_polarity_flip_physical{141.0}=0x0 +phy_chain_tx_polarity_flip_physical{142.0}=0x1 +phy_chain_tx_polarity_flip_physical{143.0}=0x1 +phy_chain_tx_polarity_flip_physical{144.0}=0x1 +phy_chain_tx_polarity_flip_physical{145.0}=0x1 +phy_chain_tx_polarity_flip_physical{146.0}=0x1 +phy_chain_tx_polarity_flip_physical{147.0}=0x1 +phy_chain_tx_polarity_flip_physical{148.0}=0x0 +phy_chain_tx_polarity_flip_physical{149.0}=0x1 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{150.0}=0x0 +phy_chain_tx_polarity_flip_physical{151.0}=0x0 +phy_chain_tx_polarity_flip_physical{152.0}=0x0 +phy_chain_tx_polarity_flip_physical{153.0}=0x1 +phy_chain_tx_polarity_flip_physical{154.0}=0x0 +phy_chain_tx_polarity_flip_physical{155.0}=0x0 +phy_chain_tx_polarity_flip_physical{156.0}=0x0 +phy_chain_tx_polarity_flip_physical{157.0}=0x0 +phy_chain_tx_polarity_flip_physical{158.0}=0x0 +phy_chain_tx_polarity_flip_physical{159.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x0 +phy_chain_tx_polarity_flip_physical{160.0}=0x0 +phy_chain_tx_polarity_flip_physical{161.0}=0x0 +phy_chain_tx_polarity_flip_physical{162.0}=0x1 +phy_chain_tx_polarity_flip_physical{163.0}=0x1 +phy_chain_tx_polarity_flip_physical{164.0}=0x0 +phy_chain_tx_polarity_flip_physical{165.0}=0x1 +phy_chain_tx_polarity_flip_physical{166.0}=0x1 +phy_chain_tx_polarity_flip_physical{167.0}=0x1 +phy_chain_tx_polarity_flip_physical{168.0}=0x0 +phy_chain_tx_polarity_flip_physical{169.0}=0x0 +phy_chain_tx_polarity_flip_physical{17.0}=0x0 +phy_chain_tx_polarity_flip_physical{170.0}=0x1 +phy_chain_tx_polarity_flip_physical{171.0}=0x1 +phy_chain_tx_polarity_flip_physical{172.0}=0x1 +phy_chain_tx_polarity_flip_physical{173.0}=0x0 +phy_chain_tx_polarity_flip_physical{174.0}=0x0 +phy_chain_tx_polarity_flip_physical{175.0}=0x1 +phy_chain_tx_polarity_flip_physical{176.0}=0x0 +phy_chain_tx_polarity_flip_physical{177.0}=0x1 +phy_chain_tx_polarity_flip_physical{178.0}=0x0 +phy_chain_tx_polarity_flip_physical{179.0}=0x0 +phy_chain_tx_polarity_flip_physical{18.0}=0x1 +phy_chain_tx_polarity_flip_physical{180.0}=0x0 +phy_chain_tx_polarity_flip_physical{181.0}=0x0 +phy_chain_tx_polarity_flip_physical{182.0}=0x0 +phy_chain_tx_polarity_flip_physical{183.0}=0x0 +phy_chain_tx_polarity_flip_physical{184.0}=0x1 +phy_chain_tx_polarity_flip_physical{185.0}=0x0 +phy_chain_tx_polarity_flip_physical{186.0}=0x1 +phy_chain_tx_polarity_flip_physical{187.0}=0x1 +phy_chain_tx_polarity_flip_physical{188.0}=0x1 +phy_chain_tx_polarity_flip_physical{189.0}=0x0 +phy_chain_tx_polarity_flip_physical{19.0}=0x1 +phy_chain_tx_polarity_flip_physical{190.0}=0x0 +phy_chain_tx_polarity_flip_physical{191.0}=0x0 +phy_chain_tx_polarity_flip_physical{192.0}=0x0 +phy_chain_tx_polarity_flip_physical{193.0}=0x1 +phy_chain_tx_polarity_flip_physical{194.0}=0x1 +phy_chain_tx_polarity_flip_physical{195.0}=0x1 +phy_chain_tx_polarity_flip_physical{196.0}=0x0 +phy_chain_tx_polarity_flip_physical{197.0}=0x0 +phy_chain_tx_polarity_flip_physical{198.0}=0x1 +phy_chain_tx_polarity_flip_physical{199.0}=0x1 +phy_chain_tx_polarity_flip_physical{2.0}=0x1 +phy_chain_tx_polarity_flip_physical{20.0}=0x1 +phy_chain_tx_polarity_flip_physical{200.0}=0x1 +phy_chain_tx_polarity_flip_physical{201.0}=0x1 +phy_chain_tx_polarity_flip_physical{202.0}=0x1 +phy_chain_tx_polarity_flip_physical{203.0}=0x1 +phy_chain_tx_polarity_flip_physical{204.0}=0x1 +phy_chain_tx_polarity_flip_physical{205.0}=0x0 +phy_chain_tx_polarity_flip_physical{206.0}=0x1 +phy_chain_tx_polarity_flip_physical{207.0}=0x1 +phy_chain_tx_polarity_flip_physical{208.0}=0x1 +phy_chain_tx_polarity_flip_physical{209.0}=0x1 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{210.0}=0x1 +phy_chain_tx_polarity_flip_physical{211.0}=0x1 +phy_chain_tx_polarity_flip_physical{212.0}=0x0 +phy_chain_tx_polarity_flip_physical{213.0}=0x0 +phy_chain_tx_polarity_flip_physical{214.0}=0x1 +phy_chain_tx_polarity_flip_physical{215.0}=0x0 +phy_chain_tx_polarity_flip_physical{216.0}=0x1 +phy_chain_tx_polarity_flip_physical{217.0}=0x1 +phy_chain_tx_polarity_flip_physical{218.0}=0x1 +phy_chain_tx_polarity_flip_physical{219.0}=0x0 +phy_chain_tx_polarity_flip_physical{22.0}=0x0 +phy_chain_tx_polarity_flip_physical{220.0}=0x1 +phy_chain_tx_polarity_flip_physical{221.0}=0x0 +phy_chain_tx_polarity_flip_physical{222.0}=0x0 +phy_chain_tx_polarity_flip_physical{223.0}=0x0 +phy_chain_tx_polarity_flip_physical{224.0}=0x1 +phy_chain_tx_polarity_flip_physical{225.0}=0x1 +phy_chain_tx_polarity_flip_physical{226.0}=0x1 +phy_chain_tx_polarity_flip_physical{227.0}=0x1 +phy_chain_tx_polarity_flip_physical{228.0}=0x0 +phy_chain_tx_polarity_flip_physical{229.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{230.0}=0x1 +phy_chain_tx_polarity_flip_physical{231.0}=0x1 +phy_chain_tx_polarity_flip_physical{232.0}=0x1 +phy_chain_tx_polarity_flip_physical{233.0}=0x0 +phy_chain_tx_polarity_flip_physical{234.0}=0x0 +phy_chain_tx_polarity_flip_physical{235.0}=0x0 +phy_chain_tx_polarity_flip_physical{236.0}=0x0 +phy_chain_tx_polarity_flip_physical{237.0}=0x1 +phy_chain_tx_polarity_flip_physical{238.0}=0x1 +phy_chain_tx_polarity_flip_physical{239.0}=0x1 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{240.0}=0x0 +phy_chain_tx_polarity_flip_physical{241.0}=0x1 +phy_chain_tx_polarity_flip_physical{242.0}=0x1 +phy_chain_tx_polarity_flip_physical{243.0}=0x1 +phy_chain_tx_polarity_flip_physical{244.0}=0x0 +phy_chain_tx_polarity_flip_physical{245.0}=0x1 +phy_chain_tx_polarity_flip_physical{246.0}=0x1 +phy_chain_tx_polarity_flip_physical{247.0}=0x1 +phy_chain_tx_polarity_flip_physical{248.0}=0x1 +phy_chain_tx_polarity_flip_physical{249.0}=0x1 +phy_chain_tx_polarity_flip_physical{25.0}=0x1 +phy_chain_tx_polarity_flip_physical{250.0}=0x0 +phy_chain_tx_polarity_flip_physical{251.0}=0x0 +phy_chain_tx_polarity_flip_physical{252.0}=0x0 +phy_chain_tx_polarity_flip_physical{253.0}=0x1 +phy_chain_tx_polarity_flip_physical{254.0}=0x1 +phy_chain_tx_polarity_flip_physical{255.0}=0x1 +phy_chain_tx_polarity_flip_physical{256.0}=0x0 +phy_chain_tx_polarity_flip_physical{257.0}=0x0 +phy_chain_tx_polarity_flip_physical{259.0}=0x0 +phy_chain_tx_polarity_flip_physical{26.0}=0x0 +phy_chain_tx_polarity_flip_physical{27.0}=0x0 +phy_chain_tx_polarity_flip_physical{28.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x1 +phy_chain_tx_polarity_flip_physical{3.0}=0x1 +phy_chain_tx_polarity_flip_physical{30.0}=0x1 +phy_chain_tx_polarity_flip_physical{31.0}=0x1 +phy_chain_tx_polarity_flip_physical{32.0}=0x0 +phy_chain_tx_polarity_flip_physical{33.0}=0x0 +phy_chain_tx_polarity_flip_physical{34.0}=0x0 +phy_chain_tx_polarity_flip_physical{35.0}=0x0 +phy_chain_tx_polarity_flip_physical{36.0}=0x1 +phy_chain_tx_polarity_flip_physical{37.0}=0x1 +phy_chain_tx_polarity_flip_physical{38.0}=0x1 +phy_chain_tx_polarity_flip_physical{39.0}=0x1 +phy_chain_tx_polarity_flip_physical{4.0}=0x1 +phy_chain_tx_polarity_flip_physical{40.0}=0x0 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{42.0}=0x0 +phy_chain_tx_polarity_flip_physical{43.0}=0x0 +phy_chain_tx_polarity_flip_physical{44.0}=0x0 +phy_chain_tx_polarity_flip_physical{45.0}=0x1 +phy_chain_tx_polarity_flip_physical{46.0}=0x0 +phy_chain_tx_polarity_flip_physical{47.0}=0x1 +phy_chain_tx_polarity_flip_physical{48.0}=0x1 +phy_chain_tx_polarity_flip_physical{49.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x1 +phy_chain_tx_polarity_flip_physical{50.0}=0x0 +phy_chain_tx_polarity_flip_physical{51.0}=0x0 +phy_chain_tx_polarity_flip_physical{52.0}=0x1 +phy_chain_tx_polarity_flip_physical{53.0}=0x0 +phy_chain_tx_polarity_flip_physical{54.0}=0x1 +phy_chain_tx_polarity_flip_physical{55.0}=0x1 +phy_chain_tx_polarity_flip_physical{56.0}=0x0 +phy_chain_tx_polarity_flip_physical{57.0}=0x0 +phy_chain_tx_polarity_flip_physical{58.0}=0x1 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{6.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x1 +phy_chain_tx_polarity_flip_physical{61.0}=0x0 +phy_chain_tx_polarity_flip_physical{62.0}=0x1 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x1 +phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_tx_polarity_flip_physical{66.0}=0x1 +phy_chain_tx_polarity_flip_physical{67.0}=0x1 +phy_chain_tx_polarity_flip_physical{68.0}=0x0 +phy_chain_tx_polarity_flip_physical{69.0}=0x1 +phy_chain_tx_polarity_flip_physical{7.0}=0x1 +phy_chain_tx_polarity_flip_physical{70.0}=0x1 +phy_chain_tx_polarity_flip_physical{71.0}=0x1 +phy_chain_tx_polarity_flip_physical{72.0}=0x0 +phy_chain_tx_polarity_flip_physical{73.0}=0x1 +phy_chain_tx_polarity_flip_physical{74.0}=0x0 +phy_chain_tx_polarity_flip_physical{75.0}=0x0 +phy_chain_tx_polarity_flip_physical{76.0}=0x0 +phy_chain_tx_polarity_flip_physical{77.0}=0x0 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{8.0}=0x0 +phy_chain_tx_polarity_flip_physical{80.0}=0x0 +phy_chain_tx_polarity_flip_physical{81.0}=0x1 +phy_chain_tx_polarity_flip_physical{82.0}=0x1 +phy_chain_tx_polarity_flip_physical{83.0}=0x1 +phy_chain_tx_polarity_flip_physical{84.0}=0x0 +phy_chain_tx_polarity_flip_physical{85.0}=0x1 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x0 +phy_chain_tx_polarity_flip_physical{88.0}=0x0 +phy_chain_tx_polarity_flip_physical{89.0}=0x1 +phy_chain_tx_polarity_flip_physical{9.0}=0x0 +phy_chain_tx_polarity_flip_physical{90.0}=0x1 +phy_chain_tx_polarity_flip_physical{91.0}=0x1 +phy_chain_tx_polarity_flip_physical{92.0}=0x0 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x0 +phy_chain_tx_polarity_flip_physical{95.0}=0x0 +phy_chain_tx_polarity_flip_physical{96.0}=0x0 +phy_chain_tx_polarity_flip_physical{97.0}=0x0 +phy_chain_tx_polarity_flip_physical{98.0}=0x1 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 + +port_init_cl72_hg=1 + + + + + + + +robust_hash_disable_egress_vlan=1 +robust_hash_disable_mpls=1 +robust_hash_disable_vlan=1 +stable_size=0x5500000 +stable_size=0x5500000 +tdma_timeout_usec=15000000 +tslam_timeout_usec=15000000 +dport_map_direct=1 +portmap_1=5:50 +portmap_2=7:50 +portmap_3=13:50 +portmap_4=15:50 +portmap_5=25:50 +portmap_6=27:50 +portmap_7=21:50 +portmap_8=23:50 +portmap_9=37:50 +portmap_10=39:50 +portmap_11=45:50 +portmap_12=47:50 +portmap_13=57:100 +portmap_14=53:100 +portmap_15=9:50 +portmap_16=11:50 +portmap_17=1:50 +portmap_18=3:50 +portmap_19=17:50 +portmap_20=19:50 +portmap_21=29:50 +portmap_22=31:50 +portmap_23=41:50 +portmap_24=43:50 +portmap_25=33:50 +portmap_26=35:50 +portmap_27=49:100 +portmap_28=61:100 +portmap_34=77:50 +portmap_35=79:50 +portmap_36=65:50 +portmap_37=67:50 +portmap_38=85:50 +portmap_39=87:50 +portmap_40=89:50 +portmap_41=91:50 +portmap_42=109:50 +portmap_43=111:50 +portmap_44=97:50 +portmap_45=99:50 +portmap_46=117:100 +portmap_47=121:100 +portmap_48=69:50 +portmap_49=71:50 +portmap_50=73:50 +portmap_51=75:50 +portmap_52=93:50 +portmap_53=95:50 +portmap_54=81:50 +portmap_55=83:50 +portmap_56=101:50 +portmap_57=103:50 +portmap_58=105:50 +portmap_59=107:50 +portmap_60=125:100 +portmap_61=113:100 +portmap_66=257:10 +portmap_68=141:100 +portmap_69=133:100 +portmap_70=149:50 +portmap_71=151:50 +portmap_72=153:50 +portmap_73=155:50 +portmap_74=173:50 +portmap_75=175:50 +portmap_76=161:50 +portmap_77=163:50 +portmap_78=181:50 +portmap_79=183:50 +portmap_80=185:50 +portmap_81=187:50 +portmap_82=129:100 +portmap_83=137:100 +portmap_84=157:50 +portmap_85=159:50 +portmap_86=145:50 +portmap_87=147:50 +portmap_88=165:50 +portmap_89=167:50 +portmap_90=169:50 +portmap_91=171:50 +portmap_92=189:50 +portmap_93=191:50 +portmap_94=177:50 +portmap_95=179:50 +portmap_100=259:10 +portmap_102=197:100 +portmap_103=205:100 +portmap_104=217:50 +portmap_105=219:50 +portmap_106=213:50 +portmap_107=215:50 +portmap_108=229:50 +portmap_109=231:50 +portmap_110=237:50 +portmap_111=239:50 +portmap_112=249:50 +portmap_113=251:50 +portmap_114=245:50 +portmap_115=247:50 +portmap_116=201:100 +portmap_117=193:100 +portmap_118=209:50 +portmap_119=211:50 +portmap_120=221:50 +portmap_121=223:50 +portmap_122=233:50 +portmap_123=235:50 +portmap_124=225:50 +portmap_125=227:50 +portmap_126=241:50 +portmap_127=243:50 +portmap_128=253:50 +portmap_129=255:50 + +# tuning parameters +serdes_preemphasis_1=0x580c +serdes_preemphasis_2=0x580c +serdes_preemphasis_3=0x580c +serdes_preemphasis_4=0x580c +serdes_preemphasis_5=0x580c +serdes_preemphasis_6=0x580c +serdes_preemphasis_7=0x580c +serdes_preemphasis_8=0x580c +serdes_preemphasis_9=0x580c +serdes_preemphasis_10=0x580c +serdes_preemphasis_11=0x580c +serdes_preemphasis_12=0x580c +serdes_preemphasis_13=0x83404 +serdes_preemphasis_14=0x83404 +serdes_preemphasis_15=0x580c +serdes_preemphasis_16=0x580c +serdes_preemphasis_17=0x580c +serdes_preemphasis_18=0x580c +serdes_preemphasis_19=0x580c +serdes_preemphasis_20=0x580c +serdes_preemphasis_21=0x580c +serdes_preemphasis_22=0x580c +serdes_preemphasis_23=0x580c +serdes_preemphasis_24=0x580c +serdes_preemphasis_25=0x580c +serdes_preemphasis_26=0x580c +serdes_preemphasis_27=0xf3c05 +serdes_preemphasis_28=0xf3d05 +serdes_preemphasis_34=0x580c +serdes_preemphasis_35=0x580c +serdes_preemphasis_36=0x580c +serdes_preemphasis_37=0x580c +serdes_preemphasis_38=0x580c +serdes_preemphasis_39=0x580c +serdes_preemphasis_40=0x580c +serdes_preemphasis_41=0x580c +serdes_preemphasis_42=0x580c +serdes_preemphasis_43=0x580c +serdes_preemphasis_44=0x580c +serdes_preemphasis_45=0x580c +serdes_preemphasis_46=0xb3604 +serdes_preemphasis_47=0x72b03 +serdes_preemphasis_48=0x580c +serdes_preemphasis_49=0x580c +serdes_preemphasis_50=0x580c +serdes_preemphasis_51=0x580c +serdes_preemphasis_52=0x580c +serdes_preemphasis_53=0x580c +serdes_preemphasis_54=0x580c +serdes_preemphasis_55=0x580c +serdes_preemphasis_56=0x580c +serdes_preemphasis_57=0x580c +serdes_preemphasis_58=0x580c +serdes_preemphasis_59=0x580c +serdes_preemphasis_60=0xf3c05 +serdes_preemphasis_61=0x103f06 +serdes_preemphasis_66=0x43004 +serdes_preemphasis_68=0xf4006 +serdes_preemphasis_69=0xf4006 +serdes_preemphasis_70=0x580c +serdes_preemphasis_71=0x580c +serdes_preemphasis_72=0x580c +serdes_preemphasis_73=0x580c +serdes_preemphasis_74=0x580c +serdes_preemphasis_75=0x580c +serdes_preemphasis_76=0x580c +serdes_preemphasis_77=0x580c +serdes_preemphasis_78=0x580c +serdes_preemphasis_79=0x580c +serdes_preemphasis_80=0x580c +serdes_preemphasis_81=0x580c +serdes_preemphasis_82=0x73103 +serdes_preemphasis_83=0x73103 +serdes_preemphasis_84=0x580c +serdes_preemphasis_85=0x580c +serdes_preemphasis_86=0x580c +serdes_preemphasis_87=0x580c +serdes_preemphasis_88=0x580c +serdes_preemphasis_89=0x580c +serdes_preemphasis_90=0x580c +serdes_preemphasis_91=0x580c +serdes_preemphasis_92=0x580c +serdes_preemphasis_93=0x580c +serdes_preemphasis_94=0x580c +serdes_preemphasis_95=0x580c +serdes_preemphasis_100=0x43004 +serdes_preemphasis_102=0xf3c05 +serdes_preemphasis_103=0xf3c05 +serdes_preemphasis_104=0x580c +serdes_preemphasis_105=0x580c +serdes_preemphasis_106=0x580c +serdes_preemphasis_107=0x580c +serdes_preemphasis_108=0x580c +serdes_preemphasis_109=0x580c +serdes_preemphasis_110=0x580c +serdes_preemphasis_111=0x580c +serdes_preemphasis_112=0x580c +serdes_preemphasis_113=0x580c +serdes_preemphasis_114=0x580c +serdes_preemphasis_115=0x580c +serdes_preemphasis_116=0x83404 +serdes_preemphasis_117=0x83404 +serdes_preemphasis_118=0x580c +serdes_preemphasis_119=0x580c +serdes_preemphasis_120=0x580c +serdes_preemphasis_121=0x580c +serdes_preemphasis_122=0x580c +serdes_preemphasis_123=0x580c +serdes_preemphasis_124=0x580c +serdes_preemphasis_125=0x580c +serdes_preemphasis_126=0x580c +serdes_preemphasis_127=0x580c +serdes_preemphasis_128=0x580c +serdes_preemphasis_129=0x580c + +mmu_init_config="MSFT-TH2-Tier0" + +phy_an_lt_msft=1 From aee63310f60543b0e23e5bbf08880e633af2ea53 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 5 May 2022 16:31:45 +0000 Subject: [PATCH 545/817] [7060] fix default port map Signed-off-by: Ying Xie --- .../Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 index fdbff09c12d4..a3c33da63990 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 @@ -8,14 +8,14 @@ {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} {%- endfor %} - {%- for port_idx in range(24,32) %} + {%- for port_idx in range(26,32) %} {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} {%- endfor %} {%- for port_idx in range(6,10) %} {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} {%- endfor %} - {%- for port_idx in range(22,24) %} + {%- for port_idx in range(22,26) %} {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} {%- endfor %} -{%- endmacro %} \ No newline at end of file +{%- endmacro %} From 503a0f708841fc76f4cba2328dde3f595a8ea378 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 6 Jul 2022 21:09:49 +0000 Subject: [PATCH 546/817] [Buffer] Separate buffer profile for Arista-7060CX-32S-Q24C8 Signed-off-by: Ying Xie --- .../Arista-7060CX-32S-Q24C8/BALANCED | 1 + .../Arista-7060CX-32S-Q24C8/RDMA-CENTRIC | 1 + .../Arista-7060CX-32S-Q24C8/TCP-CENTRIC | 1 + .../buffer_ports_t0.j2 | 7 +++ .../buffers_defaults_t0.j2 | 47 +------------------ .../pg_profile_lookup.ini | 18 +------ .../Arista-7060CX-32S-Q24C8/qos.json.j2 | 2 +- 7 files changed, 13 insertions(+), 64 deletions(-) create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/BALANCED create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/RDMA-CENTRIC create mode 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/TCP-CENTRIC create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffer_ports_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini mode change 100644 => 120000 device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/BALANCED new file mode 120000 index 000000000000..87afd08ffcd8 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/RDMA-CENTRIC new file mode 120000 index 000000000000..0c839e1e907b --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/TCP-CENTRIC new file mode 120000 index 000000000000..dd9cf046c0f9 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffer_ports_t0.j2 new file mode 100644 index 000000000000..599db74c1da5 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffer_ports_t0.j2 @@ -0,0 +1,7 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 deleted file mode 100644 index 2b6f72b6dc93..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,46 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,32) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "11213696", - "type": "ingress", - "mode": "dynamic", - "xoff": "3855488" - }, - "egress_lossy_pool": { - "size": "9532224", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"ingress_lossless_pool", - "size":"0", - "dynamic_th":"3" - }, - "egress_lossless_profile": { - "pool":"egress_lossless_pool", - "size":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"egress_lossy_pool", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 new file mode 120000 index 000000000000..9524e6a476ac --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini deleted file mode 100644 index 7222f8014925..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 -4 2288 - 25000 5m 1248 2288 53248 -4 2288 - 40000 5m 1248 2288 66560 -4 2288 - 50000 5m 1248 2288 79872 -4 2288 - 100000 5m 1248 2288 165568 -4 2288 - 10000 40m 1248 2288 37024 -4 2288 - 25000 40m 1248 2288 56160 -4 2288 - 40000 40m 1248 2288 71552 -4 2288 - 50000 40m 1248 2288 85696 -4 2288 - 100000 40m 1248 2288 177632 -4 2288 - 10000 300m 1248 2288 46176 -4 2288 - 25000 300m 1248 2288 79040 -4 2288 - 40000 300m 1248 2288 108160 -4 2288 - 50000 300m 1248 2288 131456 -4 2288 - 100000 300m 1248 2288 268736 -4 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini new file mode 120000 index 000000000000..297cddb2d223 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 deleted file mode 100644 index 3e548325ea30..000000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 new file mode 120000 index 000000000000..aef6b6765cf2 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file From 8791a32ca1bee3901efd8d3577647a26477a78ba Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 12 Jul 2022 23:30:17 +0200 Subject: [PATCH 547/817] [Arista] Update platform library submodules (#11375) --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index e4940f0937c1..5624b588caf8 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit e4940f0937c1425c5ba8248e524a5d753c223aca +Subproject commit 5624b588caf88641c04eaf79821a29138b7adf88 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index e4940f0937c1..5624b588caf8 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit e4940f0937c1425c5ba8248e524a5d753c223aca +Subproject commit 5624b588caf88641c04eaf79821a29138b7adf88 From 5171589f4d5afc5ef3ac74fd4a29234085472ef4 Mon Sep 17 00:00:00 2001 From: geogchen <106694330+geogchen@users.noreply.github.com> Date: Tue, 12 Jul 2022 14:55:15 -0700 Subject: [PATCH 548/817] Add support to generate /e/n/i when there are multiple MGMT_INTERFACE (#11368) Why I did it Currently interfaces.j2 hardcodes to eth0 even when there are multiple interfaces in MGMT_INTERFACE. This change adds support to generate /e/n/i when there are multiple interfaces in MGMT_INTERFACE. How I did it By removing hardcoded eth0 when looping through MGMT_INTERFACE. How to verify it Verified through unit test. Which release branch to backport (provide reason below if selected) 201811 201911 202006 202012 202106 202111 202205 Description for the changelog Link to config_db schema for YANG module changes A picture of a cute animal (not mandatory but encouraged) --- files/image_config/interfaces/interfaces.j2 | 16 +- src/sonic-config-engine/minigraph.py | 4 +- .../sample_output/py2/two_mgmt_interfaces | 76 ++ .../sample_output/py3/two_mgmt_interfaces | 76 ++ .../tests/t0-sample-graph-two-mgmt.xml | 953 ++++++++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 5 + 6 files changed, 1123 insertions(+), 7 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces create mode 100644 src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces create mode 100644 src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 1e554e4ed716..295cebe35201 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -30,8 +30,8 @@ iface lo inet loopback {% block mgmt_interface %} # The management network interface -auto eth0 {% if (ZTP_DHCP_DISABLED is not defined) and (ZTP is defined) and (ZTP['mode'] is defined and ZTP['mode']['profile'] == 'active') %} +auto eth0 # ZTP out-of-band interface @@ -64,8 +64,11 @@ iface {{ port }} inet6 dhcp {% else %} {% if MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE|pfx_filter|unique(attribute=0) %} +auto {{ name }} +{% endfor %} {% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} -iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static +iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} network {{ prefix | network }} @@ -77,15 +80,15 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static {% endif %} ########## management network policy routing rules # management port up rules - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} metric 201 - up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} metric 201 + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} up ip {{ '-4' if prefix | ipv4 else '-6' }} rule add pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} up ip rule add pref 32764 to {{ route }} table {{ vrf_table }} {% endfor %} # management port down rules - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table {{ vrf_table }} - pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev {{ name }} table {{ vrf_table }} + pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev {{ name }} table {{ vrf_table }} pre-down ip {{ '-4' if prefix | ipv4 else '-6' }} rule delete pref 32765 from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table {{ vrf_table }} {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} pre-down ip rule delete pref 32764 to {{ route }} table {{ vrf_table }} @@ -93,6 +96,7 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static {# TODO: COPP policy type rules #} {% endfor %} {% else %} +auto eth0 iface eth0 inet dhcp metric 202 {% if (MGMT_VRF_CONFIG) and (MGMT_VRF_CONFIG['vrf_global']['mgmtVrfEnabled'] == "true") %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index bee0d89af989..282356924b92 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -10,6 +10,7 @@ from lxml import etree as ET from lxml.etree import QName +from natsort import natsorted, ns as natsortns from portconfig import get_port_config from sonic_py_common.interface import backplane_prefix @@ -1484,7 +1485,8 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['MGMT_INTERFACE'] = {} mgmt_intf_count = 0 mgmt_alias_reverse_mapping = {} - for key in mgmt_intf: + sorted_keys = natsorted(mgmt_intf.keys(), alg=natsortns.IGNORECASE, key=lambda x : "|".join(x)) + for key in sorted_keys: alias = key[0] if alias in mgmt_alias_reverse_mapping: name = mgmt_alias_reverse_mapping[alias] diff --git a/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces new file mode 100644 index 000000000000..12136a316acb --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/two_mgmt_interfaces @@ -0,0 +1,76 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth1 +auto eth0 +iface eth1 inet static + address 10.0.10.100 + netmask 255.255.255.0 + network 10.0.10.0 + broadcast 10.0.10.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 + up ip -4 route add 10.0.10.0/24 dev eth1 table default + up ip -4 rule add pref 32765 from 10.0.10.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default + pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default + pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default +iface eth0 inet static + address 10.0.0.100 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 + up ip -4 route add 10.0.0.0/24 dev eth0 table default + up ip -4 rule add pref 32765 from 10.0.0.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default + pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default + pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default +iface eth1 inet6 static + address 2603:10e2:0:abcd::8 + netmask 64 + network 2603:10e2:0:abcd:: + broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 + up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default + pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default +iface eth0 inet6 static + address 2603:10e2:0:2902::8 + netmask 64 + network 2603:10e2:0:2902:: + broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 + up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces b/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces new file mode 100644 index 000000000000..7fa99896e8c2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/two_mgmt_interfaces @@ -0,0 +1,76 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback + address 127.0.0.1 + netmask 255.255.0.0 + scope host + post-up ip addr del 127.0.0.1/8 dev lo + +# The management network interface +auto eth0 +auto eth1 +iface eth0 inet static + address 10.0.0.100 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.0.1 dev eth0 table default metric 201 + up ip -4 route add 10.0.0.0/24 dev eth0 table default + up ip -4 rule add pref 32765 from 10.0.0.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.0.1 dev eth0 table default + pre-down ip -4 route delete 10.0.0.0/24 dev eth0 table default + pre-down ip -4 rule delete pref 32765 from 10.0.0.100/32 table default +iface eth0 inet6 static + address 2603:10e2:0:2902::8 + netmask 64 + network 2603:10e2:0:2902:: + broadcast 2603:10e2:0:2902:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default metric 201 + up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:2902::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + pre-down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:2902::8/128 table default +iface eth1 inet static + address 10.0.10.100 + netmask 255.255.255.0 + network 10.0.10.0 + broadcast 10.0.10.255 + ########## management network policy routing rules + # management port up rules + up ip -4 route add default via 10.0.10.1 dev eth1 table default metric 201 + up ip -4 route add 10.0.10.0/24 dev eth1 table default + up ip -4 rule add pref 32765 from 10.0.10.100/32 table default + # management port down rules + pre-down ip -4 route delete default via 10.0.10.1 dev eth1 table default + pre-down ip -4 route delete 10.0.10.0/24 dev eth1 table default + pre-down ip -4 rule delete pref 32765 from 10.0.10.100/32 table default +iface eth1 inet6 static + address 2603:10e2:0:abcd::8 + netmask 64 + network 2603:10e2:0:abcd:: + broadcast 2603:10e2:0:abcd:ffff:ffff:ffff:ffff + ########## management network policy routing rules + # management port up rules + up ip -6 route add default via 2603:10e2:0:abcd::1 dev eth1 table default metric 201 + up ip -6 route add 2603:10e2:0:abcd::/64 dev eth1 table default + up ip -6 rule add pref 32765 from 2603:10e2:0:abcd::8/128 table default + # management port down rules + pre-down ip -6 route delete default via 2603:10e2:0:abcd::1 dev eth1 table default + pre-down ip -6 route delete 2603:10e2:0:abcd::/64 dev eth1 table default + pre-down ip -6 rule delete pref 32765 from 2603:10e2:0:abcd::8/128 table default +# +source /etc/network/interfaces.d/* +# + diff --git a/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml b/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml new file mode 100644 index 000000000000..da1b56fe1309 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph-two-mgmt.xml @@ -0,0 +1,953 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 1 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
+ + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + LoopbackIP1 + Loopback1 + + 10.10.0.99/32 + + 10.10.0.99/32 + + + LoopbackIP2 + Loopback2 + + 10.21.0.64/32 + + 10.21.0.64/32 + + + LoopbackIP3 + Loopback3 + + 10.21.64.2/32 + + 10.21.64.2/32 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + HostIP + eth0 + + 2603:10e2:0:2902::8/64 + + 2603:10e2:0:2902::8/64 + + + HostIP1 + eth1 + + 10.0.10.100/24 + + 10.0.10.100/24 + + + HostIP1 + eth1 + + 2603:10e2:0:abcd::8/64 + + 2603:10e2:0:abcd::8/64 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + + + + + Vlan2000 + fortyGigE0/112;fortyGigE0/116;fortyGigE0/120 + False + 0.0.0.0/0 + + + + 2000 + 2000 + 192.168.200.0/27 + + + + + Vlan99 + fortyGigE0/100 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 99 + 99 + + + + + + Vlan98 + fortyGigE0/100;PortChannel01;PortChannel03 + False + 0.0.0.0/0 + + UserDefinedL2Vlan + 192.0.0.1;192.0.0.2 + 98 + 98 + + + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + Vlan2000 + 192.168.200.1/27 + + + + + + ERSPAN + everflow + Everflow + + + ERSPANv6 + everflowV6 + Everflow + + + EGRESS_ERSPAN + everflow_egress + Everflow + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + DataAclIngress + DataPlane + + + PortChannel01;PortChannel02;Vlan98 + DataAclEgress + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + NTP + NTP_ACL + NTP + + + SSH + SSH_ACL + SSH + + + SSH + ROUTER-PROTECT + SSH + + + SNMP + ROUTER-PROTECT + SNMP + + + NTP + NTP_ACL + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + 100000 + + + DeviceInterfaceLink + 100000 + switch-t0 + fortyGigE0/4 + true + ARISTA05T1 + Ethernet1/33 + true + + + DeviceInterfaceLink + Servers0 + eth0 + switch-t0 + fortyGigE0/4 + + + DeviceInterfaceLink + Servers100 + eth0 + switch-t0 + fortyGigE0/100 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + Force10-S6000 + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + + + + + + + AutoNegotiation + + True + + + FECDisabled + + True + + + ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + False + + + FECDisabled + + True + + + ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 247615ca6973..8ddca0908660 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -20,6 +20,7 @@ def setUp(self): self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.t0_mvrf_minigraph = os.path.join(self.test_dir, 't0-sample-graph-mvrf.xml') self.t0_minigraph_nomgmt = os.path.join(self.test_dir, 't0-sample-graph-nomgmt.xml') + self.t0_minigraph_two_mgmt = os.path.join(self.test_dir, 't0-sample-graph-two-mgmt.xml') self.t0_mvrf_minigraph_nomgmt = os.path.join(self.test_dir, 't0-sample-graph-mvrf-nomgmt.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') @@ -119,6 +120,10 @@ def test_interfaces(self): self.run_script(argument) self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'mvrf_interfaces'), self.output_file)) + argument = '-m ' + self.t0_minigraph_two_mgmt + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(utils.cmp(os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'two_mgmt_interfaces'), self.output_file), self.output_file) + # ZTP disabled, no MGMT_INTERFACE defined argument = '-m ' + self.t0_minigraph_nomgmt + ' -p ' + self.t0_port_config + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) From 429254cb2d756e1851050c659d48a718fd7e1973 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Tue, 12 Jul 2022 18:00:57 -0400 Subject: [PATCH 549/817] [arm] Refactor installer and build to allow arm builds targeted at grub platforms (#11341) Refactors the SONiC Installer to support greater flexibility in building for a given architecture and bootloader. #### Why I did it Currently the SONiC installer assumes that if a platform is ARM based that it uses the `uboot` bootloader and uses the `grub` bootloader otherwise. This is not a correct assumption to make as ARM is not strictly tied to uboot and x86 is not strictly tied to grub. #### How I did it To implement this I introduce the following changes: * Remove the different arch folders from the `installer/` directory * Merge the generic components of the ARM and x86 installer into `installer/installer.sh` * Refactor x86 + grub specific functions into `installer/default_platform.conf` * Modify installer to call `default_platform.conf` file and also call `platform/[platform]/patform.conf` file as well to override as needed * Update references to the installer in the `build_image.sh` script * Add `TARGET_BOOTLOADER` variable that is by default `uboot` for ARM devices and `grub` for x86 unless overridden in `platform/[platform]/rules.mk` * Update bootloader logic in `build_debian.sh` to be based on `TARGET_BOOTLOADER` instead of `TARGET_ARCH` and to reference the grub package in a generic manner #### How to verify it This has been tested on a ARM test platform as well as on Mellanox amd64 switches as well to ensure there was no impact. #### Description for the changelog [arm] Refactor installer and build to allow arm builds targeted at grub platforms #### Link to config_db schema for YANG module changes N/A --- Makefile.work | 6 + build_debian.sh | 18 +- build_image.sh | 8 +- .../build_templates/sonic_debian_extension.j2 | 2 +- files/image_config/platform/rc.local | 2 +- installer/armhf/install.sh | 197 ------- .../install.sh => default_platform.conf} | 487 ++++++------------ installer/{arm64 => }/install.sh | 67 ++- .../{x86_64 => }/tests/sample_machine.conf | 0 .../{x86_64 => }/tests/test_read_conf.sh | 2 +- onie-mk-demo.sh | 10 +- slave.mk | 1 + 12 files changed, 236 insertions(+), 564 deletions(-) delete mode 100755 installer/armhf/install.sh rename installer/{x86_64/install.sh => default_platform.conf} (54%) rename installer/{arm64 => }/install.sh (76%) rename installer/{x86_64 => }/tests/sample_machine.conf (100%) rename installer/{x86_64 => }/tests/test_read_conf.sh (99%) diff --git a/Makefile.work b/Makefile.work index b9d930a5d93e..c9db8b00f81a 100644 --- a/Makefile.work +++ b/Makefile.work @@ -104,6 +104,12 @@ ifeq ($(PLATFORM_ARCH),) override PLATFORM_ARCH = $(CONFIGURED_ARCH) endif +ifeq ($(CONFIGURED_ARCH),amd64) +TARGET_BOOTLOADER = grub +else +TARGET_BOOTLOADER = uboot +endif + ifeq ($(BLDENV), bullseye) SLAVE_DIR = sonic-slave-bullseye else ifeq ($(BLDENV), buster) diff --git a/build_debian.sh b/build_debian.sh index a4c1fddca1b8..92ecb7ac1653 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -65,7 +65,7 @@ if [[ -d $FILESYSTEM_ROOT ]]; then fi mkdir -p $FILESYSTEM_ROOT mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR -mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/x86_64-grub +mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/grub touch $FILESYSTEM_ROOT/$PLATFORM_DIR/firsttime ## ensure proc is mounted @@ -162,7 +162,7 @@ if [ "$SONIC_ENABLE_SECUREBOOT_SIGNATURE" = "y" ]; then fi echo '[INFO] Signing SONiC linux kernel image' - K=$FILESYSTEM_ROOT/boot/vmlinuz-${LINUX_KERNEL_VERSION}-amd64 + K=$FILESYSTEM_ROOT/boot/vmlinuz-${LINUX_KERNEL_VERSION}-${CONFIGURED_ARCH} sbsign --key $SIGNING_KEY --cert $SIGNING_CERT --output /tmp/${K##*/} ${K} sudo cp -f /tmp/${K##*/} ${K} fi @@ -392,11 +392,17 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in systemd-sysv \ ntp -if [[ $CONFIGURED_ARCH == amd64 ]]; then +if [[ $TARGET_BOOTLOADER == grub ]]; then + if [[ $CONFIGURED_ARCH == amd64 ]]; then + GRUB_PKG=grub-pc-bin + elif [[ $CONFIGURED_ARCH == arm64 ]]; then + GRUB_PKG=grub-efi-arm64-bin + fi + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \ - grub-pc-bin + $GRUB_PKG - sudo mv $FILESYSTEM_ROOT/grub-pc-bin*.deb $FILESYSTEM_ROOT/$PLATFORM_DIR/x86_64-grub + sudo mv $FILESYSTEM_ROOT/grub*.deb $FILESYSTEM_ROOT/$PLATFORM_DIR/grub fi ## Disable kexec supported reboot which was installed by default @@ -572,7 +578,7 @@ fi ## Update initramfs sudo chroot $FILESYSTEM_ROOT update-initramfs -u ## Convert initrd image to u-boot format -if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then +if [[ $TARGET_BOOTLOADER == uboot ]]; then INITRD_FILE=initrd.img-${LINUX_KERNEL_VERSION}-${CONFIGURED_ARCH} if [[ $CONFIGURED_ARCH == armhf ]]; then INITRD_FILE=initrd.img-${LINUX_KERNEL_VERSION}-armmp diff --git a/build_image.sh b/build_image.sh index 69ea4ddf56ca..ddf134e845ce 100755 --- a/build_image.sh +++ b/build_image.sh @@ -84,7 +84,7 @@ generate_onie_installer_image() ## Generate an ONIE installer image ## Note: Don't leave blank between lines. It is single line command. - ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ + ./onie-mk-demo.sh $CONFIGURED_ARCH $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ installer platform/$TARGET_MACHINE/platform.conf $output_file OS $IMAGE_VERSION $ONIE_IMAGE_PART_SIZE \ $ONIE_INSTALLER_PAYLOAD } @@ -111,7 +111,7 @@ if [ "$IMAGE_TYPE" = "onie" ]; then mkdir -p `dirname $OUTPUT_ONIE_IMAGE` sudo rm -f $OUTPUT_ONIE_IMAGE - generate_device_list "./installer/$TARGET_PLATFORM/platforms_asic" + generate_device_list "./installer/platforms_asic" generate_onie_installer_image @@ -125,7 +125,7 @@ elif [ "$IMAGE_TYPE" = "raw" ]; then mkdir -p `dirname $OUTPUT_RAW_IMAGE` sudo rm -f $OUTPUT_RAW_IMAGE - generate_device_list "./installer/$TARGET_PLATFORM/platforms_asic" + generate_device_list "./installer/platforms_asic" generate_onie_installer_image "$tmp_output_onie_image" @@ -159,7 +159,7 @@ elif [ "$IMAGE_TYPE" = "raw" ]; then elif [ "$IMAGE_TYPE" = "kvm" ]; then - generate_device_list "./installer/$TARGET_PLATFORM/platforms_asic" + generate_device_list "./installer/platforms_asic" generate_onie_installer_image # Generate single asic KVM image diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index db35658ed901..57449e655c2d 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -297,7 +297,7 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libnss-radius_*.deb || \ sudo sed -i -e '/^passwd/s/ radius//' $FILESYSTEM_ROOT/etc/nsswitch.conf # Install a custom version of kdump-tools (and its dependencies via 'apt-get -y install -f') -if [[ $CONFIGURED_ARCH == amd64 ]]; then +if [[ $TARGET_BOOTLOADER == grub ]]; then sudo DEBIAN_FRONTEND=noninteractive dpkg --root=$FILESYSTEM_ROOT -i $debs_path/kdump-tools_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true chroot $FILESYSTEM_ROOT apt-get -q --no-install-suggests --no-install-recommends install cat $IMAGE_CONFIGS/kdump/kdump-tools | sudo tee -a $FILESYSTEM_ROOT/etc/default/kdump-tools > /dev/null diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 647d552427ac..8f3de778f736 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -293,7 +293,7 @@ if [ -f $FIRST_BOOT_FILE ]; then # we now install a grub for SONiC. if [ -n "$onie_platform" ] && [ -n "$grub_installation_needed" ]; then - grub_bin=$(ls /host/image-$SONIC_VERSION/platform/x86_64-grub/grub-pc-bin*.deb 2> /dev/null) + grub_bin=$(ls /host/image-$SONIC_VERSION/platform/grub/grub*.deb 2> /dev/null) if [ -z "$grub_bin" ]; then log_migration "Unable to locate grub package !" firsttime_exit diff --git a/installer/armhf/install.sh b/installer/armhf/install.sh deleted file mode 100755 index 4ced27f48fa6..000000000000 --- a/installer/armhf/install.sh +++ /dev/null @@ -1,197 +0,0 @@ -#!/bin/sh - -# Copyright (C) Marvell Inc -# - -_trap_push() { - local next="$1" - eval "trap_push() { - local oldcmd='$(echo "$next" | sed -e s/\'/\'\\\\\'\'/g)' - local newcmd=\"\$1; \$oldcmd\" - trap -- \"\$newcmd\" EXIT INT TERM HUP - _trap_push \"\$newcmd\" - }" -} -_trap_push true - -set -e - -if [ -d "/etc/sonic" ]; then - echo "Installing SONiC in SONiC" - install_env="sonic" -elif grep -Fxqs "DISTRIB_ID=onie" /etc/lsb-release > /dev/null -then - echo "Installing SONiC in ONIE" - install_env="onie" -else - echo "Installing SONiC in BUILD" - install_env="build" -fi - -cd $(dirname $0) -if [ -r ./machine.conf ]; then - . ./machine.conf -fi - -if [ -r ./onie-image-armhf.conf ]; then - . ./onie-image-armhf.conf -fi - -echo "ONIE Installer: platform: $platform" - -# Make sure run as root or under 'sudo' -if [ $(id -u) -ne 0 ] - then echo "Please run as root" - exit 1 -fi - -if [ -r /etc/machine.conf ]; then - . /etc/machine.conf -elif [ -r /host/machine.conf ]; then - . /host/machine.conf -elif [ "$install_env" != "build" ]; then - echo "cannot find machine.conf" - exit 1 -fi - -echo "onie_platform: $onie_platform" - -# Get platform specific linux kernel command line arguments -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" - -# Default var/log device size in MB -VAR_LOG_SIZE=4096 - -[ -r platforms/$onie_platform ] && . platforms/$onie_platform - -# Verify image platform is inside devices list -if [ "$install_env" = "onie" ]; then - if ! grep -Fxq "$onie_platform" platforms_asic; then - echo "The image you're trying to install is of a different ASIC type as the running platform's ASIC" - while true; do - read -r -p "Do you still wish to install this image? [y/n]: " input - case $input in - [Yy]) - echo "Force installing..." - break - ;; - [Nn]) - echo "Exited installation!" - exit 1 - ;; - *) - echo "Error: Invalid input" - ;; - esac - done - fi -fi - -# If running in ONIE -if [ "$install_env" = "onie" ]; then - # The onie bin tool prefix - onie_bin= - # The persistent ONIE directory location - onie_root_dir=/mnt/onie-boot/onie - # The onie file system root - onie_initrd_tmp=/ -fi - -# The build system prepares this script by replacing %%DEMO-TYPE%% -# with "OS" or "DIAG". -demo_type="%%DEMO_TYPE%%" - -# The build system prepares this script by replacing %%IMAGE_VERSION%% -# with git revision hash as a version identifier -image_version="%%IMAGE_VERSION%%" -timestamp="$(date -u +%Y%m%d)" - -demo_volume_label="SONiC-${demo_type}" -demo_volume_revision_label="SONiC-${demo_type}-${image_version}" - - -. ./platform.conf - -image_dir="image-$image_version" - -if [ "$install_env" = "onie" ]; then - # Create/format the flash - create_partition - mount_partition -elif [ "$install_env" = "sonic" ]; then - demo_mnt="/host" - # Get current SONiC image (grub/aboot/uboot) - eval running_sonic_revision="$(cat /proc/cmdline | sed -n 's/^.*loop=\/*image-\(\S\+\)\/.*$/\1/p')" - # Verify SONiC image exists - if [ ! -d "$demo_mnt/image-$running_sonic_revision" ]; then - echo "ERROR: SONiC installation is corrupted: path $demo_mnt/image-$running_sonic_revision doesn't exist" - exit 1 - fi - # Prevent installing existing SONiC if it is running - if [ "$image_dir" = "image-$running_sonic_revision" ]; then - echo "Not installing SONiC version $running_sonic_revision, as current running SONiC has the same version" - exit 0 - fi - # Remove extra SONiC images if any - for f in $demo_mnt/image-* ; do - if [ -d $f ] && [ "$f" != "$demo_mnt/image-$running_sonic_revision" ] && [ "$f" != "$demo_mnt/$image_dir" ]; then - echo "Removing old SONiC installation $f" - rm -rf $f - fi - done -fi - -# Create target directory or clean it up if exists -if [ -d $demo_mnt/$image_dir ]; then - echo "Directory $demo_mnt/$image_dir/ already exists. Cleaning up..." - rm -rf $demo_mnt/$image_dir/* -else - mkdir $demo_mnt/$image_dir || { - echo "Error: Unable to create SONiC directory" - exit 1 - } -fi - -# Decompress the file for the file system directly to the partition -if [ x"$docker_inram" = x"on" ]; then - # when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd - unzip -o $ONIE_INSTALLER_PAYLOAD -x "platform.tar.gz" -d $demo_mnt/$image_dir -else - unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $demo_mnt/$image_dir - - if [ "$install_env" = "onie" ]; then - TAR_EXTRA_OPTION="--numeric-owner" - else - TAR_EXTRA_OPTION="--numeric-owner --warning=no-timestamp" - fi - mkdir -p $demo_mnt/$image_dir/$DOCKERFS_DIR - unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR -fi - -mkdir -p $demo_mnt/$image_dir/platform -unzip -op $ONIE_INSTALLER_PAYLOAD "platform.tar.gz" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/platform - -if [ "$install_env" = "onie" ]; then - # Store machine description in target file system - if [ -f /etc/machine-build.conf ]; then - # onie_ variable are generate at runtime. - # they are no longer hardcoded in /etc/machine.conf - # also remove single quotes around the value - set | grep ^onie | sed -e "s/='/=/" -e "s/'$//" > $demo_mnt/machine.conf - else - cp /etc/machine.conf $demo_mnt - fi -fi - -extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% -echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" - -# Update Bootloader Menu with installed image -bootloader_menu_config - -# Set NOS mode if available. For manufacturing diag installers, you -# probably want to skip this step so that the system remains in ONIE -# "installer" mode for installing a true NOS later. -if [ -x /bin/onie-nos-mode ] ; then - /bin/onie-nos-mode -s -fi diff --git a/installer/x86_64/install.sh b/installer/default_platform.conf similarity index 54% rename from installer/x86_64/install.sh rename to installer/default_platform.conf index 926c54683a9e..af3fa8fc2235 100755 --- a/installer/x86_64/install.sh +++ b/installer/default_platform.conf @@ -1,119 +1,5 @@ #!/bin/sh -# Copyright (C) 2014-2015 Curt Brune -# Copyright (C) 2014-2015 david_yang -# -# SPDX-License-Identifier: GPL-2.0 - -# Appends a command to a trap, which is needed because default trap behavior is to replace -# previous trap for the same signal -# - 1st arg: code to add -# - ref: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal -_trap_push() { - local next="$1" - eval "trap_push() { - local oldcmd='$(echo "$next" | sed -e s/\'/\'\\\\\'\'/g)' - local newcmd=\"\$1; \$oldcmd\" - trap -- \"\$newcmd\" EXIT INT TERM HUP - _trap_push \"\$newcmd\" - }" -} -_trap_push true - -read_conf_file() { - local conf_file=$1 - while IFS='=' read -r var value || [ -n "$var" ] - do - # remove newline character - var=$(echo $var | tr -d '\r\n') - value=$(echo $value | tr -d '\r\n') - # remove comment string - var=${var%#*} - value=${value%#*} - # skip blank line - [ -z "$var" ] && continue - # remove double quote in the beginning - tmp_val=${value#\"} - # remove double quote in the end - value=${tmp_val%\"} - eval "$var=\"$value\"" - done < "$conf_file" -} - -# Main -set -e -cd $(dirname $0) - -if [ -d "/etc/sonic" ]; then - echo "Installing SONiC in SONiC" - install_env="sonic" -elif grep -Fxqs "DISTRIB_ID=onie" /etc/lsb-release > /dev/null -then - echo "Installing SONiC in ONIE" - install_env="onie" -else - echo "Installing SONiC in BUILD" - install_env="build" -fi - -if [ -r ./machine.conf ]; then - read_conf_file "./machine.conf" -fi - -if [ -r ./onie-image.conf ]; then -. ./onie-image.conf -fi - -echo "ONIE Installer: platform: $platform" - -# Make sure run as root or under 'sudo' -if [ $(id -u) -ne 0 ] - then echo "Please run as root" - exit 1 -fi - -# get running machine from conf file -if [ -r /etc/machine.conf ]; then - read_conf_file "/etc/machine.conf" -elif [ -r /host/machine.conf ]; then - read_conf_file "/host/machine.conf" -elif [ "$install_env" != "build" ]; then - echo "cannot find machine.conf" - exit 1 -fi - -echo "onie_platform: $onie_platform" - -# Get platform specific linux kernel command line arguments -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" - -# Default var/log device size in MB -VAR_LOG_SIZE=4096 - -[ -r platforms/$onie_platform ] && . platforms/$onie_platform - -# Verify image platform is inside devices list -if [ "$install_env" = "onie" ]; then - if ! grep -Fxq "$onie_platform" platforms_asic; then - echo "The image you're trying to install is of a different ASIC type as the running platform's ASIC" - while true; do - read -r -p "Do you still wish to install this image? [y/n]: " input - case $input in - [Yy]) - echo "Force installing..." - break - ;; - [Nn]) - echo "Exited installation!" - exit 1 - ;; - *) - echo "Error: Invalid input" - ;; - esac - done - fi -fi # Pick up console port and speed from install enviroment if not defined yet. # Console port and speed setting in cmdline is like "console=ttyS0,9600n", @@ -145,69 +31,75 @@ if [ -z "$CONSOLE_SPEED" ]; then fi fi -# Install demo on same block device as ONIE -if [ "$install_env" != "build" ]; then - onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') - blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') +create_partition() +{ - # check if we have an nvme device - blk_suffix= - echo $blk_dev | grep -q nvme0 && blk_suffix="p" + # Install demo on same block device as ONIE + if [ "$install_env" != "build" ]; then + onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') + blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') - # Note: ONIE has no mount setting for / with device node, so below will be empty string - cur_part=$(cat /proc/mounts | awk "{ if(\$2==\"/\") print \$1 }" | grep $blk_dev || true) + # check if we have an nvme device + blk_suffix= + echo $blk_dev | grep -q nvme0 && blk_suffix="p" - [ -b "$blk_dev" ] || { - echo "Error: Unable to determine block device of ONIE install" - exit 1 - } -fi + # Note: ONIE has no mount setting for / with device node, so below will be empty string -# If running in ONIE -if [ "$install_env" = "onie" ]; then - # The onie bin tool prefix - onie_bin= - # The persistent ONIE directory location - onie_root_dir=/mnt/onie-boot/onie - # The onie file system root - onie_initrd_tmp=/ -fi + cur_part=$(cat /proc/mounts | awk "{ if(\$2==\"/\") print \$1 }" | grep $blk_dev || true) + + [ -b "$blk_dev" ] || { + echo "Error: Unable to determine block device of ONIE install" + exit 1 + } + fi + + # auto-detect whether BIOS or UEFI + if [ -d "/sys/firmware/efi/efivars" ] ; then + firmware="uefi" + else + firmware="bios" + fi + + if [ "$install_env" = "onie" ]; then + # determine ONIE partition type + onie_partition_type=$(${onie_bin} onie-sysinfo -t) + # demo partition size in MB + demo_part_size="%%ONIE_IMAGE_PART_SIZE%%" + if [ "$firmware" = "uefi" ] ; then + create_demo_uefi_partition $blk_dev + elif [ "$onie_partition_type" = "gpt" ] ; then + create_demo_gpt_partition $blk_dev + elif [ "$onie_partition_type" = "msdos" ] ; then + create_demo_msdos_partition $blk_dev + else + echo "ERROR: Unsupported partition type: $onie_partition_type" + exit 1 + fi + fi -# The build system prepares this script by replacing %%DEMO-TYPE%% -# with "OS" or "DIAG". -demo_type="%%DEMO_TYPE%%" +} -# The build system prepares this script by replacing %%IMAGE_VERSION%% -# with git revision hash as a version identifier -image_version="%%IMAGE_VERSION%%" -timestamp="$(date -u +%Y%m%d)" +mount_partition() +{ -demo_volume_label="SONiC-${demo_type}" -demo_volume_revision_label="SONiC-${demo_type}-${image_version}" + demo_dev=$(echo $blk_dev | sed -e 's/\(mmcblk[0-9]\)/\1p/')$demo_part + echo $blk_dev | grep -q nvme0 && demo_dev=$(echo $blk_dev | sed -e 's/\(nvme[0-9]n[0-9]\)/\1p/')$demo_part -# auto-detect whether BIOS or UEFI -if [ -d "/sys/firmware/efi/efivars" ] ; then - firmware="uefi" -else - firmware="bios" -fi + # Make filesystem + mkfs.ext4 -L $demo_volume_label $demo_dev -if [ "$install_env" = "onie" ]; then - # determine ONIE partition type - onie_partition_type=$(${onie_bin} onie-sysinfo -t) - # demo partition size in MB - demo_part_size="%%ONIE_IMAGE_PART_SIZE%%" - if [ "$firmware" = "uefi" ] ; then - create_demo_partition="create_demo_uefi_partition" - elif [ "$onie_partition_type" = "gpt" ] ; then - create_demo_partition="create_demo_gpt_partition" - elif [ "$onie_partition_type" = "msdos" ] ; then - create_demo_partition="create_demo_msdos_partition" - else - echo "ERROR: Unsupported partition type: $onie_partition_type" + # Mount demo filesystem + demo_mnt=$(${onie_bin} mktemp -d) || { + echo "Error: Unable to create file system mount point" exit 1 - fi -fi + } + trap_push "${onie_bin} fuser -km $demo_mnt || ${onie_bin} umount $demo_mnt || ${onie_bin} rmdir $demo_mnt || true" + ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { + echo "Error: Unable to mount $demo_dev on $demo_mnt" + exit 1 + } + +} # Creates a new partition for the DEMO OS. # @@ -457,161 +349,71 @@ demo_install_uefi_grub() # Configure EFI NVRAM Boot variables. --create also sets the # new boot number as active. + grub=$(find /boot/efi/EFI/$demo_volume_label/ -name grub*.efi -exec basename {} \;) efibootmgr --quiet --create \ --label "$demo_volume_label" \ --disk $blk_dev --part $uefi_part \ - --loader "/EFI/$demo_volume_label/grubx64.efi" || { + --loader "/EFI/$demo_volume_label/$grub" || { echo "ERROR: efibootmgr failed to create new boot variable on: $blk_dev" exit 1 } } -image_dir="image-$image_version" -if [ "$install_env" = "onie" ]; then - eval $create_demo_partition $blk_dev - demo_dev=$(echo $blk_dev | sed -e 's/\(mmcblk[0-9]\)/\1p/')$demo_part - echo $blk_dev | grep -q nvme0 && demo_dev=$(echo $blk_dev | sed -e 's/\(nvme[0-9]n[0-9]\)/\1p/')$demo_part - - # Make filesystem - mkfs.ext4 -L $demo_volume_label $demo_dev - - # Mount demo filesystem - demo_mnt=$(${onie_bin} mktemp -d) || { - echo "Error: Unable to create file system mount point" - exit 1 - } - trap_push "${onie_bin} fuser -km $demo_mnt || ${onie_bin} umount $demo_mnt || ${onie_bin} rmdir $demo_mnt || true" - ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { - echo "Error: Unable to mount $demo_dev on $demo_mnt" - exit 1 - } - -elif [ "$install_env" = "sonic" ]; then - demo_mnt="/host" - # Get current SONiC image (grub/aboot/uboot) - eval running_sonic_revision="$(cat /proc/cmdline | sed -n 's/^.*loop=\/*image-\(\S\+\)\/.*$/\1/p')" - # Verify SONiC image exists - if [ ! -d "$demo_mnt/image-$running_sonic_revision" ]; then - echo "ERROR: SONiC installation is corrupted: path $demo_mnt/image-$running_sonic_revision doesn't exist" - exit 1 - fi - # Prevent installing existing SONiC if it is running - if [ "$image_dir" = "image-$running_sonic_revision" ]; then - echo "Not installing SONiC version $running_sonic_revision, as current running SONiC has the same version" - exit 0 - fi - # Remove extra SONiC images if any - for f in $demo_mnt/image-* ; do - if [ -d $f ] && [ "$f" != "$demo_mnt/image-$running_sonic_revision" ] && [ "$f" != "$demo_mnt/$image_dir" ]; then - echo "Removing old SONiC installation $f" - rm -rf $f - fi - done -else - demo_mnt="build_raw_image_mnt" - demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" - - mkfs.ext4 -L $demo_volume_label $demo_dev - - echo "Mounting $demo_dev on $demo_mnt..." - mkdir $demo_mnt - mount -t auto -o loop $demo_dev $demo_mnt -fi - -echo "Installing SONiC to $demo_mnt/$image_dir" - -# Create target directory or clean it up if exists -if [ -d $demo_mnt/$image_dir ]; then - echo "Directory $demo_mnt/$image_dir/ already exists. Cleaning up..." - rm -rf $demo_mnt/$image_dir/* -else - mkdir $demo_mnt/$image_dir || { - echo "Error: Unable to create SONiC directory" - exit 1 - } -fi - -# Decompress the file for the file system directly to the partition -if [ x"$docker_inram" = x"on" ]; then - # when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd - unzip -o $ONIE_INSTALLER_PAYLOAD -x "platform.tar.gz" -d $demo_mnt/$image_dir -else - unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $demo_mnt/$image_dir +bootloader_menu_config() +{ if [ "$install_env" = "onie" ]; then - TAR_EXTRA_OPTION="--numeric-owner" - else - TAR_EXTRA_OPTION="--numeric-owner --warning=no-timestamp" - fi - mkdir -p $demo_mnt/$image_dir/$DOCKERFS_DIR - unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR -fi - -mkdir -p $demo_mnt/$image_dir/platform -unzip -op $ONIE_INSTALLER_PAYLOAD "platform.tar.gz" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/platform - -if [ "$install_env" = "onie" ]; then - # Store machine description in target file system - if [ -f /etc/machine-build.conf ]; then - # onie_ variable are generate at runtime. - # they are no longer hardcoded in /etc/machine.conf - # also remove single quotes around the value - set | grep ^onie | sed -e "s/='/=/" -e "s/'$//" > $demo_mnt/machine.conf - else - cp /etc/machine.conf $demo_mnt - fi + # Store installation log in target file system + rm -f $onie_initrd_tmp/tmp/onie-support*.tar.bz2 + ${onie_bin} onie-support /tmp + mv $onie_initrd_tmp/tmp/onie-support*.tar.bz2 $demo_mnt/$image_dir/ - # Store installation log in target file system - rm -f $onie_initrd_tmp/tmp/onie-support*.tar.bz2 - ${onie_bin} onie-support /tmp - mv $onie_initrd_tmp/tmp/onie-support*.tar.bz2 $demo_mnt/$image_dir/ - - if [ "$firmware" = "uefi" ] ; then + if [ "$firmware" = "uefi" ] ; then demo_install_uefi_grub "$demo_mnt" "$blk_dev" - else + else demo_install_grub "$demo_mnt" "$blk_dev" + fi fi -fi -# Create a minimal grub.cfg that allows for: -# - configure the serial console -# - allows for grub-reboot to work -# - a menu entry for the DEMO OS -# - menu entries for ONIE - -grub_cfg=$(mktemp) -trap_push "rm $grub_cfg || true" - -# Set a few GRUB_xxx environment variables that will be picked up and -# used by the 50_onie_grub script. This is similiar to what an OS -# would specify in /etc/default/grub. -# -# GRUB_SERIAL_COMMAND -# GRUB_CMDLINE_LINUX - -[ -r ./platform.conf ] && . ./platform.conf - -# Check if the CPU vendor is 'Intel' and disable c-states if True -CPUVENDOR="$(cat /proc/cpuinfo | grep -m 1 vendor_id | awk '{print $3}')" -echo "Switch CPU vendor is: $CPUVENDOR" -if echo "$CPUVENDOR" | grep -i 'Intel' >/dev/null 2>&1; then - echo "Switch CPU cstates are: disabled" - CSTATES="intel_idle.max_cstate=0" -else - CSTATES="" -fi + # Create a minimal grub.cfg that allows for: + # - configure the serial console + # - allows for grub-reboot to work + # - a menu entry for the DEMO OS + # - menu entries for ONIE + + grub_cfg=$(mktemp) + trap_push "rm $grub_cfg || true" + + # Set a few GRUB_xxx environment variables that will be picked up and + # used by the 50_onie_grub script. This is similiar to what an OS + # would specify in /etc/default/grub. + # + # GRUB_SERIAL_COMMAND + # GRUB_CMDLINE_LINUX + + [ -r ./platform.conf ] && . ./platform.conf + + # Check if the CPU vendor is 'Intel' and disable c-states if True + CPUVENDOR="$(cat /proc/cpuinfo | grep -m 1 vendor_id | awk '{print $3}')" + echo "Switch CPU vendor is: $CPUVENDOR" + if echo "$CPUVENDOR" | grep -i 'Intel' >/dev/null 2>&1; then + echo "Switch CPU cstates are: disabled" + CSTATES="intel_idle.max_cstate=0" + else + CSTATES="" + fi -DEFAULT_GRUB_SERIAL_COMMAND="serial --port=${CONSOLE_PORT} --speed=${CONSOLE_SPEED} --word=8 --parity=no --stop=1" -DEFAULT_GRUB_CMDLINE_LINUX="console=tty0 console=ttyS${CONSOLE_DEV},${CONSOLE_SPEED}n8 quiet $CSTATES" -GRUB_SERIAL_COMMAND=${GRUB_SERIAL_COMMAND:-"$DEFAULT_GRUB_SERIAL_COMMAND"} -GRUB_CMDLINE_LINUX=${GRUB_CMDLINE_LINUX:-"$DEFAULT_GRUB_CMDLINE_LINUX"} -export GRUB_SERIAL_COMMAND -export GRUB_CMDLINE_LINUX + DEFAULT_GRUB_SERIAL_COMMAND="serial --port=${CONSOLE_PORT} --speed=${CONSOLE_SPEED} --word=8 --parity=no --stop=1" + DEFAULT_GRUB_CMDLINE_LINUX="console=tty0 console=ttyS${CONSOLE_DEV},${CONSOLE_SPEED}n8 quiet $CSTATES" + GRUB_SERIAL_COMMAND=${GRUB_SERIAL_COMMAND:-"$DEFAULT_GRUB_SERIAL_COMMAND"} + GRUB_CMDLINE_LINUX=${GRUB_CMDLINE_LINUX:-"$DEFAULT_GRUB_CMDLINE_LINUX"} + export GRUB_SERIAL_COMMAND + export GRUB_CMDLINE_LINUX -# Add common configuration, like the timeout and serial console. -cat < $grub_cfg + # Add common configuration, like the timeout and serial console. + cat < $grub_cfg $GRUB_SERIAL_COMMAND terminal_input console serial terminal_output console serial @@ -620,8 +422,8 @@ set timeout=5 EOF -# Add the logic to support grub-reboot and grub-set-default -cat <> $grub_cfg + # Add the logic to support grub-reboot and grub-set-default + cat <> $grub_cfg if [ -s \$prefix/grubenv ]; then load_env fi @@ -639,35 +441,34 @@ if [ "\${onie_entry}" ]; then unset onie_entry save_env onie_entry next_entry fi - EOF -if [ "$demo_type" = "DIAG" ] ; then - # Make sure ONIE install mode is the default boot mode for the - # diag partition. - cat <> $grub_cfg + if [ "$demo_type" = "DIAG" ] ; then + # Make sure ONIE install mode is the default boot mode for the + # diag partition. + cat <> $grub_cfg set default=ONIE EOF - $onie_root_dir/tools/bin/onie-boot-mode -q -o install -fi + $onie_root_dir/tools/bin/onie-boot-mode -q -o install + fi -# Add a menu entry for the SONiC OS -# Note: assume that apparmor is supported in the kernel -demo_grub_entry="$demo_volume_revision_label" -if [ "$install_env" = "sonic" ]; then - old_sonic_menuentry=$(cat /host/grub/grub.cfg | sed "/^menuentry '${demo_volume_label}-${running_sonic_revision}'/,/}/!d") - grub_cfg_root=$(echo $old_sonic_menuentry | sed -e "s/.*root\=\(.*\)rw.*/\1/") - onie_menuentry=$(cat /host/grub/grub.cfg | sed "/menuentry ONIE/,/}/!d") -elif [ "$install_env" = "build" ]; then - grub_cfg_root=%%SONIC_ROOT%% -else # install_env = "onie" - uuid=$(blkid "$demo_dev" | sed -ne 's/.* UUID=\"\([^"]*\)\".*/\1/p') - if [ -z "$uuid" ]; then + # Add a menu entry for the SONiC OS + # Note: assume that apparmor is supported in the kernel + demo_grub_entry="$demo_volume_revision_label" + if [ "$install_env" = "sonic" ]; then + old_sonic_menuentry=$(cat /host/grub/grub.cfg | sed "/^menuentry '${demo_volume_label}-${running_sonic_revision}'/,/}/!d") + grub_cfg_root=$(echo $old_sonic_menuentry | sed -e "s/.*root\=\(.*\)rw.*/\1/") + onie_menuentry=$(cat /host/grub/grub.cfg | sed "/menuentry ONIE/,/}/!d") + elif [ "$install_env" = "build" ]; then + grub_cfg_root=%%SONIC_ROOT%% + else # install_env = "onie" + uuid=$(blkid "$demo_dev" | sed -ne 's/.* UUID=\"\([^"]*\)\".*/\1/p') + if [ -z "$uuid" ]; then grub_cfg_root=$demo_dev - else + else grub_cfg_root=UUID=$uuid + fi fi -fi # Add extra linux command line extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% @@ -692,25 +493,27 @@ menuentry '$demo_grub_entry' { } EOF -if [ "$install_env" = "onie" ]; then - # Add menu entries for ONIE -- use the grub fragment provided by the - # ONIE distribution. - $onie_root_dir/grub.d/50_onie_grub >> $grub_cfg - mkdir -p $onie_initrd_tmp/$demo_mnt/grub -else -cat <> $grub_cfg + if [ "$install_env" = "onie" ]; then + # Add menu entries for ONIE -- use the grub fragment provided by the + # ONIE distribution. + $onie_root_dir/grub.d/50_onie_grub >> $grub_cfg + mkdir -p $onie_initrd_tmp/$demo_mnt/grub + else + cat <> $grub_cfg $old_sonic_menuentry $onie_menuentry EOF -fi + fi -if [ "$install_env" = "build" ]; then - cp $grub_cfg $demo_mnt/grub.cfg - umount $demo_mnt -else - cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg -fi + if [ "$install_env" = "build" ]; then + cp $grub_cfg $demo_mnt/grub.cfg + umount $demo_mnt + else + cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg + fi + + cd / -cd / + echo "Installed SONiC base image $demo_volume_label successfully" -echo "Installed SONiC base image $demo_volume_label successfully" +} diff --git a/installer/arm64/install.sh b/installer/install.sh similarity index 76% rename from installer/arm64/install.sh rename to installer/install.sh index 54ce1dda934e..8f4a515579b0 100755 --- a/installer/arm64/install.sh +++ b/installer/install.sh @@ -1,7 +1,16 @@ #!/bin/sh -# Copyright (C) Marvell Inc +# Copyright (C) 2020 Marvell Inc +# Copyright (C) 2014-2015 Curt Brune +# Copyright (C) 2014-2015 david_yang # +# SPDX-License-Identifier: GPL-2.0 + +# Appends a command to a trap, which is needed because default trap behavior is to replace +# previous trap for the same signal +# - 1st arg: code to add +# - ref: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal + _trap_push() { local next="$1" @@ -14,6 +23,26 @@ _trap_push() { } _trap_push true +read_conf_file() { + local conf_file=$1 + while IFS='=' read -r var value || [ -n "$var" ] + do + # remove newline character + var=$(echo $var | tr -d '\r\n') + value=$(echo $value | tr -d '\r\n') + # remove comment string + var=${var%#*} + value=${value%#*} + # skip blank line + [ -z "$var" ] && continue + # remove double quote in the beginning + tmp_val=${value#\"} + # remove double quote in the end + value=${tmp_val%\"} + eval "$var=\"$value\"" + done < "$conf_file" +} + set -e if [ -d "/etc/sonic" ]; then @@ -30,11 +59,17 @@ fi cd $(dirname $0) if [ -r ./machine.conf ]; then - . ./machine.conf + read_conf_file "./machine.conf" fi -if [ -r ./onie-image-arm64.conf ]; then - . ./onie-image-arm64.conf +# Load generic onie-image.conf +if [ -r ./onie-image.conf ]; then +. ./onie-image.conf +fi + +# Load arch-specific onie-image-[arch].conf if exists +if [ -r ./onie-image-*.conf ]; then +. ./onie-image-*.conf fi echo "ONIE Installer: platform: $platform" @@ -45,15 +80,17 @@ if [ $(id -u) -ne 0 ] exit 1 fi +# get running machine from conf file if [ -r /etc/machine.conf ]; then - . /etc/machine.conf + read_conf_file "/etc/machine.conf" elif [ -r /host/machine.conf ]; then - . /host/machine.conf + read_conf_file "/host/machine.conf" elif [ "$install_env" != "build" ]; then echo "cannot find machine.conf" exit 1 fi + echo "onie_platform: $onie_platform" # Get platform specific linux kernel command line arguments @@ -110,7 +147,12 @@ demo_volume_label="SONiC-${demo_type}" demo_volume_revision_label="SONiC-${demo_type}-${image_version}" -. ./platform.conf +. ./default_platform.conf + +if [ -r ./platform.conf ]; then + . ./platform.conf +fi + image_dir="image-$image_version" @@ -139,8 +181,19 @@ elif [ "$install_env" = "sonic" ]; then rm -rf $f fi done +else + demo_mnt="build_raw_image_mnt" + demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" + + mkfs.ext4 -L $demo_volume_label $demo_dev + + echo "Mounting $demo_dev on $demo_mnt..." + mkdir $demo_mnt + mount -t auto -o loop $demo_dev $demo_mnt fi +echo "Installing SONiC to $demo_mnt/$image_dir" + # Create target directory or clean it up if exists if [ -d $demo_mnt/$image_dir ]; then echo "Directory $demo_mnt/$image_dir/ already exists. Cleaning up..." diff --git a/installer/x86_64/tests/sample_machine.conf b/installer/tests/sample_machine.conf similarity index 100% rename from installer/x86_64/tests/sample_machine.conf rename to installer/tests/sample_machine.conf diff --git a/installer/x86_64/tests/test_read_conf.sh b/installer/tests/test_read_conf.sh similarity index 99% rename from installer/x86_64/tests/test_read_conf.sh rename to installer/tests/test_read_conf.sh index 06b7fc145eab..a293058b0147 100644 --- a/installer/x86_64/tests/test_read_conf.sh +++ b/installer/tests/test_read_conf.sh @@ -58,4 +58,4 @@ TEST_CONF "$onie_skip_ethmgmt_macs" "$exp_onie_skip_ethmgmt_macs" TEST_CONF "$onie_grub_image_name" "$exp_onie_grub_image_name" echo "PASS!!" -exit 0 \ No newline at end of file +exit 0 diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index 55d0404a1468..0905673d42cb 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -23,9 +23,9 @@ if [ ! -d $installer_dir ] || \ exit 1 fi -if [ ! -d $installer_dir/$arch ] || \ - [ ! -r $installer_dir/$arch/install.sh ] ; then - echo "Error: Invalid arch installer directory: $installer_dir/$arch" +if [ ! -d $installer_dir ] || \ + [ ! -r $installer_dir/install.sh ] ; then + echo "Error: Invalid arch installer directory: $installer_dir" exit 1 fi @@ -75,9 +75,9 @@ tmp_dir=$(mktemp --directory) tmp_installdir="$tmp_dir/installer" mkdir $tmp_installdir || clean_up 1 -cp -r $installer_dir/$arch/* $tmp_installdir || clean_up 1 +cp -r $installer_dir/* $tmp_installdir || clean_up 1 cp onie-image.conf $tmp_installdir -cp onie-image-*.conf $tmp_installdir +cp onie-image-$arch.conf $tmp_installdir # Set sonic fips config for the installer script if [ "$ENABLE_FIPS" = "y" ]; then diff --git a/slave.mk b/slave.mk index 936614902308..8a400a8c88c4 100644 --- a/slave.mk +++ b/slave.mk @@ -75,6 +75,7 @@ export BUILD_TIMESTAMP export SONIC_IMAGE_VERSION export CONFIGURED_PLATFORM export CONFIGURED_ARCH +export TARGET_BOOTLOADER export PYTHON_WHEELS_PATH export IMAGE_DISTRO export IMAGE_DISTRO_DEBS_PATH From 5223f4917f36f193241cd049e2d3fab594649bd4 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Wed, 13 Jul 2022 17:30:23 +0800 Subject: [PATCH 550/817] [ci] Update azp template variable for reproducible build. (#11419) --- .azure-pipelines/azure-pipelines-repd-build-variables.yml | 6 ++++-- azure-pipelines.yml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-repd-build-variables.yml b/.azure-pipelines/azure-pipelines-repd-build-variables.yml index 7e831109e2ad..d86ef1eaf8a0 100644 --- a/.azure-pipelines/azure-pipelines-repd-build-variables.yml +++ b/.azure-pipelines/azure-pipelines-repd-build-variables.yml @@ -1,5 +1,7 @@ variables: - ${{ if and(ge(variables['Build.SourceBranchName'], '202012'), le(variables['Build.SourceBranchName'], '299999')) }}: + ${{ if eq(variables['Build.Reason'],'PullRequest') }}: + VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=$([ "$(System.PullRequest.TargetBranch)" != "master" ] && echo deb,py2,py3,web,git,docker)' + ${{ elseif ne(variables['Build.SourceBranch'],'master') }}: VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web,git,docker' - ${{ if or(lt(variables['Build.SourceBranchName'], '202012'), gt(variables['Build.SourceBranchName'], '299999')) }}: + ${{ else }}: VERSION_CONTROL_OPTIONS: '' diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f39387effb67..1ea865d09d78 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -37,7 +37,7 @@ resources: ref: master variables: -- template: .azure-pipelines/azure-pipelines-repd-build-variables.yml +- template: .azure-pipelines/azure-pipelines-repd-build-variables.yml@buildimage - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - template: .azure-pipelines/template-variables.yml - ${{ else }}: From bec35df04af0db5746ad64155a7caa642cae861a Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Wed, 13 Jul 2022 09:21:33 -0400 Subject: [PATCH 551/817] [Mellanox] Add arm64 architecture support to mellanox platform (#11342) - Why I did it Add support for mellanox platform building for target architecture arm64. - How I did it Contains the following changes: 1. Change instances of hard-coded amd64 to $(CONFIGURED_ARCH) 2. Add logic to download correct binary for MFT package 3. Add TARGET_BOOTLOADER=grub definition to rules.mk to override default arm64 bootloader - How to verify it Build mellanox platform with TARGET_ARCH set as arm64 --- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/hw-management/Makefile | 2 +- platform/mellanox/libsaithrift-dev.mk | 8 +-- platform/mellanox/mft.mk | 6 +- platform/mellanox/mft/Makefile | 18 ++++-- platform/mellanox/mlnx-sai.mk | 4 +- platform/mellanox/mlnx-sai/Makefile | 4 +- platform/mellanox/rules.mk | 3 + platform/mellanox/sdk-src/applibs/Makefile | 4 +- platform/mellanox/sdk-src/iproute2/Makefile | 4 +- .../mellanox/sdk-src/python-sdk-api/Makefile | 4 +- .../mellanox/sdk-src/sx-acl-helper/Makefile | 8 +-- platform/mellanox/sdk-src/sx-complib/Makefile | 8 +-- .../mellanox/sdk-src/sx-examples/Makefile | 4 +- .../mellanox/sdk-src/sx-gen-utils/Makefile | 4 +- platform/mellanox/sdk-src/sx-kernel/Makefile | 4 +- platform/mellanox/sdk-src/sx-scew/Makefile | 8 +-- platform/mellanox/sdk-src/sxd-libs/Makefile | 8 +-- platform/mellanox/sdk-src/wjh-libs/Makefile | 8 +-- platform/mellanox/sdk.mk | 62 +++++++++---------- 20 files changed, 91 insertions(+), 82 deletions(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index fac7bddc2c24..6144ce67a746 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -20,7 +20,7 @@ MLNX_HW_MANAGEMENT_VERSION = 7.0020.2004 export MLNX_HW_MANAGEMENT_VERSION -MLNX_HW_MANAGEMENT = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb +MLNX_HW_MANAGEMENT = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_$(CONFIGURED_ARCH).deb $(MLNX_HW_MANAGEMENT)_SRC_PATH = $(PLATFORM_PATH)/hw-management $(MLNX_HW_MANAGEMENT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) SONIC_MAKE_DEBS += $(MLNX_HW_MANAGEMENT) diff --git a/platform/mellanox/hw-management/Makefile b/platform/mellanox/hw-management/Makefile index 9c62312d18c5..3ada49920413 100644 --- a/platform/mellanox/hw-management/Makefile +++ b/platform/mellanox/hw-management/Makefile @@ -1,7 +1,7 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb +MAIN_TARGET = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_$(CONFIGURED_ARCH).deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index 4ee241eab4c7..1ae8453d4eff 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -18,7 +18,7 @@ SAI_VER = 0.9.4 -LIBSAITHRIFT_DEV = libsaithrift$(SAITHRIFT_VER)-dev_$(SAI_VER)_amd64.deb +LIBSAITHRIFT_DEV = libsaithrift$(SAITHRIFT_VER)-dev_$(SAI_VER)_$(CONFIGURED_ARCH).deb $(LIBSAITHRIFT_DEV)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI $(LIBSAITHRIFT_DEV)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(LIBSAITHRIFT_DEV)_RDEPENDS += $(LIBTHRIFT) @@ -28,13 +28,13 @@ $(LIBSAITHRIFT_DEV)_RDEPENDS += $(MLNX_SAI) SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV) -PYTHON_SAITHRIFT = python-saithrift$(SAITHRIFT_VER)_$(SAI_VER)_amd64.deb +PYTHON_SAITHRIFT = python-saithrift$(SAITHRIFT_VER)_$(SAI_VER)_$(CONFIGURED_ARCH).deb $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(PYTHON_SAITHRIFT))) -SAISERVER = saiserver$(SAITHRIFT_VER)_$(SAI_VER)_amd64.deb +SAISERVER = saiserver$(SAITHRIFT_VER)_$(SAI_VER)_$(CONFIGURED_ARCH).deb $(SAISERVER)_RDEPENDS += $(LIBSAITHRIFT_DEV) $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(SAISERVER))) -SAISERVER_DBG = saiserver$(SAITHRIFT_VER)-dbg_$(SAI_VER)_amd64.deb +SAISERVER_DBG = saiserver$(SAITHRIFT_VER)-dbg_$(SAI_VER)_$(CONFIGURED_ARCH).deb $(SAISERVER_DBG)_RDEPENDS += $(SAISERVER) $(eval $(call add_extra_package,$(LIBSAITHRIFT_DEV),$(SAISERVER_DBG))) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index c3ebdac356e7..eb702a85a1d1 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -21,14 +21,14 @@ MFT_REVISION = 34 export MFT_VERSION MFT_REVISION -MFT = mft_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb +MFT = mft_$(MFT_VERSION)-$(MFT_REVISION)_$(CONFIGURED_ARCH).deb $(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft SONIC_MAKE_DEBS += $(MFT) $(MFT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) -KERNEL_MFT = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_amd64.deb +KERNEL_MFT = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(MFT),$(KERNEL_MFT))) -MFT_OEM = mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb +MFT_OEM = mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(MFT),$(MFT_OEM))) diff --git a/platform/mellanox/mft/Makefile b/platform/mellanox/mft/Makefile index 755ef4afc220..4c454028b0e0 100644 --- a/platform/mellanox/mft/Makefile +++ b/platform/mellanox/mft/Makefile @@ -18,14 +18,20 @@ SHELL = /bin/bash .SHELLFLAGS += -e -MFT_NAME = mft-$(MFT_VERSION)-$(MFT_REVISION)-x86_64-deb +ifeq ($(CONFIGURED_ARCH), amd64) +MFT_ARCH = x86_64 +else +MFT_ARCH = $(CONFIGURED_ARCH) +endif + +MFT_NAME = mft-$(MFT_VERSION)-$(MFT_REVISION)-$(MFT_ARCH)-deb MFT_TGZ = $(MFT_NAME).tgz SRC_DEB = kernel-mft-dkms_$(MFT_VERSION)-$(MFT_REVISION)_all.deb -MOD_DEB = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_amd64.deb +MOD_DEB = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_$(CONFIGURED_ARCH).deb -MAIN_TARGET = mft_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb -DERIVED_TARGETS = $(MOD_DEB) mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb +MAIN_TARGET = mft_$(MFT_VERSION)-$(MFT_REVISION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = $(MOD_DEB) mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_$(CONFIGURED_ARCH).deb DKMS_BMDEB = /var/lib/dkms/kernel-mft-dkms/$(MFT_VERSION)/bmdeb DKMS_TMP := $(shell mktemp -u -d -t dkms.XXXXXXXXXX) @@ -46,8 +52,8 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : popd - sudo dkms build kernel-mft-dkms/$(MFT_VERSION) -k $(KVERSION) -a amd64 - sudo dkms mkbmdeb kernel-mft-dkms/$(MFT_VERSION) -k $(KVERSION) -a amd64 + sudo dkms build kernel-mft-dkms/$(MFT_VERSION) -k $(KVERSION) -a $(CONFIGURED_ARCH) + sudo dkms mkbmdeb kernel-mft-dkms/$(MFT_VERSION) -k $(KVERSION) -a $(CONFIGURED_ARCH) # w/a: remove dependencies mkdir -p $(DKMS_TMP)/DEBIAN diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 3202b9564051..6eaa1dcf80b4 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -4,11 +4,11 @@ MLNX_SAI_VERSION = SAIRel1.21.2.0 export MLNX_SAI_VERSION -MLNX_SAI = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb +MLNX_SAI = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(MLNX_SAI)_SRC_PATH = $(PLATFORM_PATH)/mlnx-sai $(MLNX_SAI)_DEPENDS += $(MLNX_SDK_DEBS) $(MLNX_SAI)_RDEPENDS += $(MLNX_SDK_RDEBS) $(MLNX_SDK_DEBS) $(eval $(call add_conflict_package,$(MLNX_SAI),$(LIBSAIVS_DEV))) -MLNX_SAI_DBGSYM = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb +MLNX_SAI_DBGSYM = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(MLNX_SAI),$(MLNX_SAI_DBGSYM))) SONIC_MAKE_DEBS += $(MLNX_SAI) diff --git a/platform/mellanox/mlnx-sai/Makefile b/platform/mellanox/mlnx-sai/Makefile index 715f43ef0355..55c453e77e6d 100644 --- a/platform/mellanox/mlnx-sai/Makefile +++ b/platform/mellanox/mlnx-sai/Makefile @@ -2,8 +2,8 @@ SHELL = /bin/bash .SHELLFLAGS += -e -MAIN_TARGET = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb -DERIVED_TARGETS = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb +MAIN_TARGET = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = mlnx-sai-dbgsym_1.mlnx.$(MLNX_SAI_VERSION)_$(CONFIGURED_ARCH).deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : pushd SAI-Implementation diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index a6fc81b3beb4..5b5e55cdf494 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -48,4 +48,7 @@ $(SYNCD)_RDEPENDS += $(MLNX_SAI) # Inject mlnx sdk libs to platform monitor $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(APPLIBS) $(SX_COMPLIB) $(SXD_LIBS) $(SX_GEN_UTILS) $(PYTHON_SDK_API) $(APPLIBS_DEV) $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) $(SX_GEN_UTILS_DEV) +# Force the target bootloader for mellanox platforms to grub regardless of arch +TARGET_BOOTLOADER = grub + export SONIC_BUFFER_MODEL=dynamic diff --git a/platform/mellanox/sdk-src/applibs/Makefile b/platform/mellanox/sdk-src/applibs/Makefile index 1068da0c5c16..47e4f5388dbe 100644 --- a/platform/mellanox/sdk-src/applibs/Makefile +++ b/platform/mellanox/sdk-src/applibs/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = applibs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = applibs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb applibs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = applibs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = applibs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb applibs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = applibs $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/iproute2/Makefile b/platform/mellanox/sdk-src/iproute2/Makefile index 0e32fe1426c4..9735706dd343 100644 --- a/platform/mellanox/sdk-src/iproute2/Makefile +++ b/platform/mellanox/sdk-src/iproute2/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = iproute2_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = iproute2-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb iproute2-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = iproute2_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = iproute2-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb iproute2-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = iproute2-3.19.0 $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/python-sdk-api/Makefile b/platform/mellanox/sdk-src/python-sdk-api/Makefile index 47f0ad5a01ff..5ac3e8504968 100644 --- a/platform/mellanox/sdk-src/python-sdk-api/Makefile +++ b/platform/mellanox/sdk-src/python-sdk-api/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = python-sdk-api_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = python-sdk-api-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = python-sdk-api_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = python-sdk-api-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = python_sdk_api $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-acl-helper/Makefile b/platform/mellanox/sdk-src/sx-acl-helper/Makefile index d9d0aef8775b..42109c74e0bb 100644 --- a/platform/mellanox/sdk-src/sx-acl-helper/Makefile +++ b/platform/mellanox/sdk-src/sx-acl-helper/Makefile @@ -1,10 +1,10 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-acl-helper_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-acl-helper-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-acl-helper-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-acl-helper-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-acl-helper_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-acl-helper-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-acl-helper-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-acl-helper-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_acl_helper $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-complib/Makefile b/platform/mellanox/sdk-src/sx-complib/Makefile index 6e51b779ef23..c717ffda93c0 100644 --- a/platform/mellanox/sdk-src/sx-complib/Makefile +++ b/platform/mellanox/sdk-src/sx-complib/Makefile @@ -1,10 +1,10 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-complib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-complib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-complib-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-complib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-complib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-complib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-complib-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-complib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_complib $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-examples/Makefile b/platform/mellanox/sdk-src/sx-examples/Makefile index 06de0f475062..2084e397f981 100644 --- a/platform/mellanox/sdk-src/sx-examples/Makefile +++ b/platform/mellanox/sdk-src/sx-examples/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-examples_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-examples-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb sx-examples-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-examples_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-examples-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb sx-examples-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_examples $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-gen-utils/Makefile b/platform/mellanox/sdk-src/sx-gen-utils/Makefile index 1f6f31d9acd4..66d2fb6b453e 100644 --- a/platform/mellanox/sdk-src/sx-gen-utils/Makefile +++ b/platform/mellanox/sdk-src/sx-gen-utils/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-gen-utils_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb sx-gen-utils-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-gen-utils_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb sx-gen-utils-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_gen_utils $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-kernel/Makefile b/platform/mellanox/sdk-src/sx-kernel/Makefile index 422f2ae95aae..26ccbd02516a 100644 --- a/platform/mellanox/sdk-src/sx-kernel/Makefile +++ b/platform/mellanox/sdk-src/sx-kernel/Makefile @@ -1,8 +1,8 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-kernel_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-kernel-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-kernel_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-kernel-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_kernel $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sx-scew/Makefile b/platform/mellanox/sdk-src/sx-scew/Makefile index 9b8c5bd56c39..8bb61fcda67c 100644 --- a/platform/mellanox/sdk-src/sx-scew/Makefile +++ b/platform/mellanox/sdk-src/sx-scew/Makefile @@ -1,10 +1,10 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sx-scew_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sx-scew-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-scew-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sx-scew-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sx-scew_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sx-scew-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-scew-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sx-scew-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sx_scew $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/sxd-libs/Makefile b/platform/mellanox/sdk-src/sxd-libs/Makefile index 892974e75e5f..0472056c9874 100644 --- a/platform/mellanox/sdk-src/sxd-libs/Makefile +++ b/platform/mellanox/sdk-src/sxd-libs/Makefile @@ -1,10 +1,10 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = sxd-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = sxd-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - sxd-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = sxd-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = sxd-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + sxd-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = sxd_libs $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk-src/wjh-libs/Makefile b/platform/mellanox/sdk-src/wjh-libs/Makefile index ecc437258ec2..d5af48b7c559 100644 --- a/platform/mellanox/sdk-src/wjh-libs/Makefile +++ b/platform/mellanox/sdk-src/wjh-libs/Makefile @@ -1,10 +1,10 @@ .ONESHELL: SHELL = /bin/bash -MAIN_TARGET = wjh-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb -DERIVED_TARGETS = wjh-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - wjh-libs-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb \ - wjh-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +MAIN_TARGET = wjh-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb +DERIVED_TARGETS = wjh-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + wjh-libs-dev-static_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb \ + wjh-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb PACKAGE_NAME = wjh_libs $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 2412cf0ca705..e0861ddc93f8 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -44,112 +44,112 @@ MLNX_SDK_DBG_DEBS += $(APPLIBS_DBGSYM) $(IPROUTE2_MLNX_DBGSYM) $(SX_COMPLIB_DBGS $(SX_EXAMPLES_DBGSYM) $(SX_GEN_UTILS_DBGSYM) $(SX_SCEW_DBGSYM) \ $(SXD_LIBS_DBGSYM) $(WJH_LIBS_DBGSYM) $(SX_ACL_HELPER_DBGSYM) -APPLIBS = applibs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +APPLIBS = applibs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(APPLIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/applibs $(APPLIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SX_GEN_UTILS_DEV) $(SXD_LIBS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) $(APPLIBS)_RDEPENDS += $(SX_COMPLIB) $(SX_GEN_UTILS) $(SXD_LIBS) $(LIBNL3) $(LIBNL_GENL3) -APPLIBS_DEV = applibs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +APPLIBS_DEV = applibs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(APPLIBS),$(APPLIBS_DEV))) -APPLIBS_DBGSYM = applibs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +APPLIBS_DBGSYM = applibs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(APPLIBS),$(APPLIBS_DBGSYM))) endif -IPROUTE2_MLNX = iproute2_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +IPROUTE2_MLNX = iproute2_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(IPROUTE2_MLNX)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/iproute2 -IPROUTE2_MLNX_DEV = iproute2-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +IPROUTE2_MLNX_DEV = iproute2-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(IPROUTE2_MLNX),$(IPROUTE2_MLNX_DEV))) -IPROUTE2_MLNX_DBGSYM = iproute2-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +IPROUTE2_MLNX_DBGSYM = iproute2-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(IPROUTE2_MLNX),$(IPROUTE2_MLNX_DBGSYM))) endif -SX_COMPLIB = sx-complib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_COMPLIB = sx-complib_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_COMPLIB)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-complib -SX_COMPLIB_DEV = sx-complib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_COMPLIB_DEV = sx-complib-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV))) -SX_COMPLIB_DBGSYM = sx-complib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_COMPLIB_DBGSYM = sx-complib-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DBGSYM))) endif -SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_EXAMPLES)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-examples $(SX_EXAMPLES)_DEPENDS += $(APPLIBS_DEV) $(SX_SCEW_DEV) $(SXD_LIBS_DEV) $(SX_EXAMPLES)_RDEPENDS += $(APPLIBS) $(SX_SCEW) $(SXD_LIBS) -SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_EXAMPLES),$(SX_EXAMPLES_DEV))) -SX_EXAMPLES_DBGSYM = sx-examples-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_EXAMPLES_DBGSYM = sx-examples-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_EXAMPLES),$(SX_EXAMPLES_DBGSYM))) endif -SX_GEN_UTILS = sx-gen-utils_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_GEN_UTILS = sx-gen-utils_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_GEN_UTILS)_SRC_PATH += $(PLATFORM_PATH)/sdk-src/sx-gen-utils $(SX_GEN_UTILS)_DEPENDS += $(SX_COMPLIB_DEV) $(SX_GEN_UTILS)_RDEPENDS += $(SX_COMPLIB) -SX_GEN_UTILS_DEV = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_GEN_UTILS_DEV = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DEV))) -SX_GEN_UTILS_DBGSYM = sx-gen-utils-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_GEN_UTILS_DBGSYM = sx-gen-utils-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DBGSYM))) endif -SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_SCEW)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-scew -SX_SCEW_DEV = sx-scew-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_SCEW_DEV = sx-scew-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV))) -SX_SCEW_DBGSYM = sx-scew-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_SCEW_DBGSYM = sx-scew-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DBGSYM))) endif -SXD_LIBS = sxd-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SXD_LIBS = sxd-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SXD_LIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sxd-libs $(SXD_LIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SX_GEN_UTILS_DEV) -SXD_LIBS_DEV = sxd-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SXD_LIBS_DEV = sxd-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV))) -SXD_LIBS_DBGSYM = sxd-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SXD_LIBS_DBGSYM = sxd-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DBGSYM))) endif #packages that are required for runtime only -PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(PYTHON_SDK_API)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/python-sdk-api $(PYTHON_SDK_API)_DEPENDS += $(APPLIBS_DEV) $(SXD_LIBS_DEV) $(SWIG) $(PYTHON_SDK_API)_RDEPENDS += $(APPLIBS) $(SXD_LIBS) -PYTHON_SDK_API_DBGSYM = python-sdk-api-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +PYTHON_SDK_API_DBGSYM = python-sdk-api-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(PYTHON_SDK_API),$(PYTHON_SDK_API_DBGSYM))) endif -SX_ACL_HELPER = sx-acl-helper_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_ACL_HELPER = sx-acl-helper_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_ACL_HELPER)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-acl-helper $(SX_ACL_HELPER)_DEPENDS += $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) $(APPLIBS_DEV) $(SX_ACL_HELPER)_RDEPENDS += $(SX_COMPLIB) $(PYTHON_SDK_API) -SX_ACL_HELPER_DEV = sx-acl-helper-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_ACL_HELPER_DEV = sx-acl-helper-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_ACL_HELPER),$(SX_ACL_HELPER_DEV))) -SX_ACL_HELPER_DBGSYM = sx-acl-helper-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_ACL_HELPER_DBGSYM = sx-acl-helper-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(SX_ACL_HELPER),$(SX_ACL_HELPER_DBGSYM))) endif -WJH_LIBS = wjh-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +WJH_LIBS = wjh-libs_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(WJH_LIBS)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/wjh-libs $(WJH_LIBS)_DEPENDS += $(SX_COMPLIB_DEV) $(SXD_LIBS_DEV) $(APPLIBS_DEV) $(SX_ACL_HELPER_DEV) $(SX_SCEW_DEV) $(WJH_LIBS)_RDEPENDS += $(SX_COMPLIB) $(PYTHON_SDK_API) $(SX_ACL_HELPER) -WJH_LIBS_DEV = wjh-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +WJH_LIBS_DEV = wjh-libs-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(WJH_LIBS),$(WJH_LIBS_DEV))) -WJH_LIBS_DBGSYM = wjh-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +WJH_LIBS_DBGSYM = wjh-libs-dbgsym_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb ifeq ($(SDK_FROM_SRC),y) $(eval $(call add_derived_package,$(WJH_LIBS),$(WJH_LIBS_DBGSYM))) endif -SX_KERNEL = sx-kernel_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_KERNEL = sx-kernel_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(SX_KERNEL)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(SX_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel -SX_KERNEL_DEV = sx-kernel-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_amd64.deb +SX_KERNEL_DEV = sx-kernel-dev_1.mlnx.$(MLNX_SDK_DEB_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(SX_KERNEL),$(SX_KERNEL_DEV))) define make_path From 57a07fceab49923b89f81a10c8d40692fc6e21c6 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Wed, 13 Jul 2022 10:22:23 -0700 Subject: [PATCH 552/817] [caclmgrd]: Add infrastructure to support adding feature specific acls (#11367) Why I did it Add infrastructure to support adding feature specific acls. If feature specific ACLs has to be added: if feature_name in self.feature_present and self.feature_present.get('feature_name'): add_feature_specific_acls() How I did it Add function to get features present in feature table. How to verify it unit-test passes. --- src/sonic-host-services/scripts/caclmgrd | 11 ++++ .../tests/caclmgrd/caclmgrd_feature_test.py | 50 +++++++++++++++++++ .../tests/caclmgrd/test_bfd_vectors.py | 6 +++ .../tests/caclmgrd/test_dhcp_vectors.py | 24 +++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py diff --git a/src/sonic-host-services/scripts/caclmgrd b/src/sonic-host-services/scripts/caclmgrd index 914547ad53b2..4af588e28de6 100755 --- a/src/sonic-host-services/scripts/caclmgrd +++ b/src/sonic-host-services/scripts/caclmgrd @@ -52,6 +52,7 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): Attributes: config_db: Handle to Config Redis database via SwSS SDK """ + FEATURE_TABLE = "FEATURE" ACL_TABLE = "ACL_TABLE" ACL_RULE = "ACL_RULE" DEVICE_METADATA_TABLE = "DEVICE_METADATA" @@ -117,6 +118,10 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): self.namespace_docker_mgmt_ip = {} self.namespace_docker_mgmt_ipv6 = {} + # Get all features that are present {feature_name : True/False} + self.feature_present = {} + self.update_feature_present() + metadata = self.config_db_map[DEFAULT_NAMESPACE].get_table(self.DEVICE_METADATA_TABLE) if 'subtype' in metadata['localhost'] and metadata['localhost']['subtype'] == 'DualToR': self.DualToR = True @@ -201,6 +206,12 @@ class ControlPlaneAclManager(daemon_base.DaemonBase): tcp_flags_str = tcp_flags_str[:-1] return tcp_flags_str + def update_feature_present(self): + feature_tb_info = self.config_db_map[DEFAULT_NAMESPACE].get_table(self.FEATURE_TABLE) + if feature_tb_info: + for k, v in feature_tb_info.items(): + self.feature_present[k] = True + def generate_block_ip2me_traffic_iptables_commands(self, namespace): INTERFACE_TABLE_NAME_LIST = [ "LOOPBACK_INTERFACE", diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py new file mode 100644 index 000000000000..b162ed01b586 --- /dev/null +++ b/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py @@ -0,0 +1,50 @@ +import os +import sys +import swsscommon + +from parameterized import parameterized +from sonic_py_common.general import load_module_from_source +from unittest import TestCase, mock +from pyfakefs.fake_filesystem_unittest import patchfs + +from .test_bfd_vectors import CACLMGRD_BFD_TEST_VECTOR +from tests.common.mock_configdb import MockConfigDb +from unittest.mock import MagicMock, patch + +DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' + +class TestFeature(TestCase): + """ + Test caclmgrd feature present + """ + def setUp(self): + swsscommon.swsscommon.ConfigDBConnector = MockConfigDb + test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + modules_path = os.path.dirname(test_path) + scripts_path = os.path.join(modules_path, "scripts") + sys.path.insert(0, modules_path) + caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') + self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) + + @parameterized.expand(CACLMGRD_BFD_TEST_VECTOR) + @patchfs + def test_feature_present(self, test_name, test_data, fs): + if not os.path.exists(DBCONFIG_PATH): + fs.create_file(DBCONFIG_PATH) # fake database_config.json + + MockConfigDb.set_config_db(test_data["config_db"]) + + with mock.patch("caclmgrd.subprocess") as mocked_subprocess: + popen_mock = mock.Mock() + popen_attrs = test_data["popen_attributes"] + popen_mock.configure_mock(**popen_attrs) + mocked_subprocess.Popen.return_value = popen_mock + mocked_subprocess.PIPE = -1 + + call_rc = test_data["call_rc"] + mocked_subprocess.call.return_value = call_rc + + caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") + caclmgrd_daemon.update_feature_present() + self.assertTrue("bgp" in caclmgrd_daemon.feature_present) + self.assertEqual(caclmgrd_daemon.feature_present["bgp"], True) diff --git a/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py b/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py index 35340849bd4c..f7469376331d 100644 --- a/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py +++ b/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py @@ -15,6 +15,12 @@ "type": "ToRRouter", } }, + "FEATURE": { + "bgp": { + "auto_restart": "enabled", + "state": "enabled", + } + }, }, "expected_subprocess_calls": [ call("iptables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT", shell=True, universal_newlines=True, stdout=subprocess.PIPE), diff --git a/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py b/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py index 7ebfca22a64b..242faae34d09 100644 --- a/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py +++ b/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py @@ -14,6 +14,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "active"}), @@ -42,6 +44,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "active"}), @@ -67,6 +71,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "active"}), @@ -93,6 +99,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "active"}), @@ -117,6 +125,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "standby"}), @@ -143,6 +153,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "standby"}), @@ -167,6 +179,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "standby"}), @@ -195,6 +209,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "standby"}), @@ -220,6 +236,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "unknown"}), @@ -248,6 +266,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "unknown"}), @@ -273,6 +293,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "unknown"}), @@ -299,6 +321,8 @@ "type": "ToRRouter", } }, + "FEATURE": { + }, }, "mux_update": [ ("Ethernet4", {"state": "unknown"}), From f92aca837d98cd3e325be973183d6d7ff8c3f01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B3=93=E5=B0=91=E9=88=BA?= <51807939+geans-pin@users.noreply.github.com> Date: Thu, 14 Jul 2022 02:58:47 +0800 Subject: [PATCH 553/817] PDE migration to bullseye (#10836) #### Why I did it Upgrade docker-pde to bullseye #### How to verify it Check Azp status --- dockers/docker-pde/Dockerfile.j2 | 7 +- .../cancun_4.5.0/bcm56370_a0_cch.pkg | Bin 0 -> 65628 bytes .../cancun_4.5.0/bcm56370_a0_ceh.pkg | Bin 0 -> 13576 bytes .../cancun_4.5.0/bcm56370_a0_cfh.pkg | Bin 0 -> 56812 bytes .../cancun_4.5.0/bcm56370_a0_cih.pkg | Bin 0 -> 880452 bytes .../cancun_4.5.0/bcm56370_a0_cmh.pkg | Bin 0 -> 4324 bytes .../cancun_4.6.0/bcm56370_a0_cch.pkg | Bin 0 -> 66064 bytes .../cancun_4.6.0/bcm56370_a0_ceh.pkg | Bin 0 -> 13576 bytes .../cancun_4.6.0/bcm56370_a0_cfh.pkg | Bin 0 -> 56812 bytes .../cancun_4.6.0/bcm56370_a0_cih.pkg | Bin 0 -> 882564 bytes .../cancun_4.6.0/bcm56370_a0_cmh.pkg | Bin 0 -> 4324 bytes .../cancun_4.7.0/bcm56770_a0_cch.pkg | Bin 0 -> 104416 bytes .../cancun_4.7.0/bcm56770_a0_ceh.pkg | Bin 0 -> 18020 bytes .../cancun_4.7.0/bcm56770_a0_cfh.pkg | Bin 0 -> 77172 bytes .../cancun_4.7.0/bcm56770_a0_cih.pkg | Bin 0 -> 970692 bytes .../cancun_4.7.0/bcm56770_a0_cmh.pkg | Bin 0 -> 4324 bytes .../cancun_4.8.0/bcm56770_a0_cch.pkg | Bin 0 -> 128496 bytes .../cancun_4.8.0/bcm56770_a0_ceh.pkg | Bin 0 -> 19252 bytes .../cancun_4.8.0/bcm56770_a0_cfh.pkg | Bin 0 -> 77172 bytes .../cancun_4.8.0/bcm56770_a0_cih.pkg | Bin 0 -> 995268 bytes .../cancun_4.8.0/bcm56770_a0_cmh.pkg | Bin 0 -> 4324 bytes .../cancun_6.8.0/bcm56870_a0_cch.pkg | Bin 0 -> 112696 bytes .../cancun_6.8.0/bcm56870_a0_ceh.pkg | Bin 0 -> 18020 bytes .../cancun_6.8.0/bcm56870_a0_cfh.pkg | Bin 0 -> 76828 bytes .../cancun_6.8.0/bcm56870_a0_cih.pkg | Bin 0 -> 983556 bytes .../cancun_6.8.0/bcm56870_a0_cmh.pkg | Bin 0 -> 4324 bytes .../cancun_6.9.1/bcm56870_a0_cch.pkg | Bin 0 -> 136720 bytes .../cancun_6.9.1/bcm56870_a0_ceh.pkg | Bin 0 -> 19252 bytes .../cancun_6.9.1/bcm56870_a0_cfh.pkg | Bin 0 -> 89948 bytes .../cancun_6.9.1/bcm56870_a0_cih.pkg | Bin 0 -> 1008612 bytes .../cancun_6.9.1/bcm56870_a0_cmh.pkg | Bin 0 -> 4324 bytes dockers/docker-pde/docker_init.sh | 18 +- dockers/docker-pde/syncd_init_common.sh | 254 ++++++++++++++++++ platform/broadcom/docker-pde.mk | 16 +- 34 files changed, 280 insertions(+), 15 deletions(-) create mode 100644 dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cmh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cmh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cmh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cmh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cmh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cch.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_ceh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cfh.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cih.pkg create mode 100644 dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cmh.pkg mode change 100644 => 100755 dockers/docker-pde/docker_init.sh create mode 100755 dockers/docker-pde/syncd_init_common.sh diff --git a/dockers/docker-pde/Dockerfile.j2 b/dockers/docker-pde/Dockerfile.j2 index a6e7e62c8647..0ddbfd59ce1e 100644 --- a/dockers/docker-pde/Dockerfile.j2 +++ b/dockers/docker-pde/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ENV PYTHONPATH=/usr/share/sonic/platform @@ -20,8 +20,7 @@ RUN apt-get update && apt-get install -y ipmitool telnet busybox kmod libpcap-de RUN apt-get install -y bzip2 curl ioping openssl bc sysstat # Packages for PDDF - -RUN apt-get install -y python-jsonschema +RUN apt-get install -y python3-jsonschema i2c-tools RUN pip3 install pytest pexpect @@ -89,7 +88,7 @@ COPY ["stress-sfp-i2c.py", "/home/pde"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["syseeprom.py", "/usr/bin/"] COPY ["docker_init.sh", "/usr/bin/"] -COPY ["cancun_files/cancun_4.5.0/*", "cancun_files/cancun_6.6.1/*", "cancun_files/cancun_4.3.0/*", "/usr/lib/cancun/"] +COPY ["cancun_files/cancun_4.6.0/*", "cancun_files/cancun_6.9.1/*", "cancun_files/cancun_4.8.0/*", "/usr/lib/cancun/"] COPY ["syncd_init_common.sh", "/usr/bin/"] ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cch.pkg b/dockers/docker-pde/cancun_files/cancun_4.5.0/bcm56370_a0_cch.pkg new file mode 100644 index 0000000000000000000000000000000000000000..b2813d85f3c2b45347a7ff6393228b4bca1176bc GIT binary patch literal 65628 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 uJy%Kdj@P^1*pK&@-eX4GyH4*sn*n~-J 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 &FW!9gg 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 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cch.pkg b/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cch.pkg new file mode 100644 index 0000000000000000000000000000000000000000..f53b5f989962fea17469ffc6e2ef518fe6395730 GIT binary patch literal 66064 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 I&wBR%0A{?whyVZp literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cih.pkg b/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cih.pkg new file mode 100644 index 0000000000000000000000000000000000000000..6733261fb613e343b331662558be8440b0b51a69 GIT binary patch literal 882564 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 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cmh.pkg b/dockers/docker-pde/cancun_files/cancun_4.6.0/bcm56370_a0_cmh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..ec6be5d84409e29cb77fa53ad5bd38470403805e GIT binary patch literal 4324 zcmchaPl#7l6vyxLzh?d$Gs{c`HUDoyM9OlQ$SMDfI-0gn7b-1+)Ri$R2reX~gdi$( zBa~J!D>oUDD-jVQ%_#pYRI*K!EfjH8-_LvR$m{&>85j`{eCOVK&gY(Y?|t|E?w$1= zt2#PYcBCThJeh_JDi#k)s>>!09zsFAY^&^*+NC*S9+&aV$i9yP&VR1a{-sgxZ}o;c z{3YF&25V8qN|UA8(n6_SS}DCPZI^aQ4`ch(?*r)*>6p|jnVnMojC4WzQ@SS&9AMF^ z9If_T=leg=zt%G4>Xx=h?@GI+0}^&vd^xnDzIimMV>sG_-Xhz75BdSVf=kUVoKi(Pw8LT7ph~#@KF|>MVeOoJbyxd%=0s9 zpXZgbG|w{+e4Zas;Vt>eljG@+`TXR`@vIr(Kl!$RXDqq#j1PGBWR8C-;Mw;%{-=PS8SobZepbL=4EPrU z{^x+79q^X|evadR+fjYLLmRw&OIefeZs*ZGIzc zt?7gPt{C;Mo}w)A`F(U5rwp$7yE3=-dHxEp%=7bVpXaZZbSpnU;I9Szf|{SCl6l_J z+|D1b^3t|_X)(t4nGQHgVtCt$m*Flppi_l-lR{H%hvdeeZ;e|<{g4Qe!goZeteYV;2ScQcQ?6iTU^a@KCoN9E)sV| z`hUBtx-aZ3s`HFEeP&A3?OWuX@V@XN3=SXPCHw#8dqp~YJ*9u{R`2(g+C0O|`tcok zBaaz*F}v4Lx47S<>~))?*eYm1Ydk3pEWzHM=h+WxqcF})AdcYw7 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cch.pkg b/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cch.pkg new file mode 100644 index 0000000000000000000000000000000000000000..34691d28dc6dc275e21afb4adc8c971515f4e9c5 GIT binary patch literal 104416 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

g*%6}u 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 GFaN*1AKdN$ literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_ceh.pkg b/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_ceh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..4e1c0cf9a7ef9aea79d2e9f565650f31c2f0eb02 GIT binary patch literal 18020 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�021o>B$_+)jT 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 VOAb#{Uy{S(lEdS#{CMa3{}0XoRV)Ai literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cih.pkg b/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cih.pkg new file mode 100644 index 0000000000000000000000000000000000000000..781da77bc063c052d4f5a0d9ad533116ca56530b GIT binary patch literal 970692 zcmcG%3zQwzd8oPTy!(Cn{gk@;A*m%b&=LX*kkM(W4dP)ep2isCMwV^t*bX>0;U+dz zw;qU>jCmOYAuUWChwJMo$-N0TdLG$hy9<1D5bGP5*U1kJy9 zRh?7&-~05b+WW84QlF|iRbPGe*I&DK?RuQ+_g=Mk-(`E5!*2f@R?InX|5cXVvx(KZ zEW3*BY2M)kW5Unc1eSd*-ZiQ6TT|w@$$ZObsI#}reDe5rq|9&eZb^Cjrps@W{nZU* zIi@{jeuvDb&YuDs*~@Nfo@|3KlzAvx<#>4h;J;+wJ(GpryaoCwN?xnCcC+ya!sQ0hHGDPS3AIAPgz1 zn5};a`5#}+<{>0x@o&=m`%$m`4dV}E{QMd5ziXI3O~`+7HOu3_ljqM!5prk2E`M5) zf3{)%`{Hr)zZLnb`S0^g|F-G|CW)zy8l*@Mm?R#A0NMXVF6vl zKUw+HiTn?(9x4E@R{k8aD}TC>KQ4b%f3ZF+Zv49%`ujZ7zugV|5BuOq{QVJe^S@j1 zf0@U>cKrI5skuL2PXqsB{$!zl;_|Zx`5#{0D<6M1WUN-8SMOg5p|<|L$p4|$L!|zF zdVi0~zYqC;ZS`eR|3STfsLxRRtK;M5|6t1gLk;{(zHylURsXo<&k*uIvbtBUzvaKc z*yqApNfjTvXSjiXP@OaOA4dL1SF>{Y&rfVDx{(I{5BhAyKW_evDE@op@-y02WUwCV z8u*KIO6mCPFC-Y>u>QYJ@u!Xd`Ud_F*NJ~HzM=nm#h*6*qu4(PEZUSx{`lWt+|Yj% z`QN*mmSs71TPcukB)Eb?;`&vSND?okJa^$1|sSo9pBi04EcYZ z*nd2he=ZXLWd7sG|B=;0r176X{(d7?)RFfWjQuB&|6{8!%l=L@AMtV<4^JZhtakr3 z_n$=m4`csIW5>0o*ogf1_GqWxapsI@Kg3_Y+vv!@5&3(ohiVMFQ!l~Ug#7XOSI`2N z%lPe|wPiDp_c!$4g!~^}eVNZ!D?j;=MK{&ZU%)l~VthmYDdf*q_wuOk6mz%OZ-A}H zKRmG&{OF%*{Hs0DZ|nANMgI4%7CT{Lm$x65dHZ2d!L18u@WolkKRZxohGg1R$XUq$ zfz`eIy8-Us+GyvgQtJ0OtY|yxx54mgw_Tz_NT6f2;Ol3nqD_`f% z2HU!#EuiWyAQO+j-*wFR*#>+r2L8tUoWd_(ImL3BFg}MLZRdO*pObg-*fE}7@wrWB$Zwc|o{P}Lr z1@rs-m@v&`O^AO)GmXutX2jRB4tFyaq`&t2HAc3?;qz^3$ZtjbpnT}QhNygKQ}|;4 z>I(U``&YZdhhY9g?%MrC{v8Tm_+Jz9ZT-uLU)#T4&vg^*U)_jbOSM~Tz0&?086Bgy z6Y*>QH048A%KRS8KP(QqP``kY&zOz>0OHs3=OvQ-ci8w|HrG5Uj#3cL=GBgeo0!`; zu(79*`HZc0to}Vg#VuHV7WtQ%$2_k&wq2tM9X2V&r)3q+P(8QNYze-X`Qk|BG$ojS z?MWTBeJ|VBJjv?|yb{tp0e|MjNqfbz>Ms`Tu=O&3WmJr3{Bz!Z2@Z25e#=VO;0$cf zo)0(te1%=oJjpYX$7jj$&YUTF1>5r?KM1_qf%qB0w?6L*`HbBz-M^HbcWPfn`wY*& z7`u5dyS#Za4=f%Z_U4&0)g`n?7hu*8_ial4Ii9GV&#HJVw@3V6X8Cua1?5n<48Ah) zR>(pA3vVun>lYdJ-kHIp)invhi9a*Qzoh!l?eUgblc9emW&bSlFDw2_7bh#x?4Ml_`JeUkHGcLpmPh`JZ#ujHt?>L`_XGR< zFCc%B|51OD{j&=q{|)>LDf<_ZzsUcHzn}fH3nKpw{EI33myo~6|A@bz{j&=q{|)?0 zDf>4ef06%gtr+(Af}s58b(d-vul#R9{)axjz)OfJp8uT%`}}W4{v!X~sw4w{u?L9! zH}G#x*}nz(i~N`TBjvw=e@n{#t;k>GzvLe&{|)?GQ}%B|{v!V?Vg7{KAC&)l!|`z8 zMSD4^_I=pbhWrnI+Tm5X8J_>Wm)PfjJMtI#UkR5UW`9ur8~C@U?B9X>MgB+prSjjv zzawS;GV&MsAMuyUe*^z=%Kn|mpYhV!h5tbp?g0+3zfFW=`DeU6pcDBYdDG)f9c1Ny zm(IV!{dgDJ&n^gmgZOtL|D$iREP%=O-)@~hI<2li{aN_)i)0DAZsdROr#(&>;N?%# z(S$I~3fksFaL8qL#v&iLph%R ze9H%2+;f0lcV?62=?oUzw??e8){GZeKmkj;;Qugmh{!soejcfeNhW`C2`wt+0 zDF3Hk(D=KC{sSrd4c0Y@8#&Ao72_ICdCjB`ZINkiVM$+_d81{O4oi z_z$J*KaBj<{P+EF{>SwnPT7A1`K$Tw`{VqN>pzmR|2pJfiD%D`M2=$U*j+G-@t!;%KoFsznho;8h?@h2L7Wd`@6`0f|vgqf06$N z{%*?tW5{3RKhIF93(EiS(vS4r+5= z>_370MgD92MgAN3Po(TWiTp+WYy3t28~9JA?7so|^YdT1{?D@zjsd9t#>d7f|2H82 zC+>9@VOFyG&qn0WpH9zd;xGIS;=d93KX5POwOg|NcN6j#?GHS-xYNWRPof*%g#5oz zbUm2PKmHQ5KTjcl9)E2YCs{NzP9gsXquWqA&(O>qW0b@8N$}^5(B0Ey~`((F(uerol#BZicO|jfI#Ls%P`QNVaY4g7W^NI7ntng{` zzZ3Bxf7Z;0q+fO+KHZ&xzDYOY4||!HoY@m6yMH~HR8>2D58_|+YNqm`mCEX^`~63d zv@<0b*{kxGi?b&Z5Z0cw5AomsYL=AWkNBe*+Wchfi_-mRe*Mrt1UN3Nd+T?gxizex zi}B0QQZKsfYNWxwZkTS7?yp<;?UQ?8(wUp!{B-OGaptcJ7GF4V{L6LxPd8q^!_xK7 z#PPR?ea&8zxdlH$02cl`aQ`14VNe< zl4~cs=G%N6|7!e^e~kRkr|e&d<6q5xeo5sKF)#h?s=nwo)8~C@S?BA~OXC62Qo#R4JB>utZ*zs>i{*MRozlJFO z9UA|&;-A#NBW3@x#y|4#POT2a^FLc{R*4<|GV(w2qXAz3S?2Yhbp`wSPp8JeTzj}l z@;`0h-qL;dxlf?A3^@2{HcUX_dgvs zD1Y|)!?kk&yhF(I@u3mqfA4Rfob6g!DD(RN@DKQ@uwA##z&}_b)ZrTYuS5Qi1^&GL zOyR#?=Pw@wpbobuxIZKp4OT4w^~nF&Z=W0k$Vp!R?7f6PDrDD<>ijD*(KVnYT$|kl4%AaDParrC3Gy@xS z{`?F(+VS%-?mrP73H>qrHz5CSM*WZ4AHOyte_sD_k){|F@mIc>QO2MV8NOU|;_{D`o$) zkpBb3{%1Gx_rtBm-yh#F{%0fqF#f#$-$oGsbC5qAzvTR}^gjprhw-QKpHcl?HzP6RUki@Ea}a-ukgQc4!qw-H3x;66;OUE7_+4OAN6+shF<(O{f7~`^- zA7h>*ljIP;zsPFqy?M=FO_X74z7SKoBg#(~b`Q{tkFaePWDfBDe-;!o#~ z-9FO)Z2pR17ch=b6Xw@lQ?oCc5x?ct!gBVFW2>zAapZ;#l2 zJ23y%QU$7MOPTqm7fbVn?YXBGA9CJ|jZ-G zRE{tGJer$U{exP5pGX=ja4_?b!bjz&Kb>*;$=GM5`js;TKo9=&LpwCV@qVa@!hmTv zFWuk%=cnNpH&%ALBcgt5UxYfUe}>ZEVc36x)IX#8=P3O%iofGf#y_k27byL+ivI$s ze@^um`JW-m{~Yo^dD_WP#y_w6i~OhZ&m;f8IK4pXUr_x;{!{rEkpEwvcCwW5FRK0` z|Ec_o$p5cSFOd3|RDY5GIimb8A^-n;+R0JIze)8M`A_BFg#7=@=><~%X4PNhKb3zo z^8f48PM$LUEvmoBe=7eL2W4hw3l#pUS@j`TtL+7fAifs(-DbU#X5&!j~;m6M(zZ9y@ zl%Qt-`7Z<)q^ROQSl1ugma6%09{)k?5Ao+6mH&{&zZzbG@^eV>_s@T+j=#g$|6dsM z^FPQRk)r1LGmQKn5Ax?1MEO5b*B`b*HU4lzmSH!7{e%6N%72~4e+X<{-Ut`?zZcXZ zOjcnX@_*v=g44dToBeM@@n2upA2u|B|N4~uN9+2#5&v%+=g(-${%&3WO2q#M#{O=~ z{$q9g#YsFt{){1iIR4i1pWyk#@w)yr`9Ger|3qDXn*5(g*?+RGKTZBmrtH4~`@{J! zW%<7W`G@8IlSJkJ#=8E|{P~`7`Li))|4nuMqxtg_WB*Ml`%l&Jrz$_EkbhWyiu@rc zKR4I)r^%nqDf@4!>razETT=Gls`DS?^-t*d`Fq&UhYh-|$p49e;h%pQ?^aclX`O%g z{!;D_{cd&Y2&`G4!}(c57a;O0z#KVg6W z#@QPGu=yvf|0j=nZH}{%|MPE;-UZ(-3I9IJ#xVe$gZ+6(D)66o@4+)=vwpAX-*b@v z;@jf)3wEyO!7;CvS9NBPzms88U17>_|FFM0N3xz7 zBLDZ*@rU@kjt8-~jQ{(P|DO=Ye`g(kh(C${&N}{7@xMUl4{_)DFXF!d+u)32oc|Xf z|L^$muedya+U@H<7uNCT`A^}0VI6-Fe**uDbpE{lS!OGu{DI4DJpQmnjJk`E{|kQn z_lx)+w~zm>I{pxU68~Lw{6+i;{NJzh_aM||wj|;o|4JQyh(C#crH(&U{AYFkuE_ri#qoC*`9J8#pRE3~ zr;b0wpTvJp9e=<4fpXfi+pF{EXBhBb#2?NDY>vNsk^i^-_`9w+{@VM`)$xb;llafo z@%QuJ-v0wSe^gL z_?vF&OOgKre*TwTp8v;9w`y&^eRceK{!{qxtK;v-zvf}ucbU%LFMle+-?IF<4Eg^l zartw39e-Z_Q}|zA$6v(1-83s}TkDEC{!sqA6#iErf9mr8$~yiKe-i&I>-bZ}|ARVz z4_@H-LpcA11Mhna%--`9;LpVI z*E0UsBmbv;fAN0!{86JKL7M4?I{pt6`QL#2zv26X17u}*Gl683Y~aJ#--GKf5P#8m zaOW+=-=_O8@(|7_52`0-KX|3^M&|1CU!2=0HlS>r$M zG4{C)upsX5*MAJ{8M_(zKl;uge*N0r1^)d7`|B4UtK+|T4vqiE>iAy_{=EeLw_yL9 zBB6%zXLn@Kr1uu&?*WAJ{kk7t+aC_XcHPI3|1*KVfB&0({>)>4J6&b&dF1a!r?A(D zGp#G7_ZQjbOH_~dXE5Kp?B!Fu21nFo5x>QMKN}I9u^i&}dM(yD8I{W;ey4Zj6S*b- z8O!K&ru_xPZ+Ue?1^D72+9)&fF1YCEhW$mvA0+lKAwKo?Z9;r%|7OGw@@I+a{edl* z&qRKb@mn$9YvH918NW^8xAOgqjNh*EN&PzzzoX$ElWc-6#1HbHEI!?c5BWI@r`1b) z<~P4MFyFqt^wi;pGM_dt@_G<|nmxWu8KYjr-_80KewZx8Yfjy#@)!9FC#kxA#P4M- zvv68>a{RWz@0SlWpL_JFm)piSnJ;h%^Znx&8Gjh_sR9#lMi76>{+3V4a2?|JdSfpg zf&71N{v$8W%nxmEf9l@0+$Qsi)_R3cTYioz{8rNP%|-mPJlg$t4Dok+eJ@e&zvC+Z z6y^Rqf%t7+@s-Zk2Tz7gSV6K?=A^8PKQM{-9bVIHc5LyEU3V3xBc(#+SbU^3tPL27{roh+Vz#Ztziwb!{5plja<;F@ADOnTi=MkC-<`H? z>e!*tknr@Jj;!)HBjP5#t$uOn!;fuF2muJ!;9nXia`)dd!l~*qwXXP0f?M9N;Be zHs`SK>X`8Rzv_>zt;9H6I3T@W9p0}f-cNf!(e*V)1{F^lXJ5X~{1s?Sf{%CJ~S93&@ zkro0xW6a^^SpF41{)+$2XpFkh=9K+gV)=V@{GVy)-;%O_ zYYcygs&W3bBL8F2{2{o%t}T|odH%Ge?B5>C-#mZXQ}*xB`FBCaM7j#^=jA6lnH1ys zcWZPV$p5}zTEG0XFMrB9|7ML4_ZL4!So^M0>#f^YM*d+ts_-Ys|4!`Bf00`!2FG8` z_~p9d!55v#fAM{u_~t5J{uBKEdsjSv4}QN@=kGNtK)X`*?~docoYng;H}daJ*}o^A z|33KrXkGjpR-k*Z|Cixd0^LT)pKS#B)2s6rZ*UQ58vdyWe|3CA|6b&O=*ym9PKx}u zFMs;t`Olg9_o@Cun##Xl=O0Er`pNUhpzBBe;rrRd`?U%NKs3t$_FrNnW0=d&2l($t zPr-RqdgZERRi46t^b^g)gSLn$7qsK2kKKyQt{poqu?VD(c7mqvK=x zuS5Pv-tOSF+ZjLp_WtX2{;npr+&>&2x<}U!X3=%)k^j-RJNPe%R{Z#nTgQL2o#et5fG%?y;vX5$i&Ne;I;gqG|FL(n7x{Gl zd`F|XYaaFb#*jY){{g>>#b*gKWQLbN?`Eszby)A2smBe+k0Jjj-#L_n_S>g z8~9Ju@vjj1Pip*I3H>Kkf1dO~{lPx|8#Mk>J;9H^EArnU{u@&E--!Lc0>M$^@7F(7 ze}C=P_`6Z{=a zH}#QcX0939di;r3;ei$NJ-SQBAD={gyw>rDyEXi2W#=;Y??L>rV_*AkttY-6U$DWH zy@(%7PL`j2Df9bN<_{qLxktr4LuBz8M0|Muj`a97g!r?>&)*HJeA4IdMi8I+`Q>$( z-(Y`9`t^FmKL=mKObS${ze~P<{zZ7dkTMO7;O(DExulyAk2@&cKkq^NGoPZ&&%fI7 zw8@7Zruu7JH4Ob7rug@8OTYa&xi6k0qw&`@ADYHLQ^((Lf5SG(hqK6^LHiGXtBc&t zdF(EpKeh4x>2TwW$|C>g-#K(a*UFh&{rsu%x`816czk33Jo1P41K0csu74GUcgnR+DH8@_#ZK|MO8XC#cE(w8rqS z#Xq@!tLk5iKY@Rn)?cncyerb3=MNemp<4ObXH+4SHc)#EeO6M*dmfU)n}uAWmVa&IR>+ zTz?Le5d8ZzGb9|& z{uA=}IGdyk`JZ^_P*4c)_}lw;r|jR2{GTKC??L{4{XutJ=lP=>FK-h()PwwwNdC!r znBS}Omy7ve7VtN?|D+fBKNj^5FJ@z@1jBtA|FZ7>6Q2JD{(Z>*=sSmkp!4!GfoPpc z`>{Wq|7z}kgL@Lq{QHqV{60ePN)j6X0gb=r{x@U)0mVN{>OYA6Z+6(Pb@^`?|3Sr{ zHvU7{KfJ*O=Ube@9?t{AL&*PFbsC!E?=be?#~0vMms0H!{?+lz)$t8_hLQih!Sid3 zpa1rS=W`7pYkWPjw!c@MRrZg4{c|K`|8;Bo`_EqRm5}{w4dikCAqV4l{^-W5>ne?zME>yn*Emd27SHbxJpZ*p z=kG=oxI6E-zbpFuKYV=nU1T)w-GKZbe7j={OydfFg6F?B>ioUHBI?KeqvK=xZ$$nN zz1^`L=w#1-ZCcAeSPk)E=)Vd1dvAAK=wo^P-~RcvDdf+lqtcOn?r+ddA^$&md(`zY zH09@J>_1aS($If1@_&}te+%-jUZTLOVd%dF`9DDHzZLt7_BSlghk5&nZv5Kgwj%#W zs*}^?&ouJq?QcpsFP3R`{yvTT|M;D3(7M6*-|EU3_neio|5?a?iP-;apR>cw9_ ze(lhmjr@-j`=6up*DC$HLH09t4)UkY{~7FmOe=3(f1W}9k4EtX?f=`b|MSrWMEVWO z&uz#*e1C=C{t)3C_HM`iOLaho{@aoN(^Wi8`FSq(ukvYn&PDz;D)`?}8#3*4*na8x zk$|&A^?XML@x}dznImMspOV$_;rA)1exD_$@M(YlBCqh__hoKt=OjY>-kEBo%6s`QPwK63QF?EipcnqgN$`~XA7Z$f;Ur!HzM+l=_#nUUI;1br=t zFP>k>(8a$M@w;=wEPRHLK%cc?eqq>YH%}KusU7iy_qCJde+S|ZFCKrXIQIO^fvF3g zaj)sxdjAvu&ETqCZ8bV|{9B(ud|iuKjj>i=8S#5P@%uPy&64Q5F2oOJCVM`pThAve zA9@f!%pa=bOE2OF@gd94KE$6m{D|hFyLtZfBYv+}{=uuCIP%kL?%MXs$fwHZ>0U*U zB!LDLK0MCk9yz(^w$0xkIM9CXv8P^nXx!rW*9H-vdF5ALJ#cjYwMit`n05&B{b|Ya ze^}2a%b$@te5&L7I>e_weyvZLKZ^Ka`9M{Fc2nk$)!|c>Z{sQRCoo@>KZUEM^XxVD z&qiNOV*X-(<;tah-hb#xn&+=Kq|D!_@W)Q&-^iD{r#|zuou3+LwE8i=e`YV+-#p1L z4e_H$_>RfhO_(2eOZ-{$_%tK_I$eA+=Kd|1uZz#PIlmS2b@AC_9-lVE?+*5_z93I| zw#-|UKkb+w>|YY!qWtN={J>k{Ta-U##P8L`$D;h{#C%I?Ez5gn6HbEMfo#;`MUU6ls|)r z-xBO!?LnUM{8_R%$sWS|VE>Z%oB2}Ax?#)@ye0l+z+N`vk05@VEEkVL9p>xe z!|w<(?ABwxE|gCco^tAvW5(ulxtQ?O8)$gIKyrd^L6pr1Mp?D1#Ce4Y_NY7f;{C^*P{H{ zi21?(CGjoFpG}w_cuRbX@@ES3gZwE3+d;&~V*lEV`7S3iCh;xyuPvA#cuRbX{c9`Y z=XLpGQ9e&&zAk?(%IC8%Uza}?<@4E?ugf2c^5-1PcSZWh`D0Q3%wWDQe=N$MZHPY@ zh$^P!a{J>k{SAe;k zj2lk97xA4Se^?}cT#Njf!~8H;qWo}ND3##z1DGFj!%twj7Ws1t<_G!1BKhMc@Wqo} ziuoZd$`8lknPUv^!~BpNegea-z@KIKZ_r(a_`?BX{pnG^?@1@OV$pthIpVL=@h#fl zu0Z_mfZrGKpSSS867hrU?@Z!b_G%jrhU)rP)Ble}$RXKd(Xj@cz$oggMjHN&DnEE? zlZO8hm0$2TCk_85l^?#n(c8@zWVwAms^JG4n1p|`h9A6Oj)ea)4WIu2A#^1CTQq!j z%wGU|4?Zp9|8X7vJ9PYc9se~t{;fLxuj%*)6u#&B^c9i*w($bBebl zhr=9s9se4RlK79A@(T)oT=i#;v42s=$NtPQ_Ae=Xh`)$5#D{NRKmNx2CWR02!F&t< zW`#dl@PEMdSNDqj_uCyeLjD{cyMno5u?hdQDEx7i&m3cZtHPgTOkB_TmBTI$$_JkR z>@O3V`;)gR{DY+Yc7;Fg6~EEy zn^ZoIzg2!tDSXIJ+21NZH>-T?ZNo|ktzRu zDj)m9-eA6ccPf0y&wV@rq5O>GXPaSuUZC(HKV`niPgDMdD&IqVk)Njgi&Q?#%l=b5 z{-*q0Dj&yRC;<7)X}aed(ig@1sQ|6zp>{w{5MGR^A?4Fij@Cxg%AFO`8luf!Jm+StHK9=!u&j- z@WG#u{|SW;{)G8?P~n3=A^(#Ke_TC2!v1S|{QZ=|KS0X=w8Dq@*f{rizWxnb5 z{aqbjT;B(Ncz@Kx{QS|ZyIsfM!dVf%#r;=zX!!m!D#87k-|iS-z`ymhGao*?l4MQ3 zsNwt1AW8hkO!>d3@H0&Dhx;2%`CroT6@R!t(3JmWg`Z>oNmn&KJ9+$1OtB@uT_s8M z8M{-%?-vM(f7q1&`wBm!`a}Fp`FCmfia(Ukru_e)@S*(q6%P>XU+-1Ve_t8fn=J0( z)PJDkZw&Zh`M~f0H01xGjxT;gODZ3X@BjRYjz3A~|5Y6yS|m~VX6%2rjxXxZa(opSK&V&g!)%- z7_M&LADhPin8H5@1vKwy^5;H<57|@Vd`Q!<{%LXka=(s`>z@|q7Z2$8xc+Hz|L}u4 zKCXZA=SK|h|9?o~Kd0sobBy!nxWYf6<`2Z*G(W$l@F9PG735D?e}MhV^!Wa;j=wSB zhxG^WH|2j_$H(;t&NqBMpEc_qS@p1h@G&ItOuQ1$DEviT`E1PpBZVIn&pdx>^#{+ie12Bp`?W)n zpCRAk{((PM_`}Ap6h?bpN|gtUNCj?j}roQ}Uod>7?=ru=Vd_`w$TpN|&cNn`%=8ont0;i|ZJepB$LjQM|} z;fu$MCH}NA|JxdV?fnU1{>&Kj|5U@Ty+0x3?=a?nN5}sT^Sf&OYNs*(&vg9PFn^aZ z{{ccW{|@Zr(?_7vC1ApSM|w0vm9ko-S?x&v0@ zT)t?ME{pgFS34m7;slI@?=VmDznyOckIp}X_y@kq<4@6rIlA~TcE1#V9v`nnw|yPN7yd`-{2g|DFWc8V$*cIH{^ml@{N;SmYlT0yT?X;5 z*#tzdM8?k|{%1CD>T`ovw~=MjIRyfBGULAd-u$l7(ed% z)4lBS=1G3<5a&Pi=IDOTo`bowtvrqFIwywzgBJb{OV>XW!yitFjpLt5**~lEFUi~V zaOjW5$H|{8@(;+a2uQ2hId#-77sLN%Cy2j+f3A+d$9E_K|9lL8SYJPXkU!)5U^Ez- z{yg@7b9A0h=I_7u@h>3%oXc1)li`aHUBzR$J@CIEl|S4&{2xxK|12Q?m>aKAq~kAqSL@=H zKV{^9-?}V6=_2#*ME)%<9Dh}Rzx;vkYF#}4&XoPTkbgHn{wn@K`D5VUm9l>~@}JM)Q}*vc{v!W_8!Wd!sM|NeCuPMP8RZ<(O}-;4Z3{;U3e{u}uB zrtIH`{6+pN{z3j5`1hsk-;ex7{ww}L{u}uBr|ds~{Ijr+1~=%3>Cbrni{r0>{{ZrT zU>*Ox2)g_q)c7;L1l;lCuWme^4h;_?e`rhMU77E{EEw=dnf-Ox_xG}^nkV@)ccT4m zA#-YB_Vu#+%fWx`F+)moWfcD6sh4J*PWP8%|2iN|X*Q5m_?g8$W0e=Fu7Kqf{^H^y z@b{YODs$x(ewO?Hg37<3@DFkSUr_lMG2b~d>+wV)>PiYfzlW0Fg!uV|Lkk($zS&;~ zw=r3+M>FO-`C0FF{|Q%1w3xjG@r#^)l8)bs_{|<0qwo$HZHPY@-2E1QZ~NJf_+tBx zi|zZB;6^X2MRZ`kliv&5clBy3YHj8+;=}gc3)`2B---CmhuQ0|))r6D_bd7O&Owg! zs$9o~-q!EDz>n{%S!k8MM|`ymmv%%4N6iM^{~}%A`R0jjhbNb_dw$`(o1JU5--jKh z`oj$tRVT-V-oXE~fxpAj_0MSh*NT6zVzJ|&LH>Ud#Q%AypHRd^~qXz>W(a)%;KHpHJDppz&WT{$iyV zi=F=ks|Mu}OYW&xVe^UQq%KjydKR7}YqTe|#d{*f>JqrcDu zf15P^P`%aqpUx)tZ%Wy}S>q3@uk~LA{~$E6^S>GSe@n`L`}ntL{MU+qQva5e{aZEu zk?I3;Trdvv{}5aePgwtHMgE7S{I@?3Xw&$YJ#Y>>$AzA-{5SA#OWD6&mEo zKR|GOuv_C_uBJ)gYvJFWvVV`pUylC>b1nRP*6?Qp@$c36%ki)IpEk&!-jx0OH2%>n zul9@fhw4!5o<8LN&j=AAhFFwdalV?O;6ravguzDrVEudr zzrDY!^RI=ux*bIPBje-7-$nk%rTFuwKJ2e1ik0bv-J>g^~mp{Y~L;a_t)joeFbpGSAzNk-g{|PichW`Ze z|BmEuAOA_@pFPMJin1>);*b2{J{4sQ8Zn9d9~Az8w_rU=U?{oM_B-Dfwj90 zDf@5K`d1VwsIEZ%*T%;!e>NijCr)fzq^$pJGV~8tuwnVL3Hkp~;7?WmnbP{#>N(+t z@Z(<_A21;1Re1aJK&$=!dk*$L$i6fjdA_XbFOFZy z{m()E51iPxhthur`v<~QA2Z0`i-LK**0OWh-%0n!HhD+(9D4nwJD$Jm{OQ4sZs#LY z;w=G{Im6{-RQ{<$w`Trf>Da>~o1SgEA}E0>#|-&d%s1rJn=Oa{||JnQ%L5W}-pC-(=iiSFKGvc?rT3F7$acs5q zMyV__j!%oiFD@TmS}4D?bN#OD6ICDM__SjFrBx&AzjEjP;8oBT+jnv;{_eH8!R(P2Cf0xdGo$oPrLx_a;OZ%^wUbR@>&!p#f z7T(Ghrk3xie8;{8;P#y`~O^0xjCOV>Z6@xLov0RsO_%Kll6|Bc9h^^AG?WL1A& zkpf` z>Te$Z684Aq^EIIIZ_@ZzAAc*G9a+AI{b!>1 zx7GEBGxs3=HvVlX`?uHicO(AaHqM{+l>IyE`d1?UKQQ+1NZG$!#~&WCiTIo6e;N71 z@i&tH(lr2P(skDLr^)}$l>NKv`n!?%o9BO5%KqJT{VNfF^Zf5l*}n(-!}%{|`QL;5 z!}5Q|p*jBc*7c9(&-aYWpWc-H`|A2f^XDhV{(UL?_t){KDnI*?e^`F{`D0&x4%GFh z$)ACg{Riv%)8x-!%Kk$-|FPg6Vt)P}_A|3?2>CxAVEpqh`}+T|&OdxD5BGApTdg7o!*g&#%mpaiUQ)dyt<*1Te3VTMiyU0{6S*>65=O^8qJ-;DUw`O|{=j5a@8G2d&kue3$BQJcaic&jW{W}of{)zgCJoJ_k zzvb0ZC3^rWxkO!;j!zh&Zp5Evk1tcks0Z4vIVFC7PLD%# ze}bd&zblM=_4=Us^;w6d>z~p1--!He?r+Jc{!M_d3=qXXtMd=*{XG7bO%PeVKiT#D zoW{R;f5_?Z`o8)72|46{?5%7w<^3Ufoxg}bT;J#ZBL3#r*Ye1p`u>nYU4J;pSN+Z7 zU%>tlf4+NB-5*la_=mf1czv8P^YW*t`jeKQC5?ae{w~nA-G58S|K7K<;(;})_%~ty zV~kb(3Cf=)8_g6F{|NGv`cJTW{c8c=fzJ0!>uD>hN z-uE}ZKG>47e`{U;O2ps%`e19y{%v*q#q~jg{Aok}aQuqokNt^QdtHB;{Ao|wzoV`{ zP5yMG>|fUTk1+<(_wzsO=fehF8TsEAFsQB%cIy1Y_FJC+me&V6kv|+>MCbe4=YJRS zXWN4X@DC{XZLd#tA^)!h_-TH9%Kr7ntUG1@Zsh-P;6Fp;--G-eIsU=Y%s+aN|NQ~# zptwKZoEy&Bi~XZ1X_1msw79=3GGx@-hx{K3DB}7WLH_q+ z|M7?>LHzrX|M37nN0k2q*ndA?08~18C;Wqce@x=P1IYh@fZ)I1xRjWOXBgD^SAway zf7p*_j5$1r{KHH7zJJ)z5fi4FYzX^nrm-0{g#5iI%w8Wd<&@NZI2+{?^k)#i(<>5K z*Tk}j-{wu|624NKBUxV#@u{z`JHLHtgyK)QdmV!qwxROW6&eCqhLr_Aq2nO{zs---BeeUNnj z?Lz!n;_HLmDxdWFAY=a`{eC69*d9_eT1n>_JLj>x⪼9AARK`f)1{cHSFN0crS0B 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 O^Xeev=k47sAN@Z=vaJLF literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cmh.pkg b/dockers/docker-pde/cancun_files/cancun_4.7.0/bcm56770_a0_cmh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..b625ff1b05060f511fbe395ceb686bd2db440f97 GIT binary patch literal 4324 zcmchaTZmRw6vy{*#%4@Y$Fa=v7G6rt9)gfa%a4)9yN%;zLa+xF9|o#{ZVU)Y4zK95-j**qOiK&;cUJUa=^#42OEII9OFJXpo!T;NPul3vO?0xn= zXP<9f+p4xDE89XA-aZl?SCm()ZF2(ofRgQfq_8ArEPa2T^m9VDD9&4@Ci|EjPb*sW?Nka>pYauj$o`uC_n;62jDMtN+9a(5r z$>nK}lIYv{QV3^0&BCjt-}-$uso>sGKaAgz5>xtaLfb zr}7hv^LIM=IX@Vyjo-dyz{zd-tKTv^DLn|HG!{%RQ@( zr<$K@$NAUEhsF6hzwyQVdSF@1bAG4z4LM!UPjUDzho4dMoI}j}FMVk7Eou9lYqOsC ziSPcbh%+wy_?T0*uRXK$#puf#)3^3X(ck(Kw|lWk9OvIRIA!$5N4bBY&c@OgU(ent zaOi&5BhFZ7m8|VIuFIG#hpIV;kG;nlUwJbNd#>p}*FVJ^`qgG$X7t6_E3uKsjO$}| z22;0qJU4qESnkx^EJhycaSnS25ksjQobMJ-<;t>nXlRy0hY(wQ;pkTY literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cch.pkg b/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cch.pkg new file mode 100644 index 0000000000000000000000000000000000000000..2be24cc0b5029cb700edb5650d1f09b3905be019 GIT binary patch literal 128496 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 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cfh.pkg b/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cfh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..5febf2f7f2a94a8ff4bfa2b82b3e036c3704366d GIT binary patch literal 77172 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
g8cFyD~l~w8smqUi{p5YFKI453~i#L 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 UIXq2$Ne+uk4v(*~%hfafAJT+oB>(^b literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cih.pkg b/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cih.pkg new file mode 100644 index 0000000000000000000000000000000000000000..09b9577fe4ee00354bbc65986a27a7b3c7211dcf GIT binary patch literal 995268 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 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_ceh.pkg b/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_ceh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..a5469025cfad5de2104cc992c645885345931745 GIT binary patch literal 19252 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 literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cfh.pkg b/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cfh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..9c664c35334eebe944a2a417a36d5379890e3ff3 GIT binary patch literal 89948 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 NIOJ>p*M9W9{|5rwR}KIG literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cmh.pkg b/dockers/docker-pde/cancun_files/cancun_6.9.1/bcm56870_a0_cmh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..57f1c5ae40bc672f7131188a3c23f5bc8f058111 GIT binary patch literal 4324 zcmchaONduh9LLXfQZvoT#`012fHcQPn}`q}IgIG^&{4-%8(mbm5PYnPsX%BUA}R=? zp&LOng;}-Hh+4IXAaqLXwa7u;h~}aYH`VuZ@BPK?_dmaZ3GoNtIp_R-pYyxtoO|y7 zoLS$!s=H@pcPi4(bH%tZ#exTt>awY$$52o&+bRd7E@_UK`(->cvM-{5^MBK5Uux7x zTD_tUH>JDMXf4VlX@=A(y(D!>E2TH3ccfj?|FI9%Z?AM%Iw1{6X6IG^TDmCRknTur zqbypL?P||;zW)*zi^s>|~nf0o^ zS?ZVeNynuD=}T!)G8;S0KI<4JX8nDsrAiYe4K2OZmC}UcMOs$3i6LyOV$?s_U8Dz9 z@+jI9B>MI()Hn|nX?g9pey5(SxcAf#Hj(RmQ?e0La}@#n>}A6Qe{cSDO)dS5@< z{6^SX(+9h%81>%%qAc&sWp3^B{LjEL&(EuUp8ut!Tlx6`|7*a%Q1efy zWS-YFw{JhG^3t|_X)(rkR0kX-vFqZA?SDHZerKr@v+~%Is!bf9`Tg@Ob}ygDI81*1 zRw#xMZ@!;rYM@KXZ5 zH{f~Cx%{gGetN*K33x8W>>bV{O1nqcKH}L}^A15DKi{<_)%w0T4|4hK{K(}e=JWRj z`8hurtBv38GT`L4{LQ<}ZuyP3`P%QD@y+@28|lZhPCg92x&L8v^JUGN<7wvS**^bz z`7ocK^BbS%Hvr2#&-tC>HsyO4q zkB>Pu``R~4UyQ!IWBPU-sQO!9;#c|$zic>~^e3TzA)>%~h{PXNL1r81OJY#$g z`|gNixf~WFPTl9QZ{41e%fb0;@mvmF+5e5(n)q1A2X@Pu zB5_xw|G8b&ePL%&ooB@9GfSdw-y-jX_k|B(aQOHx+5bb^i*)d}ly3i7z29qU^9(cV z$9Lq7JZ9v@>|R6N;(m{^*KLlLpEak>Jex7wV=vAx%00%pg~7_Vl=8cxNOn)>9ARE- m^pC{sMb$kB#&T|w|CPGk|3{JT?5Wn2Id2>$_E+b;ng0O#Y`<>+ literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/docker_init.sh b/dockers/docker-pde/docker_init.sh old mode 100644 new mode 100755 index f8e45e99d98d..4404095ded33 --- a/dockers/docker-pde/docker_init.sh +++ b/dockers/docker-pde/docker_init.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash + set -x start_bcm() @@ -10,6 +11,8 @@ start_bcm() PLATFORM_DIR=/usr/share/sonic/platform HWSKU_DIR=/usr/share/sonic/hwsku +# Default use python3 version +SONIC_PLATFORM_API_PYTHON_VERSION=3 mkdir -p /etc/sai.d/ @@ -20,23 +23,28 @@ fi . /usr/bin/syncd_init_common.sh config_syncd -# If the sonic-platform package is not installed, try to install it -pip show sonic-platform > /dev/null 2>&1 +# If the Python 3 sonic-platform package is not installed, try to install it +python3 -c "import sonic_platform" > /dev/null 2>&1 || pip3 show sonic-platform > /dev/null 2>&1 if [ $? -ne 0 ]; then - SONIC_PLATFORM_WHEEL="/usr/share/sonic/platform/sonic_platform-1.0-py2-none-any.whl" + SONIC_PLATFORM_WHEEL="/usr/share/sonic/platform/sonic_platform-1.0-py3-none-any.whl" echo "sonic-platform package not installed, attempting to install..." if [ -e ${SONIC_PLATFORM_WHEEL} ]; then - pip install ${SONIC_PLATFORM_WHEEL} + pip3 install ${SONIC_PLATFORM_WHEEL} if [ $? -eq 0 ]; then echo "Successfully installed ${SONIC_PLATFORM_WHEEL}" + SONIC_PLATFORM_API_PYTHON_VERSION=3 else echo "Error: Failed to install ${SONIC_PLATFORM_WHEEL}" fi else echo "Error: Unable to locate ${SONIC_PLATFORM_WHEEL}" fi +else + SONIC_PLATFORM_API_PYTHON_VERSION=3 fi start_bcm -exec /usr/bin/supervisord +exec /usr/local/bin/supervisord + + diff --git a/dockers/docker-pde/syncd_init_common.sh b/dockers/docker-pde/syncd_init_common.sh new file mode 100755 index 000000000000..0212f842329a --- /dev/null +++ b/dockers/docker-pde/syncd_init_common.sh @@ -0,0 +1,254 @@ +#!/usr/bin/env bash + +CMD_SYNCD=/usr/bin/syncd + +# dsserve: domain socket server for stdio +CMD_DSSERVE=/usr/bin/dsserve +CMD_DSSERVE_ARGS="$CMD_SYNCD --diag" + +ENABLE_SAITHRIFT=0 + +PLATFORM_DIR=/usr/share/sonic/platform +HWSKU_DIR=/usr/share/sonic/hwsku + +SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) + +if [ -x $CMD_DSSERVE ]; then + CMD=$CMD_DSSERVE + CMD_ARGS=$CMD_DSSERVE_ARGS +else + CMD=$CMD_SYNCD + CMD_ARGS= +fi + +# Use temporary view between init and apply +CMD_ARGS+=" -u" + +case "$(cat /proc/cmdline)" in + *SONIC_BOOT_TYPE=fastfast*) + if [ -e /var/warmboot/warm-starting ]; then + FASTFAST_REBOOT='yes' + fi + ;; + *SONIC_BOOT_TYPE=fast*|*fast-reboot*) + FAST_REBOOT='yes' + ;; + *) + FAST_REBOOT='no' + FASTFAST_REBOOT='no' + ;; +esac + + +function check_warm_boot() +{ + # FIXME: if we want to continue start option approach, then we need to add + # code here to support redis database query. + # SYSTEM_WARM_START=`sonic-db-cli STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable` + # SERVICE_WARM_START=`sonic-db-cli STATE_DB hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable` + # SYSTEM_WARM_START could be empty, always make WARM_BOOT meaningful. + # if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then + # WARM_BOOT="true" + # else + WARM_BOOT="false" + # fi +} + + +function set_start_type() +{ + if [ x"$WARM_BOOT" == x"true" ]; then + CMD_ARGS+=" -t warm" + elif [ x"$FAST_REBOOT" == x"yes" ]; then + CMD_ARGS+=" -t fast" + elif [ x"$FASTFAST_REBOOT" == x"yes" ]; then + CMD_ARGS+=" -t fastfast" + fi +} + + +config_syncd_bcm() +{ + PLATFORM_COMMON_DIR=/usr/share/sonic/device/x86_64-broadcom_common + PLT_CONFIG_BCM=$(find $HWSKU_DIR -name '*.bcm') + + if [ ! -z "$PLT_CONFIG_BCM" ]; then + cp -f $HWSKU_DIR/*.config.bcm /tmp + cp -f /etc/sai.d/sai.profile /tmp + CONFIG_BCM=$(find /tmp -name '*.bcm') + SAI_PROFILE=$(find /tmp -name 'sai.profile') + sed -i 's+/usr/share/sonic/hwsku+/tmp+g' $SAI_PROFILE + + #Get first three characters of chip id + readline=$(grep '0x14e4' /proc/linux-kernel-bde) + chip_id=${readline#*0x14e4:0x} + chip_id=${chip_id::3} + COMMON_CONFIG_BCM=$(find $PLATFORM_COMMON_DIR/x86_64-broadcom_${chip_id} -name '*.bcm') + + if [ -f $PLATFORM_COMMON_DIR/x86_64-broadcom_${chip_id}/*.bcm ]; then + for file in $CONFIG_BCM; do + echo "" >> $file + echo "# Start of chip common properties" >> $file + while read line + do + line=$( echo $line | xargs ) + if [ ! -z "$line" ];then + if [ "${line::1}" == '#' ];then + echo $line >> $file + else + sedline=${line%=*} + if grep -q $sedline $file ;then + echo "Keep the config $(grep $sedline $file) in $file" + else + echo $line >> $file + fi + fi + fi + done < $COMMON_CONFIG_BCM + echo "# End of chip common properties" >> $file + done + echo "Merging $PLT_CONFIG_BCM with $COMMON_CONFIG_BCM, merge files stored in $CONFIG_BCM" + fi + #sync the file system + sync + + # copy the final config.bcm and sai.profile to the shared folder for 'show tech' + cp -f /tmp/sai.profile /var/run/sswsyncd/ + cp -f /tmp/*.bcm /var/run/sswsyncd/ + fi + + if [ -f "/tmp/sai.profile" ]; then + CMD_ARGS+=" -p /tmp/sai.profile" + elif [ -f "/etc/sai.d/sai.profile" ]; then + CMD_ARGS+=" -p /etc/sai.d/sai.profile" + else + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" + fi + + [ -e /dev/linux-bcm-knet ] || mknod /dev/linux-bcm-knet c 122 0 + [ -e /dev/linux-user-bde ] || mknod /dev/linux-user-bde c 126 0 + [ -e /dev/linux-kernel-bde ] || mknod /dev/linux-kernel-bde c 127 0 +} + +config_syncd_mlnx() +{ + CMD_ARGS+=" -p /tmp/sai.profile" + + [ -e /dev/sxdevs/sxcdev ] || ( mkdir -p /dev/sxdevs && mknod /dev/sxdevs/sxcdev c 231 193 ) + + # Read MAC address + MAC_ADDRESS="$(sonic-cfggen -d -v DEVICE_METADATA.localhost.mac)" + + # Write MAC address into /tmp/profile file. + cat $HWSKU_DIR/sai.profile > /tmp/sai.profile + echo "DEVICE_MAC_ADDRESS=$MAC_ADDRESS" >> /tmp/sai.profile + echo "SAI_WARM_BOOT_WRITE_FILE=/var/warmboot/" >> /tmp/sai.profile +} + +config_syncd_centec() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" + + [ -e /dev/linux_dal ] || mknod /dev/linux_dal c 198 0 + [ -e /dev/net/tun ] || ( mkdir -p /dev/net && mknod /dev/net/tun c 10 200 ) +} + +config_syncd_cavium() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile -d" + + export XP_ROOT=/usr/bin/ + + # Wait until redis-server starts + until [ $(sonic-db-cli PING | grep -c PONG) -gt 0 ]; do + sleep 1 + done +} + +config_syncd_marvell() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" + + [ -e /dev/net/tun ] || ( mkdir -p /dev/net && mknod /dev/net/tun c 10 200 ) +} + +config_syncd_barefoot() +{ + PROFILE_FILE="$HWSKU_DIR/sai.profile" + if [ ! -f $PROFILE_FILE ]; then + # default profile file + PROFILE_FILE="/tmp/sai.profile" + echo "SAI_KEY_WARM_BOOT_WRITE_FILE=/var/warmboot/sai-warmboot.bin" > $PROFILE_FILE + echo "SAI_KEY_WARM_BOOT_READ_FILE=/var/warmboot/sai-warmboot.bin" >> $PROFILE_FILE + fi + CMD_ARGS+=" -p $PROFILE_FILE" + + # Check and load SDE profile + P4_PROFILE=$(sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["p4_profile"]') + if [[ -n "$P4_PROFILE" ]]; then + if [[ ( -d /opt/bfn/install_${P4_PROFILE} ) && ( -L /opt/bfn/install || ! -e /opt/bfn/install ) ]]; then + ln -srfn /opt/bfn/install_${P4_PROFILE} /opt/bfn/install + fi + fi + export PYTHONHOME=/opt/bfn/install/ + export PYTHONPATH=/opt/bfn/install/ + export ONIE_PLATFORM=`grep onie_platform /etc/machine.conf | awk 'BEGIN { FS = "=" } ; { print $2 }'` + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/bfn/install/lib/platform/$ONIE_PLATFORM:/opt/bfn/install/lib:/opt/bfn/install/lib/tofinopd/switch + ./opt/bfn/install/bin/dma_setup.sh +} + +config_syncd_nephos() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" +} + +config_syncd_vs() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" +} + +config_syncd_innovium() +{ + CMD_ARGS+=" -p $HWSKU_DIR/sai.profile" + ulimit -s 65536 + export II_ROOT="/var/log/invm" + export II_APPEND_LOG=1 + mkdir -p $II_ROOT +} + +config_syncd() +{ + check_warm_boot + + if [ "$SONIC_ASIC_TYPE" == "broadcom" ]; then + config_syncd_bcm + elif [ "$SONIC_ASIC_TYPE" == "mellanox" ]; then + config_syncd_mlnx + elif [ "$SONIC_ASIC_TYPE" == "cavium" ]; then + config_syncd_cavium + elif [ "$SONIC_ASIC_TYPE" == "centec" ]; then + config_syncd_centec + elif [ "$SONIC_ASIC_TYPE" == "marvell" ]; then + config_syncd_marvell + elif [ "$SONIC_ASIC_TYPE" == "barefoot" ]; then + config_syncd_barefoot + elif [ "$SONIC_ASIC_TYPE" == "nephos" ]; then + config_syncd_nephos + elif [ "$SONIC_ASIC_TYPE" == "vs" ]; then + config_syncd_vs + elif [ "$SONIC_ASIC_TYPE" == "innovium" ]; then + config_syncd_innovium + else + echo "Unknown ASIC type $SONIC_ASIC_TYPE" + exit 1 + fi + + set_start_type + + if [ ${ENABLE_SAITHRIFT} == 1 ]; then + CMD_ARGS+=" -r -m $HWSKU_DIR/port_config.ini" + fi + + [ -r $PLATFORM_DIR/syncd.conf ] && . $PLATFORM_DIR/syncd.conf +} + diff --git a/platform/broadcom/docker-pde.mk b/platform/broadcom/docker-pde.mk index d433160e2a7d..a16c0c1f16e8 100644 --- a/platform/broadcom/docker-pde.mk +++ b/platform/broadcom/docker-pde.mk @@ -16,17 +16,20 @@ ifeq ($(PDDF_SUPPORT), y) $(DOCKER_PDE)_PYTHON_WHEELS += $(PDDF_PLATFORM_API_BASE_PY3) endif $(DOCKER_PDE)_PYTHON_WHEELS += $(SONIC_DAEMON_BASE_PY3) -$(DOCKER_PDE)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) -$(DOCKER_PDE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) -$(DOCKER_PDE)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_PDE)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_PDE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) +$(DOCKER_PDE)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE) SONIC_DOCKER_IMAGES += $(DOCKER_PDE) -SONIC_BUSTER_DOCKERS += $(DOCKER_PDE) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_PDE) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PDE) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_PDE_DBG) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_PDE_DBG) SONIC_DOCKER_DBG_IMAGES += $(DOCKER_PDE_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_PDE_DBG) +$(DOCKER_PDE)_VERSION = 1.0.0 +$(DOCKER_PDE)_PACKAGE_NAME = pde + $(DOCKER_PDE)_CONTAINER_NAME = pde $(DOCKER_PDE)_RUN_OPT += --privileged -t $(DOCKER_PDE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro @@ -35,12 +38,13 @@ $(DOCKER_PDE)_RUN_OPT += -v /usr/lib/python2.7/dist-packages:/usr/share/sonic/cl $(DOCKER_PDE)_RUN_OPT += -v /usr/local/lib/python3.7/dist-packages/utilities_common:/usr/local/lib/python3.7/dist-packages/utilities_common:ro $(DOCKER_PDE)_RUN_OPT += -v /var/log/syslog:/var/log/syslog:ro +$(DOCKER_PDE)_RUN_OPT += -v /var/log/ramfs:/var/log/ramfs:ro $(DOCKER_PDE)_RUN_OPT += -v /lib/modules:/lib/modules:ro $(DOCKER_PDE)_RUN_OPT += -v /boot:/boot:ro $(DOCKER_PDE)_RUN_OPT += -v /var/log/ramfs:/var/log/ramfs:ro $(DOCKER_PDE)_RUN_OPT += -v /usr/share/sonic/device/x86_64-broadcom_common:/usr/share/sonic/device/x86_64-broadcom_common:ro $(DOCKER_PDE)_RUN_OPT += -v /usr/share/sonic/device/pddf:/usr/share/sonic/device/pddf:ro - +$(DOCKER_PDE)_RUN_OPT += -v /usr/share/sonic/device/x86_64-broadcom_common:/usr/share/sonic/device/x86_64-broadcom_common:ro $(DOCKER_PDE)_BASE_IMAGE_FILES += pde-test:/usr/local/bin/pde-test $(DOCKER_PDE)_BASE_IMAGE_FILES += pde-bench:/usr/local/bin/pde-bench $(DOCKER_PDE)_BASE_IMAGE_FILES += pde-stress:/usr/local/bin/pde-stress From 23308a345b59d09f0a9a7b4e8bc3e43e0ab3f45b Mon Sep 17 00:00:00 2001 From: Neetha John Date: Wed, 13 Jul 2022 15:25:28 -0700 Subject: [PATCH 554/817] Minigraph parser changes to select mmu profiles based on SonicQosProfile attribute (#11429) Signed-off-by: Neetha John Why I did it There is a need to select different mmu profiles based on deployment type How I did it There will be separate subfolders (RDMA-CENTRIC, TCP-CENTRIC, BALANCED) in each hwsku folder which contains deployment specific mmu and qos settings. SonicQosProfile attribute in the minigraph will be used to determine which settings to use. If that attribute is not present, the default settings that exist in the hwsku folder will be used --- src/sonic-config-engine/minigraph.py | 36 ++++++++++- .../tests/sample-dell-6100-t0-minigraph.xml | 5 ++ src/sonic-config-engine/tests/test_j2files.py | 59 ++++++------------- 3 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 282356924b92..a05880e5225e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -895,6 +895,8 @@ def parse_meta(meta, hname): kube_data = {} macsec_profile = {} redundancy_type = None + qos_profile = None + device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): if device.find(str(QName(ns1, "Name"))).text.lower() == hname.lower(): @@ -939,7 +941,9 @@ def parse_meta(meta, hname): macsec_profile = parse_macsec_profile(value) elif name == "RedundancyType": redundancy_type = value - return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type + elif name == "SonicQosProfile": + qos_profile = value + return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type, qos_profile def parse_system_defaults(meta): @@ -964,7 +968,6 @@ def parse_system_defaults(meta): return system_default_values - def parse_linkmeta(meta, hname): link = meta.find(str(QName(ns, "Link"))) linkmetas = {} @@ -1265,6 +1268,31 @@ def enable_internal_bgp_session(bgp_sessions, filename, asic_name): (local_sub_role == BACKEND_ASIC_SUB_ROLE and peer_sub_role == FRONTEND_ASIC_SUB_ROLE)): bgp_sessions[peer_ip].update({'admin_status': 'up'}) +def select_mmu_profiles(profile, platform, hwsku): + """ + Select MMU files based on the device metadata attribute - SonicQosProfile + if no QosProfile exists in the minigraph, then no action is needed. + if a profile exists in the minigraph, + - create a dir path to search 1 level down from the base path. + - if no such dir path exists, no action is needed. + - if a dir path exists, check for the presence of each file from + the copy list in the dir path and copy it over to the base path. + """ + if not profile: + return + + files_to_copy = ['pg_profile_lookup.ini', 'qos.json.j2', 'buffers_defaults_t0.j2', 'buffers_defaults_t1.j2'] + + path = os.path.join('/usr/share/sonic/device', platform, hwsku) + + dir_path = os.path.join(path, profile) + if os.path.exists(dir_path): + for file_item in files_to_copy: + file_in_dir = os.path.join(dir_path, file_item) + if os.path.isfile(file_in_dir): + base_file = os.path.join(path, file_item) + exec_cmd("sudo cp {} {}".format(file_in_dir, base_file)) + ############################################################################### # # Main functions @@ -1339,6 +1367,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw system_defaults = {} macsec_profile = {} redundancy_type = None + qos_profile = None hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -1369,7 +1398,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type, qos_profile) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1393,6 +1422,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "SystemDefaultsDeclaration")): system_defaults = parse_system_defaults(child) + select_mmu_profiles(qos_profile, platform, hwsku) # set the host device type in asic metadata also device_type = [devices[key]['type'] for key in devices if key.lower() == hostname.lower()][0] if asic_name is None: diff --git a/src/sonic-config-engine/tests/sample-dell-6100-t0-minigraph.xml b/src/sonic-config-engine/tests/sample-dell-6100-t0-minigraph.xml index 7cea7decfcc0..cb84ce744ed1 100644 --- a/src/sonic-config-engine/tests/sample-dell-6100-t0-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-dell-6100-t0-minigraph.xml @@ -731,6 +731,11 @@ True + + SonicQosProfile + + RDMA-CENTRIC + ARISTA01T1:Ethernet1;s6100-dev-1:fortyGigE1/1/1 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 8ddca0908660..3edae73f5e58 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -282,23 +282,7 @@ def test_l2switch_template_dualtor(self): self.assertEqual(sample_output_json, output_json) def test_qos_arista7050_render_template(self): - arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', 'x86_64-arista_7050_qx32s', 'Arista-7050-QX-32S') - qos_file = os.path.join(arista_dir_path, 'qos.json.j2') - port_config_ini_file = os.path.join(arista_dir_path, 'port_config.ini') - - # copy qos_config.j2 to the Arista 7050 directory to have all templates in one directory - qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') - shutil.copy2(qos_config_file, arista_dir_path) - - argument = '-m ' + self.arista7050_t0_minigraph + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + self.output_file - self.run_script(argument) - - # cleanup - qos_config_file_new = os.path.join(arista_dir_path, 'qos_config.j2') - os.remove(qos_config_file_new) - - sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-arista7050.json') - assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) + self._test_qos_render_template('arista', 'x86_64-arista_7050_qx32s', 'Arista-7050-QX-32S', 'sample-arista-7050-t0-minigraph.xml', 'qos-arista7050.json') def do_test_qos_and_buffer_arista7800r3_48cq2_lc_render_template(self, platform, hwsku): arista_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'arista', platform, hwsku) @@ -331,41 +315,32 @@ def test_qos_and_buffer_arista7800r3_48cqm2_lc_render_template(self): self.do_test_qos_and_buffer_arista7800r3_48cq2_lc_render_template('x86_64-arista_7800r3_48cqm2_lc', 'Arista-7800R3-48CQM2-C48') def test_qos_dell9332_render_template(self): - dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32') - qos_file = os.path.join(dell_dir_path, 'qos.json.j2') - port_config_ini_file = os.path.join(dell_dir_path, 'port_config.ini') - - # copy qos_config.j2 to the Dell Z9332 directory to have all templates in one directory - qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') - shutil.copy2(qos_config_file, dell_dir_path) - - argument = '-m ' + self.dell9332_t1_minigraph + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + self.output_file - self.run_script(argument) + self._test_qos_render_template('dell', 'x86_64-dellemc_z9332f_d1508-r0', 'DellEMC-Z9332f-O32', 'sample-dell-9332-t1-minigraph.xml', 'qos-dell9332.json') - # cleanup - qos_config_file_new = os.path.join(dell_dir_path, 'qos_config.j2') - os.remove(qos_config_file_new) - - sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell9332.json') - assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) - def test_qos_dell6100_render_template(self): - dell_dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', 'dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100') - qos_file = os.path.join(dell_dir_path, 'qos.json.j2') - port_config_ini_file = os.path.join(dell_dir_path, 'port_config.ini') + self._test_qos_render_template('dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100', 'sample-dell-6100-t0-minigraph.xml', 'qos-dell6100.json') - # copy qos_config.j2 to the Dell S6100 directory to have all templates in one directory + def _test_qos_render_template(self, vendor, platform, sku, minigraph, expected): + file_exist, dir_exist = self.create_machine_conf(platform, vendor) + dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) + qos_file = os.path.join(dir_path, 'qos.json.j2') + port_config_ini_file = os.path.join(dir_path, 'port_config.ini') + + # copy qos_config.j2 to the SKU directory to have all templates in one directory qos_config_file = os.path.join(self.test_dir, '..', '..', '..', 'files', 'build_templates', 'qos_config.j2') - shutil.copy2(qos_config_file, dell_dir_path) + shutil.copy2(qos_config_file, dir_path) - argument = '-m ' + self.dell6100_t0_minigraph + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + self.output_file + minigraph = os.path.join(self.test_dir, minigraph) + argument = '-m ' + minigraph + ' -p ' + port_config_ini_file + ' -t ' + qos_file + ' > ' + self.output_file self.run_script(argument) # cleanup - qos_config_file_new = os.path.join(dell_dir_path, 'qos_config.j2') + qos_config_file_new = os.path.join(dir_path, 'qos_config.j2') os.remove(qos_config_file_new) + + self.remove_machine_conf(file_exist, dir_exist) - sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, 'qos-dell6100.json') + sample_output_file = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, expected) assert utils.cmp(sample_output_file, self.output_file), self.run_diff(sample_output_file, self.output_file) def test_qos_dscp_remapping_render_template(self): From fae1ab6761900e269e0218f94e5e221a13d89759 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Wed, 13 Jul 2022 23:23:28 -0700 Subject: [PATCH 555/817] [submodule] Advance sonic-utilities pointer (#11443) Updating sonic-utilities submodule with the following commits d6b8869 [Auto-Techsupport] Fix the coredump_gen_handler Exception when the History table is empty b41da8f Fix README to reflect sonic-utilities being built in Bullseye --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 28926b0f80ae..d6b886989cc1 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 28926b0f80ae5fb4228d5ba2743ec146f69c7963 +Subproject commit d6b886989cc1f2104613c2cb21d406f9ab5127dc From 2863945f7cec166f595bf26975f511345d57fef5 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 14 Jul 2022 14:24:39 +0800 Subject: [PATCH 556/817] [Mellanox] Fix issue: failed to decode Json while there is no hwsku.json (#11436) - Why I did it Fix bug: pmon report error on start up because some SKUs do not have hwsku.json - How I did it If hwsku.json, do not extract RJ45 port information - How to verify it Manual test. Unit test. --- .../mlnx-platform-api/sonic_platform/chassis.py | 10 +++++++++- .../mlnx-platform-api/sonic_platform/utils.py | 16 ++++++++++------ .../mlnx-platform-api/tests/test_utils.py | 7 ++++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index ea4d7df30f9a..23e69645e843 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -111,7 +111,8 @@ def __init__(self): self.reboot_cause_initialized = False # Build the RJ45 port list from platform.json and hwsku.json - self.RJ45_port_list = extract_RJ45_ports_index() + self._RJ45_port_inited = False + self._RJ45_port_list = None logger.log_info("Chassis loaded successfully") @@ -124,6 +125,13 @@ def __del__(self): if SFP.shared_sdk_handle: deinitialize_sdk_handle(SFP.shared_sdk_handle) + @property + def RJ45_port_list(self): + if not self._RJ45_port_inited: + self._RJ45_port_list = extract_RJ45_ports_index() + self._RJ45_port_inited = True + return self._RJ45_port_list + ############################################## # PSU methods ############################################## diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py index b35ef313dfcd..adf931d37e90 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py @@ -177,12 +177,12 @@ def is_host(): """ Test whether current process is running on the host or an docker return True for host and False for docker - """ + """ try: - proc = subprocess.Popen("docker --version 2>/dev/null", - stdout=subprocess.PIPE, - shell=True, - stderr=subprocess.STDOUT, + proc = subprocess.Popen("docker --version 2>/dev/null", + stdout=subprocess.PIPE, + shell=True, + stderr=subprocess.STDOUT, universal_newlines=True) stdout = proc.communicate()[0] proc.wait() @@ -239,9 +239,13 @@ def load_json_file(filename, log_func=logger.log_error): def extract_RJ45_ports_index(): # Cross check 'platform.json' and 'hwsku.json' to extract the RJ45 port index if exists. hwsku_path = device_info.get_path_to_hwsku_dir() + hwsku_file = os.path.join(hwsku_path, HWSKU_JSON) + if not os.path.exists(hwsku_file): + # Platforms having no hwsku.json do not have RJ45 port + return None + platform_file = device_info.get_path_to_port_config_file() platform_dict = load_json_file(platform_file)['interfaces'] - hwsku_file = os.path.join(hwsku_path, HWSKU_JSON) hwsku_dict = load_json_file(hwsku_file)['interfaces'] port_name_to_index_map_dict = {} RJ45_port_index_list = [] diff --git a/platform/mellanox/mlnx-platform-api/tests/test_utils.py b/platform/mellanox/mlnx-platform-api/tests/test_utils.py index bbc3ab28e58c..e1052202d416 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_utils.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_utils.py @@ -113,10 +113,15 @@ def test_default_return(self, mock_log): @utils.default_return(100, log_func=mock_log) def func(): raise RuntimeError('') - + assert func() == 100 assert mock_log.call_count == 1 def test_run_command(self): output = utils.run_command('ls') assert output + + @mock.patch('sonic_py_common.device_info.get_path_to_hwsku_dir', mock.MagicMock(return_value='/tmp')) + def test_extract_RJ45_ports_index(self): + rj45_list = utils.extract_RJ45_ports_index() + assert rj45_list is None From 054b4bd0f7c05e2ed075bc347f7fce58dd6a2185 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Thu, 14 Jul 2022 09:25:13 +0300 Subject: [PATCH 557/817] [submodule] Advance sonic-swss pointer (#11380) Update sonic-swss submodule pointer to include the following: * Port configuration incremental update support ([#2305](https://github.com/Azure/sonic-swss/pull/2305)) * [VS Test] Skip failing subport tests ([#2370](https://github.com/Azure/sonic-swss/pull/2370)) * [teammgr]: Waiting MACsec ready before doLagMemberTask ([#2286](https://github.com/Azure/sonic-swss/pull/2286)) * [vnetorch] [vxlanorch] fix a set of memory usage issues ([#2352](https://github.com/Azure/sonic-swss/pull/2352)) * [tests] [asan] add graceful stop flag ([#2347](https://github.com/Azure/sonic-swss/pull/2347)) * [asan] suppress the static variable leaks ([#2354](https://github.com/Azure/sonic-swss/pull/2354)) * Add support for IP interface loopback action ([#2307](https://github.com/Azure/sonic-swss/pull/2307)) * [orchagent]: srv6orch support for uSID ([#2335](https://github.com/Azure/sonic-swss/pull/2335)) Signed-off-by: dprital --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 93af69c5cb9a..7126857c1e38 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 93af69c5cb9a78465604974b59d1b1ed709d2b10 +Subproject commit 7126857c1e387784bd04b9f7502018b2a4973d85 From dc7c9d82c804f21c3df11343749024a2b806cebb Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Thu, 14 Jul 2022 09:26:00 +0300 Subject: [PATCH 558/817] [ssip]: Update YANG doc. (#11363) - Why I did it To implement Syslog Source IP feature - How I did it Added the relevant yang doc - How to verify it N/A Signed-off-by: Nazarii Hnydyn --- src/sonic-yang-models/doc/Configuration.md | 72 ++++++++++++++-------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 1baa2c81e1db..e66927b4a8c2 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1099,33 +1099,51 @@ These information are configured in individual tables. Domain name or IP address of the server is used as object key. Currently there are no attributes in those objects. -***NTP server*** -``` -{ -"NTP_SERVER": { - "2.debian.pool.ntp.org": {}, - "1.debian.pool.ntp.org": {}, - "3.debian.pool.ntp.org": {}, - "0.debian.pool.ntp.org": {} - }, - -"NTP_SERVER": { - "23.92.29.245": {}, - "204.2.134.164": {} - } -} -``` - -***Syslogserver*** -``` -{ -"SYSLOG_SERVER": { - "10.0.0.5": {}, - "10.0.0.6": {}, - "10.11.150.5": {} - } -} -``` +***NTP server*** +``` +{ + "NTP_SERVER": { + "2.debian.pool.ntp.org": {}, + "1.debian.pool.ntp.org": {}, + "3.debian.pool.ntp.org": {}, + "0.debian.pool.ntp.org": {} + }, + + "NTP_SERVER": { + "23.92.29.245": {}, + "204.2.134.164": {} + } +} +``` + +***Syslog server*** +``` +{ + "SYSLOG_SERVER": { + "10.0.0.5": {}, + "10.0.0.6": {}, + "10.11.150.5": {} + }, + + "SYSLOG_SERVER" : { + "2.2.2.2": { + "source": "1.1.1.1", + "port": "514", + "vrf": "default" + }, + "4.4.4.4": { + "source": "3.3.3.3", + "port": "514", + "vrf": "mgmt" + }, + "2222::2222": { + "source": "1111::1111", + "port": "514", + "vrf": "Vrf-Data" + } + } +} +``` ### Policer From a86f59eda811ce3d670af6594fcf0ecda31f8e79 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Thu, 14 Jul 2022 09:30:00 +0300 Subject: [PATCH 559/817] [teamd] Stop teamd after stopping swss in fast-reboot (#11210) - Why I did it To optimize fast-reboot. Teamd can be stopped after bgp is stopped and after swss is stopped because the last LACP packet can be sent still since syncd is still running. Saves 15 sec on shutdown. - How I did it Defined in the manifest for teamd to be stopped after swss - How to verify it Run it on the switch. Signed-off-by: Stepan Blyschak --- rules/docker-teamd.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index 8d978ae66515..d376daa2100f 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -19,7 +19,8 @@ $(DOCKER_TEAMD)_VERSION = 1.0.0 $(DOCKER_TEAMD)_PACKAGE_NAME = teamd $(DOCKER_TEAMD)_WARM_SHUTDOWN_BEFORE = syncd $(DOCKER_TEAMD)_WARM_SHUTDOWN_AFTER = swss -$(DOCKER_TEAMD)_FAST_SHUTDOWN_BEFORE = swss +$(DOCKER_TEAMD)_FAST_SHUTDOWN_BEFORE = syncd +$(DOCKER_TEAMD)_FAST_SHUTDOWN_AFTER = swss SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEAMD) From cf7a8f8c69b6d5472af33ef174b13faca18297c3 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:49:17 +0800 Subject: [PATCH 560/817] Update submodule for sonic-host-services (#11446) Why I did it Enable UT code coverage in sonic-buildimage repo submodule and enable LGTM How I did it create separate repo for sonic-host-services in sonic-net, and update submodule for sonic-buildimage How to verify it Build image --- .gitmodules | 3 + src/sonic-host-services | 1 + src/sonic-host-services/.gitignore | 22 - src/sonic-host-services/__init__.py | 0 .../host_modules/host_service.py | 34 - .../host_modules/showtech.py | 50 - src/sonic-host-services/pytest.ini | 2 - src/sonic-host-services/scripts/aaastatsd | 222 --- src/sonic-host-services/scripts/caclmgrd | 900 ---------- .../scripts/determine-reboot-cause | 228 --- src/sonic-host-services/scripts/hostcfgd | 1471 ----------------- .../scripts/procdockerstatsd | 200 --- .../scripts/process-reboot-cause | 100 -- .../scripts/sonic-host-server | 88 - src/sonic-host-services/setup.cfg | 2 - src/sonic-host-services/setup.py | 57 - src/sonic-host-services/tests/__init__.py | 0 .../tests/caclmgrd/__init__.py | 0 .../tests/caclmgrd/caclmgrd_bfd_test.py | 50 - .../tests/caclmgrd/caclmgrd_dhcp_test.py | 53 - .../tests/caclmgrd/caclmgrd_feature_test.py | 50 - .../tests/caclmgrd/test_bfd_vectors.py | 35 - .../tests/caclmgrd/test_dhcp_vectors.py | 340 ---- .../tests/common/mock_configdb.py | 58 - .../tests/determine-reboot-cause_test.py | 119 -- .../tests/hostcfgd/__init__.py | 0 .../tests/hostcfgd/hostcfgd_passwh_test.py | 182 -- .../tests/hostcfgd/hostcfgd_radius_test.py | 103 -- .../tests/hostcfgd/hostcfgd_tacacs_test.py | 116 -- .../tests/hostcfgd/hostcfgd_test.py | 359 ---- .../tests/hostcfgd/output/.gitignore | 4 - .../sample_output/LOCAL/common-auth-sonic | 21 - .../tests/hostcfgd/sample_output/LOCAL/login | 116 -- .../hostcfgd/sample_output/LOCAL/login.old | 116 -- .../sample_output/LOCAL/radius_nss.conf | 56 - .../tests/hostcfgd/sample_output/LOCAL/sshd | 55 - .../hostcfgd/sample_output/LOCAL/sshd.old | 55 - .../sample_output/LOCAL/tacplus_nss.conf | 40 - .../PASSWORD_HARDENING/login.defs.old | 340 ---- .../common-password | 36 - .../login.defs | 340 ---- .../common-password | 39 - .../login.defs | 340 ---- .../common-password | 39 - .../login.defs | 340 ---- .../sample_output/RADIUS/10.10.10.1_1645.conf | 2 - .../sample_output/RADIUS/10.10.10.2_1645.conf | 2 - .../sample_output/RADIUS/common-auth-sonic | 30 - .../tests/hostcfgd/sample_output/RADIUS/login | 116 -- .../hostcfgd/sample_output/RADIUS/login.old | 116 -- .../sample_output/RADIUS/radius_nss.conf | 56 - .../tests/hostcfgd/sample_output/RADIUS/sshd | 55 - .../hostcfgd/sample_output/RADIUS/sshd.old | 55 - .../sample_output/RADIUS/tacplus_nss.conf | 40 - .../common-auth-sonic | 21 - .../TACACS_config_db_disable_accounting/login | 116 -- .../login.old | 116 -- .../radius_nss.conf | 55 - .../TACACS_config_db_disable_accounting/sshd | 55 - .../sshd.old | 55 - .../tacplus_nss.conf | 41 - .../TACACS_config_db_local/common-auth-sonic | 21 - .../TACACS_config_db_local/login | 116 -- .../TACACS_config_db_local/login.old | 116 -- .../TACACS_config_db_local/radius_nss.conf | 55 - .../sample_output/TACACS_config_db_local/sshd | 55 - .../TACACS_config_db_local/sshd.old | 55 - .../TACACS_config_db_local/tacplus_nss.conf | 42 - .../common-auth-sonic | 21 - .../TACACS_config_db_local_and_tacacs/login | 116 -- .../login.old | 116 -- .../radius_nss.conf | 55 - .../TACACS_config_db_local_and_tacacs/sshd | 55 - .../sshd.old | 55 - .../tacplus_nss.conf | 44 - .../TACACS_config_db_tacacs/common-auth-sonic | 21 - .../TACACS_config_db_tacacs/login | 116 -- .../TACACS_config_db_tacacs/login.old | 116 -- .../TACACS_config_db_tacacs/radius_nss.conf | 55 - .../TACACS_config_db_tacacs/sshd | 55 - .../TACACS_config_db_tacacs/sshd.old | 55 - .../TACACS_config_db_tacacs/tacplus_nss.conf | 42 - .../tests/hostcfgd/test_passwh_vectors.py | 244 --- .../tests/hostcfgd/test_radius_vectors.py | 181 -- .../tests/hostcfgd/test_tacacs_vectors.py | 260 --- .../tests/hostcfgd/test_vectors.py | 567 ------- .../tests/mock_connector.py | 24 - .../tests/procdockerstatsd_test.py | 43 - 88 files changed, 4 insertions(+), 10410 deletions(-) create mode 160000 src/sonic-host-services delete mode 100644 src/sonic-host-services/.gitignore delete mode 100644 src/sonic-host-services/__init__.py delete mode 100644 src/sonic-host-services/host_modules/host_service.py delete mode 100644 src/sonic-host-services/host_modules/showtech.py delete mode 100644 src/sonic-host-services/pytest.ini delete mode 100755 src/sonic-host-services/scripts/aaastatsd delete mode 100755 src/sonic-host-services/scripts/caclmgrd delete mode 100755 src/sonic-host-services/scripts/determine-reboot-cause delete mode 100755 src/sonic-host-services/scripts/hostcfgd delete mode 100755 src/sonic-host-services/scripts/procdockerstatsd delete mode 100755 src/sonic-host-services/scripts/process-reboot-cause delete mode 100755 src/sonic-host-services/scripts/sonic-host-server delete mode 100644 src/sonic-host-services/setup.cfg delete mode 100644 src/sonic-host-services/setup.py delete mode 100644 src/sonic-host-services/tests/__init__.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/__init__.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py delete mode 100644 src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py delete mode 100644 src/sonic-host-services/tests/common/mock_configdb.py delete mode 100644 src/sonic-host-services/tests/determine-reboot-cause_test.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/__init__.py delete mode 100755 src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/output/.gitignore delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.1_1645.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.2_1645.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/common-auth-sonic delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/radius_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd.old delete mode 100644 src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/tacplus_nss.conf delete mode 100644 src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/test_radius_vectors.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/test_tacacs_vectors.py delete mode 100644 src/sonic-host-services/tests/hostcfgd/test_vectors.py delete mode 100644 src/sonic-host-services/tests/mock_connector.py delete mode 100644 src/sonic-host-services/tests/procdockerstatsd_test.py diff --git a/.gitmodules b/.gitmodules index 0b0b1aa87ce3..c8bbca863dce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -109,3 +109,6 @@ [submodule "src/dhcprelay"] path = src/dhcprelay url = https://github.com/sonic-net/sonic-dhcp-relay.git +[submodule "src/sonic-host-services"] + path = src/sonic-host-services + url = https://github.com/sonic-net/sonic-host-services diff --git a/src/sonic-host-services b/src/sonic-host-services new file mode 160000 index 000000000000..709046bbec9d --- /dev/null +++ b/src/sonic-host-services @@ -0,0 +1 @@ +Subproject commit 709046bbec9d05c9bf06e7c54a23ae0f9c970281 diff --git a/src/sonic-host-services/.gitignore b/src/sonic-host-services/.gitignore deleted file mode 100644 index e807a5b8f7ed..000000000000 --- a/src/sonic-host-services/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled Python files -*.pyc -scripts/caclmgrdc -scripts/hostcfgdc -scripts/aaastatsdc -scripts/procdockerstatsdc - -# Generated by packaging -*.egg-info/ -.eggs/ -build/ -dist/ - -# Unit test coverage -.coverage -.pytest_cache/ -coverage.xml -htmlcov/ -test-results.xml - -# Unit test scratchpad -tests/hostcfgd/output/* diff --git a/src/sonic-host-services/__init__.py b/src/sonic-host-services/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/src/sonic-host-services/host_modules/host_service.py b/src/sonic-host-services/host_modules/host_service.py deleted file mode 100644 index 48f55ae0623c..000000000000 --- a/src/sonic-host-services/host_modules/host_service.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Base class for host modules""" - -import dbus.service -import dbus - -BUS_NAME_BASE = 'org.SONiC.HostService' -BUS_PATH = '/org/SONiC/HostService' - -def bus_name(mod_name): - """Return the bus name for the service""" - return BUS_NAME_BASE + '.' + mod_name - -def bus_path(mod_name): - """Return the bus path for the service""" - return BUS_PATH + '/' + mod_name - -method = dbus.service.method - -class HostService(dbus.service.Object): - """Service class for top level DBus endpoint""" - def __init__(self, mod_name): - self.bus = dbus.SystemBus() - self.bus_name = dbus.service.BusName(BUS_NAME_BASE, self.bus) - super(HostService, self).__init__(self.bus_name, BUS_PATH) - -class HostModule(dbus.service.Object): - """Base class for all host modules""" - def __init__(self, mod_name): - self.bus = dbus.SystemBus() - self.bus_name = dbus.service.BusName(bus_name(mod_name), self.bus) - super(HostModule, self).__init__(self.bus_name, bus_path(mod_name)) - -def register(): - return HostService, "host_service" diff --git a/src/sonic-host-services/host_modules/showtech.py b/src/sonic-host-services/host_modules/showtech.py deleted file mode 100644 index 2b603d4f52d3..000000000000 --- a/src/sonic-host-services/host_modules/showtech.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Show techsupport command handler""" - -import host_service -import subprocess -import re - -MOD_NAME = 'showtech' - -class Showtech(host_service.HostModule): - """DBus endpoint that executes the "show techsupport" command - """ - @host_service.method(host_service.bus_name(MOD_NAME), in_signature='s', out_signature='is') - def info(self, date): - - ERROR_TAR_FAILED = 5 - ERROR_PROCFS_SAVE_FAILED = 6 - ERROR_INVALID_ARGUMENT = 10 - - err_dict = {ERROR_INVALID_ARGUMENT: 'Invalid input: Incorrect DateTime format', - ERROR_TAR_FAILED: 'Failure saving information into compressed output file', - ERROR_PROCFS_SAVE_FAILED: 'Saving of process information failed'} - - cmd = ['/usr/local/bin/generate_dump'] - if date: - cmd.append("-s") - cmd.append(date) - - try: - result = subprocess.run(cmd, capture_output=True, text=True, - check=True) - - except subprocess.CalledProcessError as err: - errmsg = err_dict.get(err.returncode) - - if errmsg is None: - output = 'Error: Failure code {:-5}'.format(err.returncode) - else: - output = errmsg - - print("%Error: Host side: Failed: " + str(err.returncode)) - return err.returncode, output - - output_file_match = re.search('\/var\/.*dump.*\.gz', result.stdout) - output_filename = output_file_match.group() - return result.returncode, output_filename - -def register(): - """Return the class name""" - return Showtech, MOD_NAME - diff --git a/src/sonic-host-services/pytest.ini b/src/sonic-host-services/pytest.ini deleted file mode 100644 index c4b03d4c3455..000000000000 --- a/src/sonic-host-services/pytest.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pytest] -addopts = --cov=scripts --cov-report html --cov-report term --cov-report xml --ignore=tests/*/test*_vectors.py diff --git a/src/sonic-host-services/scripts/aaastatsd b/src/sonic-host-services/scripts/aaastatsd deleted file mode 100755 index 2cc8f027e573..000000000000 --- a/src/sonic-host-services/scripts/aaastatsd +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env python3 -# - -import os -import syslog -import threading -from swsscommon.swsscommon import ConfigDBConnector -from watchdog.observers import Observer -from watchdog.events import FileSystemEventHandler - -# FILE -RADIUS_PAM_AUTH_CONF_DIR = "/etc/pam_radius_auth.d/" -RADIUS_PAM_AUTH_CONF_STATS_DIR = "/etc/pam_radius_auth.d/statistics/" - -class RadiusCountersDbMon (threading.Thread): - def __init__(self, ID, name, radiusStatsInstance): - threading.Thread.__init__(self) - self.ID = ID - self.name = name - self.radiusStatsInstance = radiusStatsInstance - - def handle_CountersDbRadiusClear(self, key, data): - # print("RadiusCountersDbMon.handle_CountersDbRadiusClear()") - if key == 'clear': - self.radiusStatsInstance.handle_clear() - - def run(self): - # print("RadiusCountersDbMon.run()") - self.radiusStatsInstance.counters_db.subscribe('RADIUS', lambda table, key, data: self.handle_CountersDbRadiusClear(key, data)) - self.radiusStatsInstance.counters_db.listen() - # print("RadiusCountersDbMon.run(): After listen()") - - -class RadiusStatsFileHandler(FileSystemEventHandler): - def __init__(self, radiusStatsInstance): - self.radiusStatsInstance = radiusStatsInstance - - def on_any_event(self, event): - # print("RadiusStatsFileHandler.on_any_event()") - if event.is_directory: - return None - - self.radiusStatsInstance.handle_update(os.path.basename(event.src_path)) - -class RadiusStatsFileMon (): - def __init__(self, radiusStatsInstance): - self.event_handler = RadiusStatsFileHandler(radiusStatsInstance) - self.observer = Observer() - self.observer.schedule(self.event_handler, RADIUS_PAM_AUTH_CONF_STATS_DIR, recursive=False) - self.observer.start() - # print("RadiusStatsFileMon.__init__(): After observer.start()") - - def stop(self): - # print("RadiusStatsFileMon.stop()") - self.observer.stop() - # print("RadiusStatsFileMon.stop(): After observer.stop()") - self.observer.join() - # print("RadiusStatsFileMon.stop(): After observer.join()") - - -class RadiusStatistics: - def __init__(self, cfg_db, rad_global_conf, radius_conf): - - self.radius_counter_names = [ - "counter_0", - "access_requests", - "access_accepts", - "access_rejects", - "accounting_requests", - "accounting_responses", - "counter_6", - "counter_7", - "counter_8", - "counter_9", - "counter_10", - "access_challenges", - "counter_12", - "counter_13", - "counter_14", - "counter_15", - "counter_16", - "retried_access_requests", - "counter_18", - "counter_19", - "retried_accounting_requests", - "counter_21", - "counter_22", - "counter_23", - "counter_24", - "counter_25", - "counter_26", - "retried_access_challenges", - "counter_28", - "counter_29", - "counter_30", - "counter_31", - "timeouts", - "bad_authenticators", - "invalid_packets", - "counter_35", - ] - - self.radius_global = { - 'statistics': 'False' - } - - self.radius_servers = {} - - self.config_db = cfg_db - - for row in rad_global_conf: - self.radius_global_update(row, rad_global_conf[row]) - - for row in radius_conf: - self.radius_server_update(row, radius_conf[row]) - - - self.counters_db = ConfigDBConnector() - self.counters_db.db_connect('COUNTERS_DB', wait_for_init=False, - retry_on=True) - syslog.syslog(syslog.LOG_INFO, 'CountersDB connect success') - self.dbmon_thread = RadiusCountersDbMon("RadiusCountersDbMon", - "RadiusCountersDbMon", self) - self.dbmon_thread.daemon = True - self.dbmon_thread.start() - - self.filemon = RadiusStatsFileMon(self) - syslog.syslog(syslog.LOG_INFO, 'RADIUS Stats File Monitor started') - - def radius_global_update(self, key, data): - if key == 'global': - self.radius_global.update(data) - - for addr in self.radius_servers: - self.create_file(addr) - - def radius_server_update(self, key, data): - if data == {}: - if key in self.radius_servers: - del self.radius_servers[key] - else: - self.radius_servers[key] = data - - self.create_file(key) - - def create_file(self, addr): - # print( "RadiusStatistics.create_file({})".format(addr)) - stats_file = RADIUS_PAM_AUTH_CONF_STATS_DIR + addr - if self.radius_global['statistics'] == 'False': - if os.path.exists(stats_file): - os.unlink(stats_file) - else: - open(stats_file, 'a').close() - os.chmod(stats_file, 0o666) - self.handle_update(addr) - - def handle_clear(self): - # print( "RadiusStatistics.handle_clear()") - for filename in os.listdir(RADIUS_PAM_AUTH_CONF_STATS_DIR): - stats_file = RADIUS_PAM_AUTH_CONF_STATS_DIR + filename - open(stats_file, 'w').close() - - def handle_update(self, srv): - # print( "RadiusStatistics.handle_update({})".format(srv)) - if self.radius_global['statistics'] == 'False': - return - - stats_file = RADIUS_PAM_AUTH_CONF_STATS_DIR + srv - entry = None - if os.path.exists(stats_file): - with open(stats_file, 'r') as f: - lines = f.readlines() - if len(lines) > 0: - radius_counters = lines[0].split(' ') - entry = dict(zip(self.radius_counter_names, radius_counters)) - - counters_db = ConfigDBConnector() - counters_db.db_connect('COUNTERS_DB', wait_for_init=False, - retry_on=False) - - counters_db.set_entry('RADIUS_SERVER_STATS', srv, entry) - - counters_db.close(counters_db.COUNTERS_DB) - -class AAAStatsDaemon: - def __init__(self): - self.config_db = ConfigDBConnector() - self.config_db.connect(wait_for_init=True, retry_on=True) - syslog.syslog(syslog.LOG_INFO, 'ConfigDB connect success') - - radius_global = self.config_db.get_table('RADIUS') - radius_server = self.config_db.get_table('RADIUS_SERVER') - - self.radiusstats = RadiusStatistics(self.config_db, radius_global, - radius_server) - - def radius_global_handler(self, key, data): - self.radiusstats.radius_global_update(key, data) - - def radius_server_handler(self, key, data): - self.radiusstats.radius_server_update(key, data) - - def start(self): - self.config_db.subscribe('RADIUS_SERVER', - lambda table, key, data: self.radius_server_handler(key, data)) - self.config_db.subscribe('RADIUS', - lambda table, key, data: self.radius_global_handler(key, data)) - self.config_db.listen() - # print( "After config_db.listen()") - syslog.syslog(syslog.LOG_INFO, 'Stopping FileMon') - self.radiusstats.filemon.stop() - # print( "Exiting") - syslog.syslog(syslog.LOG_INFO, 'Exiting') - -def main(): - daemon = AAAStatsDaemon() - daemon.start() - - -if __name__ == "__main__": - main() - diff --git a/src/sonic-host-services/scripts/caclmgrd b/src/sonic-host-services/scripts/caclmgrd deleted file mode 100755 index 4af588e28de6..000000000000 --- a/src/sonic-host-services/scripts/caclmgrd +++ /dev/null @@ -1,900 +0,0 @@ -#!/usr/bin/env python3 -# -# caclmgrd -# -# Control plane ACL manager daemon for SONiC -# -# Upon starting, this daemon reads control plane ACL tables and rules from -# Config DB, converts the rules into iptables rules and installs the iptables -# rules. The daemon then indefintely listens for notifications from Config DB -# and updates iptables rules if control plane ACL configuration has changed. -# - -try: - import ipaddress - import os - import subprocess - import sys - import threading - import time - - from sonic_py_common import daemon_base, device_info, multi_asic - from swsscommon import swsscommon -except ImportError as err: - raise ImportError("%s - required module not found" % str(err)) - -VERSION = "1.0" - -SYSLOG_IDENTIFIER = "caclmgrd" - -DEFAULT_NAMESPACE = '' - - -# ========================== Helper Functions ========================= - - -def _ip_prefix_in_key(key): - """ - Function to check if IP prefix is present in a Redis database key. - If it is present, then the key will be a tuple. Otherwise, the - key will be a string. - """ - return (isinstance(key, tuple)) - -# ============================== Classes ============================== - - -class ControlPlaneAclManager(daemon_base.DaemonBase): - """ - Class which reads control plane ACL tables and rules from Config DB, - translates them into equivalent iptables commands and runs those - commands in order to apply the control plane ACLs. - Attributes: - config_db: Handle to Config Redis database via SwSS SDK - """ - FEATURE_TABLE = "FEATURE" - ACL_TABLE = "ACL_TABLE" - ACL_RULE = "ACL_RULE" - DEVICE_METADATA_TABLE = "DEVICE_METADATA" - MUX_CABLE_TABLE = "MUX_CABLE_TABLE" - - ACL_TABLE_TYPE_CTRLPLANE = "CTRLPLANE" - - BFD_SESSION_TABLE = "BFD_SESSION_TABLE" - - # To specify a port range instead of a single port, use iptables format: - # separate start and end ports with a colon, e.g., "1000:2000" - ACL_SERVICES = { - "NTP": { - "ip_protocols": ["udp"], - "dst_ports": ["123"], - "multi_asic_ns_to_host_fwd":False - }, - "SNMP": { - "ip_protocols": ["tcp", "udp"], - "dst_ports": ["161"], - "multi_asic_ns_to_host_fwd":True - }, - "SSH": { - "ip_protocols": ["tcp"], - "dst_ports": ["22"], - "multi_asic_ns_to_host_fwd":True - }, - "ANY": { - "ip_protocols": ["any"], - "dst_ports": ["0"], - "multi_asic_ns_to_host_fwd":False - } - } - - UPDATE_DELAY_SECS = 0.5 - - DualToR = False - bfdAllowed = False - - def __init__(self, log_identifier): - super(ControlPlaneAclManager, self).__init__(log_identifier) - - # Update-thread-specific data per namespace - self.update_thread = {} - self.lock = {} - self.num_changes = {} - - # Initialize update-thread-specific data for default namespace - self.update_thread[DEFAULT_NAMESPACE] = None - self.lock[DEFAULT_NAMESPACE] = threading.Lock() - self.num_changes[DEFAULT_NAMESPACE] = 0 - - if device_info.is_multi_npu(): - swsscommon.SonicDBConfig.load_sonic_global_db_config() - - self.config_db_map = {} - self.iptables_cmd_ns_prefix = {} - self.config_db_map[DEFAULT_NAMESPACE] = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=DEFAULT_NAMESPACE) - self.config_db_map[DEFAULT_NAMESPACE].connect() - self.iptables_cmd_ns_prefix[DEFAULT_NAMESPACE] = "" - self.namespace_mgmt_ip = self.get_namespace_mgmt_ip(self.iptables_cmd_ns_prefix[DEFAULT_NAMESPACE], DEFAULT_NAMESPACE) - self.namespace_mgmt_ipv6 = self.get_namespace_mgmt_ipv6(self.iptables_cmd_ns_prefix[DEFAULT_NAMESPACE], DEFAULT_NAMESPACE) - self.namespace_docker_mgmt_ip = {} - self.namespace_docker_mgmt_ipv6 = {} - - # Get all features that are present {feature_name : True/False} - self.feature_present = {} - self.update_feature_present() - - metadata = self.config_db_map[DEFAULT_NAMESPACE].get_table(self.DEVICE_METADATA_TABLE) - if 'subtype' in metadata['localhost'] and metadata['localhost']['subtype'] == 'DualToR': - self.DualToR = True - - namespaces = multi_asic.get_all_namespaces() - - for front_asic_namespace in namespaces['front_ns']: - self.update_thread[front_asic_namespace] = None - self.lock[front_asic_namespace] = threading.Lock() - self.num_changes[front_asic_namespace] = 0 - - self.config_db_map[front_asic_namespace] = swsscommon.ConfigDBConnector(use_unix_socket_path=True, namespace=front_asic_namespace) - self.config_db_map[front_asic_namespace].connect() - self.iptables_cmd_ns_prefix[front_asic_namespace] = "ip netns exec " + front_asic_namespace + " " - self.namespace_docker_mgmt_ip[front_asic_namespace] = self.get_namespace_mgmt_ip(self.iptables_cmd_ns_prefix[front_asic_namespace], - front_asic_namespace) - self.namespace_docker_mgmt_ipv6[front_asic_namespace] = self.get_namespace_mgmt_ipv6(self.iptables_cmd_ns_prefix[front_asic_namespace], - front_asic_namespace) - - for back_asic_namespace in namespaces['back_ns']: - self.update_thread[back_asic_namespace] = None - self.lock[back_asic_namespace] = threading.Lock() - self.num_changes[back_asic_namespace] = 0 - - self.iptables_cmd_ns_prefix[back_asic_namespace] = "ip netns exec " + back_asic_namespace + " " - self.namespace_docker_mgmt_ip[back_asic_namespace] = self.get_namespace_mgmt_ip(self.iptables_cmd_ns_prefix[back_asic_namespace], - back_asic_namespace) - self.namespace_docker_mgmt_ipv6[back_asic_namespace] = self.get_namespace_mgmt_ipv6(self.iptables_cmd_ns_prefix[back_asic_namespace], - back_asic_namespace) - - def get_namespace_mgmt_ip(self, iptable_ns_cmd_prefix, namespace): - ip_address_get_command = iptable_ns_cmd_prefix + "ip -4 -o addr show " + ("eth0" if namespace else "docker0") +\ - " | awk '{print $4}' | cut -d'/' -f1 | head -1" - - return self.run_commands([ip_address_get_command]) - - def get_namespace_mgmt_ipv6(self, iptable_ns_cmd_prefix, namespace): - ipv6_address_get_command = iptable_ns_cmd_prefix + "ip -6 -o addr show scope global " + ("eth0" if namespace else "docker0") +\ - " | awk '{print $4}' | cut -d'/' -f1 | head -1" - return self.run_commands([ipv6_address_get_command]) - - def run_commands(self, commands): - """ - Given a list of shell commands, run them in order - Args: - commands: List of strings, each string is a shell command - """ - for cmd in commands: - proc = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE) - - (stdout, stderr) = proc.communicate() - - if proc.returncode != 0: - self.log_error("Error running command '{}'".format(cmd)) - elif stdout: - return stdout.rstrip('\n') - return "" - - def parse_int_to_tcp_flags(self, hex_value): - tcp_flags_str = "" - if hex_value & 0x01: - tcp_flags_str += "FIN," - if hex_value & 0x02: - tcp_flags_str += "SYN," - if hex_value & 0x04: - tcp_flags_str += "RST," - if hex_value & 0x08: - tcp_flags_str += "PSH," - if hex_value & 0x10: - tcp_flags_str += "ACK," - if hex_value & 0x20: - tcp_flags_str += "URG," - # iptables doesn't handle the flags below now. It has some special keys for it: - # --ecn-tcp-cwr This matches if the TCP ECN CWR (Congestion Window Received) bit is set. - # --ecn-tcp-ece This matches if the TCP ECN ECE (ECN Echo) bit is set. - # if hex_value & 0x40: - # tcp_flags_str += "ECE," - # if hex_value & 0x80: - # tcp_flags_str += "CWR," - - # Delete the trailing comma - tcp_flags_str = tcp_flags_str[:-1] - return tcp_flags_str - - def update_feature_present(self): - feature_tb_info = self.config_db_map[DEFAULT_NAMESPACE].get_table(self.FEATURE_TABLE) - if feature_tb_info: - for k, v in feature_tb_info.items(): - self.feature_present[k] = True - - def generate_block_ip2me_traffic_iptables_commands(self, namespace): - INTERFACE_TABLE_NAME_LIST = [ - "LOOPBACK_INTERFACE", - "MGMT_INTERFACE", - "VLAN_INTERFACE", - "PORTCHANNEL_INTERFACE", - "INTERFACE" - ] - - block_ip2me_cmds = [] - - # Add iptables rules to drop all packets destined for peer-to-peer interface IP addresses - for iface_table_name in INTERFACE_TABLE_NAME_LIST: - iface_table = self.config_db_map[namespace].get_table(iface_table_name) - if iface_table: - for key, _ in iface_table.items(): - if not _ip_prefix_in_key(key): - continue - - iface_name, iface_cidr = key - ip_ntwrk = ipaddress.ip_network(iface_cidr, strict=False) - - # For VLAN interfaces, the IP address we want to block is the default gateway (i.e., - # the first available host IP address of the VLAN subnet) - ip_addr = next(ip_ntwrk.hosts()) if iface_table_name == "VLAN_INTERFACE" else ip_ntwrk.network_address - - if isinstance(ip_ntwrk, ipaddress.IPv4Network): - block_ip2me_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -d {}/{} -j DROP".format(ip_addr, ip_ntwrk.max_prefixlen)) - elif isinstance(ip_ntwrk, ipaddress.IPv6Network): - block_ip2me_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -d {}/{} -j DROP".format(ip_addr, ip_ntwrk.max_prefixlen)) - else: - self.log_warning("Unrecognized IP address type on interface '{}': {}".format(iface_name, ip_ntwrk)) - - return block_ip2me_cmds - - def generate_allow_internal_docker_ip_traffic_commands(self, namespace): - allow_internal_docker_ip_cmds = [] - - if namespace: - # For namespace docker allow local communication on docker management ip for all proto - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_docker_mgmt_ip[namespace], self.namespace_docker_mgmt_ip[namespace])) - - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_docker_mgmt_ipv6[namespace], self.namespace_docker_mgmt_ipv6[namespace])) - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_mgmt_ip, self.namespace_docker_mgmt_ip[namespace])) - - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_mgmt_ipv6, self.namespace_docker_mgmt_ipv6[namespace])) - - else: - - # Also host namespace communication on docker bridge on multi-asic. - if self.namespace_docker_mgmt_ip: - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_mgmt_ip, self.namespace_mgmt_ip)) - - if self.namespace_docker_mgmt_ipv6: - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -s {} -d {} -j ACCEPT".format - (self.namespace_mgmt_ipv6, self.namespace_mgmt_ipv6)) - # In host allow all tcp/udp traffic from namespace docker eth0 management ip to host docker bridge - for docker_mgmt_ip in list(self.namespace_docker_mgmt_ip.values()): - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -s {} -d {} -j ACCEPT".format - (docker_mgmt_ip, self.namespace_mgmt_ip)) - - for docker_mgmt_ipv6 in list(self.namespace_docker_mgmt_ipv6.values()): - allow_internal_docker_ip_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -s {} -d {} -j ACCEPT".format - (docker_mgmt_ipv6, self.namespace_mgmt_ipv6)) - - return allow_internal_docker_ip_cmds - - def generate_fwd_traffic_from_namespace_to_host_commands(self, namespace, acl_source_ip_map): - """ - The below SNAT and DNAT rules are added in asic namespace in multi-ASIC platforms. It helps to forward request coming - in through the front panel interfaces created/present in the asic namespace for the servie running in linux host network namespace. - The external IP addresses are NATed to the internal docker IP addresses for the Host service to respond. - """ - - if not namespace: - return [] - - fwd_traffic_from_namespace_to_host_cmds = [] - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -t nat -X") - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -t nat -F") - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -t nat -X") - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -t nat -F") - - for acl_service in self.ACL_SERVICES: - if self.ACL_SERVICES[acl_service]["multi_asic_ns_to_host_fwd"]: - # Get the Source IP Set if exists else use default source ip prefix - nat_source_ipv4_set = acl_source_ip_map[acl_service]["ipv4"] if acl_source_ip_map and acl_source_ip_map[acl_service]["ipv4"] else { "0.0.0.0/0" } - nat_source_ipv6_set = acl_source_ip_map[acl_service]["ipv6"] if acl_source_ip_map and acl_source_ip_map[acl_service]["ipv6"] else { "::/0" } - - for ip_protocol in self.ACL_SERVICES[acl_service]["ip_protocols"]: - for dst_port in self.ACL_SERVICES[acl_service]["dst_ports"]: - for ipv4_src_ip in nat_source_ipv4_set: - # IPv4 rules - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + - "iptables -t nat -A PREROUTING -p {} -s {} --dport {} -j DNAT --to-destination {}".format - (ip_protocol, ipv4_src_ip, dst_port, - self.namespace_mgmt_ip)) - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + - "iptables -t nat -A POSTROUTING -p {} -s {} --dport {} -j SNAT --to-source {}".format - (ip_protocol, ipv4_src_ip, dst_port, - self.namespace_docker_mgmt_ip[namespace])) - for ipv6_src_ip in nat_source_ipv6_set: - # IPv6 rules - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + - "ip6tables -t nat -A PREROUTING -p {} -s {} --dport {} -j DNAT --to-destination {}".format - (ip_protocol, ipv6_src_ip, dst_port, - self.namespace_mgmt_ipv6)) - fwd_traffic_from_namespace_to_host_cmds.append(self.iptables_cmd_ns_prefix[namespace] + - "ip6tables -t nat -A POSTROUTING -p {} -s {} --dport {} -j SNAT --to-source {}".format - (ip_protocol,ipv6_src_ip, dst_port, - self.namespace_docker_mgmt_ipv6[namespace])) - - return fwd_traffic_from_namespace_to_host_cmds - - def is_rule_ipv4(self, rule_props): - if (("SRC_IP" in rule_props and rule_props["SRC_IP"]) or - ("DST_IP" in rule_props and rule_props["DST_IP"])): - return True - else: - return False - - def is_rule_ipv6(self, rule_props): - if (("SRC_IPV6" in rule_props and rule_props["SRC_IPV6"]) or - ("DST_IPV6" in rule_props and rule_props["DST_IPV6"])): - return True - else: - return False - - def setup_dhcp_chain(self, namespace): - all_chains = self.get_chain_list(self.iptables_cmd_ns_prefix[namespace], [""]) - dhcp_chain_exist = "DHCP" in all_chains - - iptables_cmds = [] - if dhcp_chain_exist: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -F DHCP") - self.log_info("DHCP chain exists, flush") - else: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -N DHCP") - self.log_info("DHCP chain does not exist, create") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A DHCP -j RETURN") - - self.log_info("Issuing the following iptables commands for DHCP chain:") - for cmd in iptables_cmds: - self.log_info(" " + cmd) - - self.run_commands(iptables_cmds) - - def get_chain_list(self, iptable_ns_cmd_prefix, exclude_list): - command = iptable_ns_cmd_prefix + "iptables -L -v -n | grep Chain | awk '{print $2}'" - chain_list = self.run_commands([command]).splitlines() - - for chain in exclude_list: - if chain in chain_list: - chain_list.remove(chain) - - return chain_list - - def dhcp_acl_rule(self, iptable_ns_cmd_prefix, op, intf, mark): - ''' - sample: iptables --insert/delete/check DHCP -m physdev --physdev-in Ethernet4 -j DROP - sample: iptables --insert/delete/check DHCP -m mark --mark 0x67004 -j DROP - ''' - if mark is None: - return iptable_ns_cmd_prefix + 'iptables --{} DHCP -m physdev --physdev-in {} -j DROP'.format(op, intf) - else: - return iptable_ns_cmd_prefix + 'iptables --{} DHCP -m mark --mark {} -j DROP'.format(op, mark) - - def update_dhcp_chain(self, op, intf, mark): - for namespace in list(self.config_db_map.keys()): - check_cmd = self.dhcp_acl_rule(self.iptables_cmd_ns_prefix[namespace], "check", intf, mark) - update_cmd = self.dhcp_acl_rule(self.iptables_cmd_ns_prefix[namespace], op, intf, mark) - - execute = 0 - ret = subprocess.call(check_cmd, shell=True) # ret==0 indicates the rule exists - - if op == "insert" and ret == 1: - execute = 1 - if op == "delete" and ret == 0: - execute = 1 - - if execute == 1: - subprocess.call(update_cmd, shell=True) - self.log_info("Update DHCP chain: {}".format(update_cmd)) - - def update_dhcp_acl(self, key, op, data, mark): - if "state" not in data: - self.log_warning("Unexpected update in MUX_CABLE_TABLE") - return - - intf = key - state = data["state"] - - if state == "active": - self.update_dhcp_chain("delete", intf, mark) - elif state == "standby": - self.update_dhcp_chain("insert", intf, mark) - elif state == "unknown": - self.update_dhcp_chain("delete", intf, mark) - elif state == "error": - self.log_warning("Cable state shows error") - else: - self.log_warning("Unexpected cable state") - - def update_dhcp_acl_for_mark_change(self, key, pre_mark, cur_mark): - for namespace in list(self.config_db_map.keys()): - check_cmd = self.dhcp_acl_rule(self.iptables_cmd_ns_prefix[namespace], "check", key, pre_mark) - - ret = subprocess.call(check_cmd, shell=True) # ret==0 indicates the rule exists - - '''update only when the rule with pre_mark exists''' - if ret == 0: - delete_cmd = self.dhcp_acl_rule(self.iptables_cmd_ns_prefix[namespace], "delete", key, pre_mark) - insert_cmd = self.dhcp_acl_rule(self.iptables_cmd_ns_prefix[namespace], "insert", key, cur_mark) - - subprocess.call(delete_cmd, shell=True) - self.log_info("Update DHCP chain: {}".format(delete_cmd)) - subprocess.call(insert_cmd, shell=True) - self.log_info("Update DHCP chain: {}".format(insert_cmd)) - - def get_acl_rules_and_translate_to_iptables_commands(self, namespace): - """ - Retrieves current ACL tables and rules from Config DB, translates - control plane ACLs into a list of iptables commands that can be run - in order to install ACL rules. - Returns: - A list of strings, each string is an iptables shell command - """ - iptables_cmds = [] - service_to_source_ip_map = {} - - # First, add iptables commands to set default policies to accept all - # traffic. In case we are connected remotely, the connection will not - # drop when we flush the current rules - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -P INPUT ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -P FORWARD ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -P OUTPUT ACCEPT") - - # Add iptables command to flush the current rules and delete all non-default chains - chain_list = self.get_chain_list(self.iptables_cmd_ns_prefix[namespace], ["DHCP"] if self.DualToR else [""]) - for chain in chain_list: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -F " + chain) - if chain not in ["INPUT", "FORWARD", "OUTPUT"]: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -X " + chain) - - # Add same set of commands for ip6tables - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -P INPUT ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -P FORWARD ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -P OUTPUT ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -F") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -X") - - # Add iptables/ip6tables commands to allow all traffic from localhost - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -s 127.0.0.1 -i lo -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -s ::1 -i lo -j ACCEPT") - - # Add iptables commands to allow internal docker traffic - iptables_cmds += self.generate_allow_internal_docker_ip_traffic_commands(namespace) - - # Add iptables/ip6tables commands to allow all incoming packets from established - # connections or new connections which are related to established connections - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT") - - # Add iptables/ip6tables commands to allow bidirectional ICMPv4 ping and traceroute - # TODO: Support processing ICMPv4 service ACL rules, and remove this blanket acceptance - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT") - - # Add iptables/ip6tables commands to allow bidirectional ICMPv6 ping and traceroute - # TODO: Support processing ICMPv6 service ACL rules, and remove this blanket acceptance - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT") - - # Add iptables/ip6tables commands to allow all incoming Neighbor Discovery Protocol (NDP) NS/NA/RS/RA messages - # TODO: Support processing NDP service ACL rules, and remove this blanket acceptance - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT") - - # Add iptables commands to link the DCHP chain to block dhcp packets based on ingress interfaces - if self.DualToR: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p udp --dport 67 -j DHCP") - - # Add iptables/ip6tables commands to allow all incoming IPv4 DHCP packets - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p udp --dport 67:68 -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p udp --dport 67:68 -j ACCEPT") - - # Add iptables/ip6tables commands to allow all incoming IPv6 DHCP packets - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p udp --dport 546:547 -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p udp --dport 546:547 -j ACCEPT") - - # Add iptables/ip6tables commands to allow all incoming BGP traffic - # TODO: Determine BGP ACLs based on configured device sessions, and remove this blanket acceptance - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -p tcp --dport 179 -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p tcp --dport 179 -j ACCEPT") - - # Get current ACL tables and rules from Config DB - self._tables_db_info = self.config_db_map[namespace].get_table(self.ACL_TABLE) - self._rules_db_info = self.config_db_map[namespace].get_table(self.ACL_RULE) - - num_ctrl_plane_acl_rules = 0 - - # Walk the ACL tables - for (table_name, table_data) in self._tables_db_info.items(): - - table_ip_version = None - - # Ignore non-control-plane ACL tables - if table_data["type"] != self.ACL_TABLE_TYPE_CTRLPLANE: - continue - - acl_services = table_data["services"] - - for acl_service in acl_services: - if acl_service not in self.ACL_SERVICES: - self.log_warning("Ignoring control plane ACL '{}' with unrecognized service '{}'" - .format(table_name, acl_service)) - continue - - self.log_info("Translating ACL rules for control plane ACL '{}' (service: '{}')" - .format(table_name, acl_service)) - - # Obtain default IP protocol(s) and destination port(s) for this service - ip_protocols = self.ACL_SERVICES[acl_service]["ip_protocols"] - dst_ports = self.ACL_SERVICES[acl_service]["dst_ports"] - - acl_rules = {} - - for ((rule_table_name, rule_id), rule_props) in self._rules_db_info.items(): - rule_props = {k.upper(): v for k,v in rule_props.items()} - if rule_table_name == table_name: - if not rule_props: - self.log_warning("rule_props for rule_id {} empty or null!".format(rule_id)) - continue - - try: - acl_rules[rule_props["PRIORITY"]] = rule_props - except KeyError: - self.log_error("rule_props for rule_id {} does not have key 'PRIORITY'!".format(rule_id)) - continue - - # If we haven't determined the IP version for this ACL table yet, - # try to do it now. We attempt to determine heuristically based on - # whether the src or dst IP of this rule is an IPv4 or IPv6 address. - if not table_ip_version: - if self.is_rule_ipv6(rule_props): - table_ip_version = 6 - elif self.is_rule_ipv4(rule_props): - table_ip_version = 4 - - if (self.is_rule_ipv6(rule_props) and (table_ip_version == 4)): - self.log_error("CtrlPlane ACL table {} is a IPv4 based table and rule {} is a IPV6 rule! Ignoring rule." - .format(table_name, rule_id)) - acl_rules.pop(rule_props["PRIORITY"]) - elif (self.is_rule_ipv4(rule_props) and (table_ip_version == 6)): - self.log_error("CtrlPlane ACL table {} is a IPv6 based table and rule {} is a IPV4 rule! Ignroing rule." - .format(table_name, rule_id)) - acl_rules.pop(rule_props["PRIORITY"]) - - # If we were unable to determine whether this ACL table contains - # IPv4 or IPv6 rules, log a message and skip processing this table. - if not table_ip_version: - self.log_warning("Unable to determine if ACL table '{}' contains IPv4 or IPv6 rules. Skipping table..." - .format(table_name)) - continue - ipv4_src_ip_set = set() - ipv6_src_ip_set = set() - # For each ACL rule in this table (in descending order of priority) - for priority in sorted(iter(acl_rules.keys()), reverse=True): - rule_props = acl_rules[priority] - - if "PACKET_ACTION" not in rule_props: - self.log_error("ACL rule does not contain PACKET_ACTION property") - continue - - # Apply the rule to the default protocol(s) for this ACL service - for ip_protocol in ip_protocols: - for dst_port in dst_ports: - rule_cmd = "ip6tables" if table_ip_version == 6 else "iptables" - - rule_cmd += " -A INPUT" - if ip_protocol != "any": - rule_cmd += " -p {}".format(ip_protocol) - - if "SRC_IPV6" in rule_props and rule_props["SRC_IPV6"]: - rule_cmd += " -s {}".format(rule_props["SRC_IPV6"]) - if rule_props["PACKET_ACTION"] == "ACCEPT": - ipv6_src_ip_set.add(rule_props["SRC_IPV6"]) - elif "SRC_IP" in rule_props and rule_props["SRC_IP"]: - rule_cmd += " -s {}".format(rule_props["SRC_IP"]) - if rule_props["PACKET_ACTION"] == "ACCEPT": - ipv4_src_ip_set.add(rule_props["SRC_IP"]) - - # Destination port 0 is reserved/unused port, so, using it to apply the rule to all ports. - if dst_port != "0": - rule_cmd += " --dport {}".format(dst_port) - - # If there are TCP flags present and ip protocol is TCP, append them - if ip_protocol == "tcp" and "TCP_FLAGS" in rule_props and rule_props["TCP_FLAGS"]: - tcp_flags, tcp_flags_mask = rule_props["TCP_FLAGS"].split("/") - - tcp_flags = int(tcp_flags, 16) - tcp_flags_mask = int(tcp_flags_mask, 16) - - if tcp_flags_mask > 0: - rule_cmd += " --tcp-flags {mask} {flags}".format(mask=self.parse_int_to_tcp_flags(tcp_flags_mask), flags=self.parse_int_to_tcp_flags(tcp_flags)) - - # Append the packet action as the jump target - rule_cmd += " -j {}".format(rule_props["PACKET_ACTION"]) - - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + rule_cmd) - num_ctrl_plane_acl_rules += 1 - - - service_to_source_ip_map.update({ acl_service:{ "ipv4":ipv4_src_ip_set, "ipv6":ipv6_src_ip_set } }) - - # Add iptables commands to block ip2me traffic - iptables_cmds += self.generate_block_ip2me_traffic_iptables_commands(namespace) - - # Add iptables/ip6tables commands to allow all incoming packets with TTL of 0 or 1 - # This allows the device to respond to tools like tcptraceroute - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -m ttl --ttl-lt 2 -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -p tcp -m hl --hl-lt 2 -j ACCEPT") - - # Finally, if the device has control plane ACLs configured, - # add iptables/ip6tables commands to drop all other incoming packets - if num_ctrl_plane_acl_rules > 0: - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -j DROP") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -A INPUT -j DROP") - - return iptables_cmds, service_to_source_ip_map - - def update_control_plane_acls(self, namespace): - """ - Convenience wrapper which retrieves current ACL tables and rules from - Config DB, translates control plane ACLs into a list of iptables - commands and runs them. - """ - iptables_cmds, service_to_source_ip_map = self.get_acl_rules_and_translate_to_iptables_commands(namespace) - self.log_info("Issuing the following iptables commands:") - for cmd in iptables_cmds: - self.log_info(" " + cmd) - - self.run_commands(iptables_cmds) - - self.update_control_plane_nat_acls(namespace, service_to_source_ip_map) - - def update_control_plane_nat_acls(self, namespace, service_to_source_ip_map): - """ - Convenience wrapper for multi-asic platforms - which programs the NAT rules for redirecting the - traffic coming on the front panel interface map to namespace - to the host. - """ - # Add iptables commands to allow front panel traffic - iptables_cmds = self.generate_fwd_traffic_from_namespace_to_host_commands(namespace, service_to_source_ip_map) - - self.log_info("Issuing the following iptables commands:") - for cmd in iptables_cmds: - self.log_info(" " + cmd) - - self.run_commands(iptables_cmds) - - def check_and_update_control_plane_acls(self, namespace, num_changes): - """ - This function is intended to be spawned in a separate thread. - Its purpose is to prevent unnecessary iptables updates if we receive - multiple rapid ACL table update notifications. It sleeps for UPDATE_DELAY_SECS - then checks if any more ACL table updates were received in that window. If new - updates were received, it will sleep again and repeat the process until no - updates were received during the delay window, at which point it will update - iptables using the current ACL rules. - """ - while True: - # Sleep for our delay interval - time.sleep(self.UPDATE_DELAY_SECS) - - with self.lock[namespace]: - if self.num_changes[namespace] > num_changes: - # More ACL table changes occurred since this thread was spawned - # spawn a new thread with the current number of changes - new_changes = self.num_changes[namespace] - num_changes - self.log_info("ACL config not stable for namespace '{}': {} changes detected in the past {} seconds. Skipping update ..." - .format(namespace, new_changes, self.UPDATE_DELAY_SECS)) - num_changes = self.num_changes[namespace] - else: - if num_changes == self.num_changes[namespace] and num_changes > 0: - self.log_info("ACL config for namespace '{}' has not changed for {} seconds. Applying updates ..." - .format(namespace, self.UPDATE_DELAY_SECS)) - self.update_control_plane_acls(namespace) - else: - self.log_error("Error updating ACLs for namespace '{}'".format(namespace)) - - # Re-initialize - self.num_changes[namespace] = 0 - self.update_thread[namespace] = None - return - - def allow_bfd_protocol(self, namespace): - iptables_cmds = [] - # Add iptables/ip6tables commands to allow all BFD singlehop and multihop sessions - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT") - iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "ip6tables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT") - self.run_commands(iptables_cmds) - - def run(self): - # Set select timeout to 1 second - SELECT_TIMEOUT_MS = 1000 - - self.log_info("Starting up ...") - - if not os.geteuid() == 0: - self.log_error("Must be root to run this daemon") - print("Error: Must be root to run this daemon") - sys.exit(1) - - # Initlaize Global config that loads all database*.json - if device_info.is_multi_npu(): - swsscommon.SonicDBConfig.initializeGlobalConfig() - - # Create the Select object - sel = swsscommon.Select() - - # Set up STATE_DB connector to monitor the change in MUX_CABLE_TABLE - state_db_connector = None - subscribe_mux_cable = None - subscribe_dhcp_packet_mark = None - state_db_id = swsscommon.SonicDBConfig.getDbId("STATE_DB") - dhcp_packet_mark_tbl = {} - - # set up state_db connector - state_db_connector = swsscommon.DBConnector("STATE_DB", 0) - - if self.DualToR: - self.log_info("Dual ToR mode") - - subscribe_mux_cable = swsscommon.SubscriberStateTable(state_db_connector, self.MUX_CABLE_TABLE) - sel.addSelectable(subscribe_mux_cable) - - subscribe_dhcp_packet_mark = swsscommon.SubscriberStateTable(state_db_connector, "DHCP_PACKET_MARK") - sel.addSelectable(subscribe_dhcp_packet_mark) - - # create DHCP chain - for namespace in list(self.config_db_map.keys()): - self.setup_dhcp_chain(namespace) - - # This should be migrated from state_db BFD session table to feature_table in the future when feature table support gets added for BFD - subscribe_bfd_session = swsscommon.SubscriberStateTable(state_db_connector, self.BFD_SESSION_TABLE) - sel.addSelectable(subscribe_bfd_session) - - # Map of Namespace <--> susbcriber table's object - config_db_subscriber_table_map = {} - - # Loop through all asic namespaces (if present) and host namespace (DEFAULT_NAMESPACE) - for namespace in list(self.config_db_map.keys()): - # Unconditionally update control plane ACLs once at start on given namespace - self.update_control_plane_acls(namespace) - # Connect to Config DB of given namespace - acl_db_connector = swsscommon.DBConnector("CONFIG_DB", 0, False, namespace) - # Subscribe to notifications when ACL tables changes - subscribe_acl_table = swsscommon.SubscriberStateTable(acl_db_connector, swsscommon.CFG_ACL_TABLE_TABLE_NAME) - # Subscribe to notifications when ACL rule tables changes - subscribe_acl_rule_table = swsscommon.SubscriberStateTable(acl_db_connector, swsscommon.CFG_ACL_RULE_TABLE_NAME) - # Add both tables to the selectable object - sel.addSelectable(subscribe_acl_table) - sel.addSelectable(subscribe_acl_rule_table) - # Update the map - config_db_subscriber_table_map[namespace] = [] - config_db_subscriber_table_map[namespace].append(subscribe_acl_table) - config_db_subscriber_table_map[namespace].append(subscribe_acl_rule_table) - - # Get the ACL rule table seprator - acl_rule_table_seprator = subscribe_acl_rule_table.getTableNameSeparator() - - # Loop on select to see if any event happen on state db or config db of any namespace - while True: - (state, selectableObj) = sel.select(SELECT_TIMEOUT_MS) - # Continue if select is timeout or selectable object is not return - if state != swsscommon.Select.OBJECT: - continue - - # Get the redisselect object from selectable object - redisSelectObj = swsscommon.CastSelectableToRedisSelectObj(selectableObj) - - # Get the corresponding namespace and db_id from redisselect - namespace = redisSelectObj.getDbConnector().getNamespace() - db_id = redisSelectObj.getDbConnector().getDbId() - - if db_id == state_db_id: - while True: - key, op, fvs = subscribe_bfd_session.pop() - if not key: - break - - if op == 'SET' and not self.bfdAllowed: - self.allow_bfd_protocol(namespace) - self.bfdAllowed = True - sel.removeSelectable(subscribe_bfd_session) - - if self.DualToR: - '''dhcp packet mark update''' - while True: - key, op, fvs = subscribe_dhcp_packet_mark.pop() - if not key: - break - self.log_info("dhcp packet mark update : '%s'" % str((key, op, fvs))) - - '''initial value is None''' - pre_mark = None if key not in dhcp_packet_mark_tbl else dhcp_packet_mark_tbl[key] - cur_mark = None if op == 'DEL' else dict(fvs)['mark'] - dhcp_packet_mark_tbl[key] = cur_mark - self.update_dhcp_acl_for_mark_change(key, pre_mark, cur_mark) - - '''mux cable update''' - while True: - key, op, fvs = subscribe_mux_cable.pop() - if not key: - break - self.log_info("mux cable update : '%s'" % str((key, op, fvs))) - - mark = None if key not in dhcp_packet_mark_tbl else dhcp_packet_mark_tbl[key] - self.update_dhcp_acl(key, op, dict(fvs), mark) - continue - - ctrl_plane_acl_notification = set() - - # Pop data of both Subscriber Table object of namespace that got config db acl table event - for table in config_db_subscriber_table_map[namespace]: - while True: - (key, op, fvp) = table.pop() - # Pop of table that does not have data so break - if key == '': - break - # ACL Table notification. We will take Control Plane ACTION for any ACL Table Event - # This can be optimize further but we should not have many acl table set/del events in normal - # scenario - if acl_rule_table_seprator not in key: - ctrl_plane_acl_notification.add(namespace) - # Check ACL Rule notification and make sure Rule point to ACL Table which is Controlplane - else: - acl_table = key.split(acl_rule_table_seprator)[0] - if self.config_db_map[namespace].get_table(self.ACL_TABLE)[acl_table]["type"] == self.ACL_TABLE_TYPE_CTRLPLANE: - ctrl_plane_acl_notification.add(namespace) - - # Update the Control Plane ACL of the namespace that got config db acl table event - for namespace in ctrl_plane_acl_notification: - with self.lock[namespace]: - if self.num_changes[namespace] == 0: - self.log_info("ACL change detected for namespace '{}'".format(namespace)) - - # Increment the number of change events we've received for this namespace - self.num_changes[namespace] += 1 - - # If an update thread is not already spawned for the namespace which we received - # the ACL table update event, spawn one now - if not self.update_thread[namespace]: - self.log_info("Spawning ACL update thread for namepsace '{}' ...".format(namespace)) - self.update_thread[namespace] = threading.Thread(target=self.check_and_update_control_plane_acls, - args=(namespace, self.num_changes[namespace])) - self.update_thread[namespace].start() - -# ============================= Functions ============================= - - -def main(): - # Instantiate a ControlPlaneAclManager object - caclmgr = ControlPlaneAclManager(SYSLOG_IDENTIFIER) - - # Log all messages from INFO level and higher - caclmgr.set_min_log_priority_info() - - caclmgr.run() - - -if __name__ == "__main__": - main() diff --git a/src/sonic-host-services/scripts/determine-reboot-cause b/src/sonic-host-services/scripts/determine-reboot-cause deleted file mode 100755 index 1408ad0e2952..000000000000 --- a/src/sonic-host-services/scripts/determine-reboot-cause +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python3 -# -# determine-reboot-cause -# -# Program designed to run once, soon after system boot which will -# determine the cause of the previous reboot and store it to the disk, -# - -try: - import datetime - import json - import os - import pwd - import re - import sys - - from sonic_py_common import device_info, logger - -except ImportError as err: - raise ImportError("%s - required module not found" % str(err)) - -VERSION = "1.0" - -SYSLOG_IDENTIFIER = "determine-reboot-cause" - -REBOOT_CAUSE_DIR = "/host/reboot-cause/" -REBOOT_CAUSE_HISTORY_DIR = "/host/reboot-cause/history/" -REBOOT_CAUSE_FILE = os.path.join(REBOOT_CAUSE_DIR, "reboot-cause.txt") -PREVIOUS_REBOOT_CAUSE_FILE = os.path.join(REBOOT_CAUSE_DIR, "previous-reboot-cause.json") -FIRST_BOOT_PLATFORM_FILE = "/tmp/notify_firstboot_to_platform" -REBOOT_TYPE_KEXEC_FILE = "/proc/cmdline" -# The following SONIC_BOOT_TYPEs come from the warm/fast reboot script which is in sonic-utilities -# Because the system can be rebooted from some old versions, we have to take all possible BOOT options into consideration. -# On 201803, 201807 we have -# BOOT_OPTIONS="$(echo $KERNEL_OPTIONS | sed -e 's/\s*linux\s*/BOOT_IMAGE=/') fast-reboot" -# On 201811 and later we have -# BOOT_OPTIONS="$(echo $KERNEL_OPTIONS | sed -e 's/\s*linux\s*/BOOT_IMAGE=/') SONIC_BOOT_TYPE=${BOOT_TYPE_ARG}" where BOOT_TYPE_ARG can be warm, fastfast or fast -# To extract the commom part of them, we should have the following PATTERN -REBOOT_TYPE_KEXEC_PATTERN_WARM = ".*SONIC_BOOT_TYPE=(warm|fastfast).*" -REBOOT_TYPE_KEXEC_PATTERN_FAST = ".*SONIC_BOOT_TYPE=(fast|fast-reboot).*" - -REBOOT_CAUSE_UNKNOWN = "Unknown" -REBOOT_CAUSE_NON_HARDWARE = "Non-Hardware" -REBOOT_CAUSE_HARDWARE_OTHER = "Hardware - Other" - -# Global logger class instance -sonic_logger = logger.Logger(SYSLOG_IDENTIFIER) - - -# ============================= Functions ============================= -def parse_warmfast_reboot_from_proc_cmdline(): - if os.path.isfile(REBOOT_TYPE_KEXEC_FILE): - with open(REBOOT_TYPE_KEXEC_FILE) as cause_file: - cause_file_kexec = cause_file.readline() - m = re.search(REBOOT_TYPE_KEXEC_PATTERN_WARM, cause_file_kexec) - if m and m.group(1): - return 'warm-reboot' - m = re.search(REBOOT_TYPE_KEXEC_PATTERN_FAST, cause_file_kexec) - if m and m.group(1): - return 'fast-reboot' - return None - - -def find_software_reboot_cause_from_reboot_cause_file(): - software_reboot_cause = REBOOT_CAUSE_UNKNOWN - if os.path.isfile(REBOOT_CAUSE_FILE): - with open(REBOOT_CAUSE_FILE) as cause_file: - software_reboot_cause = cause_file.readline().rstrip('\n') - sonic_logger.log_info("{} indicates the reboot cause: {}".format(REBOOT_CAUSE_FILE, software_reboot_cause)) - else: - sonic_logger.log_info("Reboot cause file {} not found".format(REBOOT_CAUSE_FILE)) - return software_reboot_cause - - -def find_first_boot_version(): - build_version = "unknown" - version_info = device_info.get_sonic_version_info() - if version_info: - build_version = version_info['build_version'] - return " (First boot of SONiC version {})".format(build_version) - - -def find_software_reboot_cause(): - software_reboot_cause = find_software_reboot_cause_from_reboot_cause_file() - if software_reboot_cause == REBOOT_CAUSE_UNKNOWN: - if os.path.isfile(FIRST_BOOT_PLATFORM_FILE): - software_reboot_cause += find_first_boot_version() - os.remove(FIRST_BOOT_PLATFORM_FILE) - return software_reboot_cause - - -def find_proc_cmdline_reboot_cause(): - proc_cmdline_reboot_cause = parse_warmfast_reboot_from_proc_cmdline() - - if proc_cmdline_reboot_cause: - sonic_logger.log_info("/proc/cmdline indicates reboot type: {}".format(proc_cmdline_reboot_cause)) - else: - sonic_logger.log_info("No reboot cause found from /proc/cmdline") - - return proc_cmdline_reboot_cause - - -def get_reboot_cause_from_platform(): - # Find hardware reboot cause using sonic_platform library - try: - import sonic_platform - platform = sonic_platform.platform.Platform() - chassis = platform.get_chassis() - hardware_reboot_cause_major, hardware_reboot_cause_minor = chassis.get_reboot_cause() - sonic_logger.log_info("Platform api returns reboot cause {}, {}".format(hardware_reboot_cause_major, hardware_reboot_cause_minor)) - except ImportError: - sonic_logger.log_warning("sonic_platform package not installed. Unable to detect hardware reboot causes.") - hardware_reboot_cause_major, hardware_reboot_cause_minor = REBOOT_CAUSE_NON_HARDWARE, "N/A" - - return hardware_reboot_cause_major, hardware_reboot_cause_minor - - -def find_hardware_reboot_cause(): - hardware_reboot_cause_major, hardware_reboot_cause_minor = get_reboot_cause_from_platform() - if hardware_reboot_cause_major: - sonic_logger.log_info("Platform api indicates reboot cause {}".format(hardware_reboot_cause_major)) - else: - sonic_logger.log_info("No reboot cause found from platform api") - - hardware_reboot_cause = "{} ({})".format(hardware_reboot_cause_major, hardware_reboot_cause_minor) - return hardware_reboot_cause - - -def get_reboot_cause_dict(previous_reboot_cause, comment, gen_time): - """Store the key infomation of device reboot into a dictionary by parsing the string in - previous_reboot_cause. - - If user issused a command to reboot device, then user, command and time will be - stored into a dictionary. - - If device was rebooted due to the kernel panic, then the string `Kernel Panic` - and time will be stored into a dictionary. - """ - reboot_cause_dict = {} - reboot_cause_dict['gen_time'] = gen_time - reboot_cause_dict['cause'] = previous_reboot_cause - reboot_cause_dict['user'] = "N/A" - reboot_cause_dict['time'] = "N/A" - reboot_cause_dict['comment'] = comment if comment is not None else "N/A" - - if re.search(r'User issued', previous_reboot_cause): - # Match with "User issued '{}' command [User: {}, Time: {}]" - match = re.search(r'User issued \'(.*)\' command \[User: (.*), Time: (.*)\]', previous_reboot_cause) - if match is not None: - reboot_cause_dict['cause'] = match.group(1) - reboot_cause_dict['user'] = match.group(2) - reboot_cause_dict['time'] = match.group(3) - elif re.search(r'Kernel Panic', previous_reboot_cause): - match = re.search(r'Kernel Panic \[Time: (.*)\]', previous_reboot_cause) - if match is not None: - reboot_cause_dict['cause'] = "Kernel Panic" - reboot_cause_dict['time'] = match.group(1) - - return reboot_cause_dict - - -def main(): - # Configure logger to log all messages INFO level and higher - sonic_logger.set_min_log_priority_info() - - sonic_logger.log_info("Starting up...") - - if not os.geteuid() == 0: - sonic_logger.log_error("User {} does not have permission to execute".format(pwd.getpwuid(os.getuid()).pw_name)) - sys.exit("This utility must be run as root") - - # Create REBOOT_CAUSE_DIR if it doesn't exist - if not os.path.exists(REBOOT_CAUSE_DIR): - os.makedirs(REBOOT_CAUSE_DIR) - - # Remove stale PREVIOUS_REBOOT_CAUSE_FILE if it exists - if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE): - os.remove(PREVIOUS_REBOOT_CAUSE_FILE) - - # This variable is kept for future-use purpose. When proc_cmd_line/vendor/software provides - # any additional_reboot_info it will be stored as a "comment" in REBOOT_CAUSE_HISTORY_FILE - additional_reboot_info = "N/A" - - # Check if the previous reboot was warm/fast reboot by testing whether there is "fast|fastfast|warm" in /proc/cmdline - proc_cmdline_reboot_cause = find_proc_cmdline_reboot_cause() - - # If /proc/cmdline does not indicate reboot cause, check if the previous reboot was caused by hardware - if proc_cmdline_reboot_cause is None: - previous_reboot_cause = find_hardware_reboot_cause() - if previous_reboot_cause.startswith(REBOOT_CAUSE_NON_HARDWARE): - # If the reboot cause is non-hardware, get the reboot cause from REBOOT_CAUSE_FILE - previous_reboot_cause = find_software_reboot_cause() - else: - # Get the reboot cause from REBOOT_CAUSE_FILE - previous_reboot_cause = find_software_reboot_cause() - - # Current time - reboot_cause_gen_time = str(datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')) - - # Save the previous cause info into its history file as json format - reboot_cause_dict = get_reboot_cause_dict(previous_reboot_cause, additional_reboot_info, reboot_cause_gen_time) - - # Create reboot-cause-#time#.json under history directory - REBOOT_CAUSE_HISTORY_FILE = os.path.join(REBOOT_CAUSE_HISTORY_DIR, "reboot-cause-{}.json".format(reboot_cause_gen_time)) - - # Create REBOOT_CAUSE_HISTORY_DIR if it doesn't exist - if not os.path.exists(REBOOT_CAUSE_HISTORY_DIR): - os.makedirs(REBOOT_CAUSE_HISTORY_DIR) - - # Write the previous reboot cause to REBOOT_CAUSE_HISTORY_FILE as a JSON format - with open(REBOOT_CAUSE_HISTORY_FILE, "w") as reboot_cause_history_file: - json.dump(reboot_cause_dict, reboot_cause_history_file) - - # Create a symbolic link to previous-reboot-cause.json file - os.symlink(REBOOT_CAUSE_HISTORY_FILE, PREVIOUS_REBOOT_CAUSE_FILE) - - - # Remove the old REBOOT_CAUSE_FILE - if os.path.exists(REBOOT_CAUSE_FILE): - os.remove(REBOOT_CAUSE_FILE) - - # Write a new default reboot cause file for the next reboot - with open(REBOOT_CAUSE_FILE, "w") as cause_file: - cause_file.write(REBOOT_CAUSE_UNKNOWN) - - -if __name__ == "__main__": - main() diff --git a/src/sonic-host-services/scripts/hostcfgd b/src/sonic-host-services/scripts/hostcfgd deleted file mode 100755 index a82a630bfc0a..000000000000 --- a/src/sonic-host-services/scripts/hostcfgd +++ /dev/null @@ -1,1471 +0,0 @@ -#!/usr/bin/env python3 - -import ast -import copy -import ipaddress -import os -import sys -import subprocess -import syslog -import signal -import re -import jinja2 -from sonic_py_common import device_info -from swsscommon.swsscommon import ConfigDBConnector, DBConnector, Table - -# FILE -PAM_AUTH_CONF = "/etc/pam.d/common-auth-sonic" -PAM_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/common-auth-sonic.j2" -PAM_PASSWORD_CONF = "/etc/pam.d/common-password" -PAM_PASSWORD_CONF_TEMPLATE = "/usr/share/sonic/templates/common-password.j2" -NSS_TACPLUS_CONF = "/etc/tacplus_nss.conf" -NSS_TACPLUS_CONF_TEMPLATE = "/usr/share/sonic/templates/tacplus_nss.conf.j2" -NSS_RADIUS_CONF = "/etc/radius_nss.conf" -NSS_RADIUS_CONF_TEMPLATE = "/usr/share/sonic/templates/radius_nss.conf.j2" -PAM_RADIUS_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_radius_auth.conf.j2" -NSS_CONF = "/etc/nsswitch.conf" -ETC_PAMD_SSHD = "/etc/pam.d/sshd" -ETC_PAMD_LOGIN = "/etc/pam.d/login" -ETC_LOGIN_DEF = "/etc/login.defs" - -# Linux login.def default values (password hardening disable) -LINUX_DEFAULT_PASS_MAX_DAYS = 99999 -LINUX_DEFAULT_PASS_WARN_AGE = 7 - -ACCOUNT_NAME = 0 # index of account name -AGE_DICT = { 'MAX_DAYS': {'REGEX_DAYS': r'^PASS_MAX_DAYS[ \t]*(?P\d*)', 'DAYS': 'max_days', 'CHAGE_FLAG': '-M '}, - 'WARN_DAYS': {'REGEX_DAYS': r'^PASS_WARN_AGE[ \t]*(?P\d*)', 'DAYS': 'warn_days', 'CHAGE_FLAG': '-W '} - } -PAM_LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/pam_limits.j2" -LIMITS_CONF_TEMPLATE = "/usr/share/sonic/templates/limits.conf.j2" -PAM_LIMITS_CONF = "/etc/pam.d/pam-limits-conf" -LIMITS_CONF = "/etc/security/limits.conf" - -# TACACS+ -TACPLUS_SERVER_PASSKEY_DEFAULT = "" -TACPLUS_SERVER_TIMEOUT_DEFAULT = "5" -TACPLUS_SERVER_AUTH_TYPE_DEFAULT = "pap" - -# RADIUS -RADIUS_SERVER_AUTH_PORT_DEFAULT = "1812" -RADIUS_SERVER_PASSKEY_DEFAULT = "" -RADIUS_SERVER_RETRANSMIT_DEFAULT = "3" -RADIUS_SERVER_TIMEOUT_DEFAULT = "5" -RADIUS_SERVER_AUTH_TYPE_DEFAULT = "pap" -RADIUS_PAM_AUTH_CONF_DIR = "/etc/pam_radius_auth.d/" - -# MISC Constants -CFG_DB = "CONFIG_DB" -STATE_DB = "STATE_DB" -HOSTCFGD_MAX_PRI = 10 # Used to enforce ordering b/w daemons under Hostcfgd -DEFAULT_SELECT_TIMEOUT = 1000 - - -def safe_eval(val, default_value=False): - """ Safely evaluate the expression, without raising an exception """ - try: - ret = ast.literal_eval(val) - except ValueError: - ret = default_value - return ret - - -def signal_handler(sig, frame): - if sig == signal.SIGHUP: - syslog.syslog(syslog.LOG_INFO, "HostCfgd: signal 'SIGHUP' is caught and ignoring..") - elif sig == signal.SIGINT: - syslog.syslog(syslog.LOG_INFO, "HostCfgd: signal 'SIGINT' is caught and exiting...") - sys.exit(128 + sig) - elif sig == signal.SIGTERM: - syslog.syslog(syslog.LOG_INFO, "HostCfgd: signal 'SIGTERM' is caught and exiting...") - sys.exit(128 + sig) - else: - syslog.syslog(syslog.LOG_INFO, "HostCfgd: invalid signal - ignoring..") - - -def run_cmd(cmd, log_err=True, raise_exception=False): - try: - subprocess.check_call(cmd, shell=True) - except Exception as err: - if log_err: - syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}" - .format(err.cmd, err.returncode, err.output)) - if raise_exception: - raise - - -def is_true(val): - if val == 'True' or val == 'true': - return True - elif val == 'False' or val == 'false': - return False - syslog.syslog(syslog.LOG_ERR, "Failed to get bool value, instead val= {}".format(val)) - return False - - -def is_vlan_sub_interface(ifname): - ifname_split = ifname.split(".") - return (len(ifname_split) == 2) - - -def sub(l, start, end): - return l[start:end] - - -def obfuscate(data): - if data: - return data[0] + '*****' - else: - return data - - -def get_pid(procname): - for dirname in os.listdir('/proc'): - if dirname == 'curproc': - continue - try: - with open('/proc/{}/cmdline'.format(dirname), mode='r') as fd: - content = fd.read() - except Exception as ex: - continue - if procname in content: - return dirname - return "" - - -class Feature(object): - """ Represents a feature configuration from CONFIG_DB data. """ - - def __init__(self, feature_name, feature_cfg, device_config=None): - """ Initialize Feature object based on CONFIG_DB data. - - Args: - feature_name (str): Feature name string - feature_cfg (dict): Feature CONFIG_DB configuration - deviec_config (dict): DEVICE_METADATA section of CONFIG_DB - """ - - self.name = feature_name - self.state = self._get_target_state(feature_cfg.get('state'), device_config or {}) - self.auto_restart = feature_cfg.get('auto_restart', 'disabled') - self.has_timer = safe_eval(feature_cfg.get('has_timer', 'False')) - self.has_global_scope = safe_eval(feature_cfg.get('has_global_scope', 'True')) - self.has_per_asic_scope = safe_eval(feature_cfg.get('has_per_asic_scope', 'False')) - - def _get_target_state(self, state_configuration, device_config): - """ Returns the target state for the feature by rendering the state field as J2 template. - - Args: - state_configuration (str): State configuration from CONFIG_DB - deviec_config (dict): DEVICE_METADATA section of CONFIG_DB - Returns: - (str): Target feature state - """ - - if state_configuration is None: - return None - - template = jinja2.Template(state_configuration) - target_state = template.render(device_config) - if target_state not in ('enabled', 'disabled', 'always_enabled', 'always_disabled'): - raise ValueError('Invalid state rendered for feature {}: {}'.format(self.name, target_state)) - return target_state - - def compare_state(self, feature_name, feature_cfg): - if self.name != feature_name or not isinstance(feature_cfg, dict): - return False - - if self.state != feature_cfg.get('state', ''): - return False - return True - - -class FeatureHandler(object): - """ Handles FEATURE table updates. """ - - SYSTEMD_SYSTEM_DIR = '/etc/systemd/system/' - SYSTEMD_SERVICE_CONF_DIR = os.path.join(SYSTEMD_SYSTEM_DIR, '{}.service.d/') - - # Feature state constants - FEATURE_STATE_ENABLED = "enabled" - FEATURE_STATE_DISABLED = "disabled" - FEATURE_STATE_FAILED = "failed" - - def __init__(self, config_db, feature_state_table, device_config): - self._config_db = config_db - self._feature_state_table = feature_state_table - self._device_config = device_config - self._cached_config = {} - self.is_multi_npu = device_info.is_multi_npu() - - def handler(self, feature_name, op, feature_cfg): - if not feature_cfg: - syslog.syslog(syslog.LOG_INFO, "Deregistering feature {}".format(feature_name)) - self._cached_config.pop(feature_name, None) - self._feature_state_table._del(feature_name) - return - - feature = Feature(feature_name, feature_cfg, self._device_config) - self._cached_config.setdefault(feature_name, Feature(feature_name, {})) - - # Change auto-restart configuration first. - # If service reached failed state before this configuration applies (e.g. on boot) - # the next called self.update_feature_state will start it again. If it will fail - # again the auto restart will kick-in. Another order may leave it in failed state - # and not auto restart. - if self._cached_config[feature_name].auto_restart != feature.auto_restart: - syslog.syslog(syslog.LOG_INFO, "Auto-restart status of feature '{}' is changed from '{}' to '{}' ..." - .format(feature_name, self._cached_config[feature_name].auto_restart, feature.auto_restart)) - self.update_systemd_config(feature) - self._cached_config[feature_name].auto_restart = feature.auto_restart - - # Enable/disable the container service if the feature state was changed from its previous state. - if self._cached_config[feature_name].state != feature.state: - if self.update_feature_state(feature): - self._cached_config[feature_name].state = feature.state - else: - self.resync_feature_state(self._cached_config[feature_name]) - - def sync_state_field(self, feature_table): - """ - Summary: - Updates the state field in the FEATURE|* tables as the state field - might have to be rendered based on DEVICE_METADATA table - """ - for feature_name in feature_table.keys(): - if not feature_name: - syslog.syslog(syslog.LOG_WARNING, "Feature is None") - continue - - feature = Feature(feature_name, feature_table[feature_name], self._device_config) - - self._cached_config.setdefault(feature_name, feature) - self.update_systemd_config(feature) - self.update_feature_state(feature) - self.resync_feature_state(feature) - - def update_feature_state(self, feature): - cached_feature = self._cached_config[feature.name] - enable = False - disable = False - - # Allowed transitions: - # None -> always_enabled - # -> always_disabled - # -> enabled - # -> disabled - # always_enabled -> always_disabled - # enabled -> disabled - # disabled -> enabled - if cached_feature.state is None: - enable = feature.state in ("always_enabled", "enabled") - disable = feature.state in ("always_disabled", "disabled") - elif cached_feature.state in ("always_enabled", "always_disabled"): - disable = feature.state == "always_disabled" - enable = feature.state == "always_enabled" - elif cached_feature.state in ("enabled", "disabled"): - enable = feature.state == "enabled" - disable = feature.state == "disabled" - else: - syslog.syslog(syslog.LOG_INFO, "Feature {} service is {}".format(feature.name, cached_feature.state)) - return False - - if not enable and not disable: - syslog.syslog(syslog.LOG_ERR, "Unexpected state value '{}' for feature {}" - .format(feature.state, feature.name)) - return False - - if enable: - self.enable_feature(feature) - syslog.syslog(syslog.LOG_INFO, "Feature {} is enabled and started".format(feature.name)) - - if disable: - self.disable_feature(feature) - syslog.syslog(syslog.LOG_INFO, "Feature {} is stopped and disabled".format(feature.name)) - - return True - - def update_systemd_config(self, feature_config): - """Updates `Restart=` field in feature's systemd configuration file - according to the value of `auto_restart` field in `FEATURE` table of `CONFIG_DB`. - - Args: - feature: An object represents a feature's configuration in `FEATURE` - table of `CONFIG_DB`. - - Returns: - None. - """ - restart_field_str = "always" if "enabled" in feature_config.auto_restart else "no" - feature_systemd_config = "[Service]\nRestart={}\n".format(restart_field_str) - feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature_config) - - # On multi-ASIC device, creates systemd configuration file for each feature instance - # residing in difference namespace. - for feature_name in feature_names: - syslog.syslog(syslog.LOG_INFO, "Updating feature '{}' systemd config file related to auto-restart ..." - .format(feature_name)) - feature_systemd_config_dir_path = self.SYSTEMD_SERVICE_CONF_DIR.format(feature_name) - feature_systemd_config_file_path = os.path.join(feature_systemd_config_dir_path, 'auto_restart.conf') - - if not os.path.exists(feature_systemd_config_dir_path): - os.mkdir(feature_systemd_config_dir_path) - with open(feature_systemd_config_file_path, 'w') as feature_systemd_config_file_handler: - feature_systemd_config_file_handler.write(feature_systemd_config) - - syslog.syslog(syslog.LOG_INFO, "Feautre '{}' systemd config file related to auto-restart is updated!" - .format(feature_name)) - - try: - syslog.syslog(syslog.LOG_INFO, "Reloading systemd configuration files ...") - run_cmd("sudo systemctl daemon-reload", raise_exception=True) - syslog.syslog(syslog.LOG_INFO, "Systemd configuration files are reloaded!") - except Exception as err: - syslog.syslog(syslog.LOG_ERR, "Failed to reload systemd configuration files!") - - def get_multiasic_feature_instances(self, feature): - # Create feature name suffix depending feature is running in host or namespace or in both - feature_names = ( - ([feature.name] if feature.has_global_scope or not self.is_multi_npu else []) + - ([(feature.name + '@' + str(asic_inst)) for asic_inst in range(device_info.get_num_npus()) - if feature.has_per_asic_scope and self.is_multi_npu]) - ) - - if not feature_names: - syslog.syslog(syslog.LOG_ERR, "Feature '{}' service not available" - .format(feature.name)) - - feature_suffixes = ["service"] + (["timer"] if feature.has_timer else []) - - return feature_names, feature_suffixes - - def get_systemd_unit_state(self, unit): - """ Returns service configuration """ - - cmd = "sudo systemctl show {} --property UnitFileState".format(unit) - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = proc.communicate() - if proc.returncode != 0: - syslog.syslog(syslog.LOG_ERR, "Failed to get status of {}: rc={} stderr={}".format(unit, proc.returncode, stderr)) - return 'invalid' # same as systemd's "invalid indicates that it could not be determined whether the unit file is enabled". - - props = dict([line.split("=") for line in stdout.decode().strip().splitlines()]) - return props["UnitFileState"] - - def enable_feature(self, feature): - cmds = [] - feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature) - for feature_name in feature_names: - # Check if it is already enabled, if yes skip the system call - unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1])) - if unit_file_state == "enabled": - continue - - for suffix in feature_suffixes: - cmds.append("sudo systemctl unmask {}.{}".format(feature_name, suffix)) - - # If feature has timer associated with it, start/enable corresponding systemd .timer unit - # otherwise, start/enable corresponding systemd .service unit - - cmds.append("sudo systemctl enable {}.{}".format(feature_name, feature_suffixes[-1])) - cmds.append("sudo systemctl start {}.{}".format(feature_name, feature_suffixes[-1])) - - for cmd in cmds: - syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd)) - try: - run_cmd(cmd, raise_exception=True) - except Exception as err: - syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be enabled and started" - .format(feature.name, feature_suffixes[-1])) - self.set_feature_state(feature, self.FEATURE_STATE_FAILED) - return - - self.set_feature_state(feature, self.FEATURE_STATE_ENABLED) - - def disable_feature(self, feature): - cmds = [] - feature_names, feature_suffixes = self.get_multiasic_feature_instances(feature) - for feature_name in feature_names: - # Check if it is already disabled, if yes skip the system call - unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1])) - if unit_file_state in ("disabled", "masked"): - continue - - for suffix in reversed(feature_suffixes): - cmds.append("sudo systemctl stop {}.{}".format(feature_name, suffix)) - cmds.append("sudo systemctl disable {}.{}".format(feature_name, feature_suffixes[-1])) - cmds.append("sudo systemctl mask {}.{}".format(feature_name, feature_suffixes[-1])) - for cmd in cmds: - syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd)) - try: - run_cmd(cmd, raise_exception=True) - except Exception as err: - syslog.syslog(syslog.LOG_ERR, "Feature '{}.{}' failed to be stopped and disabled" - .format(feature.name, feature_suffixes[-1])) - self.set_feature_state(feature, self.FEATURE_STATE_FAILED) - return - - self.set_feature_state(feature, self.FEATURE_STATE_DISABLED) - - def resync_feature_state(self, feature): - self._config_db.mod_entry('FEATURE', feature.name, {'state': feature.state}) - - def set_feature_state(self, feature, state): - self._feature_state_table.set(feature.name, [('state', state)]) - - -class Iptables(object): - def __init__(self): - ''' - Default MSS to 1460 - (MTU 1500 - 40 (TCP/IP Overhead)) - For IPv6, it would be 1440 - (MTU 1500 - 60 octects) - ''' - self.tcpmss = 1460 - self.tcp6mss = 1440 - - def is_ip_prefix_in_key(self, key): - ''' - Function to check if IP address is present in the key. If it - is present, then the key would be a tuple or else, it shall be - be string - ''' - return (isinstance(key, tuple)) - - def load(self, lpbk_table): - for row in lpbk_table: - self.iptables_handler(row, lpbk_table[row]) - - def command(self, chain, ip, ver, op): - cmd = 'iptables' if ver == '4' else 'ip6tables' - cmd += ' -t mangle --{} {} -p tcp --tcp-flags SYN SYN'.format(op, chain) - cmd += ' -d' if chain == 'PREROUTING' else ' -s' - mss = self.tcpmss if ver == '4' else self.tcp6mss - cmd += ' {} -j TCPMSS --set-mss {}'.format(ip, mss) - - return cmd - - def iptables_handler(self, key, data, add=True): - if not self.is_ip_prefix_in_key(key): - return - - iface, ip = key - ip_str = ip.split("/")[0] - ip_addr = ipaddress.ip_address(ip_str) - if isinstance(ip_addr, ipaddress.IPv6Address): - ver = '6' - else: - ver = '4' - - self.mangle_handler(ip_str, ver, add) - - def mangle_handler(self, ip, ver, add): - if not add: - op = 'delete' - else: - op = 'check' - - iptables_cmds = [] - chains = ['PREROUTING', 'POSTROUTING'] - for chain in chains: - cmd = self.command(chain, ip, ver, op) - if not add: - iptables_cmds.append(cmd) - else: - ''' - For add case, first check if rule exists. Iptables just appends to the chain - as a new rule even if it is the same as an existing one. Check this and - do nothing if rule exists - ''' - ret = subprocess.call(cmd, shell=True) - if ret == 0: - syslog.syslog(syslog.LOG_INFO, "{} rule exists in {}".format(ip, chain)) - else: - # Modify command from Check to Append - iptables_cmds.append(cmd.replace("check", "append")) - - for cmd in iptables_cmds: - syslog.syslog(syslog.LOG_INFO, "Running cmd - {}".format(cmd)) - run_cmd(cmd) - - -class AaaCfg(object): - def __init__(self): - self.authentication_default = { - 'login': 'local', - } - self.authorization_default = { - 'login': 'local', - } - self.accounting_default = { - 'login': 'disable', - } - self.tacplus_global_default = { - 'auth_type': TACPLUS_SERVER_AUTH_TYPE_DEFAULT, - 'timeout': TACPLUS_SERVER_TIMEOUT_DEFAULT, - 'passkey': TACPLUS_SERVER_PASSKEY_DEFAULT - } - self.tacplus_global = {} - self.tacplus_servers = {} - - self.radius_global_default = { - 'priority': 0, - 'auth_port': RADIUS_SERVER_AUTH_PORT_DEFAULT, - 'auth_type': RADIUS_SERVER_AUTH_TYPE_DEFAULT, - 'retransmit': RADIUS_SERVER_RETRANSMIT_DEFAULT, - 'timeout': RADIUS_SERVER_TIMEOUT_DEFAULT, - 'passkey': RADIUS_SERVER_PASSKEY_DEFAULT - } - self.radius_global = {} - self.radius_servers = {} - - self.authentication = {} - self.authorization = {} - self.accounting = {} - self.debug = False - self.trace = False - - self.hostname = "" - - # Load conf from ConfigDb - def load(self, aaa_conf, tac_global_conf, tacplus_conf, rad_global_conf, radius_conf): - for row in aaa_conf: - self.aaa_update(row, aaa_conf[row], modify_conf=False) - for row in tac_global_conf: - self.tacacs_global_update(row, tac_global_conf[row], modify_conf=False) - for row in tacplus_conf: - self.tacacs_server_update(row, tacplus_conf[row], modify_conf=False) - - for row in rad_global_conf: - self.radius_global_update(row, rad_global_conf[row], modify_conf=False) - for row in radius_conf: - self.radius_server_update(row, radius_conf[row], modify_conf=False) - - self.modify_conf_file() - - def aaa_update(self, key, data, modify_conf=True): - if key == 'authentication': - self.authentication = data - if 'failthrough' in data: - self.authentication['failthrough'] = is_true(data['failthrough']) - if 'debug' in data: - self.debug = is_true(data['debug']) - if key == 'authorization': - self.authorization = data - if key == 'accounting': - self.accounting = data - if modify_conf: - self.modify_conf_file() - - def pick_src_intf_ipaddrs(self, keys, src_intf): - new_ipv4_addr = "" - new_ipv6_addr = "" - - for it in keys: - if src_intf != it[0] or (isinstance(it, tuple) == False): - continue - if new_ipv4_addr != "" and new_ipv6_addr != "": - break - ip_str = it[1].split("/")[0] - ip_addr = ipaddress.IPAddress(ip_str) - # Pick the first IP address from the table that matches the source interface - if isinstance(ip_addr, ipaddress.IPv6Address): - if new_ipv6_addr != "": - continue - new_ipv6_addr = ip_str - else: - if new_ipv4_addr != "": - continue - new_ipv4_addr = ip_str - - return(new_ipv4_addr, new_ipv6_addr) - - def tacacs_global_update(self, key, data, modify_conf=True): - if key == 'global': - self.tacplus_global = data - if modify_conf: - self.modify_conf_file() - - def tacacs_server_update(self, key, data, modify_conf=True): - if data == {}: - if key in self.tacplus_servers: - del self.tacplus_servers[key] - else: - self.tacplus_servers[key] = data - - if modify_conf: - self.modify_conf_file() - - def notify_audisp_tacplus_reload_config(self): - pid = get_pid("/sbin/audisp-tacplus") - syslog.syslog(syslog.LOG_INFO, "Found audisp-tacplus PID: {}".format(pid)) - if pid == "": - return - - # audisp-tacplus will reload TACACS+ config when receive SIGHUP - try: - os.kill(int(pid), signal.SIGHUP) - except Exception as ex: - syslog.syslog(syslog.LOG_WARNING, "Send SIGHUP to audisp-tacplus failed with exception: {}".format(ex)) - - def handle_radius_source_intf_ip_chg(self, key): - modify_conf=False - if 'src_intf' in self.radius_global: - if key[0] == self.radius_global['src_intf']: - modify_conf=True - for addr in self.radius_servers: - if ('src_intf' in self.radius_servers[addr]) and \ - (key[0] == self.radius_servers[addr]['src_intf']): - modify_conf=True - break - - if not modify_conf: - return - - syslog.syslog(syslog.LOG_INFO, 'RADIUS IP change - key:{}, current server info {}'.format(key, self.radius_servers)) - self.modify_conf_file() - - def handle_radius_nas_ip_chg(self, key): - modify_conf=False - # Mgmt IP configuration affects only the default nas_ip - if 'nas_ip' not in self.radius_global: - for addr in self.radius_servers: - if 'nas_ip' not in self.radius_servers[addr]: - modify_conf=True - break - - if not modify_conf: - return - - syslog.syslog(syslog.LOG_INFO, 'RADIUS (NAS) IP change - key:{}, current global info {}'.format(key, self.radius_global)) - self.modify_conf_file() - - def radius_global_update(self, key, data, modify_conf=True): - if key == 'global': - self.radius_global = data - if 'statistics' in data: - self.radius_global['statistics'] = is_true(data['statistics']) - if modify_conf: - self.modify_conf_file() - - def radius_server_update(self, key, data, modify_conf=True): - if data == {}: - if key in self.radius_servers: - del self.radius_servers[key] - else: - self.radius_servers[key] = data - - if modify_conf: - self.modify_conf_file() - - def hostname_update(self, hostname, modify_conf=True): - if self.hostname == hostname: - return - - self.hostname = hostname - - # Currently only used for RADIUS - if len(self.radius_servers) == 0: - return - - if modify_conf: - self.modify_conf_file() - - def get_hostname(self): - return self.hostname - - def get_interface_ip(self, source, addr=None): - keys = None - try: - if source.startswith("Eth"): - if is_vlan_sub_interface(source): - keys = self.config_db.get_keys('VLAN_SUB_INTERFACE') - else: - keys = self.config_db.get_keys('INTERFACE') - elif source.startswith("Po"): - if is_vlan_sub_interface(source): - keys = self.config_db.get_keys('VLAN_SUB_INTERFACE') - else: - keys = self.config_db.get_keys('PORTCHANNEL_INTERFACE') - elif source.startswith("Vlan"): - keys = self.config_db.get_keys('VLAN_INTERFACE') - elif source.startswith("Loopback"): - keys = self.config_db.get_keys('LOOPBACK_INTERFACE') - elif source == "eth0": - keys = self.config_db.get_keys('MGMT_INTERFACE') - except Exception as e: - pass - - interface_ip = "" - if keys != None: - ipv4_addr, ipv6_addr = self.pick_src_intf_ipaddrs(keys, source) - # Based on the type of addr, return v4 or v6 - if addr and isinstance(addr, ipaddress.IPv6Address): - interface_ip = ipv6_addr - else: - # This could be tuned, but that involves a DNS query, so - # offline configuration might trip (or cause delays). - interface_ip = ipv4_addr - return interface_ip - - def modify_single_file(self, filename, operations=None): - if operations: - cmd = "sed -e {0} {1} > {1}.new; mv -f {1} {1}.old; mv -f {1}.new {1}".format(' -e '.join(operations), filename) - os.system(cmd) - - def modify_conf_file(self): - authentication = self.authentication_default.copy() - authentication.update(self.authentication) - authorization = self.authorization_default.copy() - authorization.update(self.authorization) - accounting = self.accounting_default.copy() - accounting.update(self.accounting) - tacplus_global = self.tacplus_global_default.copy() - tacplus_global.update(self.tacplus_global) - if 'src_ip' in tacplus_global: - src_ip = tacplus_global['src_ip'] - else: - src_ip = None - - servers_conf = [] - if self.tacplus_servers: - for addr in self.tacplus_servers: - server = tacplus_global.copy() - server['ip'] = addr - server.update(self.tacplus_servers[addr]) - servers_conf.append(server) - servers_conf = sorted(servers_conf, key=lambda t: int(t['priority']), reverse=True) - - radius_global = self.radius_global_default.copy() - radius_global.update(self.radius_global) - - # RADIUS: Set the default nas_ip, and nas_id - if 'nas_ip' not in radius_global: - nas_ip = self.get_interface_ip("eth0") - if len(nas_ip) > 0: - radius_global['nas_ip'] = nas_ip - if 'nas_id' not in radius_global: - nas_id = self.get_hostname() - if len(nas_id) > 0: - radius_global['nas_id'] = nas_id - - radsrvs_conf = [] - if self.radius_servers: - for addr in self.radius_servers: - server = radius_global.copy() - server['ip'] = addr - server.update(self.radius_servers[addr]) - - if 'src_intf' in server: - # RADIUS: Log a message if src_ip is already defined. - if 'src_ip' in server: - syslog.syslog(syslog.LOG_INFO, \ - "RADIUS_SERVER|{}: src_intf found. Ignoring src_ip".format(addr)) - # RADIUS: If server.src_intf, then get the corresponding - # src_ip based on the server.ip, and set it. - src_ip = self.get_interface_ip(server['src_intf'], addr) - if len(src_ip) > 0: - server['src_ip'] = src_ip - elif 'src_ip' in server: - syslog.syslog(syslog.LOG_INFO, \ - "RADIUS_SERVER|{}: src_intf has no usable IP addr.".format(addr)) - del server['src_ip'] - - radsrvs_conf.append(server) - radsrvs_conf = sorted(radsrvs_conf, key=lambda t: int(t['priority']), reverse=True) - - template_file = os.path.abspath(PAM_AUTH_CONF_TEMPLATE) - env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) - env.filters['sub'] = sub - template = env.get_template(template_file) - if 'radius' in authentication['login']: - pam_conf = template.render(debug=self.debug, trace=self.trace, auth=authentication, servers=radsrvs_conf) - else: - pam_conf = template.render(auth=authentication, src_ip=src_ip, servers=servers_conf) - - # Use rename(), which is atomic (on the same fs) to avoid empty file - with open(PAM_AUTH_CONF + ".tmp", 'w') as f: - f.write(pam_conf) - os.chmod(PAM_AUTH_CONF + ".tmp", 0o644) - os.rename(PAM_AUTH_CONF + ".tmp", PAM_AUTH_CONF) - - # Modify common-auth include file in /etc/pam.d/login, sshd. - # /etc/pam.d/sudo is not handled, because it would change the existing - # behavior. It can be modified once a config knob is added for sudo. - if os.path.isfile(PAM_AUTH_CONF): - self.modify_single_file(ETC_PAMD_SSHD, [ "'/^@include/s/common-auth$/common-auth-sonic/'" ]) - self.modify_single_file(ETC_PAMD_LOGIN, [ "'/^@include/s/common-auth$/common-auth-sonic/'" ]) - else: - self.modify_single_file(ETC_PAMD_SSHD, [ "'/^@include/s/common-auth-sonic$/common-auth/'" ]) - self.modify_single_file(ETC_PAMD_LOGIN, [ "'/^@include/s/common-auth-sonic$/common-auth/'" ]) - - # Add tacplus/radius in nsswitch.conf if TACACS+/RADIUS enable - if 'tacacs+' in authentication['login']: - if os.path.isfile(NSS_CONF): - self.modify_single_file(NSS_CONF, [ "'/^passwd/s/ radius//'" ]) - self.modify_single_file(NSS_CONF, [ "'/tacplus/b'", "'/^passwd/s/compat/tacplus &/'", "'/^passwd/s/files/tacplus &/'" ]) - elif 'radius' in authentication['login']: - if os.path.isfile(NSS_CONF): - self.modify_single_file(NSS_CONF, [ "'/^passwd/s/tacplus //'" ]) - self.modify_single_file(NSS_CONF, [ "'/radius/b'", "'/^passwd/s/compat/& radius/'", "'/^passwd/s/files/& radius/'" ]) - else: - if os.path.isfile(NSS_CONF): - self.modify_single_file(NSS_CONF, [ "'/^passwd/s/tacplus //g'" ]) - self.modify_single_file(NSS_CONF, [ "'/^passwd/s/ radius//'" ]) - - # Add tacplus authorization configration in nsswitch.conf - tacacs_authorization_conf = None - local_authorization_conf = None - if 'tacacs+' in authorization['login']: - tacacs_authorization_conf = "on" - if 'local' in authorization['login']: - local_authorization_conf = "on" - - # Add tacplus accounting configration in nsswitch.conf - tacacs_accounting_conf = None - local_accounting_conf = None - if 'tacacs+' in accounting['login']: - tacacs_accounting_conf = "on" - if 'local' in accounting['login']: - local_accounting_conf = "on" - - # Set tacacs+ server in nss-tacplus conf - template_file = os.path.abspath(NSS_TACPLUS_CONF_TEMPLATE) - template = env.get_template(template_file) - nss_tacplus_conf = template.render( - debug=self.debug, - src_ip=src_ip, - servers=servers_conf, - local_accounting=local_accounting_conf, - tacacs_accounting=tacacs_accounting_conf, - local_authorization=local_authorization_conf, - tacacs_authorization=tacacs_authorization_conf) - with open(NSS_TACPLUS_CONF, 'w') as f: - f.write(nss_tacplus_conf) - - # Notify auditd plugin to reload tacacs config. - self.notify_audisp_tacplus_reload_config() - - # Set debug in nss-radius conf - template_file = os.path.abspath(NSS_RADIUS_CONF_TEMPLATE) - template = env.get_template(template_file) - nss_radius_conf = template.render(debug=self.debug, trace=self.trace, servers=radsrvs_conf) - with open(NSS_RADIUS_CONF, 'w') as f: - f.write(nss_radius_conf) - - # Create the per server pam_radius_auth.conf - if radsrvs_conf: - for srv in radsrvs_conf: - # Configuration File - pam_radius_auth_file = RADIUS_PAM_AUTH_CONF_DIR + srv['ip'] + "_" + srv['auth_port'] + ".conf" - template_file = os.path.abspath(PAM_RADIUS_AUTH_CONF_TEMPLATE) - template = env.get_template(template_file) - pam_radius_auth_conf = template.render(server=srv) - - open(pam_radius_auth_file, 'a').close() - os.chmod(pam_radius_auth_file, 0o600) - with open(pam_radius_auth_file, 'w+') as f: - f.write(pam_radius_auth_conf) - - # Start the statistics service. Only RADIUS implemented - if ('radius' in authentication['login']) and ('statistics' in radius_global) and \ - radius_global['statistics']: - cmd = 'service aaastatsd start' - else: - cmd = 'service aaastatsd stop' - syslog.syslog(syslog.LOG_INFO, "cmd - {}".format(cmd)) - try: - subprocess.check_call(cmd, shell=True) - except subprocess.CalledProcessError as err: - syslog.syslog(syslog.LOG_ERR, - "{} - failed: return code - {}, output:\n{}" - .format(err.cmd, err.returncode, err.output)) - - -class PasswHardening(object): - def __init__(self): - self.passw_policies_default = {} - self.passw_policies = {} - - self.debug = False - self.trace = False - - def load(self, policies_conf): - for row in policies_conf: - self.passw_policies_update(row, policies_conf[row], modify_conf=False) - - self.modify_passw_conf_file() - - def passw_policies_update(self, key, data, modify_conf=True): - syslog.syslog(syslog.LOG_DEBUG, "passw_policies_update - key: {}".format(key)) - syslog.syslog(syslog.LOG_DEBUG, "passw_policies_update - data: {}".format(data)) - - if data == {}: - self.passw_policies = {} - else: - if 'reject_user_passw_match' in data: - data['reject_user_passw_match'] = is_true(data['reject_user_passw_match']) - if 'lower_class' in data: - data['lower_class'] = is_true(data['lower_class']) - if 'upper_class' in data: - data['upper_class'] = is_true(data['upper_class']) - if 'digits_class' in data: - data['digits_class'] = is_true(data['digits_class']) - if 'special_class' in data: - data['special_class'] = is_true(data['special_class']) - - if key == 'POLICIES': - self.passw_policies = data - - if modify_conf: - self.modify_passw_conf_file() - - def modify_single_file_inplace(self, filename, operations=None): - if operations: - cmd = "sed -i {0} {1}".format(' -i '.join(operations), filename) - syslog.syslog(syslog.LOG_DEBUG, "modify_single_file_inplace: cmd - {}".format(cmd)) - os.system(cmd) - - def set_passw_hardening_policies(self, passw_policies): - # Password Hardening flow - # When feature is enabled, the passw_policies from CONFIG_DB will be set in the pam files /etc/pam.d/common-password and /etc/login.def. - # When the feature is disabled, the files above will be generate with the linux default (without secured passw_policies). - syslog.syslog(syslog.LOG_DEBUG, "modify_conf_file: passw_policies - {}".format(passw_policies)) - - template_passwh_file = os.path.abspath(PAM_PASSWORD_CONF_TEMPLATE) - env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) - env.filters['sub'] = sub - template_passwh = env.get_template(template_passwh_file) - - # Render common-password file with passw hardening policies if any. Other render without them. - pam_passwh_conf = template_passwh.render(debug=self.debug, passw_policies=passw_policies) - - # Use rename(), which is atomic (on the same fs) to avoid empty file - with open(PAM_PASSWORD_CONF + ".tmp", 'w') as f: - f.write(pam_passwh_conf) - os.chmod(PAM_PASSWORD_CONF + ".tmp", 0o644) - os.rename(PAM_PASSWORD_CONF + ".tmp", PAM_PASSWORD_CONF) - - # Age policy - # When feature disabled or age policy disabled, expiry days policy should be as linux default, other, accoriding CONFIG_DB. - curr_expiration = LINUX_DEFAULT_PASS_MAX_DAYS - curr_expiration_warning = LINUX_DEFAULT_PASS_WARN_AGE - - if passw_policies: - if 'state' in passw_policies: - if passw_policies['state'] == 'enabled': - if 'expiration' in passw_policies: - if int(self.passw_policies['expiration']) != 0: # value '0' meaning age policy is disabled - # the logic is to modify the expiration time according the last updated modificatiion - # - curr_expiration = int(passw_policies['expiration']) - - if 'expiration_warning' in passw_policies: - if int(self.passw_policies['expiration_warning']) != 0: # value '0' meaning age policy is disabled - curr_expiration_warning = int(passw_policies['expiration_warning']) - - if self.is_passwd_aging_expire_update(curr_expiration, 'MAX_DAYS'): - # Set aging policy for existing users - self.passwd_aging_expire_modify(curr_expiration, 'MAX_DAYS') - - # Aging policy for new users - self.modify_single_file_inplace(ETC_LOGIN_DEF, ["\'/^PASS_MAX_DAYS/c\PASS_MAX_DAYS " +str(curr_expiration)+"\'"]) - - if self.is_passwd_aging_expire_update(curr_expiration_warning, 'WARN_DAYS'): - # Aging policy for existing users - self.passwd_aging_expire_modify(curr_expiration_warning, 'WARN_DAYS') - - # Aging policy for new users - self.modify_single_file_inplace(ETC_LOGIN_DEF, ["\'/^PASS_WARN_AGE/c\PASS_WARN_AGE " +str(curr_expiration_warning)+"\'"]) - - def passwd_aging_expire_modify(self, curr_expiration, age_type): - normal_accounts = self.get_normal_accounts() - if not normal_accounts: - syslog.syslog(syslog.LOG_ERR,"failed, no normal users found in /etc/passwd") - return - chage_flag = AGE_DICT[age_type]['CHAGE_FLAG'] - for normal_account in normal_accounts: - try: - chage_p_m = subprocess.Popen(('chage', chage_flag + str(curr_expiration), normal_account), stdout=subprocess.PIPE) - return_code_chage_p_m = chage_p_m.poll() - if return_code_chage_p_m != 0: - syslog.syslog(syslog.LOG_ERR, "failed: return code - {}".format(return_code_chage_p_m)) - - except subprocess.CalledProcessError as e: - syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(e.cmd, e.returncode, e.output)) - - def is_passwd_aging_expire_update(self, curr_expiration, age_type): - """ Function verify that the current age expiry policy values are equal from the old one - Return update_age_status 'True' value meaning that was a modification from the last time, and vice versa. - """ - update_age_status = False - days_num = None - regex_days = AGE_DICT[age_type]['REGEX_DAYS'] - days_type = AGE_DICT[age_type]['DAYS'] - if os.path.exists(ETC_LOGIN_DEF): - with open(ETC_LOGIN_DEF, 'r') as f: - login_def_data = f.readlines() - - for line in login_def_data: - m1 = re.match(regex_days, line) - if m1: - days_num = int(m1.group(days_type)) - break - - if curr_expiration != days_num: - update_age_status = True - - return update_age_status - - def get_normal_accounts(self): - # Get user list - try: - getent_out = subprocess.check_output(['getent', 'passwd']).decode('utf-8').split('\n') - except subprocess.CalledProcessError as err: - syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(err.cmd, err.returncode, err.output)) - return False - - # Get range of normal users - REGEX_UID_MAX = r'^UID_MAX[ \t]*(?P\d*)' - REGEX_UID_MIN = r'^UID_MIN[ \t]*(?P\d*)' - uid_max = None - uid_min = None - if os.path.exists(ETC_LOGIN_DEF): - with open(ETC_LOGIN_DEF, 'r') as f: - login_def_data = f.readlines() - - for line in login_def_data: - m1 = re.match(REGEX_UID_MAX, line) - m2 = re.match(REGEX_UID_MIN, line) - if m1: - uid_max = int(m1.group("uid_max")) - if m2: - uid_min = int(m2.group("uid_min")) - - if not uid_max or not uid_min: - syslog.syslog(syslog.LOG_ERR,"failed, no UID_MAX/UID_MIN founded in login.def file") - return False - - # Get normal user list - normal_accounts = [] - for account in getent_out[0:-1]: # last item is always empty - account_spl = account.split(':') - account_number = int(account_spl[2]) - if account_number >= uid_min and account_number <= uid_max: - normal_accounts.append(account_spl[ACCOUNT_NAME]) - - normal_accounts.append('root') # root is also a candidate to be age modify. - return normal_accounts - - def modify_passw_conf_file(self): - passw_policies = self.passw_policies_default.copy() - passw_policies.update(self.passw_policies) - - # set new Password Hardening policies. - self.set_passw_hardening_policies(passw_policies) - - -class KdumpCfg(object): - def __init__(self, CfgDb): - self.config_db = CfgDb - self.kdump_defaults = { "enabled" : "false", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M", - "num_dumps": "3" } - - def load(self, kdump_table): - """ - Set the KDUMP table in CFG DB to kdump_defaults if not set by the user - """ - syslog.syslog(syslog.LOG_INFO, "KdumpCfg init ...") - kdump_conf = kdump_table.get("config", {}) - for row in self.kdump_defaults: - value = self.kdump_defaults.get(row) - if not kdump_conf.get(row): - self.config_db.mod_entry("KDUMP", "config", {row : value}) - - def kdump_update(self, key, data): - syslog.syslog(syslog.LOG_INFO, "Kdump global configuration update") - if key == "config": - # Admin mode - kdump_enabled = self.kdump_defaults["enabled"] - if data.get("enabled") is not None: - kdump_enabled = data.get("enabled") - if kdump_enabled.lower() == "true": - enabled = True - else: - enabled = False - if enabled: - run_cmd("sonic-kdump-config --enable") - else: - run_cmd("sonic-kdump-config --disable") - - # Memory configuration - memory = self.kdump_defaults["memory"] - if data.get("memory") is not None: - memory = data.get("memory") - run_cmd("sonic-kdump-config --memory " + memory) - - # Num dumps - num_dumps = self.kdump_defaults["num_dumps"] - if data.get("num_dumps") is not None: - num_dumps = data.get("num_dumps") - run_cmd("sonic-kdump-config --num_dumps " + num_dumps) - -class NtpCfg(object): - """ - NtpCfg Config Daemon - 1) ntp-config.service handles the configuration updates and then starts ntp.service - 2) Both of them start after all the feature services start - 3) Purpose of this daemon is to propagate runtime config changes in - NTP, NTP_SERVER and LOOPBACK_INTERFACE - """ - def __init__(self): - self.ntp_global = {} - self.ntp_servers = set() - - def load(self, ntp_global_conf, ntp_server_conf): - syslog.syslog(syslog.LOG_INFO, "NtpCfg load ...") - - for row in ntp_global_conf: - self.ntp_global_update(row, ntp_global_conf[row], is_load=True) - - # Force reload on init - self.ntp_server_update(0, None, is_load=True) - - def handle_ntp_source_intf_chg(self, intf_name): - # if no ntp server configured, do nothing - if not self.ntp_servers: - return - - # check only the intf configured as source interface - if intf_name not in self.ntp_global.get('src_intf', '').split(';'): - return - else: - # just restart ntp config - cmd = 'systemctl restart ntp-config' - run_cmd(cmd) - - def ntp_global_update(self, key, data, is_load=False): - syslog.syslog(syslog.LOG_INFO, 'NTP GLOBAL Update') - orig_src = self.ntp_global.get('src_intf', '') - orig_src_set = set(orig_src.split(";")) - orig_vrf = self.ntp_global.get('vrf', '') - - new_src = data.get('src_intf', '') - new_src_set = set(new_src.split(";")) - new_vrf = data.get('vrf', '') - - # Update the Local Cache - self.ntp_global = data - - # If initial load don't restart daemon - if is_load: return - - # check if ntp server configured, if not, do nothing - if not self.ntp_servers: - syslog.syslog(syslog.LOG_INFO, "No ntp server when global config change, do nothing") - return - - if orig_src_set != new_src_set: - syslog.syslog(syslog.LOG_INFO, "ntp global update for source intf old {} new {}, restarting ntp-config" - .format(orig_src_set, new_src_set)) - cmd = 'systemctl restart ntp-config' - run_cmd(cmd) - elif new_vrf != orig_vrf: - syslog.syslog(syslog.LOG_INFO, "ntp global update for vrf old {} new {}, restarting ntp service" - .format(orig_vrf, new_vrf)) - cmd = 'service ntp restart' - run_cmd(cmd) - - def ntp_server_update(self, key, op, is_load=False): - syslog.syslog(syslog.LOG_INFO, 'ntp server update key {}'.format(key)) - - restart_config = False - if not is_load: - if op == "SET" and key not in self.ntp_servers: - restart_config = True - self.ntp_servers.add(key) - elif op == "DEL" and key in self.ntp_servers: - restart_config = True - self.ntp_servers.remove(key) - else: - restart_config = True - - if restart_config: - cmd = 'systemctl restart ntp-config' - syslog.syslog(syslog.LOG_INFO, 'ntp server update, restarting ntp-config, ntp servers configured {}'.format(self.ntp_servers)) - run_cmd(cmd) - -class PamLimitsCfg(object): - """ - PamLimit Config Daemon - 1) The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. - 2) Purpose of this daemon is to render pam_limits config file. - """ - def __init__(self, config_db): - self.config_db = config_db - self.hwsku = "" - self.type = "" - - # Load config from ConfigDb and render config file/ - def update_config_file(self): - device_metadata = self.config_db.get_table('DEVICE_METADATA') - if "localhost" not in device_metadata: - return - - self.read_localhost_config(device_metadata["localhost"]) - self.render_conf_file() - - # Read localhost config - def read_localhost_config(self, localhost): - if "hwsku" in localhost: - self.hwsku = localhost["hwsku"] - else: - self.hwsku = "" - - if "type" in localhost: - self.type = localhost["type"] - else: - self.type = "" - - # Render pam_limits config files - def render_conf_file(self): - env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) - env.filters['sub'] = sub - - try: - template_file = os.path.abspath(PAM_LIMITS_CONF_TEMPLATE) - template = env.get_template(template_file) - pam_limits_conf = template.render( - hwsku=self.hwsku, - type=self.type) - with open(PAM_LIMITS_CONF, 'w') as f: - f.write(pam_limits_conf) - - template_file = os.path.abspath(LIMITS_CONF_TEMPLATE) - template = env.get_template(template_file) - limits_conf = template.render( - hwsku=self.hwsku, - type=self.type) - with open(LIMITS_CONF, 'w') as f: - f.write(limits_conf) - except Exception as e: - syslog.syslog(syslog.LOG_ERR, - "modify pam_limits config file failed with exception: {}" - .format(e)) - -class HostConfigDaemon: - def __init__(self): - # Just a sanity check to verify if the CONFIG_DB has been initialized - # before moving forward - self.config_db = ConfigDBConnector() - self.config_db.connect(wait_for_init=True, retry_on=True) - syslog.syslog(syslog.LOG_INFO, 'ConfigDB connect success') - - # Load DEVICE metadata configurations - self.device_config = {} - self.device_config['DEVICE_METADATA'] = self.config_db.get_table('DEVICE_METADATA') - - # Load feature state table - self.state_db_conn = DBConnector(STATE_DB, 0) - feature_state_table = Table(self.state_db_conn, 'FEATURE') - - # Initialize KDump Config and set the config to default if nothing is provided - self.kdumpCfg = KdumpCfg(self.config_db) - - # Initialize IpTables - self.iptables = Iptables() - - # Intialize Feature Handler - self.feature_handler = FeatureHandler(self.config_db, feature_state_table, self.device_config) - - # Initialize Ntp Config Handler - self.ntpcfg = NtpCfg() - - self.is_multi_npu = device_info.is_multi_npu() - - # Initialize AAACfg - self.hostname_cache="" - self.aaacfg = AaaCfg() - - # Initialize PasswHardening - self.passwcfg = PasswHardening() - - # Initialize PamLimitsCfg - self.pamLimitsCfg = PamLimitsCfg(self.config_db) - self.pamLimitsCfg.update_config_file() - - def load(self, init_data): - features = init_data['FEATURE'] - aaa = init_data['AAA'] - tacacs_global = init_data['TACPLUS'] - tacacs_server = init_data['TACPLUS_SERVER'] - radius_global = init_data['RADIUS'] - radius_server = init_data['RADIUS_SERVER'] - lpbk_table = init_data['LOOPBACK_INTERFACE'] - ntp_server = init_data['NTP_SERVER'] - ntp_global = init_data['NTP'] - kdump = init_data['KDUMP'] - passwh = init_data['PASSW_HARDENING'] - - self.feature_handler.sync_state_field(features) - self.aaacfg.load(aaa, tacacs_global, tacacs_server, radius_global, radius_server) - self.iptables.load(lpbk_table) - self.ntpcfg.load(ntp_global, ntp_server) - self.kdumpCfg.load(kdump) - self.passwcfg.load(passwh) - - dev_meta = self.config_db.get_table('DEVICE_METADATA') - if 'localhost' in dev_meta: - if 'hostname' in dev_meta['localhost']: - self.hostname_cache = dev_meta['localhost']['hostname'] - - # Update AAA with the hostname - self.aaacfg.hostname_update(self.hostname_cache) - - def __get_intf_name(self, key): - if isinstance(key, tuple) and key: - intf = key[0] - else: - intf = key - return intf - - def aaa_handler(self, key, op, data): - self.aaacfg.aaa_update(key, data) - syslog.syslog(syslog.LOG_INFO, 'AAA Update: key: {}, op: {}, data: {}'.format(key, op, data)) - - def passwh_handler(self, key, op, data): - self.passwcfg.passw_policies_update(key, data) - syslog.syslog(syslog.LOG_INFO, 'PASSW_HARDENING Update: key: {}, op: {}, data: {}'.format(key, op, data)) - - def tacacs_server_handler(self, key, op, data): - self.aaacfg.tacacs_server_update(key, data) - log_data = copy.deepcopy(data) - if 'passkey' in log_data: - log_data['passkey'] = obfuscate(log_data['passkey']) - syslog.syslog(syslog.LOG_INFO, 'TACPLUS_SERVER update: key: {}, op: {}, data: {}'.format(key, op, log_data)) - - def tacacs_global_handler(self, key, op, data): - self.aaacfg.tacacs_global_update(key, data) - log_data = copy.deepcopy(data) - if 'passkey' in log_data: - log_data['passkey'] = obfuscate(log_data['passkey']) - syslog.syslog(syslog.LOG_INFO, 'TACPLUS Global update: key: {}, op: {}, data: {}'.format(key, op, log_data)) - - def radius_server_handler(self, key, op, data): - self.aaacfg.radius_server_update(key, data) - log_data = copy.deepcopy(data) - if 'passkey' in log_data: - log_data['passkey'] = obfuscate(log_data['passkey']) - syslog.syslog(syslog.LOG_INFO, 'RADIUS_SERVER update: key: {}, op: {}, data: {}'.format(key, op, log_data)) - - def radius_global_handler(self, key, op, data): - self.aaacfg.radius_global_update(key, data) - log_data = copy.deepcopy(data) - if 'passkey' in log_data: - log_data['passkey'] = obfuscate(log_data['passkey']) - syslog.syslog(syslog.LOG_INFO, 'RADIUS Global update: key: {}, op: {}, data: {}'.format(key, op, log_data)) - - def mgmt_intf_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - mgmt_intf_name = self.__get_intf_name(key) - self.aaacfg.handle_radius_source_intf_ip_chg(mgmt_intf_name) - self.aaacfg.handle_radius_nas_ip_chg(mgmt_intf_name) - - def lpbk_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - if op == "DEL": - add = False - else: - add = True - - self.iptables.iptables_handler(key, data, add) - lpbk_name = self.__get_intf_name(key) - self.ntpcfg.handle_ntp_source_intf_chg(lpbk_name) - self.aaacfg.handle_radius_source_intf_ip_chg(key) - - def vlan_intf_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - self.aaacfg.handle_radius_source_intf_ip_chg(key) - - def vlan_sub_intf_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - self.aaacfg.handle_radius_source_intf_ip_chg(key) - - def portchannel_intf_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - self.aaacfg.handle_radius_source_intf_ip_chg(key) - - def phy_intf_handler(self, key, op, data): - key = ConfigDBConnector.deserialize_key(key) - self.aaacfg.handle_radius_source_intf_ip_chg(key) - - def ntp_server_handler(self, key, op, data): - self.ntpcfg.ntp_server_update(key, op) - - def ntp_global_handler(self, key, op, data): - self.ntpcfg.ntp_global_update(key, data) - - def kdump_handler (self, key, op, data): - syslog.syslog(syslog.LOG_INFO, 'Kdump handler...') - self.kdumpCfg.kdump_update(key, data) - - def wait_till_system_init_done(self): - # No need to print the output in the log file so using the "--quiet" - # flag - systemctl_cmd = "sudo systemctl is-system-running --wait --quiet" - subprocess.call(systemctl_cmd, shell=True) - - def register_callbacks(self): - - def make_callback(func): - def callback(table, key, data): - if data is None: - op = "DEL" - else: - op = "SET" - return func(key, op, data) - return callback - - self.config_db.subscribe('KDUMP', make_callback(self.kdump_handler)) - # Handle FEATURE updates before other tables - self.config_db.subscribe('FEATURE', make_callback(self.feature_handler.handler)) - # Handle AAA, TACACS and RADIUS related tables - self.config_db.subscribe('AAA', make_callback(self.aaa_handler)) - self.config_db.subscribe('TACPLUS', make_callback(self.tacacs_global_handler)) - self.config_db.subscribe('TACPLUS_SERVER', make_callback(self.tacacs_server_handler)) - self.config_db.subscribe('RADIUS', make_callback(self.radius_global_handler)) - self.config_db.subscribe('RADIUS_SERVER', make_callback(self.radius_server_handler)) - self.config_db.subscribe('PASSW_HARDENING', make_callback(self.passwh_handler)) - # Handle IPTables configuration - self.config_db.subscribe('LOOPBACK_INTERFACE', make_callback(self.lpbk_handler)) - # Handle NTP & NTP_SERVER updates - self.config_db.subscribe('NTP', make_callback(self.ntp_global_handler)) - self.config_db.subscribe('NTP_SERVER', make_callback(self.ntp_server_handler)) - # Handle updates to src intf changes in radius - self.config_db.subscribe('MGMT_INTERFACE', make_callback(self.mgmt_intf_handler)) - self.config_db.subscribe('VLAN_INTERFACE', make_callback(self.vlan_intf_handler)) - self.config_db.subscribe('VLAN_SUB_INTERFACE', make_callback(self.vlan_sub_intf_handler)) - self.config_db.subscribe('PORTCHANNEL_INTERFACE', make_callback(self.portchannel_intf_handler)) - self.config_db.subscribe('INTERFACE', make_callback(self.phy_intf_handler)) - - syslog.syslog(syslog.LOG_INFO, - "Waiting for systemctl to finish initialization") - self.wait_till_system_init_done() - syslog.syslog(syslog.LOG_INFO, - "systemctl has finished initialization -- proceeding ...") - - def start(self): - self.config_db.listen(init_data_handler=self.load) - - -def main(): - signal.signal(signal.SIGTERM, signal_handler) - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGHUP, signal_handler) - daemon = HostConfigDaemon() - daemon.register_callbacks() - daemon.start() - -if __name__ == "__main__": - main() - diff --git a/src/sonic-host-services/scripts/procdockerstatsd b/src/sonic-host-services/scripts/procdockerstatsd deleted file mode 100755 index da6fa433e325..000000000000 --- a/src/sonic-host-services/scripts/procdockerstatsd +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/bin/env python3 -''' -procdockerstatsd -Daemon which periodically gathers process and docker statistics and pushes the data to STATE_DB -''' - -import os -import re -import subprocess -import sys -import time -from datetime import datetime - -from sonic_py_common import daemon_base -from swsscommon import swsscommon - -VERSION = '1.0' - -SYSLOG_IDENTIFIER = "procdockerstatsd" - -REDIS_HOSTIP = "127.0.0.1" - - -class ProcDockerStats(daemon_base.DaemonBase): - - def __init__(self, log_identifier): - super(ProcDockerStats, self).__init__(log_identifier) - self.state_db = swsscommon.SonicV2Connector(host=REDIS_HOSTIP) - self.state_db.connect("STATE_DB") - - def run_command(self, cmd): - proc = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - if proc.returncode != 0: - self.log_error("Error running command '{}'".format(cmd)) - return None - else: - return stdout - - def format_docker_cmd_output(self, cmdout): - lines = cmdout.splitlines() - keys = re.split(" +", lines[0]) - docker_data = dict() - docker_data_list = [] - for line in lines[1:]: - values = re.split(" +", line) - docker_data = {key: value for key, value in zip(keys, values)} - docker_data_list.append(docker_data) - formatted_dict = self.create_docker_dict(docker_data_list) - return formatted_dict - - def format_process_cmd_output(self, cmdout): - lines = cmdout.splitlines() - keys = re.split(" +", lines[0]) - key_list = [key for key in keys if key] - process_data = dict() - process_data_list = [] - for line in lines[1:]: - values = re.split(" +", line) - # To remove extra space before UID - val_list = [val for val in values if val] - # Merging extra columns created due to space in cmd ouput - val_list[8:] = [' '.join(val_list[8:])] - process_data = {key: value for key, value in zip(key_list, val_list)} - process_data_list.append(process_data) - return process_data_list - - def convert_to_bytes(self, value): - UNITS_B = 'B' - UNITS_KB = 'KB' - UNITS_MB = 'MB' - UNITS_MiB = 'MiB' - UNITS_GiB = 'GiB' - - res = re.match(r'(\d+\.?\d*)([a-zA-Z]+)', value) - value = float(res.groups()[0]) - units = res.groups()[1] - if units.lower() == UNITS_KB.lower(): - value *= 1000 - elif units.lower() == UNITS_MB.lower(): - value *= (1000 * 1000) - elif units.lower() == UNITS_MiB.lower(): - value *= (1024 * 1024) - elif units.lower() == UNITS_GiB.lower(): - value *= (1024 * 1024 * 1024) - - return int(round(value)) - - def create_docker_dict(self, dict_list): - dockerdict = {} - for row in dict_list[0:]: - cid = row.get('CONTAINER ID') - if cid: - key = 'DOCKER_STATS|{}'.format(cid) - dockerdict[key] = {} - dockerdict[key]['NAME'] = row.get('NAME') - - cpu = row.get('CPU %').split("%") - dockerdict[key]['CPU%'] = str(cpu[0]) - - memuse = row.get('MEM USAGE / LIMIT').split(" / ") - # converting MiB and GiB to bytes - dockerdict[key]['MEM_BYTES'] = str(self.convert_to_bytes(memuse[0])) - dockerdict[key]['MEM_LIMIT_BYTES'] = str(self.convert_to_bytes(memuse[1])) - - mem = row.get('MEM %').split("%") - dockerdict[key]['MEM%'] = str(mem[0]) - - netio = row.get('NET I/O').split(" / ") - dockerdict[key]['NET_IN_BYTES'] = str(self.convert_to_bytes(netio[0])) - dockerdict[key]['NET_OUT_BYTES'] = str(self.convert_to_bytes(netio[1])) - - blockio = row.get('BLOCK I/O').split(" / ") - dockerdict[key]['BLOCK_IN_BYTES'] = str(self.convert_to_bytes(blockio[0])) - dockerdict[key]['BLOCK_OUT_BYTES'] = str(self.convert_to_bytes(blockio[1])) - - dockerdict[key]['PIDS'] = row.get('PIDS') - return dockerdict - - def update_dockerstats_command(self): - cmd = "docker stats --no-stream -a" - data = self.run_command(cmd) - if not data: - self.log_error("'{}' returned null output".format(cmd)) - return False - dockerdata = self.format_docker_cmd_output(data) - if not dockerdata: - self.log_error("formatting for docker output failed") - return False - # wipe out all data from state_db before updating - self.state_db.delete_all_by_pattern('STATE_DB', 'DOCKER_STATS|*') - for k1,v1 in dockerdata.items(): - for k2,v2 in v1.items(): - self.update_state_db(k1, k2, v2) - return True - - def update_processstats_command(self): - data = self.run_command("ps -eo uid,pid,ppid,%mem,%cpu,stime,tty,time,cmd --sort -%cpu | head -1024") - processdata = self.format_process_cmd_output(data) - value = "" - # wipe out all data before updating with new values - self.state_db.delete_all_by_pattern('STATE_DB', 'PROCESS_STATS|*') - for row in processdata[0:]: - cid = row.get('PID') - if cid: - value = 'PROCESS_STATS|{}'.format(cid) - uid = row.get('UID') - self.update_state_db(value, 'UID', uid) - ppid = row.get('PPID') - self.update_state_db(value, 'PPID', ppid) - cpu = row.get('%CPU') - self.update_state_db(value, '%CPU', str(cpu)) - mem = row.get('%MEM') - self.update_state_db(value, '%MEM', str(mem)) - stime = row.get('STIME') - self.update_state_db(value, 'STIME', stime) - tty = row.get('TT') - self.update_state_db(value, 'TT', tty) - time = row.get('TIME') - self.update_state_db(value, 'TIME', time) - cmd = row.get('CMD') - self.update_state_db(value, 'CMD', cmd) - - def update_state_db(self, key1, key2, value2): - self.state_db.set('STATE_DB', key1, key2, value2) - - def run(self): - self.log_info("Starting up ...") - - if not os.getuid() == 0: - self.log_error("Must be root to run this daemon") - print("Must be root to run this daemon") - sys.exit(1) - - while True: - self.update_dockerstats_command() - datetimeobj = datetime.now() - # Adding key to store latest update time. - self.update_state_db('DOCKER_STATS|LastUpdateTime', 'lastupdate', str(datetimeobj)) - self.update_processstats_command() - self.update_state_db('PROCESS_STATS|LastUpdateTime', 'lastupdate', str(datetimeobj)) - - # Data need to be updated every 2 mins. hence adding delay of 120 seconds - time.sleep(120) - - self.log_info("Exiting ...") - - -def main(): - # Instantiate a ProcDockerStats object - pd = ProcDockerStats(SYSLOG_IDENTIFIER) - - # Log all messages from INFO level and higher - pd.set_min_log_priority_info() - - pd.run() - - -if __name__ == '__main__': - main() diff --git a/src/sonic-host-services/scripts/process-reboot-cause b/src/sonic-host-services/scripts/process-reboot-cause deleted file mode 100755 index df43a131faa9..000000000000 --- a/src/sonic-host-services/scripts/process-reboot-cause +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# -# process-reboot-cause -# -# Program designed to read the previous reboot-cause files, log the last previous reboot-cause. -# And read the saved reboot-cause history files and save the reboot cause in the state-db. -# - -try: - import json - import os - import pwd - import sys - - from swsscommon import swsscommon - from sonic_py_common import logger -except ImportError as err: - raise ImportError("%s - required module not found" % str(err)) - -VERSION = "1.0" - -SYSLOG_IDENTIFIER = "process-reboot-cause" - -REBOOT_CAUSE_DIR = "/host/reboot-cause/" -REBOOT_CAUSE_HISTORY_DIR = "/host/reboot-cause/history/" -PREVIOUS_REBOOT_CAUSE_FILE = os.path.join(REBOOT_CAUSE_DIR, "previous-reboot-cause.json") -USER_ISSUED_REBOOT_CAUSE_REGEX ="User issued \'{}\' command [User: {}, Time: {}]" - -REBOOT_CAUSE_UNKNOWN = "Unknown" -REBOOT_CAUSE_TABLE_NAME = "REBOOT_CAUSE" - -REDIS_HOSTIP = "127.0.0.1" -state_db = None - -# Global logger class instance -sonic_logger = logger.Logger(SYSLOG_IDENTIFIER) - - -# ============================= Functions ============================= -def read_reboot_cause_files_and_save_state_db(): - # Connect State DB - state_db = swsscommon.SonicV2Connector(host=REDIS_HOSTIP) - state_db.connect(state_db.STATE_DB) - - # Sort the previous reboot cause files by creation time - REBOOT_FILE_LIST = [os.path.join(REBOOT_CAUSE_HISTORY_DIR, i) for i in os.listdir(REBOOT_CAUSE_HISTORY_DIR)] - TIME_SORTED_FULL_REBOOT_FILE_LIST = sorted(REBOOT_FILE_LIST, key=os.path.getmtime, reverse=True) - - data = [] - # Read each sorted previous reboot cause file and update the state db with previous reboot cause information - for i in range(min(10, len(TIME_SORTED_FULL_REBOOT_FILE_LIST))): - x = TIME_SORTED_FULL_REBOOT_FILE_LIST[i] - if os.path.isfile(x): - with open(x, "r") as cause_file: - data = json.load(cause_file) - _hash = '{}|{}'.format(REBOOT_CAUSE_TABLE_NAME, data['gen_time']) - state_db.set(state_db.STATE_DB, _hash, 'cause', data['cause']) - state_db.set(state_db.STATE_DB, _hash, 'time', data['time']) - state_db.set(state_db.STATE_DB, _hash, 'user', data['user']) - state_db.set(state_db.STATE_DB, _hash, 'comment', data['comment']) - - if len(TIME_SORTED_FULL_REBOOT_FILE_LIST) > 10: - for i in range(len(TIME_SORTED_FULL_REBOOT_FILE_LIST)): - if i >= 10: - x = TIME_SORTED_FULL_REBOOT_FILE_LIST[i] - os.remove(x) - - -def main(): - # Configure logger to log all messages INFO level and higher - sonic_logger.set_min_log_priority_info() - - sonic_logger.log_info("Starting up...") - - if not os.geteuid() == 0: - sonic_logger.log_error("User {} does not have permission to execute".format(pwd.getpwuid(os.getuid()).pw_name)) - sys.exit("This utility must be run as root") - - # Set a default previous reboot cause - previous_reboot_cause = REBOOT_CAUSE_UNKNOWN - - # Read the most recent reboot cause file and log data to syslog - if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE): - with open(PREVIOUS_REBOOT_CAUSE_FILE, "r") as last_cause_file: - data = json.load(last_cause_file) - if data['user']: - previous_reboot_cause = USER_ISSUED_REBOOT_CAUSE_REGEX.format(data['cause'], data['user'], data['time']) - else: - previous_reboot_cause = "{}".format(data['cause']) - - # Log the last reboot cause to the syslog - sonic_logger.log_info("Previous reboot cause: {}".format(previous_reboot_cause)) - - if os.path.exists(REBOOT_CAUSE_HISTORY_DIR): - # Read the previous reboot cause from saved reboot-cause files and save the previous reboot cause upto 10 entry to the state db - read_reboot_cause_files_and_save_state_db() - - -if __name__ == "__main__": - main() diff --git a/src/sonic-host-services/scripts/sonic-host-server b/src/sonic-host-services/scripts/sonic-host-server deleted file mode 100755 index bf4449e34eda..000000000000 --- a/src/sonic-host-services/scripts/sonic-host-server +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -"""Host Service to handle docker-to-host communication""" - -import os -import os.path -import glob -import importlib -import sys - -import dbus -import dbus.service -import dbus.mainloop.glib - -from gi.repository import GObject - -def find_module_path(): - """Find path for host_moduels""" - try: - from host_modules import host_service - return os.path.dirname(host_service.__file__) - except ImportError as e: - return None - -def register_modules(mod_path): - """Register all host modules""" - sys.path.append(mod_path) - for mod_file in glob.glob(os.path.join(mod_path, '*.py')): - if os.path.isfile(mod_file) and not mod_file.endswith('__init__.py'): - mod_name = os.path.basename(mod_file)[:-3] - module = importlib.import_module(mod_name) - - register_cb = getattr(module, 'register', None) - if not register_cb: - raise Exception('Missing register function for ' + mod_name) - - register_dbus(register_cb) - -def register_dbus(register_cb): - """Register DBus handlers for individual modules""" - handler_class, mod_name = register_cb() - handlers[mod_name] = handler_class(mod_name) - -# Create a main loop reactor -GObject.threads_init() -dbus.mainloop.glib.threads_init() -dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) -loop = GObject.MainLoop() -handlers = {} - -class SignalManager(object): - ''' This is used to manage signals received (e.g. SIGINT). - When stopping a process (systemctl stop [service]), systemd sends - a SIGTERM signal. - ''' - shutdown = False - def __init__(self): - ''' Install signal handlers. - - SIGTERM is invoked when systemd wants to stop the daemon. - For example, "systemctl stop mydaemon.service" - or, "systemctl restart mydaemon.service" - - ''' - import signal - signal.signal(signal.SIGTERM, self.sigterm_hdlr) - - def sigterm_hdlr(self, _signum, _frame): - self.shutdown = True - loop.quit() - -sigmgr = SignalManager() -mod_path = find_module_path() -if mod_path is not None: - register_modules(mod_path) - -# Only run if we actually have some handlers -if handlers: - import systemd.daemon - systemd.daemon.notify("READY=1") - - while not sigmgr.shutdown: - loop.run() - if sigmgr.shutdown: - break - - systemd.daemon.notify("STOPPING=1") -else: - print("No handlers to register, quitting...") diff --git a/src/sonic-host-services/setup.cfg b/src/sonic-host-services/setup.cfg deleted file mode 100644 index b7e478982ccf..000000000000 --- a/src/sonic-host-services/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[aliases] -test=pytest diff --git a/src/sonic-host-services/setup.py b/src/sonic-host-services/setup.py deleted file mode 100644 index 9ed9e1082a0c..000000000000 --- a/src/sonic-host-services/setup.py +++ /dev/null @@ -1,57 +0,0 @@ -from setuptools import setup - -setup( - name = 'sonic-host-services', - version = '1.0', - description = 'Python services which run in the SONiC host OS', - license = 'Apache 2.0', - author = 'SONiC Team', - author_email = 'linuxnetdev@microsoft.com', - url = 'https://github.com/Azure/sonic-buildimage', - maintainer = 'Joe LeVeque', - maintainer_email = 'jolevequ@microsoft.com', - packages = [ - 'host_modules' - ], - scripts = [ - 'scripts/caclmgrd', - 'scripts/hostcfgd', - 'scripts/aaastatsd', - 'scripts/procdockerstatsd', - 'scripts/determine-reboot-cause', - 'scripts/process-reboot-cause', - 'scripts/sonic-host-server' - ], - install_requires = [ - 'dbus-python', - 'systemd-python', - 'Jinja2>=2.10', - 'PyGObject', - 'sonic-py-common' - ], - setup_requires = [ - 'pytest-runner', - 'wheel' - ], - tests_require = [ - 'parameterized', - 'pytest', - 'pyfakefs', - 'sonic-py-common', - 'deepdiff' - ], - classifiers = [ - 'Development Status :: 3 - Alpha', - 'Environment :: Console', - 'Intended Audience :: Developers', - 'Intended Audience :: Information Technology', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: Apache Software License', - 'Natural Language :: English', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python :: 3.7', - 'Topic :: System', - ], - keywords = 'sonic SONiC host services', - test_suite = 'setup.get_test_suite' -) diff --git a/src/sonic-host-services/tests/__init__.py b/src/sonic-host-services/tests/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/src/sonic-host-services/tests/caclmgrd/__init__.py b/src/sonic-host-services/tests/caclmgrd/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py deleted file mode 100644 index 358d4c413b9c..000000000000 --- a/src/sonic-host-services/tests/caclmgrd/caclmgrd_bfd_test.py +++ /dev/null @@ -1,50 +0,0 @@ -import os -import sys -import swsscommon - -from parameterized import parameterized -from sonic_py_common.general import load_module_from_source -from unittest import TestCase, mock -from pyfakefs.fake_filesystem_unittest import patchfs - -from .test_bfd_vectors import CACLMGRD_BFD_TEST_VECTOR -from tests.common.mock_configdb import MockConfigDb -from unittest.mock import MagicMock, patch - -DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' - -class TestCaclmgrdBfd(TestCase): - """ - Test caclmgrd bfd - """ - def setUp(self): - swsscommon.swsscommon.ConfigDBConnector = MockConfigDb - test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - modules_path = os.path.dirname(test_path) - scripts_path = os.path.join(modules_path, "scripts") - sys.path.insert(0, modules_path) - caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') - self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) - - @parameterized.expand(CACLMGRD_BFD_TEST_VECTOR) - @patchfs - def test_caclmgrd_bfd(self, test_name, test_data, fs): - if not os.path.exists(DBCONFIG_PATH): - fs.create_file(DBCONFIG_PATH) # fake database_config.json - - MockConfigDb.set_config_db(test_data["config_db"]) - - with mock.patch("caclmgrd.subprocess") as mocked_subprocess: - popen_mock = mock.Mock() - popen_attrs = test_data["popen_attributes"] - popen_mock.configure_mock(**popen_attrs) - mocked_subprocess.Popen.return_value = popen_mock - mocked_subprocess.PIPE = -1 - - call_rc = test_data["call_rc"] - mocked_subprocess.call.return_value = call_rc - - caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") - caclmgrd_daemon.allow_bfd_protocol('') - mocked_subprocess.Popen.assert_has_calls(test_data["expected_subprocess_calls"], any_order=True) - diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py deleted file mode 100644 index a6eae7ba1230..000000000000 --- a/src/sonic-host-services/tests/caclmgrd/caclmgrd_dhcp_test.py +++ /dev/null @@ -1,53 +0,0 @@ -import os -import sys -import swsscommon - -from parameterized import parameterized -from sonic_py_common.general import load_module_from_source -from unittest import TestCase, mock -from pyfakefs.fake_filesystem_unittest import patchfs - -from .test_dhcp_vectors import CACLMGRD_DHCP_TEST_VECTOR -from tests.common.mock_configdb import MockConfigDb - -DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' - -class TestCaclmgrdDhcp(TestCase): - """ - Test caclmgrd dhcp - """ - def setUp(self): - swsscommon.ConfigDBConnector = MockConfigDb - test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - modules_path = os.path.dirname(test_path) - scripts_path = os.path.join(modules_path, "scripts") - sys.path.insert(0, modules_path) - caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') - self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) - - @parameterized.expand(CACLMGRD_DHCP_TEST_VECTOR) - @patchfs - def test_caclmgrd_dhcp(self, test_name, test_data, fs): - if not os.path.exists(DBCONFIG_PATH): - fs.create_file(DBCONFIG_PATH) # fake database_config.json - - MockConfigDb.set_config_db(test_data["config_db"]) - - with mock.patch("caclmgrd.subprocess") as mocked_subprocess: - popen_mock = mock.Mock() - popen_attrs = test_data["popen_attributes"] - popen_mock.configure_mock(**popen_attrs) - mocked_subprocess.Popen.return_value = popen_mock - - call_rc = test_data["call_rc"] - mocked_subprocess.call.return_value = call_rc - - mark = test_data["mark"] - - caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") - mux_update = test_data["mux_update"] - - for key,data in mux_update: - caclmgrd_daemon.update_dhcp_acl(key, '', data, mark) - - mocked_subprocess.call.assert_has_calls(test_data["expected_subprocess_calls"], any_order=False) diff --git a/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py b/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py deleted file mode 100644 index b162ed01b586..000000000000 --- a/src/sonic-host-services/tests/caclmgrd/caclmgrd_feature_test.py +++ /dev/null @@ -1,50 +0,0 @@ -import os -import sys -import swsscommon - -from parameterized import parameterized -from sonic_py_common.general import load_module_from_source -from unittest import TestCase, mock -from pyfakefs.fake_filesystem_unittest import patchfs - -from .test_bfd_vectors import CACLMGRD_BFD_TEST_VECTOR -from tests.common.mock_configdb import MockConfigDb -from unittest.mock import MagicMock, patch - -DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json' - -class TestFeature(TestCase): - """ - Test caclmgrd feature present - """ - def setUp(self): - swsscommon.swsscommon.ConfigDBConnector = MockConfigDb - test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - modules_path = os.path.dirname(test_path) - scripts_path = os.path.join(modules_path, "scripts") - sys.path.insert(0, modules_path) - caclmgrd_path = os.path.join(scripts_path, 'caclmgrd') - self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path) - - @parameterized.expand(CACLMGRD_BFD_TEST_VECTOR) - @patchfs - def test_feature_present(self, test_name, test_data, fs): - if not os.path.exists(DBCONFIG_PATH): - fs.create_file(DBCONFIG_PATH) # fake database_config.json - - MockConfigDb.set_config_db(test_data["config_db"]) - - with mock.patch("caclmgrd.subprocess") as mocked_subprocess: - popen_mock = mock.Mock() - popen_attrs = test_data["popen_attributes"] - popen_mock.configure_mock(**popen_attrs) - mocked_subprocess.Popen.return_value = popen_mock - mocked_subprocess.PIPE = -1 - - call_rc = test_data["call_rc"] - mocked_subprocess.call.return_value = call_rc - - caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd") - caclmgrd_daemon.update_feature_present() - self.assertTrue("bgp" in caclmgrd_daemon.feature_present) - self.assertEqual(caclmgrd_daemon.feature_present["bgp"], True) diff --git a/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py b/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py deleted file mode 100644 index f7469376331d..000000000000 --- a/src/sonic-host-services/tests/caclmgrd/test_bfd_vectors.py +++ /dev/null @@ -1,35 +0,0 @@ -from unittest.mock import call -import subprocess - -""" - caclmgrd bfd test vector -""" -CACLMGRD_BFD_TEST_VECTOR = [ - [ - "BFD_SESSION_TEST", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - "bgp": { - "auto_restart": "enabled", - "state": "enabled", - } - }, - }, - "expected_subprocess_calls": [ - call("iptables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT", shell=True, universal_newlines=True, stdout=subprocess.PIPE), - call("ip6tables -I INPUT 2 -p udp -m multiport --dports 3784,4784 -j ACCEPT", shell=True, universal_newlines=True, stdout=subprocess.PIPE) - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - } - ] -] diff --git a/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py b/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py deleted file mode 100644 index 242faae34d09..000000000000 --- a/src/sonic-host-services/tests/caclmgrd/test_dhcp_vectors.py +++ /dev/null @@ -1,340 +0,0 @@ -from unittest.mock import call - -""" - caclmgrd dhcp test vector -""" -CACLMGRD_DHCP_TEST_VECTOR = [ - [ - "Active_Present_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "active"}), - ("Ethernet8", {"state": "active"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --delete DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - call("iptables --delete DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": None, - }, - ], - [ - "Active_Present_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "active"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - call("iptables --delete DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": "0x67004", - }, - ], - [ - "Active_Absent_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "active"}), - ("Ethernet8", {"state": "active"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": None, - }, - ], - [ - "Active_Absent_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "active"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": "0x67004", - }, - ], - [ - "Standby_Present_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "standby"}), - ("Ethernet8", {"state": "standby"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": None, - }, - ], - [ - "Standby_Present_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "standby"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": "0x67004", - }, - ], - [ - "Standby_Absent_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "standby"}), - ("Ethernet8", {"state": "standby"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --insert DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - call("iptables --insert DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": None, - }, - ], - [ - "Standby_Absent_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "standby"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - call("iptables --insert DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": "0x67004", - }, - ], - [ - "Unknown_Present_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "unknown"}), - ("Ethernet8", {"state": "unknown"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --delete DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - call("iptables --delete DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": None, - }, - ], - [ - "Unknown_Present_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "unknown"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - call("iptables --delete DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 0, - "mark": "0x67004", - }, - ], - [ - "Uknown_Absent_Interface", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "unknown"}), - ("Ethernet8", {"state": "unknown"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m physdev --physdev-in Ethernet4 -j DROP", shell=True), - call("iptables --check DHCP -m physdev --physdev-in Ethernet8 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": None, - }, - ], - [ - "Uknown_Absent_Mark", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "FEATURE": { - }, - }, - "mux_update": [ - ("Ethernet4", {"state": "unknown"}), - ], - "expected_subprocess_calls": [ - call("iptables --check DHCP -m mark --mark 0x67004 -j DROP", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error'), - }, - "call_rc": 1, - "mark": "0x67004", - }, - ], -] diff --git a/src/sonic-host-services/tests/common/mock_configdb.py b/src/sonic-host-services/tests/common/mock_configdb.py deleted file mode 100644 index f0b12b11abf9..000000000000 --- a/src/sonic-host-services/tests/common/mock_configdb.py +++ /dev/null @@ -1,58 +0,0 @@ -class MockConfigDb(object): - """ - Mock Config DB which responds to data tables requests and store updates to the data table - """ - STATE_DB = None - CONFIG_DB = None - event_queue = [] - - def __init__(self, **kwargs): - self.handlers = {} - - @staticmethod - def set_config_db(test_config_db): - MockConfigDb.CONFIG_DB = test_config_db - - @staticmethod - def deserialize_key(key, separator="|"): - tokens = key.split(separator) - if len(tokens) > 1: - return tuple(tokens) - else: - return key - - @staticmethod - def get_config_db(): - return MockConfigDb.CONFIG_DB - - def connect(self, wait_for_init=True, retry_on=True): - pass - - def get(self, db_id, key, field): - return MockConfigDb.CONFIG_DB[key][field] - - def get_entry(self, key, field): - return MockConfigDb.CONFIG_DB[key][field] - - def mod_entry(self, key, field, data): - existing_data = self.get_entry(key, field) - existing_data.update(data) - self.set_entry(key, field, existing_data) - - def set_entry(self, key, field, data): - MockConfigDb.CONFIG_DB[key][field] = data - - def get_table(self, table_name): - return MockConfigDb.CONFIG_DB[table_name] - - def subscribe(self, table_name, callback): - self.handlers[table_name] = callback - - def listen(self, init_data_handler=None): - for e in MockConfigDb.event_queue: - self.handlers[e[0]](e[0], e[1], self.get_entry(e[0], e[1])) - - -class MockDBConnector(): - def __init__(self, db, val): - pass diff --git a/src/sonic-host-services/tests/determine-reboot-cause_test.py b/src/sonic-host-services/tests/determine-reboot-cause_test.py deleted file mode 100644 index 7d22a512f8ee..000000000000 --- a/src/sonic-host-services/tests/determine-reboot-cause_test.py +++ /dev/null @@ -1,119 +0,0 @@ -import sys -import os -import pytest - -from swsscommon import swsscommon -from sonic_py_common.general import load_module_from_source - -# TODO: Remove this if/else block once we no longer support Python 2 -if sys.version_info.major == 3: - from unittest import mock -else: - # Expect the 'mock' package for python 2 - # https://pypi.python.org/pypi/mock - import mock - -# TODO: Remove this if/else block once we no longer support Python 2 -if sys.version_info.major == 3: - BUILTINS = "builtins" -else: - BUILTINS = "__builtin__" - -from .mock_connector import MockConnector - -swsscommon.SonicV2Connector = MockConnector - -test_path = os.path.dirname(os.path.abspath(__file__)) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -sys.path.insert(0, modules_path) - -# Load the file under test -determine_reboot_cause_path = os.path.join(scripts_path, 'determine-reboot-cause') -determine_reboot_cause = load_module_from_source('determine_reboot_cause', determine_reboot_cause_path) - - -PROC_CMDLINE_CONTENTS = """\ -BOOT_IMAGE=/image-20191130.52/boot/vmlinuz-4.9.0-11-2-amd64 root=/dev/sda4 rw console=tty0 console=ttyS1,9600n8 quiet net.ifnames=0 biosdevname=0 loop=image-20191130.52/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor varlog_size=4096 usbcore.autosuspend=-1 module_blacklist=gpio_ich SONIC_BOOT_TYPE=warm""" - -EXPECTED_PARSE_WARMFAST_REBOOT_FROM_PROC_CMDLINE = "warm" - -PROC_CMDLINE_CONTENTS = """\ -BOOT_IMAGE=/image-20191130.52/boot/vmlinuz-4.9.0-11-2-amd64 root=/dev/sda4 rw console=tty0 console=ttyS1,9600n8 quiet net.ifnames=0 biosdevname=0 loop=image-20191130.52/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor varlog_size=4096 usbcore.autosuspend=-1 module_blacklist=gpio_ich SONIC_BOOT_TYPE=warm""" - -REBOOT_CAUSE_CONTENTS = """\ -User issued 'warm-reboot' command [User: admin, Time: Mon Nov 2 22:37:45 UTC 2020]""" - -GET_SONIC_VERSION_INFO = {'commit_id': 'e59ec8291', 'build_date': 'Mon Nov 2 06:00:14 UTC 2020', 'build_number': 75, 'kernel_version': '4.9.0-11-2-amd64', 'debian_version': '9.13', 'built_by': 'sonicbld@jenkins-slave-phx-2', 'asic_type': 'mellanox', 'build_version': '20191130.52'} - -REBOOT_CAUSE_WATCHDOG = "Watchdog" -GEN_TIME_WATCHDOG = "2020_10_22_03_15_08" -REBOOT_CAUSE_USER = "User issued 'reboot' command [User: admin, Time: Thu Oct 22 03:11:08 UTC 2020]" -GEN_TIME_USER = "2020_10_22_03_14_07" -REBOOT_CAUSE_KERNEL_PANIC = "Kernel Panic [Time: Sun Mar 28 13:45:12 UTC 2021]" -GEN_TIME_KERNEL_PANIC = "2021_3_28_13_48_49" - - -EXPECTED_PARSE_WARMFAST_REBOOT_FROM_PROC_CMDLINE = "warm-reboot" -EXPECTED_FIND_SOFTWARE_REBOOT_CAUSE_USER = "User issued 'warm-reboot' command [User: admin, Time: Mon Nov 2 22:37:45 UTC 2020]" -EXPECTED_FIND_FIRSTBOOT_VERSION = " (First boot of SONiC version 20191130.52)" -EXPECTED_FIND_SOFTWARE_REBOOT_CAUSE_FIRSTBOOT = "Unknown (First boot of SONiC version 20191130.52)" -EXPECTED_HARDWARE_REBOOT_CAUSE = {"warm-reboot", ""} - -EXPECTED_WATCHDOG_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2020_10_22_03_15_08', 'cause': 'Watchdog', 'user': 'N/A', 'time': 'N/A'} -EXPECTED_USER_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2020_10_22_03_14_07', 'cause': 'reboot', 'user': 'admin', 'time': 'Thu Oct 22 03:11:08 UTC 2020'} -EXPECTED_KERNEL_PANIC_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2021_3_28_13_48_49', 'cause': 'Kernel Panic', 'user': 'N/A', 'time': 'Sun Mar 28 13:45:12 UTC 2021'} - - -class TestDetermineRebootCause(object): - def test_parse_warmfast_reboot_from_proc_cmdline(self): - with mock.patch("os.path.isfile") as mock_isfile: - mock_isfile.return_value = True - open_mocked = mock.mock_open(read_data=PROC_CMDLINE_CONTENTS) - with mock.patch("{}.open".format(BUILTINS), open_mocked): - result = determine_reboot_cause.parse_warmfast_reboot_from_proc_cmdline() - assert result == EXPECTED_PARSE_WARMFAST_REBOOT_FROM_PROC_CMDLINE - open_mocked.assert_called_once_with("/proc/cmdline") - - def test_find_software_reboot_cause_user(self): - with mock.patch("os.path.isfile") as mock_isfile: - mock_isfile.return_value = True - open_mocked = mock.mock_open(read_data=REBOOT_CAUSE_CONTENTS) - with mock.patch("{}.open".format(BUILTINS), open_mocked): - result = determine_reboot_cause.find_software_reboot_cause_from_reboot_cause_file() - assert result == EXPECTED_FIND_SOFTWARE_REBOOT_CAUSE_USER - open_mocked.assert_called_once_with("/host/reboot-cause/reboot-cause.txt") - - def test_find_software_reboot_cause_first_boot(self): - with mock.patch("sonic_py_common.device_info.get_sonic_version_info", return_value=GET_SONIC_VERSION_INFO): - result = determine_reboot_cause.find_first_boot_version() - assert result == EXPECTED_FIND_FIRSTBOOT_VERSION - - def test_find_software_reboot_cause(self): - with mock.patch("determine_reboot_cause.find_software_reboot_cause_from_reboot_cause_file", return_value="Unknown"): - with mock.patch("os.path.isfile") as mock_isfile: - mock_isfile.return_value = False - result = determine_reboot_cause.find_software_reboot_cause() - assert result == "Unknown" - - def test_find_proc_cmdline_reboot_cause(self): - with mock.patch("determine_reboot_cause.parse_warmfast_reboot_from_proc_cmdline", return_value="fast-reboot"): - result = determine_reboot_cause.find_proc_cmdline_reboot_cause() - assert result == "fast-reboot" - - def test_find_hardware_reboot_cause(self): - with mock.patch("determine_reboot_cause.get_reboot_cause_from_platform", return_value=("Powerloss", None)): - result = determine_reboot_cause.find_hardware_reboot_cause() - assert result == "Powerloss (None)" - - def test_get_reboot_cause_dict_watchdog(self): - reboot_cause_dict = determine_reboot_cause.get_reboot_cause_dict(REBOOT_CAUSE_WATCHDOG, "", GEN_TIME_WATCHDOG) - assert reboot_cause_dict == EXPECTED_WATCHDOG_REBOOT_CAUSE_DICT - - def test_get_reboot_cause_dict_user(self): - reboot_cause_dict = determine_reboot_cause.get_reboot_cause_dict(REBOOT_CAUSE_USER, "", GEN_TIME_USER) - assert reboot_cause_dict == EXPECTED_USER_REBOOT_CAUSE_DICT - - def test_get_reboot_cause_dict_kernel_panic(self): - reboot_cause_dict = determine_reboot_cause.get_reboot_cause_dict(REBOOT_CAUSE_KERNEL_PANIC, "", GEN_TIME_KERNEL_PANIC) - assert reboot_cause_dict == EXPECTED_KERNEL_PANIC_REBOOT_CAUSE_DICT diff --git a/src/sonic-host-services/tests/hostcfgd/__init__.py b/src/sonic-host-services/tests/hostcfgd/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py deleted file mode 100755 index da68ad861207..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_passwh_test.py +++ /dev/null @@ -1,182 +0,0 @@ -import importlib.machinery -import importlib.util -import filecmp -import shutil -import os -import sys -import subprocess -import re - -from parameterized import parameterized -from unittest import TestCase, mock -from tests.hostcfgd.test_passwh_vectors import HOSTCFGD_TEST_PASSWH_VECTOR -from tests.common.mock_configdb import MockConfigDb, MockDBConnector - -test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -src_path = os.path.dirname(modules_path) -templates_path = os.path.join(src_path, "sonic-host-services-data/templates") -output_path = os.path.join(test_path, "hostcfgd/output") -sample_output_path = os.path.join(test_path, "hostcfgd/sample_output") -sys.path.insert(0, modules_path) - -# Load the file under test -hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') -loader = importlib.machinery.SourceFileLoader('hostcfgd', hostcfgd_path) -spec = importlib.util.spec_from_loader(loader.name, loader) -hostcfgd = importlib.util.module_from_spec(spec) -loader.exec_module(hostcfgd) -sys.modules['hostcfgd'] = hostcfgd - -# Mock swsscommon classes -hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.DBConnector = MockDBConnector -hostcfgd.Table = mock.Mock() - -AGE_DICT = { 'MAX_DAYS': {'REGEX_DAYS': r'^PASS_MAX_DAYS[ \t]*(?P\d*)', 'DAYS': 'max_days', 'CHAGE_FLAG': '-M '}, - 'WARN_DAYS': {'REGEX_DAYS': r'^PASS_WARN_AGE[ \t]*(?P\d*)', 'DAYS': 'warn_days', 'CHAGE_FLAG': '-W '} - } - -class TestHostcfgdPASSWH(TestCase): - """ - Test hostcfd daemon - PASSWH - """ - def run_diff(self, file1, file2): - try: - diff_out = subprocess.check_output('diff -ur {} {} || true'.format(file1, file2), shell=True) - return diff_out - except subprocess.CalledProcessError as err: - syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}".format(err.cmd, err.returncode, err.output)) - return -1 - - def get_passw_days(self, login_file, age_type): - days_num = -1 - - regex_days = AGE_DICT[age_type]['REGEX_DAYS'] - days_type = AGE_DICT[age_type]['DAYS'] - - with open(login_file, 'r') as f: - login_def_data = f.readlines() - - for line in login_def_data: - m1 = re.match(regex_days, line) - if m1: - days_num = int(m1.group(days_type)) - break - return days_num - - """ - Check different config - """ - def check_config(self, test_name, test_data, config_name): - t_path = templates_path - op_path = output_path + "/" + test_name + "_" + config_name - sop_path = sample_output_path + "/" + test_name + "_" + config_name - sop_path_common = sample_output_path + "/" + test_name - - hostcfgd.PAM_PASSWORD_CONF_TEMPLATE = t_path + "/common-password.j2" - hostcfgd.PAM_AUTH_CONF_TEMPLATE = t_path + "/common-auth-sonic.j2" - hostcfgd.NSS_TACPLUS_CONF_TEMPLATE = t_path + "/tacplus_nss.conf.j2" - hostcfgd.NSS_RADIUS_CONF_TEMPLATE = t_path + "/radius_nss.conf.j2" - hostcfgd.PAM_RADIUS_AUTH_CONF_TEMPLATE = t_path + "/pam_radius_auth.conf.j2" - hostcfgd.PAM_PASSWORD_CONF = op_path + "/common-password" - hostcfgd.ETC_LOGIN_DEF = op_path + "/login.defs" - hostcfgd.PAM_AUTH_CONF = op_path + "/common-auth-sonic" - hostcfgd.NSS_TACPLUS_CONF = op_path + "/tacplus_nss.conf" - hostcfgd.NSS_RADIUS_CONF = op_path + "/radius_nss.conf" - hostcfgd.NSS_CONF = op_path + "/nsswitch.conf" - hostcfgd.ETC_PAMD_SSHD = op_path + "/sshd" - hostcfgd.ETC_PAMD_LOGIN = op_path + "/login" - hostcfgd.RADIUS_PAM_AUTH_CONF_DIR = op_path + "/" - - shutil.rmtree(op_path, ignore_errors=True) - os.mkdir(op_path) - - shutil.copyfile(sop_path_common + "/login.defs.old", op_path + "/login.defs") - MockConfigDb.set_config_db(test_data[config_name]) - host_config_daemon = hostcfgd.HostConfigDaemon() - - try: - passwh_table = host_config_daemon.config_db.get_table('PASSW_HARDENING') - except Exception as e: - syslog.syslog(syslog.LOG_ERR, "failed: get_table 'PASSW_HARDENING', exception={}".format(e)) - passwh_table = [] - - host_config_daemon.passwcfg.load(passwh_table) - - - diff_output = "" - files_to_compare = ['common-password'] - - # check output files exists - for name in files_to_compare: - if not os.path.isfile(sop_path + "/" + name): - raise ValueError('filename: %s not exit' % (sop_path + "/" + name)) - if not os.path.isfile(op_path + "/" + name): - raise ValueError('filename: %s not exit' % (op_path + "/" + name)) - - # deep comparison - match, mismatch, errors = filecmp.cmpfiles(sop_path, op_path, files_to_compare, shallow=False) - - if not match: - for name in files_to_compare: - diff_output += self.run_diff( sop_path + "/" + name,\ - op_path + "/" + name).decode('utf-8') - - self.assertTrue(len(diff_output) == 0, diff_output) - - # compare age data in login.def file. - out_passw_age_days = self.get_passw_days(op_path + "/login.defs", 'MAX_DAYS') - sout_passw_age_days = self.get_passw_days(sop_path + "/login.defs", 'MAX_DAYS') - out_passw_age_warn_days = self.get_passw_days(op_path + "/login.defs", 'WARN_DAYS') - sout_passw_age_warn_days = self.get_passw_days(sop_path + "/login.defs", 'WARN_DAYS') - - self.assertEqual(out_passw_age_days, sout_passw_age_days) - self.assertEqual(out_passw_age_warn_days, sout_passw_age_warn_days) - - @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) - def test_hostcfgd_passwh(self, test_name, test_data): - """ - Test PASSWH hostcfd daemon initialization - - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results - - Returns: - None - """ - - self.check_config(test_name, test_data, "default_values") - - @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) - def test_hostcfgd_passwh_enable(self, test_name, test_data): - """ - Test PASSWH hostcfd daemon initialization - - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results - - Returns: - None - """ - - self.check_config(test_name, test_data, "enable_feature") - - - @parameterized.expand(HOSTCFGD_TEST_PASSWH_VECTOR) - def test_hostcfgd_passwh_classes(self, test_name, test_data): - """ - Test PASSWH hostcfd daemon initialization - - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results - - Returns: - None - """ - - self.check_config(test_name, test_data, "enable_digits_class") \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py deleted file mode 100644 index c08cd1829add..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_radius_test.py +++ /dev/null @@ -1,103 +0,0 @@ -import importlib.machinery -import importlib.util -import filecmp -import shutil -import os -import sys -import subprocess -from swsscommon import swsscommon - -from parameterized import parameterized -from unittest import TestCase, mock -from tests.hostcfgd.test_radius_vectors import HOSTCFGD_TEST_RADIUS_VECTOR -from tests.common.mock_configdb import MockConfigDb, MockDBConnector - - -test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -src_path = os.path.dirname(modules_path) -templates_path = os.path.join(src_path, "sonic-host-services-data/templates") -output_path = os.path.join(test_path, "hostcfgd/output") -sample_output_path = os.path.join(test_path, "hostcfgd/sample_output") -sys.path.insert(0, modules_path) - -# Load the file under test -hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') -loader = importlib.machinery.SourceFileLoader('hostcfgd', hostcfgd_path) -spec = importlib.util.spec_from_loader(loader.name, loader) -hostcfgd = importlib.util.module_from_spec(spec) -loader.exec_module(hostcfgd) -sys.modules['hostcfgd'] = hostcfgd - -# Mock swsscommon classes -hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.DBConnector = MockDBConnector -hostcfgd.Table = mock.Mock() - -class TestHostcfgdRADIUS(TestCase): - """ - Test hostcfd daemon - RADIUS - """ - def run_diff(self, file1, file2): - return subprocess.check_output('diff -uR {} {} || true'.format(file1, file2), shell=True) - - - @parameterized.expand(HOSTCFGD_TEST_RADIUS_VECTOR) - def test_hostcfgd_radius(self, test_name, test_data): - """ - Test RADIUS hostcfd daemon initialization - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results - Returns: - None - """ - - t_path = templates_path - op_path = output_path + "/" + test_name - sop_path = sample_output_path + "/" + test_name - - hostcfgd.PAM_AUTH_CONF_TEMPLATE = t_path + "/common-auth-sonic.j2" - hostcfgd.NSS_TACPLUS_CONF_TEMPLATE = t_path + "/tacplus_nss.conf.j2" - hostcfgd.NSS_RADIUS_CONF_TEMPLATE = t_path + "/radius_nss.conf.j2" - hostcfgd.PAM_RADIUS_AUTH_CONF_TEMPLATE = t_path + "/pam_radius_auth.conf.j2" - hostcfgd.PAM_AUTH_CONF = op_path + "/common-auth-sonic" - hostcfgd.NSS_TACPLUS_CONF = op_path + "/tacplus_nss.conf" - hostcfgd.NSS_RADIUS_CONF = op_path + "/radius_nss.conf" - hostcfgd.NSS_CONF = op_path + "/nsswitch.conf" - hostcfgd.ETC_PAMD_SSHD = op_path + "/sshd" - hostcfgd.ETC_PAMD_LOGIN = op_path + "/login" - hostcfgd.RADIUS_PAM_AUTH_CONF_DIR = op_path + "/" - - shutil.rmtree( op_path, ignore_errors=True) - os.mkdir( op_path) - - shutil.copyfile( sop_path + "/sshd.old", op_path + "/sshd") - shutil.copyfile( sop_path + "/login.old", op_path + "/login") - - MockConfigDb.set_config_db(test_data["config_db"]) - host_config_daemon = hostcfgd.HostConfigDaemon() - - aaa = host_config_daemon.config_db.get_table('AAA') - - try: - radius_global = host_config_daemon.config_db.get_table('RADIUS') - except: - radius_global = [] - try: - radius_server = \ - host_config_daemon.config_db.get_table('RADIUS_SERVER') - except: - radius_server = [] - - host_config_daemon.aaacfg.load(aaa,[],[],radius_global,radius_server) - dcmp = filecmp.dircmp(sop_path, op_path) - diff_output = "" - for name in dcmp.diff_files: - diff_output += \ - "Diff: file: {} expected: {} output: {}\n".format(\ - name, dcmp.left, dcmp.right) - diff_output += self.run_diff( dcmp.left + "/" + name,\ - dcmp.right + "/" + name) - self.assertTrue(len(diff_output) == 0, diff_output) diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py deleted file mode 100644 index a6478c08dc0d..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_tacacs_test.py +++ /dev/null @@ -1,116 +0,0 @@ -import importlib.machinery -import importlib.util -import filecmp -import shutil -import os -import sys -import subprocess -from swsscommon import swsscommon - -from parameterized import parameterized -from unittest import TestCase, mock -from tests.hostcfgd.test_tacacs_vectors import HOSTCFGD_TEST_TACACS_VECTOR -from tests.common.mock_configdb import MockConfigDb, MockDBConnector - -test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -src_path = os.path.dirname(modules_path) -templates_path = os.path.join(src_path, "sonic-host-services-data/templates") -output_path = os.path.join(test_path, "hostcfgd/output") -sample_output_path = os.path.join(test_path, "hostcfgd/sample_output") -sys.path.insert(0, modules_path) - -# Load the file under test -hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') -loader = importlib.machinery.SourceFileLoader('hostcfgd', hostcfgd_path) -spec = importlib.util.spec_from_loader(loader.name, loader) -hostcfgd = importlib.util.module_from_spec(spec) -loader.exec_module(hostcfgd) -sys.modules['hostcfgd'] = hostcfgd - -# Mock swsscommon classes -hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.DBConnector = MockDBConnector -hostcfgd.Table = mock.Mock() - -class TestHostcfgdTACACS(TestCase): - """ - Test hostcfd daemon - TACACS - """ - def run_diff(self, file1, file2): - return subprocess.check_output('diff -uR {} {} || true'.format(file1, file2), shell=True) - - """ - Check different config - """ - def check_config(self, test_name, test_data, config_name): - t_path = templates_path - op_path = output_path + "/" + test_name + "_" + config_name - sop_path = sample_output_path + "/" + test_name + "_" + config_name - - hostcfgd.PAM_AUTH_CONF_TEMPLATE = t_path + "/common-auth-sonic.j2" - hostcfgd.NSS_TACPLUS_CONF_TEMPLATE = t_path + "/tacplus_nss.conf.j2" - hostcfgd.NSS_RADIUS_CONF_TEMPLATE = t_path + "/radius_nss.conf.j2" - hostcfgd.PAM_RADIUS_AUTH_CONF_TEMPLATE = t_path + "/pam_radius_auth.conf.j2" - hostcfgd.PAM_AUTH_CONF = op_path + "/common-auth-sonic" - hostcfgd.NSS_TACPLUS_CONF = op_path + "/tacplus_nss.conf" - hostcfgd.NSS_RADIUS_CONF = op_path + "/radius_nss.conf" - hostcfgd.NSS_CONF = op_path + "/nsswitch.conf" - hostcfgd.ETC_PAMD_SSHD = op_path + "/sshd" - hostcfgd.ETC_PAMD_LOGIN = op_path + "/login" - hostcfgd.RADIUS_PAM_AUTH_CONF_DIR = op_path + "/" - - shutil.rmtree( op_path, ignore_errors=True) - os.mkdir( op_path) - - shutil.copyfile( sop_path + "/sshd.old", op_path + "/sshd") - shutil.copyfile( sop_path + "/login.old", op_path + "/login") - - MockConfigDb.set_config_db(test_data[config_name]) - host_config_daemon = hostcfgd.HostConfigDaemon() - - aaa = host_config_daemon.config_db.get_table('AAA') - - try: - tacacs_global = host_config_daemon.config_db.get_table('TACPLUS') - except: - tacacs_global = [] - try: - tacacs_server = \ - host_config_daemon.config_db.get_table('TACPLUS_SERVER') - except: - tacacs_server = [] - - host_config_daemon.aaacfg.load(aaa,tacacs_global,tacacs_server,[],[]) - dcmp = filecmp.dircmp(sop_path, op_path) - diff_output = "" - for name in dcmp.diff_files: - diff_output += \ - "Diff: file: {} expected: {} output: {}\n".format(\ - name, dcmp.left, dcmp.right) - diff_output += self.run_diff( dcmp.left + "/" + name,\ - dcmp.right + "/" + name) - self.assertTrue(len(diff_output) == 0, diff_output) - - - @parameterized.expand(HOSTCFGD_TEST_TACACS_VECTOR) - def test_hostcfgd_tacacs(self, test_name, test_data): - """ - Test TACACS hostcfd daemon initialization - - Args: - test_name(str): test name - test_data(dict): test data which contains initial Config Db tables, and expected results - - Returns: - None - """ - # test local config - self.check_config(test_name, test_data, "config_db_local") - # test remote config - self.check_config(test_name, test_data, "config_db_tacacs") - # test local + tacacs config - self.check_config(test_name, test_data, "config_db_local_and_tacacs") - # test disable accounting - self.check_config(test_name, test_data, "config_db_disable_accounting") diff --git a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py b/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py deleted file mode 100644 index 786bd1c8f2a9..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/hostcfgd_test.py +++ /dev/null @@ -1,359 +0,0 @@ -import os -import sys -import swsscommon as swsscommon_package -from swsscommon import swsscommon - -from parameterized import parameterized -from sonic_py_common.general import load_module_from_source -from unittest import TestCase, mock - -from .test_vectors import HOSTCFGD_TEST_VECTOR, HOSTCFG_DAEMON_CFG_DB -from tests.common.mock_configdb import MockConfigDb, MockDBConnector - -from pyfakefs.fake_filesystem_unittest import patchfs -from deepdiff import DeepDiff -from unittest.mock import call - -test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, 'scripts') -sys.path.insert(0, modules_path) - -# Load the file under test -hostcfgd_path = os.path.join(scripts_path, 'hostcfgd') -hostcfgd = load_module_from_source('hostcfgd', hostcfgd_path) -hostcfgd.ConfigDBConnector = MockConfigDb -hostcfgd.DBConnector = MockDBConnector -hostcfgd.Table = mock.Mock() - - -class TestFeatureHandler(TestCase): - """Test methods of `FeatureHandler` class. - """ - def checks_config_table(self, feature_table, expected_table): - """Compares `FEATURE` table in `CONFIG_DB` with expected output table. - - Args: - feature_table: A dictionary indicates current `FEATURE` table in `CONFIG_DB`. - expected_table A dictionary indicates the expected `FEATURE` table in `CONFIG_DB`. - - Returns: - Returns True if `FEATURE` table in `CONFIG_DB` was not modified unexpectedly; - otherwise, returns False. - """ - ddiff = DeepDiff(feature_table, expected_table, ignore_order=True) - - return True if not ddiff else False - - def checks_systemd_config_file(self, feature_table): - """Checks whether the systemd configuration file of each feature was created or not - and whether the `Restart=` field in the file is set correctly or not. - - Args: - feature_table: A dictionary indicates `Feature` table in `CONFIG_DB`. - - Returns: Boolean value indicates whether test passed or not. - """ - - truth_table = {'enabled': 'always', - 'disabled': 'no'} - - systemd_config_file_path = os.path.join(hostcfgd.FeatureHandler.SYSTEMD_SERVICE_CONF_DIR, - 'auto_restart.conf') - - for feature_name in feature_table: - auto_restart_status = feature_table[feature_name].get('auto_restart', 'disabled') - if "enabled" in auto_restart_status: - auto_restart_status = "enabled" - elif "disabled" in auto_restart_status: - auto_restart_status = "disabled" - - feature_systemd_config_file_path = systemd_config_file_path.format(feature_name) - is_config_file_existing = os.path.exists(feature_systemd_config_file_path) - assert is_config_file_existing, "Systemd configuration file of feature '{}' does not exist!".format(feature_name) - - with open(feature_systemd_config_file_path) as systemd_config_file: - status = systemd_config_file.read().strip() - assert status == '[Service]\nRestart={}'.format(truth_table[auto_restart_status]) - - def get_state_db_set_calls(self, feature_table): - """Returns a Mock call objects which recorded the `set` calls to `FEATURE` table in `STATE_DB`. - - Args: - feature_table: A dictionary indicates `FEATURE` table in `CONFIG_DB`. - - Returns: - set_call_list: A list indicates Mock call objects. - """ - set_call_list = [] - - for feature_name in feature_table.keys(): - feature_state = "" - if "enabled" in feature_table[feature_name]["state"]: - feature_state = "enabled" - elif "disabled" in feature_table[feature_name]["state"]: - feature_state = "disabled" - else: - feature_state = feature_table[feature_name]["state"] - - set_call_list.append(mock.call(feature_name, [("state", feature_state)])) - - return set_call_list - - @parameterized.expand(HOSTCFGD_TEST_VECTOR) - @patchfs - def test_sync_state_field(self, test_scenario_name, config_data, fs): - """Tests the method `sync_state_field(...)` of `FeatureHandler` class. - - Args: - test_secnario_name: A string indicates different testing scenario. - config_data: A dictionary contains initial `CONFIG_DB` tables and expected results. - - Returns: - Boolean value indicates whether test will pass or not. - """ - # add real path of sesscommon for database_config.json - fs.add_real_paths(swsscommon_package.__path__) - fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - - MockConfigDb.set_config_db(config_data['config_db']) - feature_state_table_mock = mock.Mock() - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = config_data['popen_attributes'] - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - - device_config = {} - device_config['DEVICE_METADATA'] = MockConfigDb.CONFIG_DB['DEVICE_METADATA'] - feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) - - feature_table = MockConfigDb.CONFIG_DB['FEATURE'] - feature_handler.sync_state_field(feature_table) - - is_any_difference = self.checks_config_table(MockConfigDb.get_config_db()['FEATURE'], - config_data['expected_config_db']['FEATURE']) - assert is_any_difference, "'FEATURE' table in 'CONFIG_DB' is modified unexpectedly!" - - feature_table_state_db_calls = self.get_state_db_set_calls(feature_table) - - self.checks_systemd_config_file(config_data['config_db']['FEATURE']) - mocked_subprocess.check_call.assert_has_calls(config_data['enable_feature_subprocess_calls'], - any_order=True) - mocked_subprocess.check_call.assert_has_calls(config_data['daemon_reload_subprocess_call'], - any_order=True) - feature_state_table_mock.set.assert_has_calls(feature_table_state_db_calls) - self.checks_systemd_config_file(config_data['config_db']['FEATURE']) - - @parameterized.expand(HOSTCFGD_TEST_VECTOR) - @patchfs - def test_handler(self, test_scenario_name, config_data, fs): - """Tests the method `handle(...)` of `FeatureHandler` class. - - Args: - test_secnario_name: A string indicates different testing scenario. - config_data: A dictionary contains initial `CONFIG_DB` tables and expected results. - - Returns: - Boolean value indicates whether test will pass or not. - """ - # add real path of sesscommon for database_config.json - fs.add_real_paths(swsscommon_package.__path__) - fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - - MockConfigDb.set_config_db(config_data['config_db']) - feature_state_table_mock = mock.Mock() - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = config_data['popen_attributes'] - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - - device_config = {} - device_config['DEVICE_METADATA'] = MockConfigDb.CONFIG_DB['DEVICE_METADATA'] - feature_handler = hostcfgd.FeatureHandler(MockConfigDb(), feature_state_table_mock, device_config) - - feature_table = MockConfigDb.CONFIG_DB['FEATURE'] - - for feature_name, feature_config in feature_table.items(): - feature_handler.handler(feature_name, 'SET', feature_config) - - self.checks_systemd_config_file(config_data['config_db']['FEATURE']) - mocked_subprocess.check_call.assert_has_calls(config_data['enable_feature_subprocess_calls'], - any_order=True) - mocked_subprocess.check_call.assert_has_calls(config_data['daemon_reload_subprocess_call'], - any_order=True) - - def test_feature_config_parsing(self): - swss_feature = hostcfgd.Feature('swss', { - 'state': 'enabled', - 'auto_restart': 'enabled', - 'has_timer': 'True', - 'has_global_scope': 'False', - 'has_per_asic_scope': 'True', - }) - - assert swss_feature.name == 'swss' - assert swss_feature.state == 'enabled' - assert swss_feature.auto_restart == 'enabled' - assert swss_feature.has_timer - assert not swss_feature.has_global_scope - assert swss_feature.has_per_asic_scope - - def test_feature_config_parsing_defaults(self): - swss_feature = hostcfgd.Feature('swss', { - 'state': 'enabled', - }) - - assert swss_feature.name == 'swss' - assert swss_feature.state == 'enabled' - assert swss_feature.auto_restart == 'disabled' - assert not swss_feature.has_timer - assert swss_feature.has_global_scope - assert not swss_feature.has_per_asic_scope - - -class TesNtpCfgd(TestCase): - """ - Test hostcfd daemon - NtpCfgd - """ - def setUp(self): - MockConfigDb.CONFIG_DB['NTP'] = {'global': {'vrf': 'mgmt', 'src_intf': 'eth0'}} - MockConfigDb.CONFIG_DB['NTP_SERVER'] = {'0.debian.pool.ntp.org': {}} - - def tearDown(self): - MockConfigDb.CONFIG_DB = {} - - def test_ntp_global_update_with_no_servers(self): - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - - ntpcfgd = hostcfgd.NtpCfg() - ntpcfgd.ntp_global_update('global', MockConfigDb.CONFIG_DB['NTP']['global']) - - mocked_subprocess.check_call.assert_not_called() - - def test_ntp_global_update_ntp_servers(self): - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - - ntpcfgd = hostcfgd.NtpCfg() - ntpcfgd.ntp_global_update('global', MockConfigDb.CONFIG_DB['NTP']['global']) - ntpcfgd.ntp_server_update('0.debian.pool.ntp.org', 'SET') - mocked_subprocess.check_call.assert_has_calls([call('systemctl restart ntp-config', shell=True)]) - - def test_loopback_update(self): - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - - ntpcfgd = hostcfgd.NtpCfg() - ntpcfgd.ntp_global = MockConfigDb.CONFIG_DB['NTP']['global'] - ntpcfgd.ntp_servers.add('0.debian.pool.ntp.org') - - ntpcfgd.handle_ntp_source_intf_chg('eth0') - mocked_subprocess.check_call.assert_has_calls([call('systemctl restart ntp-config', shell=True)]) - - -class TestHostcfgdDaemon(TestCase): - - def setUp(self): - MockConfigDb.set_config_db(HOSTCFG_DAEMON_CFG_DB) - - def tearDown(self): - MockConfigDb.CONFIG_DB = {} - - @patchfs - def test_feature_events(self, fs): - fs.create_dir(hostcfgd.FeatureHandler.SYSTEMD_SYSTEM_DIR) - MockConfigDb.event_queue = [('FEATURE', 'dhcp_relay'), - ('FEATURE', 'mux'), - ('FEATURE', 'telemetry')] - daemon = hostcfgd.HostConfigDaemon() - daemon.register_callbacks() - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - try: - daemon.start() - except TimeoutError: - pass - expected = [call('sudo systemctl daemon-reload', shell=True), - call('sudo systemctl unmask dhcp_relay.service', shell=True), - call('sudo systemctl enable dhcp_relay.service', shell=True), - call('sudo systemctl start dhcp_relay.service', shell=True), - call('sudo systemctl daemon-reload', shell=True), - call('sudo systemctl unmask mux.service', shell=True), - call('sudo systemctl enable mux.service', shell=True), - call('sudo systemctl start mux.service', shell=True), - call('sudo systemctl daemon-reload', shell=True), - call('sudo systemctl unmask telemetry.service', shell=True), - call('sudo systemctl unmask telemetry.timer', shell=True), - call('sudo systemctl enable telemetry.timer', shell=True), - call('sudo systemctl start telemetry.timer', shell=True)] - mocked_subprocess.check_call.assert_has_calls(expected) - - # Change the state to disabled - MockConfigDb.CONFIG_DB['FEATURE']['telemetry']['state'] = 'disabled' - MockConfigDb.event_queue = [('FEATURE', 'telemetry')] - try: - daemon.start() - except TimeoutError: - pass - expected = [call('sudo systemctl stop telemetry.timer', shell=True), - call('sudo systemctl disable telemetry.timer', shell=True), - call('sudo systemctl mask telemetry.timer', shell=True), - call('sudo systemctl stop telemetry.service', shell=True), - call('sudo systemctl disable telemetry.timer', shell=True), - call('sudo systemctl mask telemetry.timer', shell=True)] - mocked_subprocess.check_call.assert_has_calls(expected) - - def test_loopback_events(self): - MockConfigDb.set_config_db(HOSTCFG_DAEMON_CFG_DB) - MockConfigDb.event_queue = [('NTP', 'global'), - ('NTP_SERVER', '0.debian.pool.ntp.org'), - ('LOOPBACK_INTERFACE', 'Loopback0|10.184.8.233/32')] - daemon = hostcfgd.HostConfigDaemon() - daemon.register_callbacks() - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - try: - daemon.start() - except TimeoutError: - pass - expected = [call('systemctl restart ntp-config', shell=True), - call('iptables -t mangle --append PREROUTING -p tcp --tcp-flags SYN SYN -d 10.184.8.233 -j TCPMSS --set-mss 1460', shell=True), - call('iptables -t mangle --append POSTROUTING -p tcp --tcp-flags SYN SYN -s 10.184.8.233 -j TCPMSS --set-mss 1460', shell=True)] - mocked_subprocess.check_call.assert_has_calls(expected, any_order=True) - - def test_kdump_event(self): - MockConfigDb.set_config_db(HOSTCFG_DAEMON_CFG_DB) - daemon = hostcfgd.HostConfigDaemon() - daemon.register_callbacks() - MockConfigDb.event_queue = [('KDUMP', 'config')] - with mock.patch('hostcfgd.subprocess') as mocked_subprocess: - popen_mock = mock.Mock() - attrs = {'communicate.return_value': ('output', 'error')} - popen_mock.configure_mock(**attrs) - mocked_subprocess.Popen.return_value = popen_mock - try: - daemon.start() - except TimeoutError: - pass - expected = [call('sonic-kdump-config --disable', shell=True), - call('sonic-kdump-config --num_dumps 3', shell=True), - call('sonic-kdump-config --memory 0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M', shell=True)] - mocked_subprocess.check_call.assert_has_calls(expected, any_order=True) diff --git a/src/sonic-host-services/tests/hostcfgd/output/.gitignore b/src/sonic-host-services/tests/hostcfgd/output/.gitignore deleted file mode 100644 index 3f4e276cb2df..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/output/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore all test generated files -* -# But keep this file -!.gitignore diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/common-auth-sonic deleted file mode 100644 index 87af4cc5c6ac..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/common-auth-sonic +++ /dev/null @@ -1,21 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -auth [success=1 default=ignore] pam_unix.so nullok try_first_pass - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/radius_nss.conf deleted file mode 100644 index 8c31db9fbafe..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/radius_nss.conf +++ /dev/null @@ -1,56 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on -debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/tacplus_nss.conf deleted file mode 100644 index eac828491ac1..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/LOCAL/tacplus_nss.conf +++ /dev/null @@ -1,40 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on -debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization -local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old deleted file mode 100644 index db8baa4d2bf8..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING/login.defs.old +++ /dev/null @@ -1,340 +0,0 @@ -# -# /etc/login.defs - Configuration control definitions for the login package. -# -# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. -# If unspecified, some arbitrary (and possibly incorrect) value will -# be assumed. All other items are optional - if not specified then -# the described action or option will be inhibited. -# -# Comment lines (lines beginning with "#") and blank lines are ignored. -# -# Modified for Linux. --marekm - -# REQUIRED for useradd/userdel/usermod -# Directory where mailboxes reside, _or_ name of file, relative to the -# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, -# MAIL_DIR takes precedence. -# -# Essentially: -# - MAIL_DIR defines the location of users mail spool files -# (for mbox use) by appending the username to MAIL_DIR as defined -# below. -# - MAIL_FILE defines the location of the users mail spool files as the -# fully-qualified filename obtained by prepending the user home -# directory before $MAIL_FILE -# -# NOTE: This is no more used for setting up users MAIL environment variable -# which is, starting from shadow 4.0.12-1 in Debian, entirely the -# job of the pam_mail PAM modules -# See default PAM configuration files provided for -# login, su, etc. -# -# This is a temporary situation: setting these variables will soon -# move to /etc/default/useradd and the variables will then be -# no more supported -MAIL_DIR /var/mail -#MAIL_FILE .mail - -# -# Enable logging and display of /var/log/faillog login failure info. -# This option conflicts with the pam_tally PAM module. -# -FAILLOG_ENAB yes - -# -# Enable display of unknown usernames when login failures are recorded. -# -# WARNING: Unknown usernames may become world readable. -# See #290803 and #298773 for details about how this could become a security -# concern -LOG_UNKFAIL_ENAB no - -# -# Enable logging of successful logins -# -LOG_OK_LOGINS no - -# -# Enable "syslog" logging of su activity - in addition to sulog file logging. -# SYSLOG_SG_ENAB does the same for newgrp and sg. -# -SYSLOG_SU_ENAB yes -SYSLOG_SG_ENAB yes - -# -# If defined, all su activity is logged to this file. -# -#SULOG_FILE /var/log/sulog - -# -# If defined, file which maps tty line to TERM environment parameter. -# Each line of the file is in a format something like "vt100 tty01". -# -#TTYTYPE_FILE /etc/ttytype - -# -# If defined, login failures will be logged here in a utmp format -# last, when invoked as lastb, will read /var/log/btmp, so... -# -FTMP_FILE /var/log/btmp - -# -# If defined, the command name to display when running "su -". For -# example, if this is defined as "su" then a "ps" will display the -# command is "-su". If not defined, then "ps" would display the -# name of the shell actually being run, e.g. something like "-sh". -# -SU_NAME su - -# -# If defined, file which inhibits all the usual chatter during the login -# sequence. If a full pathname, then hushed mode will be enabled if the -# user's name or shell are found in the file. If not a full pathname, then -# hushed mode will be enabled if the file exists in the user's home directory. -# -HUSHLOGIN_FILE .hushlogin -#HUSHLOGIN_FILE /etc/hushlogins - -# -# *REQUIRED* The default PATH settings, for superuser and normal users. -# -# (they are minimal, add the rest in the shell startup files) -ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games - -# -# Terminal permissions -# -# TTYGROUP Login tty will be assigned this group ownership. -# TTYPERM Login tty will be set to this permission. -# -# If you have a "write" program which is "setgid" to a special group -# which owns the terminals, define TTYGROUP to the group number and -# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign -# TTYPERM to either 622 or 600. -# -# In Debian /usr/bin/bsd-write or similar programs are setgid tty -# However, the default and recommended value for TTYPERM is still 0600 -# to not allow anyone to write to anyone else console or terminal - -# Users can still allow other people to write them by issuing -# the "mesg y" command. - -TTYGROUP tty -TTYPERM 0600 - -# -# Login configuration initializations: -# -# ERASECHAR Terminal ERASE character ('\010' = backspace). -# KILLCHAR Terminal KILL character ('\025' = CTRL/U). -# UMASK Default "umask" value. -# -# The ERASECHAR and KILLCHAR are used only on System V machines. -# -# UMASK is the default umask value for pam_umask and is used by -# useradd and newusers to set the mode of the new home directories. -# 022 is the "historical" value in Debian for UMASK -# 027, or even 077, could be considered better for privacy -# There is no One True Answer here : each sysadmin must make up his/her -# mind. -# -# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value -# for private user groups, i. e. the uid is the same as gid, and username is -# the same as the primary group name: for these, the user permissions will be -# used as group permissions, e. g. 022 will become 002. -# -# Prefix these values with "0" to get octal, "0x" to get hexadecimal. -# -ERASECHAR 0177 -KILLCHAR 025 -UMASK 022 - -# -# Password aging controls: -# -# PASS_MAX_DAYS Maximum number of days a password may be used. -# PASS_MIN_DAYS Minimum number of days allowed between password changes. -# PASS_WARN_AGE Number of days warning given before a password expires. -# -PASS_MAX_DAYS 99999 -PASS_MIN_DAYS 0 -PASS_WARN_AGE 7 - -# -# Min/max values for automatic uid selection in useradd -# -UID_MIN 1000 -UID_MAX 60000 -# System accounts -#SYS_UID_MIN 100 -#SYS_UID_MAX 999 - -# -# Min/max values for automatic gid selection in groupadd -# -GID_MIN 1000 -GID_MAX 60000 -# System accounts -#SYS_GID_MIN 100 -#SYS_GID_MAX 999 - -# -# Max number of login retries if password is bad. This will most likely be -# overriden by PAM, since the default pam_unix module has it's own built -# in of 3 retries. However, this is a safe fallback in case you are using -# an authentication module that does not enforce PAM_MAXTRIES. -# -LOGIN_RETRIES 5 - -# -# Max time in seconds for login -# -LOGIN_TIMEOUT 60 - -# -# Which fields may be changed by regular users using chfn - use -# any combination of letters "frwh" (full name, room number, work -# phone, home phone). If not defined, no changes are allowed. -# For backward compatibility, "yes" = "rwh" and "no" = "frwh". -# -CHFN_RESTRICT rwh - -# -# Should login be allowed if we can't cd to the home directory? -# Default in no. -# -DEFAULT_HOME yes - -# -# If defined, this command is run when removing a user. -# It should remove any at/cron/print jobs etc. owned by -# the user to be removed (passed as the first argument). -# -#USERDEL_CMD /usr/sbin/userdel_local - -# -# If set to yes, userdel will remove the user's group if it contains no -# more members, and useradd will create by default a group with the name -# of the user. -# -# Other former uses of this variable such as setting the umask when -# user==primary group are not used in PAM environments, such as Debian -# -USERGROUPS_ENAB yes - -# -# Instead of the real user shell, the program specified by this parameter -# will be launched, although its visible name (argv[0]) will be the shell's. -# The program may do whatever it wants (logging, additional authentification, -# banner, ...) before running the actual shell. -# -# FAKE_SHELL /bin/fakeshell - -# -# If defined, either full pathname of a file containing device names or -# a ":" delimited list of device names. Root logins will be allowed only -# upon these devices. -# -# This variable is used by login and su. -# -#CONSOLE /etc/consoles -#CONSOLE console:tty01:tty02:tty03:tty04 - -# -# List of groups to add to the user's supplementary group set -# when logging in on the console (as determined by the CONSOLE -# setting). Default is none. -# -# Use with caution - it is possible for users to gain permanent -# access to these groups, even when not logged in on the console. -# How to do it is left as an exercise for the reader... -# -# This variable is used by login and su. -# -#CONSOLE_GROUPS floppy:audio:cdrom - -# -# If set to "yes", new passwords will be encrypted using the MD5-based -# algorithm compatible with the one used by recent releases of FreeBSD. -# It supports passwords of unlimited length and longer salt strings. -# Set to "no" if you need to copy encrypted passwords to other systems -# which don't understand the new algorithm. Default is "no". -# -# This variable is deprecated. You should use ENCRYPT_METHOD. -# -#MD5_CRYPT_ENAB no - -# -# If set to MD5 , MD5-based algorithm will be used for encrypting password -# If set to SHA256, SHA256-based algorithm will be used for encrypting password -# If set to SHA512, SHA512-based algorithm will be used for encrypting password -# If set to DES, DES-based algorithm will be used for encrypting password (default) -# Overrides the MD5_CRYPT_ENAB option -# -# Note: It is recommended to use a value consistent with -# the PAM modules configuration. -# -ENCRYPT_METHOD SHA512 - -# -# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. -# -# Define the number of SHA rounds. -# With a lot of rounds, it is more difficult to brute forcing the password. -# But note also that it more CPU resources will be needed to authenticate -# users. -# -# If not specified, the libc will choose the default number of rounds (5000). -# The values must be inside the 1000-999999999 range. -# If only one of the MIN or MAX values is set, then this value will be used. -# If MIN > MAX, the highest value will be used. -# -# SHA_CRYPT_MIN_ROUNDS 5000 -# SHA_CRYPT_MAX_ROUNDS 5000 - -################# OBSOLETED BY PAM ############## -# # -# These options are now handled by PAM. Please # -# edit the appropriate file in /etc/pam.d/ to # -# enable the equivelants of them. -# -############### - -#MOTD_FILE -#DIALUPS_CHECK_ENAB -#LASTLOG_ENAB -#MAIL_CHECK_ENAB -#OBSCURE_CHECKS_ENAB -#PORTTIME_CHECKS_ENAB -#SU_WHEEL_ONLY -#CRACKLIB_DICTPATH -#PASS_CHANGE_TRIES -#PASS_ALWAYS_WARN -#ENVIRON_FILE -#NOLOGINS_FILE -#ISSUE_FILE -#PASS_MIN_LEN -#PASS_MAX_LEN -#ULIMIT -#ENV_HZ -#CHFN_AUTH -#CHSH_AUTH -#FAIL_DELAY - -################# OBSOLETED ####################### -# # -# These options are no more handled by shadow. # -# # -# Shadow utilities will display a warning if they # -# still appear. # -# # -################################################### - -# CLOSE_SESSIONS -# LOGIN_STRING -# NO_PASSWORD_CONSOLE -# QMAIL_DIR - - - diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password deleted file mode 100644 index 0da639249c94..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/common-password +++ /dev/null @@ -1,36 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-password - password-related modules common to all services -# -# This file is included from other service-specific PAM config files, -# and should contain a list of modules that define the services to be -# used to change user passwords. The default is pam_unix. - -# Explanation of pam_unix options: -# The "yescrypt" option enables -#hashed passwords using the yescrypt algorithm, introduced in Debian -#11. Without this option, the default is Unix crypt. Prior releases -#used the option "sha512"; if a shadow password hash will be shared -#between Debian 11 and older releases replace "yescrypt" with "sha512" -#for compatibility . The "obscure" option replaces the old -#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage -#for other options. - -# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. -# To take advantage of this, it is recommended that you configure any -# local modules either before or after the default block, and use -# pam-auth-update to manage selection of other modules. See -# pam-auth-update(8) for details. - -# here are the per-package modules (the "Primary" block) - - -password [success=1 default=ignore] pam_unix.so obscure yescrypt -# here's the fallback if no module succeeds -password requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -password required pam_permit.so -# and here are more per-package modules (the "Additional" block) -# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs deleted file mode 100644 index db8baa4d2bf8..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_default_values/login.defs +++ /dev/null @@ -1,340 +0,0 @@ -# -# /etc/login.defs - Configuration control definitions for the login package. -# -# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. -# If unspecified, some arbitrary (and possibly incorrect) value will -# be assumed. All other items are optional - if not specified then -# the described action or option will be inhibited. -# -# Comment lines (lines beginning with "#") and blank lines are ignored. -# -# Modified for Linux. --marekm - -# REQUIRED for useradd/userdel/usermod -# Directory where mailboxes reside, _or_ name of file, relative to the -# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, -# MAIL_DIR takes precedence. -# -# Essentially: -# - MAIL_DIR defines the location of users mail spool files -# (for mbox use) by appending the username to MAIL_DIR as defined -# below. -# - MAIL_FILE defines the location of the users mail spool files as the -# fully-qualified filename obtained by prepending the user home -# directory before $MAIL_FILE -# -# NOTE: This is no more used for setting up users MAIL environment variable -# which is, starting from shadow 4.0.12-1 in Debian, entirely the -# job of the pam_mail PAM modules -# See default PAM configuration files provided for -# login, su, etc. -# -# This is a temporary situation: setting these variables will soon -# move to /etc/default/useradd and the variables will then be -# no more supported -MAIL_DIR /var/mail -#MAIL_FILE .mail - -# -# Enable logging and display of /var/log/faillog login failure info. -# This option conflicts with the pam_tally PAM module. -# -FAILLOG_ENAB yes - -# -# Enable display of unknown usernames when login failures are recorded. -# -# WARNING: Unknown usernames may become world readable. -# See #290803 and #298773 for details about how this could become a security -# concern -LOG_UNKFAIL_ENAB no - -# -# Enable logging of successful logins -# -LOG_OK_LOGINS no - -# -# Enable "syslog" logging of su activity - in addition to sulog file logging. -# SYSLOG_SG_ENAB does the same for newgrp and sg. -# -SYSLOG_SU_ENAB yes -SYSLOG_SG_ENAB yes - -# -# If defined, all su activity is logged to this file. -# -#SULOG_FILE /var/log/sulog - -# -# If defined, file which maps tty line to TERM environment parameter. -# Each line of the file is in a format something like "vt100 tty01". -# -#TTYTYPE_FILE /etc/ttytype - -# -# If defined, login failures will be logged here in a utmp format -# last, when invoked as lastb, will read /var/log/btmp, so... -# -FTMP_FILE /var/log/btmp - -# -# If defined, the command name to display when running "su -". For -# example, if this is defined as "su" then a "ps" will display the -# command is "-su". If not defined, then "ps" would display the -# name of the shell actually being run, e.g. something like "-sh". -# -SU_NAME su - -# -# If defined, file which inhibits all the usual chatter during the login -# sequence. If a full pathname, then hushed mode will be enabled if the -# user's name or shell are found in the file. If not a full pathname, then -# hushed mode will be enabled if the file exists in the user's home directory. -# -HUSHLOGIN_FILE .hushlogin -#HUSHLOGIN_FILE /etc/hushlogins - -# -# *REQUIRED* The default PATH settings, for superuser and normal users. -# -# (they are minimal, add the rest in the shell startup files) -ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games - -# -# Terminal permissions -# -# TTYGROUP Login tty will be assigned this group ownership. -# TTYPERM Login tty will be set to this permission. -# -# If you have a "write" program which is "setgid" to a special group -# which owns the terminals, define TTYGROUP to the group number and -# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign -# TTYPERM to either 622 or 600. -# -# In Debian /usr/bin/bsd-write or similar programs are setgid tty -# However, the default and recommended value for TTYPERM is still 0600 -# to not allow anyone to write to anyone else console or terminal - -# Users can still allow other people to write them by issuing -# the "mesg y" command. - -TTYGROUP tty -TTYPERM 0600 - -# -# Login configuration initializations: -# -# ERASECHAR Terminal ERASE character ('\010' = backspace). -# KILLCHAR Terminal KILL character ('\025' = CTRL/U). -# UMASK Default "umask" value. -# -# The ERASECHAR and KILLCHAR are used only on System V machines. -# -# UMASK is the default umask value for pam_umask and is used by -# useradd and newusers to set the mode of the new home directories. -# 022 is the "historical" value in Debian for UMASK -# 027, or even 077, could be considered better for privacy -# There is no One True Answer here : each sysadmin must make up his/her -# mind. -# -# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value -# for private user groups, i. e. the uid is the same as gid, and username is -# the same as the primary group name: for these, the user permissions will be -# used as group permissions, e. g. 022 will become 002. -# -# Prefix these values with "0" to get octal, "0x" to get hexadecimal. -# -ERASECHAR 0177 -KILLCHAR 025 -UMASK 022 - -# -# Password aging controls: -# -# PASS_MAX_DAYS Maximum number of days a password may be used. -# PASS_MIN_DAYS Minimum number of days allowed between password changes. -# PASS_WARN_AGE Number of days warning given before a password expires. -# -PASS_MAX_DAYS 99999 -PASS_MIN_DAYS 0 -PASS_WARN_AGE 7 - -# -# Min/max values for automatic uid selection in useradd -# -UID_MIN 1000 -UID_MAX 60000 -# System accounts -#SYS_UID_MIN 100 -#SYS_UID_MAX 999 - -# -# Min/max values for automatic gid selection in groupadd -# -GID_MIN 1000 -GID_MAX 60000 -# System accounts -#SYS_GID_MIN 100 -#SYS_GID_MAX 999 - -# -# Max number of login retries if password is bad. This will most likely be -# overriden by PAM, since the default pam_unix module has it's own built -# in of 3 retries. However, this is a safe fallback in case you are using -# an authentication module that does not enforce PAM_MAXTRIES. -# -LOGIN_RETRIES 5 - -# -# Max time in seconds for login -# -LOGIN_TIMEOUT 60 - -# -# Which fields may be changed by regular users using chfn - use -# any combination of letters "frwh" (full name, room number, work -# phone, home phone). If not defined, no changes are allowed. -# For backward compatibility, "yes" = "rwh" and "no" = "frwh". -# -CHFN_RESTRICT rwh - -# -# Should login be allowed if we can't cd to the home directory? -# Default in no. -# -DEFAULT_HOME yes - -# -# If defined, this command is run when removing a user. -# It should remove any at/cron/print jobs etc. owned by -# the user to be removed (passed as the first argument). -# -#USERDEL_CMD /usr/sbin/userdel_local - -# -# If set to yes, userdel will remove the user's group if it contains no -# more members, and useradd will create by default a group with the name -# of the user. -# -# Other former uses of this variable such as setting the umask when -# user==primary group are not used in PAM environments, such as Debian -# -USERGROUPS_ENAB yes - -# -# Instead of the real user shell, the program specified by this parameter -# will be launched, although its visible name (argv[0]) will be the shell's. -# The program may do whatever it wants (logging, additional authentification, -# banner, ...) before running the actual shell. -# -# FAKE_SHELL /bin/fakeshell - -# -# If defined, either full pathname of a file containing device names or -# a ":" delimited list of device names. Root logins will be allowed only -# upon these devices. -# -# This variable is used by login and su. -# -#CONSOLE /etc/consoles -#CONSOLE console:tty01:tty02:tty03:tty04 - -# -# List of groups to add to the user's supplementary group set -# when logging in on the console (as determined by the CONSOLE -# setting). Default is none. -# -# Use with caution - it is possible for users to gain permanent -# access to these groups, even when not logged in on the console. -# How to do it is left as an exercise for the reader... -# -# This variable is used by login and su. -# -#CONSOLE_GROUPS floppy:audio:cdrom - -# -# If set to "yes", new passwords will be encrypted using the MD5-based -# algorithm compatible with the one used by recent releases of FreeBSD. -# It supports passwords of unlimited length and longer salt strings. -# Set to "no" if you need to copy encrypted passwords to other systems -# which don't understand the new algorithm. Default is "no". -# -# This variable is deprecated. You should use ENCRYPT_METHOD. -# -#MD5_CRYPT_ENAB no - -# -# If set to MD5 , MD5-based algorithm will be used for encrypting password -# If set to SHA256, SHA256-based algorithm will be used for encrypting password -# If set to SHA512, SHA512-based algorithm will be used for encrypting password -# If set to DES, DES-based algorithm will be used for encrypting password (default) -# Overrides the MD5_CRYPT_ENAB option -# -# Note: It is recommended to use a value consistent with -# the PAM modules configuration. -# -ENCRYPT_METHOD SHA512 - -# -# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. -# -# Define the number of SHA rounds. -# With a lot of rounds, it is more difficult to brute forcing the password. -# But note also that it more CPU resources will be needed to authenticate -# users. -# -# If not specified, the libc will choose the default number of rounds (5000). -# The values must be inside the 1000-999999999 range. -# If only one of the MIN or MAX values is set, then this value will be used. -# If MIN > MAX, the highest value will be used. -# -# SHA_CRYPT_MIN_ROUNDS 5000 -# SHA_CRYPT_MAX_ROUNDS 5000 - -################# OBSOLETED BY PAM ############## -# # -# These options are now handled by PAM. Please # -# edit the appropriate file in /etc/pam.d/ to # -# enable the equivelants of them. -# -############### - -#MOTD_FILE -#DIALUPS_CHECK_ENAB -#LASTLOG_ENAB -#MAIL_CHECK_ENAB -#OBSCURE_CHECKS_ENAB -#PORTTIME_CHECKS_ENAB -#SU_WHEEL_ONLY -#CRACKLIB_DICTPATH -#PASS_CHANGE_TRIES -#PASS_ALWAYS_WARN -#ENVIRON_FILE -#NOLOGINS_FILE -#ISSUE_FILE -#PASS_MIN_LEN -#PASS_MAX_LEN -#ULIMIT -#ENV_HZ -#CHFN_AUTH -#CHSH_AUTH -#FAIL_DELAY - -################# OBSOLETED ####################### -# # -# These options are no more handled by shadow. # -# # -# Shadow utilities will display a warning if they # -# still appear. # -# # -################################################### - -# CLOSE_SESSIONS -# LOGIN_STRING -# NO_PASSWORD_CONSOLE -# QMAIL_DIR - - - diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password deleted file mode 100644 index 841074728a4f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/common-password +++ /dev/null @@ -1,39 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-password - password-related modules common to all services -# -# This file is included from other service-specific PAM config files, -# and should contain a list of modules that define the services to be -# used to change user passwords. The default is pam_unix. - -# Explanation of pam_unix options: -# The "yescrypt" option enables -#hashed passwords using the yescrypt algorithm, introduced in Debian -#11. Without this option, the default is Unix crypt. Prior releases -#used the option "sha512"; if a shadow password hash will be shared -#between Debian 11 and older releases replace "yescrypt" with "sha512" -#for compatibility . The "obscure" option replaces the old -#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage -#for other options. - -# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. -# To take advantage of this, it is recommended that you configure any -# local modules either before or after the default block, and use -# pam-auth-update to manage selection of other modules. See -# pam-auth-update(8) for details. - -# here are the per-package modules (the "Primary" block) - -password requisite pam_cracklib.so retry=3 maxrepeat=0 minlen=8 ucredit=0 lcredit=0 dcredit=-1 ocredit=0 enforce_for_root - -password required pam_pwhistory.so remember=0 use_authtok enforce_for_root - -password [success=1 default=ignore] pam_unix.so obscure yescrypt -# here's the fallback if no module succeeds -password requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -password required pam_permit.so -# and here are more per-package modules (the "Additional" block) -# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs deleted file mode 100644 index db8baa4d2bf8..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_digits_class/login.defs +++ /dev/null @@ -1,340 +0,0 @@ -# -# /etc/login.defs - Configuration control definitions for the login package. -# -# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. -# If unspecified, some arbitrary (and possibly incorrect) value will -# be assumed. All other items are optional - if not specified then -# the described action or option will be inhibited. -# -# Comment lines (lines beginning with "#") and blank lines are ignored. -# -# Modified for Linux. --marekm - -# REQUIRED for useradd/userdel/usermod -# Directory where mailboxes reside, _or_ name of file, relative to the -# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, -# MAIL_DIR takes precedence. -# -# Essentially: -# - MAIL_DIR defines the location of users mail spool files -# (for mbox use) by appending the username to MAIL_DIR as defined -# below. -# - MAIL_FILE defines the location of the users mail spool files as the -# fully-qualified filename obtained by prepending the user home -# directory before $MAIL_FILE -# -# NOTE: This is no more used for setting up users MAIL environment variable -# which is, starting from shadow 4.0.12-1 in Debian, entirely the -# job of the pam_mail PAM modules -# See default PAM configuration files provided for -# login, su, etc. -# -# This is a temporary situation: setting these variables will soon -# move to /etc/default/useradd and the variables will then be -# no more supported -MAIL_DIR /var/mail -#MAIL_FILE .mail - -# -# Enable logging and display of /var/log/faillog login failure info. -# This option conflicts with the pam_tally PAM module. -# -FAILLOG_ENAB yes - -# -# Enable display of unknown usernames when login failures are recorded. -# -# WARNING: Unknown usernames may become world readable. -# See #290803 and #298773 for details about how this could become a security -# concern -LOG_UNKFAIL_ENAB no - -# -# Enable logging of successful logins -# -LOG_OK_LOGINS no - -# -# Enable "syslog" logging of su activity - in addition to sulog file logging. -# SYSLOG_SG_ENAB does the same for newgrp and sg. -# -SYSLOG_SU_ENAB yes -SYSLOG_SG_ENAB yes - -# -# If defined, all su activity is logged to this file. -# -#SULOG_FILE /var/log/sulog - -# -# If defined, file which maps tty line to TERM environment parameter. -# Each line of the file is in a format something like "vt100 tty01". -# -#TTYTYPE_FILE /etc/ttytype - -# -# If defined, login failures will be logged here in a utmp format -# last, when invoked as lastb, will read /var/log/btmp, so... -# -FTMP_FILE /var/log/btmp - -# -# If defined, the command name to display when running "su -". For -# example, if this is defined as "su" then a "ps" will display the -# command is "-su". If not defined, then "ps" would display the -# name of the shell actually being run, e.g. something like "-sh". -# -SU_NAME su - -# -# If defined, file which inhibits all the usual chatter during the login -# sequence. If a full pathname, then hushed mode will be enabled if the -# user's name or shell are found in the file. If not a full pathname, then -# hushed mode will be enabled if the file exists in the user's home directory. -# -HUSHLOGIN_FILE .hushlogin -#HUSHLOGIN_FILE /etc/hushlogins - -# -# *REQUIRED* The default PATH settings, for superuser and normal users. -# -# (they are minimal, add the rest in the shell startup files) -ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games - -# -# Terminal permissions -# -# TTYGROUP Login tty will be assigned this group ownership. -# TTYPERM Login tty will be set to this permission. -# -# If you have a "write" program which is "setgid" to a special group -# which owns the terminals, define TTYGROUP to the group number and -# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign -# TTYPERM to either 622 or 600. -# -# In Debian /usr/bin/bsd-write or similar programs are setgid tty -# However, the default and recommended value for TTYPERM is still 0600 -# to not allow anyone to write to anyone else console or terminal - -# Users can still allow other people to write them by issuing -# the "mesg y" command. - -TTYGROUP tty -TTYPERM 0600 - -# -# Login configuration initializations: -# -# ERASECHAR Terminal ERASE character ('\010' = backspace). -# KILLCHAR Terminal KILL character ('\025' = CTRL/U). -# UMASK Default "umask" value. -# -# The ERASECHAR and KILLCHAR are used only on System V machines. -# -# UMASK is the default umask value for pam_umask and is used by -# useradd and newusers to set the mode of the new home directories. -# 022 is the "historical" value in Debian for UMASK -# 027, or even 077, could be considered better for privacy -# There is no One True Answer here : each sysadmin must make up his/her -# mind. -# -# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value -# for private user groups, i. e. the uid is the same as gid, and username is -# the same as the primary group name: for these, the user permissions will be -# used as group permissions, e. g. 022 will become 002. -# -# Prefix these values with "0" to get octal, "0x" to get hexadecimal. -# -ERASECHAR 0177 -KILLCHAR 025 -UMASK 022 - -# -# Password aging controls: -# -# PASS_MAX_DAYS Maximum number of days a password may be used. -# PASS_MIN_DAYS Minimum number of days allowed between password changes. -# PASS_WARN_AGE Number of days warning given before a password expires. -# -PASS_MAX_DAYS 99999 -PASS_MIN_DAYS 0 -PASS_WARN_AGE 7 - -# -# Min/max values for automatic uid selection in useradd -# -UID_MIN 1000 -UID_MAX 60000 -# System accounts -#SYS_UID_MIN 100 -#SYS_UID_MAX 999 - -# -# Min/max values for automatic gid selection in groupadd -# -GID_MIN 1000 -GID_MAX 60000 -# System accounts -#SYS_GID_MIN 100 -#SYS_GID_MAX 999 - -# -# Max number of login retries if password is bad. This will most likely be -# overriden by PAM, since the default pam_unix module has it's own built -# in of 3 retries. However, this is a safe fallback in case you are using -# an authentication module that does not enforce PAM_MAXTRIES. -# -LOGIN_RETRIES 5 - -# -# Max time in seconds for login -# -LOGIN_TIMEOUT 60 - -# -# Which fields may be changed by regular users using chfn - use -# any combination of letters "frwh" (full name, room number, work -# phone, home phone). If not defined, no changes are allowed. -# For backward compatibility, "yes" = "rwh" and "no" = "frwh". -# -CHFN_RESTRICT rwh - -# -# Should login be allowed if we can't cd to the home directory? -# Default in no. -# -DEFAULT_HOME yes - -# -# If defined, this command is run when removing a user. -# It should remove any at/cron/print jobs etc. owned by -# the user to be removed (passed as the first argument). -# -#USERDEL_CMD /usr/sbin/userdel_local - -# -# If set to yes, userdel will remove the user's group if it contains no -# more members, and useradd will create by default a group with the name -# of the user. -# -# Other former uses of this variable such as setting the umask when -# user==primary group are not used in PAM environments, such as Debian -# -USERGROUPS_ENAB yes - -# -# Instead of the real user shell, the program specified by this parameter -# will be launched, although its visible name (argv[0]) will be the shell's. -# The program may do whatever it wants (logging, additional authentification, -# banner, ...) before running the actual shell. -# -# FAKE_SHELL /bin/fakeshell - -# -# If defined, either full pathname of a file containing device names or -# a ":" delimited list of device names. Root logins will be allowed only -# upon these devices. -# -# This variable is used by login and su. -# -#CONSOLE /etc/consoles -#CONSOLE console:tty01:tty02:tty03:tty04 - -# -# List of groups to add to the user's supplementary group set -# when logging in on the console (as determined by the CONSOLE -# setting). Default is none. -# -# Use with caution - it is possible for users to gain permanent -# access to these groups, even when not logged in on the console. -# How to do it is left as an exercise for the reader... -# -# This variable is used by login and su. -# -#CONSOLE_GROUPS floppy:audio:cdrom - -# -# If set to "yes", new passwords will be encrypted using the MD5-based -# algorithm compatible with the one used by recent releases of FreeBSD. -# It supports passwords of unlimited length and longer salt strings. -# Set to "no" if you need to copy encrypted passwords to other systems -# which don't understand the new algorithm. Default is "no". -# -# This variable is deprecated. You should use ENCRYPT_METHOD. -# -#MD5_CRYPT_ENAB no - -# -# If set to MD5 , MD5-based algorithm will be used for encrypting password -# If set to SHA256, SHA256-based algorithm will be used for encrypting password -# If set to SHA512, SHA512-based algorithm will be used for encrypting password -# If set to DES, DES-based algorithm will be used for encrypting password (default) -# Overrides the MD5_CRYPT_ENAB option -# -# Note: It is recommended to use a value consistent with -# the PAM modules configuration. -# -ENCRYPT_METHOD SHA512 - -# -# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. -# -# Define the number of SHA rounds. -# With a lot of rounds, it is more difficult to brute forcing the password. -# But note also that it more CPU resources will be needed to authenticate -# users. -# -# If not specified, the libc will choose the default number of rounds (5000). -# The values must be inside the 1000-999999999 range. -# If only one of the MIN or MAX values is set, then this value will be used. -# If MIN > MAX, the highest value will be used. -# -# SHA_CRYPT_MIN_ROUNDS 5000 -# SHA_CRYPT_MAX_ROUNDS 5000 - -################# OBSOLETED BY PAM ############## -# # -# These options are now handled by PAM. Please # -# edit the appropriate file in /etc/pam.d/ to # -# enable the equivelants of them. -# -############### - -#MOTD_FILE -#DIALUPS_CHECK_ENAB -#LASTLOG_ENAB -#MAIL_CHECK_ENAB -#OBSCURE_CHECKS_ENAB -#PORTTIME_CHECKS_ENAB -#SU_WHEEL_ONLY -#CRACKLIB_DICTPATH -#PASS_CHANGE_TRIES -#PASS_ALWAYS_WARN -#ENVIRON_FILE -#NOLOGINS_FILE -#ISSUE_FILE -#PASS_MIN_LEN -#PASS_MAX_LEN -#ULIMIT -#ENV_HZ -#CHFN_AUTH -#CHSH_AUTH -#FAIL_DELAY - -################# OBSOLETED ####################### -# # -# These options are no more handled by shadow. # -# # -# Shadow utilities will display a warning if they # -# still appear. # -# # -################################################### - -# CLOSE_SESSIONS -# LOGIN_STRING -# NO_PASSWORD_CONSOLE -# QMAIL_DIR - - - diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password deleted file mode 100644 index a66c1b1ade0c..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/common-password +++ /dev/null @@ -1,39 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-password - password-related modules common to all services -# -# This file is included from other service-specific PAM config files, -# and should contain a list of modules that define the services to be -# used to change user passwords. The default is pam_unix. - -# Explanation of pam_unix options: -# The "yescrypt" option enables -#hashed passwords using the yescrypt algorithm, introduced in Debian -#11. Without this option, the default is Unix crypt. Prior releases -#used the option "sha512"; if a shadow password hash will be shared -#between Debian 11 and older releases replace "yescrypt" with "sha512" -#for compatibility . The "obscure" option replaces the old -#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage -#for other options. - -# As of pam 1.0.1-6, this file is managed by pam-auth-update by default. -# To take advantage of this, it is recommended that you configure any -# local modules either before or after the default block, and use -# pam-auth-update to manage selection of other modules. See -# pam-auth-update(8) for details. - -# here are the per-package modules (the "Primary" block) - -password requisite pam_cracklib.so retry=3 maxrepeat=0 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 reject_username enforce_for_root - -password required pam_pwhistory.so remember=10 use_authtok enforce_for_root - -password [success=1 default=ignore] pam_unix.so obscure yescrypt -# here's the fallback if no module succeeds -password requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -password required pam_permit.so -# and here are more per-package modules (the "Additional" block) -# end of pam-auth-update config \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs b/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs deleted file mode 100644 index 1c8b360a14aa..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/PASSWORD_HARDENING_enable_feature/login.defs +++ /dev/null @@ -1,340 +0,0 @@ -# -# /etc/login.defs - Configuration control definitions for the login package. -# -# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH. -# If unspecified, some arbitrary (and possibly incorrect) value will -# be assumed. All other items are optional - if not specified then -# the described action or option will be inhibited. -# -# Comment lines (lines beginning with "#") and blank lines are ignored. -# -# Modified for Linux. --marekm - -# REQUIRED for useradd/userdel/usermod -# Directory where mailboxes reside, _or_ name of file, relative to the -# home directory. If you _do_ define MAIL_DIR and MAIL_FILE, -# MAIL_DIR takes precedence. -# -# Essentially: -# - MAIL_DIR defines the location of users mail spool files -# (for mbox use) by appending the username to MAIL_DIR as defined -# below. -# - MAIL_FILE defines the location of the users mail spool files as the -# fully-qualified filename obtained by prepending the user home -# directory before $MAIL_FILE -# -# NOTE: This is no more used for setting up users MAIL environment variable -# which is, starting from shadow 4.0.12-1 in Debian, entirely the -# job of the pam_mail PAM modules -# See default PAM configuration files provided for -# login, su, etc. -# -# This is a temporary situation: setting these variables will soon -# move to /etc/default/useradd and the variables will then be -# no more supported -MAIL_DIR /var/mail -#MAIL_FILE .mail - -# -# Enable logging and display of /var/log/faillog login failure info. -# This option conflicts with the pam_tally PAM module. -# -FAILLOG_ENAB yes - -# -# Enable display of unknown usernames when login failures are recorded. -# -# WARNING: Unknown usernames may become world readable. -# See #290803 and #298773 for details about how this could become a security -# concern -LOG_UNKFAIL_ENAB no - -# -# Enable logging of successful logins -# -LOG_OK_LOGINS no - -# -# Enable "syslog" logging of su activity - in addition to sulog file logging. -# SYSLOG_SG_ENAB does the same for newgrp and sg. -# -SYSLOG_SU_ENAB yes -SYSLOG_SG_ENAB yes - -# -# If defined, all su activity is logged to this file. -# -#SULOG_FILE /var/log/sulog - -# -# If defined, file which maps tty line to TERM environment parameter. -# Each line of the file is in a format something like "vt100 tty01". -# -#TTYTYPE_FILE /etc/ttytype - -# -# If defined, login failures will be logged here in a utmp format -# last, when invoked as lastb, will read /var/log/btmp, so... -# -FTMP_FILE /var/log/btmp - -# -# If defined, the command name to display when running "su -". For -# example, if this is defined as "su" then a "ps" will display the -# command is "-su". If not defined, then "ps" would display the -# name of the shell actually being run, e.g. something like "-sh". -# -SU_NAME su - -# -# If defined, file which inhibits all the usual chatter during the login -# sequence. If a full pathname, then hushed mode will be enabled if the -# user's name or shell are found in the file. If not a full pathname, then -# hushed mode will be enabled if the file exists in the user's home directory. -# -HUSHLOGIN_FILE .hushlogin -#HUSHLOGIN_FILE /etc/hushlogins - -# -# *REQUIRED* The default PATH settings, for superuser and normal users. -# -# (they are minimal, add the rest in the shell startup files) -ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games - -# -# Terminal permissions -# -# TTYGROUP Login tty will be assigned this group ownership. -# TTYPERM Login tty will be set to this permission. -# -# If you have a "write" program which is "setgid" to a special group -# which owns the terminals, define TTYGROUP to the group number and -# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign -# TTYPERM to either 622 or 600. -# -# In Debian /usr/bin/bsd-write or similar programs are setgid tty -# However, the default and recommended value for TTYPERM is still 0600 -# to not allow anyone to write to anyone else console or terminal - -# Users can still allow other people to write them by issuing -# the "mesg y" command. - -TTYGROUP tty -TTYPERM 0600 - -# -# Login configuration initializations: -# -# ERASECHAR Terminal ERASE character ('\010' = backspace). -# KILLCHAR Terminal KILL character ('\025' = CTRL/U). -# UMASK Default "umask" value. -# -# The ERASECHAR and KILLCHAR are used only on System V machines. -# -# UMASK is the default umask value for pam_umask and is used by -# useradd and newusers to set the mode of the new home directories. -# 022 is the "historical" value in Debian for UMASK -# 027, or even 077, could be considered better for privacy -# There is no One True Answer here : each sysadmin must make up his/her -# mind. -# -# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value -# for private user groups, i. e. the uid is the same as gid, and username is -# the same as the primary group name: for these, the user permissions will be -# used as group permissions, e. g. 022 will become 002. -# -# Prefix these values with "0" to get octal, "0x" to get hexadecimal. -# -ERASECHAR 0177 -KILLCHAR 025 -UMASK 022 - -# -# Password aging controls: -# -# PASS_MAX_DAYS Maximum number of days a password may be used. -# PASS_MIN_DAYS Minimum number of days allowed between password changes. -# PASS_WARN_AGE Number of days warning given before a password expires. -# -PASS_MAX_DAYS 180 -PASS_MIN_DAYS 0 -PASS_WARN_AGE 15 - -# -# Min/max values for automatic uid selection in useradd -# -UID_MIN 1000 -UID_MAX 60000 -# System accounts -#SYS_UID_MIN 100 -#SYS_UID_MAX 999 - -# -# Min/max values for automatic gid selection in groupadd -# -GID_MIN 1000 -GID_MAX 60000 -# System accounts -#SYS_GID_MIN 100 -#SYS_GID_MAX 999 - -# -# Max number of login retries if password is bad. This will most likely be -# overriden by PAM, since the default pam_unix module has it's own built -# in of 3 retries. However, this is a safe fallback in case you are using -# an authentication module that does not enforce PAM_MAXTRIES. -# -LOGIN_RETRIES 5 - -# -# Max time in seconds for login -# -LOGIN_TIMEOUT 60 - -# -# Which fields may be changed by regular users using chfn - use -# any combination of letters "frwh" (full name, room number, work -# phone, home phone). If not defined, no changes are allowed. -# For backward compatibility, "yes" = "rwh" and "no" = "frwh". -# -CHFN_RESTRICT rwh - -# -# Should login be allowed if we can't cd to the home directory? -# Default in no. -# -DEFAULT_HOME yes - -# -# If defined, this command is run when removing a user. -# It should remove any at/cron/print jobs etc. owned by -# the user to be removed (passed as the first argument). -# -#USERDEL_CMD /usr/sbin/userdel_local - -# -# If set to yes, userdel will remove the user's group if it contains no -# more members, and useradd will create by default a group with the name -# of the user. -# -# Other former uses of this variable such as setting the umask when -# user==primary group are not used in PAM environments, such as Debian -# -USERGROUPS_ENAB yes - -# -# Instead of the real user shell, the program specified by this parameter -# will be launched, although its visible name (argv[0]) will be the shell's. -# The program may do whatever it wants (logging, additional authentification, -# banner, ...) before running the actual shell. -# -# FAKE_SHELL /bin/fakeshell - -# -# If defined, either full pathname of a file containing device names or -# a ":" delimited list of device names. Root logins will be allowed only -# upon these devices. -# -# This variable is used by login and su. -# -#CONSOLE /etc/consoles -#CONSOLE console:tty01:tty02:tty03:tty04 - -# -# List of groups to add to the user's supplementary group set -# when logging in on the console (as determined by the CONSOLE -# setting). Default is none. -# -# Use with caution - it is possible for users to gain permanent -# access to these groups, even when not logged in on the console. -# How to do it is left as an exercise for the reader... -# -# This variable is used by login and su. -# -#CONSOLE_GROUPS floppy:audio:cdrom - -# -# If set to "yes", new passwords will be encrypted using the MD5-based -# algorithm compatible with the one used by recent releases of FreeBSD. -# It supports passwords of unlimited length and longer salt strings. -# Set to "no" if you need to copy encrypted passwords to other systems -# which don't understand the new algorithm. Default is "no". -# -# This variable is deprecated. You should use ENCRYPT_METHOD. -# -#MD5_CRYPT_ENAB no - -# -# If set to MD5 , MD5-based algorithm will be used for encrypting password -# If set to SHA256, SHA256-based algorithm will be used for encrypting password -# If set to SHA512, SHA512-based algorithm will be used for encrypting password -# If set to DES, DES-based algorithm will be used for encrypting password (default) -# Overrides the MD5_CRYPT_ENAB option -# -# Note: It is recommended to use a value consistent with -# the PAM modules configuration. -# -ENCRYPT_METHOD SHA512 - -# -# Only used if ENCRYPT_METHOD is set to SHA256 or SHA512. -# -# Define the number of SHA rounds. -# With a lot of rounds, it is more difficult to brute forcing the password. -# But note also that it more CPU resources will be needed to authenticate -# users. -# -# If not specified, the libc will choose the default number of rounds (5000). -# The values must be inside the 1000-999999999 range. -# If only one of the MIN or MAX values is set, then this value will be used. -# If MIN > MAX, the highest value will be used. -# -# SHA_CRYPT_MIN_ROUNDS 5000 -# SHA_CRYPT_MAX_ROUNDS 5000 - -################# OBSOLETED BY PAM ############## -# # -# These options are now handled by PAM. Please # -# edit the appropriate file in /etc/pam.d/ to # -# enable the equivelants of them. -# -############### - -#MOTD_FILE -#DIALUPS_CHECK_ENAB -#LASTLOG_ENAB -#MAIL_CHECK_ENAB -#OBSCURE_CHECKS_ENAB -#PORTTIME_CHECKS_ENAB -#SU_WHEEL_ONLY -#CRACKLIB_DICTPATH -#PASS_CHANGE_TRIES -#PASS_ALWAYS_WARN -#ENVIRON_FILE -#NOLOGINS_FILE -#ISSUE_FILE -#PASS_MIN_LEN -#PASS_MAX_LEN -#ULIMIT -#ENV_HZ -#CHFN_AUTH -#CHSH_AUTH -#FAIL_DELAY - -################# OBSOLETED ####################### -# # -# These options are no more handled by shadow. # -# # -# Shadow utilities will display a warning if they # -# still appear. # -# # -################################################### - -# CLOSE_SESSIONS -# LOGIN_STRING -# NO_PASSWORD_CONSOLE -# QMAIL_DIR - - - diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.1_1645.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.1_1645.conf deleted file mode 100644 index ffdda7b401a7..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.1_1645.conf +++ /dev/null @@ -1,2 +0,0 @@ -# server[:port] shared_secret timeout(s) source_ip vrf -[10.10.10.1]:1645 pass1 1 \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.2_1645.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.2_1645.conf deleted file mode 100644 index 3b680807cbcf..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/10.10.10.2_1645.conf +++ /dev/null @@ -1,2 +0,0 @@ -# server[:port] shared_secret timeout(s) source_ip vrf -[10.10.10.2]:1645 pass2 2 \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/common-auth-sonic deleted file mode 100644 index d6b148633eb8..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/common-auth-sonic +++ /dev/null @@ -1,30 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -# root user can only be authenticated locally. Jump to local. -auth [success=2 default=ignore] pam_succeed_if.so user = root -# For the RADIUS servers, on success jump to the cache the MPL(Privilege) -auth [success=3 new_authtok_reqd=done default=ignore auth_err=die] pam_radius_auth.so conf=/etc/pam_radius_auth.d/10.10.10.1_1645.conf privilege_level protocol=pap retry=1 nas_ip_address=10.10.10.10 debug try_first_pass -auth [success=2 new_authtok_reqd=done default=ignore auth_err=die] pam_radius_auth.so conf=/etc/pam_radius_auth.d/10.10.10.2_1645.conf privilege_level protocol=chap retry=2 nas_ip_address=10.10.10.10 debug try_first_pass -# Local -auth [success=done new_authtok_reqd=done default=ignore auth_err=die maxtries=die] pam_unix.so nullok try_first_pass -auth requisite pam_deny.so -# Cache MPL(Privilege) -auth [success=1 default=ignore] pam_exec.so /usr/sbin/cache_radius - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/radius_nss.conf deleted file mode 100644 index 8c31db9fbafe..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/radius_nss.conf +++ /dev/null @@ -1,56 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on -debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/tacplus_nss.conf deleted file mode 100644 index eac828491ac1..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/RADIUS/tacplus_nss.conf +++ /dev/null @@ -1,40 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on -debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization -local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/common-auth-sonic deleted file mode 100644 index 87af4cc5c6ac..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/common-auth-sonic +++ /dev/null @@ -1,21 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -auth [success=1 default=ignore] pam_unix.so nullok try_first_pass - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/radius_nss.conf deleted file mode 100644 index 1567b6e645e0..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/radius_nss.conf +++ /dev/null @@ -1,55 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/tacplus_nss.conf deleted file mode 100644 index bffd6f70391f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_disable_accounting/tacplus_nss.conf +++ /dev/null @@ -1,41 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization -local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 -server=192.168.1.1:50,secret=dellsonic,timeout=10,vrf=default -server=192.168.1.2:51,secret=dellsonic1,timeout=15,vrf=mgmt - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/common-auth-sonic deleted file mode 100644 index 87af4cc5c6ac..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/common-auth-sonic +++ /dev/null @@ -1,21 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -auth [success=1 default=ignore] pam_unix.so nullok try_first_pass - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/radius_nss.conf deleted file mode 100644 index 1567b6e645e0..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/radius_nss.conf +++ /dev/null @@ -1,55 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/tacplus_nss.conf deleted file mode 100644 index d24cab57d1f4..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local/tacplus_nss.conf +++ /dev/null @@ -1,42 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting -local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization -local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 -server=192.168.1.1:50,secret=dellsonic,timeout=10,vrf=default -server=192.168.1.2:51,secret=dellsonic1,timeout=15,vrf=mgmt - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/common-auth-sonic deleted file mode 100644 index 87af4cc5c6ac..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/common-auth-sonic +++ /dev/null @@ -1,21 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -auth [success=1 default=ignore] pam_unix.so nullok try_first_pass - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/radius_nss.conf deleted file mode 100644 index 1567b6e645e0..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/radius_nss.conf +++ /dev/null @@ -1,55 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/tacplus_nss.conf deleted file mode 100644 index 431cbcec0aca..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_local_and_tacacs/tacplus_nss.conf +++ /dev/null @@ -1,44 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting -local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting -tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization -local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization -tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 -server=192.168.1.1:50,secret=dellsonic,timeout=10,vrf=default -server=192.168.1.2:51,secret=dellsonic1,timeout=15,vrf=mgmt - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/common-auth-sonic b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/common-auth-sonic deleted file mode 100644 index 87af4cc5c6ac..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/common-auth-sonic +++ /dev/null @@ -1,21 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# -# /etc/pam.d/common-auth- authentication settings common to all services -# This file is included from other service-specific PAM config files, -# and should contain a list of the authentication modules that define -# the central authentication scheme for use on the system -# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the -# traditional Unix authentication mechanisms. -# -# here are the per-package modules (the "Primary" block) - -auth [success=1 default=ignore] pam_unix.so nullok try_first_pass - -# -# here's the fallback if no module succeeds -auth requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -auth required pam_permit.so -# and here are more per-package modules (the "Additional" block) diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login deleted file mode 100644 index 80ba6452813f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth-sonic - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login.old deleted file mode 100644 index 07ff95407ccd..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/login.old +++ /dev/null @@ -1,116 +0,0 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# -# With the default control of this module: -# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] -# root will not be prompted for a password on insecure lines. -# if an invalid username is entered, a password is prompted (but login -# will eventually be rejected) -# -# You can change it to a "requisite" module if you think root may mis-type -# her login and should not be prompted for a password in that case. But -# this will leave the system as vulnerable to user enumeration attacks. -# -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root on insecure lines), but root passwords may be -# communicated over insecure lines. -auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Sets the loginuid process attribute -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 -# locale variables are also kept into /etc/default/locale in etch -# reading this file *in addition to /etc/environment* does not hurt -session required pam_env.so readenv=1 envfile=/etc/default/locale - -# Standard Un*x authentication. -@include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restraint on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon successful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the message of the day upon successful login. -# (Replaces the `MOTD_FILE' option in login.defs) -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Prints the status of the user's mailbox upon successful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x account and session -@include common-account -@include common-session -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/radius_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/radius_nss.conf deleted file mode 100644 index 1567b6e645e0..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/radius_nss.conf +++ /dev/null @@ -1,55 +0,0 @@ -#THIS IS AN AUTO-GENERATED FILE -# Generated from: /usr/share/sonic/templates/radius_nss.conf.j2 -# RADIUS NSS Configuration File -# -# Debug: on|off|trace -# Default: off -# -# debug=on - -# -# User Privilege: -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell - -# Eg: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/usr/bin/sonic-launch-shell -# user_priv=7;pw_info=netops;gid=999;group=docker;shell=/usr/bin/sonic-launch-shell -# user_priv=1;pw_info=operator;gid=100;group=docker;shell=/usr/bin/sonic-launch-shell -# - -# many_to_one: -# y: Map RADIUS users to one local user per privilege. -# n: Create local user account on first successful authentication. -# Default: n -# - -# Eg: -# many_to_one=y -# - -# unconfirmed_disallow: -# y: Do not allow unconfirmed users (users created before authentication) -# n: Allow unconfirmed users. -# Default: n - -# Eg: -# unconfirmed_disallow=y -# - -# unconfirmed_ageout: -# : Wait time before purging unconfirmed users -# Default: 600 -# - -# Eg: -# unconfirmed_ageout=900 -# - -# unconfirmed_regexp: -# : The RE to match the command line of processes for which the -# creation of unconfirmed users are to be allowed. -# Default: (.*: \[priv\])|(.*: \[accepted\]) -# where: is the unconfirmed user. -# \ No newline at end of file diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd deleted file mode 100644 index c025af353d6f..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth-sonic - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd.old b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd.old deleted file mode 100644 index d70b384bd9a3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/sshd.old +++ /dev/null @@ -1,55 +0,0 @@ -# PAM configuration for the Secure Shell service - -# Standard Un*x authentication. -@include common-auth - -# Disallow non-root logins when /etc/nologin exists. -account required pam_nologin.so - -# Uncomment and edit /etc/security/access.conf if you need to set complex -# access limits that are hard to express in sshd_config. -# account required pam_access.so - -# Standard Un*x authorization. -@include common-account - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without this it is possible that a -# module could execute code in the wrong domain. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -# Set the loginuid process attribute. -session required pam_loginuid.so - -# Create a new session keyring. -session optional pam_keyinit.so force revoke - -# Standard Un*x session setup and teardown. -@include common-session - -# Print the message of the day upon successful login. -# This includes a dynamically generated part from /run/motd.dynamic -# and a static (admin-editable) part from /etc/motd. -session optional pam_motd.so motd=/run/motd.dynamic -session optional pam_motd.so noupdate - -# Print the status of the user's mailbox upon successful login. -session optional pam_mail.so standard noenv # [1] - -# Set up user limits from /etc/security/limits.conf. -session required pam_limits.so - -# Read environment variables from /etc/environment and -# /etc/security/pam_env.conf. -session required pam_env.so # [1] -# In Debian 4.0 (etch), locale-related environment variables were moved to -# /etc/default/locale, so read that as well. -session required pam_env.so user_readenv=1 envfile=/etc/default/locale - -# SELinux needs to intervene at login time to ensure that the process starts -# in the proper default security context. Only sessions which are intended -# to run in the user's context should be run after this. -session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open - -# Standard Un*x password updating. -@include common-password diff --git a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/tacplus_nss.conf b/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/tacplus_nss.conf deleted file mode 100644 index c9b8ab2944cc..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/sample_output/TACACS_config_db_tacacs/tacplus_nss.conf +++ /dev/null @@ -1,42 +0,0 @@ -# Configuration for libnss-tacplus - -# debug - If you want to open debug log, set it on -# Default: off -# debug=on - -# local_accounting - If you want to local accounting, set it -# Default: None -# local_accounting - -# tacacs_accounting - If you want to tacacs+ accounting, set it -# Default: None -# tacacs_accounting -tacacs_accounting - -# local_authorization - If you want to local authorization, set it -# Default: None -# local_authorization - -# tacacs_authorization - If you want to tacacs+ authorization, set it -# Default: None -# tacacs_authorization -tacacs_authorization - -# src_ip - set source address of TACACS+ protocol packets -# Default: None (auto source ip address) -# src_ip=2.2.2.2 - -# server - set ip address, tcp port, secret string and timeout for TACACS+ servers -# Default: None (no TACACS+ server) -# server=1.1.1.1:49,secret=test,timeout=3 -server=192.168.1.1:50,secret=dellsonic,timeout=10,vrf=default -server=192.168.1.2:51,secret=dellsonic1,timeout=15,vrf=mgmt - -# user_priv - set the map between TACACS+ user privilege and local user's passwd -# Default: -# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash -# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash - -# many_to_one - create one local user for many TACACS+ users which has the same privilege -# Default: many_to_one=n -# many_to_one=y diff --git a/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py deleted file mode 100644 index acf1c7671125..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/test_passwh_vectors.py +++ /dev/null @@ -1,244 +0,0 @@ -""" - hostcfgd test password hardening vector -""" -HOSTCFGD_TEST_PASSWH_VECTOR = [ - [ - "PASSWORD_HARDENING", - { - "default_values":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "disabled", - "expiration": "180", - "expiration_warning": "15", - "history_cnt": "10", - "len_min": "8", - "reject_user_passw_match": "True", - "lower_class": "True", - "upper_class": "True", - "digits_class": "True", - "special_class": "True" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - } - }, - "enable_feature":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "enabled", - "expiration": "180", - "expiration_warning": "15", - "history_cnt": "10", - "len_min": "8", - "reject_user_passw_match": "True", - "lower_class": "True", - "upper_class": "True", - "digits_class": "True", - "special_class": "True" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - } - }, - "enable_digits_class":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "enabled", - "expiration": "0", - "expiration_warning": "0", - "history_cnt": "0", - "len_min": "8", - "reject_user_passw_match": "False", - "lower_class": "False", - "upper_class": "False", - "digits_class": "True", - "special_class": "False" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - } - }, - "enable_lower_class":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "enabled", - "expiration": "0", - "expiration_warning": "0", - "history_cnt": "0", - "len_min": "8", - "reject_user_passw_match": "False", - "lower_class": "True", - "upper_class": "False", - "digits_class": "False", - "special_class": "False" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - }, - "enable_upper_class":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "enabled", - "expiration": "0", - "expiration_warning": "0", - "history_cnt": "0", - "len_min": "8", - "reject_user_passw_match": "False", - "lower_class": "False", - "upper_class": "True", - "digits_class": "False", - "special_class": "False" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - } - }, - "enable_special_class":{ - "PASSW_HARDENING": { - "POLICIES":{ - "state": "enabled", - "expiration": "0", - "expiration_warning": "0", - "history_cnt": "0", - "len_min": "8", - "reject_user_passw_match": "False", - "lower_class": "False", - "upper_class": "False", - "digits_class": "False", - "special_class": "True" - } - }, - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - } - } - } - ] -] diff --git a/src/sonic-host-services/tests/hostcfgd/test_radius_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_radius_vectors.py deleted file mode 100644 index df10499e1a23..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/test_radius_vectors.py +++ /dev/null @@ -1,181 +0,0 @@ -from unittest.mock import call - -""" - hostcfgd test radius vector -""" -HOSTCFGD_TEST_RADIUS_VECTOR = [ - [ - "RADIUS", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "radius,local", - "debug": "True", - } - }, - "RADIUS": { - "global": { - "nas_ip": "10.10.10.10", - "auth_port": "1645", - "auth_type": "mschapv2", - "retransmit": "2", - "timeout": "3", - "passkey": "pass", - } - }, - "RADIUS_SERVER": { - "10.10.10.1": { - "auth_type": "pap", - "retransmit": "1", - "timeout": "1", - "passkey": "pass1", - }, - "10.10.10.2": { - "auth_type": "chap", - "retransmit": "2", - "timeout": "2", - "passkey": "pass2", - } - }, - }, - "expected_config_db": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "AAA": { - "authentication": { - "login": "radius,local", - "debug": "True", - } - }, - "RADIUS": { - "global": { - "nas_ip": "10.10.10.10", - "auth_port": "1645", - "auth_type": "mschapv2", - "retransmit": "2", - "timeout": "3", - "passkey": "pass", - } - }, - "RADIUS_SERVER": { - "10.10.10.1": { - "auth_type": "pap", - "retransmit": "1", - "timeout": "1", - "passkey": "pass1", - }, - "10.10.10.2": { - "auth_type": "chap", - "retransmit": "2", - "timeout": "2", - "passkey": "pass2", - } - }, - }, - "expected_subprocess_calls": [ - call("service aaastatsd start", shell=True), - ], - } - ], - [ - "LOCAL", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "local", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "local", - "debug": "True", - } - }, - }, - "expected_config_db": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "local", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "AAA": { - "authentication": { - "login": "local", - "debug": "True", - } - }, - }, - "expected_subprocess_calls": [ - call("service aaastatsd start", shell=True), - ], - }, - ], -] diff --git a/src/sonic-host-services/tests/hostcfgd/test_tacacs_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_tacacs_vectors.py deleted file mode 100644 index 38d0012fa854..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/test_tacacs_vectors.py +++ /dev/null @@ -1,260 +0,0 @@ -from unittest.mock import call - -""" - hostcfgd test tacacs vector -""" -HOSTCFGD_TEST_TACACS_VECTOR = [ - [ - "TACACS", - { - "config_db_local": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "local" - }, - "authorization": { - "login": "local" - }, - "accounting": { - "login": "local" - } - }, - "TACPLUS": { - "global": { - "auth_type": "chap", - "timeout": 5, - "passkey": "dellsonic", - "src_intf": "Ethernet0" - } - }, - "TACPLUS_SERVER": { - "192.168.1.1" : { - "priority": 5, - "tcp_port": 50, - "timeout": 10, - "auth_type": "chap", - "passkey": "dellsonic", - "vrf": "default" - }, - "192.168.1.2" : { - "priority": 2, - "tcp_port": 51, - "timeout": 15, - "auth_type": "pap", - "passkey": "dellsonic1", - "vrf": "mgmt" - } - }, - }, - "config_db_tacacs": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "local" - }, - "authorization": { - "login": "tacacs+" - }, - "accounting": { - "login": "tacacs+" - } - }, - "TACPLUS": { - "global": { - "auth_type": "chap", - "timeout": 5, - "passkey": "dellsonic", - "src_intf": "Ethernet0" - } - }, - "TACPLUS_SERVER": { - "192.168.1.1" : { - "priority": 5, - "tcp_port": 50, - "timeout": 10, - "auth_type": "chap", - "passkey": "dellsonic", - "vrf": "default" - }, - "192.168.1.2" : { - "priority": 2, - "tcp_port": 51, - "timeout": 15, - "auth_type": "pap", - "passkey": "dellsonic1", - "vrf": "mgmt" - } - }, - }, - "config_db_local_and_tacacs": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "local" - }, - "authorization": { - "login": "tacacs+ local" - }, - "accounting": { - "login": "tacacs+ local" - } - }, - "TACPLUS": { - "global": { - "auth_type": "chap", - "timeout": 5, - "passkey": "dellsonic", - "src_intf": "Ethernet0" - } - }, - "TACPLUS_SERVER": { - "192.168.1.1" : { - "priority": 5, - "tcp_port": 50, - "timeout": 10, - "auth_type": "chap", - "passkey": "dellsonic", - "vrf": "default" - }, - "192.168.1.2" : { - "priority": 2, - "tcp_port": 51, - "timeout": 15, - "auth_type": "pap", - "passkey": "dellsonic1", - "vrf": "mgmt" - } - }, - }, - "config_db_disable_accounting": { - "DEVICE_METADATA": { - "localhost": { - "hostname": "radius", - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "AAA": { - "authentication": { - "login": "local" - }, - "authorization": { - "login": "local" - }, - "accounting": { - "login": "disable" - } - }, - "TACPLUS": { - "global": { - "auth_type": "chap", - "timeout": 5, - "passkey": "dellsonic", - "src_intf": "Ethernet0" - } - }, - "TACPLUS_SERVER": { - "192.168.1.1" : { - "priority": 5, - "tcp_port": 50, - "timeout": 10, - "auth_type": "chap", - "passkey": "dellsonic", - "vrf": "default" - }, - "192.168.1.2" : { - "priority": 2, - "tcp_port": 51, - "timeout": 15, - "auth_type": "pap", - "passkey": "dellsonic1", - "vrf": "mgmt" - } - }, - } - } - ] -] diff --git a/src/sonic-host-services/tests/hostcfgd/test_vectors.py b/src/sonic-host-services/tests/hostcfgd/test_vectors.py deleted file mode 100644 index 43754252c0e3..000000000000 --- a/src/sonic-host-services/tests/hostcfgd/test_vectors.py +++ /dev/null @@ -1,567 +0,0 @@ -from unittest.mock import call - -""" - hostcfgd test vector -""" -HOSTCFGD_TEST_VECTOR = [ - [ - "DualTorCase", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "expected_config_db": { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "enabled" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "enable_feature_subprocess_calls": [ - call("sudo systemctl unmask dhcp_relay.service", shell=True), - call("sudo systemctl enable dhcp_relay.service", shell=True), - call("sudo systemctl start dhcp_relay.service", shell=True), - call("sudo systemctl unmask mux.service", shell=True), - call("sudo systemctl enable mux.service", shell=True), - call("sudo systemctl start mux.service", shell=True), - call("sudo systemctl unmask telemetry.service", shell=True), - call("sudo systemctl unmask telemetry.timer", shell=True), - call("sudo systemctl enable telemetry.timer", shell=True), - call("sudo systemctl start telemetry.timer", shell=True), - ], - "daemon_reload_subprocess_call": [ - call("sudo systemctl daemon-reload", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error') - }, - }, - ], - [ - "SingleToRCase", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "type": "ToR", - } - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - "sflow": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "always_enabled" - }, - }, - }, - "expected_config_db": { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "disabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "always_disabled" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - "sflow": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "always_enabled" - }, - }, - }, - "enable_feature_subprocess_calls": [ - call("sudo systemctl stop mux.service", shell=True), - call("sudo systemctl disable mux.service", shell=True), - call("sudo systemctl mask mux.service", shell=True), - call("sudo systemctl unmask telemetry.service", shell=True), - call("sudo systemctl unmask telemetry.timer", shell=True), - call("sudo systemctl enable telemetry.timer", shell=True), - call("sudo systemctl start telemetry.timer", shell=True), - call("sudo systemctl unmask sflow.service", shell=True), - call("sudo systemctl enable sflow.service", shell=True), - call("sudo systemctl start sflow.service", shell=True), - ], - "daemon_reload_subprocess_call": [ - call("sudo systemctl daemon-reload", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error') - }, - }, - ], - [ - "T1Case", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "type": "T1", - } - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "expected_config_db": { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "disabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "always_disabled" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "enable_feature_subprocess_calls": [ - call("sudo systemctl stop mux.service", shell=True), - call("sudo systemctl disable mux.service", shell=True), - call("sudo systemctl mask mux.service", shell=True), - call("sudo systemctl unmask telemetry.service", shell=True), - call("sudo systemctl unmask telemetry.timer", shell=True), - call("sudo systemctl enable telemetry.timer", shell=True), - call("sudo systemctl start telemetry.timer", shell=True), - ], - "daemon_reload_subprocess_call": [ - call("sudo systemctl daemon-reload", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error') - }, - }, - ], - [ - "SingleToRCase_DHCP_Relay_Enabled", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "type": "ToR", - } - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "expected_config_db": { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "always_disabled" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "enable_feature_subprocess_calls": [ - call("sudo systemctl unmask dhcp_relay.service", shell=True), - call("sudo systemctl enable dhcp_relay.service", shell=True), - call("sudo systemctl start dhcp_relay.service", shell=True), - call("sudo systemctl stop mux.service", shell=True), - call("sudo systemctl disable mux.service", shell=True), - call("sudo systemctl mask mux.service", shell=True), - call("sudo systemctl unmask telemetry.service", shell=True), - call("sudo systemctl unmask telemetry.timer", shell=True), - call("sudo systemctl enable telemetry.timer", shell=True), - call("sudo systemctl start telemetry.timer", shell=True), - ], - "daemon_reload_subprocess_call": [ - call("sudo systemctl daemon-reload", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('output', 'error') - }, - }, - ], - [ - "DualTorCaseWithNoSystemCalls", - { - "config_db": { - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - }, - "KDUMP": { - "config": { - "enabled": "false", - "num_dumps": "3", - "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M" - } - }, - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "expected_config_db": { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "enabled" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - }, - "enable_feature_subprocess_calls": [], - "daemon_reload_subprocess_call": [ - call("sudo systemctl daemon-reload", shell=True), - ], - "popen_attributes": { - 'communicate.return_value': ('enabled', 'error') - }, - } - ] -] - -HOSTCFG_DAEMON_CFG_DB = { - "FEATURE": { - "dhcp_relay": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "{% if not (DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != 'ToRRouter') %}enabled{% else %}disabled{% endif %}" - }, - "mux": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "False", - "high_mem_alert": "disabled", - "set_owner": "local", - "state": "{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %}enabled{% else %}always_disabled{% endif %}" - }, - "telemetry": { - "auto_restart": "enabled", - "has_global_scope": "True", - "has_per_asic_scope": "False", - "has_timer": "True", - "high_mem_alert": "disabled", - "set_owner": "kube", - "state": "enabled", - "status": "enabled" - }, - }, - "KDUMP": { - "config": { - - } - }, - "NTP": { - "global": { - "vrf": "default", - "src_intf": "eth0;Loopback0" - } - }, - "NTP_SERVER": { - "0.debian.pool.ntp.org": {} - }, - "LOOPBACK_INTERFACE": { - "Loopback0|10.184.8.233/32": { - "scope": "global", - "family": "IPv4" - } - }, - "DEVICE_METADATA": { - "localhost": { - "subtype": "DualToR", - "type": "ToRRouter", - } - } -} diff --git a/src/sonic-host-services/tests/mock_connector.py b/src/sonic-host-services/tests/mock_connector.py deleted file mode 100644 index d32017ff8485..000000000000 --- a/src/sonic-host-services/tests/mock_connector.py +++ /dev/null @@ -1,24 +0,0 @@ -class MockConnector(object): - STATE_DB = None - data = {} - - def __init__(self, host): - pass - - def connect(self, db_id): - pass - - def get(self, db_id, key, field): - return MockConnector.data[key][field] - - def keys(self, db_id, pattern): - match = pattern.split('*')[0] - ret = [] - for key in MockConnector.data.keys(): - if match in key: - ret.append(key) - - return ret - - def get_all(self, db_id, key): - return MockConnector.data[key] diff --git a/src/sonic-host-services/tests/procdockerstatsd_test.py b/src/sonic-host-services/tests/procdockerstatsd_test.py deleted file mode 100644 index 4db198be7d75..000000000000 --- a/src/sonic-host-services/tests/procdockerstatsd_test.py +++ /dev/null @@ -1,43 +0,0 @@ -import sys -import os -import pytest - -from swsscommon import swsscommon -from sonic_py_common.general import load_module_from_source - -from .mock_connector import MockConnector - -swsscommon.SonicV2Connector = MockConnector - -test_path = os.path.dirname(os.path.abspath(__file__)) -modules_path = os.path.dirname(test_path) -scripts_path = os.path.join(modules_path, "scripts") -sys.path.insert(0, modules_path) - -# Load the file under test -procdockerstatsd_path = os.path.join(scripts_path, 'procdockerstatsd') -procdockerstatsd = load_module_from_source('procdockerstatsd', procdockerstatsd_path) - -class TestProcDockerStatsDaemon(object): - def test_convert_to_bytes(self): - test_data = [ - ('1B', 1), - ('500B', 500), - ('1KB', 1000), - ('500KB', 500000), - ('1MB', 1000000), - ('500MB', 500000000), - ('1MiB', 1048576), - ('500MiB', 524288000), - ('66.41MiB', 69635932), - ('333.6MiB', 349804954), - ('1GiB', 1073741824), - ('500GiB', 536870912000), - ('7.751GiB', 8322572878) - ] - - pdstatsd = procdockerstatsd.ProcDockerStats(procdockerstatsd.SYSLOG_IDENTIFIER) - - for test_input, expected_output in test_data: - res = pdstatsd.convert_to_bytes(test_input) - assert res == expected_output From 81600fafe9f2335117d3d6e72cf29134f99c9aab Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Thu, 14 Jul 2022 17:20:16 +0800 Subject: [PATCH 561/817] [Mellanox] Support new platform API get_port_or_cage_type for RJ45 ports (#11336) - Why I did it Support get_port_or_cage_type for RJ45 ports - How I did it Implement the new platform API get_port_or_cage_type Fix the issue: unable to import SFP when chassis object is destructed - How to verify it Manually test and regression test Signed-off-by: Stephen Sun --- .../sonic_platform/chassis.py | 58 ++++++++++++++----- .../mlnx-platform-api/tests/test_chassis.py | 14 +++++ 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index 23e69645e843..b9fa2593174c 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -30,7 +30,6 @@ from .utils import extract_RJ45_ports_index from . import utils from .device_data import DeviceDataManager - from .sfp import SFP, RJ45Port, deinitialize_sdk_handle except ImportError as e: raise ImportError (str(e) + "- required module not found") @@ -110,6 +109,8 @@ def __init__(self): self.sfp_event = None self.reboot_cause_initialized = False + self.sfp_module = None + # Build the RJ45 port list from platform.json and hwsku.json self._RJ45_port_inited = False self._RJ45_port_list = None @@ -121,9 +122,8 @@ def __del__(self): self.sfp_event.deinitialize() if self._sfp_list: - from .sfp import SFP, deinitialize_sdk_handle - if SFP.shared_sdk_handle: - deinitialize_sdk_handle(SFP.shared_sdk_handle) + if self.sfp_module.SFP.shared_sdk_handle: + self.sfp_module.deinitialize_sdk_handle(sfp_module.SFP.shared_sdk_handle) @property def RJ45_port_list(self): @@ -249,6 +249,12 @@ def get_fan_drawer(self, index): # SFP methods ############################################## + def _import_sfp_module(self): + if not self.sfp_module: + from . import sfp as sfp_module + self.sfp_module = sfp_module + return self.sfp_module + def initialize_single_sfp(self, index): sfp_count = self.get_num_sfps() if index < sfp_count: @@ -256,32 +262,32 @@ def initialize_single_sfp(self, index): self._sfp_list = [None] * sfp_count if not self._sfp_list[index]: - from .sfp import SFP + sfp_module = self._import_sfp_module() if self.RJ45_port_list and index in self.RJ45_port_list: - self._sfp_list[index] = RJ45Port(index) + self._sfp_list[index] = sfp_module.RJ45Port(index) else: - self._sfp_list[index] = SFP(index) + self._sfp_list[index] = sfp_module.SFP(index) self.sfp_initialized_count += 1 def initialize_sfp(self): if not self._sfp_list: - from .sfp import SFP + sfp_module = self._import_sfp_module() sfp_count = self.get_num_sfps() for index in range(sfp_count): if self.RJ45_port_list and index in self.RJ45_port_list: - sfp_module = RJ45Port(index) + sfp_object = sfp_module.RJ45Port(index) else: - sfp_module = SFP(index) - self._sfp_list.append(sfp_module) + sfp_object = sfp_module.SFP(index) + self._sfp_list.append(sfp_object) self.sfp_initialized_count = sfp_count elif self.sfp_initialized_count != len(self._sfp_list): - from .sfp import SFP + sfp_module = self._import_sfp_module() for index in range(len(self._sfp_list)): if self._sfp_list[index] is None: if self.RJ45_port_list and index in self.RJ45_port_list: - self._sfp_list[index] = RJ45Port(index) + self._sfp_list[index] = sfp_module.RJ45Port(index) else: - self._sfp_list[index] = SFP(index) + self._sfp_list[index] = sfp_module.SFP(index) self.sfp_initialized_count = len(self._sfp_list) def get_num_sfps(self): @@ -321,6 +327,30 @@ def get_sfp(self, index): self.initialize_single_sfp(index) return super(Chassis, self).get_sfp(index) + def get_port_or_cage_type(self, index): + """ + Retrieves sfp port or cage type corresponding to physical port + + Args: + index: An integer (>=0), the index of the sfp to retrieve. + The index should correspond to the physical port in a chassis. + For example:- + 1 for Ethernet0, 2 for Ethernet4 and so on for one platform. + 0 for Ethernet0, 1 for Ethernet4 and so on for another platform. + + Returns: + The masks of all types of port or cage that can be supported on the port + Types are defined in sfp_base.py + Eg. + Both SFP and SFP+ are supported on the port, the return value should be 0x0a + which is 0x02 | 0x08 + """ + index = index - 1 + if self.RJ45_port_list and index in self.RJ45_port_list: + from sonic_platform_base.sfp_base import SfpBase + return SfpBase.SFP_PORT_TYPE_BIT_RJ45 + raise NotImplementedError + def get_change_event(self, timeout=0): """ Returns a nested dictionary containing all devices which have diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index c6235b195a02..38b6bd6cfffd 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -29,6 +29,7 @@ sys.path.insert(0, modules_path) import sonic_platform.chassis +from sonic_platform_base.sfp_base import SfpBase from sonic_platform.chassis import Chassis from sonic_platform.device_data import DeviceDataManager @@ -282,3 +283,16 @@ def test_revision_permission(self): sonic_platform.chassis.DMI_FILE = old_dmi_file os.system("rm -f " + new_dmi_file) assert rev == "N/A" + + def test_get_port_or_cage_type(self): + chassis = Chassis() + chassis.RJ45_port_list = [0] + assert SfpBase.SFP_PORT_TYPE_BIT_RJ45 == chassis.get_port_or_cage_type(1) + + exceptionRaised = False + try: + chassis.get_port_or_cage_type(2) + except NotImplementedError: + exceptionRaised = True + + assert exceptionRaised From c8cbd82abbebd35f05ca81336d811ccb73821a1b Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 14 Jul 2022 11:14:34 -0400 Subject: [PATCH 562/817] [Nokia][IXR7250E] Add Nokia platform Nokia-IXR7250E-36x100GE 100G line card device dat (#11382) Signed-off-by: mlok --- .../Nokia-IXR7250E-36x100G/0/buffers.json.j2 | 2 + .../0/buffers_defaults_t2.j2 | 37 + .../0/context_config.json | 21 + .../0/jr2cp-nokia-18x100g-4x25g-config.bcm | 2056 ++++++++++++++++ .../0/pg_profile_lookup.ini | 12 + .../Nokia-IXR7250E-36x100G/0/port_config.ini | 21 + .../Nokia-IXR7250E-36x100G/0/qos.json.j2 | 1 + .../Nokia-IXR7250E-36x100G/0/sai.profile | 1 + .../0/sai_postinit_cmd.soc | 36 + .../Nokia-IXR7250E-36x100G/1/buffers.json.j2 | 2 + .../1/buffers_defaults_t2.j2 | 37 + .../1/context_config.json | 21 + .../1/jr2cp-nokia-18x100g-4x25g-config.bcm | 2057 +++++++++++++++++ .../1/pg_profile_lookup.ini | 12 + .../Nokia-IXR7250E-36x100G/1/port_config.ini | 21 + .../Nokia-IXR7250E-36x100G/1/qos.json.j2 | 1 + .../Nokia-IXR7250E-36x100G/1/sai.profile | 1 + .../1/sai_postinit_cmd.soc | 6 + 18 files changed, 4345 insertions(+) create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers_defaults_t2.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/context_config.json create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/port_config.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/qos.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai.profile create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers_defaults_t2.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/context_config.json create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/port_config.ini create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/qos.json.j2 create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai.profile create mode 100644 device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers_defaults_t2.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..9aa3e46bcae6 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,36) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "24979046" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/context_config.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/context_config.json new file mode 100644 index 000000000000..5a8e83c7c92e --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/context_config.json @@ -0,0 +1,21 @@ +{ + "CONTEXTS": [ + { + "guid" : 0, + "name" : "syncd0", + "dbAsic" : "ASIC_DB", + "dbCounters" : "COUNTERS_DB", + "dbFlex": "FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable": false, + "zmq_endpoint": "tcp://127.0.0.1:5555", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5556", + "switches": [ + { + "index" : 0, + "hwinfo" : "06:00.0" + } + ] + } + ] +} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm new file mode 100644 index 000000000000..0fae0269330b --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -0,0 +1,2056 @@ +appl_enable_intr_init.BCM8885X=1 +appl_enable_learn_and_limit_init.BCM8885X=0 +appl_enable_oam.BCM8885X=0 +appl_enable_oam_fwd_idx_wa_init.BCM8885X=0 +appl_enable_oam_stat_wa_init.BCM8885X=0 +dma_desc_aggregator_buff_size_kb.BCM8885X=100 +dma_desc_aggregator_chain_length_max.BCM8885X=1000 +dma_desc_aggregator_enable_specific_MDB_LPM.BCM8885X=1 +dma_desc_aggregator_timeout_usec.BCM8885X=1000 +dport_map_direct.BCM8885X=1 + +dtm_flow_mapping_mode_region_64.BCM8885X=3 +dtm_flow_mapping_mode_region_65.BCM8885X=3 +dtm_flow_mapping_mode_region_66.BCM8885X=3 +dtm_flow_mapping_mode_region_67.BCM8885X=3 +dtm_flow_mapping_mode_region_68.BCM8885X=3 +dtm_flow_mapping_mode_region_69.BCM8885X=3 +dtm_flow_mapping_mode_region_70.BCM8885X=3 +dtm_flow_mapping_mode_region_71.BCM8885X=3 +dtm_flow_mapping_mode_region_72.BCM8885X=3 +dtm_flow_mapping_mode_region_73.BCM8885X=3 +dtm_flow_mapping_mode_region_74.BCM8885X=3 +dtm_flow_mapping_mode_region_75.BCM8885X=3 +dtm_flow_mapping_mode_region_76.BCM8885X=3 +dtm_flow_mapping_mode_region_77.BCM8885X=3 +dtm_flow_mapping_mode_region_78.BCM8885X=3 +dtm_flow_mapping_mode_region_79.BCM8885X=7 +dtm_flow_mapping_mode_region_80.BCM8885X=3 +dtm_flow_mapping_mode_region_81.BCM8885X=1 +dtm_flow_mapping_mode_region_82.BCM8885X=3 +dtm_flow_mapping_mode_region_83.BCM8885X=3 +dtm_flow_mapping_mode_region_84.BCM8885X=3 +dtm_flow_mapping_mode_region_85.BCM8885X=3 +dtm_flow_mapping_mode_region_86.BCM8885X=3 +dtm_flow_mapping_mode_region_87.BCM8885X=3 +dtm_flow_mapping_mode_region_88.BCM8885X=3 +dtm_flow_mapping_mode_region_89.BCM8885X=3 +dtm_flow_mapping_mode_region_90.BCM8885X=3 +dtm_flow_mapping_mode_region_91.BCM8885X=3 +dtm_flow_mapping_mode_region_92.BCM8885X=3 +dtm_flow_mapping_mode_region_93.BCM8885X=3 +dtm_flow_mapping_mode_region_94.BCM8885X=3 +dtm_flow_nof_remote_cores_region_1.BCM8885X=2 +dtm_flow_nof_remote_cores_region_10.BCM8885X=2 +dtm_flow_nof_remote_cores_region_11.BCM8885X=2 +dtm_flow_nof_remote_cores_region_12.BCM8885X=2 +dtm_flow_nof_remote_cores_region_13.BCM8885X=2 +dtm_flow_nof_remote_cores_region_14.BCM8885X=2 +dtm_flow_nof_remote_cores_region_15.BCM8885X=2 +dtm_flow_nof_remote_cores_region_16.BCM8885X=2 +dtm_flow_nof_remote_cores_region_17.BCM8885X=2 +dtm_flow_nof_remote_cores_region_18.BCM8885X=2 +dtm_flow_nof_remote_cores_region_19.BCM8885X=2 +dtm_flow_nof_remote_cores_region_2.BCM8885X=2 +dtm_flow_nof_remote_cores_region_20.BCM8885X=2 +dtm_flow_nof_remote_cores_region_21.BCM8885X=2 +dtm_flow_nof_remote_cores_region_22.BCM8885X=2 +dtm_flow_nof_remote_cores_region_23.BCM8885X=2 +dtm_flow_nof_remote_cores_region_24.BCM8885X=2 +dtm_flow_nof_remote_cores_region_25.BCM8885X=2 +dtm_flow_nof_remote_cores_region_26.BCM8885X=2 +dtm_flow_nof_remote_cores_region_27.BCM8885X=2 +dtm_flow_nof_remote_cores_region_28.BCM8885X=2 +dtm_flow_nof_remote_cores_region_29.BCM8885X=2 +dtm_flow_nof_remote_cores_region_3.BCM8885X=2 +dtm_flow_nof_remote_cores_region_30.BCM8885X=2 +dtm_flow_nof_remote_cores_region_31.BCM8885X=2 +dtm_flow_nof_remote_cores_region_32.BCM8885X=2 +dtm_flow_nof_remote_cores_region_33.BCM8885X=2 +dtm_flow_nof_remote_cores_region_34.BCM8885X=2 +dtm_flow_nof_remote_cores_region_35.BCM8885X=2 +dtm_flow_nof_remote_cores_region_36.BCM8885X=2 +dtm_flow_nof_remote_cores_region_37.BCM8885X=2 +dtm_flow_nof_remote_cores_region_38.BCM8885X=2 +dtm_flow_nof_remote_cores_region_39.BCM8885X=2 +dtm_flow_nof_remote_cores_region_4.BCM8885X=2 +dtm_flow_nof_remote_cores_region_40.BCM8885X=2 +dtm_flow_nof_remote_cores_region_41.BCM8885X=2 +dtm_flow_nof_remote_cores_region_42.BCM8885X=2 +dtm_flow_nof_remote_cores_region_43.BCM8885X=2 +dtm_flow_nof_remote_cores_region_44.BCM8885X=2 +dtm_flow_nof_remote_cores_region_45.BCM8885X=2 +dtm_flow_nof_remote_cores_region_46.BCM8885X=2 +dtm_flow_nof_remote_cores_region_47.BCM8885X=2 +dtm_flow_nof_remote_cores_region_48.BCM8885X=2 +dtm_flow_nof_remote_cores_region_49.BCM8885X=2 +dtm_flow_nof_remote_cores_region_5.BCM8885X=2 +dtm_flow_nof_remote_cores_region_50.BCM8885X=2 +dtm_flow_nof_remote_cores_region_51.BCM8885X=2 +dtm_flow_nof_remote_cores_region_52.BCM8885X=2 +dtm_flow_nof_remote_cores_region_53.BCM8885X=2 +dtm_flow_nof_remote_cores_region_54.BCM8885X=2 +dtm_flow_nof_remote_cores_region_55.BCM8885X=2 +dtm_flow_nof_remote_cores_region_56.BCM8885X=2 +dtm_flow_nof_remote_cores_region_57.BCM8885X=2 +dtm_flow_nof_remote_cores_region_58.BCM8885X=2 +dtm_flow_nof_remote_cores_region_59.BCM8885X=2 +dtm_flow_nof_remote_cores_region_6.BCM8885X=2 +dtm_flow_nof_remote_cores_region_60.BCM8885X=2 +dtm_flow_nof_remote_cores_region_7.BCM8885X=2 +dtm_flow_nof_remote_cores_region_8.BCM8885X=2 +dtm_flow_nof_remote_cores_region_9.BCM8885X=2 +dtm_flow_nof_remote_cores_region_73.BCM8869X=2 +dtm_flow_mapping_mode_region_73.BCM8869X=0 +dtm_flow_nof_remote_cores_region_74.BCM8869X=2 +dtm_flow_mapping_mode_region_74.BCM8869X=0 +dtm_flow_nof_remote_cores_region_75.BCM8869X=2 +dtm_flow_mapping_mode_region_75.BCM8869X=0 +ext_ram_enabled_bitmap.BCM8885X=3 +ext_ram_freq.BCM8885X=1200 +dram_temperature_threshold_restore_traffic.BCM8885X=89 +dram_temperature_threshold_power_down.BCM8885X=102 +dram_temperature_threshold_stop_traffic.BCM8885X=94 +dram_temperature_monitor_enable.BCM8885X=1 +fabric_connect_mode.BCM8885X=FE +ftmh_stacking_extension_size=0 +j2_ftmh_lb_key_extension_size=3 +j_ftmh_lb_key_extension_size=0 + + +lane_to_serdes_map_fabric_lane0.BCM8885X=rx0:tx0 +lane_to_serdes_map_fabric_lane1.BCM8885X=rx1:tx1 +lane_to_serdes_map_fabric_lane2.BCM8885X=rx2:tx3 +lane_to_serdes_map_fabric_lane3.BCM8885X=rx3:tx2 + +lane_to_serdes_map_fabric_lane4.BCM8885X=rx4:tx4 +lane_to_serdes_map_fabric_lane5.BCM8885X=rx5:tx7 +lane_to_serdes_map_fabric_lane6.BCM8885X=rx6:tx6 +lane_to_serdes_map_fabric_lane7.BCM8885X=rx7:tx5 + +lane_to_serdes_map_fabric_lane8.BCM8885X=rx8:tx8 +lane_to_serdes_map_fabric_lane9.BCM8885X=rx9:tx9 +lane_to_serdes_map_fabric_lane10.BCM8885X=rx10:tx10 +lane_to_serdes_map_fabric_lane11.BCM8885X=rx11:tx11 + +lane_to_serdes_map_fabric_lane12.BCM8885X=rx12:tx12 +lane_to_serdes_map_fabric_lane13.BCM8885X=rx13:tx13 +lane_to_serdes_map_fabric_lane14.BCM8885X=rx14:tx14 +lane_to_serdes_map_fabric_lane15.BCM8885X=rx15:tx15 + +lane_to_serdes_map_fabric_lane16.BCM8885X=rx16:tx16 +lane_to_serdes_map_fabric_lane17.BCM8885X=rx17:tx17 +lane_to_serdes_map_fabric_lane18.BCM8885X=rx18:tx18 +lane_to_serdes_map_fabric_lane19.BCM8885X=rx19:tx19 + +lane_to_serdes_map_fabric_lane20.BCM8885X=rx20:tx20 +lane_to_serdes_map_fabric_lane21.BCM8885X=rx21:tx21 +lane_to_serdes_map_fabric_lane22.BCM8885X=rx22:tx22 +lane_to_serdes_map_fabric_lane23.BCM8885X=rx23:tx23 + +lane_to_serdes_map_fabric_lane24.BCM8885X=rx24:tx26 +lane_to_serdes_map_fabric_lane25.BCM8885X=rx25:tx25 +lane_to_serdes_map_fabric_lane26.BCM8885X=rx26:tx24 +lane_to_serdes_map_fabric_lane27.BCM8885X=rx27:tx27 + +lane_to_serdes_map_fabric_lane28.BCM8885X=rx28:tx28 +lane_to_serdes_map_fabric_lane29.BCM8885X=rx29:tx31 +lane_to_serdes_map_fabric_lane30.BCM8885X=rx30:tx30 +lane_to_serdes_map_fabric_lane31.BCM8885X=rx31:tx29 + +lane_to_serdes_map_fabric_lane32.BCM8885X=rx32:tx32 +lane_to_serdes_map_fabric_lane33.BCM8885X=rx33:tx33 +lane_to_serdes_map_fabric_lane34.BCM8885X=rx34:tx34 +lane_to_serdes_map_fabric_lane35.BCM8885X=rx35:tx35 + +lane_to_serdes_map_fabric_lane36.BCM8885X=rx36:tx36 +lane_to_serdes_map_fabric_lane37.BCM8885X=rx37:tx37 +lane_to_serdes_map_fabric_lane38.BCM8885X=rx38:tx38 +lane_to_serdes_map_fabric_lane39.BCM8885X=rx39:tx39 + +lane_to_serdes_map_fabric_lane40.BCM8885X=rx40:tx43 +lane_to_serdes_map_fabric_lane41.BCM8885X=rx41:tx42 +lane_to_serdes_map_fabric_lane42.BCM8885X=rx42:tx41 +lane_to_serdes_map_fabric_lane43.BCM8885X=rx43:tx40 + +lane_to_serdes_map_fabric_lane44.BCM8885X=rx44:tx47 +lane_to_serdes_map_fabric_lane45.BCM8885X=rx45:tx45 +lane_to_serdes_map_fabric_lane46.BCM8885X=rx46:tx46 +lane_to_serdes_map_fabric_lane47.BCM8885X=rx47:tx44 + +lane_to_serdes_map_fabric_lane48.BCM8885X=rx48:tx48 +lane_to_serdes_map_fabric_lane49.BCM8885X=rx49:tx49 +lane_to_serdes_map_fabric_lane50.BCM8885X=rx50:tx50 +lane_to_serdes_map_fabric_lane51.BCM8885X=rx51:tx51 + +lane_to_serdes_map_fabric_lane52.BCM8885X=rx52:tx52 +lane_to_serdes_map_fabric_lane53.BCM8885X=rx53:tx53 +lane_to_serdes_map_fabric_lane54.BCM8885X=rx54:tx54 +lane_to_serdes_map_fabric_lane55.BCM8885X=rx55:tx55 + +lane_to_serdes_map_fabric_lane56.BCM8885X=rx56:tx59 +lane_to_serdes_map_fabric_lane57.BCM8885X=rx57:tx58 +lane_to_serdes_map_fabric_lane58.BCM8885X=rx58:tx57 +lane_to_serdes_map_fabric_lane59.BCM8885X=rx59:tx56 + +lane_to_serdes_map_fabric_lane60.BCM8885X=rx60:tx63 +lane_to_serdes_map_fabric_lane61.BCM8885X=rx61:tx61 +lane_to_serdes_map_fabric_lane62.BCM8885X=rx62:tx62 +lane_to_serdes_map_fabric_lane63.BCM8885X=rx63:tx60 + +lane_to_serdes_map_fabric_lane64.BCM8885X=rx64:tx64 +lane_to_serdes_map_fabric_lane65.BCM8885X=rx65:tx65 +lane_to_serdes_map_fabric_lane66.BCM8885X=rx66:tx66 +lane_to_serdes_map_fabric_lane67.BCM8885X=rx67:tx67 + +lane_to_serdes_map_fabric_lane68.BCM8885X=rx68:tx68 +lane_to_serdes_map_fabric_lane69.BCM8885X=rx69:tx69 +lane_to_serdes_map_fabric_lane70.BCM8885X=rx70:tx70 +lane_to_serdes_map_fabric_lane71.BCM8885X=rx71:tx71 + +lane_to_serdes_map_fabric_lane72.BCM8885X=rx72:tx75 +lane_to_serdes_map_fabric_lane73.BCM8885X=rx73:tx73 +lane_to_serdes_map_fabric_lane74.BCM8885X=rx74:tx74 +lane_to_serdes_map_fabric_lane75.BCM8885X=rx75:tx72 + +lane_to_serdes_map_fabric_lane76.BCM8885X=rx76:tx79 +lane_to_serdes_map_fabric_lane77.BCM8885X=rx77:tx78 +lane_to_serdes_map_fabric_lane78.BCM8885X=rx78:tx77 +lane_to_serdes_map_fabric_lane79.BCM8885X=rx79:tx76 + +lane_to_serdes_map_fabric_lane80.BCM8885X=rx80:tx80 +lane_to_serdes_map_fabric_lane81.BCM8885X=rx81:tx81 +lane_to_serdes_map_fabric_lane82.BCM8885X=rx82:tx82 +lane_to_serdes_map_fabric_lane83.BCM8885X=rx83:tx83 + +lane_to_serdes_map_fabric_lane84.BCM8885X=rx84:tx84 +lane_to_serdes_map_fabric_lane85.BCM8885X=rx85:tx85 +lane_to_serdes_map_fabric_lane86.BCM8885X=rx86:tx86 +lane_to_serdes_map_fabric_lane87.BCM8885X=rx87:tx87 + +lane_to_serdes_map_fabric_lane88.BCM8885X=rx88:tx88 +lane_to_serdes_map_fabric_lane89.BCM8885X=rx89:tx90 +lane_to_serdes_map_fabric_lane90.BCM8885X=rx90:tx89 +lane_to_serdes_map_fabric_lane91.BCM8885X=rx91:tx91 + +lane_to_serdes_map_fabric_lane92.BCM8885X=rx92:tx94 +lane_to_serdes_map_fabric_lane93.BCM8885X=rx93:tx93 +lane_to_serdes_map_fabric_lane94.BCM8885X=rx94:tx92 +lane_to_serdes_map_fabric_lane95.BCM8885X=rx95:tx95 + +lane_to_serdes_map_fabric_lane96.BCM8885X=rx96:tx96 +lane_to_serdes_map_fabric_lane97.BCM8885X=rx97:tx97 +lane_to_serdes_map_fabric_lane98.BCM8885X=rx98:tx98 +lane_to_serdes_map_fabric_lane99.BCM8885X=rx99:tx99 + +lane_to_serdes_map_fabric_lane100.BCM8885X=rx100:tx100 +lane_to_serdes_map_fabric_lane101.BCM8885X=rx101:tx101 +lane_to_serdes_map_fabric_lane102.BCM8885X=rx102:tx102 +lane_to_serdes_map_fabric_lane103.BCM8885X=rx103:tx103 + +lane_to_serdes_map_fabric_lane104.BCM8885X=rx104:tx104 +lane_to_serdes_map_fabric_lane105.BCM8885X=rx105:tx105 +lane_to_serdes_map_fabric_lane106.BCM8885X=rx106:tx106 +lane_to_serdes_map_fabric_lane107.BCM8885X=rx107:tx107 + +lane_to_serdes_map_fabric_lane108.BCM8885X=rx108:tx108 +lane_to_serdes_map_fabric_lane109.BCM8885X=rx109:tx109 +lane_to_serdes_map_fabric_lane110.BCM8885X=rx110:tx110 +lane_to_serdes_map_fabric_lane111.BCM8885X=rx111:tx111 + +lane_to_serdes_map_fabric_lane112.BCM8885X=rx112:tx114 +lane_to_serdes_map_fabric_lane113.BCM8885X=rx113:tx113 +lane_to_serdes_map_fabric_lane114.BCM8885X=rx114:tx112 +lane_to_serdes_map_fabric_lane115.BCM8885X=rx115:tx115 + +lane_to_serdes_map_fabric_lane116.BCM8885X=rx116:tx116 +lane_to_serdes_map_fabric_lane117.BCM8885X=rx117:tx117 +lane_to_serdes_map_fabric_lane118.BCM8885X=rx118:tx118 +lane_to_serdes_map_fabric_lane119.BCM8885X=rx119:tx119 + +lane_to_serdes_map_fabric_lane120.BCM8885X=rx120:tx120 +lane_to_serdes_map_fabric_lane121.BCM8885X=rx121:tx121 +lane_to_serdes_map_fabric_lane122.BCM8885X=rx122:tx122 +lane_to_serdes_map_fabric_lane123.BCM8885X=rx123:tx123 + +lane_to_serdes_map_fabric_lane124.BCM8885X=rx124:tx124 +lane_to_serdes_map_fabric_lane125.BCM8885X=rx125:tx125 +lane_to_serdes_map_fabric_lane126.BCM8885X=rx126:tx126 +lane_to_serdes_map_fabric_lane127.BCM8885X=rx127:tx127 + +lane_to_serdes_map_fabric_lane128.BCM8885X=rx128:tx128 +lane_to_serdes_map_fabric_lane129.BCM8885X=rx129:tx129 +lane_to_serdes_map_fabric_lane130.BCM8885X=rx130:tx130 +lane_to_serdes_map_fabric_lane131.BCM8885X=rx131:tx131 + +lane_to_serdes_map_fabric_lane132.BCM8885X=rx132:tx132 +lane_to_serdes_map_fabric_lane133.BCM8885X=rx133:tx133 +lane_to_serdes_map_fabric_lane134.BCM8885X=rx134:tx134 +lane_to_serdes_map_fabric_lane135.BCM8885X=rx135:tx135 + +lane_to_serdes_map_fabric_lane136.BCM8885X=rx136:tx139 +lane_to_serdes_map_fabric_lane137.BCM8885X=rx137:tx138 +lane_to_serdes_map_fabric_lane138.BCM8885X=rx138:tx137 +lane_to_serdes_map_fabric_lane139.BCM8885X=rx139:tx136 + +lane_to_serdes_map_fabric_lane140.BCM8885X=rx140:tx143 +lane_to_serdes_map_fabric_lane141.BCM8885X=rx141:tx141 +lane_to_serdes_map_fabric_lane142.BCM8885X=rx142:tx142 +lane_to_serdes_map_fabric_lane143.BCM8885X=rx143:tx140 + +lane_to_serdes_map_fabric_lane144.BCM8885X=rx144:tx144 +lane_to_serdes_map_fabric_lane145.BCM8885X=rx145:tx145 +lane_to_serdes_map_fabric_lane146.BCM8885X=rx146:tx146 +lane_to_serdes_map_fabric_lane147.BCM8885X=rx147:tx147 + +lane_to_serdes_map_fabric_lane148.BCM8885X=rx148:tx148 +lane_to_serdes_map_fabric_lane149.BCM8885X=rx149:tx149 +lane_to_serdes_map_fabric_lane150.BCM8885X=rx150:tx150 +lane_to_serdes_map_fabric_lane151.BCM8885X=rx151:tx151 + +lane_to_serdes_map_fabric_lane152.BCM8885X=rx152:tx155 +lane_to_serdes_map_fabric_lane153.BCM8885X=rx153:tx154 +lane_to_serdes_map_fabric_lane154.BCM8885X=rx154:tx153 +lane_to_serdes_map_fabric_lane155.BCM8885X=rx155:tx152 + +lane_to_serdes_map_fabric_lane156.BCM8885X=rx156:tx159 +lane_to_serdes_map_fabric_lane157.BCM8885X=rx157:tx157 +lane_to_serdes_map_fabric_lane158.BCM8885X=rx158:tx158 +lane_to_serdes_map_fabric_lane159.BCM8885X=rx159:tx156 + +lane_to_serdes_map_fabric_lane160.BCM8885X=rx160:tx160 +lane_to_serdes_map_fabric_lane161.BCM8885X=rx161:tx161 +lane_to_serdes_map_fabric_lane162.BCM8885X=rx162:tx162 +lane_to_serdes_map_fabric_lane163.BCM8885X=rx163:tx163 + +lane_to_serdes_map_fabric_lane164.BCM8885X=rx164:tx164 +lane_to_serdes_map_fabric_lane165.BCM8885X=rx165:tx165 +lane_to_serdes_map_fabric_lane166.BCM8885X=rx166:tx166 +lane_to_serdes_map_fabric_lane167.BCM8885X=rx167:tx167 + +lane_to_serdes_map_fabric_lane168.BCM8885X=rx168:tx171 +lane_to_serdes_map_fabric_lane169.BCM8885X=rx169:tx169 +lane_to_serdes_map_fabric_lane170.BCM8885X=rx170:tx170 +lane_to_serdes_map_fabric_lane171.BCM8885X=rx171:tx168 + +lane_to_serdes_map_fabric_lane172.BCM8885X=rx172:tx175 +lane_to_serdes_map_fabric_lane173.BCM8885X=rx173:tx174 +lane_to_serdes_map_fabric_lane174.BCM8885X=rx174:tx173 +lane_to_serdes_map_fabric_lane175.BCM8885X=rx175:tx172 + +lane_to_serdes_map_fabric_lane176.BCM8885X=rx176:tx176 +lane_to_serdes_map_fabric_lane177.BCM8885X=rx177:tx177 +lane_to_serdes_map_fabric_lane178.BCM8885X=rx178:tx178 +lane_to_serdes_map_fabric_lane179.BCM8885X=rx179:tx179 + +lane_to_serdes_map_fabric_lane180.BCM8885X=rx180:tx180 +lane_to_serdes_map_fabric_lane181.BCM8885X=rx181:tx181 +lane_to_serdes_map_fabric_lane182.BCM8885X=rx182:tx182 +lane_to_serdes_map_fabric_lane183.BCM8885X=rx183:tx183 + +lane_to_serdes_map_fabric_lane184.BCM8885X=rx184:tx184 +lane_to_serdes_map_fabric_lane185.BCM8885X=rx185:tx185 +lane_to_serdes_map_fabric_lane186.BCM8885X=rx186:tx186 +lane_to_serdes_map_fabric_lane187.BCM8885X=rx187:tx187 + +lane_to_serdes_map_fabric_lane188.BCM8885X=rx188:tx190 +lane_to_serdes_map_fabric_lane189.BCM8885X=rx189:tx189 +lane_to_serdes_map_fabric_lane190.BCM8885X=rx190:tx188 +lane_to_serdes_map_fabric_lane191.BCM8885X=rx191:tx191 + + +phy_rx_polarity_flip_fabric0.BCM8885X=0 +phy_rx_polarity_flip_fabric1.BCM8885X=1 +phy_rx_polarity_flip_fabric2.BCM8885X=0 +phy_rx_polarity_flip_fabric3.BCM8885X=0 +phy_rx_polarity_flip_fabric4.BCM8885X=0 +phy_rx_polarity_flip_fabric5.BCM8885X=0 +phy_rx_polarity_flip_fabric6.BCM8885X=0 +phy_rx_polarity_flip_fabric7.BCM8885X=0 +phy_rx_polarity_flip_fabric8.BCM8885X=1 +phy_rx_polarity_flip_fabric9.BCM8885X=1 +phy_rx_polarity_flip_fabric10.BCM8885X=0 +phy_rx_polarity_flip_fabric11.BCM8885X=0 +phy_rx_polarity_flip_fabric12.BCM8885X=1 +phy_rx_polarity_flip_fabric13.BCM8885X=0 +phy_rx_polarity_flip_fabric14.BCM8885X=0 +phy_rx_polarity_flip_fabric15.BCM8885X=1 +phy_rx_polarity_flip_fabric16.BCM8885X=1 +phy_rx_polarity_flip_fabric17.BCM8885X=1 +phy_rx_polarity_flip_fabric18.BCM8885X=0 +phy_rx_polarity_flip_fabric19.BCM8885X=0 +phy_rx_polarity_flip_fabric20.BCM8885X=0 +phy_rx_polarity_flip_fabric21.BCM8885X=0 +phy_rx_polarity_flip_fabric22.BCM8885X=1 +phy_rx_polarity_flip_fabric23.BCM8885X=0 +phy_rx_polarity_flip_fabric24.BCM8885X=1 +phy_rx_polarity_flip_fabric25.BCM8885X=0 +phy_rx_polarity_flip_fabric26.BCM8885X=1 +phy_rx_polarity_flip_fabric27.BCM8885X=1 +phy_rx_polarity_flip_fabric28.BCM8885X=1 +phy_rx_polarity_flip_fabric29.BCM8885X=1 +phy_rx_polarity_flip_fabric30.BCM8885X=0 +phy_rx_polarity_flip_fabric31.BCM8885X=1 +phy_rx_polarity_flip_fabric32.BCM8885X=0 +phy_rx_polarity_flip_fabric33.BCM8885X=1 +phy_rx_polarity_flip_fabric34.BCM8885X=0 +phy_rx_polarity_flip_fabric35.BCM8885X=0 +phy_rx_polarity_flip_fabric36.BCM8885X=0 +phy_rx_polarity_flip_fabric37.BCM8885X=1 +phy_rx_polarity_flip_fabric38.BCM8885X=1 +phy_rx_polarity_flip_fabric39.BCM8885X=0 +phy_rx_polarity_flip_fabric40.BCM8885X=1 +phy_rx_polarity_flip_fabric41.BCM8885X=0 +phy_rx_polarity_flip_fabric42.BCM8885X=0 +phy_rx_polarity_flip_fabric43.BCM8885X=0 +phy_rx_polarity_flip_fabric44.BCM8885X=1 +phy_rx_polarity_flip_fabric45.BCM8885X=0 +phy_rx_polarity_flip_fabric46.BCM8885X=0 +phy_rx_polarity_flip_fabric47.BCM8885X=1 +phy_rx_polarity_flip_fabric48.BCM8885X=1 +phy_rx_polarity_flip_fabric49.BCM8885X=1 +phy_rx_polarity_flip_fabric50.BCM8885X=1 +phy_rx_polarity_flip_fabric51.BCM8885X=1 +phy_rx_polarity_flip_fabric52.BCM8885X=1 +phy_rx_polarity_flip_fabric53.BCM8885X=1 +phy_rx_polarity_flip_fabric54.BCM8885X=1 +phy_rx_polarity_flip_fabric55.BCM8885X=1 +phy_rx_polarity_flip_fabric56.BCM8885X=0 +phy_rx_polarity_flip_fabric57.BCM8885X=0 +phy_rx_polarity_flip_fabric58.BCM8885X=0 +phy_rx_polarity_flip_fabric59.BCM8885X=0 +phy_rx_polarity_flip_fabric60.BCM8885X=0 +phy_rx_polarity_flip_fabric61.BCM8885X=0 +phy_rx_polarity_flip_fabric62.BCM8885X=1 +phy_rx_polarity_flip_fabric63.BCM8885X=0 +phy_rx_polarity_flip_fabric64.BCM8885X=1 +phy_rx_polarity_flip_fabric65.BCM8885X=1 +phy_rx_polarity_flip_fabric66.BCM8885X=0 +phy_rx_polarity_flip_fabric67.BCM8885X=0 +phy_rx_polarity_flip_fabric68.BCM8885X=1 +phy_rx_polarity_flip_fabric69.BCM8885X=1 +phy_rx_polarity_flip_fabric70.BCM8885X=1 +phy_rx_polarity_flip_fabric71.BCM8885X=0 +phy_rx_polarity_flip_fabric72.BCM8885X=0 +phy_rx_polarity_flip_fabric73.BCM8885X=1 +phy_rx_polarity_flip_fabric74.BCM8885X=0 +phy_rx_polarity_flip_fabric75.BCM8885X=1 +phy_rx_polarity_flip_fabric76.BCM8885X=1 +phy_rx_polarity_flip_fabric77.BCM8885X=1 +phy_rx_polarity_flip_fabric78.BCM8885X=1 +phy_rx_polarity_flip_fabric79.BCM8885X=0 +phy_rx_polarity_flip_fabric80.BCM8885X=1 +phy_rx_polarity_flip_fabric81.BCM8885X=0 +phy_rx_polarity_flip_fabric82.BCM8885X=0 +phy_rx_polarity_flip_fabric83.BCM8885X=0 +phy_rx_polarity_flip_fabric84.BCM8885X=1 +phy_rx_polarity_flip_fabric85.BCM8885X=0 +phy_rx_polarity_flip_fabric86.BCM8885X=1 +phy_rx_polarity_flip_fabric87.BCM8885X=0 +phy_rx_polarity_flip_fabric88.BCM8885X=1 +phy_rx_polarity_flip_fabric89.BCM8885X=1 +phy_rx_polarity_flip_fabric90.BCM8885X=1 +phy_rx_polarity_flip_fabric91.BCM8885X=1 +phy_rx_polarity_flip_fabric92.BCM8885X=1 +phy_rx_polarity_flip_fabric93.BCM8885X=1 +phy_rx_polarity_flip_fabric94.BCM8885X=1 +phy_rx_polarity_flip_fabric95.BCM8885X=1 +phy_rx_polarity_flip_fabric96.BCM8885X=0 +phy_rx_polarity_flip_fabric97.BCM8885X=1 +phy_rx_polarity_flip_fabric98.BCM8885X=0 +phy_rx_polarity_flip_fabric99.BCM8885X=0 +phy_rx_polarity_flip_fabric100.BCM8885X=0 +phy_rx_polarity_flip_fabric101.BCM8885X=1 +phy_rx_polarity_flip_fabric102.BCM8885X=1 +phy_rx_polarity_flip_fabric103.BCM8885X=0 +phy_rx_polarity_flip_fabric104.BCM8885X=1 +phy_rx_polarity_flip_fabric105.BCM8885X=0 +phy_rx_polarity_flip_fabric106.BCM8885X=0 +phy_rx_polarity_flip_fabric107.BCM8885X=0 +phy_rx_polarity_flip_fabric108.BCM8885X=1 +phy_rx_polarity_flip_fabric109.BCM8885X=1 +phy_rx_polarity_flip_fabric110.BCM8885X=0 +phy_rx_polarity_flip_fabric111.BCM8885X=1 +phy_rx_polarity_flip_fabric112.BCM8885X=0 +phy_rx_polarity_flip_fabric113.BCM8885X=0 +phy_rx_polarity_flip_fabric114.BCM8885X=1 +phy_rx_polarity_flip_fabric115.BCM8885X=1 +phy_rx_polarity_flip_fabric116.BCM8885X=0 +phy_rx_polarity_flip_fabric117.BCM8885X=1 +phy_rx_polarity_flip_fabric118.BCM8885X=1 +phy_rx_polarity_flip_fabric119.BCM8885X=1 +phy_rx_polarity_flip_fabric120.BCM8885X=1 +phy_rx_polarity_flip_fabric121.BCM8885X=1 +phy_rx_polarity_flip_fabric122.BCM8885X=1 +phy_rx_polarity_flip_fabric123.BCM8885X=0 +phy_rx_polarity_flip_fabric124.BCM8885X=0 +phy_rx_polarity_flip_fabric125.BCM8885X=0 +phy_rx_polarity_flip_fabric126.BCM8885X=0 +phy_rx_polarity_flip_fabric127.BCM8885X=1 +phy_rx_polarity_flip_fabric128.BCM8885X=0 +phy_rx_polarity_flip_fabric129.BCM8885X=0 +phy_rx_polarity_flip_fabric130.BCM8885X=1 +phy_rx_polarity_flip_fabric131.BCM8885X=0 +phy_rx_polarity_flip_fabric132.BCM8885X=0 +phy_rx_polarity_flip_fabric133.BCM8885X=1 +phy_rx_polarity_flip_fabric134.BCM8885X=1 +phy_rx_polarity_flip_fabric135.BCM8885X=0 +phy_rx_polarity_flip_fabric136.BCM8885X=0 +phy_rx_polarity_flip_fabric137.BCM8885X=1 +phy_rx_polarity_flip_fabric138.BCM8885X=1 +phy_rx_polarity_flip_fabric139.BCM8885X=0 +phy_rx_polarity_flip_fabric140.BCM8885X=1 +phy_rx_polarity_flip_fabric141.BCM8885X=0 +phy_rx_polarity_flip_fabric142.BCM8885X=1 +phy_rx_polarity_flip_fabric143.BCM8885X=1 +phy_rx_polarity_flip_fabric144.BCM8885X=1 +phy_rx_polarity_flip_fabric145.BCM8885X=1 +phy_rx_polarity_flip_fabric146.BCM8885X=1 +phy_rx_polarity_flip_fabric147.BCM8885X=0 +phy_rx_polarity_flip_fabric148.BCM8885X=1 +phy_rx_polarity_flip_fabric149.BCM8885X=1 +phy_rx_polarity_flip_fabric150.BCM8885X=0 +phy_rx_polarity_flip_fabric151.BCM8885X=0 +phy_rx_polarity_flip_fabric152.BCM8885X=0 +phy_rx_polarity_flip_fabric153.BCM8885X=0 +phy_rx_polarity_flip_fabric154.BCM8885X=0 +phy_rx_polarity_flip_fabric155.BCM8885X=1 +phy_rx_polarity_flip_fabric156.BCM8885X=0 +phy_rx_polarity_flip_fabric157.BCM8885X=0 +phy_rx_polarity_flip_fabric158.BCM8885X=0 +phy_rx_polarity_flip_fabric159.BCM8885X=1 +phy_rx_polarity_flip_fabric160.BCM8885X=0 +phy_rx_polarity_flip_fabric161.BCM8885X=1 +phy_rx_polarity_flip_fabric162.BCM8885X=1 +phy_rx_polarity_flip_fabric163.BCM8885X=1 +phy_rx_polarity_flip_fabric164.BCM8885X=1 +phy_rx_polarity_flip_fabric165.BCM8885X=0 +phy_rx_polarity_flip_fabric166.BCM8885X=0 +phy_rx_polarity_flip_fabric167.BCM8885X=1 +phy_rx_polarity_flip_fabric168.BCM8885X=0 +phy_rx_polarity_flip_fabric169.BCM8885X=1 +phy_rx_polarity_flip_fabric170.BCM8885X=0 +phy_rx_polarity_flip_fabric171.BCM8885X=0 +phy_rx_polarity_flip_fabric172.BCM8885X=0 +phy_rx_polarity_flip_fabric173.BCM8885X=1 +phy_rx_polarity_flip_fabric174.BCM8885X=1 +phy_rx_polarity_flip_fabric175.BCM8885X=1 +phy_rx_polarity_flip_fabric176.BCM8885X=0 +phy_rx_polarity_flip_fabric177.BCM8885X=1 +phy_rx_polarity_flip_fabric178.BCM8885X=0 +phy_rx_polarity_flip_fabric179.BCM8885X=1 +phy_rx_polarity_flip_fabric180.BCM8885X=1 +phy_rx_polarity_flip_fabric181.BCM8885X=0 +phy_rx_polarity_flip_fabric182.BCM8885X=0 +phy_rx_polarity_flip_fabric183.BCM8885X=0 +phy_rx_polarity_flip_fabric184.BCM8885X=0 +phy_rx_polarity_flip_fabric185.BCM8885X=0 +phy_rx_polarity_flip_fabric186.BCM8885X=1 +phy_rx_polarity_flip_fabric187.BCM8885X=0 +phy_rx_polarity_flip_fabric188.BCM8885X=0 +phy_rx_polarity_flip_fabric189.BCM8885X=0 +phy_rx_polarity_flip_fabric190.BCM8885X=0 +phy_rx_polarity_flip_fabric191.BCM8885X=1 + + +phy_tx_polarity_flip_fabric0.BCM8885X=0 +phy_tx_polarity_flip_fabric1.BCM8885X=0 +phy_tx_polarity_flip_fabric2.BCM8885X=0 +phy_tx_polarity_flip_fabric3.BCM8885X=1 +phy_tx_polarity_flip_fabric4.BCM8885X=1 +phy_tx_polarity_flip_fabric5.BCM8885X=0 +phy_tx_polarity_flip_fabric6.BCM8885X=1 +phy_tx_polarity_flip_fabric7.BCM8885X=1 +phy_tx_polarity_flip_fabric8.BCM8885X=0 +phy_tx_polarity_flip_fabric9.BCM8885X=1 +phy_tx_polarity_flip_fabric10.BCM8885X=1 +phy_tx_polarity_flip_fabric11.BCM8885X=1 +phy_tx_polarity_flip_fabric12.BCM8885X=1 +phy_tx_polarity_flip_fabric13.BCM8885X=0 +phy_tx_polarity_flip_fabric14.BCM8885X=1 +phy_tx_polarity_flip_fabric15.BCM8885X=1 +phy_tx_polarity_flip_fabric16.BCM8885X=1 +phy_tx_polarity_flip_fabric17.BCM8885X=1 +phy_tx_polarity_flip_fabric18.BCM8885X=0 +phy_tx_polarity_flip_fabric19.BCM8885X=0 +phy_tx_polarity_flip_fabric20.BCM8885X=0 +phy_tx_polarity_flip_fabric21.BCM8885X=1 +phy_tx_polarity_flip_fabric22.BCM8885X=1 +phy_tx_polarity_flip_fabric23.BCM8885X=0 +phy_tx_polarity_flip_fabric24.BCM8885X=0 +phy_tx_polarity_flip_fabric25.BCM8885X=1 +phy_tx_polarity_flip_fabric26.BCM8885X=1 +phy_tx_polarity_flip_fabric27.BCM8885X=0 +phy_tx_polarity_flip_fabric28.BCM8885X=1 +phy_tx_polarity_flip_fabric29.BCM8885X=0 +phy_tx_polarity_flip_fabric30.BCM8885X=1 +phy_tx_polarity_flip_fabric31.BCM8885X=0 +phy_tx_polarity_flip_fabric32.BCM8885X=0 +phy_tx_polarity_flip_fabric33.BCM8885X=0 +phy_tx_polarity_flip_fabric34.BCM8885X=0 +phy_tx_polarity_flip_fabric35.BCM8885X=0 +phy_tx_polarity_flip_fabric36.BCM8885X=1 +phy_tx_polarity_flip_fabric37.BCM8885X=1 +phy_tx_polarity_flip_fabric38.BCM8885X=0 +phy_tx_polarity_flip_fabric39.BCM8885X=0 +phy_tx_polarity_flip_fabric40.BCM8885X=1 +phy_tx_polarity_flip_fabric41.BCM8885X=0 +phy_tx_polarity_flip_fabric42.BCM8885X=0 +phy_tx_polarity_flip_fabric43.BCM8885X=1 +phy_tx_polarity_flip_fabric44.BCM8885X=0 +phy_tx_polarity_flip_fabric45.BCM8885X=0 +phy_tx_polarity_flip_fabric46.BCM8885X=1 +phy_tx_polarity_flip_fabric47.BCM8885X=0 +phy_tx_polarity_flip_fabric48.BCM8885X=1 +phy_tx_polarity_flip_fabric49.BCM8885X=1 +phy_tx_polarity_flip_fabric50.BCM8885X=0 +phy_tx_polarity_flip_fabric51.BCM8885X=0 +phy_tx_polarity_flip_fabric52.BCM8885X=1 +phy_tx_polarity_flip_fabric53.BCM8885X=0 +phy_tx_polarity_flip_fabric54.BCM8885X=0 +phy_tx_polarity_flip_fabric55.BCM8885X=1 +phy_tx_polarity_flip_fabric56.BCM8885X=0 +phy_tx_polarity_flip_fabric57.BCM8885X=0 +phy_tx_polarity_flip_fabric58.BCM8885X=1 +phy_tx_polarity_flip_fabric59.BCM8885X=0 +phy_tx_polarity_flip_fabric60.BCM8885X=1 +phy_tx_polarity_flip_fabric61.BCM8885X=1 +phy_tx_polarity_flip_fabric62.BCM8885X=1 +phy_tx_polarity_flip_fabric63.BCM8885X=1 +phy_tx_polarity_flip_fabric64.BCM8885X=1 +phy_tx_polarity_flip_fabric65.BCM8885X=0 +phy_tx_polarity_flip_fabric66.BCM8885X=1 +phy_tx_polarity_flip_fabric67.BCM8885X=0 +phy_tx_polarity_flip_fabric68.BCM8885X=0 +phy_tx_polarity_flip_fabric69.BCM8885X=0 +phy_tx_polarity_flip_fabric70.BCM8885X=0 +phy_tx_polarity_flip_fabric71.BCM8885X=1 +phy_tx_polarity_flip_fabric72.BCM8885X=0 +phy_tx_polarity_flip_fabric73.BCM8885X=1 +phy_tx_polarity_flip_fabric74.BCM8885X=0 +phy_tx_polarity_flip_fabric75.BCM8885X=1 +phy_tx_polarity_flip_fabric76.BCM8885X=0 +phy_tx_polarity_flip_fabric77.BCM8885X=0 +phy_tx_polarity_flip_fabric78.BCM8885X=0 +phy_tx_polarity_flip_fabric79.BCM8885X=1 +phy_tx_polarity_flip_fabric80.BCM8885X=1 +phy_tx_polarity_flip_fabric81.BCM8885X=0 +phy_tx_polarity_flip_fabric82.BCM8885X=0 +phy_tx_polarity_flip_fabric83.BCM8885X=0 +phy_tx_polarity_flip_fabric84.BCM8885X=1 +phy_tx_polarity_flip_fabric85.BCM8885X=0 +phy_tx_polarity_flip_fabric86.BCM8885X=1 +phy_tx_polarity_flip_fabric87.BCM8885X=0 +phy_tx_polarity_flip_fabric88.BCM8885X=1 +phy_tx_polarity_flip_fabric89.BCM8885X=1 +phy_tx_polarity_flip_fabric90.BCM8885X=1 +phy_tx_polarity_flip_fabric91.BCM8885X=1 +phy_tx_polarity_flip_fabric92.BCM8885X=1 +phy_tx_polarity_flip_fabric93.BCM8885X=1 +phy_tx_polarity_flip_fabric94.BCM8885X=0 +phy_tx_polarity_flip_fabric95.BCM8885X=0 +phy_tx_polarity_flip_fabric96.BCM8885X=1 +phy_tx_polarity_flip_fabric97.BCM8885X=1 +phy_tx_polarity_flip_fabric98.BCM8885X=1 +phy_tx_polarity_flip_fabric99.BCM8885X=0 +phy_tx_polarity_flip_fabric100.BCM8885X=0 +phy_tx_polarity_flip_fabric101.BCM8885X=0 +phy_tx_polarity_flip_fabric102.BCM8885X=1 +phy_tx_polarity_flip_fabric103.BCM8885X=1 +phy_tx_polarity_flip_fabric104.BCM8885X=1 +phy_tx_polarity_flip_fabric105.BCM8885X=0 +phy_tx_polarity_flip_fabric106.BCM8885X=1 +phy_tx_polarity_flip_fabric107.BCM8885X=0 +phy_tx_polarity_flip_fabric108.BCM8885X=0 +phy_tx_polarity_flip_fabric109.BCM8885X=1 +phy_tx_polarity_flip_fabric110.BCM8885X=0 +phy_tx_polarity_flip_fabric111.BCM8885X=0 +phy_tx_polarity_flip_fabric112.BCM8885X=1 +phy_tx_polarity_flip_fabric113.BCM8885X=0 +phy_tx_polarity_flip_fabric114.BCM8885X=0 +phy_tx_polarity_flip_fabric115.BCM8885X=1 +phy_tx_polarity_flip_fabric116.BCM8885X=1 +phy_tx_polarity_flip_fabric117.BCM8885X=1 +phy_tx_polarity_flip_fabric118.BCM8885X=0 +phy_tx_polarity_flip_fabric119.BCM8885X=0 +phy_tx_polarity_flip_fabric120.BCM8885X=0 +phy_tx_polarity_flip_fabric121.BCM8885X=0 +phy_tx_polarity_flip_fabric122.BCM8885X=1 +phy_tx_polarity_flip_fabric123.BCM8885X=1 +phy_tx_polarity_flip_fabric124.BCM8885X=0 +phy_tx_polarity_flip_fabric125.BCM8885X=0 +phy_tx_polarity_flip_fabric126.BCM8885X=0 +phy_tx_polarity_flip_fabric127.BCM8885X=1 +phy_tx_polarity_flip_fabric128.BCM8885X=0 +phy_tx_polarity_flip_fabric129.BCM8885X=0 +phy_tx_polarity_flip_fabric130.BCM8885X=0 +phy_tx_polarity_flip_fabric131.BCM8885X=1 +phy_tx_polarity_flip_fabric132.BCM8885X=0 +phy_tx_polarity_flip_fabric133.BCM8885X=0 +phy_tx_polarity_flip_fabric134.BCM8885X=1 +phy_tx_polarity_flip_fabric135.BCM8885X=1 +phy_tx_polarity_flip_fabric136.BCM8885X=1 +phy_tx_polarity_flip_fabric137.BCM8885X=1 +phy_tx_polarity_flip_fabric138.BCM8885X=1 +phy_tx_polarity_flip_fabric139.BCM8885X=1 +phy_tx_polarity_flip_fabric140.BCM8885X=0 +phy_tx_polarity_flip_fabric141.BCM8885X=0 +phy_tx_polarity_flip_fabric142.BCM8885X=0 +phy_tx_polarity_flip_fabric143.BCM8885X=0 +phy_tx_polarity_flip_fabric144.BCM8885X=1 +phy_tx_polarity_flip_fabric145.BCM8885X=1 +phy_tx_polarity_flip_fabric146.BCM8885X=1 +phy_tx_polarity_flip_fabric147.BCM8885X=1 +phy_tx_polarity_flip_fabric148.BCM8885X=1 +phy_tx_polarity_flip_fabric149.BCM8885X=1 +phy_tx_polarity_flip_fabric150.BCM8885X=1 +phy_tx_polarity_flip_fabric151.BCM8885X=1 +phy_tx_polarity_flip_fabric152.BCM8885X=1 +phy_tx_polarity_flip_fabric153.BCM8885X=1 +phy_tx_polarity_flip_fabric154.BCM8885X=1 +phy_tx_polarity_flip_fabric155.BCM8885X=0 +phy_tx_polarity_flip_fabric156.BCM8885X=1 +phy_tx_polarity_flip_fabric157.BCM8885X=0 +phy_tx_polarity_flip_fabric158.BCM8885X=0 +phy_tx_polarity_flip_fabric159.BCM8885X=0 +phy_tx_polarity_flip_fabric160.BCM8885X=0 +phy_tx_polarity_flip_fabric161.BCM8885X=1 +phy_tx_polarity_flip_fabric162.BCM8885X=0 +phy_tx_polarity_flip_fabric163.BCM8885X=1 +phy_tx_polarity_flip_fabric164.BCM8885X=1 +phy_tx_polarity_flip_fabric165.BCM8885X=1 +phy_tx_polarity_flip_fabric166.BCM8885X=0 +phy_tx_polarity_flip_fabric167.BCM8885X=0 +phy_tx_polarity_flip_fabric168.BCM8885X=0 +phy_tx_polarity_flip_fabric169.BCM8885X=0 +phy_tx_polarity_flip_fabric170.BCM8885X=1 +phy_tx_polarity_flip_fabric171.BCM8885X=0 +phy_tx_polarity_flip_fabric172.BCM8885X=0 +phy_tx_polarity_flip_fabric173.BCM8885X=0 +phy_tx_polarity_flip_fabric174.BCM8885X=0 +phy_tx_polarity_flip_fabric175.BCM8885X=1 +phy_tx_polarity_flip_fabric176.BCM8885X=0 +phy_tx_polarity_flip_fabric177.BCM8885X=0 +phy_tx_polarity_flip_fabric178.BCM8885X=0 +phy_tx_polarity_flip_fabric179.BCM8885X=1 +phy_tx_polarity_flip_fabric180.BCM8885X=1 +phy_tx_polarity_flip_fabric181.BCM8885X=0 +phy_tx_polarity_flip_fabric182.BCM8885X=0 +phy_tx_polarity_flip_fabric183.BCM8885X=0 +phy_tx_polarity_flip_fabric184.BCM8885X=0 +phy_tx_polarity_flip_fabric185.BCM8885X=1 +phy_tx_polarity_flip_fabric186.BCM8885X=1 +phy_tx_polarity_flip_fabric187.BCM8885X=0 +phy_tx_polarity_flip_fabric188.BCM8885X=1 +phy_tx_polarity_flip_fabric189.BCM8885X=0 +phy_tx_polarity_flip_fabric190.BCM8885X=0 +phy_tx_polarity_flip_fabric191.BCM8885X=1 + + +lane_to_serdes_map_nif_lane0.BCM8885X=rx0:tx0 +lane_to_serdes_map_nif_lane1.BCM8885X=rx1:tx1 +lane_to_serdes_map_nif_lane2.BCM8885X=rx2:tx2 +lane_to_serdes_map_nif_lane3.BCM8885X=rx3:tx3 +lane_to_serdes_map_nif_lane4.BCM8885X=rx4:tx4 +lane_to_serdes_map_nif_lane5.BCM8885X=rx5:tx5 +lane_to_serdes_map_nif_lane6.BCM8885X=rx6:tx6 +lane_to_serdes_map_nif_lane7.BCM8885X=rx7:tx7 + +lane_to_serdes_map_nif_lane8.BCM8885X=rx8:tx8 +lane_to_serdes_map_nif_lane9.BCM8885X=rx9:tx9 +lane_to_serdes_map_nif_lane10.BCM8885X=rx10:tx10 +lane_to_serdes_map_nif_lane11.BCM8885X=rx11:tx11 +lane_to_serdes_map_nif_lane12.BCM8885X=rx12:tx12 +lane_to_serdes_map_nif_lane13.BCM8885X=rx13:tx13 +lane_to_serdes_map_nif_lane14.BCM8885X=rx14:tx14 +lane_to_serdes_map_nif_lane15.BCM8885X=rx15:tx15 + +lane_to_serdes_map_nif_lane16.BCM8885X=rx16:tx16 +lane_to_serdes_map_nif_lane17.BCM8885X=rx17:tx17 +lane_to_serdes_map_nif_lane18.BCM8885X=rx18:tx18 +lane_to_serdes_map_nif_lane19.BCM8885X=rx19:tx19 +lane_to_serdes_map_nif_lane20.BCM8885X=rx20:tx20 +lane_to_serdes_map_nif_lane21.BCM8885X=rx21:tx21 +lane_to_serdes_map_nif_lane22.BCM8885X=rx22:tx22 +lane_to_serdes_map_nif_lane23.BCM8885X=rx23:tx23 + +lane_to_serdes_map_nif_lane24.BCM8885X=rx24:tx24 +lane_to_serdes_map_nif_lane25.BCM8885X=rx25:tx25 +lane_to_serdes_map_nif_lane26.BCM8885X=rx26:tx26 +lane_to_serdes_map_nif_lane27.BCM8885X=rx27:tx27 +lane_to_serdes_map_nif_lane28.BCM8885X=rx28:tx28 +lane_to_serdes_map_nif_lane29.BCM8885X=rx29:tx29 +lane_to_serdes_map_nif_lane30.BCM8885X=rx30:tx30 +lane_to_serdes_map_nif_lane31.BCM8885X=rx31:tx31 + +lane_to_serdes_map_nif_lane32.BCM8885X=rx32:tx32 +lane_to_serdes_map_nif_lane33.BCM8885X=rx33:tx33 +lane_to_serdes_map_nif_lane34.BCM8885X=rx34:tx34 +lane_to_serdes_map_nif_lane35.BCM8885X=rx35:tx35 +lane_to_serdes_map_nif_lane36.BCM8885X=rx36:tx36 +lane_to_serdes_map_nif_lane37.BCM8885X=rx37:tx37 +lane_to_serdes_map_nif_lane38.BCM8885X=rx38:tx38 +lane_to_serdes_map_nif_lane39.BCM8885X=rx39:tx39 + +lane_to_serdes_map_nif_lane40.BCM8885X=rx40:tx40 +lane_to_serdes_map_nif_lane41.BCM8885X=rx41:tx41 +lane_to_serdes_map_nif_lane42.BCM8885X=rx42:tx42 +lane_to_serdes_map_nif_lane43.BCM8885X=rx43:tx43 +lane_to_serdes_map_nif_lane44.BCM8885X=rx44:tx44 +lane_to_serdes_map_nif_lane45.BCM8885X=rx45:tx45 +lane_to_serdes_map_nif_lane46.BCM8885X=rx46:tx46 +lane_to_serdes_map_nif_lane47.BCM8885X=rx47:tx47 + +lane_to_serdes_map_nif_lane48.BCM8885X=rx48:tx48 +lane_to_serdes_map_nif_lane49.BCM8885X=rx49:tx49 +lane_to_serdes_map_nif_lane50.BCM8885X=rx50:tx50 +lane_to_serdes_map_nif_lane51.BCM8885X=rx51:tx51 +lane_to_serdes_map_nif_lane52.BCM8885X=rx52:tx52 +lane_to_serdes_map_nif_lane53.BCM8885X=rx53:tx53 +lane_to_serdes_map_nif_lane54.BCM8885X=rx54:tx54 +lane_to_serdes_map_nif_lane55.BCM8885X=rx55:tx55 + +lane_to_serdes_map_nif_lane56.BCM8885X=rx56:tx56 +lane_to_serdes_map_nif_lane57.BCM8885X=rx57:tx57 +lane_to_serdes_map_nif_lane58.BCM8885X=rx58:tx58 +lane_to_serdes_map_nif_lane59.BCM8885X=rx59:tx59 +lane_to_serdes_map_nif_lane60.BCM8885X=rx60:tx60 +lane_to_serdes_map_nif_lane61.BCM8885X=rx61:tx61 +lane_to_serdes_map_nif_lane62.BCM8885X=rx62:tx62 +lane_to_serdes_map_nif_lane63.BCM8885X=rx63:tx63 + +lane_to_serdes_map_nif_lane64.BCM8885X=rx64:tx64 +lane_to_serdes_map_nif_lane65.BCM8885X=rx65:tx65 +lane_to_serdes_map_nif_lane66.BCM8885X=rx66:tx66 +lane_to_serdes_map_nif_lane67.BCM8885X=rx67:tx67 +lane_to_serdes_map_nif_lane68.BCM8885X=rx68:tx68 +lane_to_serdes_map_nif_lane69.BCM8885X=rx69:tx69 +lane_to_serdes_map_nif_lane70.BCM8885X=rx70:tx70 +lane_to_serdes_map_nif_lane71.BCM8885X=rx71:tx71 + +lane_to_serdes_map_nif_lane72.BCM8885X=rx72:tx72 +lane_to_serdes_map_nif_lane73.BCM8885X=rx73:tx73 +lane_to_serdes_map_nif_lane74.BCM8885X=rx74:tx74 +lane_to_serdes_map_nif_lane75.BCM8885X=rx75:tx75 +lane_to_serdes_map_nif_lane76.BCM8885X=rx76:tx76 +lane_to_serdes_map_nif_lane77.BCM8885X=rx77:tx77 +lane_to_serdes_map_nif_lane78.BCM8885X=rx78:tx78 +lane_to_serdes_map_nif_lane79.BCM8885X=rx79:tx79 + +lane_to_serdes_map_nif_lane80.BCM8885X=rx80:tx80 +lane_to_serdes_map_nif_lane81.BCM8885X=rx81:tx81 +lane_to_serdes_map_nif_lane82.BCM8885X=rx82:tx82 +lane_to_serdes_map_nif_lane83.BCM8885X=rx83:tx83 +lane_to_serdes_map_nif_lane84.BCM8885X=rx84:tx84 +lane_to_serdes_map_nif_lane85.BCM8885X=rx85:tx85 +lane_to_serdes_map_nif_lane86.BCM8885X=rx86:tx86 +lane_to_serdes_map_nif_lane87.BCM8885X=rx87:tx87 + +lane_to_serdes_map_nif_lane88.BCM8885X=rx88:tx88 +lane_to_serdes_map_nif_lane89.BCM8885X=rx89:tx89 +lane_to_serdes_map_nif_lane90.BCM8885X=rx90:tx90 +lane_to_serdes_map_nif_lane91.BCM8885X=rx91:tx91 +lane_to_serdes_map_nif_lane92.BCM8885X=rx92:tx92 +lane_to_serdes_map_nif_lane93.BCM8885X=rx93:tx93 +lane_to_serdes_map_nif_lane94.BCM8885X=rx94:tx94 +lane_to_serdes_map_nif_lane95.BCM8885X=rx95:tx95 + +lane_to_serdes_map_nif_lane96.BCM8885X=rx96:tx96 +lane_to_serdes_map_nif_lane97.BCM8885X=rx97:tx97 +lane_to_serdes_map_nif_lane98.BCM8885X=rx98:tx98 +lane_to_serdes_map_nif_lane99.BCM8885X=rx99:tx99 +lane_to_serdes_map_nif_lane100.BCM8885X=rx100:tx100 +lane_to_serdes_map_nif_lane101.BCM8885X=rx101:tx101 +lane_to_serdes_map_nif_lane102.BCM8885X=rx102:tx102 +lane_to_serdes_map_nif_lane103.BCM8885X=rx103:tx103 + +lane_to_serdes_map_nif_lane104.BCM8885X=rx104:tx104 +lane_to_serdes_map_nif_lane105.BCM8885X=rx105:tx105 +lane_to_serdes_map_nif_lane106.BCM8885X=rx106:tx106 +lane_to_serdes_map_nif_lane107.BCM8885X=rx107:tx107 +lane_to_serdes_map_nif_lane108.BCM8885X=rx108:tx108 +lane_to_serdes_map_nif_lane109.BCM8885X=rx109:tx109 +lane_to_serdes_map_nif_lane110.BCM8885X=rx110:tx110 +lane_to_serdes_map_nif_lane111.BCM8885X=rx111:tx111 + +lane_to_serdes_map_nif_lane112.BCM8885X=rx112:tx112 +lane_to_serdes_map_nif_lane113.BCM8885X=rx113:tx113 +lane_to_serdes_map_nif_lane114.BCM8885X=rx114:tx114 +lane_to_serdes_map_nif_lane115.BCM8885X=rx115:tx115 +lane_to_serdes_map_nif_lane116.BCM8885X=rx116:tx116 +lane_to_serdes_map_nif_lane117.BCM8885X=rx117:tx117 +lane_to_serdes_map_nif_lane118.BCM8885X=rx118:tx118 +lane_to_serdes_map_nif_lane119.BCM8885X=rx119:tx119 + +lane_to_serdes_map_nif_lane120.BCM8885X=rx120:tx120 +lane_to_serdes_map_nif_lane121.BCM8885X=rx121:tx121 +lane_to_serdes_map_nif_lane122.BCM8885X=rx122:tx122 +lane_to_serdes_map_nif_lane123.BCM8885X=rx123:tx123 +lane_to_serdes_map_nif_lane124.BCM8885X=rx124:tx124 +lane_to_serdes_map_nif_lane125.BCM8885X=rx125:tx125 +lane_to_serdes_map_nif_lane126.BCM8885X=rx126:tx126 +lane_to_serdes_map_nif_lane127.BCM8885X=rx127:tx127 + +lane_to_serdes_map_nif_lane128.BCM8885X=rx128:tx128 +lane_to_serdes_map_nif_lane129.BCM8885X=rx129:tx129 +lane_to_serdes_map_nif_lane130.BCM8885X=rx130:tx130 +lane_to_serdes_map_nif_lane131.BCM8885X=rx131:tx131 +lane_to_serdes_map_nif_lane132.BCM8885X=rx132:tx132 +lane_to_serdes_map_nif_lane133.BCM8885X=rx133:tx133 +lane_to_serdes_map_nif_lane134.BCM8885X=rx134:tx134 +lane_to_serdes_map_nif_lane135.BCM8885X=rx135:tx135 + +lane_to_serdes_map_nif_lane136.BCM8885X=rx136:tx136 +lane_to_serdes_map_nif_lane137.BCM8885X=rx137:tx137 +lane_to_serdes_map_nif_lane138.BCM8885X=rx138:tx138 +lane_to_serdes_map_nif_lane139.BCM8885X=rx139:tx139 +lane_to_serdes_map_nif_lane140.BCM8885X=rx140:tx140 +lane_to_serdes_map_nif_lane141.BCM8885X=rx141:tx141 +lane_to_serdes_map_nif_lane142.BCM8885X=rx142:tx142 +lane_to_serdes_map_nif_lane143.BCM8885X=rx143:tx143 + + +mdb_profile=Balanced-Exem +mdb_profile_kaps_cfg.BCM8885X=2 +mdio_output_delay=16 +mem_cache_enable_ecc.BCM8885X=1 +mem_cache_enable_parity.BCM8885X=1 +miim_intr_enable.BCM8885X=0 +os=unix +outlif_logical_to_physical_phase_map_1=S1 +outlif_logical_to_physical_phase_map_2=L1 +outlif_logical_to_physical_phase_map_3=XL +outlif_logical_to_physical_phase_map_4=L2 +outlif_logical_to_physical_phase_map_5=M1 +outlif_logical_to_physical_phase_map_6=M2 +outlif_logical_to_physical_phase_map_7=M3 +outlif_logical_to_physical_phase_map_8=S2 +outlif_physical_phase_data_granularity_L1=60 +outlif_physical_phase_data_granularity_L2=60 +outlif_physical_phase_data_granularity_M1=60 +outlif_physical_phase_data_granularity_M2=60 +outlif_physical_phase_data_granularity_M3=60 +outlif_physical_phase_data_granularity_S1=60 +outlif_physical_phase_data_granularity_S2=60 +outlif_physical_phase_data_granularity_XL=60 +pdma_continuous_mode_enable.BCM8885X=1 + + +phy_rx_polarity_flip_phy0.BCM8885X=1 +phy_rx_polarity_flip_phy1.BCM8885X=0 +phy_rx_polarity_flip_phy2.BCM8885X=1 +phy_rx_polarity_flip_phy3.BCM8885X=0 +phy_rx_polarity_flip_phy4.BCM8885X=1 +phy_rx_polarity_flip_phy5.BCM8885X=1 +phy_rx_polarity_flip_phy6.BCM8885X=1 +phy_rx_polarity_flip_phy7.BCM8885X=0 + +phy_rx_polarity_flip_phy8.BCM8885X=0 +phy_rx_polarity_flip_phy9.BCM8885X=0 +phy_rx_polarity_flip_phy10.BCM8885X=1 +phy_rx_polarity_flip_phy11.BCM8885X=0 +phy_rx_polarity_flip_phy12.BCM8885X=1 +phy_rx_polarity_flip_phy13.BCM8885X=0 +phy_rx_polarity_flip_phy14.BCM8885X=0 +phy_rx_polarity_flip_phy15.BCM8885X=0 + +phy_rx_polarity_flip_phy16.BCM8885X=1 +phy_rx_polarity_flip_phy17.BCM8885X=0 +phy_rx_polarity_flip_phy18.BCM8885X=1 +phy_rx_polarity_flip_phy19.BCM8885X=0 +phy_rx_polarity_flip_phy20.BCM8885X=1 +phy_rx_polarity_flip_phy21.BCM8885X=1 +phy_rx_polarity_flip_phy22.BCM8885X=1 +phy_rx_polarity_flip_phy23.BCM8885X=1 + +phy_rx_polarity_flip_phy24.BCM8885X=0 +phy_rx_polarity_flip_phy25.BCM8885X=1 +phy_rx_polarity_flip_phy26.BCM8885X=0 +phy_rx_polarity_flip_phy27.BCM8885X=1 +phy_rx_polarity_flip_phy28.BCM8885X=1 +phy_rx_polarity_flip_phy29.BCM8885X=1 +phy_rx_polarity_flip_phy30.BCM8885X=0 +phy_rx_polarity_flip_phy31.BCM8885X=1 + +phy_rx_polarity_flip_phy32.BCM8885X=1 +phy_rx_polarity_flip_phy33.BCM8885X=0 +phy_rx_polarity_flip_phy34.BCM8885X=1 +phy_rx_polarity_flip_phy35.BCM8885X=0 +phy_rx_polarity_flip_phy36.BCM8885X=0 +phy_rx_polarity_flip_phy37.BCM8885X=0 +phy_rx_polarity_flip_phy38.BCM8885X=0 +phy_rx_polarity_flip_phy39.BCM8885X=1 + +phy_rx_polarity_flip_phy40.BCM8885X=1 +phy_rx_polarity_flip_phy41.BCM8885X=1 +phy_rx_polarity_flip_phy42.BCM8885X=0 +phy_rx_polarity_flip_phy43.BCM8885X=1 +phy_rx_polarity_flip_phy44.BCM8885X=1 +phy_rx_polarity_flip_phy45.BCM8885X=0 +phy_rx_polarity_flip_phy46.BCM8885X=0 +phy_rx_polarity_flip_phy47.BCM8885X=1 + +phy_rx_polarity_flip_phy48.BCM8885X=0 +phy_rx_polarity_flip_phy49.BCM8885X=1 +phy_rx_polarity_flip_phy50.BCM8885X=0 +phy_rx_polarity_flip_phy51.BCM8885X=0 +phy_rx_polarity_flip_phy52.BCM8885X=0 +phy_rx_polarity_flip_phy53.BCM8885X=1 +phy_rx_polarity_flip_phy54.BCM8885X=0 +phy_rx_polarity_flip_phy55.BCM8885X=0 + +phy_rx_polarity_flip_phy56.BCM8885X=0 +phy_rx_polarity_flip_phy57.BCM8885X=0 +phy_rx_polarity_flip_phy58.BCM8885X=0 +phy_rx_polarity_flip_phy59.BCM8885X=0 +phy_rx_polarity_flip_phy60.BCM8885X=0 +phy_rx_polarity_flip_phy61.BCM8885X=0 +phy_rx_polarity_flip_phy62.BCM8885X=1 +phy_rx_polarity_flip_phy63.BCM8885X=1 + +phy_rx_polarity_flip_phy64.BCM8885X=0 +phy_rx_polarity_flip_phy65.BCM8885X=0 +phy_rx_polarity_flip_phy66.BCM8885X=0 +phy_rx_polarity_flip_phy67.BCM8885X=0 +phy_rx_polarity_flip_phy68.BCM8885X=0 +phy_rx_polarity_flip_phy69.BCM8885X=0 +phy_rx_polarity_flip_phy70.BCM8885X=0 +phy_rx_polarity_flip_phy71.BCM8885X=0 + +phy_rx_polarity_flip_phy72.BCM8885X=0 +phy_rx_polarity_flip_phy73.BCM8885X=0 +phy_rx_polarity_flip_phy74.BCM8885X=0 +phy_rx_polarity_flip_phy75.BCM8885X=1 +phy_rx_polarity_flip_phy76.BCM8885X=0 +phy_rx_polarity_flip_phy77.BCM8885X=1 +phy_rx_polarity_flip_phy78.BCM8885X=0 +phy_rx_polarity_flip_phy79.BCM8885X=0 + +phy_rx_polarity_flip_phy80.BCM8885X=1 +phy_rx_polarity_flip_phy81.BCM8885X=0 +phy_rx_polarity_flip_phy82.BCM8885X=1 +phy_rx_polarity_flip_phy83.BCM8885X=1 +phy_rx_polarity_flip_phy84.BCM8885X=0 +phy_rx_polarity_flip_phy85.BCM8885X=0 +phy_rx_polarity_flip_phy86.BCM8885X=1 +phy_rx_polarity_flip_phy87.BCM8885X=1 + +phy_rx_polarity_flip_phy88.BCM8885X=0 +phy_rx_polarity_flip_phy89.BCM8885X=1 +phy_rx_polarity_flip_phy90.BCM8885X=0 +phy_rx_polarity_flip_phy91.BCM8885X=0 +phy_rx_polarity_flip_phy92.BCM8885X=0 +phy_rx_polarity_flip_phy93.BCM8885X=0 +phy_rx_polarity_flip_phy94.BCM8885X=0 +phy_rx_polarity_flip_phy95.BCM8885X=1 + +phy_rx_polarity_flip_phy96.BCM8885X=0 +phy_rx_polarity_flip_phy97.BCM8885X=0 +phy_rx_polarity_flip_phy98.BCM8885X=0 +phy_rx_polarity_flip_phy99.BCM8885X=0 +phy_rx_polarity_flip_phy100.BCM8885X=0 +phy_rx_polarity_flip_phy101.BCM8885X=1 +phy_rx_polarity_flip_phy102.BCM8885X=1 +phy_rx_polarity_flip_phy103.BCM8885X=0 + +phy_rx_polarity_flip_phy104.BCM8885X=1 +phy_rx_polarity_flip_phy105.BCM8885X=1 +phy_rx_polarity_flip_phy106.BCM8885X=1 +phy_rx_polarity_flip_phy107.BCM8885X=1 +phy_rx_polarity_flip_phy108.BCM8885X=0 +phy_rx_polarity_flip_phy109.BCM8885X=1 +phy_rx_polarity_flip_phy110.BCM8885X=1 +phy_rx_polarity_flip_phy111.BCM8885X=1 + +phy_rx_polarity_flip_phy112.BCM8885X=0 +phy_rx_polarity_flip_phy113.BCM8885X=1 +phy_rx_polarity_flip_phy114.BCM8885X=1 +phy_rx_polarity_flip_phy115.BCM8885X=1 +phy_rx_polarity_flip_phy116.BCM8885X=1 +phy_rx_polarity_flip_phy117.BCM8885X=1 +phy_rx_polarity_flip_phy118.BCM8885X=0 +phy_rx_polarity_flip_phy119.BCM8885X=0 + +phy_rx_polarity_flip_phy120.BCM8885X=1 +phy_rx_polarity_flip_phy121.BCM8885X=0 +phy_rx_polarity_flip_phy122.BCM8885X=0 +phy_rx_polarity_flip_phy123.BCM8885X=1 +phy_rx_polarity_flip_phy124.BCM8885X=0 +phy_rx_polarity_flip_phy125.BCM8885X=1 +phy_rx_polarity_flip_phy126.BCM8885X=1 +phy_rx_polarity_flip_phy127.BCM8885X=0 + +phy_rx_polarity_flip_phy128.BCM8885X=0 +phy_rx_polarity_flip_phy129.BCM8885X=0 +phy_rx_polarity_flip_phy130.BCM8885X=1 +phy_rx_polarity_flip_phy131.BCM8885X=0 +phy_rx_polarity_flip_phy132.BCM8885X=0 +phy_rx_polarity_flip_phy133.BCM8885X=1 +phy_rx_polarity_flip_phy134.BCM8885X=1 +phy_rx_polarity_flip_phy135.BCM8885X=0 + +phy_rx_polarity_flip_phy136.BCM8885X=1 +phy_rx_polarity_flip_phy137.BCM8885X=0 +phy_rx_polarity_flip_phy138.BCM8885X=0 +phy_rx_polarity_flip_phy139.BCM8885X=1 +phy_rx_polarity_flip_phy140.BCM8885X=1 +phy_rx_polarity_flip_phy141.BCM8885X=1 +phy_rx_polarity_flip_phy142.BCM8885X=0 +phy_rx_polarity_flip_phy143.BCM8885X=1 + + +phy_tx_polarity_flip_phy0.BCM8885X=1 +phy_tx_polarity_flip_phy1.BCM8885X=0 +phy_tx_polarity_flip_phy2.BCM8885X=0 +phy_tx_polarity_flip_phy3.BCM8885X=0 +phy_tx_polarity_flip_phy4.BCM8885X=1 +phy_tx_polarity_flip_phy5.BCM8885X=0 +phy_tx_polarity_flip_phy6.BCM8885X=0 +phy_tx_polarity_flip_phy7.BCM8885X=1 + +phy_tx_polarity_flip_phy8.BCM8885X=0 +phy_tx_polarity_flip_phy9.BCM8885X=1 +phy_tx_polarity_flip_phy10.BCM8885X=0 +phy_tx_polarity_flip_phy11.BCM8885X=1 +phy_tx_polarity_flip_phy12.BCM8885X=1 +phy_tx_polarity_flip_phy13.BCM8885X=1 +phy_tx_polarity_flip_phy14.BCM8885X=0 +phy_tx_polarity_flip_phy15.BCM8885X=1 + +phy_tx_polarity_flip_phy16.BCM8885X=1 +phy_tx_polarity_flip_phy17.BCM8885X=1 +phy_tx_polarity_flip_phy18.BCM8885X=0 +phy_tx_polarity_flip_phy19.BCM8885X=0 +phy_tx_polarity_flip_phy20.BCM8885X=1 +phy_tx_polarity_flip_phy21.BCM8885X=1 +phy_tx_polarity_flip_phy22.BCM8885X=0 +phy_tx_polarity_flip_phy23.BCM8885X=0 + +phy_tx_polarity_flip_phy24.BCM8885X=0 +phy_tx_polarity_flip_phy25.BCM8885X=0 +phy_tx_polarity_flip_phy26.BCM8885X=0 +phy_tx_polarity_flip_phy27.BCM8885X=1 +phy_tx_polarity_flip_phy28.BCM8885X=0 +phy_tx_polarity_flip_phy29.BCM8885X=0 +phy_tx_polarity_flip_phy30.BCM8885X=0 +phy_tx_polarity_flip_phy31.BCM8885X=0 + +phy_tx_polarity_flip_phy32.BCM8885X=1 +phy_tx_polarity_flip_phy33.BCM8885X=1 +phy_tx_polarity_flip_phy34.BCM8885X=1 +phy_tx_polarity_flip_phy35.BCM8885X=0 +phy_tx_polarity_flip_phy36.BCM8885X=1 +phy_tx_polarity_flip_phy37.BCM8885X=1 +phy_tx_polarity_flip_phy38.BCM8885X=1 +phy_tx_polarity_flip_phy39.BCM8885X=0 + +phy_tx_polarity_flip_phy40.BCM8885X=0 +phy_tx_polarity_flip_phy41.BCM8885X=0 +phy_tx_polarity_flip_phy42.BCM8885X=1 +phy_tx_polarity_flip_phy43.BCM8885X=1 +phy_tx_polarity_flip_phy44.BCM8885X=0 +phy_tx_polarity_flip_phy45.BCM8885X=0 +phy_tx_polarity_flip_phy46.BCM8885X=1 +phy_tx_polarity_flip_phy47.BCM8885X=0 + +phy_tx_polarity_flip_phy48.BCM8885X=1 +phy_tx_polarity_flip_phy49.BCM8885X=1 +phy_tx_polarity_flip_phy50.BCM8885X=1 +phy_tx_polarity_flip_phy51.BCM8885X=0 +phy_tx_polarity_flip_phy52.BCM8885X=1 +phy_tx_polarity_flip_phy53.BCM8885X=0 +phy_tx_polarity_flip_phy54.BCM8885X=0 +phy_tx_polarity_flip_phy55.BCM8885X=0 + +phy_tx_polarity_flip_phy56.BCM8885X=0 +phy_tx_polarity_flip_phy57.BCM8885X=1 +phy_tx_polarity_flip_phy58.BCM8885X=0 +phy_tx_polarity_flip_phy59.BCM8885X=0 +phy_tx_polarity_flip_phy60.BCM8885X=0 +phy_tx_polarity_flip_phy61.BCM8885X=0 +phy_tx_polarity_flip_phy62.BCM8885X=0 +phy_tx_polarity_flip_phy63.BCM8885X=0 + +phy_tx_polarity_flip_phy64.BCM8885X=0 +phy_tx_polarity_flip_phy65.BCM8885X=1 +phy_tx_polarity_flip_phy66.BCM8885X=1 +phy_tx_polarity_flip_phy67.BCM8885X=0 +phy_tx_polarity_flip_phy68.BCM8885X=1 +phy_tx_polarity_flip_phy69.BCM8885X=0 +phy_tx_polarity_flip_phy70.BCM8885X=0 +phy_tx_polarity_flip_phy71.BCM8885X=1 + +phy_tx_polarity_flip_phy72.BCM8885X=1 +phy_tx_polarity_flip_phy73.BCM8885X=1 +phy_tx_polarity_flip_phy74.BCM8885X=0 +phy_tx_polarity_flip_phy75.BCM8885X=1 +phy_tx_polarity_flip_phy76.BCM8885X=1 +phy_tx_polarity_flip_phy77.BCM8885X=0 +phy_tx_polarity_flip_phy78.BCM8885X=0 +phy_tx_polarity_flip_phy79.BCM8885X=1 + +phy_tx_polarity_flip_phy80.BCM8885X=1 +phy_tx_polarity_flip_phy81.BCM8885X=0 +phy_tx_polarity_flip_phy82.BCM8885X=0 +phy_tx_polarity_flip_phy83.BCM8885X=0 +phy_tx_polarity_flip_phy84.BCM8885X=0 +phy_tx_polarity_flip_phy85.BCM8885X=0 +phy_tx_polarity_flip_phy86.BCM8885X=1 +phy_tx_polarity_flip_phy87.BCM8885X=0 + +phy_tx_polarity_flip_phy88.BCM8885X=1 +phy_tx_polarity_flip_phy89.BCM8885X=0 +phy_tx_polarity_flip_phy90.BCM8885X=1 +phy_tx_polarity_flip_phy91.BCM8885X=1 +phy_tx_polarity_flip_phy92.BCM8885X=1 +phy_tx_polarity_flip_phy93.BCM8885X=0 +phy_tx_polarity_flip_phy94.BCM8885X=1 +phy_tx_polarity_flip_phy95.BCM8885X=1 + +phy_tx_polarity_flip_phy96.BCM8885X=1 +phy_tx_polarity_flip_phy97.BCM8885X=1 +phy_tx_polarity_flip_phy98.BCM8885X=1 +phy_tx_polarity_flip_phy99.BCM8885X=0 +phy_tx_polarity_flip_phy100.BCM8885X=1 +phy_tx_polarity_flip_phy101.BCM8885X=1 +phy_tx_polarity_flip_phy102.BCM8885X=1 +phy_tx_polarity_flip_phy103.BCM8885X=0 + +phy_tx_polarity_flip_phy104.BCM8885X=0 +phy_tx_polarity_flip_phy105.BCM8885X=0 +phy_tx_polarity_flip_phy106.BCM8885X=0 +phy_tx_polarity_flip_phy107.BCM8885X=1 +phy_tx_polarity_flip_phy108.BCM8885X=1 +phy_tx_polarity_flip_phy109.BCM8885X=0 +phy_tx_polarity_flip_phy110.BCM8885X=1 +phy_tx_polarity_flip_phy111.BCM8885X=0 + +phy_tx_polarity_flip_phy112.BCM8885X=0 +phy_tx_polarity_flip_phy113.BCM8885X=1 +phy_tx_polarity_flip_phy114.BCM8885X=1 +phy_tx_polarity_flip_phy115.BCM8885X=0 +phy_tx_polarity_flip_phy116.BCM8885X=0 +phy_tx_polarity_flip_phy117.BCM8885X=1 +phy_tx_polarity_flip_phy118.BCM8885X=0 +phy_tx_polarity_flip_phy119.BCM8885X=0 + +phy_tx_polarity_flip_phy120.BCM8885X=0 +phy_tx_polarity_flip_phy121.BCM8885X=1 +phy_tx_polarity_flip_phy122.BCM8885X=1 +phy_tx_polarity_flip_phy123.BCM8885X=0 +phy_tx_polarity_flip_phy124.BCM8885X=0 +phy_tx_polarity_flip_phy125.BCM8885X=0 +phy_tx_polarity_flip_phy126.BCM8885X=1 +phy_tx_polarity_flip_phy127.BCM8885X=0 + +phy_tx_polarity_flip_phy128.BCM8885X=1 +phy_tx_polarity_flip_phy129.BCM8885X=1 +phy_tx_polarity_flip_phy130.BCM8885X=0 +phy_tx_polarity_flip_phy131.BCM8885X=0 +phy_tx_polarity_flip_phy132.BCM8885X=0 +phy_tx_polarity_flip_phy133.BCM8885X=1 +phy_tx_polarity_flip_phy134.BCM8885X=0 +phy_tx_polarity_flip_phy135.BCM8885X=0 + +phy_tx_polarity_flip_phy136.BCM8885X=0 +phy_tx_polarity_flip_phy137.BCM8885X=0 +phy_tx_polarity_flip_phy138.BCM8885X=0 +phy_tx_polarity_flip_phy139.BCM8885X=0 +phy_tx_polarity_flip_phy140.BCM8885X=0 +phy_tx_polarity_flip_phy141.BCM8885X=0 +phy_tx_polarity_flip_phy142.BCM8885X=0 +phy_tx_polarity_flip_phy143.BCM8885X=0 + + +polled_irq_delay.BCM8885X=5 +polled_irq_mode.BCM8885X=0 +port_fec_fabric.BCM8885X=7 +bcm_stat_interval.BCM8885X=1000000 + + +port_init_cl72_256=0 +port_init_cl72_257=0 +port_init_cl72_258=0 +port_init_cl72_259=0 +port_init_cl72_260=0 +port_init_cl72_261=0 +port_init_cl72_262=0 +port_init_cl72_263=0 +port_init_cl72_264=0 +port_init_cl72_265=0 +port_init_cl72_266=0 +port_init_cl72_267=0 +port_init_cl72_268=0 +port_init_cl72_269=0 +port_init_cl72_270=0 +port_init_cl72_271=0 +port_init_cl72_272=0 +port_init_cl72_273=0 +port_init_cl72_274=0 +port_init_cl72_275=0 +port_init_cl72_276=0 +port_init_cl72_277=0 +port_init_cl72_278=0 +port_init_cl72_279=0 +port_init_cl72_280=0 +port_init_cl72_281=0 +port_init_cl72_282=0 +port_init_cl72_283=0 +port_init_cl72_284=0 +port_init_cl72_285=0 +port_init_cl72_286=0 +port_init_cl72_287=0 +port_init_cl72_288=0 +port_init_cl72_289=0 +port_init_cl72_290=0 +port_init_cl72_291=0 +port_init_cl72_292=0 +port_init_cl72_293=0 +port_init_cl72_294=0 +port_init_cl72_295=0 +port_init_cl72_296=0 +port_init_cl72_297=0 +port_init_cl72_298=0 +port_init_cl72_299=0 +port_init_cl72_300=0 +port_init_cl72_301=0 +port_init_cl72_302=0 +port_init_cl72_303=0 +port_init_cl72_304=0 +port_init_cl72_305=0 +port_init_cl72_306=0 +port_init_cl72_307=0 +port_init_cl72_308=0 +port_init_cl72_309=0 +port_init_cl72_310=0 +port_init_cl72_311=0 +port_init_cl72_312=0 +port_init_cl72_313=0 +port_init_cl72_314=0 +port_init_cl72_315=0 +port_init_cl72_316=0 +port_init_cl72_317=0 +port_init_cl72_318=0 +port_init_cl72_319=0 +port_init_cl72_320=0 +port_init_cl72_321=0 +port_init_cl72_322=0 +port_init_cl72_323=0 +port_init_cl72_324=0 +port_init_cl72_325=0 +port_init_cl72_326=0 +port_init_cl72_327=0 +port_init_cl72_328=0 +port_init_cl72_329=0 +port_init_cl72_330=0 +port_init_cl72_331=0 +port_init_cl72_332=0 +port_init_cl72_333=0 +port_init_cl72_334=0 +port_init_cl72_335=0 +port_init_cl72_336=0 +port_init_cl72_337=0 +port_init_cl72_338=0 +port_init_cl72_339=0 +port_init_cl72_340=0 +port_init_cl72_341=0 +port_init_cl72_342=0 +port_init_cl72_343=0 +port_init_cl72_344=0 +port_init_cl72_345=0 +port_init_cl72_346=0 +port_init_cl72_347=0 +port_init_cl72_348=0 +port_init_cl72_349=0 +port_init_cl72_350=0 +port_init_cl72_351=0 +port_init_cl72_352=0 +port_init_cl72_353=0 +port_init_cl72_354=0 +port_init_cl72_355=0 +port_init_cl72_356=0 +port_init_cl72_357=0 +port_init_cl72_358=0 +port_init_cl72_359=0 +port_init_cl72_360=0 +port_init_cl72_361=0 +port_init_cl72_362=0 +port_init_cl72_363=0 +port_init_cl72_364=0 +port_init_cl72_365=0 +port_init_cl72_366=0 +port_init_cl72_367=0 +port_init_cl72_368=0 +port_init_cl72_369=0 +port_init_cl72_370=0 +port_init_cl72_371=0 +port_init_cl72_372=0 +port_init_cl72_373=0 +port_init_cl72_374=0 +port_init_cl72_375=0 +port_init_cl72_376=0 +port_init_cl72_377=0 +port_init_cl72_378=0 +port_init_cl72_379=0 +port_init_cl72_380=0 +port_init_cl72_381=0 +port_init_cl72_382=0 +port_init_cl72_383=0 +port_init_cl72_384=0 +port_init_cl72_385=0 +port_init_cl72_386=0 +port_init_cl72_387=0 +port_init_cl72_388=0 +port_init_cl72_389=0 +port_init_cl72_390=0 +port_init_cl72_391=0 +port_init_cl72_392=0 +port_init_cl72_393=0 +port_init_cl72_394=0 +port_init_cl72_395=0 +port_init_cl72_396=0 +port_init_cl72_397=0 +port_init_cl72_398=0 +port_init_cl72_399=0 +port_init_cl72_400=0 +port_init_cl72_401=0 +port_init_cl72_402=0 +port_init_cl72_403=0 +port_init_cl72_404=0 +port_init_cl72_405=0 +port_init_cl72_406=0 +port_init_cl72_407=0 +port_init_cl72_408=0 +port_init_cl72_409=0 +port_init_cl72_410=0 +port_init_cl72_411=0 +port_init_cl72_412=0 +port_init_cl72_413=0 +port_init_cl72_414=0 +port_init_cl72_415=0 +port_init_cl72_416=0 +port_init_cl72_417=0 +port_init_cl72_418=0 +port_init_cl72_419=0 +port_init_cl72_420=0 +port_init_cl72_421=0 +port_init_cl72_422=0 +port_init_cl72_423=0 +port_init_cl72_424=0 +port_init_cl72_425=0 +port_init_cl72_426=0 +port_init_cl72_427=0 +port_init_cl72_428=0 +port_init_cl72_429=0 +port_init_cl72_430=0 +port_init_cl72_431=0 +port_init_cl72_432=0 +port_init_cl72_433=0 +port_init_cl72_434=0 +port_init_cl72_435=0 +port_init_cl72_436=0 +port_init_cl72_437=0 +port_init_cl72_438=0 +port_init_cl72_439=0 +port_init_cl72_440=0 +port_init_cl72_441=0 +port_init_cl72_442=0 +port_init_cl72_443=0 +port_init_cl72_444=0 +port_init_cl72_445=0 +port_init_cl72_446=0 +port_init_cl72_447=0 + + +port_init_speed_cc.BCM8885X=200000 +port_init_speed_cd.BCM8885X=400000 +port_init_speed_ce.BCM8885X=100000 +port_init_speed_fabric.BCM8885X=53125 +port_init_speed_il.BCM8885X=10312 +port_init_speed_le.BCM8885X=50000 +port_init_speed_xe.BCM8885X=10000 +port_init_speed_xl.BCM8885X=40000 +port_priorities.BCM8885X=8 +protocol_traps_mode.BCM8885X=IN_LIF +rate_ext_mdio_divisor=16 +schan_intr_enable.BCM8885X=0 +schan_timeout_usec.BCM8885X=900000 +serdes_fabric_clk_freq_in.BCM8885X=1 +serdes_fabric_clk_freq_out.BCM8885X=bypass +serdes_nif_clk_freq_in0.BCM8885X=1 +serdes_nif_clk_freq_in1.BCM8885X=1 +serdes_nif_clk_freq_out0.BCM8885X=bypass +serdes_nif_clk_freq_out1.BCM8885X=bypass +soc_family.BCM8885X=BCM8885X +stable_filename.BCM8885X=/tmp/warmboot_data +stable_location.BCM8885X=3 +stable_size.BCM8885X=800000000 +sw_state_max_size.BCM8885X=750000000 +system_headers_mode=1 +tdma_intr_enable.BCM8885X=0 +tdma_timeout_usec.BCM8885X=1000000 +tm_port_header_type_in_0.BCM8885X=INJECTED_2 +tm_port_header_type_in_200.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_201.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_232.BCM8885X=INJECTED_2 +tm_port_header_type_in_19.BCM8885X=ETH +tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_out_0.BCM8885X=CPU +tm_port_header_type_out_200.BCM8885X=ETH +tm_port_header_type_out_201.BCM8885X=ETH +tm_port_header_type_out_202.BCM8885X=ETH +tm_port_header_type_out_203.BCM8885X=ETH +tm_port_header_type_out_232.BCM8885X=CPU +tm_port_header_type_out_19.BCM8885X=ETH +tm_port_header_type_out_20.BCM8885X=RAW +tslam_intr_enable.BCM8885X=0 +tslam_timeout_usec.BCM8885X=1000000 +ucode_port_0.BCM8885X=CPU.0:core_0.0 +ucode_port_200.BCM8885X=CPU.8:core_1.200 +ucode_port_201.BCM8885X=CPU.16:core_1.201 +ucode_port_202.BCM8885X=CPU.24:core_1.202 +ucode_port_203.BCM8885X=CPU.32:core_1.203 + + +ucode_port_1.BCM8885X=CGE18:core_1.1 +ucode_port_2.BCM8885X=CGE20:core_1.2 +ucode_port_3.BCM8885X=CGE22:core_1.3 +ucode_port_4.BCM8885X=CGE24:core_1.4 +ucode_port_5.BCM8885X=CGE26:core_1.5 +ucode_port_6.BCM8885X=CGE28:core_1.6 +ucode_port_7.BCM8885X=CGE30:core_1.7 +ucode_port_8.BCM8885X=CGE32:core_1.8 +ucode_port_9.BCM8885X=CGE34:core_1.9 +ucode_port_10.BCM8885X=CGE16:core_0.10 +ucode_port_11.BCM8885X=CGE14:core_0.11 +ucode_port_12.BCM8885X=CGE12:core_0.12 +ucode_port_13.BCM8885X=CGE10:core_0.13 +ucode_port_14.BCM8885X=CGE8:core_0.14 +ucode_port_15.BCM8885X=CGE6:core_0.15 +ucode_port_16.BCM8885X=CGE4:core_0.16 +ucode_port_17.BCM8885X=CGE2:core_0.17 +ucode_port_18.BCM8885X=CGE0:core_0.18 + + +ucode_port_19.BCM8885X=RCY0:core_0.19 +ucode_port_20.BCM8885X=RCY1:core_1.20 +ucode_port_21.BCM8885X=OLP:core_1.21 + + +port_init_speed_1.BCM8885X=100000 +port_init_speed_2.BCM8885X=100000 +port_init_speed_3.BCM8885X=100000 +port_init_speed_4.BCM8885X=100000 +port_init_speed_5.BCM8885X=100000 +port_init_speed_6.BCM8885X=100000 +port_init_speed_7.BCM8885X=100000 +port_init_speed_8.BCM8885X=100000 +port_init_speed_9.BCM8885X=100000 +port_init_speed_10.BCM8885X=100000 +port_init_speed_11.BCM8885X=100000 +port_init_speed_12.BCM8885X=100000 +port_init_speed_13.BCM8885X=100000 +port_init_speed_14.BCM8885X=100000 +port_init_speed_15.BCM8885X=100000 +port_init_speed_16.BCM8885X=100000 +port_init_speed_17.BCM8885X=100000 +port_init_speed_18.BCM8885X=100000 + + +port_fec_1.BCM8885X=0 +port_fec_2.BCM8885X=0 +port_fec_3.BCM8885X=0 +port_fec_4.BCM8885X=0 +port_fec_5.BCM8885x=0 +port_fec_6.BCM8885x=0 +port_fec_7.BCM8885x=0 +port_fec_8.BCM8885x=0 +port_fec_9.BCM8885x=0 +port_fec_10.BCM8885x=0 +port_fec_11.BCM8885x=0 +port_fec_12.BCM8885x=0 +port_fec_13.BCM8885x=0 +port_fec_14.BCM8885x=0 +port_fec_15.BCM8885x=0 +port_fec_16.BCM8885x=0 +port_fec_17.BCM8885x=0 +port_fec_18.BCM8885x=0 + +port_init_cl72_1=0 +port_init_cl72_2=0 +port_init_cl72_3=0 +port_init_cl72_4=0 +port_init_cl72_5=0 +port_init_cl72_6=0 +port_init_cl72_7=0 +port_init_cl72_8=0 +port_init_cl72_9=0 +port_init_cl72_10=0 +port_init_cl72_11=0 +port_init_cl72_12=0 +port_init_cl72_13=0 +port_init_cl72_14=0 +port_init_cl72_15=0 +port_init_cl72_16=0 +port_init_cl72_17=0 +port_init_cl72_18=0 + +serdes_lane_config_dfe_1.BCM8885X=lp +serdes_lane_config_dfe_2.BCM8885X=lp +serdes_lane_config_dfe_3.BCM8885X=lp +serdes_lane_config_dfe_4.BCM8885X=lp +serdes_lane_config_dfe_5.BCM8885X=lp +serdes_lane_config_dfe_6.BCM8885X=lp +serdes_lane_config_dfe_7.BCM8885X=lp +serdes_lane_config_dfe_8.BCM8885X=lp +serdes_lane_config_dfe_9.BCM8885X=lp +serdes_lane_config_dfe_10.BCM8885X=lp +serdes_lane_config_dfe_11.BCM8885X=lp +serdes_lane_config_dfe_12.BCM8885X=lp +serdes_lane_config_dfe_13.BCM8885X=lp +serdes_lane_config_dfe_14.BCM8885X=lp +serdes_lane_config_dfe_15.BCM8885X=lp +serdes_lane_config_dfe_16.BCM8885X=lp +serdes_lane_config_dfe_17.BCM8885X=lp +serdes_lane_config_dfe_18.BCM8885X=lp + + +serdes_lane_config_media_type_1.BCM8885X=backplane +serdes_lane_config_media_type_2.BCM8885X=backplane +serdes_lane_config_media_type_3.BCM8885X=backplane +serdes_lane_config_media_type_4.BCM8885X=backplane +serdes_lane_config_media_type_5.BCM8885X=backplane +serdes_lane_config_media_type_6.BCM8885X=backplane +serdes_lane_config_media_type_7.BCM8885X=backplane +serdes_lane_config_media_type_8.BCM8885X=backplane +serdes_lane_config_media_type_9.BCM8885X=backplane +serdes_lane_config_media_type_10.BCM8885X=backplane +serdes_lane_config_media_type_11.BCM8885X=backplane +serdes_lane_config_media_type_12.BCM8885X=backplane +serdes_lane_config_media_type_13.BCM8885X=backplane +serdes_lane_config_media_type_14.BCM8885X=backplane +serdes_lane_config_media_type_15.BCM8885X=backplane +serdes_lane_config_media_type_16.BCM8885X=backplane +serdes_lane_config_media_type_17.BCM8885X=backplane +serdes_lane_config_media_type_18.BCM8885X=backplane + + +serdes_tx_taps_1.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_2.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_3.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_4.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_5.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_6.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_7.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_8.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_9.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_10.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_11.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_12.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_13.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_14.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_15.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_16.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_17.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_18.BCM8885X=nrz:-6:87:-4 + + +serdes_tx_taps_256.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_257.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_258.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_259.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_260.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_261.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_262.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_263.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_264.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_265.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_266.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_267.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_268.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_269.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_270.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_271.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_272.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_273.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_274.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_275.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_276.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_277.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_278.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_279.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_280.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_281.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_282.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_283.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_284.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_285.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_286.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_287.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_288.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_289.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_290.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_291.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_292.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_293.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_294.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_295.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_296.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_297.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_298.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_299.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_300.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_301.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_302.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_303.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_304.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_305.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_306.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_307.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_308.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_309.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_310.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_311.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_312.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_313.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_314.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_315.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_316.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_317.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_318.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_319.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_320.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_321.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_322.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_323.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_324.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_325.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_326.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_327.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_328.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_329.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_330.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_331.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_332.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_333.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_334.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_335.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_336.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_337.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_338.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_339.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_340.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_341.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_342.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_343.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_344.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_345.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_346.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_347.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_348.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_349.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_350.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_351.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_352.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_353.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_354.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_355.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_356.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_357.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_358.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_359.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_360.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_361.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_362.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_363.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_364.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_365.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_366.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_367.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_368.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_369.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_370.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_371.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_372.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_373.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_374.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_375.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_376.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_377.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_378.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_379.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_380.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_381.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_382.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_383.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_384.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_385.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_386.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_387.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_388.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_389.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_390.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_391.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_392.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_393.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_394.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_395.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_396.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_397.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_398.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_399.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_400.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_401.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_402.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_403.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_404.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_405.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_406.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_407.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_408.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_409.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_410.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_411.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_412.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_413.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_414.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_415.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_416.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_417.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_418.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_419.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_420.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_421.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_422.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_423.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_424.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_425.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_426.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_427.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_428.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_429.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_430.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_431.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_432.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_433.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_434.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_435.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_436.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_437.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_438.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_439.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_440.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_441.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_442.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_443.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_444.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_445.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_446.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_447.BCM8885X=pam4:-20:148:0:0:0:0 + + +serdes_lane_config_channel_mode_256=force_nr +serdes_lane_config_channel_mode_257=force_nr +serdes_lane_config_channel_mode_258=force_nr +serdes_lane_config_channel_mode_259=force_nr +serdes_lane_config_channel_mode_260=force_nr +serdes_lane_config_channel_mode_261=force_nr +serdes_lane_config_channel_mode_262=force_nr +serdes_lane_config_channel_mode_263=force_nr +serdes_lane_config_channel_mode_264=force_nr +serdes_lane_config_channel_mode_265=force_nr +serdes_lane_config_channel_mode_266=force_nr +serdes_lane_config_channel_mode_267=force_nr +serdes_lane_config_channel_mode_268=force_nr +serdes_lane_config_channel_mode_269=force_nr +serdes_lane_config_channel_mode_270=force_nr +serdes_lane_config_channel_mode_271=force_nr +serdes_lane_config_channel_mode_272=force_nr +serdes_lane_config_channel_mode_273=force_nr +serdes_lane_config_channel_mode_274=force_nr +serdes_lane_config_channel_mode_275=force_nr +serdes_lane_config_channel_mode_276=force_nr +serdes_lane_config_channel_mode_277=force_nr +serdes_lane_config_channel_mode_278=force_nr +serdes_lane_config_channel_mode_279=force_nr +serdes_lane_config_channel_mode_280=force_nr +serdes_lane_config_channel_mode_281=force_nr +serdes_lane_config_channel_mode_282=force_nr +serdes_lane_config_channel_mode_283=force_nr +serdes_lane_config_channel_mode_284=force_nr +serdes_lane_config_channel_mode_285=force_nr +serdes_lane_config_channel_mode_286=force_nr +serdes_lane_config_channel_mode_287=force_nr +serdes_lane_config_channel_mode_288=force_nr +serdes_lane_config_channel_mode_289=force_nr +serdes_lane_config_channel_mode_290=force_nr +serdes_lane_config_channel_mode_291=force_nr +serdes_lane_config_channel_mode_292=force_nr +serdes_lane_config_channel_mode_293=force_nr +serdes_lane_config_channel_mode_294=force_nr +serdes_lane_config_channel_mode_295=force_nr +serdes_lane_config_channel_mode_296=force_nr +serdes_lane_config_channel_mode_297=force_nr +serdes_lane_config_channel_mode_298=force_nr +serdes_lane_config_channel_mode_299=force_nr +serdes_lane_config_channel_mode_300=force_nr +serdes_lane_config_channel_mode_301=force_nr +serdes_lane_config_channel_mode_302=force_nr +serdes_lane_config_channel_mode_303=force_nr +serdes_lane_config_channel_mode_304=force_nr +serdes_lane_config_channel_mode_305=force_nr +serdes_lane_config_channel_mode_306=force_nr +serdes_lane_config_channel_mode_307=force_nr +serdes_lane_config_channel_mode_308=force_nr +serdes_lane_config_channel_mode_309=force_nr +serdes_lane_config_channel_mode_310=force_nr +serdes_lane_config_channel_mode_311=force_nr +serdes_lane_config_channel_mode_312=force_nr +serdes_lane_config_channel_mode_313=force_nr +serdes_lane_config_channel_mode_314=force_nr +serdes_lane_config_channel_mode_315=force_nr +serdes_lane_config_channel_mode_316=force_nr +serdes_lane_config_channel_mode_317=force_nr +serdes_lane_config_channel_mode_318=force_nr +serdes_lane_config_channel_mode_319=force_nr +serdes_lane_config_channel_mode_320=force_nr +serdes_lane_config_channel_mode_321=force_nr +serdes_lane_config_channel_mode_322=force_nr +serdes_lane_config_channel_mode_323=force_nr +serdes_lane_config_channel_mode_324=force_nr +serdes_lane_config_channel_mode_325=force_nr +serdes_lane_config_channel_mode_326=force_nr +serdes_lane_config_channel_mode_327=force_nr +serdes_lane_config_channel_mode_328=force_nr +serdes_lane_config_channel_mode_329=force_nr +serdes_lane_config_channel_mode_330=force_nr +serdes_lane_config_channel_mode_331=force_nr +serdes_lane_config_channel_mode_332=force_nr +serdes_lane_config_channel_mode_333=force_nr +serdes_lane_config_channel_mode_334=force_nr +serdes_lane_config_channel_mode_335=force_nr +serdes_lane_config_channel_mode_336=force_nr +serdes_lane_config_channel_mode_337=force_nr +serdes_lane_config_channel_mode_338=force_nr +serdes_lane_config_channel_mode_339=force_nr +serdes_lane_config_channel_mode_340=force_nr +serdes_lane_config_channel_mode_341=force_nr +serdes_lane_config_channel_mode_342=force_nr +serdes_lane_config_channel_mode_343=force_nr +serdes_lane_config_channel_mode_344=force_nr +serdes_lane_config_channel_mode_345=force_nr +serdes_lane_config_channel_mode_346=force_nr +serdes_lane_config_channel_mode_347=force_nr +serdes_lane_config_channel_mode_348=force_nr +serdes_lane_config_channel_mode_349=force_nr +serdes_lane_config_channel_mode_350=force_nr +serdes_lane_config_channel_mode_351=force_nr +serdes_lane_config_channel_mode_352=force_nr +serdes_lane_config_channel_mode_353=force_nr +serdes_lane_config_channel_mode_354=force_nr +serdes_lane_config_channel_mode_355=force_nr +serdes_lane_config_channel_mode_356=force_nr +serdes_lane_config_channel_mode_357=force_nr +serdes_lane_config_channel_mode_358=force_nr +serdes_lane_config_channel_mode_359=force_nr +serdes_lane_config_channel_mode_360=force_nr +serdes_lane_config_channel_mode_361=force_nr +serdes_lane_config_channel_mode_362=force_nr +serdes_lane_config_channel_mode_363=force_nr +serdes_lane_config_channel_mode_364=force_nr +serdes_lane_config_channel_mode_365=force_nr +serdes_lane_config_channel_mode_366=force_nr +serdes_lane_config_channel_mode_367=force_nr +serdes_lane_config_channel_mode_368=force_nr +serdes_lane_config_channel_mode_369=force_nr +serdes_lane_config_channel_mode_370=force_nr +serdes_lane_config_channel_mode_371=force_nr +serdes_lane_config_channel_mode_372=force_nr +serdes_lane_config_channel_mode_373=force_nr +serdes_lane_config_channel_mode_374=force_nr +serdes_lane_config_channel_mode_375=force_nr +serdes_lane_config_channel_mode_376=force_nr +serdes_lane_config_channel_mode_377=force_nr +serdes_lane_config_channel_mode_378=force_nr +serdes_lane_config_channel_mode_379=force_nr +serdes_lane_config_channel_mode_380=force_nr +serdes_lane_config_channel_mode_381=force_nr +serdes_lane_config_channel_mode_382=force_nr +serdes_lane_config_channel_mode_383=force_nr +serdes_lane_config_channel_mode_384=force_nr +serdes_lane_config_channel_mode_385=force_nr +serdes_lane_config_channel_mode_386=force_nr +serdes_lane_config_channel_mode_387=force_nr +serdes_lane_config_channel_mode_388=force_nr +serdes_lane_config_channel_mode_389=force_nr +serdes_lane_config_channel_mode_390=force_nr +serdes_lane_config_channel_mode_391=force_nr +serdes_lane_config_channel_mode_392=force_nr +serdes_lane_config_channel_mode_393=force_nr +serdes_lane_config_channel_mode_394=force_nr +serdes_lane_config_channel_mode_395=force_nr +serdes_lane_config_channel_mode_396=force_nr +serdes_lane_config_channel_mode_397=force_nr +serdes_lane_config_channel_mode_398=force_nr +serdes_lane_config_channel_mode_399=force_nr +serdes_lane_config_channel_mode_400=force_nr +serdes_lane_config_channel_mode_401=force_nr +serdes_lane_config_channel_mode_402=force_nr +serdes_lane_config_channel_mode_403=force_nr +serdes_lane_config_channel_mode_404=force_nr +serdes_lane_config_channel_mode_405=force_nr +serdes_lane_config_channel_mode_406=force_nr +serdes_lane_config_channel_mode_407=force_nr +serdes_lane_config_channel_mode_408=force_nr +serdes_lane_config_channel_mode_409=force_nr +serdes_lane_config_channel_mode_410=force_nr +serdes_lane_config_channel_mode_411=force_nr +serdes_lane_config_channel_mode_412=force_nr +serdes_lane_config_channel_mode_413=force_nr +serdes_lane_config_channel_mode_414=force_nr +serdes_lane_config_channel_mode_415=force_nr +serdes_lane_config_channel_mode_416=force_nr +serdes_lane_config_channel_mode_417=force_nr +serdes_lane_config_channel_mode_418=force_nr +serdes_lane_config_channel_mode_419=force_nr +serdes_lane_config_channel_mode_420=force_nr +serdes_lane_config_channel_mode_421=force_nr +serdes_lane_config_channel_mode_422=force_nr +serdes_lane_config_channel_mode_423=force_nr +serdes_lane_config_channel_mode_424=force_nr +serdes_lane_config_channel_mode_425=force_nr +serdes_lane_config_channel_mode_426=force_nr +serdes_lane_config_channel_mode_427=force_nr +serdes_lane_config_channel_mode_428=force_nr +serdes_lane_config_channel_mode_429=force_nr +serdes_lane_config_channel_mode_430=force_nr +serdes_lane_config_channel_mode_431=force_nr +serdes_lane_config_channel_mode_432=force_nr +serdes_lane_config_channel_mode_433=force_nr +serdes_lane_config_channel_mode_434=force_nr +serdes_lane_config_channel_mode_435=force_nr +serdes_lane_config_channel_mode_436=force_nr +serdes_lane_config_channel_mode_437=force_nr +serdes_lane_config_channel_mode_438=force_nr +serdes_lane_config_channel_mode_439=force_nr +serdes_lane_config_channel_mode_440=force_nr +serdes_lane_config_channel_mode_441=force_nr +serdes_lane_config_channel_mode_442=force_nr +serdes_lane_config_channel_mode_443=force_nr +serdes_lane_config_channel_mode_444=force_nr +serdes_lane_config_channel_mode_445=force_nr +serdes_lane_config_channel_mode_446=force_nr +serdes_lane_config_channel_mode_447=force_nr + + +rif_id_max=24576 +dpp_db_path=/usr/share/bcm/db +sai_recycle_port_lane_base=96 +appl_param_nof_ports_per_modid=64 +udh_exists=1 +modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 +cmic_dma_abort_in_cold_boot=0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini new file mode 100644 index 000000000000..7eb58931c209 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/pg_profile_lookup.ini @@ -0,0 +1,12 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 100000 80000m 1280 2560 1388544 0 1280 + 400000 80000m 1280 2560 5435392 0 1280 + 100000 120000m 1280 2560 2056192 0 1280 + 400000 120000m 1280 2560 8093696 0 1280 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/port_config.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/port_config.ini new file mode 100644 index 000000000000..96710e7e0fb5 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/port_config.ini @@ -0,0 +1,21 @@ +# name lanes alias index asic_port_name role speed coreid coreportid numvoq +Ethernet0 72,73,74,75 Ethernet0 1 Eth0-ASIC0 Ext 100000 1 1 8 +Ethernet1 80,81,82,83 Ethernet1 2 Eth1-ASIC0 Ext 100000 1 2 8 +Ethernet2 88,89,90,91 Ethernet2 3 Eth2-ASIC0 Ext 100000 1 3 8 +Ethernet3 96,97,98,99 Ethernet3 4 Eth3-ASIC0 Ext 100000 1 4 8 +Ethernet4 104,105,106,107 Ethernet4 5 Eth4-ASIC0 Ext 100000 1 5 8 +Ethernet5 112,113,114,115 Ethernet5 6 Eth5-ASIC0 Ext 100000 1 6 8 +Ethernet6 120,121,122,123 Ethernet6 7 Eth6-ASIC0 Ext 100000 1 7 8 +Ethernet7 128,129,130,131 Ethernet7 8 Eth7-ASIC0 Ext 100000 1 8 8 +Ethernet8 136,137,138,139 Ethernet8 9 Eth8-ASIC0 Ext 100000 1 9 8 +Ethernet9 64,65,66,67 Ethernet9 10 Eth9-ASIC0 Ext 100000 0 10 8 +Ethernet10 56,57,58,59 Ethernet10 11 Eth10-ASIC0 Ext 100000 0 11 8 +Ethernet11 48,49,50,51 Ethernet11 12 Eth11-ASIC0 Ext 100000 0 12 8 +Ethernet12 40,41,42,43 Ethernet12 13 Eth12-ASIC0 Ext 100000 0 13 8 +Ethernet13 32,33,34,35 Ethernet13 14 Eth13-ASIC0 Ext 100000 0 14 8 +Ethernet14 24,25,26,27 Ethernet14 15 Eth14-ASIC0 Ext 100000 0 15 8 +Ethernet15 16,17,18,19 Ethernet15 16 Eth15-ASIC0 Ext 100000 0 16 8 +Ethernet16 8,9,10,11 Ethernet16 17 Eth16-ASIC0 Ext 100000 0 17 8 +Ethernet17 0,1,2,3 Ethernet17 18 Eth17-ASIC0 Ext 100000 0 18 8 +Ethernet-IB0 115 Ethernet-IB0 37 Rcy1-ASIC0 Inb 10000 0 19 8 +Ethernet-Rec0 116 Ethernet-Rec0 39 Rcy2-ASIC0 Rec 10000 1 20 8 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/qos.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai.profile b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai.profile new file mode 100644 index 000000000000..cebcc2d6ee48 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/jr2cp-nokia-18x100g-4x25g-config.bcm diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc new file mode 100644 index 000000000000..26466f89ae44 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc @@ -0,0 +1,36 @@ +phy set 3 reg=0xd134 data=-8 lane=0 +phy set 3 reg=0xd135 data=132 lane=0 +phy set 3 reg=0xd136 data=-8 lane=0 +phy set 3 reg=0xd137 data=0 lane=0 +phy set 3 reg=0xd138 data=0 lane=0 +phy set 3 reg=0xd133 data=0x1802 lane=0 + +phy set 3 reg=0xd134 data=-8 lane=1 +phy set 3 reg=0xd135 data=132 lane=1 +phy set 3 reg=0xd136 data=-12 lane=1 +phy set 3 reg=0xd137 data=0 lane=1 +phy set 3 reg=0xd138 data=0 lane=1 +phy set 3 reg=0xd133 data=0x1800 lane=1 + +phy set 3 reg=0xd134 data=-8 lane=7 +phy set 3 reg=0xd135 data=132 lane=7 +phy set 3 reg=0xd136 data=-8 lane=7 +phy set 3 reg=0xd137 data=0 lane=7 +phy set 3 reg=0xd138 data=0 lane=7 +phy set 3 reg=0xd133 data=0x1804 lane=7 + + +phy set 6 reg=0xd134 data=-8 lane=1 +phy set 6 reg=0xd135 data=132 lane=1 +phy set 6 reg=0xd136 data=-8 lane=1 +phy set 6 reg=0xd137 data=0 lane=1 +phy set 6 reg=0xd138 data=0 lane=1 +phy set 6 reg=0xd133 data=0x1802 lane=1 + + +phy set 8 reg=0xd134 data=-8 lane=1 +phy set 8 reg=0xd135 data=132 lane=1 +phy set 8 reg=0xd136 data=-8 lane=1 +phy set 8 reg=0xd137 data=0 lane=1 +phy set 8 reg=0xd138 data=0 lane=1 +phy set 8 reg=0xd133 data=0x1802 lane=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers.json.j2 new file mode 100644 index 000000000000..f34a844f4a87 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers_defaults_t2.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..9aa3e46bcae6 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/buffers_defaults_t2.j2 @@ -0,0 +1,37 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,36) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "6441610000", + "type": "both", + "mode": "dynamic", + "xoff": "24979046" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"1280", + "xon_offset": "2560", + "dynamic_th":"0" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"33030144" + }, + "egress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/context_config.json b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/context_config.json new file mode 100644 index 000000000000..5caa2e8eef88 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/context_config.json @@ -0,0 +1,21 @@ +{ + "CONTEXTS": [ + { + "guid" : 0, + "name" : "syncd1", + "dbAsic" : "ASIC_DB", + "dbCounters" : "COUNTERS_DB", + "dbFlex": "FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable": false, + "zmq_endpoint": "tcp://127.0.0.1:5555", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5556", + "switches": [ + { + "index" : 1, + "hwinfo" : "07:00.0" + } + ] + } + ] +} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm new file mode 100644 index 000000000000..33af71fd8abf --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -0,0 +1,2057 @@ +appl_enable_intr_init.BCM8885X=1 +appl_enable_learn_and_limit_init.BCM8885X=0 +appl_enable_oam.BCM8885X=0 +appl_enable_oam_fwd_idx_wa_init.BCM8885X=0 +appl_enable_oam_stat_wa_init.BCM8885X=0 +dma_desc_aggregator_buff_size_kb.BCM8885X=100 +dma_desc_aggregator_chain_length_max.BCM8885X=1000 +dma_desc_aggregator_enable_specific_MDB_LPM.BCM8885X=1 +dma_desc_aggregator_timeout_usec.BCM8885X=1000 +dport_map_direct.BCM8885X=1 + +dtm_flow_mapping_mode_region_64.BCM8885X=3 +dtm_flow_mapping_mode_region_65.BCM8885X=3 +dtm_flow_mapping_mode_region_66.BCM8885X=3 +dtm_flow_mapping_mode_region_67.BCM8885X=3 +dtm_flow_mapping_mode_region_68.BCM8885X=3 +dtm_flow_mapping_mode_region_69.BCM8885X=3 +dtm_flow_mapping_mode_region_70.BCM8885X=3 +dtm_flow_mapping_mode_region_71.BCM8885X=3 +dtm_flow_mapping_mode_region_72.BCM8885X=3 +dtm_flow_mapping_mode_region_73.BCM8885X=3 +dtm_flow_mapping_mode_region_74.BCM8885X=3 +dtm_flow_mapping_mode_region_75.BCM8885X=3 +dtm_flow_mapping_mode_region_76.BCM8885X=3 +dtm_flow_mapping_mode_region_77.BCM8885X=3 +dtm_flow_mapping_mode_region_78.BCM8885X=3 +dtm_flow_mapping_mode_region_79.BCM8885X=7 +dtm_flow_mapping_mode_region_80.BCM8885X=3 +dtm_flow_mapping_mode_region_81.BCM8885X=1 +dtm_flow_mapping_mode_region_82.BCM8885X=3 +dtm_flow_mapping_mode_region_83.BCM8885X=3 +dtm_flow_mapping_mode_region_84.BCM8885X=3 +dtm_flow_mapping_mode_region_85.BCM8885X=3 +dtm_flow_mapping_mode_region_86.BCM8885X=3 +dtm_flow_mapping_mode_region_87.BCM8885X=3 +dtm_flow_mapping_mode_region_88.BCM8885X=3 +dtm_flow_mapping_mode_region_89.BCM8885X=3 +dtm_flow_mapping_mode_region_90.BCM8885X=3 +dtm_flow_mapping_mode_region_91.BCM8885X=3 +dtm_flow_mapping_mode_region_92.BCM8885X=3 +dtm_flow_mapping_mode_region_93.BCM8885X=3 +dtm_flow_mapping_mode_region_94.BCM8885X=3 +dtm_flow_nof_remote_cores_region_1.BCM8885X=2 +dtm_flow_nof_remote_cores_region_10.BCM8885X=2 +dtm_flow_nof_remote_cores_region_11.BCM8885X=2 +dtm_flow_nof_remote_cores_region_12.BCM8885X=2 +dtm_flow_nof_remote_cores_region_13.BCM8885X=2 +dtm_flow_nof_remote_cores_region_14.BCM8885X=2 +dtm_flow_nof_remote_cores_region_15.BCM8885X=2 +dtm_flow_nof_remote_cores_region_16.BCM8885X=2 +dtm_flow_nof_remote_cores_region_17.BCM8885X=2 +dtm_flow_nof_remote_cores_region_18.BCM8885X=2 +dtm_flow_nof_remote_cores_region_19.BCM8885X=2 +dtm_flow_nof_remote_cores_region_2.BCM8885X=2 +dtm_flow_nof_remote_cores_region_20.BCM8885X=2 +dtm_flow_nof_remote_cores_region_21.BCM8885X=2 +dtm_flow_nof_remote_cores_region_22.BCM8885X=2 +dtm_flow_nof_remote_cores_region_23.BCM8885X=2 +dtm_flow_nof_remote_cores_region_24.BCM8885X=2 +dtm_flow_nof_remote_cores_region_25.BCM8885X=2 +dtm_flow_nof_remote_cores_region_26.BCM8885X=2 +dtm_flow_nof_remote_cores_region_27.BCM8885X=2 +dtm_flow_nof_remote_cores_region_28.BCM8885X=2 +dtm_flow_nof_remote_cores_region_29.BCM8885X=2 +dtm_flow_nof_remote_cores_region_3.BCM8885X=2 +dtm_flow_nof_remote_cores_region_30.BCM8885X=2 +dtm_flow_nof_remote_cores_region_31.BCM8885X=2 +dtm_flow_nof_remote_cores_region_32.BCM8885X=2 +dtm_flow_nof_remote_cores_region_33.BCM8885X=2 +dtm_flow_nof_remote_cores_region_34.BCM8885X=2 +dtm_flow_nof_remote_cores_region_35.BCM8885X=2 +dtm_flow_nof_remote_cores_region_36.BCM8885X=2 +dtm_flow_nof_remote_cores_region_37.BCM8885X=2 +dtm_flow_nof_remote_cores_region_38.BCM8885X=2 +dtm_flow_nof_remote_cores_region_39.BCM8885X=2 +dtm_flow_nof_remote_cores_region_4.BCM8885X=2 +dtm_flow_nof_remote_cores_region_40.BCM8885X=2 +dtm_flow_nof_remote_cores_region_41.BCM8885X=2 +dtm_flow_nof_remote_cores_region_42.BCM8885X=2 +dtm_flow_nof_remote_cores_region_43.BCM8885X=2 +dtm_flow_nof_remote_cores_region_44.BCM8885X=2 +dtm_flow_nof_remote_cores_region_45.BCM8885X=2 +dtm_flow_nof_remote_cores_region_46.BCM8885X=2 +dtm_flow_nof_remote_cores_region_47.BCM8885X=2 +dtm_flow_nof_remote_cores_region_48.BCM8885X=2 +dtm_flow_nof_remote_cores_region_49.BCM8885X=2 +dtm_flow_nof_remote_cores_region_5.BCM8885X=2 +dtm_flow_nof_remote_cores_region_50.BCM8885X=2 +dtm_flow_nof_remote_cores_region_51.BCM8885X=2 +dtm_flow_nof_remote_cores_region_52.BCM8885X=2 +dtm_flow_nof_remote_cores_region_53.BCM8885X=2 +dtm_flow_nof_remote_cores_region_54.BCM8885X=2 +dtm_flow_nof_remote_cores_region_55.BCM8885X=2 +dtm_flow_nof_remote_cores_region_56.BCM8885X=2 +dtm_flow_nof_remote_cores_region_57.BCM8885X=2 +dtm_flow_nof_remote_cores_region_58.BCM8885X=2 +dtm_flow_nof_remote_cores_region_59.BCM8885X=2 +dtm_flow_nof_remote_cores_region_6.BCM8885X=2 +dtm_flow_nof_remote_cores_region_60.BCM8885X=2 +dtm_flow_nof_remote_cores_region_7.BCM8885X=2 +dtm_flow_nof_remote_cores_region_8.BCM8885X=2 +dtm_flow_nof_remote_cores_region_9.BCM8885X=2 +dtm_flow_nof_remote_cores_region_73.BCM8869X=2 +dtm_flow_mapping_mode_region_73.BCM8869X=0 +dtm_flow_nof_remote_cores_region_74.BCM8869X=2 +dtm_flow_mapping_mode_region_74.BCM8869X=0 +dtm_flow_nof_remote_cores_region_75.BCM8869X=2 +dtm_flow_mapping_mode_region_75.BCM8869X=0 +ext_ram_enabled_bitmap.BCM8885X=3 +ext_ram_freq.BCM8885X=1200 +dram_temperature_threshold_restore_traffic.BCM8885X=89 +dram_temperature_threshold_power_down.BCM8885X=102 +dram_temperature_threshold_stop_traffic.BCM8885X=94 +dram_temperature_monitor_enable.BCM8885X=1 +fabric_connect_mode.BCM8885X=FE +ftmh_stacking_extension_size=0 +j2_ftmh_lb_key_extension_size=3 +j_ftmh_lb_key_extension_size=0 + + +lane_to_serdes_map_fabric_lane0.BCM8885X=rx0:tx0 +lane_to_serdes_map_fabric_lane1.BCM8885X=rx1:tx1 +lane_to_serdes_map_fabric_lane2.BCM8885X=rx2:tx3 +lane_to_serdes_map_fabric_lane3.BCM8885X=rx3:tx2 + +lane_to_serdes_map_fabric_lane4.BCM8885X=rx4:tx4 +lane_to_serdes_map_fabric_lane5.BCM8885X=rx5:tx7 +lane_to_serdes_map_fabric_lane6.BCM8885X=rx6:tx6 +lane_to_serdes_map_fabric_lane7.BCM8885X=rx7:tx5 + +lane_to_serdes_map_fabric_lane8.BCM8885X=rx8:tx8 +lane_to_serdes_map_fabric_lane9.BCM8885X=rx9:tx9 +lane_to_serdes_map_fabric_lane10.BCM8885X=rx10:tx10 +lane_to_serdes_map_fabric_lane11.BCM8885X=rx11:tx11 + +lane_to_serdes_map_fabric_lane12.BCM8885X=rx12:tx12 +lane_to_serdes_map_fabric_lane13.BCM8885X=rx13:tx13 +lane_to_serdes_map_fabric_lane14.BCM8885X=rx14:tx14 +lane_to_serdes_map_fabric_lane15.BCM8885X=rx15:tx15 + +lane_to_serdes_map_fabric_lane16.BCM8885X=rx16:tx16 +lane_to_serdes_map_fabric_lane17.BCM8885X=rx17:tx17 +lane_to_serdes_map_fabric_lane18.BCM8885X=rx18:tx18 +lane_to_serdes_map_fabric_lane19.BCM8885X=rx19:tx19 + +lane_to_serdes_map_fabric_lane20.BCM8885X=rx20:tx20 +lane_to_serdes_map_fabric_lane21.BCM8885X=rx21:tx21 +lane_to_serdes_map_fabric_lane22.BCM8885X=rx22:tx22 +lane_to_serdes_map_fabric_lane23.BCM8885X=rx23:tx23 + +lane_to_serdes_map_fabric_lane24.BCM8885X=rx24:tx26 +lane_to_serdes_map_fabric_lane25.BCM8885X=rx25:tx25 +lane_to_serdes_map_fabric_lane26.BCM8885X=rx26:tx24 +lane_to_serdes_map_fabric_lane27.BCM8885X=rx27:tx27 + +lane_to_serdes_map_fabric_lane28.BCM8885X=rx28:tx28 +lane_to_serdes_map_fabric_lane29.BCM8885X=rx29:tx31 +lane_to_serdes_map_fabric_lane30.BCM8885X=rx30:tx30 +lane_to_serdes_map_fabric_lane31.BCM8885X=rx31:tx29 + +lane_to_serdes_map_fabric_lane32.BCM8885X=rx32:tx32 +lane_to_serdes_map_fabric_lane33.BCM8885X=rx33:tx33 +lane_to_serdes_map_fabric_lane34.BCM8885X=rx34:tx34 +lane_to_serdes_map_fabric_lane35.BCM8885X=rx35:tx35 + +lane_to_serdes_map_fabric_lane36.BCM8885X=rx36:tx36 +lane_to_serdes_map_fabric_lane37.BCM8885X=rx37:tx37 +lane_to_serdes_map_fabric_lane38.BCM8885X=rx38:tx38 +lane_to_serdes_map_fabric_lane39.BCM8885X=rx39:tx39 + +lane_to_serdes_map_fabric_lane40.BCM8885X=rx40:tx43 +lane_to_serdes_map_fabric_lane41.BCM8885X=rx41:tx42 +lane_to_serdes_map_fabric_lane42.BCM8885X=rx42:tx41 +lane_to_serdes_map_fabric_lane43.BCM8885X=rx43:tx40 + +lane_to_serdes_map_fabric_lane44.BCM8885X=rx44:tx47 +lane_to_serdes_map_fabric_lane45.BCM8885X=rx45:tx45 +lane_to_serdes_map_fabric_lane46.BCM8885X=rx46:tx46 +lane_to_serdes_map_fabric_lane47.BCM8885X=rx47:tx44 + +lane_to_serdes_map_fabric_lane48.BCM8885X=rx48:tx48 +lane_to_serdes_map_fabric_lane49.BCM8885X=rx49:tx49 +lane_to_serdes_map_fabric_lane50.BCM8885X=rx50:tx50 +lane_to_serdes_map_fabric_lane51.BCM8885X=rx51:tx51 + +lane_to_serdes_map_fabric_lane52.BCM8885X=rx52:tx52 +lane_to_serdes_map_fabric_lane53.BCM8885X=rx53:tx53 +lane_to_serdes_map_fabric_lane54.BCM8885X=rx54:tx54 +lane_to_serdes_map_fabric_lane55.BCM8885X=rx55:tx55 + +lane_to_serdes_map_fabric_lane56.BCM8885X=rx56:tx59 +lane_to_serdes_map_fabric_lane57.BCM8885X=rx57:tx58 +lane_to_serdes_map_fabric_lane58.BCM8885X=rx58:tx57 +lane_to_serdes_map_fabric_lane59.BCM8885X=rx59:tx56 + +lane_to_serdes_map_fabric_lane60.BCM8885X=rx60:tx63 +lane_to_serdes_map_fabric_lane61.BCM8885X=rx61:tx61 +lane_to_serdes_map_fabric_lane62.BCM8885X=rx62:tx62 +lane_to_serdes_map_fabric_lane63.BCM8885X=rx63:tx60 + +lane_to_serdes_map_fabric_lane64.BCM8885X=rx64:tx64 +lane_to_serdes_map_fabric_lane65.BCM8885X=rx65:tx65 +lane_to_serdes_map_fabric_lane66.BCM8885X=rx66:tx66 +lane_to_serdes_map_fabric_lane67.BCM8885X=rx67:tx67 + +lane_to_serdes_map_fabric_lane68.BCM8885X=rx68:tx68 +lane_to_serdes_map_fabric_lane69.BCM8885X=rx69:tx69 +lane_to_serdes_map_fabric_lane70.BCM8885X=rx70:tx70 +lane_to_serdes_map_fabric_lane71.BCM8885X=rx71:tx71 + +lane_to_serdes_map_fabric_lane72.BCM8885X=rx72:tx75 +lane_to_serdes_map_fabric_lane73.BCM8885X=rx73:tx73 +lane_to_serdes_map_fabric_lane74.BCM8885X=rx74:tx74 +lane_to_serdes_map_fabric_lane75.BCM8885X=rx75:tx72 + +lane_to_serdes_map_fabric_lane76.BCM8885X=rx76:tx79 +lane_to_serdes_map_fabric_lane77.BCM8885X=rx77:tx78 +lane_to_serdes_map_fabric_lane78.BCM8885X=rx78:tx77 +lane_to_serdes_map_fabric_lane79.BCM8885X=rx79:tx76 + +lane_to_serdes_map_fabric_lane80.BCM8885X=rx80:tx80 +lane_to_serdes_map_fabric_lane81.BCM8885X=rx81:tx81 +lane_to_serdes_map_fabric_lane82.BCM8885X=rx82:tx82 +lane_to_serdes_map_fabric_lane83.BCM8885X=rx83:tx83 + +lane_to_serdes_map_fabric_lane84.BCM8885X=rx84:tx84 +lane_to_serdes_map_fabric_lane85.BCM8885X=rx85:tx85 +lane_to_serdes_map_fabric_lane86.BCM8885X=rx86:tx86 +lane_to_serdes_map_fabric_lane87.BCM8885X=rx87:tx87 + +lane_to_serdes_map_fabric_lane88.BCM8885X=rx88:tx88 +lane_to_serdes_map_fabric_lane89.BCM8885X=rx89:tx90 +lane_to_serdes_map_fabric_lane90.BCM8885X=rx90:tx89 +lane_to_serdes_map_fabric_lane91.BCM8885X=rx91:tx91 + +lane_to_serdes_map_fabric_lane92.BCM8885X=rx92:tx94 +lane_to_serdes_map_fabric_lane93.BCM8885X=rx93:tx93 +lane_to_serdes_map_fabric_lane94.BCM8885X=rx94:tx92 +lane_to_serdes_map_fabric_lane95.BCM8885X=rx95:tx95 + +lane_to_serdes_map_fabric_lane96.BCM8885X=rx96:tx96 +lane_to_serdes_map_fabric_lane97.BCM8885X=rx97:tx97 +lane_to_serdes_map_fabric_lane98.BCM8885X=rx98:tx98 +lane_to_serdes_map_fabric_lane99.BCM8885X=rx99:tx99 + +lane_to_serdes_map_fabric_lane100.BCM8885X=rx100:tx100 +lane_to_serdes_map_fabric_lane101.BCM8885X=rx101:tx101 +lane_to_serdes_map_fabric_lane102.BCM8885X=rx102:tx102 +lane_to_serdes_map_fabric_lane103.BCM8885X=rx103:tx103 + +lane_to_serdes_map_fabric_lane104.BCM8885X=rx104:tx104 +lane_to_serdes_map_fabric_lane105.BCM8885X=rx105:tx105 +lane_to_serdes_map_fabric_lane106.BCM8885X=rx106:tx106 +lane_to_serdes_map_fabric_lane107.BCM8885X=rx107:tx107 + +lane_to_serdes_map_fabric_lane108.BCM8885X=rx108:tx108 +lane_to_serdes_map_fabric_lane109.BCM8885X=rx109:tx109 +lane_to_serdes_map_fabric_lane110.BCM8885X=rx110:tx110 +lane_to_serdes_map_fabric_lane111.BCM8885X=rx111:tx111 + +lane_to_serdes_map_fabric_lane112.BCM8885X=rx112:tx114 +lane_to_serdes_map_fabric_lane113.BCM8885X=rx113:tx113 +lane_to_serdes_map_fabric_lane114.BCM8885X=rx114:tx112 +lane_to_serdes_map_fabric_lane115.BCM8885X=rx115:tx115 + +lane_to_serdes_map_fabric_lane116.BCM8885X=rx116:tx116 +lane_to_serdes_map_fabric_lane117.BCM8885X=rx117:tx117 +lane_to_serdes_map_fabric_lane118.BCM8885X=rx118:tx118 +lane_to_serdes_map_fabric_lane119.BCM8885X=rx119:tx119 + +lane_to_serdes_map_fabric_lane120.BCM8885X=rx120:tx120 +lane_to_serdes_map_fabric_lane121.BCM8885X=rx121:tx121 +lane_to_serdes_map_fabric_lane122.BCM8885X=rx122:tx122 +lane_to_serdes_map_fabric_lane123.BCM8885X=rx123:tx123 + +lane_to_serdes_map_fabric_lane124.BCM8885X=rx124:tx124 +lane_to_serdes_map_fabric_lane125.BCM8885X=rx125:tx125 +lane_to_serdes_map_fabric_lane126.BCM8885X=rx126:tx126 +lane_to_serdes_map_fabric_lane127.BCM8885X=rx127:tx127 + +lane_to_serdes_map_fabric_lane128.BCM8885X=rx128:tx128 +lane_to_serdes_map_fabric_lane129.BCM8885X=rx129:tx129 +lane_to_serdes_map_fabric_lane130.BCM8885X=rx130:tx130 +lane_to_serdes_map_fabric_lane131.BCM8885X=rx131:tx131 + +lane_to_serdes_map_fabric_lane132.BCM8885X=rx132:tx132 +lane_to_serdes_map_fabric_lane133.BCM8885X=rx133:tx133 +lane_to_serdes_map_fabric_lane134.BCM8885X=rx134:tx134 +lane_to_serdes_map_fabric_lane135.BCM8885X=rx135:tx135 + +lane_to_serdes_map_fabric_lane136.BCM8885X=rx136:tx139 +lane_to_serdes_map_fabric_lane137.BCM8885X=rx137:tx138 +lane_to_serdes_map_fabric_lane138.BCM8885X=rx138:tx137 +lane_to_serdes_map_fabric_lane139.BCM8885X=rx139:tx136 + +lane_to_serdes_map_fabric_lane140.BCM8885X=rx140:tx143 +lane_to_serdes_map_fabric_lane141.BCM8885X=rx141:tx141 +lane_to_serdes_map_fabric_lane142.BCM8885X=rx142:tx142 +lane_to_serdes_map_fabric_lane143.BCM8885X=rx143:tx140 + +lane_to_serdes_map_fabric_lane144.BCM8885X=rx144:tx144 +lane_to_serdes_map_fabric_lane145.BCM8885X=rx145:tx145 +lane_to_serdes_map_fabric_lane146.BCM8885X=rx146:tx146 +lane_to_serdes_map_fabric_lane147.BCM8885X=rx147:tx147 + +lane_to_serdes_map_fabric_lane148.BCM8885X=rx148:tx148 +lane_to_serdes_map_fabric_lane149.BCM8885X=rx149:tx149 +lane_to_serdes_map_fabric_lane150.BCM8885X=rx150:tx150 +lane_to_serdes_map_fabric_lane151.BCM8885X=rx151:tx151 + +lane_to_serdes_map_fabric_lane152.BCM8885X=rx152:tx155 +lane_to_serdes_map_fabric_lane153.BCM8885X=rx153:tx154 +lane_to_serdes_map_fabric_lane154.BCM8885X=rx154:tx153 +lane_to_serdes_map_fabric_lane155.BCM8885X=rx155:tx152 + +lane_to_serdes_map_fabric_lane156.BCM8885X=rx156:tx159 +lane_to_serdes_map_fabric_lane157.BCM8885X=rx157:tx157 +lane_to_serdes_map_fabric_lane158.BCM8885X=rx158:tx158 +lane_to_serdes_map_fabric_lane159.BCM8885X=rx159:tx156 + +lane_to_serdes_map_fabric_lane160.BCM8885X=rx160:tx160 +lane_to_serdes_map_fabric_lane161.BCM8885X=rx161:tx161 +lane_to_serdes_map_fabric_lane162.BCM8885X=rx162:tx162 +lane_to_serdes_map_fabric_lane163.BCM8885X=rx163:tx163 + +lane_to_serdes_map_fabric_lane164.BCM8885X=rx164:tx164 +lane_to_serdes_map_fabric_lane165.BCM8885X=rx165:tx165 +lane_to_serdes_map_fabric_lane166.BCM8885X=rx166:tx166 +lane_to_serdes_map_fabric_lane167.BCM8885X=rx167:tx167 + +lane_to_serdes_map_fabric_lane168.BCM8885X=rx168:tx171 +lane_to_serdes_map_fabric_lane169.BCM8885X=rx169:tx169 +lane_to_serdes_map_fabric_lane170.BCM8885X=rx170:tx170 +lane_to_serdes_map_fabric_lane171.BCM8885X=rx171:tx168 + +lane_to_serdes_map_fabric_lane172.BCM8885X=rx172:tx175 +lane_to_serdes_map_fabric_lane173.BCM8885X=rx173:tx174 +lane_to_serdes_map_fabric_lane174.BCM8885X=rx174:tx173 +lane_to_serdes_map_fabric_lane175.BCM8885X=rx175:tx172 + +lane_to_serdes_map_fabric_lane176.BCM8885X=rx176:tx176 +lane_to_serdes_map_fabric_lane177.BCM8885X=rx177:tx177 +lane_to_serdes_map_fabric_lane178.BCM8885X=rx178:tx178 +lane_to_serdes_map_fabric_lane179.BCM8885X=rx179:tx179 + +lane_to_serdes_map_fabric_lane180.BCM8885X=rx180:tx180 +lane_to_serdes_map_fabric_lane181.BCM8885X=rx181:tx181 +lane_to_serdes_map_fabric_lane182.BCM8885X=rx182:tx182 +lane_to_serdes_map_fabric_lane183.BCM8885X=rx183:tx183 + +lane_to_serdes_map_fabric_lane184.BCM8885X=rx184:tx184 +lane_to_serdes_map_fabric_lane185.BCM8885X=rx185:tx185 +lane_to_serdes_map_fabric_lane186.BCM8885X=rx186:tx186 +lane_to_serdes_map_fabric_lane187.BCM8885X=rx187:tx187 + +lane_to_serdes_map_fabric_lane188.BCM8885X=rx188:tx190 +lane_to_serdes_map_fabric_lane189.BCM8885X=rx189:tx189 +lane_to_serdes_map_fabric_lane190.BCM8885X=rx190:tx188 +lane_to_serdes_map_fabric_lane191.BCM8885X=rx191:tx191 + + +phy_rx_polarity_flip_fabric0.BCM8885X=0 +phy_rx_polarity_flip_fabric1.BCM8885X=1 +phy_rx_polarity_flip_fabric2.BCM8885X=0 +phy_rx_polarity_flip_fabric3.BCM8885X=0 +phy_rx_polarity_flip_fabric4.BCM8885X=0 +phy_rx_polarity_flip_fabric5.BCM8885X=0 +phy_rx_polarity_flip_fabric6.BCM8885X=0 +phy_rx_polarity_flip_fabric7.BCM8885X=0 +phy_rx_polarity_flip_fabric8.BCM8885X=1 +phy_rx_polarity_flip_fabric9.BCM8885X=1 +phy_rx_polarity_flip_fabric10.BCM8885X=0 +phy_rx_polarity_flip_fabric11.BCM8885X=0 +phy_rx_polarity_flip_fabric12.BCM8885X=1 +phy_rx_polarity_flip_fabric13.BCM8885X=0 +phy_rx_polarity_flip_fabric14.BCM8885X=0 +phy_rx_polarity_flip_fabric15.BCM8885X=1 +phy_rx_polarity_flip_fabric16.BCM8885X=1 +phy_rx_polarity_flip_fabric17.BCM8885X=1 +phy_rx_polarity_flip_fabric18.BCM8885X=0 +phy_rx_polarity_flip_fabric19.BCM8885X=0 +phy_rx_polarity_flip_fabric20.BCM8885X=0 +phy_rx_polarity_flip_fabric21.BCM8885X=0 +phy_rx_polarity_flip_fabric22.BCM8885X=1 +phy_rx_polarity_flip_fabric23.BCM8885X=0 +phy_rx_polarity_flip_fabric24.BCM8885X=1 +phy_rx_polarity_flip_fabric25.BCM8885X=0 +phy_rx_polarity_flip_fabric26.BCM8885X=1 +phy_rx_polarity_flip_fabric27.BCM8885X=1 +phy_rx_polarity_flip_fabric28.BCM8885X=1 +phy_rx_polarity_flip_fabric29.BCM8885X=1 +phy_rx_polarity_flip_fabric30.BCM8885X=0 +phy_rx_polarity_flip_fabric31.BCM8885X=1 +phy_rx_polarity_flip_fabric32.BCM8885X=0 +phy_rx_polarity_flip_fabric33.BCM8885X=1 +phy_rx_polarity_flip_fabric34.BCM8885X=0 +phy_rx_polarity_flip_fabric35.BCM8885X=0 +phy_rx_polarity_flip_fabric36.BCM8885X=0 +phy_rx_polarity_flip_fabric37.BCM8885X=1 +phy_rx_polarity_flip_fabric38.BCM8885X=1 +phy_rx_polarity_flip_fabric39.BCM8885X=0 +phy_rx_polarity_flip_fabric40.BCM8885X=1 +phy_rx_polarity_flip_fabric41.BCM8885X=0 +phy_rx_polarity_flip_fabric42.BCM8885X=0 +phy_rx_polarity_flip_fabric43.BCM8885X=0 +phy_rx_polarity_flip_fabric44.BCM8885X=1 +phy_rx_polarity_flip_fabric45.BCM8885X=0 +phy_rx_polarity_flip_fabric46.BCM8885X=0 +phy_rx_polarity_flip_fabric47.BCM8885X=1 +phy_rx_polarity_flip_fabric48.BCM8885X=1 +phy_rx_polarity_flip_fabric49.BCM8885X=1 +phy_rx_polarity_flip_fabric50.BCM8885X=1 +phy_rx_polarity_flip_fabric51.BCM8885X=1 +phy_rx_polarity_flip_fabric52.BCM8885X=1 +phy_rx_polarity_flip_fabric53.BCM8885X=1 +phy_rx_polarity_flip_fabric54.BCM8885X=1 +phy_rx_polarity_flip_fabric55.BCM8885X=1 +phy_rx_polarity_flip_fabric56.BCM8885X=0 +phy_rx_polarity_flip_fabric57.BCM8885X=0 +phy_rx_polarity_flip_fabric58.BCM8885X=0 +phy_rx_polarity_flip_fabric59.BCM8885X=0 +phy_rx_polarity_flip_fabric60.BCM8885X=0 +phy_rx_polarity_flip_fabric61.BCM8885X=0 +phy_rx_polarity_flip_fabric62.BCM8885X=1 +phy_rx_polarity_flip_fabric63.BCM8885X=0 +phy_rx_polarity_flip_fabric64.BCM8885X=1 +phy_rx_polarity_flip_fabric65.BCM8885X=1 +phy_rx_polarity_flip_fabric66.BCM8885X=0 +phy_rx_polarity_flip_fabric67.BCM8885X=0 +phy_rx_polarity_flip_fabric68.BCM8885X=1 +phy_rx_polarity_flip_fabric69.BCM8885X=1 +phy_rx_polarity_flip_fabric70.BCM8885X=1 +phy_rx_polarity_flip_fabric71.BCM8885X=0 +phy_rx_polarity_flip_fabric72.BCM8885X=0 +phy_rx_polarity_flip_fabric73.BCM8885X=1 +phy_rx_polarity_flip_fabric74.BCM8885X=0 +phy_rx_polarity_flip_fabric75.BCM8885X=1 +phy_rx_polarity_flip_fabric76.BCM8885X=1 +phy_rx_polarity_flip_fabric77.BCM8885X=1 +phy_rx_polarity_flip_fabric78.BCM8885X=1 +phy_rx_polarity_flip_fabric79.BCM8885X=0 +phy_rx_polarity_flip_fabric80.BCM8885X=1 +phy_rx_polarity_flip_fabric81.BCM8885X=0 +phy_rx_polarity_flip_fabric82.BCM8885X=0 +phy_rx_polarity_flip_fabric83.BCM8885X=0 +phy_rx_polarity_flip_fabric84.BCM8885X=1 +phy_rx_polarity_flip_fabric85.BCM8885X=0 +phy_rx_polarity_flip_fabric86.BCM8885X=1 +phy_rx_polarity_flip_fabric87.BCM8885X=0 +phy_rx_polarity_flip_fabric88.BCM8885X=1 +phy_rx_polarity_flip_fabric89.BCM8885X=1 +phy_rx_polarity_flip_fabric90.BCM8885X=1 +phy_rx_polarity_flip_fabric91.BCM8885X=1 +phy_rx_polarity_flip_fabric92.BCM8885X=1 +phy_rx_polarity_flip_fabric93.BCM8885X=1 +phy_rx_polarity_flip_fabric94.BCM8885X=1 +phy_rx_polarity_flip_fabric95.BCM8885X=1 +phy_rx_polarity_flip_fabric96.BCM8885X=0 +phy_rx_polarity_flip_fabric97.BCM8885X=1 +phy_rx_polarity_flip_fabric98.BCM8885X=0 +phy_rx_polarity_flip_fabric99.BCM8885X=0 +phy_rx_polarity_flip_fabric100.BCM8885X=0 +phy_rx_polarity_flip_fabric101.BCM8885X=1 +phy_rx_polarity_flip_fabric102.BCM8885X=1 +phy_rx_polarity_flip_fabric103.BCM8885X=0 +phy_rx_polarity_flip_fabric104.BCM8885X=1 +phy_rx_polarity_flip_fabric105.BCM8885X=0 +phy_rx_polarity_flip_fabric106.BCM8885X=0 +phy_rx_polarity_flip_fabric107.BCM8885X=0 +phy_rx_polarity_flip_fabric108.BCM8885X=1 +phy_rx_polarity_flip_fabric109.BCM8885X=1 +phy_rx_polarity_flip_fabric110.BCM8885X=0 +phy_rx_polarity_flip_fabric111.BCM8885X=1 +phy_rx_polarity_flip_fabric112.BCM8885X=0 +phy_rx_polarity_flip_fabric113.BCM8885X=0 +phy_rx_polarity_flip_fabric114.BCM8885X=1 +phy_rx_polarity_flip_fabric115.BCM8885X=1 +phy_rx_polarity_flip_fabric116.BCM8885X=0 +phy_rx_polarity_flip_fabric117.BCM8885X=1 +phy_rx_polarity_flip_fabric118.BCM8885X=1 +phy_rx_polarity_flip_fabric119.BCM8885X=1 +phy_rx_polarity_flip_fabric120.BCM8885X=1 +phy_rx_polarity_flip_fabric121.BCM8885X=1 +phy_rx_polarity_flip_fabric122.BCM8885X=1 +phy_rx_polarity_flip_fabric123.BCM8885X=0 +phy_rx_polarity_flip_fabric124.BCM8885X=0 +phy_rx_polarity_flip_fabric125.BCM8885X=0 +phy_rx_polarity_flip_fabric126.BCM8885X=0 +phy_rx_polarity_flip_fabric127.BCM8885X=1 +phy_rx_polarity_flip_fabric128.BCM8885X=0 +phy_rx_polarity_flip_fabric129.BCM8885X=0 +phy_rx_polarity_flip_fabric130.BCM8885X=1 +phy_rx_polarity_flip_fabric131.BCM8885X=0 +phy_rx_polarity_flip_fabric132.BCM8885X=0 +phy_rx_polarity_flip_fabric133.BCM8885X=1 +phy_rx_polarity_flip_fabric134.BCM8885X=1 +phy_rx_polarity_flip_fabric135.BCM8885X=0 +phy_rx_polarity_flip_fabric136.BCM8885X=0 +phy_rx_polarity_flip_fabric137.BCM8885X=1 +phy_rx_polarity_flip_fabric138.BCM8885X=1 +phy_rx_polarity_flip_fabric139.BCM8885X=0 +phy_rx_polarity_flip_fabric140.BCM8885X=1 +phy_rx_polarity_flip_fabric141.BCM8885X=0 +phy_rx_polarity_flip_fabric142.BCM8885X=1 +phy_rx_polarity_flip_fabric143.BCM8885X=1 +phy_rx_polarity_flip_fabric144.BCM8885X=1 +phy_rx_polarity_flip_fabric145.BCM8885X=1 +phy_rx_polarity_flip_fabric146.BCM8885X=1 +phy_rx_polarity_flip_fabric147.BCM8885X=0 +phy_rx_polarity_flip_fabric148.BCM8885X=1 +phy_rx_polarity_flip_fabric149.BCM8885X=1 +phy_rx_polarity_flip_fabric150.BCM8885X=0 +phy_rx_polarity_flip_fabric151.BCM8885X=0 +phy_rx_polarity_flip_fabric152.BCM8885X=0 +phy_rx_polarity_flip_fabric153.BCM8885X=0 +phy_rx_polarity_flip_fabric154.BCM8885X=0 +phy_rx_polarity_flip_fabric155.BCM8885X=1 +phy_rx_polarity_flip_fabric156.BCM8885X=0 +phy_rx_polarity_flip_fabric157.BCM8885X=0 +phy_rx_polarity_flip_fabric158.BCM8885X=0 +phy_rx_polarity_flip_fabric159.BCM8885X=1 +phy_rx_polarity_flip_fabric160.BCM8885X=0 +phy_rx_polarity_flip_fabric161.BCM8885X=1 +phy_rx_polarity_flip_fabric162.BCM8885X=1 +phy_rx_polarity_flip_fabric163.BCM8885X=1 +phy_rx_polarity_flip_fabric164.BCM8885X=1 +phy_rx_polarity_flip_fabric165.BCM8885X=0 +phy_rx_polarity_flip_fabric166.BCM8885X=0 +phy_rx_polarity_flip_fabric167.BCM8885X=1 +phy_rx_polarity_flip_fabric168.BCM8885X=0 +phy_rx_polarity_flip_fabric169.BCM8885X=1 +phy_rx_polarity_flip_fabric170.BCM8885X=0 +phy_rx_polarity_flip_fabric171.BCM8885X=0 +phy_rx_polarity_flip_fabric172.BCM8885X=0 +phy_rx_polarity_flip_fabric173.BCM8885X=1 +phy_rx_polarity_flip_fabric174.BCM8885X=1 +phy_rx_polarity_flip_fabric175.BCM8885X=1 +phy_rx_polarity_flip_fabric176.BCM8885X=0 +phy_rx_polarity_flip_fabric177.BCM8885X=1 +phy_rx_polarity_flip_fabric178.BCM8885X=0 +phy_rx_polarity_flip_fabric179.BCM8885X=1 +phy_rx_polarity_flip_fabric180.BCM8885X=1 +phy_rx_polarity_flip_fabric181.BCM8885X=0 +phy_rx_polarity_flip_fabric182.BCM8885X=0 +phy_rx_polarity_flip_fabric183.BCM8885X=0 +phy_rx_polarity_flip_fabric184.BCM8885X=0 +phy_rx_polarity_flip_fabric185.BCM8885X=0 +phy_rx_polarity_flip_fabric186.BCM8885X=1 +phy_rx_polarity_flip_fabric187.BCM8885X=0 +phy_rx_polarity_flip_fabric188.BCM8885X=0 +phy_rx_polarity_flip_fabric189.BCM8885X=0 +phy_rx_polarity_flip_fabric190.BCM8885X=0 +phy_rx_polarity_flip_fabric191.BCM8885X=1 + + +phy_tx_polarity_flip_fabric0.BCM8885X=0 +phy_tx_polarity_flip_fabric1.BCM8885X=0 +phy_tx_polarity_flip_fabric2.BCM8885X=0 +phy_tx_polarity_flip_fabric3.BCM8885X=1 +phy_tx_polarity_flip_fabric4.BCM8885X=1 +phy_tx_polarity_flip_fabric5.BCM8885X=0 +phy_tx_polarity_flip_fabric6.BCM8885X=1 +phy_tx_polarity_flip_fabric7.BCM8885X=1 +phy_tx_polarity_flip_fabric8.BCM8885X=0 +phy_tx_polarity_flip_fabric9.BCM8885X=1 +phy_tx_polarity_flip_fabric10.BCM8885X=1 +phy_tx_polarity_flip_fabric11.BCM8885X=1 +phy_tx_polarity_flip_fabric12.BCM8885X=1 +phy_tx_polarity_flip_fabric13.BCM8885X=0 +phy_tx_polarity_flip_fabric14.BCM8885X=1 +phy_tx_polarity_flip_fabric15.BCM8885X=1 +phy_tx_polarity_flip_fabric16.BCM8885X=1 +phy_tx_polarity_flip_fabric17.BCM8885X=1 +phy_tx_polarity_flip_fabric18.BCM8885X=0 +phy_tx_polarity_flip_fabric19.BCM8885X=0 +phy_tx_polarity_flip_fabric20.BCM8885X=0 +phy_tx_polarity_flip_fabric21.BCM8885X=1 +phy_tx_polarity_flip_fabric22.BCM8885X=1 +phy_tx_polarity_flip_fabric23.BCM8885X=0 +phy_tx_polarity_flip_fabric24.BCM8885X=0 +phy_tx_polarity_flip_fabric25.BCM8885X=1 +phy_tx_polarity_flip_fabric26.BCM8885X=1 +phy_tx_polarity_flip_fabric27.BCM8885X=0 +phy_tx_polarity_flip_fabric28.BCM8885X=1 +phy_tx_polarity_flip_fabric29.BCM8885X=0 +phy_tx_polarity_flip_fabric30.BCM8885X=1 +phy_tx_polarity_flip_fabric31.BCM8885X=0 +phy_tx_polarity_flip_fabric32.BCM8885X=0 +phy_tx_polarity_flip_fabric33.BCM8885X=0 +phy_tx_polarity_flip_fabric34.BCM8885X=0 +phy_tx_polarity_flip_fabric35.BCM8885X=0 +phy_tx_polarity_flip_fabric36.BCM8885X=1 +phy_tx_polarity_flip_fabric37.BCM8885X=1 +phy_tx_polarity_flip_fabric38.BCM8885X=0 +phy_tx_polarity_flip_fabric39.BCM8885X=0 +phy_tx_polarity_flip_fabric40.BCM8885X=1 +phy_tx_polarity_flip_fabric41.BCM8885X=0 +phy_tx_polarity_flip_fabric42.BCM8885X=0 +phy_tx_polarity_flip_fabric43.BCM8885X=1 +phy_tx_polarity_flip_fabric44.BCM8885X=0 +phy_tx_polarity_flip_fabric45.BCM8885X=0 +phy_tx_polarity_flip_fabric46.BCM8885X=1 +phy_tx_polarity_flip_fabric47.BCM8885X=0 +phy_tx_polarity_flip_fabric48.BCM8885X=1 +phy_tx_polarity_flip_fabric49.BCM8885X=1 +phy_tx_polarity_flip_fabric50.BCM8885X=0 +phy_tx_polarity_flip_fabric51.BCM8885X=0 +phy_tx_polarity_flip_fabric52.BCM8885X=1 +phy_tx_polarity_flip_fabric53.BCM8885X=0 +phy_tx_polarity_flip_fabric54.BCM8885X=0 +phy_tx_polarity_flip_fabric55.BCM8885X=1 +phy_tx_polarity_flip_fabric56.BCM8885X=0 +phy_tx_polarity_flip_fabric57.BCM8885X=0 +phy_tx_polarity_flip_fabric58.BCM8885X=1 +phy_tx_polarity_flip_fabric59.BCM8885X=0 +phy_tx_polarity_flip_fabric60.BCM8885X=1 +phy_tx_polarity_flip_fabric61.BCM8885X=1 +phy_tx_polarity_flip_fabric62.BCM8885X=1 +phy_tx_polarity_flip_fabric63.BCM8885X=1 +phy_tx_polarity_flip_fabric64.BCM8885X=1 +phy_tx_polarity_flip_fabric65.BCM8885X=0 +phy_tx_polarity_flip_fabric66.BCM8885X=1 +phy_tx_polarity_flip_fabric67.BCM8885X=0 +phy_tx_polarity_flip_fabric68.BCM8885X=0 +phy_tx_polarity_flip_fabric69.BCM8885X=0 +phy_tx_polarity_flip_fabric70.BCM8885X=0 +phy_tx_polarity_flip_fabric71.BCM8885X=1 +phy_tx_polarity_flip_fabric72.BCM8885X=0 +phy_tx_polarity_flip_fabric73.BCM8885X=1 +phy_tx_polarity_flip_fabric74.BCM8885X=0 +phy_tx_polarity_flip_fabric75.BCM8885X=1 +phy_tx_polarity_flip_fabric76.BCM8885X=0 +phy_tx_polarity_flip_fabric77.BCM8885X=0 +phy_tx_polarity_flip_fabric78.BCM8885X=0 +phy_tx_polarity_flip_fabric79.BCM8885X=1 +phy_tx_polarity_flip_fabric80.BCM8885X=1 +phy_tx_polarity_flip_fabric81.BCM8885X=0 +phy_tx_polarity_flip_fabric82.BCM8885X=0 +phy_tx_polarity_flip_fabric83.BCM8885X=0 +phy_tx_polarity_flip_fabric84.BCM8885X=1 +phy_tx_polarity_flip_fabric85.BCM8885X=0 +phy_tx_polarity_flip_fabric86.BCM8885X=1 +phy_tx_polarity_flip_fabric87.BCM8885X=0 +phy_tx_polarity_flip_fabric88.BCM8885X=1 +phy_tx_polarity_flip_fabric89.BCM8885X=1 +phy_tx_polarity_flip_fabric90.BCM8885X=1 +phy_tx_polarity_flip_fabric91.BCM8885X=1 +phy_tx_polarity_flip_fabric92.BCM8885X=1 +phy_tx_polarity_flip_fabric93.BCM8885X=1 +phy_tx_polarity_flip_fabric94.BCM8885X=0 +phy_tx_polarity_flip_fabric95.BCM8885X=0 +phy_tx_polarity_flip_fabric96.BCM8885X=1 +phy_tx_polarity_flip_fabric97.BCM8885X=1 +phy_tx_polarity_flip_fabric98.BCM8885X=1 +phy_tx_polarity_flip_fabric99.BCM8885X=0 +phy_tx_polarity_flip_fabric100.BCM8885X=0 +phy_tx_polarity_flip_fabric101.BCM8885X=0 +phy_tx_polarity_flip_fabric102.BCM8885X=1 +phy_tx_polarity_flip_fabric103.BCM8885X=1 +phy_tx_polarity_flip_fabric104.BCM8885X=1 +phy_tx_polarity_flip_fabric105.BCM8885X=0 +phy_tx_polarity_flip_fabric106.BCM8885X=1 +phy_tx_polarity_flip_fabric107.BCM8885X=0 +phy_tx_polarity_flip_fabric108.BCM8885X=0 +phy_tx_polarity_flip_fabric109.BCM8885X=1 +phy_tx_polarity_flip_fabric110.BCM8885X=0 +phy_tx_polarity_flip_fabric111.BCM8885X=0 +phy_tx_polarity_flip_fabric112.BCM8885X=1 +phy_tx_polarity_flip_fabric113.BCM8885X=0 +phy_tx_polarity_flip_fabric114.BCM8885X=0 +phy_tx_polarity_flip_fabric115.BCM8885X=1 +phy_tx_polarity_flip_fabric116.BCM8885X=1 +phy_tx_polarity_flip_fabric117.BCM8885X=1 +phy_tx_polarity_flip_fabric118.BCM8885X=0 +phy_tx_polarity_flip_fabric119.BCM8885X=0 +phy_tx_polarity_flip_fabric120.BCM8885X=0 +phy_tx_polarity_flip_fabric121.BCM8885X=0 +phy_tx_polarity_flip_fabric122.BCM8885X=1 +phy_tx_polarity_flip_fabric123.BCM8885X=1 +phy_tx_polarity_flip_fabric124.BCM8885X=0 +phy_tx_polarity_flip_fabric125.BCM8885X=0 +phy_tx_polarity_flip_fabric126.BCM8885X=0 +phy_tx_polarity_flip_fabric127.BCM8885X=1 +phy_tx_polarity_flip_fabric128.BCM8885X=0 +phy_tx_polarity_flip_fabric129.BCM8885X=0 +phy_tx_polarity_flip_fabric130.BCM8885X=0 +phy_tx_polarity_flip_fabric131.BCM8885X=1 +phy_tx_polarity_flip_fabric132.BCM8885X=0 +phy_tx_polarity_flip_fabric133.BCM8885X=0 +phy_tx_polarity_flip_fabric134.BCM8885X=1 +phy_tx_polarity_flip_fabric135.BCM8885X=1 +phy_tx_polarity_flip_fabric136.BCM8885X=1 +phy_tx_polarity_flip_fabric137.BCM8885X=1 +phy_tx_polarity_flip_fabric138.BCM8885X=1 +phy_tx_polarity_flip_fabric139.BCM8885X=1 +phy_tx_polarity_flip_fabric140.BCM8885X=0 +phy_tx_polarity_flip_fabric141.BCM8885X=0 +phy_tx_polarity_flip_fabric142.BCM8885X=0 +phy_tx_polarity_flip_fabric143.BCM8885X=0 +phy_tx_polarity_flip_fabric144.BCM8885X=1 +phy_tx_polarity_flip_fabric145.BCM8885X=1 +phy_tx_polarity_flip_fabric146.BCM8885X=1 +phy_tx_polarity_flip_fabric147.BCM8885X=1 +phy_tx_polarity_flip_fabric148.BCM8885X=1 +phy_tx_polarity_flip_fabric149.BCM8885X=1 +phy_tx_polarity_flip_fabric150.BCM8885X=1 +phy_tx_polarity_flip_fabric151.BCM8885X=1 +phy_tx_polarity_flip_fabric152.BCM8885X=1 +phy_tx_polarity_flip_fabric153.BCM8885X=1 +phy_tx_polarity_flip_fabric154.BCM8885X=1 +phy_tx_polarity_flip_fabric155.BCM8885X=0 +phy_tx_polarity_flip_fabric156.BCM8885X=1 +phy_tx_polarity_flip_fabric157.BCM8885X=0 +phy_tx_polarity_flip_fabric158.BCM8885X=0 +phy_tx_polarity_flip_fabric159.BCM8885X=0 +phy_tx_polarity_flip_fabric160.BCM8885X=0 +phy_tx_polarity_flip_fabric161.BCM8885X=1 +phy_tx_polarity_flip_fabric162.BCM8885X=0 +phy_tx_polarity_flip_fabric163.BCM8885X=1 +phy_tx_polarity_flip_fabric164.BCM8885X=1 +phy_tx_polarity_flip_fabric165.BCM8885X=1 +phy_tx_polarity_flip_fabric166.BCM8885X=0 +phy_tx_polarity_flip_fabric167.BCM8885X=0 +phy_tx_polarity_flip_fabric168.BCM8885X=0 +phy_tx_polarity_flip_fabric169.BCM8885X=0 +phy_tx_polarity_flip_fabric170.BCM8885X=1 +phy_tx_polarity_flip_fabric171.BCM8885X=0 +phy_tx_polarity_flip_fabric172.BCM8885X=0 +phy_tx_polarity_flip_fabric173.BCM8885X=0 +phy_tx_polarity_flip_fabric174.BCM8885X=0 +phy_tx_polarity_flip_fabric175.BCM8885X=1 +phy_tx_polarity_flip_fabric176.BCM8885X=0 +phy_tx_polarity_flip_fabric177.BCM8885X=0 +phy_tx_polarity_flip_fabric178.BCM8885X=0 +phy_tx_polarity_flip_fabric179.BCM8885X=1 +phy_tx_polarity_flip_fabric180.BCM8885X=1 +phy_tx_polarity_flip_fabric181.BCM8885X=0 +phy_tx_polarity_flip_fabric182.BCM8885X=0 +phy_tx_polarity_flip_fabric183.BCM8885X=0 +phy_tx_polarity_flip_fabric184.BCM8885X=0 +phy_tx_polarity_flip_fabric185.BCM8885X=1 +phy_tx_polarity_flip_fabric186.BCM8885X=1 +phy_tx_polarity_flip_fabric187.BCM8885X=0 +phy_tx_polarity_flip_fabric188.BCM8885X=1 +phy_tx_polarity_flip_fabric189.BCM8885X=0 +phy_tx_polarity_flip_fabric190.BCM8885X=0 +phy_tx_polarity_flip_fabric191.BCM8885X=1 + + +lane_to_serdes_map_nif_lane0.BCM8885X=rx0:tx0 +lane_to_serdes_map_nif_lane1.BCM8885X=rx1:tx1 +lane_to_serdes_map_nif_lane2.BCM8885X=rx2:tx2 +lane_to_serdes_map_nif_lane3.BCM8885X=rx3:tx3 +lane_to_serdes_map_nif_lane4.BCM8885X=rx4:tx4 +lane_to_serdes_map_nif_lane5.BCM8885X=rx5:tx5 +lane_to_serdes_map_nif_lane6.BCM8885X=rx6:tx6 +lane_to_serdes_map_nif_lane7.BCM8885X=rx7:tx7 + +lane_to_serdes_map_nif_lane8.BCM8885X=rx8:tx8 +lane_to_serdes_map_nif_lane9.BCM8885X=rx9:tx9 +lane_to_serdes_map_nif_lane10.BCM8885X=rx10:tx10 +lane_to_serdes_map_nif_lane11.BCM8885X=rx11:tx11 +lane_to_serdes_map_nif_lane12.BCM8885X=rx12:tx12 +lane_to_serdes_map_nif_lane13.BCM8885X=rx13:tx13 +lane_to_serdes_map_nif_lane14.BCM8885X=rx14:tx14 +lane_to_serdes_map_nif_lane15.BCM8885X=rx15:tx15 + +lane_to_serdes_map_nif_lane16.BCM8885X=rx16:tx16 +lane_to_serdes_map_nif_lane17.BCM8885X=rx17:tx17 +lane_to_serdes_map_nif_lane18.BCM8885X=rx18:tx18 +lane_to_serdes_map_nif_lane19.BCM8885X=rx19:tx19 +lane_to_serdes_map_nif_lane20.BCM8885X=rx20:tx20 +lane_to_serdes_map_nif_lane21.BCM8885X=rx21:tx21 +lane_to_serdes_map_nif_lane22.BCM8885X=rx22:tx22 +lane_to_serdes_map_nif_lane23.BCM8885X=rx23:tx23 + +lane_to_serdes_map_nif_lane24.BCM8885X=rx24:tx24 +lane_to_serdes_map_nif_lane25.BCM8885X=rx25:tx25 +lane_to_serdes_map_nif_lane26.BCM8885X=rx26:tx26 +lane_to_serdes_map_nif_lane27.BCM8885X=rx27:tx27 +lane_to_serdes_map_nif_lane28.BCM8885X=rx28:tx28 +lane_to_serdes_map_nif_lane29.BCM8885X=rx29:tx29 +lane_to_serdes_map_nif_lane30.BCM8885X=rx30:tx30 +lane_to_serdes_map_nif_lane31.BCM8885X=rx31:tx31 + +lane_to_serdes_map_nif_lane32.BCM8885X=rx32:tx32 +lane_to_serdes_map_nif_lane33.BCM8885X=rx33:tx33 +lane_to_serdes_map_nif_lane34.BCM8885X=rx34:tx34 +lane_to_serdes_map_nif_lane35.BCM8885X=rx35:tx35 +lane_to_serdes_map_nif_lane36.BCM8885X=rx36:tx36 +lane_to_serdes_map_nif_lane37.BCM8885X=rx37:tx37 +lane_to_serdes_map_nif_lane38.BCM8885X=rx38:tx38 +lane_to_serdes_map_nif_lane39.BCM8885X=rx39:tx39 + +lane_to_serdes_map_nif_lane40.BCM8885X=rx40:tx40 +lane_to_serdes_map_nif_lane41.BCM8885X=rx41:tx41 +lane_to_serdes_map_nif_lane42.BCM8885X=rx42:tx42 +lane_to_serdes_map_nif_lane43.BCM8885X=rx43:tx43 +lane_to_serdes_map_nif_lane44.BCM8885X=rx44:tx44 +lane_to_serdes_map_nif_lane45.BCM8885X=rx45:tx45 +lane_to_serdes_map_nif_lane46.BCM8885X=rx46:tx46 +lane_to_serdes_map_nif_lane47.BCM8885X=rx47:tx47 + +lane_to_serdes_map_nif_lane48.BCM8885X=rx48:tx48 +lane_to_serdes_map_nif_lane49.BCM8885X=rx49:tx49 +lane_to_serdes_map_nif_lane50.BCM8885X=rx50:tx50 +lane_to_serdes_map_nif_lane51.BCM8885X=rx51:tx51 +lane_to_serdes_map_nif_lane52.BCM8885X=rx52:tx52 +lane_to_serdes_map_nif_lane53.BCM8885X=rx53:tx53 +lane_to_serdes_map_nif_lane54.BCM8885X=rx54:tx54 +lane_to_serdes_map_nif_lane55.BCM8885X=rx55:tx55 + +lane_to_serdes_map_nif_lane56.BCM8885X=rx56:tx56 +lane_to_serdes_map_nif_lane57.BCM8885X=rx57:tx57 +lane_to_serdes_map_nif_lane58.BCM8885X=rx58:tx58 +lane_to_serdes_map_nif_lane59.BCM8885X=rx59:tx59 +lane_to_serdes_map_nif_lane60.BCM8885X=rx60:tx60 +lane_to_serdes_map_nif_lane61.BCM8885X=rx61:tx61 +lane_to_serdes_map_nif_lane62.BCM8885X=rx62:tx62 +lane_to_serdes_map_nif_lane63.BCM8885X=rx63:tx63 + +lane_to_serdes_map_nif_lane64.BCM8885X=rx64:tx64 +lane_to_serdes_map_nif_lane65.BCM8885X=rx65:tx65 +lane_to_serdes_map_nif_lane66.BCM8885X=rx66:tx66 +lane_to_serdes_map_nif_lane67.BCM8885X=rx67:tx67 +lane_to_serdes_map_nif_lane68.BCM8885X=rx68:tx68 +lane_to_serdes_map_nif_lane69.BCM8885X=rx69:tx69 +lane_to_serdes_map_nif_lane70.BCM8885X=rx70:tx70 +lane_to_serdes_map_nif_lane71.BCM8885X=rx71:tx71 + +lane_to_serdes_map_nif_lane72.BCM8885X=rx72:tx72 +lane_to_serdes_map_nif_lane73.BCM8885X=rx73:tx73 +lane_to_serdes_map_nif_lane74.BCM8885X=rx74:tx74 +lane_to_serdes_map_nif_lane75.BCM8885X=rx75:tx75 +lane_to_serdes_map_nif_lane76.BCM8885X=rx76:tx76 +lane_to_serdes_map_nif_lane77.BCM8885X=rx77:tx77 +lane_to_serdes_map_nif_lane78.BCM8885X=rx78:tx78 +lane_to_serdes_map_nif_lane79.BCM8885X=rx79:tx79 + +lane_to_serdes_map_nif_lane80.BCM8885X=rx80:tx80 +lane_to_serdes_map_nif_lane81.BCM8885X=rx81:tx81 +lane_to_serdes_map_nif_lane82.BCM8885X=rx82:tx82 +lane_to_serdes_map_nif_lane83.BCM8885X=rx83:tx83 +lane_to_serdes_map_nif_lane84.BCM8885X=rx84:tx84 +lane_to_serdes_map_nif_lane85.BCM8885X=rx85:tx85 +lane_to_serdes_map_nif_lane86.BCM8885X=rx86:tx86 +lane_to_serdes_map_nif_lane87.BCM8885X=rx87:tx87 + +lane_to_serdes_map_nif_lane88.BCM8885X=rx88:tx88 +lane_to_serdes_map_nif_lane89.BCM8885X=rx89:tx89 +lane_to_serdes_map_nif_lane90.BCM8885X=rx90:tx90 +lane_to_serdes_map_nif_lane91.BCM8885X=rx91:tx91 +lane_to_serdes_map_nif_lane92.BCM8885X=rx92:tx92 +lane_to_serdes_map_nif_lane93.BCM8885X=rx93:tx93 +lane_to_serdes_map_nif_lane94.BCM8885X=rx94:tx94 +lane_to_serdes_map_nif_lane95.BCM8885X=rx95:tx95 + +lane_to_serdes_map_nif_lane96.BCM8885X=rx96:tx96 +lane_to_serdes_map_nif_lane97.BCM8885X=rx97:tx97 +lane_to_serdes_map_nif_lane98.BCM8885X=rx98:tx98 +lane_to_serdes_map_nif_lane99.BCM8885X=rx99:tx99 +lane_to_serdes_map_nif_lane100.BCM8885X=rx100:tx100 +lane_to_serdes_map_nif_lane101.BCM8885X=rx101:tx101 +lane_to_serdes_map_nif_lane102.BCM8885X=rx102:tx102 +lane_to_serdes_map_nif_lane103.BCM8885X=rx103:tx103 + +lane_to_serdes_map_nif_lane104.BCM8885X=rx104:tx104 +lane_to_serdes_map_nif_lane105.BCM8885X=rx105:tx105 +lane_to_serdes_map_nif_lane106.BCM8885X=rx106:tx106 +lane_to_serdes_map_nif_lane107.BCM8885X=rx107:tx107 +lane_to_serdes_map_nif_lane108.BCM8885X=rx108:tx108 +lane_to_serdes_map_nif_lane109.BCM8885X=rx109:tx109 +lane_to_serdes_map_nif_lane110.BCM8885X=rx110:tx110 +lane_to_serdes_map_nif_lane111.BCM8885X=rx111:tx111 + +lane_to_serdes_map_nif_lane112.BCM8885X=rx112:tx112 +lane_to_serdes_map_nif_lane113.BCM8885X=rx113:tx113 +lane_to_serdes_map_nif_lane114.BCM8885X=rx114:tx114 +lane_to_serdes_map_nif_lane115.BCM8885X=rx115:tx115 +lane_to_serdes_map_nif_lane116.BCM8885X=rx116:tx116 +lane_to_serdes_map_nif_lane117.BCM8885X=rx117:tx117 +lane_to_serdes_map_nif_lane118.BCM8885X=rx118:tx118 +lane_to_serdes_map_nif_lane119.BCM8885X=rx119:tx119 + +lane_to_serdes_map_nif_lane120.BCM8885X=rx120:tx120 +lane_to_serdes_map_nif_lane121.BCM8885X=rx121:tx121 +lane_to_serdes_map_nif_lane122.BCM8885X=rx122:tx122 +lane_to_serdes_map_nif_lane123.BCM8885X=rx123:tx123 +lane_to_serdes_map_nif_lane124.BCM8885X=rx124:tx124 +lane_to_serdes_map_nif_lane125.BCM8885X=rx125:tx125 +lane_to_serdes_map_nif_lane126.BCM8885X=rx126:tx126 +lane_to_serdes_map_nif_lane127.BCM8885X=rx127:tx127 + +lane_to_serdes_map_nif_lane128.BCM8885X=rx128:tx128 +lane_to_serdes_map_nif_lane129.BCM8885X=rx129:tx129 +lane_to_serdes_map_nif_lane130.BCM8885X=rx130:tx130 +lane_to_serdes_map_nif_lane131.BCM8885X=rx131:tx131 +lane_to_serdes_map_nif_lane132.BCM8885X=rx132:tx132 +lane_to_serdes_map_nif_lane133.BCM8885X=rx133:tx133 +lane_to_serdes_map_nif_lane134.BCM8885X=rx134:tx134 +lane_to_serdes_map_nif_lane135.BCM8885X=rx135:tx135 + +lane_to_serdes_map_nif_lane136.BCM8885X=rx136:tx136 +lane_to_serdes_map_nif_lane137.BCM8885X=rx137:tx137 +lane_to_serdes_map_nif_lane138.BCM8885X=rx138:tx138 +lane_to_serdes_map_nif_lane139.BCM8885X=rx139:tx139 +lane_to_serdes_map_nif_lane140.BCM8885X=rx140:tx140 +lane_to_serdes_map_nif_lane141.BCM8885X=rx141:tx141 +lane_to_serdes_map_nif_lane142.BCM8885X=rx142:tx142 +lane_to_serdes_map_nif_lane143.BCM8885X=rx143:tx143 + + +mdb_profile=Balanced-Exem +mdb_profile_kaps_cfg.BCM8885X=2 +mdio_output_delay=16 +mem_cache_enable_ecc.BCM8885X=1 +mem_cache_enable_parity.BCM8885X=1 +miim_intr_enable.BCM8885X=0 +os=unix +outlif_logical_to_physical_phase_map_1=S1 +outlif_logical_to_physical_phase_map_2=L1 +outlif_logical_to_physical_phase_map_3=XL +outlif_logical_to_physical_phase_map_4=L2 +outlif_logical_to_physical_phase_map_5=M1 +outlif_logical_to_physical_phase_map_6=M2 +outlif_logical_to_physical_phase_map_7=M3 +outlif_logical_to_physical_phase_map_8=S2 +outlif_physical_phase_data_granularity_L1=60 +outlif_physical_phase_data_granularity_L2=60 +outlif_physical_phase_data_granularity_M1=60 +outlif_physical_phase_data_granularity_M2=60 +outlif_physical_phase_data_granularity_M3=60 +outlif_physical_phase_data_granularity_S1=60 +outlif_physical_phase_data_granularity_S2=60 +outlif_physical_phase_data_granularity_XL=60 +pdma_continuous_mode_enable.BCM8885X=1 + + +phy_rx_polarity_flip_phy0.BCM8885X=0 +phy_rx_polarity_flip_phy1.BCM8885X=0 +phy_rx_polarity_flip_phy2.BCM8885X=1 +phy_rx_polarity_flip_phy3.BCM8885X=0 +phy_rx_polarity_flip_phy4.BCM8885X=0 +phy_rx_polarity_flip_phy5.BCM8885X=0 +phy_rx_polarity_flip_phy6.BCM8885X=1 +phy_rx_polarity_flip_phy7.BCM8885X=0 + +phy_rx_polarity_flip_phy8.BCM8885X=0 +phy_rx_polarity_flip_phy9.BCM8885X=1 +phy_rx_polarity_flip_phy10.BCM8885X=1 +phy_rx_polarity_flip_phy11.BCM8885X=1 +phy_rx_polarity_flip_phy12.BCM8885X=1 +phy_rx_polarity_flip_phy13.BCM8885X=0 +phy_rx_polarity_flip_phy14.BCM8885X=0 +phy_rx_polarity_flip_phy15.BCM8885X=1 + +phy_rx_polarity_flip_phy16.BCM8885X=1 +phy_rx_polarity_flip_phy17.BCM8885X=0 +phy_rx_polarity_flip_phy18.BCM8885X=1 +phy_rx_polarity_flip_phy19.BCM8885X=0 +phy_rx_polarity_flip_phy20.BCM8885X=1 +phy_rx_polarity_flip_phy21.BCM8885X=1 +phy_rx_polarity_flip_phy22.BCM8885X=1 +phy_rx_polarity_flip_phy23.BCM8885X=1 + +phy_rx_polarity_flip_phy24.BCM8885X=0 +phy_rx_polarity_flip_phy25.BCM8885X=1 +phy_rx_polarity_flip_phy26.BCM8885X=0 +phy_rx_polarity_flip_phy27.BCM8885X=1 +phy_rx_polarity_flip_phy28.BCM8885X=1 +phy_rx_polarity_flip_phy29.BCM8885X=1 +phy_rx_polarity_flip_phy30.BCM8885X=0 +phy_rx_polarity_flip_phy31.BCM8885X=1 + +phy_rx_polarity_flip_phy32.BCM8885X=1 +phy_rx_polarity_flip_phy33.BCM8885X=0 +phy_rx_polarity_flip_phy34.BCM8885X=1 +phy_rx_polarity_flip_phy35.BCM8885X=0 +phy_rx_polarity_flip_phy36.BCM8885X=0 +phy_rx_polarity_flip_phy37.BCM8885X=0 +phy_rx_polarity_flip_phy38.BCM8885X=0 +phy_rx_polarity_flip_phy39.BCM8885X=1 + +phy_rx_polarity_flip_phy40.BCM8885X=1 +phy_rx_polarity_flip_phy41.BCM8885X=1 +phy_rx_polarity_flip_phy42.BCM8885X=0 +phy_rx_polarity_flip_phy43.BCM8885X=1 +phy_rx_polarity_flip_phy44.BCM8885X=1 +phy_rx_polarity_flip_phy45.BCM8885X=0 +phy_rx_polarity_flip_phy46.BCM8885X=0 +phy_rx_polarity_flip_phy47.BCM8885X=1 + +phy_rx_polarity_flip_phy48.BCM8885X=0 +phy_rx_polarity_flip_phy49.BCM8885X=1 +phy_rx_polarity_flip_phy50.BCM8885X=0 +phy_rx_polarity_flip_phy51.BCM8885X=0 +phy_rx_polarity_flip_phy52.BCM8885X=0 +phy_rx_polarity_flip_phy53.BCM8885X=1 +phy_rx_polarity_flip_phy54.BCM8885X=0 +phy_rx_polarity_flip_phy55.BCM8885X=0 + +phy_rx_polarity_flip_phy56.BCM8885X=0 +phy_rx_polarity_flip_phy57.BCM8885X=0 +phy_rx_polarity_flip_phy58.BCM8885X=0 +phy_rx_polarity_flip_phy59.BCM8885X=0 +phy_rx_polarity_flip_phy60.BCM8885X=0 +phy_rx_polarity_flip_phy61.BCM8885X=0 +phy_rx_polarity_flip_phy62.BCM8885X=1 +phy_rx_polarity_flip_phy63.BCM8885X=1 + +phy_rx_polarity_flip_phy64.BCM8885X=0 +phy_rx_polarity_flip_phy65.BCM8885X=0 +phy_rx_polarity_flip_phy66.BCM8885X=0 +phy_rx_polarity_flip_phy67.BCM8885X=0 +phy_rx_polarity_flip_phy68.BCM8885X=0 +phy_rx_polarity_flip_phy69.BCM8885X=0 +phy_rx_polarity_flip_phy70.BCM8885X=0 +phy_rx_polarity_flip_phy71.BCM8885X=0 + +phy_rx_polarity_flip_phy72.BCM8885X=1 +phy_rx_polarity_flip_phy73.BCM8885X=0 +phy_rx_polarity_flip_phy74.BCM8885X=0 +phy_rx_polarity_flip_phy75.BCM8885X=1 +phy_rx_polarity_flip_phy76.BCM8885X=1 +phy_rx_polarity_flip_phy77.BCM8885X=1 +phy_rx_polarity_flip_phy78.BCM8885X=0 +phy_rx_polarity_flip_phy79.BCM8885X=1 + +phy_rx_polarity_flip_phy80.BCM8885X=1 +phy_rx_polarity_flip_phy81.BCM8885X=0 +phy_rx_polarity_flip_phy82.BCM8885X=1 +phy_rx_polarity_flip_phy83.BCM8885X=1 +phy_rx_polarity_flip_phy84.BCM8885X=0 +phy_rx_polarity_flip_phy85.BCM8885X=0 +phy_rx_polarity_flip_phy86.BCM8885X=1 +phy_rx_polarity_flip_phy87.BCM8885X=1 + +phy_rx_polarity_flip_phy88.BCM8885X=0 +phy_rx_polarity_flip_phy89.BCM8885X=1 +phy_rx_polarity_flip_phy90.BCM8885X=0 +phy_rx_polarity_flip_phy91.BCM8885X=0 +phy_rx_polarity_flip_phy92.BCM8885X=0 +phy_rx_polarity_flip_phy93.BCM8885X=0 +phy_rx_polarity_flip_phy94.BCM8885X=0 +phy_rx_polarity_flip_phy95.BCM8885X=1 + +phy_rx_polarity_flip_phy96.BCM8885X=0 +phy_rx_polarity_flip_phy97.BCM8885X=0 +phy_rx_polarity_flip_phy98.BCM8885X=0 +phy_rx_polarity_flip_phy99.BCM8885X=0 +phy_rx_polarity_flip_phy100.BCM8885X=0 +phy_rx_polarity_flip_phy101.BCM8885X=1 +phy_rx_polarity_flip_phy102.BCM8885X=1 +phy_rx_polarity_flip_phy103.BCM8885X=0 + +phy_rx_polarity_flip_phy104.BCM8885X=1 +phy_rx_polarity_flip_phy105.BCM8885X=1 +phy_rx_polarity_flip_phy106.BCM8885X=1 +phy_rx_polarity_flip_phy107.BCM8885X=1 +phy_rx_polarity_flip_phy108.BCM8885X=0 +phy_rx_polarity_flip_phy109.BCM8885X=1 +phy_rx_polarity_flip_phy110.BCM8885X=1 +phy_rx_polarity_flip_phy111.BCM8885X=1 + +phy_rx_polarity_flip_phy112.BCM8885X=0 +phy_rx_polarity_flip_phy113.BCM8885X=1 +phy_rx_polarity_flip_phy114.BCM8885X=1 +phy_rx_polarity_flip_phy115.BCM8885X=1 +phy_rx_polarity_flip_phy116.BCM8885X=1 +phy_rx_polarity_flip_phy117.BCM8885X=1 +phy_rx_polarity_flip_phy118.BCM8885X=0 +phy_rx_polarity_flip_phy119.BCM8885X=0 + +phy_rx_polarity_flip_phy120.BCM8885X=1 +phy_rx_polarity_flip_phy121.BCM8885X=0 +phy_rx_polarity_flip_phy122.BCM8885X=0 +phy_rx_polarity_flip_phy123.BCM8885X=1 +phy_rx_polarity_flip_phy124.BCM8885X=0 +phy_rx_polarity_flip_phy125.BCM8885X=1 +phy_rx_polarity_flip_phy126.BCM8885X=1 +phy_rx_polarity_flip_phy127.BCM8885X=0 + +phy_rx_polarity_flip_phy128.BCM8885X=0 +phy_rx_polarity_flip_phy129.BCM8885X=0 +phy_rx_polarity_flip_phy130.BCM8885X=1 +phy_rx_polarity_flip_phy131.BCM8885X=0 +phy_rx_polarity_flip_phy132.BCM8885X=0 +phy_rx_polarity_flip_phy133.BCM8885X=1 +phy_rx_polarity_flip_phy134.BCM8885X=1 +phy_rx_polarity_flip_phy135.BCM8885X=0 + +phy_rx_polarity_flip_phy136.BCM8885X=1 +phy_rx_polarity_flip_phy137.BCM8885X=0 +phy_rx_polarity_flip_phy138.BCM8885X=0 +phy_rx_polarity_flip_phy139.BCM8885X=1 +phy_rx_polarity_flip_phy140.BCM8885X=1 +phy_rx_polarity_flip_phy141.BCM8885X=1 +phy_rx_polarity_flip_phy142.BCM8885X=0 +phy_rx_polarity_flip_phy143.BCM8885X=1 + + +phy_tx_polarity_flip_phy0.BCM8885X=1 +phy_tx_polarity_flip_phy1.BCM8885X=1 +phy_tx_polarity_flip_phy2.BCM8885X=0 +phy_tx_polarity_flip_phy3.BCM8885X=1 +phy_tx_polarity_flip_phy4.BCM8885X=1 +phy_tx_polarity_flip_phy5.BCM8885X=0 +phy_tx_polarity_flip_phy6.BCM8885X=0 +phy_tx_polarity_flip_phy7.BCM8885X=1 + +phy_tx_polarity_flip_phy8.BCM8885X=0 +phy_tx_polarity_flip_phy9.BCM8885X=1 +phy_tx_polarity_flip_phy10.BCM8885X=0 +phy_tx_polarity_flip_phy11.BCM8885X=1 +phy_tx_polarity_flip_phy12.BCM8885X=1 +phy_tx_polarity_flip_phy13.BCM8885X=1 +phy_tx_polarity_flip_phy14.BCM8885X=0 +phy_tx_polarity_flip_phy15.BCM8885X=1 + +phy_tx_polarity_flip_phy16.BCM8885X=1 +phy_tx_polarity_flip_phy17.BCM8885X=1 +phy_tx_polarity_flip_phy18.BCM8885X=0 +phy_tx_polarity_flip_phy19.BCM8885X=0 +phy_tx_polarity_flip_phy20.BCM8885X=1 +phy_tx_polarity_flip_phy21.BCM8885X=1 +phy_tx_polarity_flip_phy22.BCM8885X=0 +phy_tx_polarity_flip_phy23.BCM8885X=0 + +phy_tx_polarity_flip_phy24.BCM8885X=0 +phy_tx_polarity_flip_phy25.BCM8885X=0 +phy_tx_polarity_flip_phy26.BCM8885X=0 +phy_tx_polarity_flip_phy27.BCM8885X=1 +phy_tx_polarity_flip_phy28.BCM8885X=0 +phy_tx_polarity_flip_phy29.BCM8885X=0 +phy_tx_polarity_flip_phy30.BCM8885X=0 +phy_tx_polarity_flip_phy31.BCM8885X=0 + +phy_tx_polarity_flip_phy32.BCM8885X=1 +phy_tx_polarity_flip_phy33.BCM8885X=1 +phy_tx_polarity_flip_phy34.BCM8885X=1 +phy_tx_polarity_flip_phy35.BCM8885X=0 +phy_tx_polarity_flip_phy36.BCM8885X=1 +phy_tx_polarity_flip_phy37.BCM8885X=1 +phy_tx_polarity_flip_phy38.BCM8885X=1 +phy_tx_polarity_flip_phy39.BCM8885X=0 + +phy_tx_polarity_flip_phy40.BCM8885X=0 +phy_tx_polarity_flip_phy41.BCM8885X=0 +phy_tx_polarity_flip_phy42.BCM8885X=1 +phy_tx_polarity_flip_phy43.BCM8885X=1 +phy_tx_polarity_flip_phy44.BCM8885X=0 +phy_tx_polarity_flip_phy45.BCM8885X=0 +phy_tx_polarity_flip_phy46.BCM8885X=1 +phy_tx_polarity_flip_phy47.BCM8885X=0 + +phy_tx_polarity_flip_phy48.BCM8885X=1 +phy_tx_polarity_flip_phy49.BCM8885X=1 +phy_tx_polarity_flip_phy50.BCM8885X=1 +phy_tx_polarity_flip_phy51.BCM8885X=0 +phy_tx_polarity_flip_phy52.BCM8885X=1 +phy_tx_polarity_flip_phy53.BCM8885X=0 +phy_tx_polarity_flip_phy54.BCM8885X=0 +phy_tx_polarity_flip_phy55.BCM8885X=0 + +phy_tx_polarity_flip_phy56.BCM8885X=0 +phy_tx_polarity_flip_phy57.BCM8885X=1 +phy_tx_polarity_flip_phy58.BCM8885X=0 +phy_tx_polarity_flip_phy59.BCM8885X=0 +phy_tx_polarity_flip_phy60.BCM8885X=0 +phy_tx_polarity_flip_phy61.BCM8885X=0 +phy_tx_polarity_flip_phy62.BCM8885X=0 +phy_tx_polarity_flip_phy63.BCM8885X=0 + +phy_tx_polarity_flip_phy64.BCM8885X=0 +phy_tx_polarity_flip_phy65.BCM8885X=1 +phy_tx_polarity_flip_phy66.BCM8885X=1 +phy_tx_polarity_flip_phy67.BCM8885X=0 +phy_tx_polarity_flip_phy68.BCM8885X=1 +phy_tx_polarity_flip_phy69.BCM8885X=0 +phy_tx_polarity_flip_phy70.BCM8885X=0 +phy_tx_polarity_flip_phy71.BCM8885X=1 + +phy_tx_polarity_flip_phy72.BCM8885X=1 +phy_tx_polarity_flip_phy73.BCM8885X=1 +phy_tx_polarity_flip_phy74.BCM8885X=0 +phy_tx_polarity_flip_phy75.BCM8885X=1 +phy_tx_polarity_flip_phy76.BCM8885X=1 +phy_tx_polarity_flip_phy77.BCM8885X=1 +phy_tx_polarity_flip_phy78.BCM8885X=0 +phy_tx_polarity_flip_phy79.BCM8885X=1 + +phy_tx_polarity_flip_phy80.BCM8885X=1 +phy_tx_polarity_flip_phy81.BCM8885X=0 +phy_tx_polarity_flip_phy82.BCM8885X=0 +phy_tx_polarity_flip_phy83.BCM8885X=0 +phy_tx_polarity_flip_phy84.BCM8885X=0 +phy_tx_polarity_flip_phy85.BCM8885X=0 +phy_tx_polarity_flip_phy86.BCM8885X=1 +phy_tx_polarity_flip_phy87.BCM8885X=0 + +phy_tx_polarity_flip_phy88.BCM8885X=1 +phy_tx_polarity_flip_phy89.BCM8885X=0 +phy_tx_polarity_flip_phy90.BCM8885X=1 +phy_tx_polarity_flip_phy91.BCM8885X=1 +phy_tx_polarity_flip_phy92.BCM8885X=1 +phy_tx_polarity_flip_phy93.BCM8885X=0 +phy_tx_polarity_flip_phy94.BCM8885X=1 +phy_tx_polarity_flip_phy95.BCM8885X=1 + +phy_tx_polarity_flip_phy96.BCM8885X=1 +phy_tx_polarity_flip_phy97.BCM8885X=1 +phy_tx_polarity_flip_phy98.BCM8885X=1 +phy_tx_polarity_flip_phy99.BCM8885X=0 +phy_tx_polarity_flip_phy100.BCM8885X=1 +phy_tx_polarity_flip_phy101.BCM8885X=1 +phy_tx_polarity_flip_phy102.BCM8885X=1 +phy_tx_polarity_flip_phy103.BCM8885X=0 + +phy_tx_polarity_flip_phy104.BCM8885X=0 +phy_tx_polarity_flip_phy105.BCM8885X=0 +phy_tx_polarity_flip_phy106.BCM8885X=0 +phy_tx_polarity_flip_phy107.BCM8885X=1 +phy_tx_polarity_flip_phy108.BCM8885X=1 +phy_tx_polarity_flip_phy109.BCM8885X=0 +phy_tx_polarity_flip_phy110.BCM8885X=1 +phy_tx_polarity_flip_phy111.BCM8885X=0 + +phy_tx_polarity_flip_phy112.BCM8885X=0 +phy_tx_polarity_flip_phy113.BCM8885X=1 +phy_tx_polarity_flip_phy114.BCM8885X=1 +phy_tx_polarity_flip_phy115.BCM8885X=0 +phy_tx_polarity_flip_phy116.BCM8885X=0 +phy_tx_polarity_flip_phy117.BCM8885X=1 +phy_tx_polarity_flip_phy118.BCM8885X=0 +phy_tx_polarity_flip_phy119.BCM8885X=0 + +phy_tx_polarity_flip_phy120.BCM8885X=0 +phy_tx_polarity_flip_phy121.BCM8885X=1 +phy_tx_polarity_flip_phy122.BCM8885X=1 +phy_tx_polarity_flip_phy123.BCM8885X=0 +phy_tx_polarity_flip_phy124.BCM8885X=0 +phy_tx_polarity_flip_phy125.BCM8885X=0 +phy_tx_polarity_flip_phy126.BCM8885X=1 +phy_tx_polarity_flip_phy127.BCM8885X=0 + +phy_tx_polarity_flip_phy128.BCM8885X=1 +phy_tx_polarity_flip_phy129.BCM8885X=1 +phy_tx_polarity_flip_phy130.BCM8885X=0 +phy_tx_polarity_flip_phy131.BCM8885X=0 +phy_tx_polarity_flip_phy132.BCM8885X=0 +phy_tx_polarity_flip_phy133.BCM8885X=1 +phy_tx_polarity_flip_phy134.BCM8885X=0 +phy_tx_polarity_flip_phy135.BCM8885X=0 + +phy_tx_polarity_flip_phy136.BCM8885X=0 +phy_tx_polarity_flip_phy137.BCM8885X=0 +phy_tx_polarity_flip_phy138.BCM8885X=0 +phy_tx_polarity_flip_phy139.BCM8885X=0 +phy_tx_polarity_flip_phy140.BCM8885X=0 +phy_tx_polarity_flip_phy141.BCM8885X=0 +phy_tx_polarity_flip_phy142.BCM8885X=0 +phy_tx_polarity_flip_phy143.BCM8885X=0 + + +polled_irq_delay.BCM8885X=5 +polled_irq_mode.BCM8885X=0 +port_fec_fabric.BCM8885X=7 +bcm_stat_interval.BCM8885X=1000000 + + +port_init_cl72_1=0 +port_init_cl72_2=0 +port_init_cl72_3=0 +port_init_cl72_4=0 +port_init_cl72_5=0 +port_init_cl72_6=0 +port_init_cl72_7=0 +port_init_cl72_8=0 +port_init_cl72_9=0 +port_init_cl72_10=0 +port_init_cl72_11=0 +port_init_cl72_12=0 +port_init_cl72_13=0 +port_init_cl72_14=0 +port_init_cl72_15=0 +port_init_cl72_16=0 +port_init_cl72_17=0 +port_init_cl72_18=0 + +port_init_cl72_256=0 +port_init_cl72_257=0 +port_init_cl72_258=0 +port_init_cl72_259=0 +port_init_cl72_260=0 +port_init_cl72_261=0 +port_init_cl72_262=0 +port_init_cl72_263=0 +port_init_cl72_264=0 +port_init_cl72_265=0 +port_init_cl72_266=0 +port_init_cl72_267=0 +port_init_cl72_268=0 +port_init_cl72_269=0 +port_init_cl72_270=0 +port_init_cl72_271=0 +port_init_cl72_272=0 +port_init_cl72_273=0 +port_init_cl72_274=0 +port_init_cl72_275=0 +port_init_cl72_276=0 +port_init_cl72_277=0 +port_init_cl72_278=0 +port_init_cl72_279=0 +port_init_cl72_280=0 +port_init_cl72_281=0 +port_init_cl72_282=0 +port_init_cl72_283=0 +port_init_cl72_284=0 +port_init_cl72_285=0 +port_init_cl72_286=0 +port_init_cl72_287=0 +port_init_cl72_288=0 +port_init_cl72_289=0 +port_init_cl72_290=0 +port_init_cl72_291=0 +port_init_cl72_292=0 +port_init_cl72_293=0 +port_init_cl72_294=0 +port_init_cl72_295=0 +port_init_cl72_296=0 +port_init_cl72_297=0 +port_init_cl72_298=0 +port_init_cl72_299=0 +port_init_cl72_300=0 +port_init_cl72_301=0 +port_init_cl72_302=0 +port_init_cl72_303=0 +port_init_cl72_304=0 +port_init_cl72_305=0 +port_init_cl72_306=0 +port_init_cl72_307=0 +port_init_cl72_308=0 +port_init_cl72_309=0 +port_init_cl72_310=0 +port_init_cl72_311=0 +port_init_cl72_312=0 +port_init_cl72_313=0 +port_init_cl72_314=0 +port_init_cl72_315=0 +port_init_cl72_316=0 +port_init_cl72_317=0 +port_init_cl72_318=0 +port_init_cl72_319=0 +port_init_cl72_320=0 +port_init_cl72_321=0 +port_init_cl72_322=0 +port_init_cl72_323=0 +port_init_cl72_324=0 +port_init_cl72_325=0 +port_init_cl72_326=0 +port_init_cl72_327=0 +port_init_cl72_328=0 +port_init_cl72_329=0 +port_init_cl72_330=0 +port_init_cl72_331=0 +port_init_cl72_332=0 +port_init_cl72_333=0 +port_init_cl72_334=0 +port_init_cl72_335=0 +port_init_cl72_336=0 +port_init_cl72_337=0 +port_init_cl72_338=0 +port_init_cl72_339=0 +port_init_cl72_340=0 +port_init_cl72_341=0 +port_init_cl72_342=0 +port_init_cl72_343=0 +port_init_cl72_344=0 +port_init_cl72_345=0 +port_init_cl72_346=0 +port_init_cl72_347=0 +port_init_cl72_348=0 +port_init_cl72_349=0 +port_init_cl72_350=0 +port_init_cl72_351=0 +port_init_cl72_352=0 +port_init_cl72_353=0 +port_init_cl72_354=0 +port_init_cl72_355=0 +port_init_cl72_356=0 +port_init_cl72_357=0 +port_init_cl72_358=0 +port_init_cl72_359=0 +port_init_cl72_360=0 +port_init_cl72_361=0 +port_init_cl72_362=0 +port_init_cl72_363=0 +port_init_cl72_364=0 +port_init_cl72_365=0 +port_init_cl72_366=0 +port_init_cl72_367=0 +port_init_cl72_368=0 +port_init_cl72_369=0 +port_init_cl72_370=0 +port_init_cl72_371=0 +port_init_cl72_372=0 +port_init_cl72_373=0 +port_init_cl72_374=0 +port_init_cl72_375=0 +port_init_cl72_376=0 +port_init_cl72_377=0 +port_init_cl72_378=0 +port_init_cl72_379=0 +port_init_cl72_380=0 +port_init_cl72_381=0 +port_init_cl72_382=0 +port_init_cl72_383=0 +port_init_cl72_384=0 +port_init_cl72_385=0 +port_init_cl72_386=0 +port_init_cl72_387=0 +port_init_cl72_388=0 +port_init_cl72_389=0 +port_init_cl72_390=0 +port_init_cl72_391=0 +port_init_cl72_392=0 +port_init_cl72_393=0 +port_init_cl72_394=0 +port_init_cl72_395=0 +port_init_cl72_396=0 +port_init_cl72_397=0 +port_init_cl72_398=0 +port_init_cl72_399=0 +port_init_cl72_400=0 +port_init_cl72_401=0 +port_init_cl72_402=0 +port_init_cl72_403=0 +port_init_cl72_404=0 +port_init_cl72_405=0 +port_init_cl72_406=0 +port_init_cl72_407=0 +port_init_cl72_408=0 +port_init_cl72_409=0 +port_init_cl72_410=0 +port_init_cl72_411=0 +port_init_cl72_412=0 +port_init_cl72_413=0 +port_init_cl72_414=0 +port_init_cl72_415=0 +port_init_cl72_416=0 +port_init_cl72_417=0 +port_init_cl72_418=0 +port_init_cl72_419=0 +port_init_cl72_420=0 +port_init_cl72_421=0 +port_init_cl72_422=0 +port_init_cl72_423=0 +port_init_cl72_424=0 +port_init_cl72_425=0 +port_init_cl72_426=0 +port_init_cl72_427=0 +port_init_cl72_428=0 +port_init_cl72_429=0 +port_init_cl72_430=0 +port_init_cl72_431=0 +port_init_cl72_432=0 +port_init_cl72_433=0 +port_init_cl72_434=0 +port_init_cl72_435=0 +port_init_cl72_436=0 +port_init_cl72_437=0 +port_init_cl72_438=0 +port_init_cl72_439=0 +port_init_cl72_440=0 +port_init_cl72_441=0 +port_init_cl72_442=0 +port_init_cl72_443=0 +port_init_cl72_444=0 +port_init_cl72_445=0 +port_init_cl72_446=0 +port_init_cl72_447=0 + + +port_init_speed_cc.BCM8885X=200000 +port_init_speed_cd.BCM8885X=400000 +port_init_speed_ce.BCM8885X=100000 +port_init_speed_fabric.BCM8885X=53125 +port_init_speed_il.BCM8885X=10312 +port_init_speed_le.BCM8885X=50000 +port_init_speed_xe.BCM8885X=10000 +port_init_speed_xl.BCM8885X=40000 +port_priorities.BCM8885X=8 +protocol_traps_mode.BCM8885X=IN_LIF +rate_ext_mdio_divisor=16 +schan_intr_enable.BCM8885X=0 +schan_timeout_usec.BCM8885X=900000 +serdes_fabric_clk_freq_in.BCM8885X=1 +serdes_fabric_clk_freq_out.BCM8885X=bypass +serdes_nif_clk_freq_in0.BCM8885X=1 +serdes_nif_clk_freq_in1.BCM8885X=1 +serdes_nif_clk_freq_out0.BCM8885X=bypass +serdes_nif_clk_freq_out1.BCM8885X=bypass +soc_family.BCM8885X=BCM8885X +stable_filename.BCM8885X=/tmp/warmboot_data +stable_location.BCM8885X=3 +stable_size.BCM8885X=800000000 +sw_state_max_size.BCM8885X=750000000 +system_headers_mode=1 +tdma_intr_enable.BCM8885X=0 +tdma_timeout_usec.BCM8885X=1000000 +tm_port_header_type_in_0.BCM8885X=INJECTED_2 +tm_port_header_type_in_200.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_201.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP +tm_port_header_type_in_232.BCM8885X=INJECTED_2 +tm_port_header_type_in_19.BCM8885X=ETH +tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_out_0.BCM8885X=CPU +tm_port_header_type_out_200.BCM8885X=ETH +tm_port_header_type_out_201.BCM8885X=ETH +tm_port_header_type_out_202.BCM8885X=ETH +tm_port_header_type_out_203.BCM8885X=ETH +tm_port_header_type_out_232.BCM8885X=CPU +tm_port_header_type_out_19.BCM8885X=ETH +tm_port_header_type_out_20.BCM8885X=RAW +tslam_intr_enable.BCM8885X=0 +tslam_timeout_usec.BCM8885X=1000000 +ucode_port_0.BCM8885X=CPU.0:core_0.0 +ucode_port_200.BCM8885X=CPU.8:core_1.200 +ucode_port_201.BCM8885X=CPU.16:core_1.201 +ucode_port_202.BCM8885X=CPU.24:core_1.202 +ucode_port_203.BCM8885X=CPU.32:core_1.203 + + +ucode_port_1.BCM8885X=CGE18:core_1.1 +ucode_port_2.BCM8885X=CGE20:core_1.2 +ucode_port_3.BCM8885X=CGE22:core_1.3 +ucode_port_4.BCM8885X=CGE24:core_1.4 +ucode_port_5.BCM8885X=CGE26:core_1.5 +ucode_port_6.BCM8885X=CGE28:core_1.6 +ucode_port_7.BCM8885X=CGE30:core_1.7 +ucode_port_8.BCM8885X=CGE32:core_1.8 +ucode_port_9.BCM8885X=CGE34:core_1.9 +ucode_port_10.BCM8885X=CGE16:core_0.10 +ucode_port_11.BCM8885X=CGE14:core_0.11 +ucode_port_12.BCM8885X=CGE12:core_0.12 +ucode_port_13.BCM8885X=CGE10:core_0.13 +ucode_port_14.BCM8885X=CGE8:core_0.14 +ucode_port_15.BCM8885X=CGE6:core_0.15 +ucode_port_16.BCM8885X=CGE4:core_0.16 +ucode_port_17.BCM8885X=CGE2:core_0.17 +ucode_port_18.BCM8885X=CGE0:core_0.18 + + +ucode_port_19.BCM8885X=RCY0:core_0.19 +ucode_port_20.BCM8885X=RCY1:core_1.20 +ucode_port_21.BCM8885X=OLP:core_1.21 + + +port_init_speed_1.BCM8885X=100000 +port_init_speed_2.BCM8885X=100000 +port_init_speed_3.BCM8885X=100000 +port_init_speed_4.BCM8885X=100000 +port_init_speed_5.BCM8885X=100000 +port_init_speed_6.BCM8885X=100000 +port_init_speed_7.BCM8885X=100000 +port_init_speed_8.BCM8885X=100000 +port_init_speed_9.BCM8885X=100000 +port_init_speed_10.BCM8885X=100000 +port_init_speed_11.BCM8885X=100000 +port_init_speed_12.BCM8885X=100000 +port_init_speed_13.BCM8885X=100000 +port_init_speed_14.BCM8885X=100000 +port_init_speed_15.BCM8885X=100000 +port_init_speed_16.BCM8885X=100000 +port_init_speed_17.BCM8885X=100000 +port_init_speed_18.BCM8885X=100000 + + +port_fec_1.BCM8885X=0 +port_fec_2.BCM8885X=0 +port_fec_3.BCM8885X=0 +port_fec_4.BCM8885X=0 +port_fec_5.BCM8885x=0 +port_fec_6.BCM8885x=0 +port_fec_7.BCM8885x=0 +port_fec_8.BCM8885x=0 +port_fec_9.BCM8885x=0 +port_fec_10.BCM8885x=0 +port_fec_11.BCM8885x=0 +port_fec_12.BCM8885x=0 +port_fec_13.BCM8885x=0 +port_fec_14.BCM8885x=0 +port_fec_15.BCM8885x=0 +port_fec_16.BCM8885x=0 +port_fec_17.BCM8885x=0 +port_fec_18.BCM8885x=0 + + +serdes_lane_config_dfe_1.BCM8885X=lp +serdes_lane_config_dfe_2.BCM8885X=lp +serdes_lane_config_dfe_3.BCM8885X=lp +serdes_lane_config_dfe_4.BCM8885X=lp +serdes_lane_config_dfe_5.BCM8885X=lp +serdes_lane_config_dfe_6.BCM8885X=lp +serdes_lane_config_dfe_7.BCM8885X=lp +serdes_lane_config_dfe_8.BCM8885X=lp +serdes_lane_config_dfe_9.BCM8885X=lp +serdes_lane_config_dfe_10.BCM8885X=lp +serdes_lane_config_dfe_11.BCM8885X=lp +serdes_lane_config_dfe_12.BCM8885X=lp +serdes_lane_config_dfe_13.BCM8885X=lp +serdes_lane_config_dfe_14.BCM8885X=lp +serdes_lane_config_dfe_15.BCM8885X=lp +serdes_lane_config_dfe_16.BCM8885X=lp +serdes_lane_config_dfe_17.BCM8885X=lp +serdes_lane_config_dfe_18.BCM8885X=lp + + +serdes_lane_config_media_type_1.BCM8885X=backplane +serdes_lane_config_media_type_2.BCM8885X=backplane +serdes_lane_config_media_type_3.BCM8885X=backplane +serdes_lane_config_media_type_4.BCM8885X=backplane +serdes_lane_config_media_type_5.BCM8885X=backplane +serdes_lane_config_media_type_6.BCM8885X=backplane +serdes_lane_config_media_type_7.BCM8885X=backplane +serdes_lane_config_media_type_8.BCM8885X=backplane +serdes_lane_config_media_type_9.BCM8885X=backplane +serdes_lane_config_media_type_10.BCM8885X=backplane +serdes_lane_config_media_type_11.BCM8885X=backplane +serdes_lane_config_media_type_12.BCM8885X=backplane +serdes_lane_config_media_type_13.BCM8885X=backplane +serdes_lane_config_media_type_14.BCM8885X=backplane +serdes_lane_config_media_type_15.BCM8885X=backplane +serdes_lane_config_media_type_16.BCM8885X=backplane +serdes_lane_config_media_type_17.BCM8885X=backplane +serdes_lane_config_media_type_18.BCM8885X=backplane + + +serdes_tx_taps_1.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_2.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_3.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_4.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_5.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_6.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_7.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_8.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_9.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_10.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_11.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_12.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_13.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_14.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_15.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_16.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_17.BCM8885X=nrz:-6:87:-4 +serdes_tx_taps_18.BCM8885X=nrz:-6:87:-4 + + +serdes_tx_taps_256.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_257.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_258.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_259.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_260.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_261.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_262.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_263.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_264.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_265.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_266.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_267.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_268.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_269.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_270.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_271.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_272.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_273.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_274.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_275.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_276.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_277.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_278.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_279.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_280.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_281.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_282.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_283.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_284.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_285.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_286.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_287.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_288.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_289.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_290.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_291.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_292.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_293.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_294.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_295.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_296.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_297.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_298.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_299.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_300.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_301.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_302.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_303.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_304.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_305.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_306.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_307.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_308.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_309.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_310.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_311.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_312.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_313.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_314.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_315.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_316.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_317.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_318.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_319.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_320.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_321.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_322.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_323.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_324.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_325.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_326.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_327.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_328.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_329.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_330.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_331.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_332.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_333.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_334.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_335.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_336.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_337.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_338.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_339.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_340.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_341.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_342.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_343.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_344.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_345.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_346.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_347.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_348.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_349.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_350.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_351.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_352.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_353.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_354.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_355.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_356.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_357.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_358.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_359.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_360.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_361.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_362.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_363.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_364.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_365.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_366.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_367.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_368.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_369.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_370.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_371.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_372.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_373.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_374.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_375.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_376.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_377.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_378.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_379.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_380.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_381.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_382.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_383.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_384.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_385.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_386.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_387.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_388.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_389.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_390.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_391.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_392.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_393.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_394.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_395.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_396.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_397.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_398.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_399.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_400.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_401.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_402.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_403.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_404.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_405.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_406.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_407.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_408.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_409.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_410.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_411.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_412.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_413.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_414.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_415.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_416.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_417.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_418.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_419.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_420.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_421.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_422.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_423.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_424.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_425.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_426.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_427.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_428.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_429.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_430.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_431.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_432.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_433.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_434.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_435.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_436.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_437.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_438.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_439.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_440.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_441.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_442.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_443.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_444.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_445.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_446.BCM8885X=pam4:-20:148:0:0:0:0 +serdes_tx_taps_447.BCM8885X=pam4:-20:148:0:0:0:0 + + +serdes_lane_config_channel_mode_256=force_nr +serdes_lane_config_channel_mode_257=force_nr +serdes_lane_config_channel_mode_258=force_nr +serdes_lane_config_channel_mode_259=force_nr +serdes_lane_config_channel_mode_260=force_nr +serdes_lane_config_channel_mode_261=force_nr +serdes_lane_config_channel_mode_262=force_nr +serdes_lane_config_channel_mode_263=force_nr +serdes_lane_config_channel_mode_264=force_nr +serdes_lane_config_channel_mode_265=force_nr +serdes_lane_config_channel_mode_266=force_nr +serdes_lane_config_channel_mode_267=force_nr +serdes_lane_config_channel_mode_268=force_nr +serdes_lane_config_channel_mode_269=force_nr +serdes_lane_config_channel_mode_270=force_nr +serdes_lane_config_channel_mode_271=force_nr +serdes_lane_config_channel_mode_272=force_nr +serdes_lane_config_channel_mode_273=force_nr +serdes_lane_config_channel_mode_274=force_nr +serdes_lane_config_channel_mode_275=force_nr +serdes_lane_config_channel_mode_276=force_nr +serdes_lane_config_channel_mode_277=force_nr +serdes_lane_config_channel_mode_278=force_nr +serdes_lane_config_channel_mode_279=force_nr +serdes_lane_config_channel_mode_280=force_nr +serdes_lane_config_channel_mode_281=force_nr +serdes_lane_config_channel_mode_282=force_nr +serdes_lane_config_channel_mode_283=force_nr +serdes_lane_config_channel_mode_284=force_nr +serdes_lane_config_channel_mode_285=force_nr +serdes_lane_config_channel_mode_286=force_nr +serdes_lane_config_channel_mode_287=force_nr +serdes_lane_config_channel_mode_288=force_nr +serdes_lane_config_channel_mode_289=force_nr +serdes_lane_config_channel_mode_290=force_nr +serdes_lane_config_channel_mode_291=force_nr +serdes_lane_config_channel_mode_292=force_nr +serdes_lane_config_channel_mode_293=force_nr +serdes_lane_config_channel_mode_294=force_nr +serdes_lane_config_channel_mode_295=force_nr +serdes_lane_config_channel_mode_296=force_nr +serdes_lane_config_channel_mode_297=force_nr +serdes_lane_config_channel_mode_298=force_nr +serdes_lane_config_channel_mode_299=force_nr +serdes_lane_config_channel_mode_300=force_nr +serdes_lane_config_channel_mode_301=force_nr +serdes_lane_config_channel_mode_302=force_nr +serdes_lane_config_channel_mode_303=force_nr +serdes_lane_config_channel_mode_304=force_nr +serdes_lane_config_channel_mode_305=force_nr +serdes_lane_config_channel_mode_306=force_nr +serdes_lane_config_channel_mode_307=force_nr +serdes_lane_config_channel_mode_308=force_nr +serdes_lane_config_channel_mode_309=force_nr +serdes_lane_config_channel_mode_310=force_nr +serdes_lane_config_channel_mode_311=force_nr +serdes_lane_config_channel_mode_312=force_nr +serdes_lane_config_channel_mode_313=force_nr +serdes_lane_config_channel_mode_314=force_nr +serdes_lane_config_channel_mode_315=force_nr +serdes_lane_config_channel_mode_316=force_nr +serdes_lane_config_channel_mode_317=force_nr +serdes_lane_config_channel_mode_318=force_nr +serdes_lane_config_channel_mode_319=force_nr +serdes_lane_config_channel_mode_320=force_nr +serdes_lane_config_channel_mode_321=force_nr +serdes_lane_config_channel_mode_322=force_nr +serdes_lane_config_channel_mode_323=force_nr +serdes_lane_config_channel_mode_324=force_nr +serdes_lane_config_channel_mode_325=force_nr +serdes_lane_config_channel_mode_326=force_nr +serdes_lane_config_channel_mode_327=force_nr +serdes_lane_config_channel_mode_328=force_nr +serdes_lane_config_channel_mode_329=force_nr +serdes_lane_config_channel_mode_330=force_nr +serdes_lane_config_channel_mode_331=force_nr +serdes_lane_config_channel_mode_332=force_nr +serdes_lane_config_channel_mode_333=force_nr +serdes_lane_config_channel_mode_334=force_nr +serdes_lane_config_channel_mode_335=force_nr +serdes_lane_config_channel_mode_336=force_nr +serdes_lane_config_channel_mode_337=force_nr +serdes_lane_config_channel_mode_338=force_nr +serdes_lane_config_channel_mode_339=force_nr +serdes_lane_config_channel_mode_340=force_nr +serdes_lane_config_channel_mode_341=force_nr +serdes_lane_config_channel_mode_342=force_nr +serdes_lane_config_channel_mode_343=force_nr +serdes_lane_config_channel_mode_344=force_nr +serdes_lane_config_channel_mode_345=force_nr +serdes_lane_config_channel_mode_346=force_nr +serdes_lane_config_channel_mode_347=force_nr +serdes_lane_config_channel_mode_348=force_nr +serdes_lane_config_channel_mode_349=force_nr +serdes_lane_config_channel_mode_350=force_nr +serdes_lane_config_channel_mode_351=force_nr +serdes_lane_config_channel_mode_352=force_nr +serdes_lane_config_channel_mode_353=force_nr +serdes_lane_config_channel_mode_354=force_nr +serdes_lane_config_channel_mode_355=force_nr +serdes_lane_config_channel_mode_356=force_nr +serdes_lane_config_channel_mode_357=force_nr +serdes_lane_config_channel_mode_358=force_nr +serdes_lane_config_channel_mode_359=force_nr +serdes_lane_config_channel_mode_360=force_nr +serdes_lane_config_channel_mode_361=force_nr +serdes_lane_config_channel_mode_362=force_nr +serdes_lane_config_channel_mode_363=force_nr +serdes_lane_config_channel_mode_364=force_nr +serdes_lane_config_channel_mode_365=force_nr +serdes_lane_config_channel_mode_366=force_nr +serdes_lane_config_channel_mode_367=force_nr +serdes_lane_config_channel_mode_368=force_nr +serdes_lane_config_channel_mode_369=force_nr +serdes_lane_config_channel_mode_370=force_nr +serdes_lane_config_channel_mode_371=force_nr +serdes_lane_config_channel_mode_372=force_nr +serdes_lane_config_channel_mode_373=force_nr +serdes_lane_config_channel_mode_374=force_nr +serdes_lane_config_channel_mode_375=force_nr +serdes_lane_config_channel_mode_376=force_nr +serdes_lane_config_channel_mode_377=force_nr +serdes_lane_config_channel_mode_378=force_nr +serdes_lane_config_channel_mode_379=force_nr +serdes_lane_config_channel_mode_380=force_nr +serdes_lane_config_channel_mode_381=force_nr +serdes_lane_config_channel_mode_382=force_nr +serdes_lane_config_channel_mode_383=force_nr +serdes_lane_config_channel_mode_384=force_nr +serdes_lane_config_channel_mode_385=force_nr +serdes_lane_config_channel_mode_386=force_nr +serdes_lane_config_channel_mode_387=force_nr +serdes_lane_config_channel_mode_388=force_nr +serdes_lane_config_channel_mode_389=force_nr +serdes_lane_config_channel_mode_390=force_nr +serdes_lane_config_channel_mode_391=force_nr +serdes_lane_config_channel_mode_392=force_nr +serdes_lane_config_channel_mode_393=force_nr +serdes_lane_config_channel_mode_394=force_nr +serdes_lane_config_channel_mode_395=force_nr +serdes_lane_config_channel_mode_396=force_nr +serdes_lane_config_channel_mode_397=force_nr +serdes_lane_config_channel_mode_398=force_nr +serdes_lane_config_channel_mode_399=force_nr +serdes_lane_config_channel_mode_400=force_nr +serdes_lane_config_channel_mode_401=force_nr +serdes_lane_config_channel_mode_402=force_nr +serdes_lane_config_channel_mode_403=force_nr +serdes_lane_config_channel_mode_404=force_nr +serdes_lane_config_channel_mode_405=force_nr +serdes_lane_config_channel_mode_406=force_nr +serdes_lane_config_channel_mode_407=force_nr +serdes_lane_config_channel_mode_408=force_nr +serdes_lane_config_channel_mode_409=force_nr +serdes_lane_config_channel_mode_410=force_nr +serdes_lane_config_channel_mode_411=force_nr +serdes_lane_config_channel_mode_412=force_nr +serdes_lane_config_channel_mode_413=force_nr +serdes_lane_config_channel_mode_414=force_nr +serdes_lane_config_channel_mode_415=force_nr +serdes_lane_config_channel_mode_416=force_nr +serdes_lane_config_channel_mode_417=force_nr +serdes_lane_config_channel_mode_418=force_nr +serdes_lane_config_channel_mode_419=force_nr +serdes_lane_config_channel_mode_420=force_nr +serdes_lane_config_channel_mode_421=force_nr +serdes_lane_config_channel_mode_422=force_nr +serdes_lane_config_channel_mode_423=force_nr +serdes_lane_config_channel_mode_424=force_nr +serdes_lane_config_channel_mode_425=force_nr +serdes_lane_config_channel_mode_426=force_nr +serdes_lane_config_channel_mode_427=force_nr +serdes_lane_config_channel_mode_428=force_nr +serdes_lane_config_channel_mode_429=force_nr +serdes_lane_config_channel_mode_430=force_nr +serdes_lane_config_channel_mode_431=force_nr +serdes_lane_config_channel_mode_432=force_nr +serdes_lane_config_channel_mode_433=force_nr +serdes_lane_config_channel_mode_434=force_nr +serdes_lane_config_channel_mode_435=force_nr +serdes_lane_config_channel_mode_436=force_nr +serdes_lane_config_channel_mode_437=force_nr +serdes_lane_config_channel_mode_438=force_nr +serdes_lane_config_channel_mode_439=force_nr +serdes_lane_config_channel_mode_440=force_nr +serdes_lane_config_channel_mode_441=force_nr +serdes_lane_config_channel_mode_442=force_nr +serdes_lane_config_channel_mode_443=force_nr +serdes_lane_config_channel_mode_444=force_nr +serdes_lane_config_channel_mode_445=force_nr +serdes_lane_config_channel_mode_446=force_nr +serdes_lane_config_channel_mode_447=force_nr + + +rif_id_max=24576 +dpp_db_path=/usr/share/bcm/db +sai_recycle_port_lane_base=96 +appl_param_nof_ports_per_modid=64 +udh_exists=1 +modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 +xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 +cmic_dma_abort_in_cold_boot=0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini new file mode 100644 index 000000000000..7eb58931c209 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/pg_profile_lookup.ini @@ -0,0 +1,12 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 300m 1280 2560 110592 0 1280 + 400000 300m 1280 2560 315392 0 1280 + 100000 1000m 1280 2560 225280 0 1280 + 400000 1000m 1280 2560 778240 0 1280 + 100000 2000m 1280 2560 393216 0 1280 + 400000 2000m 1280 2560 1445888 0 1280 + 100000 80000m 1280 2560 1388544 0 1280 + 400000 80000m 1280 2560 5435392 0 1280 + 100000 120000m 1280 2560 2056192 0 1280 + 400000 120000m 1280 2560 8093696 0 1280 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/port_config.ini b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/port_config.ini new file mode 100644 index 000000000000..f1a7fee5ad1f --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/port_config.ini @@ -0,0 +1,21 @@ +# name lanes alias index asic_port_name role speed coreid coreportid numvoq +Ethernet18 72,73,74,75 Ethernet18 19 Eth0-ASIC1 Ext 100000 1 1 8 +Ethernet19 80,81,82,83 Ethernet19 20 Eth1-ASIC1 Ext 100000 1 2 8 +Ethernet20 88,89,90,91 Ethernet20 21 Eth2-ASIC1 Ext 100000 1 3 8 +Ethernet21 96,97,98,99 Ethernet21 22 Eth3-ASIC1 Ext 100000 1 4 8 +Ethernet22 104,105,106,107 Ethernet22 23 Eth4-ASIC1 Ext 100000 1 5 8 +Ethernet23 112,113,114,115 Ethernet23 24 Eth5-ASIC1 Ext 100000 1 6 8 +Ethernet24 120,121,122,123 Ethernet24 25 Eth6-ASIC1 Ext 100000 1 7 8 +Ethernet25 128,129,130,131 Ethernet25 26 Eth7-ASIC1 Ext 100000 1 8 8 +Ethernet26 136,137,138,139 Ethernet26 27 Eth8-ASIC1 Ext 100000 1 9 8 +Ethernet27 64,65,66,67 Ethernet27 28 Eth9-ASIC1 Ext 100000 0 10 8 +Ethernet28 56,57,58,59 Ethernet28 29 Eth10-ASIC1 Ext 100000 0 11 8 +Ethernet29 48,49,50,51 Ethernet29 30 Eth11-ASIC1 Ext 100000 0 12 8 +Ethernet30 40,41,42,43 Ethernet30 31 Eth12-ASIC1 Ext 100000 0 13 8 +Ethernet31 32,33,34,35 Ethernet31 32 Eth13-ASIC1 Ext 100000 0 14 8 +Ethernet32 24,25,26,27 Ethernet32 33 Eth14-ASIC1 Ext 100000 0 15 8 +Ethernet33 16,17,18,19 Ethernet33 34 Eth15-ASIC1 Ext 100000 0 16 8 +Ethernet34 8,9,10,11 Ethernet34 35 Eth16-ASIC1 Ext 100000 0 17 8 +Ethernet35 0,1,2,3 Ethernet35 36 Eth17-ASIC1 Ext 100000 0 18 8 +Ethernet-IB1 115 Ethernet-IB1 38 Rcy1-ASIC1 Inb 10000 0 19 8 +Ethernet-Rec1 116 Ethernet-Rec1 40 Rcy2-ASIC1 Rec 10000 1 20 8 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/qos.json.j2 b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai.profile b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai.profile new file mode 100644 index 000000000000..cebcc2d6ee48 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/jr2cp-nokia-18x100g-4x25g-config.bcm diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc new file mode 100644 index 000000000000..db5ad5ebb264 --- /dev/null +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc @@ -0,0 +1,6 @@ +phy set 8 reg=0xd134 data=-8 lane=1 +phy set 8 reg=0xd135 data=132 lane=1 +phy set 8 reg=0xd136 data=-8 lane=1 +phy set 8 reg=0xd137 data=0 lane=1 +phy set 8 reg=0xd138 data=0 lane=1 +phy set 8 reg=0xd133 data=0x1802 lane=1 From 52c36cd31fc4888718433f02e936c8802d76a908 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 15 Jul 2022 01:19:00 +0800 Subject: [PATCH 563/817] Add flag to control the generation of `PORT_QOS_MAP|global` entry (#11448) Why I did it This PR is to add a flag to control whether to generate PORT_QOS_MAP|global entry or not. It's because for some HWSKU, such as BackEndToRRouter and BackEndLeafRouter, there is no DSCP_TO_TC_MAP defined. Hence, if the PORT_QOS_MAP|global entry is generated, OA will report some error because the DSCP_TO_TC_MAP map AZURE can not be found. Jul 14 00:24:40.286767 str2-7050qx-32s-acs-03 ERR swss#orchagent: :- saiObjectTypeQuery: invalid object id oid:0x7fddb43605d0 Jul 14 00:24:40.286767 str2-7050qx-32s-acs-03 ERR swss#orchagent: :- meta_generic_validation_objlist: SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP:SAI_ATTR_VALUE_TYPE_OBJECT_ID object on list [0] oid 0x7fddb43605d0 is not valid, returned null object id Jul 14 00:24:40.286767 str2-7050qx-32s-acs-03 ERR swss#orchagent: :- applyDscpToTcMapToSwitch: Failed to apply DSCP_TO_TC QoS map to switch rv:-5 Jul 14 00:24:40.286767 str2-7050qx-32s-acs-03 ERR swss#orchagent: :- doTask: Failed to process QOS task, drop it This PR is to address the issue. How I did it Add a flag require_global_dscp_to_tc_map to control whether to generate the PORT_QOS_MAP|global entry. The default value for require_global_dscp_to_tc_map is true. If the device type is storage backend, the value is changed to false. Then the PORT_QOS_MAP|global entry is not generated. How to verify it Update the current test_qos_dscp_remapping_render_template to cover storage backend. --- files/build_templates/qos_config.j2 | 4 +- ...ista-7050-t0-storage-backend-minigraph.xml | 781 ++++++++++++++++++ .../qos-arista7050-t0-storage-backend.json | 81 ++ src/sonic-config-engine/tests/test_j2files.py | 9 +- 4 files changed, 871 insertions(+), 4 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample-arista-7050-t0-storage-backend-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-arista7050-t0-storage-backend.json diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index 46cebb6e32d1..b2a7b9c63f51 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -47,6 +47,7 @@ {%- set backend_device_types = ['BackEndToRRouter', 'BackEndLeafRouter'] -%} {%- set apollo_resource_types = ['DL-NPU-Apollo'] -%} +{%- set require_global_dscp_to_tc_map = true -%} { {% if (generate_tc_to_pg_map is defined) and tunnel_qos_remap_enable %} @@ -94,6 +95,7 @@ }, {% endif %} {% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %} +{%- set require_global_dscp_to_tc_map = false %} "DOT1P_TO_TC_MAP": { "AZURE": { "0": "1", @@ -219,7 +221,7 @@ "PORT_QOS_MAP": { {% if generate_global_dscp_to_tc_map is defined %} {{- generate_global_dscp_to_tc_map() }} -{% else %} +{% elif require_global_dscp_to_tc_map %} "global": { "dscp_to_tc_map" : "AZURE" }{% if PORT_ACTIVE %},{% endif %} diff --git a/src/sonic-config-engine/tests/sample-arista-7050-t0-storage-backend-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7050-t0-storage-backend-minigraph.xml new file mode 100644 index 000000000000..cadd47217a71 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-arista-7050-t0-storage-backend-minigraph.xml @@ -0,0 +1,781 @@ + + + + + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.2.0.20 + CHASSIS_PEER + 10.2.0.21 + 1 + 180 + 60 + voq + + + + + 1 + + BGPMonitor + + + BGPPeer +

10.1.0.32
+ + + + + + + + + 65100 + switch-t0 + + +
10.0.0.59
+ + + +
+ +
10.2.0.21
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + + + 65100 + CHASSIS_PEER + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel1 + fortyGigE0/4 + + + + + + ab1 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1000 + 1000 + 192.168.0.0/27 + + + ab4 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + 1001 + 1001 + 192.168.0.32/27 + + + kk1 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2020 + 2020 + Tagged + 192.168.0.0/28 + + + ab2 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2000 + 2000 + Tagged + 192.168.0.240/27 + + + ab3 + fortyGigE0/12 + 192.0.0.1;192.0.0.2 + 2001 + 2001 + 192.168.0.240/27 + + + + + + PortChannel1 + 10.0.0.56/31 + + + + PortChannel1 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + ab1 + 192.168.0.1/27 + + + + + + DataAcl + + ERSPAN + everflow + Everflow + 0 + everflow.xml + + + DataAcl + + ERSPANv6 + everflowV6 + Everflow + 0 + everflow.xml + + + DataAcl + + Loopback0 + ipv6-mgmt-only + Management + 0 + + + + DataAcl + + Loopback0 + mgmt-only + Management + 0 + + + + DataAcl + + StaticERSPAN + everflowStatic + Everflow + 0 + everflow.xml + + + + + + + + + + DeviceInterfaceLink + 1000 + ARISTA01T1 + et1 + true + switch-t0 + fortyGigE0/8 + true + + + DeviceMgmtLink + 1000 + switch-t0 + fortyGigE0/16 + true + ChassisMTS1 + mgmt0 + true + + + + + switch-t0 + Arista-7050-QX-32S + AAA00PrdStr00 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet1 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + Ethernet2 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + true + 0 + Arista-7050-QX-32S + + + DeviceInterface + + 1 + Management1 + false + mgmt1 + 1000 + + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + ResourceType + + Storage + + + + + + + switch-t0 + Arista-7050-QX-32S + diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050-t0-storage-backend.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050-t0-storage-backend.json new file mode 100644 index 000000000000..94aa8d8a7d1d --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050-t0-storage-backend.json @@ -0,0 +1,81 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DOT1P_TO_TC_MAP": { + "AZURE": { + "0": "1", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 3edae73f5e58..00d823a5c2de 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -354,7 +354,8 @@ def test_qos_dscp_remapping_render_template(self): '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64', '../../../device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8', '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8', - '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64' + '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64', + '../../../device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S' ] sample_outputs = [ 'qos-arista7050cx3-dualtor.json', @@ -362,7 +363,8 @@ def test_qos_dscp_remapping_render_template(self): 'qos-arista7260-t1.json', 'qos-arista7050cx3-dualtor-remap-disabled.json', 'qos-arista7260-dualtor-remap-disabled.json', - 'qos-arista7260-t1-remap-disabled.json' + 'qos-arista7260-t1-remap-disabled.json', + 'qos-arista7050-t0-storage-backend.json' ] sample_minigraph_files = [ 'sample-arista-7050cx3-dualtor-minigraph.xml', @@ -370,7 +372,8 @@ def test_qos_dscp_remapping_render_template(self): 'sample-arista-7260-t1-minigraph.xml', 'sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml', 'sample-arista-7260-dualtor-minigraph-remap-disabled.xml', - 'sample-arista-7260-t1-minigraph-remap-disabled.xml' + 'sample-arista-7260-t1-minigraph-remap-disabled.xml', + 'sample-arista-7050-t0-storage-backend-minigraph.xml' ] for i, path in enumerate(dir_paths): device_template_path = os.path.join(self.test_dir, path) From 077a537b14eb103206048cd41944378d7d60fe0e Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Thu, 14 Jul 2022 12:26:58 -0700 Subject: [PATCH 564/817] Log message fix for TSB (#11441) --- dockers/docker-fpm-frr/base_image_files/TS | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dockers/docker-fpm-frr/base_image_files/TS b/dockers/docker-fpm-frr/base_image_files/TS index 4ee085282be8..799bf9ded700 100755 --- a/dockers/docker-fpm-frr/base_image_files/TS +++ b/dockers/docker-fpm-frr/base_image_files/TS @@ -7,8 +7,10 @@ PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} if [[ $1 == "TSA" ]]; then TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "true"}}}' + log_msg='System Mode: Normal -> Maintenance' elif [[ $1 == "TSB" ]]; then TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "false"}}}' + log_msg='System Mode: Maintenance -> Normal' fi # Parse the device specific asic conf file, if it exists @@ -28,8 +30,8 @@ if [[ ($NUM_ASIC -gt 1) ]]; then echo -e "BGP"$asic" : \c" if [[ -n "$TSA_STATE_UPDATE" ]]; then sonic-cfggen -a "$TSA_STATE_UPDATE" -w -n $NAMESPACE_PREFIX$asic - logger -t $1 -p user.info "BGP$asic: System Mode: Normal -> Maintenance" - echo "BGP$asic: System Mode: Normal -> Maintenance" + logger -t $1 -p user.info "BGP$asic: $log_msg" + echo "$log_msg" else # If TSC is executed, invoke FRR script to check installed route-maps docker exec -i bgp$asic /usr/bin/$1 @@ -40,11 +42,10 @@ if [[ ($NUM_ASIC -gt 1) ]]; then else if [[ -n "$TSA_STATE_UPDATE" ]]; then sonic-cfggen -a "$TSA_STATE_UPDATE" -w - logger -t $1 -p user.info "System Mode: Normal -> Maintenance" - echo "System Mode: Normal -> Maintenance" + logger -t $1 -p user.info "$log_msg" + echo "$log_msg" else # If TSC is executed, invoke FRR script to check installed route-maps docker exec -i bgp /usr/bin/$1 fi fi - From 77c224b0fdd83ac1badcbc50ca545ea633201368 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Fri, 15 Jul 2022 13:13:58 +0800 Subject: [PATCH 565/817] [ci] Add vstest skip folder sonic-slave-* (#11295) --- .azure-pipelines/vstest-exclude | 1 + 1 file changed, 1 insertion(+) diff --git a/.azure-pipelines/vstest-exclude b/.azure-pipelines/vstest-exclude index 71616704707a..94662be38c04 100644 --- a/.azure-pipelines/vstest-exclude +++ b/.azure-pipelines/vstest-exclude @@ -1,3 +1,4 @@ ^platform ^.azure-pipelines ^files/build/versions +^sonic-slave- From 8282d427e49c063c6320478cde1c948ec97106dd Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sun, 17 Jul 2022 10:34:45 +0800 Subject: [PATCH 566/817] Fix chassis test issue (#11460) Signed-off-by: Stephen Sun --- platform/mellanox/mlnx-platform-api/tests/test_chassis.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py index 38b6bd6cfffd..8ae4ece8eec6 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_chassis.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_chassis.py @@ -286,7 +286,8 @@ def test_revision_permission(self): def test_get_port_or_cage_type(self): chassis = Chassis() - chassis.RJ45_port_list = [0] + chassis._RJ45_port_inited = True + chassis._RJ45_port_list = [0] assert SfpBase.SFP_PORT_TYPE_BIT_RJ45 == chassis.get_port_or_cage_type(1) exceptionRaised = False From 88d0ce5ce830a24c1ed4aab94d4cc32d231ea5ab Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Sun, 17 Jul 2022 19:57:27 -0700 Subject: [PATCH 567/817] Add gbsyncd container for broncos (#11154) * Add docker-gbsyncd-broncos support * Address review comments * Add socket to gbsyncd * Upgrade gbsyncd-broncos to bullseye --- files/build_templates/docker_image_ctl.j2 | 25 +++++++++-- platform/broadcom/rules.dep | 3 ++ platform/broadcom/rules.mk | 3 ++ .../components/docker-gbsyncd-broncos.dep | 12 ++++++ platform/components/docker-gbsyncd-broncos.mk | 37 ++++++++++++++++ .../docker-gbsyncd-broncos/Dockerfile.j2 | 40 +++++++++++++++++ .../critical_processes.j2 | 1 + .../docker-gbsyncd-broncos/docker-init.sh | 16 +++++++ .../docker-gbsyncd-broncos/start.sh | 14 ++++++ .../supervisord.conf.j2 | 43 +++++++++++++++++++ 10 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 platform/components/docker-gbsyncd-broncos.dep create mode 100644 platform/components/docker-gbsyncd-broncos.mk create mode 100644 platform/components/docker-gbsyncd-broncos/Dockerfile.j2 create mode 100644 platform/components/docker-gbsyncd-broncos/critical_processes.j2 create mode 100755 platform/components/docker-gbsyncd-broncos/docker-init.sh create mode 100755 platform/components/docker-gbsyncd-broncos/start.sh create mode 100644 platform/components/docker-gbsyncd-broncos/supervisord.conf.j2 diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index f0a1dcccbaae..19ca92a8e98c 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -36,7 +36,7 @@ function updateSyslogConf() TARGET_IP=$(docker network inspect bridge --format={{ "'{{(index .IPAM.Config 0).Gateway}}'" }}) CONTAINER_NAME="$DOCKERNAME" TMP_FILE="/tmp/rsyslog.$CONTAINER_NAME.conf" - {%- if docker_container_name == "database" %} + {%- if docker_container_name == "database" %} python -c "import jinja2, os; paths=['/usr/share/sonic/templates']; loader = jinja2.FileSystemLoader(paths); env = jinja2.Environment(loader=loader, trim_blocks=True); template_file='/usr/share/sonic/templates/rsyslog-container.conf.j2'; template = env.get_template(os.path.basename(template_file)); data=template.render({\"target_ip\":\"$TARGET_IP\",\"container_name\":\"$CONTAINER_NAME\"}); print(data)" > $TMP_FILE {%- else %} sonic-cfggen -t /usr/share/sonic/templates/rsyslog-container.conf.j2 -a "{\"target_ip\": \"$TARGET_IP\", \"container_name\": \"$CONTAINER_NAME\" }" > $TMP_FILE @@ -105,7 +105,7 @@ function preStartAction() if [[ $(/bin/systemctl status watchdog-control.service | grep -c running) -gt 0 ]]; then echo "Stopping watchdog-control.service before starting PDE" systemctl stop watchdog-control.service - fi + fi {%- elif docker_container_name == "snmp" %} $SONIC_DB_CLI STATE_DB HSET 'DEVICE_METADATA|localhost' chassis_serial_number $(decode-syseeprom -s) {%- else %} @@ -127,7 +127,7 @@ function waitForAllInstanceDatabaseConfigJsonFilesReady() cnt=0 SONIC_DB_GLOBAL_JSON="/var/run/redis/sonic-db/database_global.json" if [ -f "$SONIC_DB_GLOBAL_JSON" ]; then - # Create a separate python script to get a list of location of all instance database_config.json file + # Create a separate python script to get a list of location of all instance database_config.json file redis_database_cfg_list=`/usr/bin/python -c "import sys; import os; import json; f=open(sys.argv[1]); \ global_db_dir = os.path.dirname(sys.argv[1]); data=json.load(f); \ print(\" \".join([os.path.normpath(global_db_dir+'/'+elem['include']) \ @@ -297,6 +297,20 @@ start() { source $PLATFORM_ENV_CONF fi + {%- if docker_container_name == "gbsyncd" %} + GBSYNCD_CONF=/usr/share/sonic/device/$PLATFORM/gbsyncd.ini + GBSYNCD_PLATFORM=gbsyncd-vs + if [ -f "$GBSYNCD_CONF" ]; then + while IFS="=" read -r key value; do + case "$key" in + platform) + GBSYNCD_PLATFORM="$value" + ;; + esac + done < "$GBSYNCD_CONF" + fi + {%- endif %} + {%- if docker_container_name == "database" %} # Don't mount HWSKU in {{docker_container_name}} container. HWSKU="" @@ -522,7 +536,10 @@ start() { --env "NAMESPACE_PREFIX"="$NAMESPACE_PREFIX" \ --env "NAMESPACE_COUNT"=$NUM_ASIC \ --name=$DOCKERNAME \ -{%- if docker_image_name is defined %} +{%- if docker_container_name == "gbsyncd" %} + -v /var/run/docker-syncd$DEV:/var/run/sswsyncd \ + "docker-$GBSYNCD_PLATFORM":latest \ +{%- elif docker_image_name is defined %} {{docker_image_name}}:latest \ {%- else %} {{docker_image_id}} \ diff --git a/platform/broadcom/rules.dep b/platform/broadcom/rules.dep index 36b727570e68..220ee8019943 100644 --- a/platform/broadcom/rules.dep +++ b/platform/broadcom/rules.dep @@ -30,3 +30,6 @@ include $(PLATFORM_PATH)/libsaithrift-dev.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.dep include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.dep +ifeq ($(INCLUDE_GBSYNCD_BRONCOS), y) +include $(PLATFORM_PATH)/../components/docker-gbsyncd-broncos.dep +endif diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index b13a145b2b0f..0b46bb1c8ec4 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -29,6 +29,9 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.mk include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.mk +ifeq ($(INCLUDE_GBSYNCD_BRONCOS), y) +include $(PLATFORM_PATH)/../components/docker-gbsyncd-broncos.mk +endif BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/20190307/bcmcmd?sv=2015-04-05&sr=b&sig=sUdbU7oVbh5exbXXHVL5TDFBTWDDBASHeJ8Cp0B0TIc%3D&se=2038-05-06T22%3A34%3A19Z&sp=r" diff --git a/platform/components/docker-gbsyncd-broncos.dep b/platform/components/docker-gbsyncd-broncos.dep new file mode 100644 index 000000000000..0b9d88c292a9 --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos.dep @@ -0,0 +1,12 @@ +DPATH := $($(DOCKER_GBSYNCD_BRONCOS)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) +DEP_FILES += platform/components/docker-gbsyncd-broncos.mk +DEP_FILES += platform/components/docker-gbsyncd-broncos.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_GBSYNCD_BRONCOS)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_GBSYNCD_BRONCOS)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_GBSYNCD_BRONCOS)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_GBSYNCD_BRONCOS),$(DOCKER_GBSYNCD_BRONCOS_DBG))) diff --git a/platform/components/docker-gbsyncd-broncos.mk b/platform/components/docker-gbsyncd-broncos.mk new file mode 100644 index 000000000000..6e280ee5a655 --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos.mk @@ -0,0 +1,37 @@ +LIBSAI_BRONCOS = libsaibroncos_0.0.1_amd64.deb +$(LIBSAI_BRONCOS)_URL = + +ifneq ($($(LIBSAI_BRONCOS)_URL),) + +DOCKER_GBSYNCD_BRONCOS_STEM = docker-gbsyncd-broncos +DOCKER_GBSYNCD_BRONCOS = $(DOCKER_GBSYNCD_BRONCOS_STEM).gz +DOCKER_GBSYNCD_BRONCOS_DBG = $(DOCKER_GBSYNCD_BRONCOS_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_GBSYNCD_BRONCOS)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) + +$(DOCKER_GBSYNCD_BRONCOS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) + +$(DOCKER_GBSYNCD_BRONCOS)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) + +$(DOCKER_GBSYNCD_BRONCOS)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BRONCOS) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_GBSYNCD_BRONCOS) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BRONCOS) + +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BRONCOS_DBG) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_GBSYNCD_BRONCOS_DBG) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BRONCOS_DBG) + +$(DOCKER_GBSYNCD_BRONCOS)_CONTAINER_NAME = gbsyncd +$(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += --privileged -t +$(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +SONIC_ONLINE_DEBS += $(LIBSAI_BRONCOS) + +$(DOCKER_GBSYNCD_BRONCOS)_VERSION = 1.0.0 +$(DOCKER_GBSYNCD_BRONCOS)_PACKAGE_NAME = gbsyncd-broncos +$(DOCKER_GBSYNCD_BRONCOS)_PATH = $(PLATFORM_PATH)/../components/docker-gbsyncd-broncos +$(DOCKER_GBSYNCD_BRONCOS)_DEPENDS += $(SYNCD) $(LIBSAI_BRONCOS) +endif diff --git a/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 new file mode 100644 index 000000000000..f114679c6888 --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 @@ -0,0 +1,40 @@ +FROM docker-config-engine-bullseye + +ARG docker_container_name +RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +RUN apt-get install -f -y iproute2 libcap2-bin libprotobuf-dev + +COPY \ +{% for deb in docker_gbsyncd_broncos_debs.split(' ') -%} +{% if 'libsaibcm' not in deb -%} +debs/{{ deb }}{{' '}} +{%- endif %} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_gbsyncd_broncos_debs.split(' ') -%} +{% if 'libsaibcm' not in deb -%} +debs/{{ deb }}{{' '}} +{%- endif %} +{%- endfor %} + +COPY ["docker-init.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] + +COPY ["critical_processes.j2", "/usr/share/sonic/templates"] +COPY ["supervisord.conf.j2", "/usr/share/sonic/templates"] + +COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/platform/components/docker-gbsyncd-broncos/critical_processes.j2 b/platform/components/docker-gbsyncd-broncos/critical_processes.j2 new file mode 100644 index 000000000000..bdd6903c5690 --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos/critical_processes.j2 @@ -0,0 +1 @@ +program:syncd diff --git a/platform/components/docker-gbsyncd-broncos/docker-init.sh b/platform/components/docker-gbsyncd-broncos/docker-init.sh new file mode 100755 index 000000000000..93a1b931dfad --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos/docker-init.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +GB_CONFIG=/usr/share/sonic/hwsku/gearbox_config.json + +if [ ! -f $GB_CONFIG ]; then + exit 0 +fi + +CFGGEN_ARG="-j $GB_CONFIG" + +mkdir -p /etc/supervisor/conf.d/ + +sonic-cfggen $CFGGEN_ARG -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf +sonic-cfggen $CFGGEN_ARG -t /usr/share/sonic/templates/critical_processes.j2 > /etc/supervisor/critical_processes + +exec /usr/local/bin/supervisord diff --git a/platform/components/docker-gbsyncd-broncos/start.sh b/platform/components/docker-gbsyncd-broncos/start.sh new file mode 100755 index 000000000000..ac7de02dcdca --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos/start.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +HWSKU_DIR=/usr/share/sonic/hwsku + +mkdir -p /etc/sai.d/ + +# Create/Copy the psai.profile to /etc/sai.d/psai.profile +if [ -f $HWSKU_DIR/psai.profile.j2 ]; then + sonic-cfggen -d -t $HWSKU_DIR/psai.profile.j2 > /etc/sai.d/psai.profile +else + if [ -f $HWSKU_DIR/psai.profile ]; then + cp $HWSKU_DIR/psai.profile /etc/sai.d/psai.profile + fi +fi diff --git a/platform/components/docker-gbsyncd-broncos/supervisord.conf.j2 b/platform/components/docker-gbsyncd-broncos/supervisord.conf.j2 new file mode 100644 index 000000000000..c274315ef67e --- /dev/null +++ b/platform/components/docker-gbsyncd-broncos/supervisord.conf.j2 @@ -0,0 +1,43 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + +[program:syncd] +environment=BRONCOS_DEVICE_PATH=/usr/lib +command=/usr/bin/syncd -s -p /etc/sai.d/psai.profile -x /usr/share/sonic/hwsku/context_config.json -g 1 +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited From d7101963f191008bffd5f4091fc5d9f8c0074e97 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Mon, 18 Jul 2022 12:45:05 +0800 Subject: [PATCH 568/817] [ci] Disable reproducible build in master branch official build (#11452) --- .azure-pipelines/azure-pipelines-repd-build-variables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/azure-pipelines-repd-build-variables.yml b/.azure-pipelines/azure-pipelines-repd-build-variables.yml index d86ef1eaf8a0..1bd897dafb92 100644 --- a/.azure-pipelines/azure-pipelines-repd-build-variables.yml +++ b/.azure-pipelines/azure-pipelines-repd-build-variables.yml @@ -1,7 +1,7 @@ variables: ${{ if eq(variables['Build.Reason'],'PullRequest') }}: VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=$([ "$(System.PullRequest.TargetBranch)" != "master" ] && echo deb,py2,py3,web,git,docker)' - ${{ elseif ne(variables['Build.SourceBranch'],'master') }}: + ${{ elseif ne(variables['Build.SourceBranchName'],'master') }}: VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web,git,docker' ${{ else }}: VERSION_CONTROL_OPTIONS: '' From 1e387f1189587590c6f3a94e62e37452a8145761 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Mon, 18 Jul 2022 07:10:13 -0700 Subject: [PATCH 569/817] Added Support for deployment_id parsing for Device Asic metadata (#11454) What I did: Added Support for deployment_id parsing for Device Asic metadata. Why I did:- Deployment Id is used in BGP docker for FRR template generation. For multi-asic platforms running in namespace without deployment id as key in DEVICE_METADATA FRR template generation fails. This change is needed after this #10154 where if deployment_id is none we don't update DEVICE_METADA dictionary. How I verify:- Added unit-test. --- src/sonic-config-engine/minigraph.py | 11 ++++--- .../tests/multi_npu_data/sample-minigraph.xml | 31 +++++++++++++++++++ .../tests/test_multinpu_cfggen.py | 1 + 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index a05880e5225e..ee6a84183e2c 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1041,6 +1041,7 @@ def parse_asic_meta(meta, hname): switch_id = None switch_type = None max_cores = None + deployment_id = None macsec_profile = {} device_metas = meta.find(str(QName(ns, "Devices"))) for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): @@ -1057,10 +1058,12 @@ def parse_asic_meta(meta, hname): switch_type = value elif name == "MaxCores": max_cores = value + elif name == "DeploymentId": + deployment_id = value elif name == 'MacSecProfile': macsec_profile = parse_macsec_profile(value) - return sub_role, switch_id, switch_type, max_cores, macsec_profile + return sub_role, switch_id, switch_type, max_cores, deployment_id, macsec_profile def parse_deviceinfo(meta, hwsku): port_speeds = {} @@ -1414,7 +1417,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (sub_role, switch_id, switch_type, max_cores, macsec_profile) = parse_asic_meta(child, asic_name) + (sub_role, switch_id, switch_type, max_cores, deployment_id, macsec_profile) = parse_asic_meta(child, asic_name) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): @@ -1989,7 +1992,7 @@ def parse_asic_sub_role(filename, asic_name): root = ET.parse(filename).getroot() for child in root: if child.tag == str(QName(ns, "MetadataDeclaration")): - sub_role, _, _, _, _= parse_asic_meta(child, asic_name) + sub_role, _, _, _, _, _= parse_asic_meta(child, asic_name) return sub_role def parse_asic_switch_type(filename, asic_name): @@ -1997,7 +2000,7 @@ def parse_asic_switch_type(filename, asic_name): root = ET.parse(filename).getroot() for child in root: if child.tag == str(QName(ns, "MetadataDeclaration")): - _, _, switch_type, _, _ = parse_asic_meta(child, asic_name) + _, _, switch_type, _, _, _ = parse_asic_meta(child, asic_name) return switch_type return None diff --git a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml index 935d2c0c833a..be3938f24bc4 100644 --- a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml +++ b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml @@ -1465,6 +1465,11 @@ FrontEnd + + DeploymentId + + 1 + @@ -1475,6 +1480,11 @@ FrontEnd + + DeploymentId + + 1 + @@ -1485,6 +1495,11 @@ FrontEnd + + DeploymentId + + 1 + @@ -1495,6 +1510,11 @@ FrontEnd + + DeploymentId + + 1 + @@ -1505,6 +1525,11 @@ BackEnd + + DeploymentId + + 1 + @@ -1515,6 +1540,12 @@ BackEnd + + DeploymentId + + 1 + + diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 35c2000c0e4e..a34b0b6cfd78 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -304,6 +304,7 @@ def test_device_asic_metadata(self): self.assertEqual(output['localhost']['sub_role'], 'FrontEnd') else: self.assertEqual(output['localhost']['sub_role'], 'BackEnd') + self.assertEqual(output['localhost']['deployment_id'], "1") def test_global_asic_acl(self): argument = "-m {} -p {} --var-json \"ACL_TABLE\"".format(self.sample_graph, self.sample_port_config) From 0dfa79d3c40a1f794add32d75d44c1eaece0800a Mon Sep 17 00:00:00 2001 From: yozhao101 <56170650+yozhao101@users.noreply.github.com> Date: Mon, 18 Jul 2022 14:39:47 -0700 Subject: [PATCH 570/817] [pft_docker] Checks out the update of gNMI client script. (#11450) Signed-off-by: Yong Zhao yozhao@microsoft.com Why I did it This PR aims to check in the commit f2b11e4 introduced by the update related to gNMI python client. How I did it I changed the Dockfile.j2 such that the update of gNMI client script will be checked in when ptf docker image is built. How to verify it A PTF container image was built and then loaded on a testbed. I checked the update of gNMI client script was checked in. --- dockers/docker-ptf/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index bf22ba97ea06..c73d12f3245a 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -206,7 +206,7 @@ RUN mkdir -p /var/log/supervisor # Install Python-based GNMI client RUN git clone https://github.com/lguohan/gnxi.git \ && cd gnxi \ - && git checkout 53901ab \ + && git checkout f2b11e4 \ && cd gnmi_cli_py \ && pip install -r requirements.txt From 765741ac73c86932ff89a8baaaec14aa702abd7e Mon Sep 17 00:00:00 2001 From: Neetha John Date: Mon, 18 Jul 2022 17:08:20 -0700 Subject: [PATCH 571/817] Update 7260 MMU and ECN settings (#11449) Signed-off-by: Neetha John Why I did it Improve throughput and latency for 7260 deployments How I did it Update the dynamic threshold to 0 and ECN settings as 2mb/10mb/5% How to verify it Updated unit tests to use the modified values for 7260 ecn settings. --- .../pg_profile_lookup.ini | 12 +++++------ .../Arista-7260CX3-D96C16/qos.json.j2 | 20 +++++++++++++++++++ .../th2/7260/BALANCED/pg_profile_lookup.ini | 18 ++++++++--------- .../profiles/th2/7260/BALANCED/qos.json.j2 | 20 +++++++++++++++++++ .../7260/RDMA-CENTRIC/pg_profile_lookup.ini | 18 ++++++++--------- .../th2/7260/RDMA-CENTRIC/qos.json.j2 | 20 +++++++++++++++++++ .../sample_output/py2/qos-arista7260.json | 1 + ...qos-arista7260-dualtor-remap-disabled.json | 4 ++-- .../py3/qos-arista7260-dualtor.json | 4 ++-- .../py3/qos-arista7260-t1-remap-disabled.json | 4 ++-- .../sample_output/py3/qos-arista7260-t1.json | 4 ++-- .../sample_output/py3/qos-arista7260.json | 1 + src/sonic-config-engine/tests/test_j2files.py | 3 +++ 13 files changed, 97 insertions(+), 32 deletions(-) create mode 120000 src/sonic-config-engine/tests/sample_output/py2/qos-arista7260.json create mode 120000 src/sonic-config-engine/tests/sample_output/py3/qos-arista7260.json diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini index ed0005610b71..a12e306278cc 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 50000 40m 1248 1248 96096 -3 2496 - 100000 40m 1248 1248 177632 -3 2496 - 50000 300m 1248 1248 141856 -3 2496 - 100000 300m 1248 1248 268736 -3 2496 + 50000 5m 1248 1248 56160 0 2496 + 100000 5m 1248 1248 96928 0 2496 + 50000 40m 1248 1248 96096 0 2496 + 100000 40m 1248 1248 177632 0 2496 + 50000 300m 1248 1248 141856 0 2496 + 100000 300m 1248 1248 268736 0 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 index 3e548325ea30..3e1d8df928c9 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 @@ -1 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + {%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini index 9d94e3fc1e52..0ff01d9aa52a 100644 --- a/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini +++ b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini @@ -1,11 +1,11 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 100000 5m 1248 1248 54080 -3 2496 - 100000 40m 1248 1248 59696 -3 2496 - 100000 300m 1248 1248 101088 -3 2496 - 50000 5m 1248 1248 54080 -3 2496 - 50000 40m 1248 1248 59696 -3 2496 - 50000 300m 1248 1248 101088 -3 2496 - 40000 5m 1248 1248 29536 -3 2496 - 40000 40m 1248 1248 31616 -3 2496 - 40000 300m 1248 1248 48256 -3 2496 + 100000 5m 1248 1248 54080 0 2496 + 100000 40m 1248 1248 59696 0 2496 + 100000 300m 1248 1248 101088 0 2496 + 50000 5m 1248 1248 54080 0 2496 + 50000 40m 1248 1248 59696 0 2496 + 50000 300m 1248 1248 101088 0 2496 + 40000 5m 1248 1248 29536 0 2496 + 40000 40m 1248 1248 31616 0 2496 + 40000 300m 1248 1248 48256 0 2496 diff --git a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 index cb3ad17faa39..d760038736a6 100644 --- a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 +++ b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 @@ -289,4 +289,24 @@ {%- endmacro %} {% endif %} +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + {%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini index 9d94e3fc1e52..0ff01d9aa52a 100644 --- a/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini @@ -1,11 +1,11 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 100000 5m 1248 1248 54080 -3 2496 - 100000 40m 1248 1248 59696 -3 2496 - 100000 300m 1248 1248 101088 -3 2496 - 50000 5m 1248 1248 54080 -3 2496 - 50000 40m 1248 1248 59696 -3 2496 - 50000 300m 1248 1248 101088 -3 2496 - 40000 5m 1248 1248 29536 -3 2496 - 40000 40m 1248 1248 31616 -3 2496 - 40000 300m 1248 1248 48256 -3 2496 + 100000 5m 1248 1248 54080 0 2496 + 100000 40m 1248 1248 59696 0 2496 + 100000 300m 1248 1248 101088 0 2496 + 50000 5m 1248 1248 54080 0 2496 + 50000 40m 1248 1248 59696 0 2496 + 50000 300m 1248 1248 101088 0 2496 + 40000 5m 1248 1248 29536 0 2496 + 40000 40m 1248 1248 31616 0 2496 + 40000 300m 1248 1248 48256 0 2496 diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 index cb3ad17faa39..d760038736a6 100644 --- a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 @@ -289,4 +289,24 @@ {%- endmacro %} {% endif %} +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + {%- include 'qos_config.j2' %} diff --git a/src/sonic-config-engine/tests/sample_output/py2/qos-arista7260.json b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7260.json new file mode 120000 index 000000000000..9362bae62029 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/qos-arista7260.json @@ -0,0 +1 @@ +../py3/qos-arista7260-t1-remap-disabled.json \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json index 49ed2038e71b..50adbf672a27 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor-remap-disabled.json @@ -636,8 +636,8 @@ "wred_yellow_enable" : "true", "wred_red_enable" : "true", "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "1048576", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index 85339be6d10d..cdb6e8fe842e 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -739,8 +739,8 @@ "wred_yellow_enable" : "true", "wred_red_enable" : "true", "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "1048576", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json index f4e639b3ddfe..5c0860d25133 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1-remap-disabled.json @@ -348,8 +348,8 @@ "wred_yellow_enable" : "true", "wred_red_enable" : "true", "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "1048576", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json index eff232ab179d..a479523fc1f1 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json @@ -348,8 +348,8 @@ "wred_yellow_enable" : "true", "wred_red_enable" : "true", "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "1048576", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", "yellow_max_threshold" : "2097152", "yellow_min_threshold" : "1048576", "red_max_threshold" : "2097152", diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260.json new file mode 120000 index 000000000000..bb3adcf3a9a9 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260.json @@ -0,0 +1 @@ +qos-arista7260-t1-remap-disabled.json \ No newline at end of file diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 00d823a5c2de..735bf9c3bbc6 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -320,6 +320,9 @@ def test_qos_dell9332_render_template(self): def test_qos_dell6100_render_template(self): self._test_qos_render_template('dell', 'x86_64-dell_s6100_c2538-r0', 'Force10-S6100', 'sample-dell-6100-t0-minigraph.xml', 'qos-dell6100.json') + def test_qos_arista7260_render_template(self): + self._test_qos_render_template('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-D96C16', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', 'qos-arista7260.json') + def _test_qos_render_template(self, vendor, platform, sku, minigraph, expected): file_exist, dir_exist = self.create_machine_conf(platform, vendor) dir_path = os.path.join(self.test_dir, '..', '..', '..', 'device', vendor, platform, sku) From 37d7e87792ddb64b0c1438dfbbd253ece57fc31b Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:42:17 -0700 Subject: [PATCH 572/817] [multi-asic]: Add build param to build multi-asic KVM image. (#11453) Why I did it [multi-asic]: Add build param to build multi-asic KVM image. Require sonic-4asic-vs.img.gz to run multi-asic tests. BUILD_MULTIASIC_KVM=y has to be added to build parameter to generate multi-asic KVM image which can be eventually used in multi-asic VS testbed. This is a pipeline that we currently have to generate multi-asic KVM image: https://github.com/Azure/sonic-buildimage/blob/master/.azure-pipelines/official-build-multi-asic.yml How I did it Add BUILD_MULTIASIC_KVM=y to build parameter in pipeline script to generate multi-asic KVM image. How to verify it The build param is already used in official-build-multi-asic.yml pipeline. --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1ea865d09d78..32b675637bd0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -53,7 +53,7 @@ stages: jobs: - template: .azure-pipelines/azure-pipelines-build.yml parameters: - buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' + buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) BUILD_MULTIASIC_KVM=y ${{ variables.VERSION_CONTROL_OPTIONS }}' jobGroups: - name: vs From 228853bb57abe6450263d31175577ed23b27b2f1 Mon Sep 17 00:00:00 2001 From: zitingguo-ms Date: Tue, 19 Jul 2022 12:39:14 +0800 Subject: [PATCH 573/817] [bcm sai]upgrade Broadcom SAI to 7.1.0.0-6 (#11410) - Default Not to report Single bit ECC correctable events to avoid the need to set SOC porperties. Signed-off-by: zitingguo --- platform/broadcom/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index f3f6448d2e46..ad43e8ddbe5d 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,4 +1,4 @@ -LIBSAIBCM_XGS_VERSION = 7.1.0.0-5 +LIBSAIBCM_XGS_VERSION = 7.1.0.0-6 LIBSAIBCM_DNX_VERSION = 7.1.0.0-1 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" From 6ae74867a6a1ab15fbfb38e703ec5e49e4190763 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Wed, 20 Jul 2022 08:13:28 +0800 Subject: [PATCH 574/817] [build] Increase timeout value when installing SONiC image on kvm (#11191) --- install_sonic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_sonic.py b/install_sonic.py index 01785393f4eb..2397a6d61646 100755 --- a/install_sonic.py +++ b/install_sonic.py @@ -23,7 +23,7 @@ def main(): i = 0 while True: try: - p = pexpect.spawn("telnet 127.0.0.1 {}".format(args.p), timeout=600, logfile=sys.stdout, encoding='utf-8') + p = pexpect.spawn("telnet 127.0.0.1 {}".format(args.p), timeout=1200, logfile=sys.stdout, encoding='utf-8') break except Exception as e: print(str(e)) From 07dbc149dff511687184b9daeb3906910a8dd954 Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Tue, 19 Jul 2022 20:36:16 -0700 Subject: [PATCH 575/817] [Arista] Add missing configs for 720DT-48S (#11362) * Why I did it Followup to #10656. This change adds the remaining configs for the 720DT-48S platform. * How I did it Adds the following: gearbox_config.json and other gearbox-related config files, to enable traffic on external PHY ports (Ethernet0-23) sensors.conf pcie.yaml Also add missing facts in platform.json * How to verify it show interfaces status shows links up on interfaces Ethernet0-23 traffic flows with no errors on interfaces Ethernet0-23 Note: above testing depends on Add gbsyncd container for broncos #11154 and [orchagent]: Enhance initSaiPhyApi sonic-swss#2367, as well as having the appropriate PAI driver. Co-authored-by: Samuel Angebault --- .../Arista-720DT-48S/context_config.json | 130 +++++ .../Arista-720DT-48S/gearbox_config.json | 486 ++++++++++++++++++ .../Arista-720DT-48S/phy0_config.json | 38 ++ .../Arista-720DT-48S/phy10_config.json | 38 ++ .../Arista-720DT-48S/phy11_config.json | 38 ++ .../Arista-720DT-48S/phy12_config.json | 38 ++ .../Arista-720DT-48S/phy13_config.json | 38 ++ .../Arista-720DT-48S/phy14_config.json | 38 ++ .../Arista-720DT-48S/phy15_config.json | 38 ++ .../Arista-720DT-48S/phy16_config.json | 38 ++ .../Arista-720DT-48S/phy18_config.json | 38 ++ .../Arista-720DT-48S/phy19_config.json | 38 ++ .../Arista-720DT-48S/phy1_config.json | 38 ++ .../Arista-720DT-48S/phy20_config.json | 38 ++ .../Arista-720DT-48S/phy21_config.json | 38 ++ .../Arista-720DT-48S/phy22_config.json | 38 ++ .../Arista-720DT-48S/phy23_config.json | 38 ++ .../Arista-720DT-48S/phy24_config.json | 38 ++ .../Arista-720DT-48S/phy25_config.json | 38 ++ .../Arista-720DT-48S/phy2_config.json | 38 ++ .../Arista-720DT-48S/phy3_config.json | 38 ++ .../Arista-720DT-48S/phy4_config.json | 38 ++ .../Arista-720DT-48S/phy5_config.json | 38 ++ .../Arista-720DT-48S/phy6_config.json | 38 ++ .../Arista-720DT-48S/phy7_config.json | 38 ++ .../Arista-720DT-48S/phy9_config.json | 38 ++ .../Arista-720DT-48S/pikez.bcm | 85 +++ .../Arista-720DT-48S/psai.profile | 1 + .../x86_64-arista_720dt_48s/gbsyncd.ini | 1 + .../arista/x86_64-arista_720dt_48s/pcie.yaml | 148 ++++++ .../x86_64-arista_720dt_48s/platform.json | 42 +- .../x86_64-arista_720dt_48s/sensors.conf | 18 + .../td3x2-a720dt-48s-flex.config.bcm | 48 +- 33 files changed, 1843 insertions(+), 28 deletions(-) create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/context_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/gearbox_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy0_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy10_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy11_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy12_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy13_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy14_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy15_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy16_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy18_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy19_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy1_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy20_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy21_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy22_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy23_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy25_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy2_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy3_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy4_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy5_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy6_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy7_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy9_config.json create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/pikez.bcm create mode 100644 device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/psai.profile create mode 100644 device/arista/x86_64-arista_720dt_48s/gbsyncd.ini create mode 100644 device/arista/x86_64-arista_720dt_48s/pcie.yaml create mode 100644 device/arista/x86_64-arista_720dt_48s/sensors.conf diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/context_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/context_config.json new file mode 100644 index 000000000000..5316220b01e0 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/context_config.json @@ -0,0 +1,130 @@ +{ + "CONTEXTS": [ + { + "guid" : 0, + "name" : "asic0", + "dbAsic" : "ASIC_DB", + "dbCounters" : "COUNTERS_DB", + "dbFlex": "FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable" : false, + "zmq_endpoint": "tcp://127.0.0.1:5555", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5556", + "switches": [ + { + "index" : 0, + "hwinfo" : "" + } + ] + }, + { + "guid" : 1, + "name" : "phys", + "dbAsic" : "GB_ASIC_DB", + "dbCounters" : "GB_COUNTERS_DB", + "dbFlex": "GB_FLEX_COUNTER_DB", + "dbState" : "STATE_DB", + "zmq_enable" : false, + "zmq_endpoint": "tcp://127.0.0.1:5565", + "zmq_ntf_endpoint": "tcp://127.0.0.1:5566", + "switches": [ + { + "index" : 0, + "hwinfo" : "0" + }, + { + "index" : 1, + "hwinfo" : "1" + }, + { + "index" : 2, + "hwinfo" : "2" + }, + { + "index" : 3, + "hwinfo" : "3" + }, + { + "index" : 4, + "hwinfo" : "4" + }, + { + "index" : 5, + "hwinfo" : "5" + }, + { + "index" : 6, + "hwinfo" : "6" + }, + { + "index" : 7, + "hwinfo" : "7" + }, + { + "index" : 8, + "hwinfo" : "9" + }, + { + "index" : 9, + "hwinfo" : "10" + }, + { + "index" : 10, + "hwinfo" : "11" + }, + { + "index" : 11, + "hwinfo" : "12" + }, + { + "index" : 12, + "hwinfo" : "13" + }, + { + "index" : 13, + "hwinfo" : "14" + }, + { + "index" : 14, + "hwinfo" : "15" + }, + { + "index" : 15, + "hwinfo" : "16" + }, + { + "index" : 16, + "hwinfo" : "18" + }, + { + "index" : 17, + "hwinfo" : "19" + }, + { + "index" : 18, + "hwinfo" : "20" + }, + { + "index" : 19, + "hwinfo" : "21" + }, + { + "index" : 20, + "hwinfo" : "22" + }, + { + "index" : 21, + "hwinfo" : "23" + }, + { + "index" : 22, + "hwinfo" : "24" + }, + { + "index" : 23, + "hwinfo" : "25" + } + ] + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/gearbox_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/gearbox_config.json new file mode 100644 index 000000000000..3b3c2b4761b7 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/gearbox_config.json @@ -0,0 +1,486 @@ +{ + "phys": [ + { + "phy_id": 0, + "name": "phy0", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy0_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "0" + }, + { + "phy_id": 1, + "name": "phy1", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy1_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "1" + }, + { + "phy_id": 2, + "name": "phy2", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy2_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "2" + }, + { + "phy_id": 3, + "name": "phy3", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy3_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "3" + }, + { + "phy_id": 4, + "name": "phy4", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy4_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "4" + }, + { + "phy_id": 5, + "name": "phy5", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy5_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "5" + }, + { + "phy_id": 6, + "name": "phy6", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy6_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "6" + }, + { + "phy_id": 7, + "name": "phy7", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy7_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "7" + }, + { + "phy_id": 9, + "name": "phy9", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy9_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "9" + }, + { + "phy_id": 10, + "name": "phy10", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy10_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "10" + }, + { + "phy_id": 11, + "name": "phy11", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy11_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "11" + }, + { + "phy_id": 12, + "name": "phy12", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy12_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "12" + }, + { + "phy_id": 13, + "name": "phy13", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy13_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "13" + }, + { + "phy_id": 14, + "name": "phy14", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy14_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "14" + }, + { + "phy_id": 15, + "name": "phy15", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy15_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "15" + }, + { + "phy_id": 16, + "name": "phy16", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy16_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "16" + }, + { + "phy_id": 18, + "name": "phy18", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy18_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "18" + }, + { + "phy_id": 19, + "name": "phy19", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy19_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "19" + }, + { + "phy_id": 20, + "name": "phy20", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy20_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "20" + }, + { + "phy_id": 21, + "name": "phy21", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy21_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "21" + }, + { + "phy_id": 22, + "name": "phy22", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy22_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "22" + }, + { + "phy_id": 23, + "name": "phy23", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy23_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "23" + }, + { + "phy_id": 24, + "name": "phy24", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy24_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "24" + }, + { + "phy_id": 25, + "name": "phy25", + "address": "255", + "lib_name": "", + "firmware_path": "", + "config_file": "/usr/share/sonic/hwsku/phy25_config.json", + "sai_init_config_file": "", + "phy_access": "mdio", + "bus_id": 0, + "context_id": 1, + "hwinfo": "25" + } + ], + "interfaces": [ + { + "name": "Ethernet0", + "index": 1, + "phy_id": 0, + "system_lanes": [1], + "line_lanes": [0] + }, + { + "name": "Ethernet1", + "index": 2, + "phy_id": 1, + "system_lanes": [3], + "line_lanes": [2] + }, + { + "name": "Ethernet2", + "index": 3, + "phy_id": 2, + "system_lanes": [5], + "line_lanes": [4] + }, + { + "name": "Ethernet3", + "index": 4, + "phy_id": 3, + "system_lanes": [7], + "line_lanes": [6] + }, + { + "name": "Ethernet4", + "index": 5, + "phy_id": 4, + "system_lanes": [9], + "line_lanes": [8] + }, + { + "name": "Ethernet5", + "index": 6, + "phy_id": 5, + "system_lanes": [11], + "line_lanes": [10] + }, + { + "name": "Ethernet6", + "index": 7, + "phy_id": 6, + "system_lanes": [13], + "line_lanes": [12] + }, + { + "name": "Ethernet7", + "index": 8, + "phy_id": 7, + "system_lanes": [15], + "line_lanes": [14] + }, + { + "name": "Ethernet8", + "index": 9, + "phy_id": 9, + "system_lanes": [17], + "line_lanes": [16] + }, + { + "name": "Ethernet9", + "index": 10, + "phy_id": 10, + "system_lanes": [19], + "line_lanes": [18] + }, + { + "name": "Ethernet10", + "index": 11, + "phy_id": 11, + "system_lanes": [21], + "line_lanes": [20] + }, + { + "name": "Ethernet11", + "index": 12, + "phy_id": 12, + "system_lanes": [23], + "line_lanes": [22] + }, + { + "name": "Ethernet12", + "index": 13, + "phy_id": 13, + "system_lanes": [25], + "line_lanes": [24] + }, + { + "name": "Ethernet13", + "index": 14, + "phy_id": 14, + "system_lanes": [27], + "line_lanes": [26] + }, + { + "name": "Ethernet14", + "index": 15, + "phy_id": 15, + "system_lanes": [29], + "line_lanes": [28] + }, + { + "name": "Ethernet15", + "index": 16, + "phy_id": 16, + "system_lanes": [31], + "line_lanes": [30] + }, + { + "name": "Ethernet16", + "index": 17, + "phy_id": 18, + "system_lanes": [33], + "line_lanes": [32] + }, + { + "name": "Ethernet17", + "index": 18, + "phy_id": 19, + "system_lanes": [35], + "line_lanes": [34] + }, + { + "name": "Ethernet18", + "index": 19, + "phy_id": 20, + "system_lanes": [37], + "line_lanes": [36] + }, + { + "name": "Ethernet19", + "index": 20, + "phy_id": 21, + "system_lanes": [39], + "line_lanes": [38] + }, + { + "name": "Ethernet20", + "index": 21, + "phy_id": 22, + "system_lanes": [41], + "line_lanes": [40] + }, + { + "name": "Ethernet21", + "index": 22, + "phy_id": 23, + "system_lanes": [43], + "line_lanes": [42] + }, + { + "name": "Ethernet22", + "index": 23, + "phy_id": 24, + "system_lanes": [45], + "line_lanes": [44] + }, + { + "name": "Ethernet23", + "index": 24, + "phy_id": 25, + "system_lanes": [47], + "line_lanes": [46] + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy0_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy0_config.json new file mode 100644 index 000000000000..2b5b785d008f --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy0_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 1, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy10_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy10_config.json new file mode 100644 index 000000000000..7e2d6d25ad6a --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy10_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 10, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy11_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy11_config.json new file mode 100644 index 000000000000..31f7a5dd8e9b --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy11_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 11, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy12_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy12_config.json new file mode 100644 index 000000000000..4afd547b10d1 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy12_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 12, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy13_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy13_config.json new file mode 100644 index 000000000000..c5734b9d77ac --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy13_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 13, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy14_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy14_config.json new file mode 100644 index 000000000000..1f7c841984fa --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy14_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 14, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy15_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy15_config.json new file mode 100644 index 000000000000..0de2ef9b3095 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy15_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 200, + "local_lane_id": 0, + "system_side": true, + "tx_polarity": 0, + "rx_polarity": 0, + "line_tx_lanemap": 0, + "line_rx_lanemap": 0, + "line_to_system_lanemap": 0, + "mdio_addr": "0x00" + } + ], + "ports": [ + { + "index": 15, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy16_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy16_config.json new file mode 100644 index 000000000000..6b6dc2b03fdf --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy16_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 16, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy18_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy18_config.json new file mode 100644 index 000000000000..a11c2e5663ae --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy18_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 17, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy19_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy19_config.json new file mode 100644 index 000000000000..203365ff0e29 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy19_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 18, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy1_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy1_config.json new file mode 100644 index 000000000000..f697ad669a8e --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy1_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 2, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy20_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy20_config.json new file mode 100644 index 000000000000..94d38584a751 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy20_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 19, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy21_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy21_config.json new file mode 100644 index 000000000000..ed4dce3b4a28 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy21_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 20, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy22_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy22_config.json new file mode 100644 index 000000000000..6b21533a6531 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy22_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 21, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy23_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy23_config.json new file mode 100644 index 000000000000..2a781875b0b2 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy23_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 22, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json new file mode 100644 index 000000000000..2a781875b0b2 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 22, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy25_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy25_config.json new file mode 100644 index 000000000000..9215ffcf4688 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy25_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 24, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy2_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy2_config.json new file mode 100644 index 000000000000..74e55878ea89 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy2_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 3, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy3_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy3_config.json new file mode 100644 index 000000000000..078398a4ff45 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy3_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 4, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy4_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy4_config.json new file mode 100644 index 000000000000..26b9f8f1bdaa --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy4_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 5, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy5_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy5_config.json new file mode 100644 index 000000000000..0681725b7c9e --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy5_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 6, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy6_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy6_config.json new file mode 100644 index 000000000000..0ece0526456d --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy6_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 7, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy7_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy7_config.json new file mode 100644 index 000000000000..4cc38410efe0 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy7_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 8, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy9_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy9_config.json new file mode 100644 index 000000000000..2ed59839a977 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy9_config.json @@ -0,0 +1,38 @@ +{ + "lanes": [ + { + "index": 255, + "local_lane_id": 255, + "system_side": true, + "tx_polarity": 255, + "rx_polarity": 255, + "line_tx_lanemap": 255, + "line_rx_lanemap": 255, + "line_to_system_lanemap": 255, + "mdio_addr": "" + } + ], + "ports": [ + { + "index": 9, + "mdio_addr": "", + "system_speed": 1000, + "system_fec": "none", + "system_auto_neg": false, + "system_loopback": "none", + "system_training": false, + "line_speed": 1000, + "line_fec": "none", + "line_auto_neg": false, + "line_loopback": "none", + "line_training": false, + "line_media_type": "copper", + "line_intf_type": "none", + "line_adver_speed": [], + "line_adver_fec": [], + "line_adver_auto_neg": false, + "line_adver_asym_pause": false, + "line_adver_media_type": "copper" + } + ] +} diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/pikez.bcm b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/pikez.bcm new file mode 100644 index 000000000000..7e97462c4c78 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/pikez.bcm @@ -0,0 +1,85 @@ +### PHY CONFIGURATION FILE +### Please refer to config_file_format.txt in the top level folder for configuration file format + +### PHY CONFIGURATIONS +phy_init_config_chip_id:0 = 54182 +phy_init_config_chip_id:1 = 54182 +phy_init_config_chip_id:2 = 54182 +phy_init_config_chip_id:3 = 54182 +phy_init_config_chip_id:4 = 54182 +phy_init_config_chip_id:5 = 54182 +phy_init_config_chip_id:6 = 54182 +phy_init_config_chip_id:7 = 54182 +phy_init_config_chip_id:9 = 54182 +phy_init_config_chip_id:10 = 54182 +phy_init_config_chip_id:11 = 54182 +phy_init_config_chip_id:12 = 54182 +phy_init_config_chip_id:13 = 54182 +phy_init_config_chip_id:14 = 54182 +phy_init_config_chip_id:15 = 54182 +phy_init_config_chip_id:16 = 54182 +phy_init_config_chip_id:18 = 54182 +phy_init_config_chip_id:19 = 54182 +phy_init_config_chip_id:20 = 54182 +phy_init_config_chip_id:21 = 54182 +phy_init_config_chip_id:22 = 54182 +phy_init_config_chip_id:23 = 54182 +phy_init_config_chip_id:24 = 54182 +phy_init_config_chip_id:25 = 54182 + +### LANE CONFIGURATIONS +# Line side lanes +phy_lane_property:0 = 0, 0, 0, 0, 0, 0, 0 +phy_lane_property:2 = 1, 0, 1, 0, 0, 0, 0 +phy_lane_property:4 = 2, 0, 2, 0, 0, 0, 0 +phy_lane_property:6 = 3, 0, 3, 0, 0, 0, 0 +phy_lane_property:8 = 4, 0, 4, 0, 0, 0, 0 +phy_lane_property:10 = 5, 0, 5, 0, 0, 0, 0 +phy_lane_property:12 = 6, 0, 6, 0, 0, 0, 0 +phy_lane_property:14 = 7, 0, 7, 0, 0, 0, 0 + +phy_lane_property:16 = 9, 0, 0, 0, 0, 0, 0 +phy_lane_property:18 = 10, 0, 1, 0, 0, 0, 0 +phy_lane_property:20 = 11, 0, 2, 0, 0, 0, 0 +phy_lane_property:22 = 12, 0, 3, 0, 0, 0, 0 +phy_lane_property:24 = 13, 0, 4, 0, 0, 0, 0 +phy_lane_property:26 = 14, 0, 5, 0, 0, 0, 0 +phy_lane_property:28 = 15, 0, 6, 0, 0, 0, 0 +phy_lane_property:30 = 16, 0, 7, 0, 0, 0, 0 + +phy_lane_property:32 = 18, 0, 0, 0, 0, 0, 0 +phy_lane_property:34 = 19, 0, 1, 0, 0, 0, 0 +phy_lane_property:36 = 20, 0, 2, 0, 0, 0, 0 +phy_lane_property:38 = 21, 0, 3, 0, 0, 0, 0 +phy_lane_property:40 = 22, 0, 4, 0, 0, 0, 0 +phy_lane_property:42 = 23, 0, 5, 0, 0, 0, 0 +phy_lane_property:44 = 24, 0, 6, 0, 0, 0, 0 +phy_lane_property:46 = 25, 0, 7, 0, 0, 0, 0 + +# System side lanes +phy_lane_property:1 = 0, 1, 0, 0, 0, 0, 0 +phy_lane_property:3 = 1, 1, 1, 0, 0, 0, 0 +phy_lane_property:5 = 2, 1, 2, 0, 0, 0, 0 +phy_lane_property:7 = 3, 1, 3, 0, 0, 0, 0 +phy_lane_property:9 = 4, 1, 4, 0, 0, 0, 0 +phy_lane_property:11 = 5, 1, 5, 0, 0, 0, 0 +phy_lane_property:13 = 6, 1, 6, 0, 0, 0, 0 +phy_lane_property:15 = 7, 1, 7, 0, 0, 0, 0 + +phy_lane_property:17 = 9, 1, 0, 0, 0, 0, 0 +phy_lane_property:19 = 10, 1, 1, 0, 0, 0, 0 +phy_lane_property:21 = 11, 1, 2, 0, 0, 0, 0 +phy_lane_property:23 = 12, 1, 3, 0, 0, 0, 0 +phy_lane_property:25 = 13, 1, 4, 0, 0, 0, 0 +phy_lane_property:27 = 14, 1, 5, 0, 0, 0, 0 +phy_lane_property:29 = 15, 1, 6, 0, 0, 0, 0 +phy_lane_property:31 = 16, 1, 7, 0, 0, 0, 0 + +phy_lane_property:33 = 18, 1, 0, 0, 0, 0, 0 +phy_lane_property:35 = 19, 1, 1, 0, 0, 0, 0 +phy_lane_property:37 = 20, 1, 2, 0, 0, 0, 0 +phy_lane_property:39 = 21, 1, 3, 0, 0, 0, 0 +phy_lane_property:41 = 22, 1, 4, 0, 0, 0, 0 +phy_lane_property:43 = 23, 1, 5, 0, 0, 0, 0 +phy_lane_property:45 = 24, 1, 6, 0, 0, 0, 0 +phy_lane_property:47 = 25, 1, 7, 0, 0, 0, 0 diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/psai.profile b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/psai.profile new file mode 100644 index 000000000000..b6f9a712c833 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/psai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/pikez.bcm diff --git a/device/arista/x86_64-arista_720dt_48s/gbsyncd.ini b/device/arista/x86_64-arista_720dt_48s/gbsyncd.ini new file mode 100644 index 000000000000..c3fc11f91114 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/gbsyncd.ini @@ -0,0 +1 @@ +platform=gbsyncd-broncos diff --git a/device/arista/x86_64-arista_720dt_48s/pcie.yaml b/device/arista/x86_64-arista_720dt_48s/pcie.yaml new file mode 100644 index 000000000000..bda6ac688c7a --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/pcie.yaml @@ -0,0 +1,148 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 15d0 + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Root Complex' +- bus: '00' + dev: '00' + fn: '2' + id: 15d1 + name: 'IOMMU: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 IOMMU' +- bus: '00' + dev: '01' + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: '01' + fn: '1' + id: 15d3 + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 PCIe GPP Bridge + [6:0]' +- bus: '00' + dev: 08 + fn: '0' + id: '1452' + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) + PCIe Dummy Host Bridge' +- bus: '00' + dev: 08 + fn: '1' + id: 15db + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Internal PCIe + GPP Bridge 0 to Bus A' +- bus: '00' + dev: 08 + fn: '2' + id: 15dc + name: 'PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Internal PCIe + GPP Bridge 0 to Bus B' +- bus: '00' + dev: '14' + fn: '0' + id: 790b + name: 'SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 61)' +- bus: '00' + dev: '14' + fn: '3' + id: 790e + name: 'ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)' +- bus: '00' + dev: '18' + fn: '0' + id: 15e8 + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 0' +- bus: '00' + dev: '18' + fn: '1' + id: 15e9 + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 1' +- bus: '00' + dev: '18' + fn: '2' + id: 15ea + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 2' +- bus: '00' + dev: '18' + fn: '3' + id: 15eb + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 3' +- bus: '00' + dev: '18' + fn: '4' + id: 15ec + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 4' +- bus: '00' + dev: '18' + fn: '5' + id: 15ed + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 5' +- bus: '00' + dev: '18' + fn: '6' + id: 15ee + name: 'Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function + 6' +- bus: '00' + dev: '18' + fn: '7' + id: '0001' + name: 'Host bridge: Arista Networks, Inc. Device 0001' +- bus: '01' + dev: '00' + fn: '0' + id: b274 + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device b274 (rev 02)' +- bus: '02' + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function' +- bus: '02' + dev: '00' + fn: '2' + id: 15df + name: 'Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models + 10h-1fh) Platform Security Processor' +- bus: '02' + dev: '00' + fn: '3' + id: 15e5 + name: 'USB controller: Advanced Micro Devices, Inc. [AMD] Raven2 USB 3.1' +- bus: '02' + dev: '00' + fn: '5' + id: 15e2 + name: 'Multimedia controller: Advanced Micro Devices, Inc. [AMD] Raven/Raven2/FireFlight/Renoir + Audio Processor' +- bus: '02' + dev: '00' + fn: '6' + id: 15e3 + name: 'Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) + HD Audio Controller' +- bus: '02' + dev: '00' + fn: '7' + id: 15e6 + name: 'Non-VGA unclassified device: Advanced Micro Devices, Inc. [AMD] Raven/Raven2/Renoir + Non-Sensor Fusion Hub KMDF driver' +- bus: '03' + dev: '00' + fn: '0' + id: 145a + name: 'Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] + Zeppelin/Raven/Raven2 PCIe Dummy Function (rev 51)' +- bus: '03' + dev: '00' + fn: '1' + id: '1458' + name: 'Ethernet controller: Advanced Micro Devices, Inc. [AMD] Device 1458' diff --git a/device/arista/x86_64-arista_720dt_48s/platform.json b/device/arista/x86_64-arista_720dt_48s/platform.json index add21ae911bc..90fa1ea1f57c 100644 --- a/device/arista/x86_64-arista_720dt_48s/platform.json +++ b/device/arista/x86_64-arista_720dt_48s/platform.json @@ -2,19 +2,53 @@ "chassis": { "name": "CCS-720DT-48S", "components": [], - "fans": [], + "fans": [ + { + "name": "fan1" + }, + { + "name": "fan2" + } + ], "fan_drawers": [], "psus": [ { "name": "psu1", - "fans": [] + "current": false, + "fans": [], + "max_power": false, + "power": false, + "temperature": false, + "voltage": false, + "voltage_high_threshold": false, + "voltage_low_threshold": false }, { "name": "psu2", - "fans": [] + "current": false, + "fans": [], + "max_power": false, + "power": false, + "temperature": false, + "voltage": false, + "voltage_high_threshold": false, + "voltage_low_threshold": false + } + ], + "thermals": [ + { + "name": "Cpu temp sensor" + }, + { + "name": "Psu temp sensor" + }, + { + "name": "SFP+ connector temp sensor" + }, + { + "name": "MAC external temp sensor" } ], - "thermals": [], "sfps": [ { "name": "ethernet1" diff --git a/device/arista/x86_64-arista_720dt_48s/sensors.conf b/device/arista/x86_64-arista_720dt_48s/sensors.conf new file mode 100644 index 000000000000..bca200a4a469 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/sensors.conf @@ -0,0 +1,18 @@ +# autogenerated by arista + +bus "i2c-1" "Synopsys DesignWare I2C adapter" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +chip "tmp75-i2c-1-4a" + label temp1 "Psu temp sensor" + set temp1_max 75 + +chip "tmp75-i2c-1-4b" + label temp1 "SFP+ connector temp sensor" + set temp1_max 75 + +chip "tmp75-i2c-1-4c" + label temp1 "MAC external temp sensor" + set temp1_max 75 diff --git a/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm index 7469c6dbca21..a89c3e442753 100644 --- a/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm +++ b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm @@ -219,30 +219,30 @@ portmap_56.0=64:10 port_flex_enable.0=1 port_gmii_mode{25}=1 port_gmii_mode{41}=1 -port_init_autoneg_1.0=0 -port_init_autoneg_2.0=0 -port_init_autoneg_3.0=0 -port_init_autoneg_4.0=0 -port_init_autoneg_5.0=0 -port_init_autoneg_6.0=0 -port_init_autoneg_7.0=0 -port_init_autoneg_8.0=0 -port_init_autoneg_9.0=0 -port_init_autoneg_10.0=0 -port_init_autoneg_11.0=0 -port_init_autoneg_12.0=0 -port_init_autoneg_13.0=0 -port_init_autoneg_14.0=0 -port_init_autoneg_15.0=0 -port_init_autoneg_16.0=0 -port_init_autoneg_17.0=0 -port_init_autoneg_18.0=0 -port_init_autoneg_19.0=0 -port_init_autoneg_20.0=0 -port_init_autoneg_21.0=0 -port_init_autoneg_22.0=0 -port_init_autoneg_23.0=0 -port_init_autoneg_24.0=0 +port_init_autoneg_1.0=1 +port_init_autoneg_2.0=1 +port_init_autoneg_3.0=1 +port_init_autoneg_4.0=1 +port_init_autoneg_5.0=1 +port_init_autoneg_6.0=1 +port_init_autoneg_7.0=1 +port_init_autoneg_8.0=1 +port_init_autoneg_9.0=1 +port_init_autoneg_10.0=1 +port_init_autoneg_11.0=1 +port_init_autoneg_12.0=1 +port_init_autoneg_13.0=1 +port_init_autoneg_14.0=1 +port_init_autoneg_15.0=1 +port_init_autoneg_16.0=1 +port_init_autoneg_17.0=1 +port_init_autoneg_18.0=1 +port_init_autoneg_19.0=1 +port_init_autoneg_20.0=1 +port_init_autoneg_21.0=1 +port_init_autoneg_22.0=1 +port_init_autoneg_23.0=1 +port_init_autoneg_24.0=1 port_init_autoneg_53.0=0 port_init_autoneg_54.0=0 port_init_autoneg_55.0=0 From 0703f3175ff96c21b5851725b2b564f7da3ba55c Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 20 Jul 2022 05:38:10 +0200 Subject: [PATCH 576/817] [Arista] Update platform library (#11439) Fix an issue with front panel port led introduced in previous PR Implement status led for linecards Implement full power cycle for linecards Improve reboot cause reporting for Ucd devices Add fan support for PikeZ Miscellaneous fixes and improvements --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 5624b588caf8..455c983efa18 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 5624b588caf88641c04eaf79821a29138b7adf88 +Subproject commit 455c983efa18c6c346e776ee69c7abd54207c6c5 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 5624b588caf8..455c983efa18 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 5624b588caf88641c04eaf79821a29138b7adf88 +Subproject commit 455c983efa18c6c346e776ee69c7abd54207c6c5 From c47272d7adfea29b82de2964f526337e50884884 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:51:38 +0800 Subject: [PATCH 577/817] Update sonic-swss-common submodule (#11470) #### Why I did it Submodule update for sonic-swss-common with following change: 597b022 Add SonicDBConfig.getInstanceList() API (#639) 7073dc6 add table name for vlan_stacking (#646) 7e39f31 Add SonicV2Connector::set method for int value. (#648) 154cc9c Improve hset and hdel performance with RedisPipeline. (#647) #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 #### Description for the changelog Submodule update for sonic-swss-common with following change: 597b022 Add SonicDBConfig.getInstanceList() API (#639) 7073dc6 add table name for vlan_stacking (#646) 7e39f31 Add SonicV2Connector::set method for int value. (#648) 154cc9c Improve hset and hdel performance with RedisPipeline. (#647) #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index c30c34f7edea..154cc9c05dd4 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit c30c34f7edea01b0391e615d9a24e9e24d07a142 +Subproject commit 154cc9c05dd44cdb179f802f78ae4344be50ccce From 8f4a1b7b85ae8f3681f0f3d94c9a0e61955e5e57 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Wed, 20 Jul 2022 14:48:15 +0800 Subject: [PATCH 578/817] [Mellanox] Support Mellanox-SN4600C-C64 as T1 switch in dual-ToR scenario (#11261) - Why I did it Support Mellanox-SN4600C-C64 as T1 switch in dual-ToR scenario This is to port #11032 and #11299 from 202012 to master. Support additional queue and PG in buffer templates, including both traditional and dynamic model Support mapping DSCP 2/6 to lossless traffic in the QoS template. Add macros to generate additional lossless PG in the dynamic model Adjust the order in which the generic/dedicated (with additional lossless queues) macros are checked and called to generate buffer tables in common template buffers_config.j2 Buffer tables are rendered via using macros. Both generic and dedicated macros are defined on our platform. Currently, the generic one is called as long as it is defined, which causes the generic one always being called on our platform. To avoid it, the dedicated macrio is checked and called first and then the generic ones. Support MAP_PFC_PRIORITY_TO_PRIORITY_GROUP on ports with additional lossless queues. On Mellanox-SN4600C-C64, buffer configuration for t1 is calculated as: 40 * 100G downlink ports with 4 lossless PGs/queues, 1 lossy PG, and 3 lossy queues 16 * 100G uplink ports with 2 lossless PGs/queues, 1 lossy PG, and 5 lossy queues Signed-off-by: Stephen Sun --- .../buffers_defaults_objects.j2 | 66 +- .../buffers_defaults_t1.j2 | 15 + .../Mellanox-SN4600C-C64/qos.json.j2 | 176 +- files/build_templates/buffers_config.j2 | 16 +- files/build_templates/qos_config.j2 | 16 + ...anox-4600c-t1-minigraph-remap-disabled.xml | 2460 ++++++++++++++++ .../sample-mellanox-4600c-t1-minigraph.xml | 2468 +++++++++++++++++ ...llanox4600c-t1-dynamic-remap-disabled.json | 1481 ++++++++++ .../py3/buffers-mellanox4600c-t1-dynamic.json | 1660 +++++++++++ ...ffers-mellanox4600c-t1-remap-disabled.json | 1306 +++++++++ .../py3/buffers-mellanox4600c-t1.json | 1425 ++++++++++ .../qos-mellanox4600c-c64-remap-disabled.json | 1005 +++++++ .../py3/qos-mellanox4600c-c64.json | 1111 ++++++++ src/sonic-config-engine/tests/test_j2files.py | 17 +- 14 files changed, 13209 insertions(+), 13 deletions(-) mode change 120000 => 100644 device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 create mode 100644 src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph-remap-disabled.xml create mode 100644 src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64-remap-disabled.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64.json diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 index 92014175581c..e960447574c5 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 @@ -124,24 +124,55 @@ } {%- endmacro %} -{%- macro generate_queue_buffers(port_names_active, port_names_inactive) %} +{%- macro generate_queue_buffers_with_extra_lossless_queues(port_names_active, port_names_extra_queues, port_names_inactive) %} "BUFFER_QUEUE": { +{% set q_loop = namespace(last_valid=false) %} {% for port in port_names_active.split(',') %} +{% if port not in port_names_extra_queues.split(',') %} "{{ port }}|3-4": { "profile" : "egress_lossless_profile" }, +{% endif %} {% endfor %} {% for port in port_names_active.split(',') %} +{% if port not in port_names_extra_queues.split(',') %} "{{ port }}|0-2": { "profile" : "q_lossy_profile" }, +{% endif %} {% endfor %} {% for port in port_names_active.split(',') %} +{% if port not in port_names_extra_queues.split(',') %} "{{ port }}|5-6": { "profile" : "q_lossy_profile" }{% if not loop.last %},{% endif %} +{% set q_loop.last_valid = true %} +{% else %} +{% set q_loop.last_valid = false %} +{% endif %} +{% endfor %} +{% if port_names_extra_queues|length > 0 %} +{% if q_loop.last_valid %},{% endif %} +{% for port in port_names_extra_queues.split(',') %} + "{{ port }}|0-1": { + "profile" : "q_lossy_profile" + }, + "{{ port }}|2-4": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|5": { + "profile" : "q_lossy_profile" + }, + "{{ port }}|6": { + "profile" : "egress_lossless_profile" + }, + "{{ port }}|7": { + "profile" : "q_lossy_profile" + }{% if not loop.last %},{% endif %} + {% endfor %} +{% endif %} {% if port_names_inactive|length > 0 %} , {% if dynamic_mode is defined %} @@ -183,9 +214,15 @@ } {%- endmacro %} -{%- macro generate_pg_profiles(port_names_active, port_names_inactive) %} +{%- macro generate_queue_buffers(port_names_active, port_names_inactive) %} +{{ generate_queue_buffers_with_extra_lossless_queues(port_names_active, "", port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_pg_profiles_with_extra_lossless_pgs(port_names_active, port_names_extra_pgs, port_names_inactive) %} "BUFFER_PG": { +{% set pg_loop = namespace(last_valid=false) %} {% for port in port_names_active.split(',') %} +{% if port not in port_names_extra_pgs.split(',') %} {% if dynamic_mode is defined %} "{{ port }}|3-4": { "profile" : "NULL" @@ -195,7 +232,28 @@ "profile" : "ingress_lossy_profile" }{% if not loop.last %},{% endif %} +{% set pg_loop.last_valid = true %} +{% else %} +{% set pg_loop.last_valid = false %} +{% endif %} {% endfor %} +{% if port_names_extra_pgs|length > 0 %} +{% if pg_loop.last_valid %},{% endif %} +{% for port in port_names_extra_pgs.split(',') %} +{% if dynamic_mode is defined %} + "{{ port }}|2-4": { + "profile" : "NULL" + }, + "{{ port }}|6": { + "profile" : "NULL" + }, +{% endif %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} +{% endif %} {% if port_names_inactive|length > 0 %} {%- for port in port_names_inactive.split(',') %} {%- if loop.first -%},{%- endif -%} @@ -216,3 +274,7 @@ {% endif %} } {%- endmacro %} + +{%- macro generate_pg_profiles(port_names_active, port_names_inactive) %} +{{ generate_pg_profiles_with_extra_lossless_pgs(port_names_active, "", port_names_inactive) }} +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/buffers_defaults_t1.j2 index d77d5cc1f136..12891e954859 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/buffers_defaults_t1.j2 @@ -15,10 +15,17 @@ limitations under the License. #} {% set default_cable = '5m' %} +{%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) -%} +{% set ingress_lossless_pool_size = '44130304' %} +{% set ingress_lossless_pool_xoff = '8790016' %} +{% set egress_lossless_pool_size = '60817392' %} +{% set egress_lossy_pool_size = '44130304' %} +{%- else -%} {% set ingress_lossless_pool_size = '48332800' %} {% set ingress_lossless_pool_xoff = '5275648' %} {% set egress_lossless_pool_size = '60817392' %} {% set egress_lossy_pool_size = '48332800' %} +{%- endif -%} {% import 'buffers_defaults_objects.j2' as defs with context %} @@ -30,10 +37,18 @@ {{ defs.generate_profile_lists(port_names_active, port_names_inactive) }} {%- endmacro %} +{%- macro generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) %} +{{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names_active, port_names_extra_queues, port_names_inactive) }} +{%- endmacro %} + {%- macro generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) %} {{ defs.generate_queue_buffers(port_names_active, port_names_inactive) }} {%- endmacro %} +{%- macro generate_pg_profiles_with_extra_lossless_pgs_with_inactive_ports(port_names_active, port_names_extra_pgs, port_names_inactive) %} +{{ defs.generate_pg_profiles_with_extra_lossless_pgs(port_names_active, port_names_extra_pgs, port_names_inactive) }} +{%- endmacro %} + {%- macro generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) %} {{ defs.generate_pg_profiles(port_names_active, port_names_inactive) }} {%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 deleted file mode 120000 index eccf286dc879..000000000000 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 new file mode 100644 index 000000000000..6134402aad53 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64/qos.json.j2 @@ -0,0 +1,175 @@ +{# + Copyright (c) 2020-2021 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} +{% set different_dscp_to_tc_map = true %} +{%- macro generate_dscp_to_tc_map() %} + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + }, + "AZURE_UPLINK": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, +{%- endmacro %} +{%- macro generate_tc_to_pg_map() %} + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0" + } + }, +{%- endmacro %} +{%- macro generate_global_dscp_to_tc_map() %} +{# This is an empty macro since the global DSCP_TO_TC map is not required #} +{%- endmacro %} + +{% endif %} + +{%- include 'qos_config.j2' %} diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index f03a7f9f63e3..0a72e325824a 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -168,14 +168,16 @@ def {{ defs.generate_profile_lists_with_inactive_ports(port_names_active, port_names_inactive) }}, {% endif %} -{%- if defs.generate_pg_profils is defined %} -{{ defs.generate_pg_profils(port_names_active) }} +{% if (defs.generate_pg_profiles_with_extra_lossless_pgs_with_inactive_ports is defined) and (port_names_extra_queues != '') %} +{{ defs.generate_pg_profiles_with_extra_lossless_pgs_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }}, {% elif defs.generate_pg_profiles_with_inactive_ports is defined %} {{ defs.generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) }}, {% elif (defs.generate_pg_buffers_with_extra_lossy_pgs is defined) and (port_names_extra_queues != '') %} {{ defs.generate_pg_buffers_with_extra_lossy_pgs(port_names_active, port_names_extra_queues) }} {% elif (defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports is defined) and (port_names_extra_queues != '') %} {{ defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }} +{% elif defs.generate_pg_profils is defined %} +{{ defs.generate_pg_profils(port_names_active) }} {% else %} "BUFFER_PG": { {% for port in PORT_ACTIVE %} @@ -192,14 +194,14 @@ def }, {% endif %} -{% if defs.generate_queue_buffers is defined %} -{{ defs.generate_queue_buffers(port_names_active) }} -{% elif defs.generate_queue_buffers_with_inactive_ports is defined %} -{{ defs.generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) }} -{% elif (defs.generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports is defined) and (port_names_extra_queues != '') %} +{% if (defs.generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports is defined) and (port_names_extra_queues != '') %} {{ defs.generate_queue_buffers_with_extra_lossless_queues_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }} {% elif (defs.generate_queue_buffers_with_extra_lossless_queues is defined) and (port_names_extra_queues != '') %} {{ defs.generate_queue_buffers_with_extra_lossless_queues(port_names_active, port_names_extra_queues) }} +{% elif defs.generate_queue_buffers is defined %} +{{ defs.generate_queue_buffers(port_names_active) }} +{% elif defs.generate_queue_buffers_with_inactive_ports is defined %} +{{ defs.generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) }} {% else %} "BUFFER_QUEUE": { {% for port in PORT_ACTIVE %} diff --git a/files/build_templates/qos_config.j2 b/files/build_templates/qos_config.j2 index b2a7b9c63f51..358a114c11fb 100644 --- a/files/build_templates/qos_config.j2 +++ b/files/build_templates/qos_config.j2 @@ -212,6 +212,14 @@ {% endif %} {% if asic_type in pfc_to_pg_map_supported_asics %} "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { +{% if port_names_list_extra_queues|length > 0 %} + "AZURE_DUALTOR": { + "2": "2", + "3": "3", + "4": "4", + "6": "6" + }, +{% endif %} "AZURE": { "3": "3", "4": "4" @@ -230,15 +238,23 @@ "{{ port }}": { {% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %} "dot1p_to_tc_map" : "AZURE", +{% else %} +{% if different_dscp_to_tc_map and port not in port_names_list_extra_queues and tunnel_qos_remap_enable %} + "dscp_to_tc_map" : "AZURE_UPLINK", {% else %} "dscp_to_tc_map" : "AZURE", +{% endif %} {% endif %} "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", {% if asic_type in pfc_to_pg_map_supported_asics %} +{% if port in port_names_list_extra_queues %} + "pfc_to_pg_map" : "AZURE_DUALTOR", +{% else %} "pfc_to_pg_map" : "AZURE", {% endif %} +{% endif %} {% if port in port_names_list_extra_queues %} "pfc_enable" : "2,3,4,6", {% else %} diff --git a/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph-remap-disabled.xml b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph-remap-disabled.xml new file mode 100644 index 000000000000..3d08387d71a0 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph-remap-disabled.xml @@ -0,0 +1,2460 @@ + + + + + + false + r-tigon-11 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + r-tigon-11 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + r-tigon-11 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + r-tigon-11 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + r-tigon-11 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + r-tigon-11 + FC00::5 + ARISTA03T2 + FC00::6 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + r-tigon-11 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + r-tigon-11 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + r-tigon-11 + FC00::9 + ARISTA05T2 + FC00::A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + r-tigon-11 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + r-tigon-11 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + r-tigon-11 + FC00::D + ARISTA07T2 + FC00::E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + r-tigon-11 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + r-tigon-11 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + r-tigon-11 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + r-tigon-11 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + r-tigon-11 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + r-tigon-11 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + r-tigon-11 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + r-tigon-11 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + r-tigon-11 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.64 + ARISTA17T0 + 10.0.0.65 + 1 + 10 + 3 + + + r-tigon-11 + FC00::81 + ARISTA17T0 + FC00::82 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.66 + ARISTA18T0 + 10.0.0.67 + 1 + 10 + 3 + + + r-tigon-11 + FC00::85 + ARISTA18T0 + FC00::86 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.68 + ARISTA19T0 + 10.0.0.69 + 1 + 10 + 3 + + + r-tigon-11 + FC00::89 + ARISTA19T0 + FC00::8A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.70 + ARISTA20T0 + 10.0.0.71 + 1 + 10 + 3 + + + r-tigon-11 + FC00::8D + ARISTA20T0 + FC00::8E + 1 + 10 + 3 + + + + + 65100 + r-tigon-11 + + +
10.0.0.33
+ + + +
+ +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.0.0.65
+ + + +
+ +
10.0.0.67
+ + + +
+ +
10.0.0.69
+ + + +
+ +
10.0.0.71
+ + + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 64016 + ARISTA16T0 + + + + 64017 + ARISTA17T0 + + + + 64018 + ARISTA18T0 + + + + 64019 + ARISTA19T0 + + + + 64020 + ARISTA20T0 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.100.25.10/22 + + 10.100.25.10/22 + + + V6HostIP + eth0 + + fe80::e42:a1ff:fe60:65d8/64 + + fe80::e42:a1ff:fe60:65d8/64 + + + + + + + r-tigon-11 + + + PortChannel101 + etp35 + + + + PortChannel102 + etp1;etp2 + + + + PortChannel103 + etp37 + + + + PortChannel104 + etp38 + + + + PortChannel105 + etp5;etp6 + + + + PortChannel106 + etp39 + + + + PortChannel107 + etp40 + + + + PortChannel108 + etp17;etp18 + + + + PortChannel109 + etp43 + + + + PortChannel1010 + etp45 + + + + PortChannel1011 + etp21;etp22 + + + + PortChannel1012 + etp46 + + + + PortChannel1013 + etp47 + + + + PortChannel1014 + etp48 + + + + PortChannel1015 + etp51 + + + + PortChannel1016 + etp53 + + + + PortChannel1017 + etp54 + + + + PortChannel1018 + etp55 + + + + PortChannel1019 + etp56 + + + + PortChannel1020 + etp59 + + + + PortChannel1021 + etp61 + + + + PortChannel1022 + etp62 + + + + PortChannel1023 + etp63 + + + + PortChannel1024 + etp64 + + + + + + + + + PortChannel101 + 10.0.0.32/31 + + + + PortChannel101 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel103 + 10.0.0.34/31 + + + + PortChannel103 + FC00::45/126 + + + + PortChannel104 + 10.0.0.36/31 + + + + PortChannel104 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::5/126 + + + + PortChannel106 + 10.0.0.38/31 + + + + PortChannel106 + FC00::4D/126 + + + + PortChannel107 + 10.0.0.40/31 + + + + PortChannel107 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::9/126 + + + + PortChannel109 + 10.0.0.42/31 + + + + PortChannel109 + FC00::55/126 + + + + PortChannel1010 + 10.0.0.44/31 + + + + PortChannel1010 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::D/126 + + + + PortChannel1012 + 10.0.0.46/31 + + + + PortChannel1012 + FC00::5D/126 + + + + PortChannel1013 + 10.0.0.48/31 + + + + PortChannel1013 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.50/31 + + + + PortChannel1014 + FC00::65/126 + + + + PortChannel1015 + 10.0.0.52/31 + + + + PortChannel1015 + FC00::69/126 + + + + PortChannel1016 + 10.0.0.54/31 + + + + PortChannel1016 + FC00::6D/126 + + + + PortChannel1017 + 10.0.0.56/31 + + + + PortChannel1017 + FC00::71/126 + + + + PortChannel1018 + 10.0.0.58/31 + + + + PortChannel1018 + FC00::75/126 + + + + PortChannel1019 + 10.0.0.60/31 + + + + PortChannel1019 + FC00::79/126 + + + + PortChannel1020 + 10.0.0.62/31 + + + + PortChannel1020 + FC00::7D/126 + + + + PortChannel1021 + 10.0.0.64/31 + + + + PortChannel1021 + FC00::81/126 + + + + PortChannel1022 + 10.0.0.66/31 + + + + PortChannel1022 + FC00::85/126 + + + + PortChannel1023 + 10.0.0.68/31 + + + + PortChannel1023 + FC00::89/126 + + + + PortChannel1024 + 10.0.0.70/31 + + + + PortChannel1024 + FC00::8D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel101;PortChannel102;PortChannel103;PortChannel104;PortChannel105;PortChannel106;PortChannel107;PortChannel108;PortChannel109;PortChannel1010;PortChannel1011;PortChannel1012;PortChannel1013;PortChannel1014;PortChannel1015;PortChannel1016;PortChannel1017;PortChannel1018;PortChannel1019;PortChannel1020;PortChannel1021;PortChannel1022;PortChannel1023;PortChannel1024 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + r-tigon-11 + etp35 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + r-tigon-11 + etp1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + r-tigon-11 + etp2 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + r-tigon-11 + etp37 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + r-tigon-11 + etp38 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + r-tigon-11 + etp5 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + r-tigon-11 + etp6 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + r-tigon-11 + etp39 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + r-tigon-11 + etp40 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + r-tigon-11 + etp17 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + r-tigon-11 + etp18 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + r-tigon-11 + etp43 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + r-tigon-11 + etp45 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + r-tigon-11 + etp21 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + r-tigon-11 + etp22 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + r-tigon-11 + etp46 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + r-tigon-11 + etp47 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + r-tigon-11 + etp48 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + r-tigon-11 + etp51 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + r-tigon-11 + etp53 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + r-tigon-11 + etp54 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + r-tigon-11 + etp55 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + r-tigon-11 + etp56 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + r-tigon-11 + etp59 + + + DeviceInterfaceLink + ARISTA17T0 + Ethernet1 + r-tigon-11 + etp61 + + + DeviceInterfaceLink + ARISTA18T0 + Ethernet1 + r-tigon-11 + etp62 + + + DeviceInterfaceLink + ARISTA19T0 + Ethernet1 + r-tigon-11 + etp63 + + + DeviceInterfaceLink + ARISTA20T0 + Ethernet1 + r-tigon-11 + etp64 + + + + + r-tigon-11 + Mellanox-SN4600C-C64 + + 10.100.25.10 + + + + ARISTA16T0 + + 10.101.14.82 + + Arista-VM + + + ARISTA11T0 + + 10.101.14.77 + + Arista-VM + + + ARISTA10T0 + + 10.101.14.76 + + Arista-VM + + + ARISTA17T0 + + 10.101.14.83 + + Arista-VM + + + ARISTA09T0 + + 10.101.14.75 + + Arista-VM + + + ARISTA20T0 + + 10.101.14.86 + + Arista-VM + + + ARISTA08T0 + + 10.101.14.74 + + Arista-VM + + + ARISTA07T0 + + 10.101.14.73 + + Arista-VM + + + ARISTA07T2 + + 10.101.14.66 + + Arista-VM + + + ARISTA01T2 + + 10.101.14.63 + + Arista-VM + + + ARISTA01T0 + + 10.101.14.67 + + Arista-VM + + + ARISTA05T2 + + 10.101.14.65 + + Arista-VM + + + ARISTA05T0 + + 10.101.14.71 + + Arista-VM + + + ARISTA02T0 + + 10.101.14.68 + + Arista-VM + + + ARISTA03T0 + + 10.101.14.69 + + Arista-VM + + + ARISTA03T2 + + 10.101.14.64 + + Arista-VM + + + ARISTA04T0 + + 10.101.14.70 + + Arista-VM + + + ARISTA18T0 + + 10.101.14.84 + + Arista-VM + + + ARISTA15T0 + + 10.101.14.81 + + Arista-VM + + + ARISTA19T0 + + 10.101.14.85 + + Arista-VM + + + ARISTA14T0 + + 10.101.14.80 + + Arista-VM + + + ARISTA12T0 + + 10.101.14.78 + + Arista-VM + + + ARISTA13T0 + + 10.101.14.79 + + Arista-VM + + + ARISTA06T0 + + 10.101.14.72 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + etp1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp2 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp3 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp4 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp5 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp6 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp7 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp8 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp9 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp10 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp11 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp12 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp13 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp14 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp15 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp17 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp18 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp19 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp21 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp22 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp23 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp25 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp26 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp27 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp29 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp30 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp31 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp33 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp34 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp35 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp37 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp38 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp39 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp41 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp42 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp43 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp45 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp46 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp47 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp49 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp50 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp51 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp53 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp54 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp55 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp57 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp58 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp59 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp61 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp62 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp63 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + etp64 + + false + 0 + 0 + 50000 + + + true + 0 + Mellanox-SN4600C-C64 + + + + + + + r-tigon-11 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4 + + + NtpResources + + 10.100.25.32;10.102.202.2 + + + SnmpResources + + 10.0.0.9 + + + TacacsGroup + + testlab + + + TacacsServer + + 10.107.34.20 + + + ForcedMgmtRoutes + + 10.102.0.0/16;10.101.0.0/16 + + + ErspanDestinationIpv4 + + 10.0.0.7 + + + + + + + r-tigon-11 + Mellanox-SN4600C-C64 +
diff --git a/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml new file mode 100644 index 000000000000..e7f581178b29 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml @@ -0,0 +1,2468 @@ + + + + + + false + r-tigon-11 + 10.0.0.32 + ARISTA01T0 + 10.0.0.33 + 1 + 10 + 3 + + + r-tigon-11 + FC00::41 + ARISTA01T0 + FC00::42 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + r-tigon-11 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.34 + ARISTA02T0 + 10.0.0.35 + 1 + 10 + 3 + + + r-tigon-11 + FC00::45 + ARISTA02T0 + FC00::46 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.36 + ARISTA03T0 + 10.0.0.37 + 1 + 10 + 3 + + + r-tigon-11 + FC00::49 + ARISTA03T0 + FC00::4A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + r-tigon-11 + FC00::5 + ARISTA03T2 + FC00::6 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.38 + ARISTA04T0 + 10.0.0.39 + 1 + 10 + 3 + + + r-tigon-11 + FC00::4D + ARISTA04T0 + FC00::4E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.40 + ARISTA05T0 + 10.0.0.41 + 1 + 10 + 3 + + + r-tigon-11 + FC00::51 + ARISTA05T0 + FC00::52 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + r-tigon-11 + FC00::9 + ARISTA05T2 + FC00::A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.42 + ARISTA06T0 + 10.0.0.43 + 1 + 10 + 3 + + + r-tigon-11 + FC00::55 + ARISTA06T0 + FC00::56 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.44 + ARISTA07T0 + 10.0.0.45 + 1 + 10 + 3 + + + r-tigon-11 + FC00::59 + ARISTA07T0 + FC00::5A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + r-tigon-11 + FC00::D + ARISTA07T2 + FC00::E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.46 + ARISTA08T0 + 10.0.0.47 + 1 + 10 + 3 + + + r-tigon-11 + FC00::5D + ARISTA08T0 + FC00::5E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.48 + ARISTA09T0 + 10.0.0.49 + 1 + 10 + 3 + + + r-tigon-11 + FC00::61 + ARISTA09T0 + FC00::62 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.50 + ARISTA10T0 + 10.0.0.51 + 1 + 10 + 3 + + + r-tigon-11 + FC00::65 + ARISTA10T0 + FC00::66 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.52 + ARISTA11T0 + 10.0.0.53 + 1 + 10 + 3 + + + r-tigon-11 + FC00::69 + ARISTA11T0 + FC00::6A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.54 + ARISTA12T0 + 10.0.0.55 + 1 + 10 + 3 + + + r-tigon-11 + FC00::6D + ARISTA12T0 + FC00::6E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.56 + ARISTA13T0 + 10.0.0.57 + 1 + 10 + 3 + + + r-tigon-11 + FC00::71 + ARISTA13T0 + FC00::72 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.58 + ARISTA14T0 + 10.0.0.59 + 1 + 10 + 3 + + + r-tigon-11 + FC00::75 + ARISTA14T0 + FC00::76 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.60 + ARISTA15T0 + 10.0.0.61 + 1 + 10 + 3 + + + r-tigon-11 + FC00::79 + ARISTA15T0 + FC00::7A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.62 + ARISTA16T0 + 10.0.0.63 + 1 + 10 + 3 + + + r-tigon-11 + FC00::7D + ARISTA16T0 + FC00::7E + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.64 + ARISTA17T0 + 10.0.0.65 + 1 + 10 + 3 + + + r-tigon-11 + FC00::81 + ARISTA17T0 + FC00::82 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.66 + ARISTA18T0 + 10.0.0.67 + 1 + 10 + 3 + + + r-tigon-11 + FC00::85 + ARISTA18T0 + FC00::86 + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.68 + ARISTA19T0 + 10.0.0.69 + 1 + 10 + 3 + + + r-tigon-11 + FC00::89 + ARISTA19T0 + FC00::8A + 1 + 10 + 3 + + + false + r-tigon-11 + 10.0.0.70 + ARISTA20T0 + 10.0.0.71 + 1 + 10 + 3 + + + r-tigon-11 + FC00::8D + ARISTA20T0 + FC00::8E + 1 + 10 + 3 + + + + + 65100 + r-tigon-11 + + +
10.0.0.33
+ + + +
+ +
10.0.0.1
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.0.0.65
+ + + +
+ +
10.0.0.67
+ + + +
+ +
10.0.0.69
+ + + +
+ +
10.0.0.71
+ + + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 64009 + ARISTA09T0 + + + + 64010 + ARISTA10T0 + + + + 64011 + ARISTA11T0 + + + + 64012 + ARISTA12T0 + + + + 64013 + ARISTA13T0 + + + + 64014 + ARISTA14T0 + + + + 64015 + ARISTA15T0 + + + + 64016 + ARISTA16T0 + + + + 64017 + ARISTA17T0 + + + + 64018 + ARISTA18T0 + + + + 64019 + ARISTA19T0 + + + + 64020 + ARISTA20T0 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.100.25.10/22 + + 10.100.25.10/22 + + + V6HostIP + eth0 + + fe80::e42:a1ff:fe60:65d8/64 + + fe80::e42:a1ff:fe60:65d8/64 + + + + + + + r-tigon-11 + + + PortChannel101 + etp35 + + + + PortChannel102 + etp1;etp2 + + + + PortChannel103 + etp37 + + + + PortChannel104 + etp38 + + + + PortChannel105 + etp5;etp6 + + + + PortChannel106 + etp39 + + + + PortChannel107 + etp40 + + + + PortChannel108 + etp17;etp18 + + + + PortChannel109 + etp43 + + + + PortChannel1010 + etp45 + + + + PortChannel1011 + etp21;etp22 + + + + PortChannel1012 + etp46 + + + + PortChannel1013 + etp47 + + + + PortChannel1014 + etp48 + + + + PortChannel1015 + etp51 + + + + PortChannel1016 + etp53 + + + + PortChannel1017 + etp54 + + + + PortChannel1018 + etp55 + + + + PortChannel1019 + etp56 + + + + PortChannel1020 + etp59 + + + + PortChannel1021 + etp61 + + + + PortChannel1022 + etp62 + + + + PortChannel1023 + etp63 + + + + PortChannel1024 + etp64 + + + + + + + + + PortChannel101 + 10.0.0.32/31 + + + + PortChannel101 + FC00::41/126 + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel103 + 10.0.0.34/31 + + + + PortChannel103 + FC00::45/126 + + + + PortChannel104 + 10.0.0.36/31 + + + + PortChannel104 + FC00::49/126 + + + + PortChannel105 + 10.0.0.4/31 + + + + PortChannel105 + FC00::5/126 + + + + PortChannel106 + 10.0.0.38/31 + + + + PortChannel106 + FC00::4D/126 + + + + PortChannel107 + 10.0.0.40/31 + + + + PortChannel107 + FC00::51/126 + + + + PortChannel108 + 10.0.0.8/31 + + + + PortChannel108 + FC00::9/126 + + + + PortChannel109 + 10.0.0.42/31 + + + + PortChannel109 + FC00::55/126 + + + + PortChannel1010 + 10.0.0.44/31 + + + + PortChannel1010 + FC00::59/126 + + + + PortChannel1011 + 10.0.0.12/31 + + + + PortChannel1011 + FC00::D/126 + + + + PortChannel1012 + 10.0.0.46/31 + + + + PortChannel1012 + FC00::5D/126 + + + + PortChannel1013 + 10.0.0.48/31 + + + + PortChannel1013 + FC00::61/126 + + + + PortChannel1014 + 10.0.0.50/31 + + + + PortChannel1014 + FC00::65/126 + + + + PortChannel1015 + 10.0.0.52/31 + + + + PortChannel1015 + FC00::69/126 + + + + PortChannel1016 + 10.0.0.54/31 + + + + PortChannel1016 + FC00::6D/126 + + + + PortChannel1017 + 10.0.0.56/31 + + + + PortChannel1017 + FC00::71/126 + + + + PortChannel1018 + 10.0.0.58/31 + + + + PortChannel1018 + FC00::75/126 + + + + PortChannel1019 + 10.0.0.60/31 + + + + PortChannel1019 + FC00::79/126 + + + + PortChannel1020 + 10.0.0.62/31 + + + + PortChannel1020 + FC00::7D/126 + + + + PortChannel1021 + 10.0.0.64/31 + + + + PortChannel1021 + FC00::81/126 + + + + PortChannel1022 + 10.0.0.66/31 + + + + PortChannel1022 + FC00::85/126 + + + + PortChannel1023 + 10.0.0.68/31 + + + + PortChannel1023 + FC00::89/126 + + + + PortChannel1024 + 10.0.0.70/31 + + + + PortChannel1024 + FC00::8D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel101;PortChannel102;PortChannel103;PortChannel104;PortChannel105;PortChannel106;PortChannel107;PortChannel108;PortChannel109;PortChannel1010;PortChannel1011;PortChannel1012;PortChannel1013;PortChannel1014;PortChannel1015;PortChannel1016;PortChannel1017;PortChannel1018;PortChannel1019;PortChannel1020;PortChannel1021;PortChannel1022;PortChannel1023;PortChannel1024 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + r-tigon-11 + etp35 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + r-tigon-11 + etp1 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet2 + r-tigon-11 + etp2 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + r-tigon-11 + etp37 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + r-tigon-11 + etp38 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + r-tigon-11 + etp5 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet2 + r-tigon-11 + etp6 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + r-tigon-11 + etp39 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + r-tigon-11 + etp40 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + r-tigon-11 + etp17 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet2 + r-tigon-11 + etp18 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + r-tigon-11 + etp43 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + r-tigon-11 + etp45 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + r-tigon-11 + etp21 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet2 + r-tigon-11 + etp22 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + r-tigon-11 + etp46 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + r-tigon-11 + etp47 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + r-tigon-11 + etp48 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + r-tigon-11 + etp51 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + r-tigon-11 + etp53 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + r-tigon-11 + etp54 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + r-tigon-11 + etp55 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + r-tigon-11 + etp56 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + r-tigon-11 + etp59 + + + DeviceInterfaceLink + ARISTA17T0 + Ethernet1 + r-tigon-11 + etp61 + + + DeviceInterfaceLink + ARISTA18T0 + Ethernet1 + r-tigon-11 + etp62 + + + DeviceInterfaceLink + ARISTA19T0 + Ethernet1 + r-tigon-11 + etp63 + + + DeviceInterfaceLink + ARISTA20T0 + Ethernet1 + r-tigon-11 + etp64 + + + + + r-tigon-11 + Mellanox-SN4600C-C64 + + 10.100.25.10 + + + + ARISTA16T0 + + 10.101.14.82 + + Arista-VM + + + ARISTA11T0 + + 10.101.14.77 + + Arista-VM + + + ARISTA10T0 + + 10.101.14.76 + + Arista-VM + + + ARISTA17T0 + + 10.101.14.83 + + Arista-VM + + + ARISTA09T0 + + 10.101.14.75 + + Arista-VM + + + ARISTA20T0 + + 10.101.14.86 + + Arista-VM + + + ARISTA08T0 + + 10.101.14.74 + + Arista-VM + + + ARISTA07T0 + + 10.101.14.73 + + Arista-VM + + + ARISTA07T2 + + 10.101.14.66 + + Arista-VM + + + ARISTA01T2 + + 10.101.14.63 + + Arista-VM + + + ARISTA01T0 + + 10.101.14.67 + + Arista-VM + + + ARISTA05T2 + + 10.101.14.65 + + Arista-VM + + + ARISTA05T0 + + 10.101.14.71 + + Arista-VM + + + ARISTA02T0 + + 10.101.14.68 + + Arista-VM + + + ARISTA03T0 + + 10.101.14.69 + + Arista-VM + + + ARISTA03T2 + + 10.101.14.64 + + Arista-VM + + + ARISTA04T0 + + 10.101.14.70 + + Arista-VM + + + ARISTA18T0 + + 10.101.14.84 + + Arista-VM + + + ARISTA15T0 + + 10.101.14.81 + + Arista-VM + + + ARISTA19T0 + + 10.101.14.85 + + Arista-VM + + + ARISTA14T0 + + 10.101.14.80 + + Arista-VM + + + ARISTA12T0 + + 10.101.14.78 + + Arista-VM + + + ARISTA13T0 + + 10.101.14.79 + + Arista-VM + + + ARISTA06T0 + + 10.101.14.72 + + Arista-VM + + + + + + true + + + DeviceInterface + + true + true + 1 + etp1 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp2 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp3 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp4 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp5 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp6 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp7 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp8 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp9 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp10 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp11 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp12 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp13 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp14 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp15 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp17 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp18 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp19 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp21 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp22 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp23 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp25 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp26 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp27 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp29 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp30 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp31 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp33 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp34 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp35 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp37 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp38 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp39 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp41 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp42 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp43 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp45 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp46 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp47 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp49 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp50 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp51 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp53 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp54 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp55 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp57 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp58 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp59 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp61 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp62 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + etp63 + + false + 0 + 0 + 50000 + + + DeviceInterface + + true + true + 1 + etp64 + + false + 0 + 0 + 50000 + + + true + 0 + Mellanox-SN4600C-C64 + + + + + + + r-tigon-11 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4 + + + NtpResources + + 10.100.25.32;10.102.202.2 + + + SnmpResources + + 10.0.0.9 + + + TacacsGroup + + testlab + + + TacacsServer + + 10.107.34.20 + + + ForcedMgmtRoutes + + 10.102.0.0/16;10.101.0.0/16 + + + ErspanDestinationIpv4 + + 10.0.0.7 + + + + + + + + + + TunnelQosRemapEnabled + True + + + + r-tigon-11 + Mellanox-SN4600C-C64 +
diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic-remap-disabled.json new file mode 100644 index 000000000000..4adfa363eed7 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic-remap-disabled.json @@ -0,0 +1,1481 @@ + +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "5m", + "Ethernet28": "5m", + "Ethernet32": "5m", + "Ethernet36": "5m", + "Ethernet40": "5m", + "Ethernet44": "5m", + "Ethernet48": "5m", + "Ethernet52": "5m", + "Ethernet56": "5m", + "Ethernet60": "5m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "5m", + "Ethernet76": "5m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "5m", + "Ethernet92": "5m", + "Ethernet96": "5m", + "Ethernet100": "5m", + "Ethernet104": "5m", + "Ethernet108": "5m", + "Ethernet112": "5m", + "Ethernet116": "5m", + "Ethernet120": "5m", + "Ethernet124": "5m", + "Ethernet128": "5m", + "Ethernet132": "5m", + "Ethernet136": "40m", + "Ethernet140": "5m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "5m", + "Ethernet164": "5m", + "Ethernet168": "40m", + "Ethernet172": "5m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "5m", + "Ethernet196": "5m", + "Ethernet200": "40m", + "Ethernet204": "5m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "5m", + "Ethernet228": "5m", + "Ethernet232": "40m", + "Ethernet236": "5m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "60817392", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"3" + } + }, + "BUFFER_PORT_INGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet0": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet4": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet144": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet148": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet16": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet20": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet152": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet156": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet64": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet68": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet168": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet176": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet80": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet84": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet180": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet184": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet188": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet200": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet208": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet212": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet216": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet220": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet232": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet240": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet244": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet248": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet252": { + "profile_list" : "ingress_lossless_profile" + } +, + "Ethernet8": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet12": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet24": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet28": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet32": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet36": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet40": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet44": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet48": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet52": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet56": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet60": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet72": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet76": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet88": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet92": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet96": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet100": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet104": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet108": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet112": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet116": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet120": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet124": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet128": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet132": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet140": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet160": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet164": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet172": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet192": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet196": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet204": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet224": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet228": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet236": { + "profile_list" : "ingress_lossless_profile" + } + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet0": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet4": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet144": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet148": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet16": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet20": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet152": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet156": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet64": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet68": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet168": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet176": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet80": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet84": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet180": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet184": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet188": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet200": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet208": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet212": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet216": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet220": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet232": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet240": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet244": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet248": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet252": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } +, + "Ethernet8": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet12": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet24": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet28": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet32": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet36": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet40": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet44": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet48": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet52": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet56": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet60": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet72": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet76": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet88": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet92": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet96": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet100": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet104": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet108": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet112": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet116": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet120": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet124": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet128": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet132": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet140": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet160": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet164": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet172": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet192": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet196": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet204": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet224": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet228": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet236": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } + }, + "BUFFER_PG": { + "Ethernet0|3-4": { + "profile" : "NULL" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|3-4": { + "profile" : "NULL" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|3-4": { + "profile" : "NULL" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|3-4": { + "profile" : "NULL" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|3-4": { + "profile" : "NULL" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|3-4": { + "profile" : "NULL" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|3-4": { + "profile" : "NULL" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|3-4": { + "profile" : "NULL" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|3-4": { + "profile" : "NULL" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|3-4": { + "profile" : "NULL" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|3-4": { + "profile" : "NULL" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|3-4": { + "profile" : "NULL" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|3-4": { + "profile" : "NULL" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|3-4": { + "profile" : "NULL" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|3-4": { + "profile" : "NULL" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|3-4": { + "profile" : "NULL" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|3-4": { + "profile" : "NULL" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|3-4": { + "profile" : "NULL" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|3-4": { + "profile" : "NULL" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|3-4": { + "profile" : "NULL" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|3-4": { + "profile" : "NULL" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|3-4": { + "profile" : "NULL" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|3-4": { + "profile" : "NULL" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|3-4": { + "profile" : "NULL" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|3-4": { + "profile" : "NULL" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|3-4": { + "profile" : "NULL" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|3-4": { + "profile" : "NULL" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|3-4": { + "profile" : "NULL" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } +, "Ethernet8|3-4": { + "profile" : "NULL" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|3-4": { + "profile" : "NULL" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|3-4": { + "profile" : "NULL" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|3-4": { + "profile" : "NULL" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|3-4": { + "profile" : "NULL" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|3-4": { + "profile" : "NULL" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|3-4": { + "profile" : "NULL" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|3-4": { + "profile" : "NULL" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|3-4": { + "profile" : "NULL" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|3-4": { + "profile" : "NULL" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|3-4": { + "profile" : "NULL" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|3-4": { + "profile" : "NULL" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|3-4": { + "profile" : "NULL" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|3-4": { + "profile" : "NULL" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|3-4": { + "profile" : "NULL" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|3-4": { + "profile" : "NULL" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|3-4": { + "profile" : "NULL" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|3-4": { + "profile" : "NULL" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|3-4": { + "profile" : "NULL" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|3-4": { + "profile" : "NULL" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|3-4": { + "profile" : "NULL" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|3-4": { + "profile" : "NULL" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|3-4": { + "profile" : "NULL" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|3-4": { + "profile" : "NULL" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|3-4": { + "profile" : "NULL" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|3-4": { + "profile" : "NULL" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|3-4": { + "profile" : "NULL" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet160|3-4": { + "profile" : "NULL" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|3-4": { + "profile" : "NULL" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet172|3-4": { + "profile" : "NULL" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet192|3-4": { + "profile" : "NULL" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet196|3-4": { + "profile" : "NULL" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet204|3-4": { + "profile" : "NULL" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet224|3-4": { + "profile" : "NULL" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet228|3-4": { + "profile" : "NULL" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet236|3-4": { + "profile" : "NULL" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5-6": { + "profile" : "q_lossy_profile" + } +, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet24|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet28|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet32|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet36|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet48|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet52|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet56|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet60|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet72|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet76|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet88|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet92|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet96|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet100|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet128|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet132|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet140|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet160|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet164|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet172|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet192|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet196|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet204|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet224|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet228|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet236|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet8|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet12|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet24|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet28|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet32|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet36|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet40|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet44|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet48|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet52|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet56|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet60|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet72|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet76|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet88|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet92|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet96|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet100|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet104|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet108|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet112|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet116|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet120|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet124|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet128|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet132|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet140|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet160|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet164|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet172|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet192|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet196|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet204|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet224|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet228|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet236|5-6": { + "profile" : "q_lossy_profile" + } + } +, "DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "AZURE": { + "default_dynamic_th": "0" + } + }, + "LOSSLESS_TRAFFIC_PATTERN": { + "AZURE": { + "mtu": "1024", + "small_packet_percentage": "100" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json new file mode 100644 index 000000000000..57be84be1fb1 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json @@ -0,0 +1,1660 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "5m", + "Ethernet28": "5m", + "Ethernet32": "5m", + "Ethernet36": "5m", + "Ethernet40": "5m", + "Ethernet44": "5m", + "Ethernet48": "5m", + "Ethernet52": "5m", + "Ethernet56": "5m", + "Ethernet60": "5m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "5m", + "Ethernet76": "5m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "5m", + "Ethernet92": "5m", + "Ethernet96": "5m", + "Ethernet100": "5m", + "Ethernet104": "5m", + "Ethernet108": "5m", + "Ethernet112": "5m", + "Ethernet116": "5m", + "Ethernet120": "5m", + "Ethernet124": "5m", + "Ethernet128": "5m", + "Ethernet132": "5m", + "Ethernet136": "40m", + "Ethernet140": "5m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "5m", + "Ethernet164": "5m", + "Ethernet168": "40m", + "Ethernet172": "5m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "5m", + "Ethernet196": "5m", + "Ethernet200": "40m", + "Ethernet204": "5m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "5m", + "Ethernet228": "5m", + "Ethernet232": "40m", + "Ethernet236": "5m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m" + } + }, + + "BUFFER_POOL": { + "ingress_lossless_pool": { + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "60817392", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"3" + } + }, + "BUFFER_PORT_INGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet0": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet4": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet144": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet148": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet16": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet20": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet152": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet156": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet64": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet68": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet168": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet176": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet80": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet84": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet180": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet184": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet188": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet200": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet208": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet212": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet216": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet220": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet232": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet240": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet244": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet248": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet252": { + "profile_list" : "ingress_lossless_profile" + } +, + "Ethernet8": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet12": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet24": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet28": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet32": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet36": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet40": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet44": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet48": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet52": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet56": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet60": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet72": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet76": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet88": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet92": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet96": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet100": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet104": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet108": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet112": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet116": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet120": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet124": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet128": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet132": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet140": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet160": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet164": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet172": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet192": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet196": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet204": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet224": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet228": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet236": { + "profile_list" : "ingress_lossless_profile" + } + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet0": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet4": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet144": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet148": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet16": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet20": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet152": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet156": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet64": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet68": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet168": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet176": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet80": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet84": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet180": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet184": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet188": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet200": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet208": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet212": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet216": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet220": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet232": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet240": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet244": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet248": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet252": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } +, + "Ethernet8": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet12": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet24": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet28": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet32": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet36": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet40": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet44": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet48": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet52": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet56": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet60": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet72": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet76": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet88": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet92": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet96": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet100": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet104": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet108": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet112": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet116": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet120": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet124": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet128": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet132": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet140": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet160": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet164": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet172": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet192": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet196": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet204": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet224": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet228": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet236": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } + }, + "BUFFER_PG": { + "Ethernet0|3-4": { + "profile" : "NULL" + }, + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|3-4": { + "profile" : "NULL" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|3-4": { + "profile" : "NULL" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|3-4": { + "profile" : "NULL" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|3-4": { + "profile" : "NULL" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|3-4": { + "profile" : "NULL" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|3-4": { + "profile" : "NULL" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|3-4": { + "profile" : "NULL" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|2-4": { + "profile" : "NULL" + }, + "Ethernet136|6": { + "profile" : "NULL" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|2-4": { + "profile" : "NULL" + }, + "Ethernet144|6": { + "profile" : "NULL" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|2-4": { + "profile" : "NULL" + }, + "Ethernet148|6": { + "profile" : "NULL" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|2-4": { + "profile" : "NULL" + }, + "Ethernet152|6": { + "profile" : "NULL" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|2-4": { + "profile" : "NULL" + }, + "Ethernet156|6": { + "profile" : "NULL" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|2-4": { + "profile" : "NULL" + }, + "Ethernet168|6": { + "profile" : "NULL" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|2-4": { + "profile" : "NULL" + }, + "Ethernet176|6": { + "profile" : "NULL" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|2-4": { + "profile" : "NULL" + }, + "Ethernet180|6": { + "profile" : "NULL" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|2-4": { + "profile" : "NULL" + }, + "Ethernet184|6": { + "profile" : "NULL" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|2-4": { + "profile" : "NULL" + }, + "Ethernet188|6": { + "profile" : "NULL" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|2-4": { + "profile" : "NULL" + }, + "Ethernet200|6": { + "profile" : "NULL" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|2-4": { + "profile" : "NULL" + }, + "Ethernet208|6": { + "profile" : "NULL" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|2-4": { + "profile" : "NULL" + }, + "Ethernet212|6": { + "profile" : "NULL" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|2-4": { + "profile" : "NULL" + }, + "Ethernet216|6": { + "profile" : "NULL" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|2-4": { + "profile" : "NULL" + }, + "Ethernet220|6": { + "profile" : "NULL" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|2-4": { + "profile" : "NULL" + }, + "Ethernet232|6": { + "profile" : "NULL" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|2-4": { + "profile" : "NULL" + }, + "Ethernet240|6": { + "profile" : "NULL" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|2-4": { + "profile" : "NULL" + }, + "Ethernet244|6": { + "profile" : "NULL" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|2-4": { + "profile" : "NULL" + }, + "Ethernet248|6": { + "profile" : "NULL" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|2-4": { + "profile" : "NULL" + }, + "Ethernet252|6": { + "profile" : "NULL" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } +, "Ethernet8|3-4": { + "profile" : "NULL" + }, + "Ethernet8|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet12|3-4": { + "profile" : "NULL" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet24|3-4": { + "profile" : "NULL" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet28|3-4": { + "profile" : "NULL" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet32|3-4": { + "profile" : "NULL" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet36|3-4": { + "profile" : "NULL" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet40|3-4": { + "profile" : "NULL" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet44|3-4": { + "profile" : "NULL" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet48|3-4": { + "profile" : "NULL" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet52|3-4": { + "profile" : "NULL" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet56|3-4": { + "profile" : "NULL" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet60|3-4": { + "profile" : "NULL" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet72|3-4": { + "profile" : "NULL" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet76|3-4": { + "profile" : "NULL" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet88|3-4": { + "profile" : "NULL" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet92|3-4": { + "profile" : "NULL" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet96|3-4": { + "profile" : "NULL" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet100|3-4": { + "profile" : "NULL" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet104|3-4": { + "profile" : "NULL" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet108|3-4": { + "profile" : "NULL" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet112|3-4": { + "profile" : "NULL" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet116|3-4": { + "profile" : "NULL" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet120|3-4": { + "profile" : "NULL" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet124|3-4": { + "profile" : "NULL" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet128|3-4": { + "profile" : "NULL" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet132|3-4": { + "profile" : "NULL" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet140|3-4": { + "profile" : "NULL" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet160|3-4": { + "profile" : "NULL" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet164|3-4": { + "profile" : "NULL" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet172|3-4": { + "profile" : "NULL" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet192|3-4": { + "profile" : "NULL" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet196|3-4": { + "profile" : "NULL" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet204|3-4": { + "profile" : "NULL" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet224|3-4": { + "profile" : "NULL" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet228|3-4": { + "profile" : "NULL" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet236|3-4": { + "profile" : "NULL" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|7": { + "profile" : "q_lossy_profile" + } +, + "Ethernet8|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet8|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet12|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet24|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet28|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet32|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet36|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet40|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet44|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet48|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet52|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet56|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet60|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet72|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet76|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet88|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet92|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet96|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet100|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet104|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet108|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet112|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet116|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet120|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet124|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet128|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet132|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet140|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet160|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet164|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet172|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet192|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet196|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet204|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet224|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet228|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet236|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet8|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet12|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet24|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet28|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet32|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet36|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet40|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet44|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet48|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet52|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet56|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet60|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet72|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet76|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet88|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet92|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet96|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet100|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet104|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet108|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet112|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet116|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet120|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet124|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet128|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet132|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet140|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet160|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet164|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet172|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet192|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet196|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet204|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet224|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet228|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet236|5-6": { + "profile" : "q_lossy_profile" + } + } +, "DEFAULT_LOSSLESS_BUFFER_PARAMETER": { + "AZURE": { + "default_dynamic_th": "0" + } + }, + "LOSSLESS_TRAFFIC_PATTERN": { + "AZURE": { + "mtu": "1024", + "small_packet_percentage": "100" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-remap-disabled.json new file mode 100644 index 000000000000..3a423b492587 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-remap-disabled.json @@ -0,0 +1,1306 @@ + +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "5m", + "Ethernet28": "5m", + "Ethernet32": "5m", + "Ethernet36": "5m", + "Ethernet40": "5m", + "Ethernet44": "5m", + "Ethernet48": "5m", + "Ethernet52": "5m", + "Ethernet56": "5m", + "Ethernet60": "5m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "5m", + "Ethernet76": "5m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "5m", + "Ethernet92": "5m", + "Ethernet96": "5m", + "Ethernet100": "5m", + "Ethernet104": "5m", + "Ethernet108": "5m", + "Ethernet112": "5m", + "Ethernet116": "5m", + "Ethernet120": "5m", + "Ethernet124": "5m", + "Ethernet128": "5m", + "Ethernet132": "5m", + "Ethernet136": "40m", + "Ethernet140": "5m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "5m", + "Ethernet164": "5m", + "Ethernet168": "40m", + "Ethernet172": "5m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "5m", + "Ethernet196": "5m", + "Ethernet200": "40m", + "Ethernet204": "5m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "5m", + "Ethernet228": "5m", + "Ethernet232": "40m", + "Ethernet236": "5m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m" + } + }, + + "BUFFER_POOL": { + "ingress_zero_pool" : { + "mode": "static", + "type": "ingress", + "size": "0" + }, + "ingress_lossless_pool": { + "size": "48332800", + "xoff": "5275648", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "60817392", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "48332800", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_pg_zero_profile" : { + "pool":"ingress_zero_pool", + "size":"0", + "static_th":"0" + }, + "ingress_lossless_zero_profile" : { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-8" + }, + "egress_lossless_zero_profile" : { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"-8" + }, + "egress_lossy_zero_profile" : { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"-8" + }, + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"3" + } + }, + "BUFFER_PORT_INGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet0": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet4": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet144": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet148": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet16": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet20": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet152": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet156": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet64": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet68": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet168": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet176": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet80": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet84": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet180": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet184": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet188": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet200": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet208": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet212": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet216": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet220": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet232": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet240": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet244": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet248": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet252": { + "profile_list" : "ingress_lossless_profile" + } +, + "Ethernet8": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet12": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet24": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet28": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet32": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet36": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet40": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet44": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet48": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet52": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet56": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet60": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet72": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet76": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet88": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet92": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet96": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet100": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet104": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet108": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet112": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet116": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet120": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet124": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet128": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet132": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet140": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet160": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet164": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet172": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet192": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet196": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet204": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet224": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet228": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet236": { + "profile_list" : "ingress_lossless_zero_profile" + } + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet0": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet4": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet144": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet148": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet16": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet20": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet152": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet156": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet64": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet68": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet168": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet176": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet80": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet84": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet180": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet184": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet188": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet200": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet208": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet212": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet216": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet220": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet232": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet240": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet244": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet248": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet252": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } +, + "Ethernet8": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet12": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet24": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet28": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet32": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet36": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet40": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet44": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet48": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet52": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet56": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet60": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet72": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet76": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet88": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet92": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet96": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet100": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet104": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet108": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet112": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet116": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet120": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet124": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet128": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet132": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet140": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet160": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet164": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet172": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet192": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet196": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet204": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet224": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet228": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet236": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + } + }, + "BUFFER_PG": { + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } +, "Ethernet8|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_pg_zero_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5-6": { + "profile" : "q_lossy_profile" + } +, + "Ethernet8|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet24|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet28|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet32|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet36|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet48|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet52|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet56|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet60|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet72|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet76|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet88|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet92|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet96|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet100|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet128|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet132|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet140|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet160|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet164|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet172|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet192|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet196|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet204|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet224|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet228|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet236|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet8|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet12|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet24|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet28|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet32|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet36|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet40|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet44|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet48|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet52|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet56|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet60|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet72|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet76|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet88|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet92|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet96|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet100|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet104|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet108|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet112|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet116|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet120|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet124|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet128|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet132|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet140|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet160|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet164|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet172|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet192|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet196|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet204|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet224|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet228|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet236|5-6": { + "profile" : "egress_lossy_zero_profile" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json new file mode 100644 index 000000000000..a545415612d5 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json @@ -0,0 +1,1425 @@ +{ + "CABLE_LENGTH": { + "AZURE": { + "Ethernet0": "300m", + "Ethernet4": "300m", + "Ethernet8": "5m", + "Ethernet12": "5m", + "Ethernet16": "300m", + "Ethernet20": "300m", + "Ethernet24": "5m", + "Ethernet28": "5m", + "Ethernet32": "5m", + "Ethernet36": "5m", + "Ethernet40": "5m", + "Ethernet44": "5m", + "Ethernet48": "5m", + "Ethernet52": "5m", + "Ethernet56": "5m", + "Ethernet60": "5m", + "Ethernet64": "300m", + "Ethernet68": "300m", + "Ethernet72": "5m", + "Ethernet76": "5m", + "Ethernet80": "300m", + "Ethernet84": "300m", + "Ethernet88": "5m", + "Ethernet92": "5m", + "Ethernet96": "5m", + "Ethernet100": "5m", + "Ethernet104": "5m", + "Ethernet108": "5m", + "Ethernet112": "5m", + "Ethernet116": "5m", + "Ethernet120": "5m", + "Ethernet124": "5m", + "Ethernet128": "5m", + "Ethernet132": "5m", + "Ethernet136": "40m", + "Ethernet140": "5m", + "Ethernet144": "40m", + "Ethernet148": "40m", + "Ethernet152": "40m", + "Ethernet156": "40m", + "Ethernet160": "5m", + "Ethernet164": "5m", + "Ethernet168": "40m", + "Ethernet172": "5m", + "Ethernet176": "40m", + "Ethernet180": "40m", + "Ethernet184": "40m", + "Ethernet188": "40m", + "Ethernet192": "5m", + "Ethernet196": "5m", + "Ethernet200": "40m", + "Ethernet204": "5m", + "Ethernet208": "40m", + "Ethernet212": "40m", + "Ethernet216": "40m", + "Ethernet220": "40m", + "Ethernet224": "5m", + "Ethernet228": "5m", + "Ethernet232": "40m", + "Ethernet236": "5m", + "Ethernet240": "40m", + "Ethernet244": "40m", + "Ethernet248": "40m", + "Ethernet252": "40m" + } + }, + + "BUFFER_POOL": { + "ingress_zero_pool" : { + "mode": "static", + "type": "ingress", + "size": "0" + }, + "ingress_lossless_pool": { + "size": "44130304", + "xoff": "8790016", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "60817392", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "44130304", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_pg_zero_profile" : { + "pool":"ingress_zero_pool", + "size":"0", + "static_th":"0" + }, + "ingress_lossless_zero_profile" : { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"-8" + }, + "egress_lossless_zero_profile" : { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"-8" + }, + "egress_lossy_zero_profile" : { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"-8" + }, + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"0", + "dynamic_th":"3" + } + }, + "BUFFER_PORT_INGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet0": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet4": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet144": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet148": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet16": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet20": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet152": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet156": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet64": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet68": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet168": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet176": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet80": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet84": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet180": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet184": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet188": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet200": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet208": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet212": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet216": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet220": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet232": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet240": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet244": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet248": { + "profile_list" : "ingress_lossless_profile" + }, + "Ethernet252": { + "profile_list" : "ingress_lossless_profile" + } +, + "Ethernet8": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet12": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet24": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet28": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet32": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet36": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet40": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet44": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet48": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet52": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet56": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet60": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet72": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet76": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet88": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet92": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet96": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet100": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet104": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet108": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet112": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet116": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet120": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet124": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet128": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet132": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet140": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet160": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet164": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet172": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet192": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet196": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet204": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet224": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet228": { + "profile_list" : "ingress_lossless_zero_profile" + }, + "Ethernet236": { + "profile_list" : "ingress_lossless_zero_profile" + } + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { + "Ethernet136": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet0": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet4": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet144": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet148": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet16": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet20": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet152": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet156": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet64": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet68": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet168": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet176": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet80": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet84": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet180": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet184": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet188": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet200": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet208": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet212": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet216": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet220": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet232": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet240": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet244": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet248": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + }, + "Ethernet252": { + "profile_list" : "egress_lossless_profile,egress_lossy_profile" + } +, + "Ethernet8": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet12": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet24": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet28": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet32": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet36": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet40": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet44": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet48": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet52": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet56": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet60": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet72": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet76": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet88": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet92": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet96": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet100": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet104": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet108": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet112": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet116": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet120": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet124": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet128": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet132": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet140": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet160": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet164": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet172": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet192": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet196": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet204": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet224": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet228": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + }, + "Ethernet236": { + "profile_list" : "egress_lossless_zero_profile,egress_lossy_zero_profile" + } + }, + "BUFFER_PG": { + "Ethernet0|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet4|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet16|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet20|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet64|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet68|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet80|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet84|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet136|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet144|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet148|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet152|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet156|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet168|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet176|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet180|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet184|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet188|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet200|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet208|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet212|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet216|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet220|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet232|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet240|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet244|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet248|0": { + "profile" : "ingress_lossy_profile" + }, + "Ethernet252|0": { + "profile" : "ingress_lossy_profile" + } +, "Ethernet8|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet12|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet24|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet28|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet32|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet36|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet40|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet44|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet48|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet52|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet56|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet60|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet72|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet76|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet88|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet92|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet96|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet100|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet104|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet108|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet112|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet116|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet120|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet124|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet128|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet132|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet140|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet160|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet164|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet172|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet192|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet196|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet204|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet224|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet228|0": { + "profile" : "ingress_lossy_pg_zero_profile" + }, + "Ethernet236|0": { + "profile" : "ingress_lossy_pg_zero_profile" + } + }, + + "BUFFER_QUEUE": { + "Ethernet0|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet4|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet16|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet20|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet64|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet68|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet80|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet84|3-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet0|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|0-2": { + "profile" : "q_lossy_profile" + }, + "Ethernet0|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet4|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet16|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet20|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet64|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet68|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet80|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet84|5-6": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet136|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet136|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet144|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet144|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet148|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet148|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet152|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet152|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet156|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet156|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet168|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet168|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet176|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet176|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet180|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet180|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet184|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet184|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet188|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet188|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet200|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet200|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet208|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet208|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet212|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet212|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet216|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet216|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet220|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet220|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet232|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet232|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet240|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet240|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet244|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet244|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet248|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet248|7": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|0-1": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|2-4": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|5": { + "profile" : "q_lossy_profile" + }, + "Ethernet252|6": { + "profile" : "egress_lossless_profile" + }, + "Ethernet252|7": { + "profile" : "q_lossy_profile" + } +, + "Ethernet8|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet12|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet24|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet28|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet32|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet36|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet40|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet44|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet48|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet52|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet56|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet60|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet72|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet76|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet88|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet92|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet96|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet100|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet104|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet108|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet112|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet116|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet120|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet124|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet128|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet132|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet140|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet160|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet164|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet172|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet192|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet196|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet204|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet224|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet228|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet236|3-4": { + "profile" : "egress_lossless_zero_profile" + }, + "Ethernet8|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet12|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet24|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet28|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet32|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet36|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet40|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet44|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet48|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet52|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet56|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet60|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet72|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet76|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet88|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet92|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet96|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet100|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet104|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet108|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet112|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet116|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet120|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet124|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet128|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet132|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet140|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet160|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet164|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet172|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet192|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet196|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet204|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet224|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet228|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet236|0-2": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet8|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet12|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet24|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet28|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet32|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet36|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet40|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet44|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet48|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet52|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet56|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet60|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet72|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet76|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet88|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet92|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet96|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet100|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet104|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet108|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet112|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet116|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet120|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet124|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet128|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet132|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet140|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet160|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet164|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet172|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet192|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet196|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet204|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet224|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet228|5-6": { + "profile" : "egress_lossy_zero_profile" + }, + "Ethernet236|5-6": { + "profile" : "egress_lossy_zero_profile" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64-remap-disabled.json b/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64-remap-disabled.json new file mode 100644 index 000000000000..6e15d72074ff --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64-remap-disabled.json @@ -0,0 +1,1005 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "7" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler": "scheduler.0" + }, + "Ethernet144|2": { + "scheduler": "scheduler.0" + }, + "Ethernet148|2": { + "scheduler": "scheduler.0" + }, + "Ethernet152|2": { + "scheduler": "scheduler.0" + }, + "Ethernet156|2": { + "scheduler": "scheduler.0" + }, + "Ethernet168|2": { + "scheduler": "scheduler.0" + }, + "Ethernet176|2": { + "scheduler": "scheduler.0" + }, + "Ethernet180|2": { + "scheduler": "scheduler.0" + }, + "Ethernet184|2": { + "scheduler": "scheduler.0" + }, + "Ethernet188|2": { + "scheduler": "scheduler.0" + }, + "Ethernet200|2": { + "scheduler": "scheduler.0" + }, + "Ethernet208|2": { + "scheduler": "scheduler.0" + }, + "Ethernet212|2": { + "scheduler": "scheduler.0" + }, + "Ethernet216|2": { + "scheduler": "scheduler.0" + }, + "Ethernet220|2": { + "scheduler": "scheduler.0" + }, + "Ethernet232|2": { + "scheduler": "scheduler.0" + }, + "Ethernet240|2": { + "scheduler": "scheduler.0" + }, + "Ethernet244|2": { + "scheduler": "scheduler.0" + }, + "Ethernet248|2": { + "scheduler": "scheduler.0" + }, + "Ethernet252|2": { + "scheduler": "scheduler.0" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler": "scheduler.0" + }, + "Ethernet144|6": { + "scheduler": "scheduler.0" + }, + "Ethernet148|6": { + "scheduler": "scheduler.0" + }, + "Ethernet152|6": { + "scheduler": "scheduler.0" + }, + "Ethernet156|6": { + "scheduler": "scheduler.0" + }, + "Ethernet168|6": { + "scheduler": "scheduler.0" + }, + "Ethernet176|6": { + "scheduler": "scheduler.0" + }, + "Ethernet180|6": { + "scheduler": "scheduler.0" + }, + "Ethernet184|6": { + "scheduler": "scheduler.0" + }, + "Ethernet188|6": { + "scheduler": "scheduler.0" + }, + "Ethernet200|6": { + "scheduler": "scheduler.0" + }, + "Ethernet208|6": { + "scheduler": "scheduler.0" + }, + "Ethernet212|6": { + "scheduler": "scheduler.0" + }, + "Ethernet216|6": { + "scheduler": "scheduler.0" + }, + "Ethernet220|6": { + "scheduler": "scheduler.0" + }, + "Ethernet232|6": { + "scheduler": "scheduler.0" + }, + "Ethernet240|6": { + "scheduler": "scheduler.0" + }, + "Ethernet244|6": { + "scheduler": "scheduler.0" + }, + "Ethernet248|6": { + "scheduler": "scheduler.0" + }, + "Ethernet252|6": { + "scheduler": "scheduler.0" + } + } +} diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64.json b/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64.json new file mode 100644 index 000000000000..7da43b0d8f38 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-mellanox4600c-c64.json @@ -0,0 +1,1111 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "2", + "3": "3", + "4": "4", + "5": "0", + "6": "6", + "7": "0" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0" : "1", + "1" : "1", + "2" : "2", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "6", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + }, + "AZURE_UPLINK": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "14" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "15" + } + }, + "PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet4": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet16": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet20": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet64": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet68": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet80": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet84": { + "dscp_to_tc_map" : "AZURE_UPLINK", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "3,4", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet136": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet144": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet148": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet152": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet156": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet168": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet176": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet180": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet184": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet188": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet200": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet208": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet212": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet216": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet220": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet232": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet240": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet244": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet248": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + }, + "Ethernet252": { + "dscp_to_tc_map" : "AZURE", + "tc_to_queue_map" : "AZURE", + "tc_to_pg_map" : "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable" : "2,3,4,6", + "pfcwd_sw_enable" : "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, + "QUEUE": { + "Ethernet0|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|3": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet4|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet16|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet20|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet64|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet68|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet80|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet84|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet136|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|4": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|0": { + "scheduler": "scheduler.0" + }, + "Ethernet4|0": { + "scheduler": "scheduler.0" + }, + "Ethernet16|0": { + "scheduler": "scheduler.0" + }, + "Ethernet20|0": { + "scheduler": "scheduler.0" + }, + "Ethernet64|0": { + "scheduler": "scheduler.0" + }, + "Ethernet68|0": { + "scheduler": "scheduler.0" + }, + "Ethernet80|0": { + "scheduler": "scheduler.0" + }, + "Ethernet84|0": { + "scheduler": "scheduler.0" + }, + "Ethernet136|0": { + "scheduler": "scheduler.0" + }, + "Ethernet144|0": { + "scheduler": "scheduler.0" + }, + "Ethernet148|0": { + "scheduler": "scheduler.0" + }, + "Ethernet152|0": { + "scheduler": "scheduler.0" + }, + "Ethernet156|0": { + "scheduler": "scheduler.0" + }, + "Ethernet168|0": { + "scheduler": "scheduler.0" + }, + "Ethernet176|0": { + "scheduler": "scheduler.0" + }, + "Ethernet180|0": { + "scheduler": "scheduler.0" + }, + "Ethernet184|0": { + "scheduler": "scheduler.0" + }, + "Ethernet188|0": { + "scheduler": "scheduler.0" + }, + "Ethernet200|0": { + "scheduler": "scheduler.0" + }, + "Ethernet208|0": { + "scheduler": "scheduler.0" + }, + "Ethernet212|0": { + "scheduler": "scheduler.0" + }, + "Ethernet216|0": { + "scheduler": "scheduler.0" + }, + "Ethernet220|0": { + "scheduler": "scheduler.0" + }, + "Ethernet232|0": { + "scheduler": "scheduler.0" + }, + "Ethernet240|0": { + "scheduler": "scheduler.0" + }, + "Ethernet244|0": { + "scheduler": "scheduler.0" + }, + "Ethernet248|0": { + "scheduler": "scheduler.0" + }, + "Ethernet252|0": { + "scheduler": "scheduler.0" + }, + "Ethernet0|1": { + "scheduler": "scheduler.0" + }, + "Ethernet4|1": { + "scheduler": "scheduler.0" + }, + "Ethernet16|1": { + "scheduler": "scheduler.0" + }, + "Ethernet20|1": { + "scheduler": "scheduler.0" + }, + "Ethernet64|1": { + "scheduler": "scheduler.0" + }, + "Ethernet68|1": { + "scheduler": "scheduler.0" + }, + "Ethernet80|1": { + "scheduler": "scheduler.0" + }, + "Ethernet84|1": { + "scheduler": "scheduler.0" + }, + "Ethernet136|1": { + "scheduler": "scheduler.0" + }, + "Ethernet144|1": { + "scheduler": "scheduler.0" + }, + "Ethernet148|1": { + "scheduler": "scheduler.0" + }, + "Ethernet152|1": { + "scheduler": "scheduler.0" + }, + "Ethernet156|1": { + "scheduler": "scheduler.0" + }, + "Ethernet168|1": { + "scheduler": "scheduler.0" + }, + "Ethernet176|1": { + "scheduler": "scheduler.0" + }, + "Ethernet180|1": { + "scheduler": "scheduler.0" + }, + "Ethernet184|1": { + "scheduler": "scheduler.0" + }, + "Ethernet188|1": { + "scheduler": "scheduler.0" + }, + "Ethernet200|1": { + "scheduler": "scheduler.0" + }, + "Ethernet208|1": { + "scheduler": "scheduler.0" + }, + "Ethernet212|1": { + "scheduler": "scheduler.0" + }, + "Ethernet216|1": { + "scheduler": "scheduler.0" + }, + "Ethernet220|1": { + "scheduler": "scheduler.0" + }, + "Ethernet232|1": { + "scheduler": "scheduler.0" + }, + "Ethernet240|1": { + "scheduler": "scheduler.0" + }, + "Ethernet244|1": { + "scheduler": "scheduler.0" + }, + "Ethernet248|1": { + "scheduler": "scheduler.0" + }, + "Ethernet252|1": { + "scheduler": "scheduler.0" + }, + "Ethernet0|2": { + "scheduler": "scheduler.0" + }, + "Ethernet4|2": { + "scheduler": "scheduler.0" + }, + "Ethernet16|2": { + "scheduler": "scheduler.0" + }, + "Ethernet20|2": { + "scheduler": "scheduler.0" + }, + "Ethernet64|2": { + "scheduler": "scheduler.0" + }, + "Ethernet68|2": { + "scheduler": "scheduler.0" + }, + "Ethernet80|2": { + "scheduler": "scheduler.0" + }, + "Ethernet84|2": { + "scheduler": "scheduler.0" + }, + "Ethernet136|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|2": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet0|5": { + "scheduler": "scheduler.0" + }, + "Ethernet4|5": { + "scheduler": "scheduler.0" + }, + "Ethernet16|5": { + "scheduler": "scheduler.0" + }, + "Ethernet20|5": { + "scheduler": "scheduler.0" + }, + "Ethernet64|5": { + "scheduler": "scheduler.0" + }, + "Ethernet68|5": { + "scheduler": "scheduler.0" + }, + "Ethernet80|5": { + "scheduler": "scheduler.0" + }, + "Ethernet84|5": { + "scheduler": "scheduler.0" + }, + "Ethernet136|5": { + "scheduler": "scheduler.0" + }, + "Ethernet144|5": { + "scheduler": "scheduler.0" + }, + "Ethernet148|5": { + "scheduler": "scheduler.0" + }, + "Ethernet152|5": { + "scheduler": "scheduler.0" + }, + "Ethernet156|5": { + "scheduler": "scheduler.0" + }, + "Ethernet168|5": { + "scheduler": "scheduler.0" + }, + "Ethernet176|5": { + "scheduler": "scheduler.0" + }, + "Ethernet180|5": { + "scheduler": "scheduler.0" + }, + "Ethernet184|5": { + "scheduler": "scheduler.0" + }, + "Ethernet188|5": { + "scheduler": "scheduler.0" + }, + "Ethernet200|5": { + "scheduler": "scheduler.0" + }, + "Ethernet208|5": { + "scheduler": "scheduler.0" + }, + "Ethernet212|5": { + "scheduler": "scheduler.0" + }, + "Ethernet216|5": { + "scheduler": "scheduler.0" + }, + "Ethernet220|5": { + "scheduler": "scheduler.0" + }, + "Ethernet232|5": { + "scheduler": "scheduler.0" + }, + "Ethernet240|5": { + "scheduler": "scheduler.0" + }, + "Ethernet244|5": { + "scheduler": "scheduler.0" + }, + "Ethernet248|5": { + "scheduler": "scheduler.0" + }, + "Ethernet252|5": { + "scheduler": "scheduler.0" + }, + "Ethernet0|6": { + "scheduler": "scheduler.0" + }, + "Ethernet4|6": { + "scheduler": "scheduler.0" + }, + "Ethernet16|6": { + "scheduler": "scheduler.0" + }, + "Ethernet20|6": { + "scheduler": "scheduler.0" + }, + "Ethernet64|6": { + "scheduler": "scheduler.0" + }, + "Ethernet68|6": { + "scheduler": "scheduler.0" + }, + "Ethernet80|6": { + "scheduler": "scheduler.0" + }, + "Ethernet84|6": { + "scheduler": "scheduler.0" + }, + "Ethernet136|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet144|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet148|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet152|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet156|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet168|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet176|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet180|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet184|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet188|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet200|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet208|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet212|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet216|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet220|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet232|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet240|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet244|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet248|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + }, + "Ethernet252|6": { + "scheduler" : "scheduler.1", + "wred_profile": "AZURE_LOSSLESS" + } + } +} diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 735bf9c3bbc6..fef27be40b7e 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -358,8 +358,10 @@ def test_qos_dscp_remapping_render_template(self): '../../../device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8', '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8', '../../../device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64', + '../../../device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64', + '../../../device/mellanox/x86_64-mlnx_msn4600c-r0/Mellanox-SN4600C-C64', '../../../device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S' - ] + ] sample_outputs = [ 'qos-arista7050cx3-dualtor.json', 'qos-arista7260-dualtor.json', @@ -367,6 +369,8 @@ def test_qos_dscp_remapping_render_template(self): 'qos-arista7050cx3-dualtor-remap-disabled.json', 'qos-arista7260-dualtor-remap-disabled.json', 'qos-arista7260-t1-remap-disabled.json', + 'qos-mellanox4600c-c64.json', + 'qos-mellanox4600c-c64-remap-disabled.json', 'qos-arista7050-t0-storage-backend.json' ] sample_minigraph_files = [ @@ -376,8 +380,11 @@ def test_qos_dscp_remapping_render_template(self): 'sample-arista-7050cx3-dualtor-minigraph-remap-disabled.xml', 'sample-arista-7260-dualtor-minigraph-remap-disabled.xml', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', + 'sample-mellanox-4600c-t1-minigraph.xml', + 'sample-mellanox-4600c-t1-minigraph-remap-disabled.xml', 'sample-arista-7050-t0-storage-backend-minigraph.xml' ] + for i, path in enumerate(dir_paths): device_template_path = os.path.join(self.test_dir, path) sample_output = sample_outputs[i] @@ -483,7 +490,7 @@ def test_extra_lossless_buffer_for_tunnel_remapping(self): if utils.PYvX_DIR != 'py3': # Skip on python2 as the change will not be backported to previous version return - + TEST_DATA = [ # (vendor, platform, sku, minigraph, buffer_template, sample_output ) ('arista', 'x86_64-arista_7050cx3_32s', 'Arista-7050CX3-32S-D48C8', 'sample-arista-7050cx3-dualtor-minigraph.xml', 'buffers.json.j2', 'buffer-arista7050cx3-dualtor.json'), @@ -491,7 +498,11 @@ def test_extra_lossless_buffer_for_tunnel_remapping(self): ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-D108C8', 'sample-arista-7260-dualtor-minigraph.xml', 'buffers.json.j2', 'buffer-arista7260-dualtor.json'), ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-D108C8', 'sample-arista-7260-dualtor-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-dualtor-remap-disabled.json'), ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph.xml', 'buffers.json.j2', 'buffer-arista7260-t1.json'), - ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-t1-remap-disabled.json') + ('arista', 'x86_64-arista_7260cx3_64', 'Arista-7260CX3-C64', 'sample-arista-7260-t1-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffer-arista7260-t1-remap-disabled.json'), + ('mellanox', 'x86_64-mlnx_msn4600c-r0', 'Mellanox-SN4600C-C64', 'sample-mellanox-4600c-t1-minigraph.xml', 'buffers_dynamic.json.j2', 'buffers-mellanox4600c-t1-dynamic.json'), + ('mellanox', 'x86_64-mlnx_msn4600c-r0', 'Mellanox-SN4600C-C64', 'sample-mellanox-4600c-t1-minigraph.xml', 'buffers.json.j2', 'buffers-mellanox4600c-t1.json'), + ('mellanox', 'x86_64-mlnx_msn4600c-r0', 'Mellanox-SN4600C-C64', 'sample-mellanox-4600c-t1-minigraph-remap-disabled.xml', 'buffers_dynamic.json.j2', 'buffers-mellanox4600c-t1-dynamic-remap-disabled.json'), + ('mellanox', 'x86_64-mlnx_msn4600c-r0', 'Mellanox-SN4600C-C64', 'sample-mellanox-4600c-t1-minigraph-remap-disabled.xml', 'buffers.json.j2', 'buffers-mellanox4600c-t1-remap-disabled.json') ] for test_data in TEST_DATA: From e4e3adcbc2b47174e2ccfb307f6258ba3cd26b04 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Wed, 20 Jul 2022 10:05:13 +0300 Subject: [PATCH 579/817] [ssip]: Update config generator (#10991) - Why I did it To implement Syslog Source IP feature In order to include the following commit: 8e5d478 [ssip]: Add CLI (#2191) - How I did it Updated syslog config template Advanced submodule sonic-utilities ea11b22 [sonic-bootchart] add sonic-bootchart (#2195) 8e5d478 [ssip]: Add CLI (#2191) 1dacb7f Replace pyswsssdk with swsscommon (#2251) - How to verify it make configure PLATFORM=mellanox make target/sonic-mellanox.bin Signed-off-by: Nazarii Hnydyn --- files/image_config/rsyslog/rsyslog.conf.j2 | 32 ++++++++++++++++++---- src/sonic-utilities | 2 +- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index 37410293a45f..5db3ec86b795 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -40,11 +40,6 @@ $UDPServerRun 514 $template SONiCFileFormat,"%timegenerated%.%timegenerated:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" $ActionFileDefaultTemplate SONiCFileFormat -#Set remote syslog server -{% for server in SYSLOG_SERVER %} -*.* @[{{ server }}]:514;SONiCFileFormat -{% endfor %} - # # Set the default permissions for all log files. # @@ -72,3 +67,30 @@ $RepeatedMsgReduction on ############### #### RULES #### ############### + +# +# Remote syslog logging +# + +# The omfwd plug-in provides the core functionality of traditional message forwarding via UDP and plain TCP. +# It is a built-in module that does not need to be loaded. + +{% if SYSLOG_SERVER is defined %} +{% for server, data in SYSLOG_SERVER.items() %} +{% set params_list = [] %} +{% if 'source' in data %} +{% set dummy = params_list.append('address=' + '"' + data.source|string + '"') %} +{% endif %} +{% if 'port' in data %} +{% set dummy = params_list.append('port=' + '"' + data.port|string + '"') %} +{% endif %} +{% if 'vrf' in data and data['vrf'] != "default" %} +{% set dummy = params_list.append('device=' + '"' + data.vrf|string + '"') %} +{% endif %} +{% if params_list %} +*.* action(type="omfwd" target="{{ server }}" protocol="udp" {{ params_list|join(' ') }} template="SONiCFileFormat") +{% else %} +*.* action(type="omfwd" target="{{ server }}" protocol="udp" template="SONiCFileFormat") +{% endif %} +{% endfor %} +{% endif %} diff --git a/src/sonic-utilities b/src/sonic-utilities index d6b886989cc1..ea11b22f596f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit d6b886989cc1f2104613c2cb21d406f9ab5127dc +Subproject commit ea11b22f596fb90c2d85cc27c0f73b50039a42ad From ae2f37e658a2316163a9da1a956129e72ea4b9fd Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 21 Jul 2022 08:24:39 -0700 Subject: [PATCH 580/817] [minigraph] allow LibraPeeringLink to be dualtor indication as well (#11492) Signed-off-by: Ying Xie --- src/sonic-config-engine/minigraph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index ee6a84183e2c..952dca4ae558 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -999,7 +999,7 @@ def parse_linkmeta(meta, hname): value = device_property.find(str(QName(ns1, "Value"))).text if name == "FECDisabled": fec_disabled = value - elif name == "GeminiPeeringLink": + elif name in [ "GeminiPeeringLink", "LibraPeeringLink" ]: has_peer_switch = True elif name == "UpperTOR": upper_tor_hostname = value From 5b032356cff2188976d94acebe710bd6c2ca5d18 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 22 Jul 2022 00:16:19 +0800 Subject: [PATCH 581/817] Update sonic-swss submodule (#11466) Co-authored-by: liuh-80 --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 7126857c1e38..90459953c820 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 7126857c1e387784bd04b9f7502018b2a4973d85 +Subproject commit 90459953c8206381d4b6ebf137e6bbd74eb212f8 From 5df09490dc059e59a357a6056792d3e1ee5d36c2 Mon Sep 17 00:00:00 2001 From: gregshpit Date: Fri, 22 Jul 2022 00:15:16 +0300 Subject: [PATCH 582/817] =?UTF-8?q?Ported=20Marvell=20armhf=20build=20on?= =?UTF-8?q?=20amd64=20host=20for=20debian=20buster=20to=20use=20cross-comp?= =?UTF-8?q?=E2=80=A6=20(#8035)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ported Marvell armhf build on x86 for debian buster to use cross-compilation instead of qemu emulation Current armhf Sonic build on amd64 host uses qemu emulation. Due to the nature of the emulation it takes a very long time, about 22-24 hours to complete the build. The change I did to reduce the building time by porting Sonic armhf build on amd64 host for Marvell platform for debian buster to use cross-compilation on arm64 host for armhf target. The overall Sonic armhf building time using cross-compilation reduced to about 6 hours. Signed-off-by: marvell * Fixed final Sonic image build with dockers inside * Update Dockerfile.j2 Fixed qemu-user-static:x86_64-aarch64-5.0.0-2 . * Update cross-build-arm-python-reqirements.sh Added support for both armhf and arm64 cross-build platform using $PY_PLAT environment variable. * Update Makefile Added TARGET= for armhf/arm64 cross-compilation. * Reviewer's @qiluo-msft requests done Signed-off-by: marvell * Added new radius/pam patch for arm64 support * Update slave.mk Added missing back tick. * Added libgtest-dev: libgmock-dev: to the buster Dockerfile.j2. Fixed arm perl version to be generic * Added missing armhf/arm64 entries in /etc/apt/sources.list * fix libc-bin core dump issue from xumia:fix-libc-bin-install-issue commit * Removed unnecessary 'apt-get update' from sonic-slave-buster/Dockerfile.j2 * Fixed saiarcot895 reviewer's requests * Fixed README and replaced 'sed/awk' with patches * Fixed ntp build to use openssl * Unuse sonic-slave-buster/cross-build-arm-python-reqirements.sh script (put all prebuilt python packages cross-compilation/install inside Dockerfile.j2). Fixed src/snmpd/Makefile to use -j1 in all cases * Clean armhf cross-compilation build fixes * Ported cross-compilation armhf build to bullseye * Additional change for bullseye * Set CROSS_BUILD_ENVIRON default value n * Removed python2 references * Fixes after merge with the upstream * Deleted unused sonic-slave-buster/cross-build-arm-python-reqirements.sh file * Fixed 2 @saiarcot895 requests * Fixed @saiarcot895 reviewer's requests * Removed use of prebuilt python wheels * Incorporated saiarcot895 CC/CXX and other simplification/generalization changes Signed-off-by: marvell * Fixed saiarcot895 reviewer's additional requests * src/libyang/patch/debian-packaging-files.patch * Removed --no-deps option when installing wheels. Removed unnecessary lazy_object_proxy arm python3 package instalation Co-authored-by: marvell Co-authored-by: marvell --- Makefile.work | 17 +- README.md | 11 + build_debian.sh | 6 +- dockers/docker-base-bullseye/Dockerfile.j2 | 4 +- dockers/docker-base-buster/Dockerfile.j2 | 4 +- .../build_templates/sonic_debian_extension.j2 | 6 +- platform/marvell-armhf/prestera/debian/rules | 2 + rules/libyang.mk | 6 +- rules/systemd-sonic-generator.mk | 2 +- scripts/build_debian_base_system.sh | 2 +- slave.mk | 75 +++++- sonic-slave-bullseye/Dockerfile.j2 | 116 ++++++++- sonic-slave-bullseye/Dockerfile.user.j2 | 2 +- .../disable-non-manylinux.patch | 10 + sonic-slave-buster/Dockerfile.j2 | 117 ++++++++- sonic-slave-buster/Dockerfile.user.j2 | 2 +- src/bash/Makefile | 5 +- src/ethtool/Makefile | 2 + src/hiredis/Makefile | 4 + src/ifupdown2/Makefile | 4 + src/initramfs-tools/Makefile | 4 + src/iproute2/Makefile | 5 + .../patch/cross-compile-changes.patch | 12 + src/iptables/Makefile | 4 + src/isc-dhcp/Makefile | 4 + src/kdump-tools/Makefile | 4 + .../patch/cross-compile-changes.patch | 14 ++ src/libnl3/Makefile | 5 + src/libteam/Makefile | 4 + src/libyang/Makefile | 19 +- .../patch/debian-packaging-files.patch | 233 ++++++++++++++++++ src/libyang/patch/series | 1 + src/libyang1/Makefile | 4 + src/libyang2/Makefile | 5 + src/lldpd/Makefile | 4 + src/lm-sensors/Makefile | 4 + src/monit/Makefile | 8 + src/monit/patch/cross-compile-changes.patch | 13 + src/mpdecimal/Makefile | 4 + src/ntp/Makefile | 13 + src/openssh/Makefile | 6 + src/openssh/patch/cross-compile-changes.patch | 13 + src/radius/nss/Makefile | 4 + src/radius/pam/Makefile | 9 + .../patches/libltdl_config_sub.patch | 20 ++ src/redis/Makefile | 4 + src/sflow/hsflowd/Makefile | 4 + .../patch/0002-host_sflow_debian.patch | 2 +- src/sflow/psample/Makefile | 4 + src/sflow/psample/debian/psample.install | 4 - src/sflow/psample/debian/rules | 11 +- src/sflow/sflowtool/Makefile | 4 + src/snmpd/Makefile | 4 + .../cross-compile-changes.patch | 17 ++ src/snmpd/patch-5.7.3+dfsg/series | 1 + .../cross-compile-changes.patch | 17 ++ src/snmpd/patch-5.9+dfsg/series | 1 + src/socat/Makefile | 4 + src/sonic-device-data/Makefile | 4 + src/sonic-frr/Makefile | 15 +- .../patch/cross-compile-changes.patch | 86 +++++++ src/sonic-frr/patch/series | 1 + src/swig/Makefile | 4 + src/systemd-sonic-generator/Makefile | 16 +- src/systemd-sonic-generator/debian/control | 5 + src/systemd-sonic-generator/debian/rules | 14 +- src/tacacs/audisp/Makefile | 6 +- src/tacacs/nss/Makefile | 4 + src/tacacs/pam/Makefile | 4 + src/thrift/Makefile | 4 + src/wpasupplicant/Makefile | 4 + 71 files changed, 968 insertions(+), 89 deletions(-) create mode 100644 sonic-slave-bullseye/disable-non-manylinux.patch create mode 100644 src/iproute2/patch/cross-compile-changes.patch create mode 100644 src/kdump-tools/patch/cross-compile-changes.patch create mode 100644 src/libyang/patch/debian-packaging-files.patch create mode 100644 src/monit/patch/cross-compile-changes.patch create mode 100644 src/openssh/patch/cross-compile-changes.patch create mode 100644 src/radius/pam/freeradius/patches/libltdl_config_sub.patch delete mode 100644 src/sflow/psample/debian/psample.install create mode 100644 src/snmpd/patch-5.7.3+dfsg/cross-compile-changes.patch create mode 100644 src/snmpd/patch-5.9+dfsg/cross-compile-changes.patch create mode 100644 src/sonic-frr/patch/cross-compile-changes.patch diff --git a/Makefile.work b/Makefile.work index c9db8b00f81a..3db1f03ab98f 100644 --- a/Makefile.work +++ b/Makefile.work @@ -139,13 +139,21 @@ endif ifeq ($(CONFIGURED_ARCH),amd64) SLAVE_BASE_IMAGE = $(SLAVE_DIR) MULTIARCH_QEMU_ENVIRON = n +CROSS_BUILD_ENVIRON = n else ifeq ($(CONFIGURED_ARCH), $(COMPILE_HOST_ARCH)) SLAVE_BASE_IMAGE = $(SLAVE_DIR) MULTIARCH_QEMU_ENVIRON = n +CROSS_BUILD_ENVIRON = n else ifneq ($(CONFIGURED_ARCH),) SLAVE_BASE_IMAGE = $(SLAVE_DIR)-march-$(CONFIGURED_ARCH) +ifneq ($(CROSS_BLDENV),) +MULTIARCH_QEMU_ENVIRON = n +CROSS_BUILD_ENVIRON = y +else MULTIARCH_QEMU_ENVIRON = y +CROSS_BUILD_ENVIRON = n +endif endif endif SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER_LC) @@ -169,8 +177,8 @@ $(shell SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \ scripts/generate_buildinfo_config.sh) # Generate the slave Dockerfile, and prepare build info for it -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) $(shell BUILD_SLAVE=y DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV)) # Add the versions in the tag, if the version change, need to rebuild the slave @@ -272,7 +280,7 @@ ifneq ($(MULTIARCH_QEMU_ENVIRON), y) endif endif -ifeq ($(MULTIARCH_QEMU_ENVIRON), y) +ifneq ($(filter y, $(MULTIARCH_QEMU_ENVIRON) $(CROSS_BUILD_ENVIRON)),) ifeq ($(DOCKER_DATA_ROOT_FOR_MULTIARCH),) DOCKER_DATA_ROOT_FOR_MULTIARCH := /var/lib/march/docker endif @@ -344,6 +352,7 @@ SONIC_BUILD_INSTRUCTION := make \ PLATFORM=$(PLATFORM) \ PLATFORM_ARCH=$(PLATFORM_ARCH) \ MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ + CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ BUILD_NUMBER=$(BUILD_NUMBER) \ BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \ SONIC_IMAGE_VERSION=$(SONIC_IMAGE_VERSION) \ @@ -405,7 +414,7 @@ SONIC_BUILD_INSTRUCTION := make \ .DEFAULT_GOAL := all %:: -ifeq ($(MULTIARCH_QEMU_ENVIRON), y) +ifneq ($(filter y, $(MULTIARCH_QEMU_ENVIRON) $(CROSS_BUILD_ENVIRON)),) @$(DOCKER_MULTIARCH_CHECK) ifneq ($(BLDENV), ) @$(DOCKER_SERVICE_MULTIARCH_CHECK) diff --git a/README.md b/README.md index 5334bbe18dbd..a3ca0cdb4e30 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,17 @@ To build Arm32 bit for (ARMHF) platform make target/sonic-marvell-armhf.bin +To build Arm32 bit for (ARMHF) Marvell platform on amd64 host for debian buster using cross-compilation run the following commands: + + # Execute make configure once to configure ASIC and ARCH for cross-compilation build + + NOJESSIE=1 NOSTRETCH=1 BLDENV=buster CROSS_BLDENV=1 make configure PLATFORM=marvell-armhf PLATFORM_ARCH=armhf + + # Execute Arm32 build using cross-compilation environment + + NOJESSIE=1 NOSTRETCH=1 BLDENV=buster CROSS_BLDENV=1 make target/sonic-marvell-armhf.bin + +Running the above Arm32 build using cross-compilation instead of qemu emulator drastically reduces the build time. To build Arm64 bit for platform diff --git a/build_debian.sh b/build_debian.sh index 92ecb7ac1653..1dd77f3bee6e 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -123,6 +123,10 @@ echo 'Dir::Bin::dpkg "/usr/local/bin/dpkg";' | sudo tee $FILESYSTEM_ROOT/etc/apt echo '[INFO] Install packages for building image' sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install makedev psmisc +if [[ $CROSS_BUILD_ENVIRON == y ]]; then + sudo LANG=C chroot $FILESYSTEM_ROOT dpkg --add-architecture $CONFIGURED_ARCH +fi + ## Create device files echo '[INFO] MAKEDEV' if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then @@ -643,7 +647,7 @@ fi # ALERT: This bit of logic tears down the qemu based build environment used to # perform builds for the ARM architecture. This must be the last step in this # script before creating the Sonic installer payload zip file. -if [ $MULTIARCH_QEMU_ENVIRON == y ]; then +if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then # Remove qemu arm bin executable used for cross-building sudo rm -f $FILESYSTEM_ROOT/usr/bin/qemu*static || true DOCKERFS_PATH=../dockerfs/ diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index f47d56468102..d488c5f1f0ce 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -1,8 +1,8 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -{% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} +{% if CONFIGURED_ARCH == "armhf" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} FROM {{ prefix }}multiarch/debian-debootstrap:armhf-bullseye -{% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} +{% elif CONFIGURED_ARCH == "arm64" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} FROM {{ prefix }}multiarch/debian-debootstrap:arm64-bullseye {% else %} FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bullseye diff --git a/dockers/docker-base-buster/Dockerfile.j2 b/dockers/docker-base-buster/Dockerfile.j2 index 52c784e9a7fe..9118287cac39 100644 --- a/dockers/docker-base-buster/Dockerfile.j2 +++ b/dockers/docker-base-buster/Dockerfile.j2 @@ -1,8 +1,8 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -{% if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} +{% if CONFIGURED_ARCH == "armhf" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} FROM {{ prefix }}multiarch/debian-debootstrap:armhf-buster -{% elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} +{% elif CONFIGURED_ARCH == "arm64" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} FROM {{ prefix }}multiarch/debian-debootstrap:arm64-buster {% else %} FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:buster diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 57449e655c2d..a15822046b61 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -68,7 +68,7 @@ sudo bash -c "echo \"DOCKER_OPTS=\"--storage-driver=overlay2\"\" >> $FILESYSTEM_ # Copy docker start script to be able to start docker in chroot sudo mkdir -p "$FILESYSTEM_ROOT/$DOCKER_CTL_DIR" sudo cp $DOCKER_SCRIPTS_DIR/docker "$FILESYSTEM_ROOT/$DOCKER_CTL_SCRIPT" -if [ $MULTIARCH_QEMU_ENVIRON == y ]; then +if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then DOCKER_HOST="unix:///dockerfs/var/run/docker.sock" SONIC_NATIVE_DOCKERD_FOR_DOCKERFS_PID="cat `pwd`/dockerfs/var/run/docker.pid" else @@ -670,7 +670,7 @@ EOF {% endif %} ## Bind docker path -if [ $MULTIARCH_QEMU_ENVIRON == y ]; then +if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then sudo mkdir -p $FILESYSTEM_ROOT/dockerfs sudo mount --bind dockerfs $FILESYSTEM_ROOT/dockerfs fi @@ -755,7 +755,7 @@ sudo LANG=C DOCKER_HOST="$DOCKER_HOST" chroot $FILESYSTEM_ROOT sonic-package-man sudo umount $FILESYSTEM_ROOT/target sudo rm -r $FILESYSTEM_ROOT/target -if [ $MULTIARCH_QEMU_ENVIRON == y ]; then +if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then sudo umount $FILESYSTEM_ROOT/dockerfs sudo rm -fr $FILESYSTEM_ROOT/dockerfs sudo kill -9 `sudo $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS_PID` || true diff --git a/platform/marvell-armhf/prestera/debian/rules b/platform/marvell-armhf/prestera/debian/rules index d3895c2f769a..069ff0a11916 100755 --- a/platform/marvell-armhf/prestera/debian/rules +++ b/platform/marvell-armhf/prestera/debian/rules @@ -3,7 +3,9 @@ include /usr/share/dpkg/pkg-info.mk PACKAGE_PRE_NAME := mrvlprestera +ifneq ($(CROSS_BUILD_ENVIRON), y) KVERSION ?= $(shell uname -r) +endif KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) MODULE_DIR := mrvl-prestera/cpssEnabler/linuxNoKernelModule/drivers diff --git a/rules/libyang.mk b/rules/libyang.mk index b361c9796b92..a8e6734459ea 100644 --- a/rules/libyang.mk +++ b/rules/libyang.mk @@ -18,8 +18,8 @@ SONIC_MAKE_DEBS += $(LIBYANG) LIBYANG_DEV = libyang-dev_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_DEV))) -LIBYANG_DBG = libyang-dbg_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb -$(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_DBG))) +LIBYANG_DBGSYM = libyang-dbgsym_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_DBGSYM))) LIBYANG_CPP = libyang-cpp_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb $(LIBYANG_CPP)_DEPENDS += $(LIBYANG) @@ -32,4 +32,4 @@ $(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_PY3))) $(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1),$(LIBYANG2))) $(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV),$(LIBYANG2_DEV))) -export LIBYANG LIBYANG_DBG LIBYANG_DEV LIBYANG_CPP LIBYANG_PY3 +export LIBYANG LIBYANG_DBGSYM LIBYANG_DEV LIBYANG_CPP LIBYANG_PY3 diff --git a/rules/systemd-sonic-generator.mk b/rules/systemd-sonic-generator.mk index cea08099177f..80d9b65f5e00 100644 --- a/rules/systemd-sonic-generator.mk +++ b/rules/systemd-sonic-generator.mk @@ -1,3 +1,3 @@ SYSTEMD_SONIC_GENERATOR = systemd-sonic-generator_1.0.0_$(CONFIGURED_ARCH).deb $(SYSTEMD_SONIC_GENERATOR)_SRC_PATH = $(SRC_PATH)/systemd-sonic-generator -SONIC_MAKE_DEBS += $(SYSTEMD_SONIC_GENERATOR) +SONIC_DPKG_DEBS += $(SYSTEMD_SONIC_GENERATOR) diff --git a/scripts/build_debian_base_system.sh b/scripts/build_debian_base_system.sh index a403791e5242..1532befdbe58 100755 --- a/scripts/build_debian_base_system.sh +++ b/scripts/build_debian_base_system.sh @@ -23,7 +23,7 @@ generate_version_file() if [ "$ENABLE_VERSION_CONTROL_DEB" != "y" ] || [ ! -d files/build/versions/host-base-image ]; then if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then - if [ $MULTIARCH_QEMU_ENVIRON == "y" ]; then + if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then # qemu arm bin executable for cross-building sudo mkdir -p $FILESYSTEM_ROOT/usr/bin sudo cp /usr/bin/qemu*static $FILESYSTEM_ROOT/usr/bin || true diff --git a/slave.mk b/slave.mk index 8a400a8c88c4..2e648b37f4c8 100644 --- a/slave.mk +++ b/slave.mk @@ -59,6 +59,7 @@ ifeq ($(CONFIGURED_ARCH),arm64) override DOCKER_BASE_ARCH = arm64v8 endif endif + IMAGE_DISTRO := bullseye IMAGE_DISTRO_DEBS_PATH = $(TARGET_PATH)/debs/$(IMAGE_DISTRO) IMAGE_DISTRO_FILES_PATH = $(TARGET_PATH)/files/$(IMAGE_DISTRO) @@ -81,6 +82,7 @@ export IMAGE_DISTRO export IMAGE_DISTRO_DEBS_PATH export MULTIARCH_QEMU_ENVIRON export DOCKER_BASE_ARCH +export CROSS_BUILD_ENVIRON export BLDENV ############################################################################### @@ -274,6 +276,46 @@ ifeq ($(CONFIGURED_PLATFORM),vs) export BUILD_MULTIASIC_KVM endif +ifeq ($(CROSS_BUILD_ENVIRON),y) +DEB_BUILD_OPTIONS_GENERIC += nocheck +export $(dpkg-architecture -a$(CONFIGURED_ARCH)) +ifeq ($(ENABLE_PY2_MODULES),n) +ANT_DEB_CROSS_PROFILES=nopython2 +endif +ANT_DEB_CROSS_OPT := -a$(CONFIGURED_ARCH) -Pcross,nocheck,$(ANT_DEB_CROSS_PROFILES) +ANT_DEB_CONFIG := CONFIG_SITE=/etc/dpkg-cross/cross-config.$(CONFIGURED_ARCH) + +VIRTENV_BASE_CROSS_PYTHON2 = /python_virtualenv/env2/ +VIRTENV_BASE_CROSS_PYTHON3 = /python_virtualenv/env3/ +VIRTENV_BIN_CROSS_PYTHON2 = $(VIRTENV_BASE_CROSS_PYTHON2)/bin/ +VIRTENV_BIN_CROSS_PYTHON3 = $(VIRTENV_BASE_CROSS_PYTHON3)/bin/ +VIRTENV_LIB_CROSS_PYTHON2 = $(VIRTENV_BASE_CROSS_PYTHON2)/lib/ +VIRTENV_LIB_CROSS_PYTHON3 = $(VIRTENV_BASE_CROSS_PYTHON3)/lib/ + +CROSS_HOST_TYPE = $(shell dpkg-architecture -a $(CONFIGURED_ARCH) -q DEB_HOST_MULTIARCH) + +ifeq ($(CONFIGURED_ARCH),armhf) +GOARCH=arm +else ifeq ($(CONFIGURED_ARCH),arm64) +GOARCH=arm64 +endif + +CROSS_COMPILE = $(CROSS_HOST_TYPE)- +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +AR = $(CROSS_COMPILE)ar +LD = $(CROSS_COMPILE)ld +CROSS_LIB_PATH = /usr/$(CROSS_HOST_TYPE)/lib/ +CROSS_BIN_PATH = /usr/$(CROSS_HOST_TYPE)/bin/ +CROSS_PKGS_LIB_PATH = /usr/lib/$(CROSS_HOST_TYPE) + +CROSS_LIBPERL_VERSION = $(shell dpkg -s libperl-dev:$(CONFIGURED_ARCH)|grep Version|awk '{split($$2,v,"-"); print v[1];}') +CROSS_PERL_CORE_PATH = $(CROSS_PKGS_LIB_PATH)/perl/$(CROSS_LIBPERL_VERSION)/CORE/ + +CROSS_COMPILE_FLAGS := CGO_ENABLED=1 GOOS=linux GOARCH=$(GOARCH) CROSS_COMPILE=$(CROSS_COMPILE) OVERRIDE_HOST_TYPE=$(CROSS_HOST_TYPE) CROSS_LIB_PATH=$(CROSS_LIB_PATH) CROSS_BIN_PATH=$(CROSS_BIN_PATH) CROSS_HOST_TYPE=$(CROSS_HOST_TYPE) CROSS_PKGS_LIB_PATH=$(CROSS_PKGS_LIB_PATH) CROSS_PERL_CORE_PATH=$(CROSS_PERL_CORE_PATH) CC=$(CC) CXX=$(CXX) AR=$(AR) LD=$(LD) + +endif + ############################################################################### ## Routing stack related exports ############################################################################### @@ -358,6 +400,7 @@ $(info "DEFAULT_CONTAINER_REGISTRY" : "$(SONIC_DEFAULT_CONTAINER_REGISTRY)" ifeq ($(CONFIGURED_PLATFORM),vs) $(info "BUILD_MULTIASIC_KVM" : "$(BUILD_MULTIASIC_KVM)") endif +$(info "CROSS_BUILD_ENVIRON" : "$(CROSS_BUILD_ENVIRON)") $(info ) else $(info SONiC Build System for $(CONFIGURED_PLATFORM):$(CONFIGURED_ARCH)) @@ -580,7 +623,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(a if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi # Build project and take package $(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR) - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC}" make -j$(SONIC_CONFIG_MAKE_JOBS) DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) + DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) make -j$(SONIC_CONFIG_MAKE_JOBS) DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) # Clean up if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; [ -d .pc ] && rm -rf .pc; popd; fi @@ -623,8 +666,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a if [ -f ./autogen.sh ]; then ./autogen.sh $(LOG); fi $(SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR) $(if $($*_DPKG_TARGET), - ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) --admindir $$mergedir $(LOG), - ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $$mergedir $(LOG) + ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) --admindir $$mergedir $(LOG), + ${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" $(ANT_DEB_CONFIG) $(CROSS_COMPILE_FLAGS) dpkg-buildpackage -rfakeroot -b $(ANT_DEB_CROSS_OPT) -us -uc -tc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $$mergedir $(LOG) ) popd $(LOG_SIMPLE) # Clean up @@ -691,7 +734,15 @@ $(SONIC_INSTALL_DEBS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -install { while dpkg -s $(firstword $(subst _, ,$(basename $(deb)))) | grep "^Version: $(word 2, $(subst _, ,$(basename $(deb))))" &> /dev/null; do echo "waiting for $(deb) to be uninstalled" $(LOG); sleep 1; done } ) # put a lock here because dpkg does not allow installing packages in parallel if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then +ifneq ($(CROSS_BUILD_ENVIRON),y) { sudo DEBIAN_FRONTEND=noninteractive dpkg -i $(DEBS_PATH)/$* $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && sudo lsof /var/lib/dpkg/lock-frontend && ps aux && exit 1 ; } +else + # Relocate debian packages python libraries to the cross python virtual env location + { sudo DEBIAN_FRONTEND=noninteractive dpkg -i $(if $(findstring $(LINUX_HEADERS),$*),--force-depends) $(DEBS_PATH)/$* $(LOG) && \ + rm -rf tmp && mkdir tmp && dpkg -x $(DEBS_PATH)/$* tmp && (sudo cp -rf tmp/usr/lib/python2*/dist-packages/* $(VIRTENV_LIB_CROSS_PYTHON2)/python2*/site-packages/ 2>/dev/null || true) && \ + (sudo cp -rf tmp/usr/lib/python3/dist-packages/* $(VIRTENV_LIB_CROSS_PYTHON3)/python3.*/site-packages/ 2>/dev/null || true) && \ + rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && sudo lsof /var/lib/dpkg/lock-frontend && ps aux && exit 1 ; } +endif fi sleep 10 done @@ -764,10 +815,19 @@ $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PA pushd $($*_SRC_PATH) $(LOG_SIMPLE) # apply series of patches if exist if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi +ifneq ($(CROSS_BUILD_ENVIRON),y) # Use pip instead of later setup.py to install dependencies into user home, but uninstall self pip$($*_PYTHON_VERSION) install . && pip$($*_PYTHON_VERSION) uninstall --yes `python$($*_PYTHON_VERSION) setup.py --name` if [ ! "$($*_TEST)" = "n" ]; then python$($*_PYTHON_VERSION) setup.py test $(LOG); fi python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) +else + { + export PATH=$(VIRTENV_BIN_CROSS_PYTHON$($*_PYTHON_VERSION)):${PATH} + python$($*_PYTHON_VERSION) setup.py build $(LOG) + if [ ! "$($*_TEST)" = "n" ]; then python$($*_PYTHON_VERSION) setup.py test $(LOG); fi + python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) + } +endif # clean up if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a -f; [ -d .pc ] && rm -rf .pc; fi popd $(LOG_SIMPLE) @@ -793,7 +853,12 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # put a lock here to avoid race conditions while true; do if mkdir $(PYTHON_WHEELS_PATH)/pip_lock &> /dev/null; then +ifneq ($(CROSS_BUILD_ENVIRON),y) { sudo -E pip$($*_PYTHON_VERSION) install $(PYTHON_WHEELS_PATH)/$* $(LOG) && rm -d $(PYTHON_WHEELS_PATH)/pip_lock && break; } || { rm -d $(PYTHON_WHEELS_PATH)/pip_lock && exit 1 ; } +else + # Link python script and data expected location to the cross python virtual env istallation locations + { PATH=$(VIRTENV_BIN_CROSS_PYTHON$($*_PYTHON_VERSION)):${PATH} sudo -E $(VIRTENV_BIN_CROSS_PYTHON$($*_PYTHON_VERSION))/pip$($*_PYTHON_VERSION) install $(PYTHON_WHEELS_PATH)/$* $(LOG) && $(if $(findstring $(SONIC_CONFIG_ENGINE_PY3),$*),(sudo ln -s $(VIRTENV_BIN_CROSS_PYTHON$($*_PYTHON_VERSION))/sonic-cfggen /usr/local/bin/sonic-cfggen 2>/dev/null || true), true ) && $(if $(findstring $(SONIC_YANG_MODELS_PY3),$*),(sudo ln -s $(VIRTENV_BASE_CROSS_PYTHON3)/yang-models /usr/local/yang-models 2>/dev/null || true), true ) && rm -d $(PYTHON_WHEELS_PATH)/pip_lock && break; } || { rm -d $(PYTHON_WHEELS_PATH)/pip_lock && exit 1 ; } +endif fi done $(FOOTER) @@ -918,7 +983,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_whls=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_PYTHON_WHEELS)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_pkgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_APT_PACKAGES)))\n" | awk '!a[$$0]++')) - if [ -d $($*.gz_PATH)/cli-plugin-tests/ ]; then pushd $($*.gz_PATH)/cli-plugin-tests; pytest-$($(SONIC_UTILITIES_PY3)_PYTHON_VERSION) -v $(LOG); popd; fi + if [ -d $($*.gz_PATH)/cli-plugin-tests/ ]; then pushd $($*.gz_PATH)/cli-plugin-tests; PATH=$(VIRTENV_BIN_CROSS_PYTHON$($(SONIC_UTILITIES_PY3)_PYTHON_VERSION)):${PATH} pytest-$($(SONIC_UTILITIES_PY3)_PYTHON_VERSION) -v $(LOG); popd; fi # Label docker image with componenets versions $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_labels=$(foreach component,\ $(call expand,$($*.gz_DEPENDS),RDEPENDS) \ @@ -1227,7 +1292,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ ) ) - # Exported variables are used by sonic_debian_extension.sh export installer_start_scripts="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME)))" export feature_vs_image_names="$(foreach docker, $($*_DOCKERS), $(addsuffix :, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME):$(docker:-dbg.gz=.gz)))" @@ -1293,6 +1357,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ SIGNING_CERT="$(SIGNING_CERT)" \ PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ + CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ ./build_debian.sh $(LOG) USERNAME="$(USERNAME)" \ diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index edac99af113e..2258946c781d 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -7,6 +7,14 @@ COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin FROM {{ prefix }}multiarch/qemu-user-static:x86_64-aarch64-6.1.0-8 as qemu FROM {{ prefix }}multiarch/debian-debootstrap:arm64-bullseye COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin +{%- elif CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON == "y" %} +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm-6.1.0-8 as qemu +FROM {{ prefix }}debian:bullseye +COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin +{%- elif CONFIGURED_ARCH == "arm64" and CROSS_BUILD_ENVIRON == "y" %} +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-aarch64-6.1.0-8 as qemu +FROM {{ prefix }}debian:bullseye +COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin {%- else -%} FROM {{ prefix }}debian:bullseye {%- endif %} @@ -25,7 +33,7 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bull echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON != "y" %} RUN echo "deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=armhf] http://deb.debian.org/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://deb.debian.org/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ @@ -36,7 +44,7 @@ RUN echo "deb [arch=armhf] http://deb.debian.org/debian bullseye main contrib no echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list -{%- elif CONFIGURED_ARCH == "arm64" %} +{%- elif CONFIGURED_ARCH == "arm64" and CROSS_BUILD_ENVIRON != "y" %} RUN echo "deb [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=arm64] http://deb.debian.org/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://deb.debian.org/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ @@ -47,11 +55,59 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian bullseye main contrib no echo 'deb [arch=arm64] http://ftp.debian.org/debian bullseye-backports main' >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian bullseye-updates main contrib non-free" >> /etc/apt/sources.list +{%- elif CROSS_BUILD_ENVIRON == "y" %} +{%- if CONFIGURED_ARCH == "armhf" %} +ARG arch=armhf +ARG gcc_arch=arm-linux-gnueabihf +ARG PYTHON_CROSS_PLATFORM=linux_armv7l +{%- elif CONFIGURED_ARCH == "arm64" %} +ARG arch=arm64 +ARG gcc_arch=aarch64-linux-gnu +ARG PYTHON_CROSS_PLATFORM=linux_aarch64 +{%- endif %} + +RUN dpkg --add-architecture $arch +RUN apt-get update +RUN apt-get install -y crossbuild-essential-$arch +RUN apt-get install -y gcc-$gcc_arch + +RUN apt-mark hold g++-$gcc_arch +RUN apt-mark hold g++-10-$gcc_arch +RUN apt-mark hold gcc-$gcc_arch +RUN apt-mark hold gcc-10-$gcc_arch + +ARG CROSS_CC=${gcc_arch}-gcc +ARG CROSS_CXX=${gcc_arch}-g++ {%- endif %} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN apt-get install -y python3 python3-pip +RUN apt-get install -y python3-minimal:$arch python3.9:$arch python3:$arch python3-dev:$arch python3-setuptools:$arch +RUN apt-get download python3-distutils && dpkg --force-all -i python3-distutils* +RUN apt-get download python3-pip && dpkg --force-all -i python3-pip* +RUN which pip3 && pip3 install enum34 +RUN pip3 install virtualenv + +# Create target arm python3 virtual environments with all required packages installed +RUN mkdir /python_virtualenv +RUN cd /python_virtualenv && python3 -m virtualenv --copies -p /usr/bin/python3 env3 + +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install setuptools==49.6.00 wheel==0.35.1 fastentrypoints pytest pytest-cov pytest-runner==5.2 nose==1.3.7 mockredispy==2.9.3 mock==3.0.5 PyYAML==5.4.1 redis==3.5.3 pexpect==4.8.0 Pympler==0.8 parameterized natsort==6.2.1 MarkupSafe==2.0.1 Jinja2==3.0.3 click tabulate netaddr netifaces pyroute2 pyfakefs sphinx && ln -s /python_virtualenv/env3/bin/pytest /python_virtualenv/env3/bin/pytest-3 + +RUN apt-get --fix-broken install -y +RUN LIBPYTHON3_DEPS="`apt-cache depends libpython3-dev:$arch |grep Depends|awk {'print \$2;'}|tr "\n" " "`" && apt-get install -y libpython2.7-dev:$arch $LIBPYTHON3_DEPS libxml2-dev:$arch libxslt-dev:$arch libssl-dev:$arch libz-dev:$arch + +RUN apt-get install -y swig libssl-dev + +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip install pyang==2.4.0 +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip install pyangbind==0.8.1 +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip uninstall -y enum34 +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install --force-reinstall --no-cache-dir coverage +{%- endif %} + RUN apt-get update && apt-get install -y \ apt-utils \ default-jre-headless \ @@ -107,8 +163,10 @@ RUN apt-get update && apt-get install -y \ libsystemd-dev \ python3-ipaddr \ libcmocka-dev \ +#{%- if CROSS_BUILD_ENVIRON != "y" %} python3-all-dev \ python3-all-dbg \ +#{%- endif %} install-info \ logrotate \ # For libnl3 (local) build @@ -131,7 +189,9 @@ RUN apt-get update && apt-get install -y \ gem2deb \ libevent-dev \ libglib2.0-dev \ +#{%- if CROSS_BUILD_ENVIRON != "y" %} python3-all-dev \ +#{%- endif %} python3-twisted \ phpunit \ libbit-vector-perl \ @@ -174,7 +234,7 @@ RUN apt-get update && apt-get install -y \ {%- if CONFIGURED_ARCH == "amd64" %} linux-compiler-gcc-10-x86 \ {%- endif %} -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON != "y" %} linux-compiler-gcc-10-arm \ {%- endif %} linux-kbuild-5.10 \ @@ -240,7 +300,9 @@ RUN apt-get update && apt-get install -y \ sphinx-common \ python3-sphinx \ # For sonic config engine testing +{%- if CROSS_BUILD_ENVIRON != "y" %} python3-dev \ +{%- endif %} {%- if CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" %} libxslt-dev \ {%- endif %} @@ -361,15 +423,21 @@ RUN apt-get update && apt-get install -y \ libauparse-dev \ auditd +{%- if CROSS_BUILD_ENVIRON == "y" %} +# Arm vs. amd64 versions conflict - remove amd64 packages +RUN apt-get remove -y libnl-3-200 +RUN apt-get install -y libpcre3:$arch +{%- endif %} + RUN apt-get -y build-dep openssh # Build fix for ARM64 and ARMHF /etc/debian_version {%- if CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" %} -RUN apt upgrade -y base-files +RUN apt upgrade -y base-files libc-bin=$(dpkg-query -W -f '${Version}' libc-bin) {%- endif %} # Build fix for ARMHF bullseye libsairedis -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} # Install doxygen build dependency packages RUN apt install -y libxapian-dev yui-compressor texlive-extra-utils \ texlive-font-utils rdfind llvm-11-dev libclang-11-dev sassc faketime mat2 @@ -400,8 +468,12 @@ RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confdef" ## do not modify the current configuration file, the new version is installed with a .dpkg-dist suffix RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confold" +{%- if CROSS_BUILD_ENVIRON != "y" %} # For linux build RUN apt-get -y build-dep linux +{%- else %} +RUN apt-get install -y kernel-wedge +{%- endif %} # For gobgp and telemetry build RUN apt-get install -y golang-1.15 && ln -s /usr/lib/go-1.15 /usr/local/go @@ -420,6 +492,16 @@ RUN apt-get purge -y python3-pip python3-yaml RUN pip3 install setuptools==49.6.00 RUN pip3 install wheel==0.35.1 +{%- if CONFIGURED_ARCH == "armhf" %} +# Allow only manylinux wheels on armhf, to ensure that binaries/libraries work correctly on armhf +COPY ["disable-non-manylinux.patch", "/"] +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN patch -p1 -i /disable-non-manylinux.patch /python_virtualenv/env3/lib/python3.9/site-packages/pip/_vendor/packaging/tags.py +{%- else %} +RUN patch -p1 -i /disable-non-manylinux.patch /usr/local/lib/python3.9/dist-packages/pip/_vendor/packaging/tags.py +{%- endif %} +{%- endif %} + # For building sonic-utilities RUN pip3 install fastentrypoints mock @@ -445,7 +527,9 @@ RUN pip3 install j2cli==0.3.10 # For sonic-mgmt-framework RUN pip3 install "PyYAML==5.4.1" +{%- if CROSS_BUILD_ENVIRON != "y" %} RUN pip3 install "lxml==4.6.2" +{%- endif %} # For sonic-platform-common testing RUN pip3 install redis @@ -475,7 +559,11 @@ RUN apt-get install -y vim # Install rsyslog RUN apt-get install -y rsyslog +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN cd /usr/src/gtest && CXX=$CROSS_CXX CC=$CROSS_CC cmake . && make -C /usr/src/gtest +{%- else %} RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest +{%- endif %} RUN mkdir /var/run/sshd EXPOSE 22 @@ -501,7 +589,11 @@ RUN apt-get install -y \ {%- endif %} RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - RUN add-apt-repository \ +{%- if CROSS_BUILD_ENVIRON == "y" %} + "deb https://download.docker.com/linux/debian \ +{%- else %} "deb [arch={{ CONFIGURED_ARCH }}] https://download.docker.com/linux/debian \ +{%- endif %} $(lsb_release -cs) \ stable" RUN apt-get update @@ -520,6 +612,20 @@ RUN pip3 install git+https://github.com/aristanetworks/swi-tools.git@bead66bf261 RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install -y nodejs +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN apt-get install -y rsync dh-python + +RUN apt-get install -y libelf-dev:$arch libdw-dev:$arch libbz2-dev:$arch liblzo2-dev:$arch libedit-dev:$arch libevent-dev:$arch libopts25-dev:$arch libssl-dev:$arch pps-tools:$arch libpam-cap:$arch libcap-dev:$arch libpam0g-dev:$arch libaudit-dev:$arch libgtk-3-dev:$arch libkrb5-dev:$arch libsystemd-dev:$arch libwrap0-dev:$arch libkrb5-dev:$arch libboost1.74-dev:$arch libboost-dev:$arch libzmq5:$arch libzmq3-dev:$arch libdaemon-dev:$arch libjansson-dev:$arch libmnl-dev:$arch libsensors5:$arch libsensors4-dev:$arch libperl-dev:$arch libmariadb-dev:$arch libmariadb-dev-compat:$arch libpci-dev:$arch libjson-c-dev:$arch libreadline-dev:$arch librtr-dev:$arch librrd-dev:$arch libnetfilter-conntrack-dev:$arch libnetfilter-conntrack3:$arch libnfnetlink-dev:$arch libnftnl-dev:$arch libldap2-dev:$arch libbind-export-dev:$arch check:$arch libboost-atomic-dev:$arch libboost-test-dev:$arch libglib2.0-dev:$arch libexplain-dev:$arch libc-ares-dev:$arch libiptc0:$arch libxtables12:$arch libatm1-dev:$arch libdb-dev:$arch pkg-config:$arch libnghttp2-14:$arch librtmp1:$arch libssh2-1:$arch libcjson1:$arch libcjson-dev:$arch libcurl3-gnutls:$arch libcurl3-nss-dev:$arch libboost-thread1.74-dev:$arch libboost-thread-dev:$arch libboost-system1.74-dev:$arch libboost-system-dev:$arch libgtest-dev:$arch libgmock-dev:$arch libfido2-dev:$arch libcunit1:$arch libcunit1-dev:$arch libauparse-dev:$arch libnetsnmptrapd40:$arch qtbase5-dev:$arch libboost-log-dev:$arch libboost-filesystem-dev:$arch libboost-program-options-dev:$arch + +RUN apt-get download libgirepository1.0-dev:$arch && dpkg --force-all -i libgirepository1.0-dev* +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install pycairo + +# Install libpcsclite-dev for wpasupplicant using download because regular install removes amd64 python package +RUN apt-get download libpcsclite1:$arch && dpkg --force-all -i libpcsclite1* && apt-get download libpcsclite-dev:$arch && dpkg --force-all -i libpcsclite-dev* +# Install python3-dev for frr (/usr/bin/python3-config for $arch) using download because regular install removes amd64 python package +RUN apt-get download python3.9-dev:$arch && apt-get download python3-dev:$arch && dpkg --force-all -i python3*-dev* +{% endif %} + # Tell azure pipeline to use node.js in the docker LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/bin/node" {% endif -%} diff --git a/sonic-slave-bullseye/Dockerfile.user.j2 b/sonic-slave-bullseye/Dockerfile.user.j2 index 5bc747beb2fc..2eb7ef18b6cd 100644 --- a/sonic-slave-bullseye/Dockerfile.user.j2 +++ b/sonic-slave-bullseye/Dockerfile.user.j2 @@ -1,5 +1,5 @@ ARG slave_base_tag_ref=latest -{%- if MULTIARCH_QEMU_ENVIRON != "y" %} +{%- if MULTIARCH_QEMU_ENVIRON != "y" and CROSS_BUILD_ENVIRON != "y" %} FROM sonic-slave-bullseye:${slave_base_tag_ref} {%- else %} FROM sonic-slave-bullseye-march-{{ CONFIGURED_ARCH }}:${slave_base_tag_ref} diff --git a/sonic-slave-bullseye/disable-non-manylinux.patch b/sonic-slave-bullseye/disable-non-manylinux.patch new file mode 100644 index 000000000000..67e81c4e9116 --- /dev/null +++ b/sonic-slave-bullseye/disable-non-manylinux.patch @@ -0,0 +1,10 @@ +--- a/tags.py 2022-07-12 00:07:22.710207780 +0000 ++++ b/tags.py 2022-07-12 00:07:13.185890659 +0000 +@@ -424,7 +424,6 @@ + _, arch = linux.split("_", 1) + yield from _manylinux.platform_tags(linux, arch) + yield from _musllinux.platform_tags(arch) +- yield linux + + + def _generic_platforms() -> Iterator[str]: diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index 2f3cadf0a4b4..b89d44656d3a 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -1,10 +1,19 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} {%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} -FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm-5.0.0-2 as qemu +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm as qemu FROM {{ prefix }}multiarch/debian-debootstrap:armhf-buster COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin {%- elif CONFIGURED_ARCH == "arm64" and MULTIARCH_QEMU_ENVIRON == "y" %} +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-aarch64 as qemu FROM {{ prefix }}multiarch/debian-debootstrap:arm64-buster +{%- elif CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON == "y" %} +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-arm as qemu +FROM {{ prefix }}debian:buster +COPY --from=qemu /usr/bin/qemu-arm-static /usr/bin +{%- elif CONFIGURED_ARCH == "arm64" and CROSS_BUILD_ENVIRON == "y" %} +FROM {{ prefix }}multiarch/qemu-user-static:x86_64-aarch64 as qemu +FROM {{ prefix }}debian:buster +COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin {%- else -%} FROM {{ prefix }}debian:buster {%- endif %} @@ -22,7 +31,7 @@ RUN echo "deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ bust echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON != "y" %} RUN echo "deb [arch=armhf] http://deb.debian.org/debian buster main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=armhf] http://deb.debian.org/debian buster main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://deb.debian.org/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ @@ -33,7 +42,7 @@ RUN echo "deb [arch=armhf] http://deb.debian.org/debian buster main contrib non- echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=armhf] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list -{%- elif CONFIGURED_ARCH == "arm64" %} +{%- elif CONFIGURED_ARCH == "arm64" and CROSS_BUILD_ENVIRON != "y" %} RUN echo "deb [arch=arm64] http://deb.debian.org/debian buster main contrib non-free" > /etc/apt/sources.list && \ echo "deb-src [arch=arm64] http://deb.debian.org/debian buster main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://deb.debian.org/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ @@ -44,11 +53,63 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian buster main contrib non- echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb [arch=arm64] http://packages.trafficmanager.net/debian/debian-security buster_updates main contrib non-free" >> /etc/apt/sources.list +{%- elif CROSS_BUILD_ENVIRON == "y" %} +{%- if CONFIGURED_ARCH == "armhf" %} +ARG arch=armhf +ARG gcc_arch=arm-linux-gnueabihf +ARG PYTHON_CROSS_PLATFORM=linux_armv7l +{%- elif CONFIGURED_ARCH == "arm64" %} +ARG arch=arm64 +ARG gcc_arch=aarch64-linux-gnu +ARG PYTHON_CROSS_PLATFORM=linux_aarch64 +{%- endif %} + +RUN echo "deb http://ftp.debian.org/debian buster-backports main" >> /etc/apt/sources.list + +RUN dpkg --add-architecture $arch +RUN apt-get update +RUN apt-get install -y crossbuild-essential-$arch +RUN apt-get install -y gcc-$gcc_arch + +RUN apt-mark hold g++-$gcc_arch +RUN apt-mark hold g++-8-$gcc_arch +RUN apt-mark hold gcc-$gcc_arch +RUN apt-mark hold gcc-8-$gcc_arch + +ARG CROSS_CC=${gcc_arch}-gcc +ARG CROSS_CXX=${gcc_arch}-g++ {%- endif %} ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN apt-get install -y python3 python3-pip +RUN apt-get install -y python:$arch python3-minimal:$arch python3.7:$arch python3:$arch python-setuptools:$arch +RUN apt-get download python3-distutils && dpkg --force-all -i python3-distutils* +RUN apt-get download python3-pip && dpkg --force-all -i python3-pip* +RUN which pip3 && pip3 install enum34 +RUN pip3 install virtualenv + +# Create target arm python2/3 virtual environments with all required packages installed +RUN mkdir /python_virtualenv +RUN cd /python_virtualenv && python3 -m virtualenv -p /usr/bin/python env2 +RUN cd /python_virtualenv && python3 -m virtualenv --copies -p /usr/bin/python3 env3 + +RUN PATH=/python_virtualenv/env2/bin/:$PATH pip2 install setuptools==40.8.0 wheel==0.35.1 fastentrypoints pytest pytest-cov pytest-runner==4.4 nose==1.3.7 mockredispy==2.9.3 mock==3.0.5 j2cli==0.3.10 PyYAML==5.4.1 pexpect==4.6.0 Pympler==0.8 ctypesgen==1.0.2 natsort==6.2.1 redis==3.5.3 protobuf==3.17.3 +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install setuptools==49.6.00 wheel==0.35.1 fastentrypoints pytest pytest-cov pytest-runner==5.2 nose==1.3.7 mockredispy==2.9.3 mock==3.0.5 PyYAML==5.4.1 redis==3.5.3 pexpect==4.8.0 Pympler==0.8 parameterized natsort==6.2.1 MarkupSafe==2.0.1 Jinja2==3.0.3 sphinx && ln -s /python_virtualenv/env3/bin/pytest /python_virtualenv/env3/bin/pytest-3 + +RUN apt-get --fix-broken install -y +RUN LIBPYTHON3_DEPS="`apt-cache depends libpython3-dev:$arch |grep Depends|awk {'print \$2;'}|tr "\n" " "`" && apt-get install -y libpython2.7-dev:$arch $LIBPYTHON3_DEPS libxml2-dev:$arch libxslt-dev:$arch libssl-dev:$arch libz-dev:$arch + +RUN apt-get install -y swig libssl-dev + +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip install pyang==2.4.0 +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip install pyangbind==0.8.1 +RUN PATH=/python_virtualenv/env3/bin/:$PATH python3 -m pip uninstall -y enum34 +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install --force-reinstall --no-cache-dir coverage +{%- endif %} + RUN apt-get update && apt-get install -y \ apt-utils \ default-jre-headless \ @@ -104,8 +165,10 @@ RUN apt-get update && apt-get install -y \ libsystemd-dev \ python-ipaddr \ libcmocka-dev \ +{%- if CROSS_BUILD_ENVIRON != "y" %} python3-all-dev \ python3-all-dbg \ +{%- endif %} install-info \ logrotate \ # For libnl3 (local) build @@ -180,7 +243,7 @@ RUN apt-get update && apt-get install -y \ {%- if CONFIGURED_ARCH == "amd64" %} linux-compiler-gcc-8-x86 \ {%- endif %} -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON != "y" %} linux-compiler-gcc-8-arm \ {%- endif %} linux-kbuild-4.19 \ @@ -324,6 +387,9 @@ RUN apt-get update && apt-get install -y \ # For WPA supplication qtbase5-dev \ aspell-en \ +{%- if CROSS_BUILD_ENVIRON != "y" %} + libhiredis-dev \ +{%- endif %} swig3.0 \ libpython2.7-dev \ libssl-dev \ @@ -375,14 +441,19 @@ RUN apt-get install -y -t buster-backports \ dwz \ debhelper +{%- if CROSS_BUILD_ENVIRON == "y" %} +# Arm vs. amd64 versions conflict - remove amd64 packages +RUN apt-get remove -y libnl-3-200 libsnmp30 +RUN apt-get install -y libpcre2-dev:$arch libpcre3:$arch +{%- endif %} + RUN apt-get -y build-dep openssh # Build fix for ARMHF buster libsairedis -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and MULTIARCH_QEMU_ENVIRON == "y" %} # Install doxygen build dependency packages RUN apt install -y libxapian-dev yui-compressor libclang-3.9-dev texlive-extra-utils \ texlive-font-utils rdfind llvm-6.0-dev libclang-6.0-dev sassc - # Update doxygen with 64bit file offset patch RUN dget -u http://deb.debian.org/debian/pool/main/d/doxygen/doxygen_1.8.13-10.dsc && \ cd doxygen-1.8.13 && \ @@ -408,15 +479,19 @@ RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confdef" ## do not modify the current configuration file, the new version is installed with a .dpkg-dist suffix RUN sudo augtool --autosave "set /files/etc/dpkg/dpkg.cfg/force-confold" +{%- if CROSS_BUILD_ENVIRON != "y" %} # For linux build RUN apt-get -y build-dep linux +{%- else %} +RUN apt-get install -y kernel-wedge +{%- endif %} # For gobgp and telemetry build RUN export VERSION=1.14.2 \ -{%- if CONFIGURED_ARCH == "armhf" %} +{%- if CONFIGURED_ARCH == "armhf" and CROSS_BUILD_ENVIRON != "y" %} && wget https://storage.googleapis.com/golang/go$VERSION.linux-armv6l.tar.gz \ && tar -C /usr/local -xzf go$VERSION.linux-armv6l.tar.gz \ -{%- elif CONFIGURED_ARCH == "arm64" %} +{%- elif CONFIGURED_ARCH == "arm64" and CROSS_BUILD_ENVIRON != "y" %} && wget https://storage.googleapis.com/golang/go$VERSION.linux-arm64.tar.gz \ && tar -C /usr/local -xzf go$VERSION.linux-arm64.tar.gz \ {%- else %} @@ -477,8 +552,11 @@ RUN pip3 install Jinja2==3.0.3 # For sonic-mgmt-framework RUN pip2 install "PyYAML==5.4.1" RUN pip3 install "PyYAML==5.4.1" + +{%- if CROSS_BUILD_ENVIRON != "y" %} RUN pip2 install "lxml==4.6.5" RUN pip3 install "lxml==4.6.5" +{%- endif %} # For sonic-platform-common testing RUN pip3 install redis @@ -509,7 +587,11 @@ RUN apt-get install -y vim # Install rsyslog RUN apt-get install -y rsyslog +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN cd /usr/src/gtest && CXX=$CROSS_CXX CC=$CROSS_CC cmake . && make -C /usr/src/gtest +{%- else %} RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest +{%- endif %} RUN mkdir /var/run/sshd EXPOSE 22 @@ -535,7 +617,11 @@ RUN apt-get install -y \ {%- endif %} RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - RUN add-apt-repository \ +{%- if CROSS_BUILD_ENVIRON == "y" %} + "deb https://download.docker.com/linux/debian \ +{%- else %} "deb [arch={{ CONFIGURED_ARCH }}] https://download.docker.com/linux/debian \ +{%- endif %} $(lsb_release -cs) \ stable" RUN apt-get update @@ -554,6 +640,21 @@ RUN pip3 install git+https://github.com/aristanetworks/swi-tools.git@bead66bf261 RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install -y nodejs +{%- if CROSS_BUILD_ENVIRON == "y" %} +RUN apt-get install -y rsync dh-python + +RUN apt-get install -y libelf-dev:$arch libdw-dev:$arch libbz2-dev:$arch liblzo2-dev:$arch libedit-dev:$arch libevent-dev:$arch libopts25-dev:$arch libssl-dev:$arch pps-tools:$arch libpam-cap:$arch libcap-dev:$arch libpam0g-dev:$arch libaudit-dev:$arch libgtk-3-dev:$arch libkrb5-dev:$arch libsystemd-dev:$arch libwrap0-dev:$arch libkrb5-dev:$arch libboost1.67-dev:$arch libboost-dev:$arch libzmq5:$arch libzmq3-dev:$arch libdaemon-dev:$arch libjansson-dev:$arch libmnl-dev:$arch libsensors5:$arch libsensors4-dev:$arch libperl-dev:$arch libmariadb-dev:$arch libmariadb-dev-compat:$arch libpci-dev:$arch libjson-c3:$arch libjson-c-dev:$arch libreadline-dev:$arch librtr-dev:$arch librrd-dev:$arch libnetfilter-conntrack-dev:$arch libnetfilter-conntrack3:$arch libnfnetlink-dev:$arch libnftnl-dev:$arch libldap2-dev:$arch libbind-export-dev:$arch check:$arch libboost-atomic-dev:$arch libboost-test-dev:$arch libglib2.0-dev:$arch qt5-default:$arch libexplain-dev:$arch libc-ares-dev:$arch libip4tc0:$arch libip6tc0:$arch libiptc0:$arch libxtables12:$arch iptables-dev:$arch libatm1-dev:$arch libdb-dev:$arch pkg-config:$arch libnghttp2-14:$arch librtmp1:$arch libssh2-1:$arch libcjson1:$arch libcjson-dev:$arch libcurl3-gnutls:$arch libcurl3-nss-dev:$arch libboost-thread1.67-dev:$arch libboost-thread-dev:$arch libboost-system1.67-dev:$arch libboost-system-dev:$arch libgtest-dev:$arch libgmock-dev:$arch + +RUN apt-get install -y -t buster-backports \ + libbpf-dev:$arch + +RUN apt-get download libgirepository1.0-dev:$arch && dpkg --force-all -i libgirepository1.0-dev* +RUN PATH=/python_virtualenv/env3/bin/:$PATH pip3 install pycairo + +# Install libpcsclite-dev for wpasupplicant using download because regular install removes amd64 python package +RUN apt-get download libpcsclite1:$arch && dpkg --force-all -i libpcsclite1* && apt-get download libpcsclite-dev:$arch && dpkg --force-all -i libpcsclite-dev* +{% endif %} + # Tell azure pipeline to use node.js in the docker LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/bin/node" {% endif -%} diff --git a/sonic-slave-buster/Dockerfile.user.j2 b/sonic-slave-buster/Dockerfile.user.j2 index 8b17e482356c..377bf2c8322e 100644 --- a/sonic-slave-buster/Dockerfile.user.j2 +++ b/sonic-slave-buster/Dockerfile.user.j2 @@ -1,5 +1,5 @@ ARG slave_base_tag_ref=latest -{%- if MULTIARCH_QEMU_ENVIRON != "y" %} +{%- if MULTIARCH_QEMU_ENVIRON != "y" and CROSS_BUILD_ENVIRON != "y" %} FROM sonic-slave-buster:${slave_base_tag_ref} {%- else %} FROM sonic-slave-buster-march-{{ CONFIGURED_ARCH }}:${slave_base_tag_ref} diff --git a/src/bash/Makefile b/src/bash/Makefile index 0d1b3817134d..a72cbc170351 100644 --- a/src/bash/Makefile +++ b/src/bash/Makefile @@ -17,6 +17,9 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : pushd bash-$(BASH_VERSION_MAJOR) # build package +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -us -uc -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) # copy UT code. @@ -30,7 +33,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # run UT after config.h ready. make -C unittest && make test -C unittest - +endif popd mv $* $(DEST)/ diff --git a/src/ethtool/Makefile b/src/ethtool/Makefile index 779a3b9e40ff..d122b6f4c8bd 100644 --- a/src/ethtool/Makefile +++ b/src/ethtool/Makefile @@ -14,6 +14,8 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build package ifeq ($(MULTIARCH_QEMU_ENVIRON), y) DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else ifeq ($(CROSS_BUILD_ENVIRON), y) + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) endif diff --git a/src/hiredis/Makefile b/src/hiredis/Makefile index 4935a039e0af..ab257e5e0845 100644 --- a/src/hiredis/Makefile +++ b/src/hiredis/Makefile @@ -14,7 +14,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x hiredis_$(HIREDIS_VERSION_FULL).dsc pushd hiredis-$(HIREDIS_VERSION) +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -d -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -d -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $* $(DERIVED_TARGETS) $(DEST)/ diff --git a/src/ifupdown2/Makefile b/src/ifupdown2/Makefile index ed6f6b549992..77008afb9ac6 100644 --- a/src/ifupdown2/Makefile +++ b/src/ifupdown2/Makefile @@ -22,7 +22,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -d -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/initramfs-tools/Makefile b/src/initramfs-tools/Makefile index 27832cabca32..4800c1616041 100644 --- a/src/initramfs-tools/Makefile +++ b/src/initramfs-tools/Makefile @@ -19,7 +19,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build the package rm -f debian/*.debhelper.log +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/iproute2/Makefile b/src/iproute2/Makefile index 93c680628acb..fe5cf17a292a 100644 --- a/src/iproute2/Makefile +++ b/src/iproute2/Makefile @@ -17,7 +17,12 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : patch -p1 < ../patch/0001-patch-macsec-xpn-support.patch +ifeq ($(CROSS_BUILD_ENVIRON), y) + patch -p1 < ../patch/cross-compile-changes.patch + dpkg-buildpackage -us -uc -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $* $(DEST)/ diff --git a/src/iproute2/patch/cross-compile-changes.patch b/src/iproute2/patch/cross-compile-changes.patch new file mode 100644 index 000000000000..a38df0630686 --- /dev/null +++ b/src/iproute2/patch/cross-compile-changes.patch @@ -0,0 +1,12 @@ +Index: iproute2-5.10.0/tc/tc_core.c +=================================================================== +--- iproute2-5.10.0.orig/tc/tc_core.c ++++ iproute2-5.10.0/tc/tc_core.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include "utils.h" + #include "tc_core.h" diff --git a/src/iptables/Makefile b/src/iptables/Makefile index 681ef5d2dcc3..07a8fea2265a 100644 --- a/src/iptables/Makefile +++ b/src/iptables/Makefile @@ -38,7 +38,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index 63e82e5c49aa..c908ddeeed0a 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -23,7 +23,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/kdump-tools/Makefile b/src/kdump-tools/Makefile index 6c66c37c0843..aad9eb99ec71 100644 --- a/src/kdump-tools/Makefile +++ b/src/kdump-tools/Makefile @@ -21,7 +21,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/kdump-tools/patch/cross-compile-changes.patch b/src/kdump-tools/patch/cross-compile-changes.patch new file mode 100644 index 000000000000..87a8a4b81c44 --- /dev/null +++ b/src/kdump-tools/patch/cross-compile-changes.patch @@ -0,0 +1,14 @@ +Index: kdump-tools-1.6.8.4/debian/rules +=================================================================== +--- kdump-tools-1.6.8.4.orig/debian/rules ++++ kdump-tools-1.6.8.4/debian/rules +@@ -20,6 +20,9 @@ endif + %: + dh $@ + ++override_dh_auto_build: ++ dh_auto_build TARGET=$(CONFIGURED_ARCH) ++ + override_dh_gencontrol: + dh_gencontrol -- $(SUBSTVARS) + diff --git a/src/libnl3/Makefile b/src/libnl3/Makefile index b81f294c30c2..0d48ffc1e1aa 100644 --- a/src/libnl3/Makefile +++ b/src/libnl3/Makefile @@ -25,7 +25,12 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series ln -s ../debian debian +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif + popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/libteam/Makefile b/src/libteam/Makefile index 47f9d1dd21bf..0c98c0ce4899 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -31,7 +31,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : mv tmp/debian libteam/ rm -rf tmp pushd ./libteam +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/libyang/Makefile b/src/libyang/Makefile index 357908ebc370..53c4d59d1e1a 100644 --- a/src/libyang/Makefile +++ b/src/libyang/Makefile @@ -3,7 +3,7 @@ SHELL = /bin/bash .SHELLFLAGS += -e MAIN_TARGET = $(LIBYANG) -DERIVED_TARGETS = $(LIBYANG_DEV) $(LIBYANG_DBG) $(LIBYANG_PY3) $(LIBYANG_CPP) +DERIVED_TARGETS = $(LIBYANG_DEV) $(LIBYANG_DBGSYM) $(LIBYANG_PY3) $(LIBYANG_CPP) $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Obtaining the libyang @@ -14,15 +14,14 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Apply patch series stg init stg import -s ../patch/series - - mkdir build - pushd build - cmake .. - make build-deb - - pushd debs - mv $* $(DEST)/ - mv $(DERIVED_TARGETS) $(DEST)/ + +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd + mv $(DERIVED_TARGETS) $* $(DEST)/ + $(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/libyang/patch/debian-packaging-files.patch b/src/libyang/patch/debian-packaging-files.patch new file mode 100644 index 000000000000..5370a94aa453 --- /dev/null +++ b/src/libyang/patch/debian-packaging-files.patch @@ -0,0 +1,233 @@ +From 99afc75d62942e1e4a4d576a880c697ecb0bab06 Mon Sep 17 00:00:00 2001 +From: Saikrishna Arcot +Date: Fri, 1 Jul 2022 10:30:48 -0700 +Subject: [PATCH] Add debian packaging files. + +Libyang does have a custom cmake target that can make these files, but +it breaks several things. Building for another architecture doesn't +cleanly work unless you happen to enable language bindings in your +initial CMake call (otherwise, it will use the default C++ compiler +instead of whatever is set in the environment variable). In addition, +objcopy at the end doesn't appear to use the target +architecture-specific version for whatever reason. + +Make things cleaner by just creating the debian files. In these files, +bump up the compat level, remove the hardcoded debug packages (dbgsym +packages are automatically generated), and rely on debhelper to do the +configure/build. + +Signed-off-by: Saikrishna Arcot +--- + debian/changelog | 23 +++++++++++++++++++++ + debian/compat | 1 + + debian/control | 37 ++++++++++++++++++++++++++++++++++ + debian/copyright | 28 +++++++++++++++++++++++++ + debian/libyang-cpp-dev.install | 3 +++ + debian/libyang-cpp.install | 1 + + debian/libyang-dev.install | 3 +++ + debian/libyang.install | 5 +++++ + debian/python3-yang.install | 1 + + debian/rules | 16 +++++++++++++++ + debian/source/format | 1 + + 11 files changed, 119 insertions(+) + create mode 100644 debian/changelog + create mode 100644 debian/compat + create mode 100644 debian/control + create mode 100644 debian/copyright + create mode 100644 debian/libyang-cpp-dev.install + create mode 100644 debian/libyang-cpp.install + create mode 100644 debian/libyang-dev.install + create mode 100644 debian/libyang.install + create mode 100644 debian/python3-yang.install + create mode 100755 debian/rules + create mode 100644 debian/source/format + +diff --git a/debian/changelog b/debian/changelog +new file mode 100644 +index 00000000..421609c7 +--- /dev/null ++++ b/debian/changelog +@@ -0,0 +1,23 @@ ++libyang (1.0.73) stable; urgency=low ++ ++ * VERSION bump to version 1.0.73 (Radek Krejci) ++ ++ * SOVERSION bump to version 1.2.2 (Radek Krejci) ++ ++ * JSON parser CHANGE respect STRICT flag and if not set, ignore unknown data (Radek Krejci) ++ ++ * VERSION bump to version 1.0.72 (Radek Krejci) ++ ++ * SOVERSION bump to version 1.2.1 (Radek Krejci) ++ ++ * schema parsers BUGFIX duplicating iffeature expression data (Radek Krejci) ++ ++ * VERSION bump to version 1.0.71 (Radek Krejci) ++ ++ * SOVERSION bump to version 1.2.0 (Radek Krejci) ++ ++ * schema parsers BUGFIX creating implicit cases when augmenting choice (Radek Krejci) ++ ++ * Merge pull request #891 from opensourcerouting/api_tracing (Michal Vasko) ++ ++ -- sarcot Fri, 1 Jul 2022 16:46:13 +0000 +diff --git a/debian/compat b/debian/compat +new file mode 100644 +index 00000000..f599e28b +--- /dev/null ++++ b/debian/compat +@@ -0,0 +1 @@ ++10 +diff --git a/debian/control b/debian/control +new file mode 100644 +index 00000000..cb182fa4 +--- /dev/null ++++ b/debian/control +@@ -0,0 +1,37 @@ ++Source: libyang ++Maintainer: CESNET ++Priority: extra ++Standards-Version: 3.8.2 ++Build-Depends: debhelper (>= 10) ++Homepage: https://github.com/CESNET/libyang ++ ++Package: libyang ++Depends: libpcre3, ${shlibs:Depends} ++Conflicts: libyang-experimental (= 1.0) ++Section: libs ++Architecture: any ++Description: Libyang is YANG data modelling language parser and toolkit written (and providing API) in C. ++ ++Package: libyang-dev ++Depends: libpcre3-dev, libyang (= ${binary:Version}) ++Section: libdevel ++Architecture: any ++Description: Headers of libyang library. ++ ++Package: libyang-cpp ++Depends: libyang (= ${binary:Version}) ++Section: libs ++Architecture: any ++Description: Bindings of libyang library to C++ language. ++ ++Package: libyang-cpp-dev ++Depends: libpcre3-dev, libyang-cpp (= ${binary:Version}) ++Section: libdevel ++Architecture: any ++Description: Headers of bindings to c++ language libyang library. ++ ++Package: python3-yang ++Depends: libyang (= ${binary:Version}), libyang-cpp (= ${binary:Version}) ++Section: libs ++Architecture: any ++Description: Bindings of libyang library to python3 language. +diff --git a/debian/copyright b/debian/copyright +new file mode 100644 +index 00000000..f7cafac5 +--- /dev/null ++++ b/debian/copyright +@@ -0,0 +1,28 @@ ++Copyright (c) 2015-2016, CESNET ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++* Redistributions of source code must retain the above copyright notice, this ++ list of conditions and the following disclaimer. ++ ++* Redistributions in binary form must reproduce the above copyright notice, ++ this list of conditions and the following disclaimer in the documentation ++ and/or other materials provided with the distribution. ++ ++* Neither the name of libyang nor the names of its ++ contributors may be used to endorse or promote products derived from ++ this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ +diff --git a/debian/libyang-cpp-dev.install b/debian/libyang-cpp-dev.install +new file mode 100644 +index 00000000..e56e41ed +--- /dev/null ++++ b/debian/libyang-cpp-dev.install +@@ -0,0 +1,3 @@ ++usr/lib/*/libyang-cpp.so ++usr/include/libyang/*.hpp ++usr/lib/*/pkgconfig/libyang-cpp.pc +diff --git a/debian/libyang-cpp.install b/debian/libyang-cpp.install +new file mode 100644 +index 00000000..2157465b +--- /dev/null ++++ b/debian/libyang-cpp.install +@@ -0,0 +1 @@ ++usr/lib/*/libyang-cpp.so.* +\ No newline at end of file +diff --git a/debian/libyang-dev.install b/debian/libyang-dev.install +new file mode 100644 +index 00000000..bb04ac28 +--- /dev/null ++++ b/debian/libyang-dev.install +@@ -0,0 +1,3 @@ ++usr/lib/*/libyang.so ++usr/lib/*/pkgconfig/libyang.pc ++usr/include/libyang/*.h +diff --git a/debian/libyang.install b/debian/libyang.install +new file mode 100644 +index 00000000..249a5291 +--- /dev/null ++++ b/debian/libyang.install +@@ -0,0 +1,5 @@ ++usr/bin/yanglint ++usr/bin/yangre ++usr/share/man/man1 ++usr/lib/*/libyang.so.* ++usr/lib/*/libyang/* +diff --git a/debian/python3-yang.install b/debian/python3-yang.install +new file mode 100644 +index 00000000..3272cd65 +--- /dev/null ++++ b/debian/python3-yang.install +@@ -0,0 +1 @@ ++usr/lib/python3/dist-packages/* +diff --git a/debian/rules b/debian/rules +new file mode 100755 +index 00000000..9308403e +--- /dev/null ++++ b/debian/rules +@@ -0,0 +1,16 @@ ++#!/usr/bin/make -f ++# -*- makefile -*- ++# Uncomment this to turn on verbose mode. ++export DH_VERBOSE=1 ++ ++%: ++ dh $@ ++ ++override_dh_auto_configure: ++ dh_auto_configure -- -DENABLE_LYD_PRIV=ON -DGEN_LANGUAGE_BINDINGS=ON -DGEN_PYTHON_VERSION=2 ++ ++override_dh_makeshlibs: ++ dh_makeshlibs -Xextensions -Xuser_types ++ ++override_dh_auto_test: ++ ctest --output-on-failure +diff --git a/debian/source/format b/debian/source/format +new file mode 100644 +index 00000000..163aaf8d +--- /dev/null ++++ b/debian/source/format +@@ -0,0 +1 @@ ++3.0 (quilt) +-- +2.25.1 + diff --git a/src/libyang/patch/series b/src/libyang/patch/series index 28352b9628e5..9796e28649c5 100644 --- a/src/libyang/patch/series +++ b/src/libyang/patch/series @@ -2,3 +2,4 @@ libyang.patch libyang_mgmt_framework.patch swig.patch large_file_support_arm32.patch +debian-packaging-files.patch diff --git a/src/libyang1/Makefile b/src/libyang1/Makefile index 834893eb0bbe..a87f03bf638c 100644 --- a/src/libyang1/Makefile +++ b/src/libyang1/Makefile @@ -31,7 +31,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Enable large file support for 32-bit arch echo 'add_definitions(-D_FILE_OFFSET_BITS=64)' >> CMakeLists.txt +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/libyang2/Makefile b/src/libyang2/Makefile index 621717521972..fab24590a340 100644 --- a/src/libyang2/Makefile +++ b/src/libyang2/Makefile @@ -31,7 +31,12 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Enable large file support for 32-bit arch echo 'add_definitions(-D_FILE_OFFSET_BITS=64)' >> CMakeLists.txt +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -d -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif + popd # Move the newly-built .deb packages to the destination directory diff --git a/src/lldpd/Makefile b/src/lldpd/Makefile index a336f1e989ae..349724d77ec1 100644 --- a/src/lldpd/Makefile +++ b/src/lldpd/Makefile @@ -35,7 +35,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + env "with_netlink_receive_bufsize=1024*1024" CFLAGS="-I $$CROSS_PERL_CORE_PATH" dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else env "with_netlink_receive_bufsize=1024*1024" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/lm-sensors/Makefile b/src/lm-sensors/Makefile index a5aa3ba7d885..fbeee8c2610f 100644 --- a/src/lm-sensors/Makefile +++ b/src/lm-sensors/Makefile @@ -25,7 +25,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg init stg import -s ../patch/series +ifeq ($(CROSS_BUILD_ENVIRON), y) + PROG_EXTRA=sensord dpkg-buildpackage -us -uc -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else DEB_BUILD_OPTIONS=nocheck PROG_EXTRA=sensord dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/monit/Makefile b/src/monit/Makefile index 570f30cf60f8..308daac8a2e3 100644 --- a/src/monit/Makefile +++ b/src/monit/Makefile @@ -23,8 +23,16 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg init stg import -s ../patch/series +ifeq ($(CROSS_BUILD_ENVIRON), y) + patch -p1 < ../patch/cross-compile-changes.patch +endif + # Build source and Debian packages +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc --host-arch $(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/monit/patch/cross-compile-changes.patch b/src/monit/patch/cross-compile-changes.patch new file mode 100644 index 000000000000..2affa602d48d --- /dev/null +++ b/src/monit/patch/cross-compile-changes.patch @@ -0,0 +1,13 @@ +Index: monit/debian/rules +=================================================================== +--- monit.orig/debian/rules ++++ monit/debian/rules +@@ -4,7 +4,7 @@ + dh $@ --with autoreconf + + override_dh_auto_configure: +- dh_auto_configure -- \ ++ dh_auto_configure -- libmonit_cv_setjmp_available=yes libmonit_cv_vsnprintf_c99_conformant=yes \ + --sysconfdir=/etc/monit + + override_dh_fixperms: diff --git a/src/mpdecimal/Makefile b/src/mpdecimal/Makefile index b7f82ba702e5..dbd0569e15e0 100644 --- a/src/mpdecimal/Makefile +++ b/src/mpdecimal/Makefile @@ -14,7 +14,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc pushd mpdecimal-$(MPDECIMAL_VERSION) +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -us -uc -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $* $(DERIVED_TARGETS) $(DEST)/ diff --git a/src/ntp/Makefile b/src/ntp/Makefile index 0a821ad6ca52..c0103ba78107 100644 --- a/src/ntp/Makefile +++ b/src/ntp/Makefile @@ -38,8 +38,21 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # and go into learning mode. sed -i 's/\/usr\/sbin\/ntpd {/\/usr\/sbin\/ntpd flags=(attach_disconnected complain) {/' debian/apparmor-profile +ifeq ($(CROSS_BUILD_ENVIRON), y) + sed -i 's/dh_auto_configure \--/dh_auto_configure -- --with-yielding-select=yes /g' debian/rules + echo ". $(CONFIG_SITE)" > fix.ntp.cross-config.$(CONFIGURED_ARCH) + echo "unset with_openssl_libdir" >> fix.ntp.cross-config.$(CONFIGURED_ARCH) + echo "unset with_openssl_incdir" >> fix.ntp.cross-config.$(CONFIGURED_ARCH) + rm -f cross-config.cache + ln -s /etc/dpkg-cross/cross-config.cache cross-config.cache +endif + # Build source and Debian packages with the symbols +ifeq ($(CROSS_BUILD_ENVIRON), y) + CONFIG_SITE=`pwd`/fix.ntp.cross-config.$(CONFIGURED_ARCH) dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd diff --git a/src/openssh/Makefile b/src/openssh/Makefile index 91d4fd52bcf7..ec7942fe7e5e 100644 --- a/src/openssh/Makefile +++ b/src/openssh/Makefile @@ -19,7 +19,13 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg import -s ../patch/series # Build package +ifeq ($(CROSS_BUILD_ENVIRON), y) + patch -p1 < ../patch/cross-compile-changes.patch + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else + sudo http_proxy=$(http_proxy) apt-get -y build-dep openssh dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/openssh/patch/cross-compile-changes.patch b/src/openssh/patch/cross-compile-changes.patch new file mode 100644 index 000000000000..511c8c684386 --- /dev/null +++ b/src/openssh/patch/cross-compile-changes.patch @@ -0,0 +1,13 @@ +Index: openssh-server/debian/rules +=================================================================== +--- openssh-server.orig/debian/rules ++++ openssh-server/debian/rules +@@ -77,7 +77,7 @@ confflags_udeb := $(confflags) + confflags += --with-tcp-wrappers + confflags += --with-pam + confflags += --with-libedit +-confflags += --with-kerberos5=/usr ++confflags += --with-kerberos5-libdir=$(CROSS_PKGS_LIB_PATH) + confflags += --with-ssl-engine + ifeq ($(DEB_HOST_ARCH_OS),linux) + confflags += --with-selinux diff --git a/src/radius/nss/Makefile b/src/radius/nss/Makefile index 09526a04961c..96389ed3cc20 100644 --- a/src/radius/nss/Makefile +++ b/src/radius/nss/Makefile @@ -15,7 +15,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Apply patch (if any) +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -us -uc +else dpkg-buildpackage -rfakeroot -b -us -uc +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/radius/pam/Makefile b/src/radius/pam/Makefile index 9e10773b9bf9..685516b5f82f 100644 --- a/src/radius/pam/Makefile +++ b/src/radius/pam/Makefile @@ -16,9 +16,14 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : patch -p1 < ../patches/freeradius_configure.patch patch -p1 < ../patches/freeradius_2007-04-06.patch patch -p1 < ../patches/freeradius_libeap_deprecated_openssl_1_0.patch + patch -p1 < ../patches/libltdl_config_sub.patch cp ../patches/config.sub . cp ../patches/config.guess . +ifeq ($(CROSS_BUILD_ENVIRON), y) + ./configure --disable-static --enable-libtool-lock --host=$(CROSS_HOST_TYPE) +else ./configure --disable-static --enable-libtool-lock +endif make popd @@ -31,7 +36,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : cp -r ../debian . +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -us -uc -nc +else dpkg-buildpackage -rfakeroot -b -us -uc -nc +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/radius/pam/freeradius/patches/libltdl_config_sub.patch b/src/radius/pam/freeradius/patches/libltdl_config_sub.patch new file mode 100644 index 000000000000..37ad68edb482 --- /dev/null +++ b/src/radius/pam/freeradius/patches/libltdl_config_sub.patch @@ -0,0 +1,20 @@ +diff --git a/libltdl/config.sub b/libltdl/config.sub +index 2851647..63c6366 100755 +--- a/libltdl/config.sub ++++ b/libltdl/config.sub +@@ -241,6 +241,7 @@ case $basic_machine in + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | aarch64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ +@@ -317,6 +318,7 @@ case $basic_machine in + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | aarch64-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ diff --git a/src/redis/Makefile b/src/redis/Makefile index 3a4fe3f4844c..f7014d68a351 100644 --- a/src/redis/Makefile +++ b/src/redis/Makefile @@ -22,7 +22,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : pushd redis-$(REDIS_VERSION) export ARCH="" +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -us -uc -b -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/sflow/hsflowd/Makefile b/src/sflow/hsflowd/Makefile index d4312b30c267..35d17783f903 100644 --- a/src/sflow/hsflowd/Makefile +++ b/src/sflow/hsflowd/Makefile @@ -26,7 +26,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : chmod u+x debian/rules sed -i -e s/_VERSION_/$(HSFLOWD_VERSION)-$(HSFLOWD_SUBVERSION)/g debian/changelog +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) --buildinfo-option=-u. --changes-option=-u. +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) --buildinfo-option=-u. --changes-option=-u. +endif mv $(DERIVED_TARGET) $* $(DEST)/ popd diff --git a/src/sflow/hsflowd/patch/0002-host_sflow_debian.patch b/src/sflow/hsflowd/patch/0002-host_sflow_debian.patch index 86ebab723351..f1977ccb00b2 100644 --- a/src/sflow/hsflowd/patch/0002-host_sflow_debian.patch +++ b/src/sflow/hsflowd/patch/0002-host_sflow_debian.patch @@ -68,7 +68,7 @@ diff -ruN a/DEBIAN_build/rules b/DEBIAN_build/rules + dpkg-deb --build debian/hsflowd hsflowd_$(HSFLOWD_VERSION)-$(HSFLOWD_SUBVERSION)_$(CONFIGURED_ARCH).deb + +override_dh_auto_build: -+ make sonic-deb FEATURES="SONIC" ++ make sonic-deb FEATURES="SONIC" CC=$(CC) CXX=$(CXX) LD=$(CC) + +override_dh_auto_configure: + diff --git a/src/sflow/psample/Makefile b/src/sflow/psample/Makefile index bbdefde2289b..12981d8ebff3 100644 --- a/src/sflow/psample/Makefile +++ b/src/sflow/psample/Makefile @@ -13,7 +13,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : pushd ./libpsample git checkout -b libpsample -f e48fad2 +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $* $(DEST)/ diff --git a/src/sflow/psample/debian/psample.install b/src/sflow/psample/debian/psample.install deleted file mode 100644 index 36d4eac1a85b..000000000000 --- a/src/sflow/psample/debian/psample.install +++ /dev/null @@ -1,4 +0,0 @@ -bin/psample usr/bin -lib/libpsample.so.1.0 lib/x86_64-linux-gnu -lib/libpsample.so.1 lib/x86_64-linux-gnu -lib/libpsample.so lib/x86_64-linux-gnu diff --git a/src/sflow/psample/debian/rules b/src/sflow/psample/debian/rules index 73f484d32581..eb7df4dda5c8 100755 --- a/src/sflow/psample/debian/rules +++ b/src/sflow/psample/debian/rules @@ -4,16 +4,9 @@ %: dh $@ -override_dh_auto_build: - cmake . && make - override_dh_auto_install: + dh_auto_install + rm -r debian/psample/usr/include override_dh_auto_test: -override_dh_auto_clean: - -override_dh_strip: - -override_dh_clean: - diff --git a/src/sflow/sflowtool/Makefile b/src/sflow/sflowtool/Makefile index 5f2ad995a585..ecb0a4bb2903 100644 --- a/src/sflow/sflowtool/Makefile +++ b/src/sflow/sflowtool/Makefile @@ -12,7 +12,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : pushd ./sflowtool git checkout -b sflowtool -f 6c2963b +ifeq ($(CROSS_BUILD_ENVIRON), y) + CC=$(CROSS_CC) dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $* $(DEST)/ diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile index 35fc1d38ce9f..0445b1ed6bee 100644 --- a/src/snmpd/Makefile +++ b/src/snmpd/Makefile @@ -56,7 +56,11 @@ endif stg init stg import -s ../patch-$(SNMPD_VERSION)/series +ifneq ($(CROSS_BUILD_ENVIRON), y) dpkg-buildpackage -rfakeroot -b -d -us -uc -j1 --admindir $(SONIC_DPKG_ADMINDIR) +else + PYTHONPATH=/usr/lib/python2.7/plat-arm-linux-gnueabihf/ dpkg-buildpackage -rfakeroot -b -d -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j1 --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/snmpd/patch-5.7.3+dfsg/cross-compile-changes.patch b/src/snmpd/patch-5.7.3+dfsg/cross-compile-changes.patch new file mode 100644 index 000000000000..47db1105a68a --- /dev/null +++ b/src/snmpd/patch-5.7.3+dfsg/cross-compile-changes.patch @@ -0,0 +1,17 @@ +diff --git a/debian/rules b/debian/rules +index 9274c17..d107454 100755 +--- a/debian/rules ++++ b/debian/rules +@@ -5,6 +5,12 @@ export DEB_BUILD_MAINT_OPTIONS := hardening=+all + DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + DEB_BUILD_ARCH_OS ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS) + ++DEB_BUILD_MULTIARCH ?= $(shell dpkg-architecture -qDEB_BUILD_MULTIARCH) ++ ++ifneq ($(DEB_BUILD_MULTIARCH),$(DEB_HOST_MULTIARCH)) ++export PERL5OPT := -I/usr/lib/$(DEB_HOST_MULTIARCH)/perl/cross-config-$(shell perl -MConfig -e 'print $$Config{version}') ++endif ++ + LIB_VERSION = 30 + PYTHON_VERSION = 1.0a1 + diff --git a/src/snmpd/patch-5.7.3+dfsg/series b/src/snmpd/patch-5.7.3+dfsg/series index 31b251845dea..769b2938d37a 100644 --- a/src/snmpd/patch-5.7.3+dfsg/series +++ b/src/snmpd/patch-5.7.3+dfsg/series @@ -3,3 +3,4 @@ 0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch 0007-Linux-VRF-5.7.3-Support.patch 0008-Enable-macro-DEB_BUILD_ARCH_OS-in-order-to-build-ipv.patch +cross-compile-changes.patch diff --git a/src/snmpd/patch-5.9+dfsg/cross-compile-changes.patch b/src/snmpd/patch-5.9+dfsg/cross-compile-changes.patch new file mode 100644 index 000000000000..fedaeaa36bbf --- /dev/null +++ b/src/snmpd/patch-5.9+dfsg/cross-compile-changes.patch @@ -0,0 +1,17 @@ +diff --git a/debian/rules b/debian/rules +index b23b335..b8a79b9 100755 +--- a/debian/rules ++++ b/debian/rules +@@ -5,6 +5,12 @@ export DEB_BUILD_MAINT_OPTIONS := hardening=+all + DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + DEB_BUILD_ARCH_OS ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS) + ++DEB_BUILD_MULTIARCH ?= $(shell dpkg-architecture -qDEB_BUILD_MULTIARCH) ++ ++ifneq ($(DEB_BUILD_MULTIARCH),$(DEB_HOST_MULTIARCH)) ++export PERL5OPT := -I/usr/lib/$(DEB_HOST_MULTIARCH)/perl/cross-config ++endif ++ + LIB_VERSION = 40 + + MIB_MODULES = smux ucd-snmp/dlmod mibII/mta_sendmail disman/event-mib diff --git a/src/snmpd/patch-5.9+dfsg/series b/src/snmpd/patch-5.9+dfsg/series index cabee4060f9f..81a3ecc3f3e1 100644 --- a/src/snmpd/patch-5.9+dfsg/series +++ b/src/snmpd/patch-5.9+dfsg/series @@ -3,3 +3,4 @@ #0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch #0007-Linux-VRF-5.7.3-Support.patch 0008-Enable-macro-DEB_BUILD_ARCH_OS-in-order-to-build-ipv.patch +cross-compile-changes.patch diff --git a/src/socat/Makefile b/src/socat/Makefile index 1d1a0b36695c..8df6c826007b 100644 --- a/src/socat/Makefile +++ b/src/socat/Makefile @@ -18,7 +18,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build source and Debian packages pushd socat-1.7.4.1 patch -p0 < ../enable_readline.patch +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -rfakeroot -Pnocheck -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory diff --git a/src/sonic-device-data/Makefile b/src/sonic-device-data/Makefile index 2077e98f3e98..7993564ea309 100644 --- a/src/sonic-device-data/Makefile +++ b/src/sonic-device-data/Makefile @@ -26,7 +26,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : done; # Build the package +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd diff --git a/src/sonic-frr/Makefile b/src/sonic-frr/Makefile index a2e2c12885db..289c3de6bc74 100644 --- a/src/sonic-frr/Makefile +++ b/src/sonic-frr/Makefile @@ -11,15 +11,26 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build the package pushd ./frr git checkout -b $(FRR_BRANCH) origin/$(FRR_BRANCH) || git checkout $(FRR_BRANCH) +ifeq ($(CROSS_BUILD_ENVIRON), y) + git reset --hard +endif stg branch --create $(STG_BRANCH) $(FRR_TAG) stg import -s ../patch/series - gbp dch --ignore-branch --new-version=$(FRR_VERSION)-sonic-$(FRR_SUBVERSION) --dch-opt="--force-bad-version" --commit --git-author + gbp dch --ignore-branch --new-version=$(FRR_VERSION)-sonic-$(FRR_SUBVERSION) --dch-opt="--force-bad-version" --commit --git-author + +ifeq ($(CROSS_BUILD_ENVIRON), y) + CFLAGS="-I $$CROSS_PERL_CORE_PATH" dpkg-buildpackage -rfakeroot -b -d -us -uc -Ppkg.frr.nortrlib -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -Ppkg.frr.nortrlib -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif stg undo || true git clean -xfdf git checkout $(FRR_BRANCH) - stg branch --delete $(STG_BRANCH) + stg branch --delete --force $(STG_BRANCH) git rev-parse --short HEAD | xargs git checkout +ifeq ($(CROSS_BUILD_ENVIRON), y) + git reset --hard +endif git checkout master git branch -D $(FRR_BRANCH) popd diff --git a/src/sonic-frr/patch/cross-compile-changes.patch b/src/sonic-frr/patch/cross-compile-changes.patch new file mode 100644 index 000000000000..621a8a66985d --- /dev/null +++ b/src/sonic-frr/patch/cross-compile-changes.patch @@ -0,0 +1,86 @@ +From ece218405fe4c086017f2a4f2b2b4c86b9790db0 Mon Sep 17 00:00:00 2001 +From: Saikrishna Arcot +Date: Wed, 6 Jul 2022 11:28:16 -0700 +Subject: [PATCH] Make changes to support crosscompilation in SONiC + +Signed-off-by: Saikrishna Arcot +--- + debian/frr-doc.info | 1 - + debian/frr.manpages | 16 ---------------- + debian/rules | 17 ++++++++++++----- + 3 files changed, 12 insertions(+), 22 deletions(-) + delete mode 100644 debian/frr-doc.info + delete mode 100644 debian/frr.manpages + +diff --git a/debian/frr-doc.info b/debian/frr-doc.info +deleted file mode 100644 +index a83255a24..000000000 +--- a/debian/frr-doc.info ++++ /dev/null +@@ -1 +0,0 @@ +-doc/user/_build/texinfo/frr.info +diff --git a/debian/frr.manpages b/debian/frr.manpages +deleted file mode 100644 +index 5075fd763..000000000 +--- a/debian/frr.manpages ++++ /dev/null +@@ -1,16 +0,0 @@ +-doc/manpages/_build/man/frr-bgpd.8 +-doc/manpages/_build/man/frr-eigrpd.8 +-doc/manpages/_build/man/frr-fabricd.8 +-doc/manpages/_build/man/frr-isisd.8 +-doc/manpages/_build/man/frr-ldpd.8 +-doc/manpages/_build/man/frr-nhrpd.8 +-doc/manpages/_build/man/frr-ospf6d.8 +-doc/manpages/_build/man/frr-ospfd.8 +-doc/manpages/_build/man/frr-pimd.8 +-doc/manpages/_build/man/frr-ripd.8 +-doc/manpages/_build/man/frr-ripngd.8 +-doc/manpages/_build/man/frr-watchfrr.8 +-doc/manpages/_build/man/frr-zebra.8 +-doc/manpages/_build/man/frr.1 +-doc/manpages/_build/man/mtracebis.8 +-doc/manpages/_build/man/vtysh.1 +diff --git a/debian/rules b/debian/rules +index 0fa9c3a3b..6b005ea5f 100755 +--- a/debian/rules ++++ b/debian/rules +@@ -27,10 +27,17 @@ else + CONF_LUA=--enable-scripting + endif + ++DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) ++DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) ++ ++ifneq ($(DEB_BUILD_ARCH),$(DEB_HOST_ARCH)) ++export PYTHON=/python_virtualenv/env3/bin/python3 ++else + export PYTHON=python3 ++endif + + %: +- dh $@ ++ dh $@ --builddirectory=build + + override_dh_auto_configure: + $(shell dpkg-buildflags --export=sh); \ +@@ -67,12 +74,12 @@ override_dh_auto_configure: + override_dh_auto_install: + dh_auto_install + +- sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/frr-reload.py +- sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/generate_support_bundle.py ++ sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/frr-reload.py ++ sed -e '1c #!$(shell which $PYTHON)' -i debian/tmp/usr/lib/frr/generate_support_bundle.py + + # let dh_systemd_* and dh_installinit do their thing automatically +- cp tools/frr.service debian/frr.service +- cp tools/frrinit.sh debian/frr.init ++ cp build/tools/frr.service debian/frr.service ++ cp build/tools/frrinit.sh debian/frr.init + -rm -f debian/tmp/usr/lib/frr/frr + + # install config files +-- +2.25.1 + diff --git a/src/sonic-frr/patch/series b/src/sonic-frr/patch/series index 43e407a3c952..3e8438bf6dd5 100644 --- a/src/sonic-frr/patch/series +++ b/src/sonic-frr/patch/series @@ -7,3 +7,4 @@ 0007-Add-support-of-bgp-l3vni-evpn.patch 0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch Disable-ipv6-src-address-test-in-pceplib.patch +cross-compile-changes.patch diff --git a/src/swig/Makefile b/src/swig/Makefile index 2d3388eba138..f00d86521806 100644 --- a/src/swig/Makefile +++ b/src/swig/Makefile @@ -13,7 +13,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x swig_$(SWIG_VERSION).dsc pushd ./swig-$(SWIG_VERSION) +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/systemd-sonic-generator/Makefile b/src/systemd-sonic-generator/Makefile index 565fcb8030a7..0e6fb9095dce 100644 --- a/src/systemd-sonic-generator/Makefile +++ b/src/systemd-sonic-generator/Makefile @@ -1,17 +1,11 @@ CC=gcc -CFLAGS=-std=gnu99 -D_GNU_SOURCE +CFLAGS += -std=gnu99 -D_GNU_SOURCE -CPP=g++ -CPPFLAGS=-std=c++11 -D_GNU_SOURCE -LFLAGS=-lpthread -lboost_filesystem -lboost_system -lgtest +CXX=g++ +CXXFLAGS += -std=c++11 -D_GNU_SOURCE +LDFLAGS += -lpthread -lboost_filesystem -lboost_system -lgtest BINARY = systemd-sonic-generator -MAIN_TARGET = $(BINARY)_1.0.0_$(CONFIGURED_ARCH).deb - -$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) - mv ../$(MAIN_TARGET) $(DEST)/ - rm ../$(BINARY)-* ../$(BINARY)_* $(BINARY): systemd-sonic-generator.c rm -f ./systemd-sonic-generator @@ -30,7 +24,7 @@ test: ssg_test ./ssg_test ssg_test: ssg-test.cc systemd-sonic-generator.o - $(CPP) $(CPPFLAGS) -o $@ $^ $(LFLAGS) + $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) systemd-sonic-generator.o: systemd-sonic-generator.c $(CC) $(CFLAGS) -D_SSG_UNITTEST -o $@ -c $^ diff --git a/src/systemd-sonic-generator/debian/control b/src/systemd-sonic-generator/debian/control index cbf8989e8dfb..1daa9bc0f71d 100644 --- a/src/systemd-sonic-generator/debian/control +++ b/src/systemd-sonic-generator/debian/control @@ -1,6 +1,11 @@ Source: systemd-sonic-generator +Section: devel +Priority: optional +Build-Depends: debhelper (>= 11.0.0) +Standards-Version: 3.9.3 Maintainer: Lawrence Lee Package: systemd-sonic-generator Architecture: any +Depends: ${shlibs:Depends} Description: Systemd generator for SONiC services diff --git a/src/systemd-sonic-generator/debian/rules b/src/systemd-sonic-generator/debian/rules index 212fdda16b1f..9e806e866501 100755 --- a/src/systemd-sonic-generator/debian/rules +++ b/src/systemd-sonic-generator/debian/rules @@ -1,21 +1,9 @@ #!/usr/bin/make -f - -DISTRIBUTION = $(shell sed -n "s/^VERSION_CODENAME=//p" /etc/os-release) -VERSION = 1.0.0 -PACKAGEVERSION = $(VERSION) +export DH_VERBOSE=1 %: dh $@ -override_dh_auto_clean: -override_dh_auto_build: -override_dh_auto_install: - make systemd-sonic-generator - make install DESTDIR=debian/systemd-sonic-generator - -override_dh_gencontrol: - dh_gencontrol -- -v$(PACKAGEVERSION) - override_dh_auto_test: ifneq "$(DEB_HOST_ARCH)" "armhf" make test diff --git a/src/tacacs/audisp/Makefile b/src/tacacs/audisp/Makefile index 6bf80cc67710..ecfd692779b7 100644 --- a/src/tacacs/audisp/Makefile +++ b/src/tacacs/audisp/Makefile @@ -21,10 +21,14 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # fix aclocal depency issue by run auto.sh ./auto.sh +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else # build package dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ -$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) \ No newline at end of file +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/tacacs/nss/Makefile b/src/tacacs/nss/Makefile index 0c8f25f44eac..f958e5625f00 100644 --- a/src/tacacs/nss/Makefile +++ b/src/tacacs/nss/Makefile @@ -15,7 +15,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : stg init stg import -s ../patch/series +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/tacacs/pam/Makefile b/src/tacacs/pam/Makefile index eac4840b2afc..6c213d53dff1 100644 --- a/src/tacacs/pam/Makefile +++ b/src/tacacs/pam/Makefile @@ -25,7 +25,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git apply ../0009-Add-setting-flag-for-authorization-and-accounting.patch git apply ../0010-handle-bad-password-set-by-sshd.patch +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/thrift/Makefile b/src/thrift/Makefile index 2580002fd457..643cc61faf45 100644 --- a/src/thrift/Makefile +++ b/src/thrift/Makefile @@ -27,7 +27,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # (https://jira.apache.org/jira/browse/THRIFT-3650) patch -p1 < ../patch/0001-Revert-THRIFT-3650-incorrect-union-serialization.patch patch -p1 < ../patch/0002-cve-2017-1000487.patch +ifeq ($(CROSS_BUILD_ENVIRON), y) + CC=$(CROSS_CC) LDSHARED=$(CROSS_CC) CXXFLAGS="-DFORCE_BOOST_SMART_PTR -DSIGNED_RIGHT_SHIFT_IS=1 -DARITHMETIC_RIGHT_SHIFT=1" CFLAGS="-DSIGNED_RIGHT_SHIFT_IS=1 -DARITHMETIC_RIGHT_SHIFT=1" dpkg-buildpackage -d -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else CXXFLAGS="-DFORCE_BOOST_SMART_PTR" DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/wpasupplicant/Makefile b/src/wpasupplicant/Makefile index 8d098bdc8b87..0ae72fef615e 100644 --- a/src/wpasupplicant/Makefile +++ b/src/wpasupplicant/Makefile @@ -8,7 +8,11 @@ DERIVED_TARGETS = wpasupplicant-dbgsym_$(WPASUPPLICANT_VERSION)_$(CONFIGURED_ARC $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Clone wpa repo pushd ./sonic-wpa-supplicant +ifeq ($(CROSS_BUILD_ENVIRON), y) + dpkg-buildpackage -rfakeroot -b -us -uc -a$(CONFIGURED_ARCH) -Pcross,nocheck -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +else dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) +endif popd # Move the newly-built .deb packages to the destination directory From f323f56c544d74d38e9ab8ae365980b11625e159 Mon Sep 17 00:00:00 2001 From: Iris Hsu Date: Fri, 22 Jul 2022 09:01:39 +0800 Subject: [PATCH 583/817] flush VRF_OBJECT_TABLE table on state db when swss start (#11509) *flush VRF_OBJECT_TABLE table on state db when swss start --- files/scripts/swss.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 5b2772eafac4..ca1898e7df98 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -176,7 +176,7 @@ start() { $SONIC_DB_CLI GB_ASIC_DB FLUSHDB $SONIC_DB_CLI GB_COUNTERS_DB FLUSHDB $SONIC_DB_CLI RESTAPI_DB FLUSHDB - clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*', 'MACSEC_PORT_TABLE*', 'MACSEC_INGRESS_SA_TABLE*', 'MACSEC_EGRESS_SA_TABLE*', 'MACSEC_INGRESS_SC_TABLE*', 'MACSEC_EGRESS_SC_TABLE*'" + clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*', 'MACSEC_PORT_TABLE*', 'MACSEC_INGRESS_SA_TABLE*', 'MACSEC_EGRESS_SA_TABLE*', 'MACSEC_INGRESS_SC_TABLE*', 'MACSEC_EGRESS_SC_TABLE*', 'VRF_OBJECT_TABLE*'" $SONIC_DB_CLI APPL_STATE_DB FLUSHDB fi From ff605808f984aab687c4b52b5e377eacadc48fd5 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 21 Jul 2022 18:02:23 -0700 Subject: [PATCH 584/817] [master][sonic-linkmgrd] Submodule Update (#11513) [master][sonic-linkmgrd] Submodule Update 945b107 Jing Zhang Thu Jul 21 10:16:53 2022 -0700 Avoid unnecessary error logs from handleGetServerMacAddressNotification (#96) 9044962 Jing Zhang Mon Jul 18 15:38:04 2022 -0700 Add support for reconciliation after warm restart (#76) sign-off: Jing Zhang zhangjing@microsoft.com --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 58d8aae2db7e..945b10735db7 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 58d8aae2db7ede644f6b0b48c8b6188c22d9028b +Subproject commit 945b10735db7ab432c915b69edee89f73d9eac75 From f01749de996fb9114d2d3e08fcd2b1f30488d2b0 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 22 Jul 2022 01:52:46 +0000 Subject: [PATCH 585/817] [macsec] cli multi-namespace support (#11285) Enable multi-asic platform support for macsec cli --- .../cli-plugin-tests/conftest.py | 1 + .../cli-plugin-tests/mock_single_asic.py | 81 +++++++++++++++++++ .../cli-plugin-tests/mock_tables.py | 5 +- .../cli-plugin-tests/test_config_macsec.py | 64 +++++++-------- .../cli/config/plugins/macsec.py | 69 +++++++++------- .../cli/show/plugins/show_macsec.py | 56 ++++++++----- 6 files changed, 193 insertions(+), 83 deletions(-) create mode 100644 dockers/docker-macsec/cli-plugin-tests/mock_single_asic.py diff --git a/dockers/docker-macsec/cli-plugin-tests/conftest.py b/dockers/docker-macsec/cli-plugin-tests/conftest.py index e6608ce71265..c7fd38b84179 100644 --- a/dockers/docker-macsec/cli-plugin-tests/conftest.py +++ b/dockers/docker-macsec/cli-plugin-tests/conftest.py @@ -1,5 +1,6 @@ import pytest import mock_tables # lgtm [py/unused-import] +import mock_single_asic # lgtm[py/unused-import] from unittest import mock diff --git a/dockers/docker-macsec/cli-plugin-tests/mock_single_asic.py b/dockers/docker-macsec/cli-plugin-tests/mock_single_asic.py new file mode 100644 index 000000000000..db5642b4652c --- /dev/null +++ b/dockers/docker-macsec/cli-plugin-tests/mock_single_asic.py @@ -0,0 +1,81 @@ +# MONKEY PATCH!!! +from unittest import mock + +from sonic_py_common import multi_asic +from utilities_common import multi_asic as multi_asic_util + +mock_intf_table = { + '': { + 'eth0': { + 2: [{'addr': '10.1.1.1', 'netmask': '255.255.255.0', 'broadcast': '10.1.1.1'}], + 10: [{'addr': '3100::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}] + }, + 'Ethernet0': { + 17: [{'addr': '82:fd:d1:5b:45:2f', 'broadcast': 'ff:ff:ff:ff:ff:ff'}], + 2: [ + {'addr': '20.1.1.1', 'netmask': '255.255.255.0', 'broadcast': '20.1.1.1'}, + {'addr': '21.1.1.1', 'netmask': '255.255.255.0', 'broadcast': '21.1.1.1'} + ], + 10: [ + {'addr': 'aa00::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}, + {'addr': '2100::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}, + {'addr': 'fe80::64be:a1ff:fe85:c6c4%Ethernet0', 'netmask': 'ffff:ffff:ffff:ffff::/64'} + ] + }, + 'PortChannel0001': { + 17: [{'addr': '82:fd:d1:5b:45:2f', 'broadcast': 'ff:ff:ff:ff:ff:ff'}], + 2: [{'addr': '30.1.1.1', 'netmask': '255.255.255.0', 'broadcast': '30.1.1.1'}], + 10: [ + {'addr': 'ab00::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}, + {'addr': 'fe80::cc8d:60ff:fe08:139f%PortChannel0001', 'netmask': 'ffff:ffff:ffff:ffff::/64'} + ] + }, + 'Vlan100': { + 17: [{'addr': '82:fd:d1:5b:45:2f', 'broadcast': 'ff:ff:ff:ff:ff:ff'}], + 2: [{'addr': '40.1.1.1', 'netmask': '255.255.255.0', 'broadcast': '30.1.1.1'}], + 10: [ + {'addr': 'cc00::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}, + {'addr': 'fe80::c029:3fff:fe41:cf56%Vlan100', 'netmask': 'ffff:ffff:ffff:ffff::/64'} + ] + }, + 'lo': { + 2: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'broadcast': '127.255.255.255'}], + 10: [{'addr': '::1', 'netmask':'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'}] + } + } +} + + +def mock_get_num_asics(): + return 1 + +def mock_is_multi_asic(): + return False + +def mock_get_namespace_list(namespace=None): + return [''] + + +def mock_single_asic_get_ip_intf_from_ns(namespace): + interfaces = [] + try: + interfaces = list(mock_intf_table[namespace].keys()) + except KeyError: + pass + return interfaces + + +def mock_single_asic_get_ip_intf_addr_from_ns(namespace, iface): + ipaddresses = [] + try: + ipaddresses = mock_intf_table[namespace][iface] + except KeyError: + pass + return ipaddresses + + +multi_asic.is_multi_asic = mock_is_multi_asic +multi_asic.get_num_asics = mock_get_num_asics +multi_asic.get_namespace_list = mock_get_namespace_list +multi_asic_util.multi_asic_get_ip_intf_from_ns = mock_single_asic_get_ip_intf_from_ns +multi_asic_util.multi_asic_get_ip_intf_addr_from_ns = mock_single_asic_get_ip_intf_addr_from_ns diff --git a/dockers/docker-macsec/cli-plugin-tests/mock_tables.py b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py index 3708644bfba2..7580f9929ed5 100644 --- a/dockers/docker-macsec/cli-plugin-tests/mock_tables.py +++ b/dockers/docker-macsec/cli-plugin-tests/mock_tables.py @@ -125,7 +125,10 @@ def __init__(self, db): def get(self, macsec, name): key = self.db.hget("COUNTERS_MACSEC_NAME_MAP", name) - return self.db.get("COUNTERS:" + key) + if key: + fvs = self.db.get("COUNTERS:" + key) + if fvs: return True, fvs + return False, () swsssdk.interface.DBInterface._subscribe_keyspace_notification = _subscribe_keyspace_notification diff --git a/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py index 425ca2afa433..45ab80c7ed12 100644 --- a/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py +++ b/dockers/docker-macsec/cli-plugin-tests/test_config_macsec.py @@ -2,7 +2,6 @@ from unittest import mock from click.testing import CliRunner -from utilities_common.db import Db sys.path.append('../cli/config/plugins/') import macsec @@ -20,14 +19,13 @@ def test_plugin_registration(self): cli.add_command.assert_called_once_with(macsec.macsec) def test_default_profile(self, mock_cfgdb): + cfgdb = mock_cfgdb runner = CliRunner() - db = Db() - db.cfgdb = mock_cfgdb - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], - [profile_name, "--primary_cak=" + primary_cak,"--primary_ckn=" + primary_ckn], - obj=db) + result = runner.invoke(macsec.macsec, + ["profile", "add", profile_name, "--primary_cak=" + primary_cak,"--primary_ckn=" + primary_ckn], + obj=cfgdb) assert result.exit_code == 0 - profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + profile_table = cfgdb.get_entry("MACSEC_PROFILE", profile_name) assert profile_table assert profile_table["priority"] == "255" assert profile_table["cipher_suite"] == "GCM-AES-128" @@ -39,15 +37,14 @@ def test_default_profile(self, mock_cfgdb): assert profile_table["send_sci"] == "true" assert "rekey_period" not in profile_table - result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], [profile_name], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "del", profile_name], obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) - profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + profile_table = cfgdb.get_entry("MACSEC_PROFILE", profile_name) assert not profile_table def test_macsec_valid_profile(self, mock_cfgdb): + cfgdb = mock_cfgdb runner = CliRunner() - db = Db() - db.cfgdb = mock_cfgdb profile_name = "test" profile_map = { @@ -67,9 +64,9 @@ def test_macsec_valid_profile(self, mock_cfgdb): if v is not None: options[-1] += "=" + str(v) - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], options, obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add"] + options, obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) - profile_table = db.cfgdb.get_entry("MACSEC_PROFILE", profile_name) + profile_table = cfgdb.get_entry("MACSEC_PROFILE", profile_name) assert profile_table assert profile_table["priority"] == str(profile_map["priority"]) assert profile_table["cipher_suite"] == profile_map["cipher_suite"] @@ -87,62 +84,65 @@ def test_macsec_valid_profile(self, mock_cfgdb): assert profile_table["rekey_period"] == str(profile_map["rekey_period"]) def test_macsec_invalid_profile(self, mock_cfgdb): + cfgdb = mock_cfgdb runner = CliRunner() - db = Db() - db.cfgdb = mock_cfgdb # Loss primary cak and primary ckn - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test"], obj=cfgdb) assert result.exit_code != 0 # Invalid primary cak - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=abcdfghjk90123456789012345678912","--primary_ckn=01234567890123456789012345678912", "--cipher_suite=GCM-AES-128"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test", + "--primary_cak=abcdfghjk90123456789012345678912","--primary_ckn=01234567890123456789012345678912", + "--cipher_suite=GCM-AES-128"], obj=cfgdb) assert result.exit_code != 0 # Invalid primary cak length - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912", "--cipher_suite=GCM-AES-256"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test", + "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912", + "--cipher_suite=GCM-AES-256"], obj=cfgdb) assert result.exit_code != 0 def test_macsec_port(self, mock_cfgdb): + cfgdb = mock_cfgdb runner = CliRunner() - db = Db() - db.cfgdb = mock_cfgdb - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test", + "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], + obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) - result = runner.invoke(macsec.macsec.commands["port"].commands["add"], ["Ethernet0", "test"], obj=db) + result = runner.invoke(macsec.macsec, ["port", "add", "Ethernet0", "test"], obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) - port_table = db.cfgdb.get_entry("PORT", "Ethernet0") + port_table = cfgdb.get_entry("PORT", "Ethernet0") assert port_table assert port_table["macsec"] == "test" assert port_table["admin_status"] == "up" - result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], ["test"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "del", "test"], obj=cfgdb) assert result.exit_code != 0 - result = runner.invoke(macsec.macsec.commands["port"].commands["del"], ["Ethernet0"], obj=db) + result = runner.invoke(macsec.macsec, ["port", "del", "Ethernet0"], obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) - port_table = db.cfgdb.get_entry("PORT", "Ethernet0") + port_table = cfgdb.get_entry("PORT", "Ethernet0") assert "macsec" not in port_table or not port_table["macsec"] assert port_table["admin_status"] == "up" def test_macsec_invalid_operation(self, mock_cfgdb): + cfgdb = mock_cfgdb runner = CliRunner() - db = Db() - db.cfgdb = mock_cfgdb # Enable nonexisted profile - result = runner.invoke(macsec.macsec.commands["port"].commands["add"], ["Ethernet0", "test"], obj=db) + result = runner.invoke(macsec.macsec, ["port", "add", "Ethernet0", "test"], obj=cfgdb) assert result.exit_code != 0 # Delete nonexisted profile - result = runner.invoke(macsec.macsec.commands["profile"].commands["del"], ["test"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "del", "test"], obj=cfgdb) assert result.exit_code != 0 - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=cfgdb) assert result.exit_code == 0, "exit code: {}, Exception: {}, Traceback: {}".format(result.exit_code, result.exception, result.exc_info) # Repeat add profile - result = runner.invoke(macsec.macsec.commands["profile"].commands["add"], ["test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=db) + result = runner.invoke(macsec.macsec, ["profile", "add", "test", "--primary_cak=01234567890123456789012345678912","--primary_ckn=01234567890123456789012345678912"], obj=cfgdb) assert result.exit_code != 0 diff --git a/dockers/docker-macsec/cli/config/plugins/macsec.py b/dockers/docker-macsec/cli/config/plugins/macsec.py index b76de8c98c7f..1b820dfd0e99 100644 --- a/dockers/docker-macsec/cli/config/plugins/macsec.py +++ b/dockers/docker-macsec/cli/config/plugins/macsec.py @@ -1,13 +1,27 @@ import click import utilities_common.cli as clicommon +from sonic_py_common import multi_asic +from swsscommon.swsscommon import ConfigDBConnector +from utilities_common.constants import DEFAULT_NAMESPACE +from utilities_common.db import Db # # 'macsec' group ('config macsec ...') # @click.group(cls=clicommon.AbbreviationGroup, name='macsec') -def macsec(): +# TODO add "hidden=True if this is a single ASIC platform, once we have click 7.0 in all branches. +@click.option('-n', '--namespace', help='Namespace name', + required=True if multi_asic.is_multi_asic() else False, type=click.Choice(multi_asic.get_namespace_list())) +@click.pass_context +def macsec(ctx, namespace): """MACsec-related configuration tasks""" - pass + if not ctx.obj or isinstance(ctx.obj, Db): + # Set namespace to default_namespace if it is None. + if namespace is None: + namespace = DEFAULT_NAMESPACE + config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=str(namespace)) + config_db.connect() + ctx.obj = config_db # @@ -24,31 +38,29 @@ def macsec_port(): @macsec_port.command('add') @click.argument('port', metavar='', required=True) @click.argument('profile', metavar='', required=True) -@clicommon.pass_db -def add_port(db, port, profile): +def add_port(port, profile): """ Add MACsec port """ ctx = click.get_current_context() + config_db = ctx.obj if clicommon.get_interface_naming_mode() == "alias": - alias = port - iface_alias_converter = clicommon.InterfaceAliasConverter(db) - port = iface_alias_converter.alias_to_name(alias) + port = interface_alias_to_name(config_db, port) if port is None: - ctx.fail("cannot find port name for alias {}".format(alias)) + ctx.fail("cannot find port name for alias {}".format(port)) - profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + profile_entry = config_db.get_entry('MACSEC_PROFILE', profile) if len(profile_entry) == 0: ctx.fail("profile {} doesn't exist".format(profile)) - port_entry = db.cfgdb.get_entry('PORT', port) + port_entry = config_db.get_entry('PORT', port) if len(port_entry) == 0: ctx.fail("port {} doesn't exist".format(port)) port_entry['macsec'] = profile - db.cfgdb.set_entry("PORT", port, port_entry) + config_db.set_entry("PORT", port, port_entry) # @@ -56,27 +68,25 @@ def add_port(db, port, profile): # @macsec_port.command('del') @click.argument('port', metavar='', required=True) -@clicommon.pass_db -def del_port(db, port): +def del_port(port): """ Delete MACsec port """ ctx = click.get_current_context() + config_db = ctx.obj if clicommon.get_interface_naming_mode() == "alias": - alias = port - iface_alias_converter = clicommon.InterfaceAliasConverter(db) - port = iface_alias_converter.alias_to_name(alias) + port = interface_alias_to_name(config_db, port) if port is None: - ctx.fail("cannot find port name for alias {}".format(alias)) + ctx.fail("cannot find port name for alias {}".format(port)) - port_entry = db.cfgdb.get_entry('PORT', port) + port_entry = config_db.get_entry('PORT', port) if len(port_entry) == 0: ctx.fail("port {} doesn't exist".format(port)) del port_entry['macsec'] - db.cfgdb.set_entry("PORT", port, port_entry) + config_db.set_entry("PORT", port, port_entry) # @@ -109,13 +119,14 @@ def is_hexstring(hexstring: str): @click.option('--replay_window', metavar='', required=False, default=0, show_default=True, type=click.IntRange(0, 2**32), help="Replay window size that is the number of packets that could be out of order. This field works only if ENABLE_REPLAY_PROTECT is true.") @click.option('--send_sci/--no_send_sci', metavar='', required=False, default=True, show_default=True, is_flag=True, help="Send SCI in SecTAG field of MACsec header.") @click.option('--rekey_period', metavar='', required=False, default=0, show_default=True, type=click.IntRange(min=0), help="The period of proactively refresh (Unit second).") -@clicommon.pass_db -def add_profile(db, profile, priority, cipher_suite, primary_cak, primary_ckn, policy, enable_replay_protect, replay_window, send_sci, rekey_period): +def add_profile(profile, priority, cipher_suite, primary_cak, primary_ckn, policy, enable_replay_protect, replay_window, send_sci, rekey_period): """ Add MACsec profile """ ctx = click.get_current_context() - profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + config_db = ctx.obj + + profile_entry = config_db.get_entry('MACSEC_PROFILE', profile) if not len(profile_entry) == 0: ctx.fail("{} already exists".format(profile)) @@ -157,7 +168,7 @@ def add_profile(db, profile, priority, cipher_suite, primary_cak, primary_ckn, p profile_table[k] = "false" else: profile_table[k] = str(v) - db.cfgdb.set_entry("MACSEC_PROFILE", profile, profile_table) + config_db.set_entry("MACSEC_PROFILE", profile, profile_table) # @@ -165,24 +176,24 @@ def add_profile(db, profile, priority, cipher_suite, primary_cak, primary_ckn, p # @macsec_profile.command('del') @click.argument('profile', metavar='', required=True) -@clicommon.pass_db -def del_profile(db, profile): +def del_profile( profile): """ Delete MACsec profile """ ctx = click.get_current_context() + config_db = ctx.obj - profile_entry = db.cfgdb.get_entry('MACSEC_PROFILE', profile) + profile_entry = config_db.get_entry('MACSEC_PROFILE', profile) if len(profile_entry) == 0: ctx.fail("{} doesn't exist".format(profile)) # Check if the profile is being used by any port - for port in db.cfgdb.get_keys('PORT'): - attr = db.cfgdb.get_entry('PORT', port) + for port in config_db.get_keys('PORT'): + attr = config_db.get_entry('PORT', port) if 'macsec' in attr and attr['macsec'] == profile: ctx.fail("{} is being used by port {}, Please remove the MACsec from the port firstly".format(profile, port)) - db.cfgdb.set_entry("MACSEC_PROFILE", profile, None) + config_db.set_entry("MACSEC_PROFILE", profile, None) def register(cli): diff --git a/dockers/docker-macsec/cli/show/plugins/show_macsec.py b/dockers/docker-macsec/cli/show/plugins/show_macsec.py index 0d32f7e96249..3f1058df3572 100644 --- a/dockers/docker-macsec/cli/show/plugins/show_macsec.py +++ b/dockers/docker-macsec/cli/show/plugins/show_macsec.py @@ -4,22 +4,19 @@ import click from tabulate import tabulate -from swsscommon.swsscommon import SonicV2Connector +import utilities_common.multi_asic as multi_asic_util from swsscommon.swsscommon import CounterTable, MacsecCounter -DB_CONNECTOR = SonicV2Connector(use_unix_socket_path=False) -DB_CONNECTOR.connect(DB_CONNECTOR.APPL_DB) -DB_CONNECTOR.connect(DB_CONNECTOR.COUNTERS_DB) -COUNTER_TABLE = CounterTable(DB_CONNECTOR.get_redis_client(DB_CONNECTOR.COUNTERS_DB)) +DB_CONNECTOR = None +COUNTER_TABLE = None class MACsecAppMeta(object): - SEPARATOR = DB_CONNECTOR.get_db_separator(DB_CONNECTOR.APPL_DB) - def __init__(self, *args) -> None: - key = self.__class__.get_appl_table_name() + MACsecAppMeta.SEPARATOR + \ - MACsecAppMeta.SEPARATOR.join(args) + SEPARATOR = DB_CONNECTOR.get_db_separator(DB_CONNECTOR.APPL_DB) + key = self.__class__.get_appl_table_name() + SEPARATOR + \ + SEPARATOR.join(args) self.meta = DB_CONNECTOR.get_all( DB_CONNECTOR.APPL_DB, key) if len(self.meta) == 0: @@ -184,19 +181,36 @@ def create_macsec_objs(interface_name: str) -> typing.List[MACsecAppMeta]: @click.command() @click.argument('interface_name', required=False) -def macsec(interface_name): - ctx = click.get_current_context() - objs = [] - interface_names = [name.split(":")[1] for name in DB_CONNECTOR.keys(DB_CONNECTOR.APPL_DB, "MACSEC_PORT*")] - if interface_name is not None: - if interface_name not in interface_names: - ctx.fail("Cannot find the port {} in MACsec port lists {}".format(interface_name, interface_names)) - else: +@multi_asic_util.multi_asic_click_options +def macsec(interface_name, namespace, display): + MacsecContext(namespace, display).show(interface_name) + + +class MacsecContext(object): + + def __init__(self, namespace_option, display_option): + self.db = None + self.multi_asic = multi_asic_util.MultiAsic( + display_option, namespace_option) + + @multi_asic_util.run_on_multi_asic + def show(self, interface_name): + global DB_CONNECTOR + global COUNTER_TABLE + DB_CONNECTOR = self.db + COUNTER_TABLE = CounterTable(self.db.get_redis_client(self.db.COUNTERS_DB)) + + interface_names = [name.split(":")[1] for name in self.db.keys(self.db.APPL_DB, "MACSEC_PORT*")] + if interface_name is not None: + if interface_name not in interface_names: + return interface_names = [interface_name] - for interface_name in natsorted(interface_names): - objs += create_macsec_objs(interface_name) - for obj in objs: - print(obj.dump_str()) + + objs = [] + for interface_name in natsorted(interface_names): + objs += create_macsec_objs(interface_name) + for obj in objs: + print(obj.dump_str()) def register(cli): From ba991ab2bf8886580f96b8193af6c9be29ef2af6 Mon Sep 17 00:00:00 2001 From: qiwang4 <97264329+qiwang4@users.noreply.github.com> Date: Fri, 22 Jul 2022 12:12:46 +0800 Subject: [PATCH 586/817] update submodule of sonic-sairedis (#11489) Signed-off-by: qiwang4 --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 48cccb45b7f6..bc7ccc2d5c2d 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 48cccb45b7f6e3945777ec6765cc421f3188ca04 +Subproject commit bc7ccc2d5c2ddad53ebd696f81ff3d45aacbf438 From 78ad769548c146e824ca06bf0053110f0f9425a4 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sun, 24 Jul 2022 19:19:33 +0800 Subject: [PATCH 587/817] [iproute2]: Enhance iproute2 to update PN for XPN (#11474) Why I did it ip command cannot update packet number if the cipher is XPN. How I did it Specify SSCI when update packet number and ignore SSCI value if update action. Signed-off-by: Ze Gan --- .../patch/0001-patch-macsec-xpn-support.patch | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/src/iproute2/patch/0001-patch-macsec-xpn-support.patch b/src/iproute2/patch/0001-patch-macsec-xpn-support.patch index 33e7e6a7dd94..54b8ab7968a7 100644 --- a/src/iproute2/patch/0001-patch-macsec-xpn-support.patch +++ b/src/iproute2/patch/0001-patch-macsec-xpn-support.patch @@ -1,15 +1,15 @@ -From f1ea3235b5250dfd1193b5033620b030b9789fd9 Mon Sep 17 00:00:00 2001 +From 129613207b2f1616507814fbe060a2ce317d0bbb Mon Sep 17 00:00:00 2001 From: Ze Gan -Date: Mon, 30 Aug 2021 06:45:28 +0000 +Date: Mon, 18 Jul 2022 15:07:15 +0000 Subject: [PATCH] MACsec XPN support Signed-off-by: Ze Gan --- - ip/ipmacsec.c | 86 ++++++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 74 insertions(+), 12 deletions(-) + ip/ipmacsec.c | 97 +++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 83 insertions(+), 14 deletions(-) diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c -index 18289ecd..1df19bf1 100644 +index 18289ec..fffe94a 100644 --- a/ip/ipmacsec.c +++ b/ip/ipmacsec.c @@ -10,6 +10,7 @@ @@ -119,33 +119,23 @@ index 18289ecd..1df19bf1 100644 if (sa->key_len) { addattr_l(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_KEYID, -@@ -428,6 +457,13 @@ static int do_modify_nl(enum cmd c, enum macsec_nl_commands cmd, int ifindex, +@@ -428,6 +457,15 @@ static int do_modify_nl(enum cmd c, enum macsec_nl_commands cmd, int ifindex, addattr8(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_ACTIVE, sa->active); } + -+ if (sa->ssci != 0) { -+ addattr32(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_SSCI, -+ sa->ssci); -+ addattr_l(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_SALT, -+ sa->salt, MACSEC_SALT_LEN); -+ } ++ if (c == CMD_ADD) { ++ if (sa->ssci != 0) { ++ addattr32(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_SSCI, ++ sa->ssci); ++ addattr_l(&req.n, MACSEC_BUFLEN, MACSEC_SA_ATTR_SALT, ++ sa->salt, MACSEC_SALT_LEN); ++ } ++ } } addattr_nest_end(&req.n, attr_sa); -@@ -456,6 +492,11 @@ static bool check_sa_args(enum cmd c, struct sa_desc *sa) - fprintf(stderr, "cannot change key on SA\n"); - return -1; - } -+ -+ if (sa->ssci) { -+ fprintf(stderr, "cannot change SSCI on SA\n"); -+ return -1; -+ } - } - - return 0; -@@ -637,6 +678,8 @@ static void print_key(struct rtattr *key) +@@ -637,6 +675,8 @@ static void print_key(struct rtattr *key) #define CIPHER_NAME_GCM_AES_128 "GCM-AES-128" #define CIPHER_NAME_GCM_AES_256 "GCM-AES-256" @@ -154,7 +144,7 @@ index 18289ecd..1df19bf1 100644 #define DEFAULT_CIPHER_NAME CIPHER_NAME_GCM_AES_128 static const char *cs_id_to_name(__u64 cid) -@@ -649,6 +692,10 @@ static const char *cs_id_to_name(__u64 cid) +@@ -649,6 +689,10 @@ static const char *cs_id_to_name(__u64 cid) return CIPHER_NAME_GCM_AES_128; case MACSEC_CIPHER_ID_GCM_AES_256: return CIPHER_NAME_GCM_AES_256; @@ -165,7 +155,7 @@ index 18289ecd..1df19bf1 100644 default: return "(unknown)"; } -@@ -897,13 +944,22 @@ static void print_tx_sc(const char *prefix, __u64 sci, __u8 encoding_sa, +@@ -897,12 +941,21 @@ static void print_tx_sc(const char *prefix, __u64 sci, __u8 encoding_sa, print_string(PRINT_FP, NULL, "%s", prefix); print_uint(PRINT_ANY, "an", "%d:", rta_getattr_u8(sa_attr[MACSEC_SA_ATTR_AN])); @@ -175,7 +165,7 @@ index 18289ecd..1df19bf1 100644 + print_uint(PRINT_ANY, "pn", " PN %u,", + rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_PN])); + } else { -+ print_uint(PRINT_ANY, "pn", " PN %" PRIu64 ",", ++ print_u64(PRINT_ANY, "pn", " PN %" PRIu64 ",", + rta_getattr_u64(sa_attr[MACSEC_SA_ATTR_PN])); + } @@ -184,13 +174,38 @@ index 18289ecd..1df19bf1 100644 " state %s,", state ? "on" : "off"); + if (sa_attr[MACSEC_SA_ATTR_SSCI]) { + print_uint(PRINT_ANY, "ssci", " SSCI %u,", -+ rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_SSCI])); ++ ntohl(rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_SSCI]))); + } print_key(sa_attr[MACSEC_SA_ATTR_KEYID]); print_txsa_stats(prefix, sa_attr[MACSEC_SA_ATTR_STATS]); - close_json_object(); -@@ -1322,9 +1378,15 @@ static int macsec_parse_opt(struct link_util *lu, int argc, char **argv, +@@ -965,13 +1018,23 @@ static void print_rx_sc(const char *prefix, __be64 sci, __u8 active, + print_string(PRINT_FP, NULL, "%s", prefix); + print_uint(PRINT_ANY, "an", "%u:", + rta_getattr_u8(sa_attr[MACSEC_SA_ATTR_AN])); +- print_uint(PRINT_ANY, "pn", " PN %u,", +- rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_PN])); ++ if (!sa_attr[MACSEC_SA_ATTR_SSCI]) { ++ print_uint(PRINT_ANY, "pn", " PN %u,", ++ rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_PN])); ++ } else { ++ print_u64(PRINT_ANY, "pn", " PN %" PRIu64 ",", ++ rta_getattr_u64(sa_attr[MACSEC_SA_ATTR_PN])); ++ } + + print_bool(PRINT_JSON, "active", NULL, state); + print_string(PRINT_FP, NULL, " state %s,", + state ? "on" : "off"); + ++ if (sa_attr[MACSEC_SA_ATTR_SSCI]) { ++ print_uint(PRINT_ANY, "ssci", " SSCI %u,", ++ ntohl(rta_getattr_u32(sa_attr[MACSEC_SA_ATTR_SSCI]))); ++ } ++ + print_key(sa_attr[MACSEC_SA_ATTR_KEYID]); + + print_rxsa_stats(prefix, sa_attr[MACSEC_SA_ATTR_STATS]); +@@ -1322,9 +1385,15 @@ static int macsec_parse_opt(struct link_util *lu, int argc, char **argv, else if (strcmp(*argv, "gcm-aes-256") == 0 || strcmp(*argv, "GCM-AES-256") == 0) cipher.id = MACSEC_CIPHER_ID_GCM_AES_256; @@ -209,5 +224,5 @@ index 18289ecd..1df19bf1 100644 NEXT_ARG(); if (cipher.icv_len) -- -2.17.1 +2.25.1 From 2aaa5a3492603266d89f4aff315feda34aec314b Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 25 Jul 2022 10:10:38 -0700 Subject: [PATCH 588/817] [submodule]Updating sonic-swss submodule (#11520) Updating swss submodule with below commits 4a6f940 [EVPN]Fix missing Vlan member update notification in P2MP scenario e9984d8 Enable p4orch unit test for test workflow. (#2375) 33c420d [Buffer Orch] Support removing buffer port profile list (#2371) 419ab1b [macsecmgr]: Fix cleanup macsec objs if container stop (#2376) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 90459953c820..4a6f940d976b 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 90459953c8206381d4b6ebf137e6bbd74eb212f8 +Subproject commit 4a6f940d976b693c379ce845f8bc35ccf978d388 From 9c179034d8e72147f4ed7af13b2a7bf336df2212 Mon Sep 17 00:00:00 2001 From: jaganbal-a <97986478+jaganbal-a@users.noreply.github.com> Date: Mon, 25 Jul 2022 13:57:12 -0400 Subject: [PATCH 589/817] Signed-off-by: Jaganathan Anbalagan (#11516) sonic-platform-daemon submodule update 005ec30 [ycabled] remove some redundant logging for active-active cable type (#274) e889625 [ycabled][grpc] Fix some time interval,options for grpc keep alive to work (#271) 1651050 [ycabled] add some retry logic for gRPC channel setup;fix no channel gRPC notification (#269) 7c0be24 [CMIS]Improved 400G link bring up sequence (#254) df447b4 [ycabled] Fix the init values for active-active ports (#266) ec84af4 [sonic-ycabled] fix grpc logic for timeout,cli HWSTATUS value retrival logic for active-active cable (#264) Co-authored-by: Jaganathan Anbalagan --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 0d90023b4ae9..005ec302783c 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 0d90023b4ae973bd2fa01381d4d1ba4992b45025 +Subproject commit 005ec302783c6d31a31e89e2e98bbafa717f770d From 5c0577d7d232e15fc374ccc1b03986ec883fee85 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Tue, 26 Jul 2022 02:00:00 +0800 Subject: [PATCH 590/817] Automatically enable tunnel_qos_remap on T1 and T0 in DualToR deployment (#11508) Why I did it This PR is to backport PR #11056 and PR #11045 into master branch. This PR is to enable tunnel_qos_remap on T1 and T0 in DualToR deployment. On T1, we check the property DownstreamRedundancyTypes. On T0, we check the property RedundancyType. tunnel_qos_remap is set to enabled if gemini is in DownstreamRedundancyTypes (on T1) or RedundancyType (on T0). How I did it The change is implemented in minigraph.py. How to verify it Verified by test_minigraph_case.py and 'test_j2files.py`. --- src/sonic-config-engine/minigraph.py | 66 +- ...ample-arista-7050cx3-dualtor-minigraph.xml | 13 +- .../sample-arista-7260-dualtor-minigraph.xml | 13 +- .../tests/sample-arista-7260-t1-minigraph.xml | 13 +- .../sample-mellanox-4600c-t1-minigraph.xml | 13 +- ...imple-sample-graph-case-remap-disabled.xml | 8 - ...ase-remap-enabled-no-tunnel-attributes.xml | 891 ++++++++++++++++++ ...simple-sample-graph-case-remap-enabled.xml | 13 +- .../tests/test_minigraph_case.py | 10 +- 9 files changed, 959 insertions(+), 81 deletions(-) create mode 100644 src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled-no-tunnel-attributes.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 952dca4ae558..4e573cd22a4f 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -895,6 +895,7 @@ def parse_meta(meta, hname): kube_data = {} macsec_profile = {} redundancy_type = None + downstream_redundancy_types = None qos_profile = None device_metas = meta.find(str(QName(ns, "Devices"))) @@ -941,33 +942,13 @@ def parse_meta(meta, hname): macsec_profile = parse_macsec_profile(value) elif name == "RedundancyType": redundancy_type = value + elif name == "DownstreamRedundancyTypes": + downstream_redundancy_types = value elif name == "SonicQosProfile": qos_profile = value - return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type, qos_profile + return syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile -def parse_system_defaults(meta): - system_default_values = {} - - system_defaults = meta.find(str(QName(ns1, "SystemDefaults"))) - - if system_defaults is None: - return system_default_values - - for system_default in system_defaults.findall(str(QName(ns1, "SystemDefault"))): - name = system_default.find(str(QName(ns1, "Name"))).text - value = system_default.find(str(QName(ns1, "Value"))).text - - # Tunnel Qos remapping - if name == "TunnelQosRemapEnabled": - if value.lower() == "true": - status = "enabled" - else: - status = "disabled" - system_default_values["tunnel_qos_remap"] = {"status": status} - - return system_default_values - def parse_linkmeta(meta, hname): link = meta.find(str(QName(ns, "Link"))) linkmetas = {} @@ -1369,6 +1350,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw static_routes = {} system_defaults = {} macsec_profile = {} + downstream_redundancy_types = None redundancy_type = None qos_profile = None @@ -1401,13 +1383,11 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname, None) elif child.tag == str(QName(ns, "MetadataDeclaration")): - (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, redundancy_type, qos_profile) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, dhcpv6_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region, cloudtype, resource_type, downstream_subrole, switch_id, switch_type, max_cores, kube_data, macsec_profile, downstream_redundancy_types, redundancy_type, qos_profile) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "LinkMetadataDeclaration")): linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): (port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku) - elif child.tag == str(QName(ns, "SystemDefaultsDeclaration")): - system_defaults = parse_system_defaults(child) else: if child.tag == str(QName(ns, "DpgDec")): (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content, static_routes, tunnel_intfs_qos_remap_config) = parse_dpg(child, asic_name) @@ -1422,8 +1402,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw linkmetas = parse_linkmeta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): (port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku) - elif child.tag == str(QName(ns, "SystemDefaultsDeclaration")): - system_defaults = parse_system_defaults(child) select_mmu_profiles(qos_profile, platform, hwsku) # set the host device type in asic metadata also @@ -1460,10 +1438,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw 'ip': kube_data.get('ip', '') } } - - if len(system_defaults) > 0: - results['SYSTEM_DEFAULTS'] = system_defaults - + results['PEER_SWITCH'], mux_tunnel_name, peer_switch_ip = get_peer_switch_info(linkmetas, devices) if bool(results['PEER_SWITCH']): @@ -1472,7 +1447,20 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw print("Warning: more than one peer switch was found. Only the first will be parsed: {}".format(results['PEER_SWITCH'].keys()[0])) results['DEVICE_METADATA']['localhost']['peer_switch'] = list(results['PEER_SWITCH'].keys())[0] + + # Enable tunnel_qos_remap if downstream_redundancy_types(T1) or redundancy_type(T0) = Gemini/Libra + enable_tunnel_qos_map = False + if results['DEVICE_METADATA']['localhost']['type'].lower() == 'leafrouter' and ('gemini' in str(downstream_redundancy_types).lower() or 'libra' in str(downstream_redundancy_types).lower()): + enable_tunnel_qos_map = True + elif results['DEVICE_METADATA']['localhost']['type'].lower() == 'torrouter' and ('gemini' in str(redundancy_type).lower() or 'libra' in str(redundancy_type).lower()): + enable_tunnel_qos_map = True + + if enable_tunnel_qos_map: + system_defaults['tunnel_qos_remap'] = {"status": "enabled"} + if len(system_defaults) > 0: + results['SYSTEM_DEFAULTS'] = system_defaults + # for this hostname, if sub_role is defined, add sub_role in # device_metadata if sub_role is not None: @@ -1874,14 +1862,28 @@ def get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, tu break tunnels = {} + + default_qos_map_for_mux_tunnel = { + "decap_dscp_to_tc_map": "AZURE_TUNNEL", + "decap_tc_to_pg_map": "AZURE_TUNNEL", + "encap_tc_to_dscp_map": "AZURE_TUNNEL", + "encap_tc_to_queue_map": "AZURE_TUNNEL" + } + for type, tunnel_dict in tunnel_intfs.items(): for tunnel_key, tunnel_attr in tunnel_dict.items(): tunnel_attr['dst_ip'] = lo_addr if (tunnel_qos_remap.get('status') == 'enabled') and (mux_tunnel_name == tunnel_key) and (peer_switch_ip is not None): tunnel_attr['src_ip'] = peer_switch_ip + # The DSCP mode must be pipe if remap is enabled + tunnel_attr['dscp_mode'] = "pipe" if tunnel_key in tunnel_intfs_qos_remap_config[type]: tunnel_attr.update(tunnel_intfs_qos_remap_config[type][tunnel_key].items()) + # Use default value if qos remap attribute is missing + for k, v in default_qos_map_for_mux_tunnel.items(): + if k not in tunnel_attr: + tunnel_attr[k] = v tunnels[tunnel_key] = tunnel_attr diff --git a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml index 6ffea8427ddb..521b5c5ae074 100644 --- a/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7050cx3-dualtor-minigraph.xml @@ -2334,19 +2334,16 @@ 10.20.6.16 + + RedundancyType + + Gemini + - - - - TunnelQosRemapEnabled - True - - - diff --git a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml index e1a7d3580594..37e1a872887e 100644 --- a/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7260-dualtor-minigraph.xml @@ -4600,19 +4600,16 @@ 10.20.6.16 + + RedundancyType + + Gemini + - - - - TunnelQosRemapEnabled - True - - - diff --git a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml index f4f4a349e97e..47dcdafcd404 100644 --- a/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-arista-7260-t1-minigraph.xml @@ -2481,19 +2481,16 @@ 10.20.6.16 + + DownstreamRedundancyTypes + + Gemini + - - - - TunnelQosRemapEnabled - True - - - str-7260cx3-acs-7 Arista-7260CX3-C64 diff --git a/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml index e7f581178b29..bdb8acc63119 100644 --- a/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml +++ b/src/sonic-config-engine/tests/sample-mellanox-4600c-t1-minigraph.xml @@ -2450,19 +2450,16 @@ 10.0.0.7 + + DownstreamRedundancyTypes + + Gemini + - - - - TunnelQosRemapEnabled - True - - - r-tigon-11 Mellanox-SN4600C-C64 diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml index 7d0be06e4e82..91c0aa46c10e 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-disabled.xml @@ -474,14 +474,6 @@ - - - - TunnelQosRemapEnabled - False - - - diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled-no-tunnel-attributes.xml b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled-no-tunnel-attributes.xml new file mode 100644 index 000000000000..a88bc4e2adeb --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled-no-tunnel-attributes.xml @@ -0,0 +1,891 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/4 + + + + + + + + + ab1 + fortyGigE0/8 + 192.0.0.1;192.0.0.2 + fc02:2000::1;fc02:2000::2 + 1000 + 1000 + 192.168.0.0/27 + 00:aa:bb:cc:dd:ee + + + ab2 + fortyGigE0/4 + 192.0.0.1 + fc02:2000::3;fc02:2000::4 + 2000 + 2000 + + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + ab1 + 192.168.0.1/27 + + + + + + PortChannel01 + DataAcl + DataPlane + + + SNMP + SNMP_ACL + SNMP + + + ERSPAN_DSCP + Everflow_dscp + Everflow_dscp + + + + + + + + + + DeviceSerialLink + 9600 + switch-t0 + console + true + switch-t1 + 1 + + + DeviceSerialLink + 9600 + switch-t0 + 1 + true + managed_device + console + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/0 + switch-01t1 + port1 + + + DeviceInterfaceLink + 10000 + switch-t0 + fortyGigE0/12 + switch-02t1 + port1 + + + DeviceInterfaceLink + 25000 + switch-t0 + fortyGigE0/4 + server1 + port1 + + + DeviceInterfaceLink + 40000 + switch-t0 + fortyGigE0/8 + server2 + port1 + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/4 + true + mux-cable + L + true + + + LogicalLink + 10000 + false + switch-t0 + fortyGigE0/8 + true + mux-cable + U + true + + + LogicalLink + 0 + false + switch-t0 + MuxTunnel0 + false + switch2-t0 + MuxTunnel0 + true + + + + + ToRRouter +
+ 26.1.1.10/32 +
+ switch-t0 + Force10-S6000 + AAA00PrdStr00 +
+ +
+ 25.1.1.10/32 +
+ + 10.7.0.196/26 + + switch2-t0 + Force10-S6000 +
+ + switch-01t1 +
+ 10.1.0.186/32 +
+ 2 + + + 10.7.0.196/26 + + Force10-S6000 +
+ + Server +
+ 10.10.10.1/32 +
+ + fe80::0001/80 + + + 10.0.0.1/32 + + server1 + server-sku +
+ + Server +
+ 10.10.10.2/32 +
+ + fe80::0002/128 + + + 10.0.0.2/32 + + server2 + server-sku +
+
+
+ + + + + + + GeminiPeeringLink + + True + + + UpperTOR + + switch-t0 + + + LowerTOR + + switch2-t0 + + + switch2-t0:MuxTunnel0;switch-t0:MuxTunnel0 + + + + + + AutoNegotiation + + True + + + switch-01t1:port1;switch-t0:fortyGigE0/0 + + + + + + AutoNegotiation + + True + + + switch-02t1:port1;switch-t0:fortyGigE0/12 + + + + + + AutoNegotiation + + True + + + server1:port1;switch-t0:fortyGigE0/4 + + + + + + AutoNegotiation + + True + + + server2:port1;switch-t0:fortyGigE0/8 + + + + + + + switch-t0 + + + DeploymentId + + 1 + + + ErspanDestinationIpv4 + + 10.0.100.1 + + + NtpResources + + 10.0.10.1;10.0.10.2 + + + + SnmpResources + + 10.0.10.3;10.0.10.4 + + + + SyslogResources + + 10.0.10.5;10.0.10.6 + + + + TacacsServer + + 10.0.10.7;10.0.10.8 + + + KubernetesEnabled + + 0 + + + KubernetesServerIp + + 10.10.10.10 + + + ResourceType + + Storage + + + RedundancyType + + Gemini + + + + + + + + + + + DeviceInterface + + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 100000 + Interface description + + + DeviceInterface + + true + 1 + fortyGigE0/16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + 1 + fortyGigE0/124 + + false + 0 + 0 + 100000 + + + true + 0 + Force10-S6000 + + + DeviceInterface + + true + 1 + eth0 + false + eth0 + 1000 + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml index d38f77774e9f..406c613a9c9e 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph-case-remap-enabled.xml @@ -469,19 +469,16 @@ Storage + + RedundancyType + + Gemini + - - - - TunnelQosRemapEnabled - True - - - diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index bfee76c7546e..2aa78944163b 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -382,7 +382,7 @@ def test_minigraph_tunnel_table(self): "tunnel_type": "IPINIP", "src_ip": "25.1.1.10", "dst_ip": "10.1.0.32", - "dscp_mode": "uniform", + "dscp_mode": "pipe", "encap_ecn_mode": "standard", "ecn_mode": "copy_from_outer", "ttl_mode": "pipe", @@ -399,6 +399,14 @@ def test_minigraph_tunnel_table(self): expected_tunnel ) + # Validate extra config for mux tunnel is generated automatically when tunnel_qos_remap = enabled + sample_graph_enabled_remap = os.path.join(self.test_dir, 'simple-sample-graph-case-remap-enabled-no-tunnel-attributes.xml') + argument = '-m "' + sample_graph_enabled_remap + '" -p "' + self.port_config + '" -v "TUNNEL"' + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + expected_tunnel + ) def test_minigraph_mux_cable_table(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MUX_CABLE"' From 5afa940a6e790913ee3d82797b1ba8cd92159a75 Mon Sep 17 00:00:00 2001 From: kellyyeh <42761586+kellyyeh@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:43:06 -0700 Subject: [PATCH 591/817] [dhcpmon] Open different socket for dual tor to enable interface filtering (#11201) --- rules/dhcpmon.mk | 1 + src/dhcpmon/Makefile | 5 +- src/dhcpmon/objects.mk | 2 +- .../src/{dhcp_device.c => dhcp_device.cpp} | 150 ++++++++++++++---- src/dhcpmon/src/dhcp_device.h | 1 + .../src/{dhcp_devman.c => dhcp_devman.cpp} | 2 +- src/dhcpmon/src/{dhcp_mon.c => dhcp_mon.cpp} | 0 src/dhcpmon/src/{main.c => main.cpp} | 6 + src/dhcpmon/src/subdir.mk | 14 +- 9 files changed, 143 insertions(+), 38 deletions(-) rename src/dhcpmon/src/{dhcp_device.c => dhcp_device.cpp} (80%) rename src/dhcpmon/src/{dhcp_devman.c => dhcp_devman.cpp} (99%) rename src/dhcpmon/src/{dhcp_mon.c => dhcp_mon.cpp} (100%) rename src/dhcpmon/src/{main.c => main.cpp} (97%) diff --git a/rules/dhcpmon.mk b/rules/dhcpmon.mk index 3f8f5e139bce..8f9d6403a677 100644 --- a/rules/dhcpmon.mk +++ b/rules/dhcpmon.mk @@ -4,6 +4,7 @@ SONIC_DHCPMON_VERSION = 1.0.0-0 SONIC_DHCPMON_PKG_NAME = dhcpmon SONIC_DHCPMON = sonic-$(SONIC_DHCPMON_PKG_NAME)_$(SONIC_DHCPMON_VERSION)_$(CONFIGURED_ARCH).deb +$(SONIC_DHCPMON)_DEPENDS = $(LIBSWSSCOMMON) $(LIBHIREDIS) $(LIBSWSSCOMMON_DEV) $(LIBHIREDIS_DEV) $(SONIC_DHCPMON)_SRC_PATH = $(SRC_PATH)/$(SONIC_DHCPMON_PKG_NAME) SONIC_DPKG_DEBS += $(SONIC_DHCPMON) diff --git a/src/dhcpmon/Makefile b/src/dhcpmon/Makefile index 61cde376730b..4d21f57199f2 100644 --- a/src/dhcpmon/Makefile +++ b/src/dhcpmon/Makefile @@ -2,8 +2,9 @@ RM := rm -rf DHCPMON_TARGET := dhcpmon CP := cp MKDIR := mkdir -CC := gcc +CC := g++ MV := mv +PWD := $(shell pwd) # All of the sources participating in the build are defined here -include src/subdir.mk @@ -23,7 +24,7 @@ all: sonic-dhcpmon # Tool invocations sonic-dhcpmon: $(OBJS) $(USER_OBJS) @echo 'Building target: $@' - @echo 'Invoking: GCC C Linker' + @echo 'Invoking: G++ C Linker' $(CC) -o "$(DHCPMON_TARGET)" $(OBJS) $(USER_OBJS) $(LIBS) @echo 'Finished building target: $@' @echo ' ' diff --git a/src/dhcpmon/objects.mk b/src/dhcpmon/objects.mk index c9b774a53921..dc0d09e5021f 100644 --- a/src/dhcpmon/objects.mk +++ b/src/dhcpmon/objects.mk @@ -1,4 +1,4 @@ USER_OBJS := -LIBS := -levent -lexplain +LIBS := -levent -lexplain -lswsscommon -pthread -lboost_thread -lboost_system -lhiredis diff --git a/src/dhcpmon/src/dhcp_device.c b/src/dhcpmon/src/dhcp_device.cpp similarity index 80% rename from src/dhcpmon/src/dhcp_device.c rename to src/dhcpmon/src/dhcp_device.cpp index f45483f8504c..8ec91b057b64 100644 --- a/src/dhcpmon/src/dhcp_device.c +++ b/src/dhcpmon/src/dhcp_device.cpp @@ -21,6 +21,8 @@ #include #include #include +#include "subscriberstatetable.h" +#include "select.h" #include "dhcp_device.h" @@ -49,34 +51,42 @@ #define OP_JSET (BPF_JMP | BPF_JSET | BPF_K) /** bpf jset */ #define OP_LDXB (BPF_LDX | BPF_B | BPF_MSH) /** bpf ldxb */ +std::shared_ptr mStateDbPtr = std::make_shared ("STATE_DB", 0); +std::shared_ptr mStateDbMuxTablePtr = std::make_shared ( + mStateDbPtr.get(), "HW_MUX_CABLE_TABLE" + ); +swss::DBConnector configDb("CONFIG_DB", 0); + /** Berkeley Packet Filter program for "udp and (port 67 or port 68)". * This program is obtained using the following command tcpdump: - * `tcpdump -dd "udp and (port 67 or port 68)"` + * `tcpdump -dd "inbound and udp and (port 67 or port 68)"` */ static struct sock_filter dhcp_bpf_code[] = { - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x0000000c}, // (000) ldh [12] - {.code = OP_JEQ, .jt = 0, .jf = 7, .k = 0x000086dd}, // (001) jeq #0x86dd jt 2 jf 9 - {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000014}, // (002) ldb [20] - {.code = OP_JEQ, .jt = 0, .jf = 18, .k = 0x00000011}, // (003) jeq #0x11 jt 4 jf 22 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000036}, // (004) ldh [54] - {.code = OP_JEQ, .jt = 15, .jf = 0, .k = 0x00000043}, // (005) jeq #0x43 jt 21 jf 6 - {.code = OP_JEQ, .jt = 14, .jf = 0, .k = 0x00000044}, // (006) jeq #0x44 jt 21 jf 7 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000038}, // (007) ldh [56] - {.code = OP_JEQ, .jt = 12, .jf = 11, .k = 0x00000043}, // (008) jeq #0x43 jt 21 jf 20 - {.code = OP_JEQ, .jt = 0, .jf = 12, .k = 0x00000800}, // (009) jeq #0x800 jt 10 jf 22 - {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000017}, // (010) ldb [23] - {.code = OP_JEQ, .jt = 0, .jf = 10, .k = 0x00000011}, // (011) jeq #0x11 jt 12 jf 22 - {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000014}, // (012) ldh [20] - {.code = OP_JSET, .jt = 8, .jf = 0, .k = 0x00001fff}, // (013) jset #0x1fff jt 22 jf 14 - {.code = OP_LDXB, .jt = 0, .jf = 0, .k = 0x0000000e}, // (014) ldxb 4*([14]&0xf) - {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x0000000e}, // (015) ldh [x + 14] - {.code = OP_JEQ, .jt = 4, .jf = 0, .k = 0x00000043}, // (016) jeq #0x43 jt 21 jf 17 - {.code = OP_JEQ, .jt = 3, .jf = 0, .k = 0x00000044}, // (017) jeq #0x44 jt 21 jf 18 - {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x00000010}, // (018) ldh [x + 16] - {.code = OP_JEQ, .jt = 1, .jf = 0, .k = 0x00000043}, // (019) jeq #0x43 jt 21 jf 20 - {.code = OP_JEQ, .jt = 0, .jf = 1, .k = 0x00000044}, // (020) jeq #0x44 jt 21 jf 22 - {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00040000}, // (021) ret #262144 - {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00000000}, // (022) ret #0 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0xfffff004}, // (000) ldh #fffff004 + {.code = OP_JEQ, .jt = 22, .jf = 0, .k = 0x00000004}, // (001) jeq #0x04 jt 22 jf 0 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x0000000c}, // (002) ldh [12] + {.code = OP_JEQ, .jt = 0, .jf = 7, .k = 0x000086dd}, // (003) jeq #0x86dd jt 2 jf 9 + {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000014}, // (004) ldb [20] + {.code = OP_JEQ, .jt = 0, .jf = 18, .k = 0x00000011}, // (005) jeq #0x11 jt 4 jf 22 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000036}, // (006) ldh [54] + {.code = OP_JEQ, .jt = 15, .jf = 0, .k = 0x00000043}, // (007) jeq #0x43 jt 21 jf 6 + {.code = OP_JEQ, .jt = 14, .jf = 0, .k = 0x00000044}, // (008) jeq #0x44 jt 21 jf 7 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000038}, // (009) ldh [56] + {.code = OP_JEQ, .jt = 12, .jf = 11, .k = 0x00000043}, // (010) jeq #0x43 jt 21 jf 20 + {.code = OP_JEQ, .jt = 0, .jf = 12, .k = 0x00000800}, // (011) jeq #0x800 jt 10 jf 22 + {.code = OP_LDB, .jt = 0, .jf = 0, .k = 0x00000017}, // (012) ldb [23] + {.code = OP_JEQ, .jt = 0, .jf = 10, .k = 0x00000011}, // (013) jeq #0x11 jt 12 jf 22 + {.code = OP_LDHA, .jt = 0, .jf = 0, .k = 0x00000014}, // (014) ldh [20] + {.code = OP_JSET, .jt = 8, .jf = 0, .k = 0x00001fff}, // (015) jset #0x1fff jt 22 jf 14 + {.code = OP_LDXB, .jt = 0, .jf = 0, .k = 0x0000000e}, // (016) ldxb 4*([14]&0xf) + {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x0000000e}, // (017) ldh [x + 14] + {.code = OP_JEQ, .jt = 4, .jf = 0, .k = 0x00000043}, // (018) jeq #0x43 jt 21 jf 17 + {.code = OP_JEQ, .jt = 3, .jf = 0, .k = 0x00000044}, // (019) jeq #0x44 jt 21 jf 18 + {.code = OP_LDHI, .jt = 0, .jf = 0, .k = 0x00000010}, // (020) ldh [x + 16] + {.code = OP_JEQ, .jt = 1, .jf = 0, .k = 0x00000043}, // (021) jeq #0x43 jt 21 jf 20 + {.code = OP_JEQ, .jt = 0, .jf = 1, .k = 0x00000044}, // (022) jeq #0x44 jt 21 jf 22 + {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00040000}, // (023) ret #262144 + {.code = OP_RET, .jt = 0, .jf = 0, .k = 0x00000000}, // (024) ret #0 }; /** Filter program socket struct */ @@ -176,7 +186,7 @@ static void read_callback(int fd, short event, void *arg) uint8_t *dhcphdr = context->buffer + DHCP_START_OFFSET; int dhcp_option_offset = DHCP_START_OFFSET + DHCP_OPTIONS_HEADER_SIZE; - if ((buffer_sz > UDP_START_OFFSET + sizeof(struct udphdr) + DHCP_OPTIONS_HEADER_SIZE) && + if (((unsigned)buffer_sz > UDP_START_OFFSET + sizeof(struct udphdr) + DHCP_OPTIONS_HEADER_SIZE) && (ntohs(udp->len) > DHCP_OPTIONS_HEADER_SIZE)) { int dhcp_sz = ntohs(udp->len) < buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr) ? ntohs(udp->len) : buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr); @@ -221,6 +231,87 @@ static void read_callback(int fd, short event, void *arg) } } +/** + * @code read_callback_dual_tor(fd, event, arg); + * + * @brief callback for libevent which is called every time out in order to read queued packet capture when dual tor mode is enabled + * + * @param fd socket to read from + * @param event libevent triggered event + * @param arg user provided argument for callback (interface context) + * + * @return none + */ +static void read_callback_dual_tor(int fd, short event, void *arg) +{ + dhcp_device_context_t *context = (dhcp_device_context_t*) arg; + ssize_t buffer_sz; + struct sockaddr_ll sll; + socklen_t slen = sizeof sll; + + while ((event == EV_READ) && + ((buffer_sz = recvfrom(fd, context->buffer, context->snaplen, MSG_DONTWAIT, (struct sockaddr *)&sll, &slen)) > 0)) + { + std::string member_table = std::string("VLAN_MEMBER|") + context->intf + "|"; + char interfaceName[IF_NAMESIZE]; + char *interface = if_indextoname(sll.sll_ifindex, interfaceName); + std::string state; + std::string intf(interface); + mStateDbMuxTablePtr->hget(intf, "state", state); + if (state != "standby" && configDb.exists(member_table.append(interface))) { + struct ether_header *ethhdr = (struct ether_header*) context->buffer; + struct ip *iphdr = (struct ip*) (context->buffer + IP_START_OFFSET); + struct udphdr *udp = (struct udphdr*) (context->buffer + UDP_START_OFFSET); + uint8_t *dhcphdr = context->buffer + DHCP_START_OFFSET; + int dhcp_option_offset = DHCP_START_OFFSET + DHCP_OPTIONS_HEADER_SIZE; + + if (((unsigned)buffer_sz > UDP_START_OFFSET + sizeof(struct udphdr) + DHCP_OPTIONS_HEADER_SIZE) && + (ntohs(udp->len) > DHCP_OPTIONS_HEADER_SIZE)) + { + int dhcp_sz = ntohs(udp->len) < buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr) ? + ntohs(udp->len) : buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr); + int dhcp_option_sz = dhcp_sz - DHCP_OPTIONS_HEADER_SIZE; + const u_char *dhcp_option = context->buffer + dhcp_option_offset; + dhcp_packet_direction_t dir = (ethhdr->ether_shost[0] == context->mac[0] && + ethhdr->ether_shost[1] == context->mac[1] && + ethhdr->ether_shost[2] == context->mac[2] && + ethhdr->ether_shost[3] == context->mac[3] && + ethhdr->ether_shost[4] == context->mac[4] && + ethhdr->ether_shost[5] == context->mac[5]) ? + DHCP_TX : DHCP_RX; + int offset = 0; + int stop_dhcp_processing = 0; + while ((offset < (dhcp_option_sz + 1)) && dhcp_option[offset] != 255) { + switch (dhcp_option[offset]) + { + case 53: + if (offset < (dhcp_option_sz + 2)) { + handle_dhcp_option_53(context, &dhcp_option[offset], dir, iphdr, dhcphdr); + } + stop_dhcp_processing = 1; // break while loop since we are only interested in Option 53 + break; + default: + break; + } + + if (stop_dhcp_processing == 1) { + break; + } + + if (dhcp_option[offset] == 0) { // DHCP Option Padding + offset++; + } else { + offset += dhcp_option[offset + 1] + 2; + } + } + } else { + syslog(LOG_WARNING, "read_callback(%s): read length (%ld) is too small to capture DHCP options", + context->intf, buffer_sz); + } + } + } +} + /** * @code dhcp_device_is_dhcp_inactive(counters); * @@ -412,7 +503,7 @@ static int init_socket(dhcp_device_context_t *context, const char *intf) struct sockaddr_ll addr; memset(&addr, 0, sizeof(addr)); - addr.sll_ifindex = if_nametoindex(intf); + addr.sll_ifindex = 0; // any interface addr.sll_family = AF_PACKET; addr.sll_protocol = htons(ETH_P_ALL); if (bind(context->sock, (struct sockaddr *) &addr, sizeof(addr))) { @@ -553,6 +644,7 @@ int dhcp_device_start_capture(dhcp_device_context_t *context, in_addr_t giaddr_ip) { int rv = -1; + struct event *ev; do { if (context == NULL) { @@ -579,7 +671,11 @@ int dhcp_device_start_capture(dhcp_device_context_t *context, break; } - struct event *ev = event_new(base, context->sock, EV_READ | EV_PERSIST, read_callback, context); + if (dual_tor_sock) + ev = event_new(base, context->sock, EV_READ | EV_PERSIST, read_callback_dual_tor, context); + else + ev = event_new(base, context->sock, EV_READ | EV_PERSIST, read_callback, context); + if (ev == NULL) { syslog(LOG_ALERT, "event_new: failed to allocate memory for libevent event '%s'\n", strerror(errno)); break; diff --git a/src/dhcpmon/src/dhcp_device.h b/src/dhcpmon/src/dhcp_device.h index aa686f4e2718..a2b2a789fca6 100644 --- a/src/dhcpmon/src/dhcp_device.h +++ b/src/dhcpmon/src/dhcp_device.h @@ -16,6 +16,7 @@ #include #include +extern bool dual_tor_sock; /** * DHCP message types diff --git a/src/dhcpmon/src/dhcp_devman.c b/src/dhcpmon/src/dhcp_devman.cpp similarity index 99% rename from src/dhcpmon/src/dhcp_devman.c rename to src/dhcpmon/src/dhcp_devman.cpp index 65484798dbd6..b215f978a7c4 100644 --- a/src/dhcpmon/src/dhcp_devman.c +++ b/src/dhcpmon/src/dhcp_devman.cpp @@ -110,7 +110,7 @@ void dhcp_devman_shutdown() int dhcp_devman_add_intf(const char *name, char intf_type) { int rv = -1; - struct intf *dev = malloc(sizeof(struct intf)); + struct intf *dev = (struct intf*) malloc(sizeof(struct intf)); if (dev != NULL) { dev->name = name; diff --git a/src/dhcpmon/src/dhcp_mon.c b/src/dhcpmon/src/dhcp_mon.cpp similarity index 100% rename from src/dhcpmon/src/dhcp_mon.c rename to src/dhcpmon/src/dhcp_mon.cpp diff --git a/src/dhcpmon/src/main.c b/src/dhcpmon/src/main.cpp similarity index 97% rename from src/dhcpmon/src/main.c rename to src/dhcpmon/src/main.cpp index 29bc534accf0..aefaea2d01dd 100644 --- a/src/dhcpmon/src/main.c +++ b/src/dhcpmon/src/main.cpp @@ -16,9 +16,12 @@ #include #include #include +#include "subscriberstatetable.h" +#include "select.h" #include "dhcp_mon.h" #include "dhcp_devman.h" +#include "dhcp_device.h" /** dhcpmon_default_snaplen: default snap length of packet being captured */ static const size_t dhcpmon_default_snaplen = 65535; @@ -29,6 +32,8 @@ static const uint32_t dhcpmon_default_health_check_window = 18; * with DHCP relay */ static const uint32_t dhcpmon_default_unhealthy_max_count = 10; +bool dual_tor_sock = false; + /** * @code usage(prog); * @@ -134,6 +139,7 @@ int main(int argc, char **argv) i += 2; break; case 'u': + dual_tor_sock = true; if (dhcp_devman_setup_dual_tor_mode(argv[i + 1]) != 0) { usage(basename(argv[0])); } diff --git a/src/dhcpmon/src/subdir.mk b/src/dhcpmon/src/subdir.mk index 324977aa39f7..dd808aeb7202 100644 --- a/src/dhcpmon/src/subdir.mk +++ b/src/dhcpmon/src/subdir.mk @@ -1,11 +1,11 @@ # Add inputs and outputs from these tool invocations to the build variables -CC := gcc +CC := g++ C_SRCS += \ -../src/dhcp_device.c \ -../src/dhcp_devman.c \ -../src/dhcp_mon.c \ -../src/main.c +../src/dhcp_device.cpp \ +../src/dhcp_devman.cpp \ +../src/dhcp_mon.cpp \ +../src/main.cpp OBJS += \ ./src/dhcp_device.o \ @@ -21,9 +21,9 @@ C_DEPS += \ # Each subdirectory must supply rules for building sources it contributes -src/%.o: ../src/%.c +src/%.o: src/%.cpp @echo 'Building file: $<' @echo 'Invoking: GCC C Compiler' - $(CC) -O3 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" + $(CC) -O3 -g3 -Wall -I$(PWD)/../sonic-swss-common/common -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" @echo 'Finished building: $<' @echo ' ' From 4d48e6063c110ceb4a359f9210806b3220410ece Mon Sep 17 00:00:00 2001 From: jusherma Date: Mon, 25 Jul 2022 22:02:46 -0700 Subject: [PATCH 592/817] [build] don't require passwordless sudo #11417 Why I did it Not all build environments have passwordless sudo enabled for all users How I did it Instead of using sudo to delete fsroot directories, mount them in a small, temporary docker container and delete them from there How to verify it Build in an environment where the build user does not have passwordless sudo enabled and confirm that no sudo password prompts are seen --- Makefile.work | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.work b/Makefile.work index 3db1f03ab98f..107134cf0979 100644 --- a/Makefile.work +++ b/Makefile.work @@ -202,7 +202,8 @@ endif DOCKER_LOCKFILE_SAVE := $(DOCKER_LOCKDIR)/docker_save.lock $(shell mkdir -m 0777 -p $(DOCKER_LOCKDIR)) $(shell [ -f $(DOCKER_LOCKFILE_SAVE) ] || (touch $(DOCKER_LOCKFILE_SAVE) && chmod 0777 $(DOCKER_LOCKFILE_SAVE))) -$(shell sudo rm -rf $(DOCKER_ROOT) && mkdir -p $(DOCKER_ROOT)) +$(docker run --rm -v $(DOCKER_ROOT)\:/mount alpine sh -c 'rm -rf /mount/') +$(mkdir -p $(DOCKER_ROOT)) ifeq ($(DOCKER_BUILDER_MOUNT),) override DOCKER_BUILDER_MOUNT := "$(PWD):/sonic" From a3801054614ea48451da3d33282a3b61c73897f0 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Tue, 26 Jul 2022 16:50:16 -0700 Subject: [PATCH 593/817] Enable ARP Update Script for Packet based chassis. (#11465) What I did: Following changes done for packet based chassis:- 1> Run arp_update on LC's to resolve static route nexthops over backend port-channel interfaces. 2> On Supervisor make sure arp_update exit gracefully --- dockers/docker-orchagent/docker-init.j2 | 9 +++++--- files/build_templates/arp_update_vars.j2 | 4 +++- files/scripts/arp_update | 28 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index d0a3ef9e2d36..4cd6a53a11cd 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -21,7 +21,7 @@ CFGGEN_PARAMS=" \ -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ " VLAN=$(sonic-cfggen $CFGGEN_PARAMS) - +SWITCH_TYPE=${SWITCH_TYPE:-`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['switch_type']"`} chmod +x /usr/bin/wait_for_link.sh # Executed platform specific initialization tasks. @@ -34,9 +34,12 @@ if [ -x /usr/share/sonic/hwsku/hwsku-init ]; then /usr/share/sonic/hwsku/hwsku-init fi -# Start arp_update and NDP proxy daemon when VLAN exists -if [ "$VLAN" != "" ]; then +# Start arp update when VLAN exists or switch type as chassis packet for backend port channel interfaces +if [[ "$VLAN" != "" ]] || [[ "$SWITCH_TYPE" == "chassis-packet" ]]; then cp /usr/share/sonic/templates/arp_update.conf /etc/supervisor/conf.d/ +fi + +if [ "$VLAN" != "" ]; then cp /usr/share/sonic/templates/ndppd.conf /etc/supervisor/conf.d/ fi diff --git a/files/build_templates/arp_update_vars.j2 b/files/build_templates/arp_update_vars.j2 index 3cdfa8102340..91992e781ac0 100644 --- a/files/build_templates/arp_update_vars.j2 +++ b/files/build_templates/arp_update_vars.j2 @@ -1,6 +1,8 @@ { + "switch_type": "{% if DEVICE_METADATA and 'localhost' in DEVICE_METADATA and 'switch_type' in DEVICE_METADATA['localhost'] %}{{ DEVICE_METADATA['localhost']['switch_type'] }}{%endif %}", "interface": "{% for (name, prefix) in INTERFACE|pfx_filter %}{% if prefix|ipv6 %}{{ name }} {% endif %}{% endfor %}", "pc_interface" : "{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %}{% if prefix|ipv6 %}{{ name }} {% endif %}{% endfor %}", "vlan_sub_interface": "{% for (name, prefix) in VLAN_SUB_INTERFACE|pfx_filter %}{% if prefix|ipv6 %}{{ name }} {% endif %}{% endfor %}", - "vlan" : "{% if VLAN %}{{ VLAN.keys() | join(' ') }}{% endif %}" + "vlan" : "{% if VLAN %}{{ VLAN.keys() | join(' ') }}{% endif %}", + "static_route_nexthops": "{% if STATIC_ROUTE %}{% for static_route_prefix, static_route_attr in STATIC_ROUTE.items() %}{%- if static_route_prefix -%}{{ static_route_attr['nexthop'].split(',') | join(' ') | lower + " " }}{%- endif -%}{% endfor %}{% endif %}" } diff --git a/files/scripts/arp_update b/files/scripts/arp_update index e7f083e20d27..2f66fc84b396 100755 --- a/files/scripts/arp_update +++ b/files/scripts/arp_update @@ -12,6 +12,34 @@ ARP_UPDATE_VARS_FILE="/usr/share/sonic/templates/arp_update_vars.j2" while /bin/true; do # find L3 interfaces which are UP, send ipv6 multicast pings ARP_UPDATE_VARS=$(sonic-cfggen -d -t ${ARP_UPDATE_VARS_FILE}) + SWITCH_TYPE=$(echo $ARP_UPDATE_VARS | jq -r '.switch_type') + if [[ "$SWITCH_TYPE" == "chassis-packet" ]]; then + STATIC_ROUTE_NEXTHOPS=$(echo $ARP_UPDATE_VARS | jq -r '.static_route_nexthops') + # on supervisor/rp exit the script gracefully + if [[ -z "$STATIC_ROUTE_NEXTHOPS" ]]; then + logger "arp_update: exiting as no static route in packet based chassis" + exit 0 + fi + for nexthop in $STATIC_ROUTE_NEXTHOPS; do + if [[ $nexthop == *"."* ]]; then + neigh_state=( $(ip -4 neigh show | grep $nexthop | tr -s ' ' | cut -d ' ' -f 3,4) ) + ping_prefix=ping + elif [[ $nexthop == *":"* ]] ; then + neigh_state=( $(ip -6 neigh show | grep $nexthop | tr -s ' ' | cut -d ' ' -f 3,4) ) + ping_prefix=ping6 + fi + + if [[ "${neigh_state[1]}" == "INCOMPLETE" ]] || [[ "${neigh_state[1]}" == "FAILED" ]]; then + pingcmd="timeout 0.2 $ping_prefix -I ${neigh_state[0]} -n -q -i 0 -c 1 -W 1 $nexthop >/dev/null" + eval $pingcmd + logger "arp_update: sttaic route nexthop not resolved, pinging $nexthop on ${neigh_state[0]}" + fi + done + + sleep 300 + continue + fi + # find L3 interfaces which are UP, send ipv6 multicast pings INTERFACE=$(echo $ARP_UPDATE_VARS | jq -r '.interface') PC_INTERFACE=$(echo $ARP_UPDATE_VARS | jq -r '.pc_interface') VLAN_SUB_INTERFACE=$(echo $ARP_UPDATE_VARS | jq -r '.vlan_sub_interface') From 054db007711983291bf4ccf40f9d904a202f6339 Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Tue, 26 Jul 2022 18:27:15 -0700 Subject: [PATCH 594/817] Add bgp_device_global yang model (#11343) --- src/sonic-yang-models/doc/Configuration.md | 15 ++++++++ src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 5 +++ .../tests/bgp_device_global.json | 16 ++++++++ .../tests_config/bgp_device_global.json | 38 +++++++++++++++++++ .../yang-models/sonic-bgp-device-global.yang | 36 ++++++++++++++++++ 6 files changed, 111 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json create mode 100644 src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index e66927b4a8c2..6c01344f63af 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -9,6 +9,7 @@ Table of Contents * [Incremental Configuration](#incremental-configuration) * [Redis and Json Schema](#redis-and-json-schema) * [ACL and Mirroring](#acl-and-mirroring) + * [BGP Device Global](#bgp-device-global) * [BGP Sessions](#bgp-sessions) * [BUFFER_PG](#buffer_pg) * [Buffer pool](#buffer-pool) @@ -335,7 +336,21 @@ and migration plan } } ``` +### BGP Device Global +The **BGP_DEVICE_GLOBAL** table contains device-level BGP global state. +It has a STATE object containing device state like **tsa_enabled** +which is set to true if device is currently isolated using +traffic-shift-away (TSA) route-maps in BGP + +``` +{ +"BGP_DEVICE_GLOBAL": { + "STATE": { + "tsa_enabled": "true" + } +} +``` ### BGP Sessions BGP session configuration is defined in **BGP_NEIGHBOR** table. BGP diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 6a7d78bdf4ef..6e998737636e 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -80,6 +80,7 @@ def run(self): ('yang-models', ['./yang-models/sonic-acl.yang', './yang-models/sonic-auto_techsupport.yang', './yang-models/sonic-bgp-common.yang', + './yang-models/sonic-bgp-device-global.yang', './yang-models/sonic-bgp-global.yang', './yang-models/sonic-bgp-monitor.yang', './yang-models/sonic-bgp-internal-neighbor.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index be8e6fb659c2..332172d925c1 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1305,6 +1305,11 @@ "default|ipv4_unicast|21.0.0.0/8": { } }, + "BGP_DEVICE_GLOBAL": { + "STATE": { + "tsa_enabled": "false" + } + }, "BGP_PEER_RANGE": { "BGPSLBPassive": { "ip_range": [ diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json new file mode 100644 index 000000000000..536736f82db2 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json @@ -0,0 +1,16 @@ +{ + "BGP_DEVICE_GLOBAL_WITH_DEFAULT_VALUES": { + "desc": "Load bgp device global table with fields set to default values" + }, + "BGP_DEVICE_GLOBAL_WITH_TSA_TEST": { + "desc": "Load bgp device global table with tsa_enabled set to true" + }, + "BGP_DEVICE_GLOBAL_WITH_TSB_TEST": { + "desc": "Load bgp device global table with tsa_enabled set to false" + }, + "BGP_DEVICE_GLOBAL_WITH_INVALID_VALUE": { + "desc": "Load bgp device global table with invalid value", + "eStrKey": "InvalidValue", + "eStr": ["tsa_enabled"] + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json new file mode 100644 index 000000000000..f96de59df390 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json @@ -0,0 +1,38 @@ +{ + "BGP_DEVICE_GLOBAL_WITH_DEFAULT_VALUES": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "STATE":{ + "tsa_enabled": "false" + } + } + } + }, + "BGP_DEVICE_GLOBAL_WITH_TSA_TEST": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "STATE":{ + "tsa_enabled": "true" + } + } + } + }, + "BGP_DEVICE_GLOBAL_WITH_TSB_TEST": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "STATE":{ + "tsa_enabled": "false" + } + } + } + }, + "BGP_DEVICE_GLOBAL_WITH_INVALID_VALUE": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "STATE":{ + "tsa_enabled": "FALSE" + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang b/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang new file mode 100644 index 000000000000..728714c7d51f --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang @@ -0,0 +1,36 @@ +module sonic-bgp-device-global { + namespace "http://github.com/Azure/sonic-bgp-device-global"; + prefix bgp_device_global; + yang-version 1.1; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC Device-specific BGP global data"; + + revision 2022-06-26 { + description + "Initial revision"; + } + + container sonic-bgp-device-global { + container BGP_DEVICE_GLOBAL { + container STATE { + description "BGP device-specific global data"; + leaf tsa_enabled { + type boolean; + default "false"; + description + "When set to true, Traffic is shifted away (TSA), i.e, BGP routes are not advertised to neighboring routers"; + } + } /* end of STATE container */ + } /* end of BGP_DEVICE_GLOBAL container */ + + } /* end of top level container */ + +} /* end of module sonic-bgp-device-global */ + From c0866d68a43b08128ea711814d735eb0b04fcfd7 Mon Sep 17 00:00:00 2001 From: Taylor Cai <103631396+cel-taylor@users.noreply.github.com> Date: Wed, 27 Jul 2022 12:14:13 +0800 Subject: [PATCH 595/817] [device/celestica]:Fix failed test case of Seastone snmp (#11430) * Update psu.py * Update thermal.py --- .../celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py | 2 +- .../x86_64-cel_seastone-r0/sonic_platform/thermal.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py index da365dff59ab..7dd647be4e2c 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py @@ -408,7 +408,7 @@ def get_position_in_parent(self): Returns: integer: The 1-based relative physical position in parent device or -1 if cannot determine the position """ - return -1 + return self.index + 1 def is_replaceable(self): """ diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py index c605a28d220c..4b584a6db97f 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py @@ -307,8 +307,6 @@ def get_position_in_parent(self): """ Retrieves the thermal position information Returns: - A int value, 0 represent ASIC thermal, 1 represent CPU thermal info + A int value, index of thermal """ - if self.postion == "cpu": - return 1 - return 0 + return self.index + 1 From af2dea9c7f53801d25537423478b84156f5e2986 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 28 Jul 2022 00:58:04 +0800 Subject: [PATCH 596/817] [ci] Fix some not sai package removed issue (#11544) Only replace the file name starts with "cisco-". --- .azure-pipelines/official-build-cisco-8000.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/official-build-cisco-8000.yml b/.azure-pipelines/official-build-cisco-8000.yml index 474d3e743ff7..7ec7430fc3ad 100644 --- a/.azure-pipelines/official-build-cisco-8000.yml +++ b/.azure-pipelines/official-build-cisco-8000.yml @@ -83,7 +83,7 @@ stages: fi cd $(dirname $filename) echo "PWD=$(pwd)" - ls -l *.deb + ls -l cisco-*.deb while read -r package; do # Cisco version format: -sai--- # The may contain several values in one build, the part is skipped when publishing to storage @@ -93,7 +93,7 @@ stages: package_url="$PACKAGE_URL/sai/ciscosai/master/$version/$package" echo "Override package $package from $package_url" wget "$package_url$StorageSASKey" -O "$package" - done < <(ls *.deb) + done < <(ls cisco-*.deb) env: StorageSASKey: $(StorageSASKey) condition: ne(variables['Build.Reason'], 'PullRequest') From 3b79c839348e300bea6dd13430b5f25c34ebe75d Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Thu, 28 Jul 2022 01:00:07 +0800 Subject: [PATCH 597/817] [telemetry]: Move sonic-telemetry to sonic-net and rename sonic-gnmi. (#11531) --- .gitmodules | 6 +++--- rules/telemetry.mk | 4 ++-- src/sonic-gnmi | 1 + src/sonic-telemetry | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) create mode 160000 src/sonic-gnmi delete mode 160000 src/sonic-telemetry diff --git a/.gitmodules b/.gitmodules index c8bbca863dce..eba302a62912 100644 --- a/.gitmodules +++ b/.gitmodules @@ -71,9 +71,6 @@ [submodule "src/sonic-mgmt-framework"] path = src/sonic-mgmt-framework url = https://github.com/Azure/sonic-mgmt-framework -[submodule "src/sonic-telemetry"] - path = src/sonic-telemetry - url = https://github.com/Azure/sonic-telemetry [submodule "Switch-SDK-drivers"] path = platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers url = https://github.com/Mellanox/Switch-SDK-drivers @@ -112,3 +109,6 @@ [submodule "src/sonic-host-services"] path = src/sonic-host-services url = https://github.com/sonic-net/sonic-host-services +[submodule "src/sonic-gnmi"] + path = src/sonic-gnmi + url = https://github.com/sonic-net/sonic-gnmi.git diff --git a/rules/telemetry.mk b/rules/telemetry.mk index 392ed4f28680..24fe4ae2fe52 100644 --- a/rules/telemetry.mk +++ b/rules/telemetry.mk @@ -1,7 +1,7 @@ # SONiC telemetry package -SONIC_TELEMETRY = sonic-telemetry_0.1_$(CONFIGURED_ARCH).deb -$(SONIC_TELEMETRY)_SRC_PATH = $(SRC_PATH)/sonic-telemetry +SONIC_TELEMETRY = sonic-gnmi_0.1_$(CONFIGURED_ARCH).deb +$(SONIC_TELEMETRY)_SRC_PATH = $(SRC_PATH)/sonic-gnmi $(SONIC_TELEMETRY)_DEPENDS = $(SONIC_MGMT_COMMON) $(SONIC_MGMT_COMMON_CODEGEN) $(SONIC_TELEMETRY)_RDEPENDS = SONIC_DPKG_DEBS += $(SONIC_TELEMETRY) diff --git a/src/sonic-gnmi b/src/sonic-gnmi new file mode 160000 index 000000000000..92428dac99b2 --- /dev/null +++ b/src/sonic-gnmi @@ -0,0 +1 @@ +Subproject commit 92428dac99b2d6d97b4c904cb83933cbc8f7e848 diff --git a/src/sonic-telemetry b/src/sonic-telemetry deleted file mode 160000 index e56e9b44e4a7..000000000000 --- a/src/sonic-telemetry +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e56e9b44e4a7e3b211f070c298041951c543885b From ea546c861c6729e432aa80eed06bb0de1b10657e Mon Sep 17 00:00:00 2001 From: Ravindranath C K Date: Wed, 27 Jul 2022 22:31:50 +0530 Subject: [PATCH 598/817] [innovium]: Enable syncd container autorestart for Innovium platforms (#11497) Why I did it Enable syncd container autorestart for Innovium platforms How I did it Add critical_process file and sypervisord.conf entry How to verify it Tested with autorestart/test_container_autorestart.py::test_containers_autorestart PASSED autorestart/test_container_autorestart.py::test_containers_autorestart[sonic-xxx-dut-sonic-xxx-dut|syncd] Signed-off-by: rck-innovium rck@innovium.com --- platform/innovium/docker-syncd-invm-rpc.mk | 2 +- .../docker-syncd-invm-rpc/Dockerfile.j2 | 3 +++ .../innovium/docker-syncd-invm/Dockerfile.j2 | 5 +++- .../docker-syncd-invm/supervisord.conf | 24 ++++++++++++++++--- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/platform/innovium/docker-syncd-invm-rpc.mk b/platform/innovium/docker-syncd-invm-rpc.mk index fc526fc22f6d..8ccbef57dd4f 100755 --- a/platform/innovium/docker-syncd-invm-rpc.mk +++ b/platform/innovium/docker-syncd-invm-rpc.mk @@ -10,7 +10,7 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_INVM_RPC) endif $(DOCKER_SYNCD_INVM_RPC)_CONTAINER_NAME = syncd -$(DOCKER_SYNCD_INVM_RPC)_VERSION = 1.0.0+rpc +$(DOCKER_SYNCD_INVM_RPC)_VERSION = 1.0.0-rpc $(DOCKER_SYNCD_INVM_RPC)_PACKAGE_NAME = syncd $(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += --privileged -t $(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf diff --git a/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 index 33726548d008..5ad93088c7eb 100755 --- a/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 +++ b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 @@ -46,6 +46,9 @@ RUN wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && pip install cffi==1.7.0 \ && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ + && pip install numpy \ + && pip install scipy \ + && pip install setuptools \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ diff --git a/platform/innovium/docker-syncd-invm/Dockerfile.j2 b/platform/innovium/docker-syncd-invm/Dockerfile.j2 index a3fd750d86da..ef0c3d57e025 100755 --- a/platform/innovium/docker-syncd-invm/Dockerfile.j2 +++ b/platform/innovium/docker-syncd-invm/Dockerfile.j2 @@ -1,7 +1,6 @@ FROM docker-config-engine-stretch-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name - RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf ## Make apt-get non-interactive @@ -25,7 +24,11 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} +COPY ["start.sh", "/usr/bin/"] +COPY ["ivm_start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] +COPY ["critical_processes", "/etc/supervisor/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/platform/innovium/docker-syncd-invm/supervisord.conf b/platform/innovium/docker-syncd-invm/supervisord.conf index c12c31987f1b..ef84810b0cbf 100755 --- a/platform/innovium/docker-syncd-invm/supervisord.conf +++ b/platform/innovium/docker-syncd-invm/supervisord.conf @@ -4,29 +4,47 @@ logfile_backups=2 nodaemon=true [eventlistener:dependent-startup] -command=python2 -m supervisord_dependent_startup +command=python3 -m supervisord_dependent_startup autostart=true autorestart=unexpected startretries=0 exitcodes=0,3 events=PROCESS_STATE +buffer_size=25 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name syncd +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected buffer_size=1024 [program:rsyslogd] command=/usr/sbin/rsyslogd -n -iNONE priority=1 autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false autorestart=false +startsecs=0 stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true +dependent_startup_wait_for=rsyslogd:running [program:syncd] command=/usr/bin/syncd_start.sh -priority=2 +priority=3 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog dependent_startup=true -dependent_startup_wait_for=rsyslogd:running +dependent_startup_wait_for=start:exited From 78e2194dfb82d3e8417b4657a6002155c845056f Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 28 Jul 2022 01:03:21 +0800 Subject: [PATCH 599/817] [sonic-snmpagent] Update sonic-snmpagent submodule (#11467) 151638b Change diff coverage threshold to 80% (#261) a45f623 Replace swsssdk with swsscommon (#263) 3bd4a23 Remove python .whl package dependency to swsssdk (#265) Co-authored-by: liuh-80 --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 1477c368369d..3bd4a23615ae 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 1477c368369db44f9a2f9deac0356bbd5fad6364 +Subproject commit 3bd4a23615ae36a15162b2ed2c7aebf792b8d389 From 7683ff57918b5fcc082409ed7bb3e1c99687c733 Mon Sep 17 00:00:00 2001 From: Jiahua Wang Date: Wed, 27 Jul 2022 10:04:40 -0700 Subject: [PATCH 600/817] [arista]: Add sai_mdio_access_clause22=1 in td3x2-a720dt-48s-flex.config.bcm (#11303) Add sai_mdio_access_clause22=1 in td3x2-a720dt-48s-flex.config.bcm Signed-off-by: Jiahua Wang --- .../x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm | 1 + src/sonic-device-data/tests/permitted_list | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm index a89c3e442753..033a19a9f06d 100644 --- a/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm +++ b/device/arista/x86_64-arista_720dt_48s/td3x2-a720dt-48s-flex.config.bcm @@ -300,3 +300,4 @@ sram_scan_enable.0=0 stable_size=0x5500000 tdma_timeout_usec.0=15000000 tslam_timeout_usec.0=15000000 +sai_mdio_access_clause22=1 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 012e547f62ea..3175e096cd11 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -317,4 +317,5 @@ sai_verify_incoming_chksum phy_an_lt_msft system_ref_core_clock_khz xflow_macsec_secure_chan_to_num_secure_assoc_encrypt -xflow_macsec_secure_chan_to_num_secure_assoc_decrypt \ No newline at end of file +xflow_macsec_secure_chan_to_num_secure_assoc_decrypt +sai_mdio_access_clause22 From 6e7616b504d8999fe5d232c07543d7bb5271782f Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Wed, 27 Jul 2022 11:47:00 -0700 Subject: [PATCH 601/817] [multi-asic]: Add job to run multi-asic VS tests in sonic-buildimage pipeline (#11517) Why I did it Require multi-asic VS tests to be run during PR checks and merges in master branch. How I did it Add job to run multi-asic VS tests in sonic-buildimage pipeline. Currently pipeline will run basic bgp fact test to ensure the testbed comes up, load minigraph works and bgp sessions are up. Use new multi-asic VS agent pool sonictest-ma in official-multi-asic-vs pipeline Make multi-asic VS test optional for now. There are two known issues: Announce route failure during refresh-dut in setup testbed stage. bgp sessions not getting established. How to verify it Tested using test azure pipelines. --- .azure-pipelines/official-build-multi-asic.yml | 2 +- .azure-pipelines/run-test-template.yml | 2 ++ azure-pipelines.yml | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.azure-pipelines/official-build-multi-asic.yml b/.azure-pipelines/official-build-multi-asic.yml index 8fe0be32db10..7ec5ad7b0772 100644 --- a/.azure-pipelines/official-build-multi-asic.yml +++ b/.azure-pipelines/official-build-multi-asic.yml @@ -37,7 +37,7 @@ stages: jobs: - job: - pool: sonictest + pool: sonictest-ma displayName: "kvmtest-multi-asic-t1-lag" timeoutInMinutes: 240 diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index 2a75d1bc32dc..7ea0a982780f 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -51,6 +51,8 @@ steps: rm -rf $(Build.ArtifactStagingDirectory)/* docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }} ${{ parameters.section }}" displayName: "Run tests" + ${{ if eq(parameters.tbtype, 'multi-asic-t1-lag-pr') }}: + continueOnError: true - script: | # save dut state if test fails diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 32b675637bd0..d46cc20ebc7b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -208,3 +208,17 @@ stages: ptf_name: ptf_vms6-1 tbtype: t0-sonic vmtype: vsonic + + - job: + pool: sonictest-ma + displayName: "kvmtest-multi-asic-t1-lag" + timeoutInMinutes: 240 + + steps: + - template: .azure-pipelines/run-test-template.yml + parameters: + dut: vlab-08 + tbname: vms-kvm-four-asic-t1-lag + ptf_name: ptf_vms6-4 + tbtype: multi-asic-t1-lag-pr + image: sonic-4asic-vs.img.gz From 069b3a4669f0651f8ce160370629400476110404 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Thu, 28 Jul 2022 02:18:36 +0300 Subject: [PATCH 602/817] [memory_checker] Do not check memory usage of containers if docker daemon is not running (#11476) Fix in Monit memory_checker plugin. Skip fetching running containers if docker engine is down (can happen in deinit). This PR fixes issue #11472. Signed-off-by: liora liora@nvidia.com Why I did it In the case where Monit runs during deinit flow, memory_checker plugin is fetching the running containers without checking if Docker service is still running. I added this check. How I did it Use systemctl is-active to check if Docker engine is still running. How to verify it Use systemctl to stop docker engine and reload Monit, no errors in log and relevant print appears in log. Which release branch to backport (provide reason below if selected) The fix is required in 202205 and 202012 since the PR that introduced the issue was cherry picked to those branches (#11129). --- files/image_config/monit/memory_checker | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/files/image_config/monit/memory_checker b/files/image_config/monit/memory_checker index dfe270e79524..a93bc30b3fe4 100755 --- a/files/image_config/monit/memory_checker +++ b/files/image_config/monit/memory_checker @@ -96,6 +96,19 @@ def check_memory_usage(container_name, threshold_value): sys.exit(4) +def is_service_active(service_name): + """Test if service is running. + + Args: + service_name: A string contains the service name + + Returns: + True if service is running, False otherwise + """ + status = subprocess.run("systemctl is-active --quiet {}".format(service_name), shell=True, check=False) + return status.returncode == 0 + + def get_running_container_names(): """Retrieves names of running containers by talking to the docker daemon. @@ -128,6 +141,12 @@ def main(): parser.add_argument("threshold_value", type=int, help="threshold value in bytes") args = parser.parse_args() + if not is_service_active("docker"): + syslog.syslog(syslog.LOG_INFO, + "[memory_checker] Exits without checking memory usage of container '{}' since docker daemon is not running!" + .format(args.container_name)) + sys.exit(0) + running_container_names = get_running_container_names() if args.container_name in running_container_names: check_memory_usage(args.container_name, args.threshold_value) From aff1fdecb853139a357e92144122a2ecd8e286d8 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Wed, 27 Jul 2022 18:21:22 -0700 Subject: [PATCH 603/817] [teamd]: Upgrade teamd docker to Bullseye (#11536) Signed-off-by: Saikrishna Arcot --- dockers/docker-teamd/Dockerfile.j2 | 2 +- rules/docker-teamd.mk | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 7bcafb60cff0..be5e6984dda9 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-swss-layer-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index d376daa2100f..9a04bc1f6859 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -7,13 +7,13 @@ DOCKER_TEAMD_DBG = $(DOCKER_TEAMD_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/$(DOCKER_TEAMD_STEM) $(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCTL) $(LIBTEAM_UTILS) -$(DOCKER_TEAMD)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) +$(DOCKER_TEAMD)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_DEPENDS) $(DOCKER_TEAMD)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) $(DOCKER_TEAMD)_DBG_DEPENDS += $(LIBTEAMDCTL_DBG) $(LIBTEAM_UTILS_DBG) -$(DOCKER_TEAMD)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_TEAMD)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BUSTER) +$(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BULLSEYE) $(DOCKER_TEAMD)_VERSION = 1.0.0 $(DOCKER_TEAMD)_PACKAGE_NAME = teamd @@ -36,5 +36,5 @@ $(DOCKER_TEAMD)_RUN_OPT += -v /host/warmboot:/var/warmboot $(DOCKER_TEAMD)_BASE_IMAGE_FILES += teamdctl:/usr/bin/teamdctl $(DOCKER_TEAMD)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -SONIC_BUSTER_DOCKERS += $(DOCKER_TEAMD) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_TEAMD_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_TEAMD) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_TEAMD_DBG) From c9ae87418b2bc0aab28e25a06c2597935fe1d095 Mon Sep 17 00:00:00 2001 From: Ikki Zhu <79439153+qnos@users.noreply.github.com> Date: Thu, 28 Jul 2022 09:39:23 +0800 Subject: [PATCH 604/817] [hlx/sfp] fix hlx platform sfp+ tx disable issue (#11532) Why I did it: To fix hlx platform sfp+ module tx disable issue How I did it: Fix sfp+ tx disable function according SFF-8472 specification Co-authored-by: Eric Zhu --- .../x86_64-cel_e1031-r0/sonic_platform/sfp.py | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py index e04c23dc42de..627fa8a7a1ee 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py @@ -8,7 +8,7 @@ try: import time - from ctypes import create_string_buffer + from ctypes import c_char from sonic_platform_base.sfp_base import SfpBase from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom @@ -121,8 +121,8 @@ SFP_VOLT_WIDTH = 2 SFP_CHANNL_MON_OFFSET = 100 SFP_CHANNL_MON_WIDTH = 6 -SFP_CHANNL_STATUS_OFFSET = 110 -SFP_CHANNL_STATUS_WIDTH = 1 +SFP_STATUS_CONTROL_OFFSET = 110 +SFP_STATUS_CONTROL_WIDTH = 1 SFP_TX_DISABLE_HARD_BIT = 7 SFP_TX_DISABLE_SOFT_BIT = 6 @@ -869,7 +869,7 @@ def get_rx_los(self): elif self.sfp_type == SFP_TYPE: offset = 256 dom_channel_monitor_raw = self._read_eeprom_specific_bytes( - (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + (offset + SFP_STATUS_CONTROL_OFFSET), SFP_STATUS_CONTROL_WIDTH) if dom_channel_monitor_raw is not None: rx_los_data = int(dom_channel_monitor_raw[0], 16) rx_los_list.append(rx_los_data & 0x02 != 0) @@ -901,7 +901,7 @@ def get_tx_fault(self): elif self.sfp_type == SFP_TYPE: offset = 256 dom_channel_monitor_raw = self._read_eeprom_specific_bytes( - (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + (offset + SFP_STATUS_CONTROL_OFFSET), SFP_STATUS_CONTROL_WIDTH) if dom_channel_monitor_raw is not None: tx_fault_data = int(dom_channel_monitor_raw[0], 16) tx_fault_list.append(tx_fault_data & 0x04 != 0) @@ -936,7 +936,7 @@ def get_tx_disable(self): elif self.sfp_type == SFP_TYPE: offset = 256 dom_channel_monitor_raw = self._read_eeprom_specific_bytes( - (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + (offset + SFP_STATUS_CONTROL_OFFSET), SFP_STATUS_CONTROL_WIDTH) if dom_channel_monitor_raw is not None: tx_disable_data = int(dom_channel_monitor_raw[0], 16) tx_disable_list.append(tx_disable_data & 0xC0 != 0) @@ -1170,31 +1170,36 @@ def tx_disable(self, tx_disable): Returns: A boolean, True if tx_disable is set successfully, False if not """ - sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] - status_control_raw = self._read_eeprom_specific_bytes( - SFP_CHANNL_STATUS_OFFSET, SFP_CHANNL_STATUS_WIDTH) - if status_control_raw is not None: - # Set bit 6 for Soft TX Disable Select - # 01000000 = 64 and 10111111 = 191 - tx_disable_bit = 64 if tx_disable else 191 - status_control = int(status_control_raw[0], 16) - tx_disable_ctl = (status_control | tx_disable_bit) if tx_disable else ( - status_control & tx_disable_bit) - try: - sysfsfile_eeprom = open( - sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) - buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) - # Write to eeprom - sysfsfile_eeprom.seek(SFP_CHANNL_STATUS_OFFSET) - sysfsfile_eeprom.write(buffer[0]) - except Exception: - return False - finally: - if sysfsfile_eeprom: - sysfsfile_eeprom.close() - time.sleep(0.01) - return True + if not self.get_presence(): + return False + + if self.dom_tx_disable_supported: + # SFP status/control register at address A2h, byte 110 + offset = 256 + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + status_control_raw = self._read_eeprom_specific_bytes( + (offset + SFP_STATUS_CONTROL_OFFSET), SFP_STATUS_CONTROL_WIDTH) + if status_control_raw is not None: + # Set bit 6 for Soft TX Disable Select + # 01000000 = 64 and 10111111 = 191 + tx_disable_bit = 64 if tx_disable else 191 + status_control = int(status_control_raw[0], 16) + tx_disable_ctl = (status_control | tx_disable_bit) if tx_disable else ( + status_control & tx_disable_bit) + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) + tx_disable_data = c_char(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) + sysfsfile_eeprom.write(tx_disable_data) + except Exception: + return False + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True return False def tx_disable_channel(self, channel, disable): From 746e052104947f21de154121fc945d8931159adc Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Thu, 28 Jul 2022 14:54:25 +0800 Subject: [PATCH 605/817] [ci] Transfer organization from Azure to sonic-net for sonic-mgmt (#11559) Why I did it Transfer organization from Azure to sonic-net for sonic-mgmt --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d46cc20ebc7b..90113e8f793f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -28,8 +28,8 @@ resources: repositories: - repository: sonic-mgmt type: github - name: Azure/sonic-mgmt - endpoint: build + name: sonic-net/sonic-mgmt + endpoint: sonic-net - repository: buildimage type: github name: Azure/sonic-buildimage From 45abf8e803593baee9ccac266974214345098da8 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Thu, 28 Jul 2022 12:01:35 +0300 Subject: [PATCH 606/817] [submodule] Advance sonic-utilities pointer (#11543) feeac84 [counters] Keep counters cache in a single directory (#2232) cd7909e Updated the CLI file for Radius and Linux kernel commands (#2276) cd6898b Update db_migrator to support `PORT_QOS_MAP|global` (#2205) 8f4fc62 Revert "Revert "[scripts/fast-reboot] Shutdown remaining containers through systemd (#2133)" (#2161)" (#2184) 27667cf Fix test for pfcwd_sw_enable in db_migrator_test (#2253) e1866e3 [MultiAsic] sudo reboot command doesn't gracefully stop Asic syncd# on multiasic platform (#2258) 9e3ba82 Change db_migrator major version on master branch from version 2 to 3 (#2272) 65346ce Microsoft mandatory file (#2177) 308e25f portconfig option to configure Tx power and laser frequency of ZR transceiver module (#2197) e49b1e8 [vnet_route_check] Align DB data parse logic with format used by swsscommon API (#2268) Signed-off-by: Stepan Blyschak --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index ea11b22f596f..feeac8471bf0 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit ea11b22f596fb90c2d85cc27c0f73b50039a42ad +Subproject commit feeac8471bf09b4d3e0286c75007e28f7f507127 From 925a393e3d3178f7d16fa644b288076cf9da2480 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Thu, 28 Jul 2022 12:03:22 +0300 Subject: [PATCH 607/817] [swss.sh] clear counters cache folder on swss cold/fast reload (#11244) A change in sonic-utilities makes all cache files be saved into a /tmp/cache. On swss restart this cache has to be removed in case swss starts in cold or fast mode. A related cache restoration in the warmboot finalizer script is also updated to use new location. - Why I did it To fix #9817. Clear the cache directory on swss.sh except for warm start. Also, adopted finalize-warmboot script to take the cache directory. - How I did it A change in sonic-utilities makes all cache files be saved into a /tmp/cache. On swss restart this cache has to be removed in case swss starts in cold or fast mode. A related cache restoration in the warmboot finalizer script is also updated to use new location. - How to verify it Run togather with Azure/sonic-utilities#2232. Verify counters cache is removed on config reload, cold/fast reboots, swss restart. Signed-off-by: Stepan Blyschak --- .../warmboot-finalizer/finalize-warmboot.sh | 12 ++++-------- files/scripts/swss.sh | 1 + 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/files/image_config/warmboot-finalizer/finalize-warmboot.sh b/files/image_config/warmboot-finalizer/finalize-warmboot.sh index 2649e51b0d21..c4bb75b2681e 100755 --- a/files/image_config/warmboot-finalizer/finalize-warmboot.sh +++ b/files/image_config/warmboot-finalizer/finalize-warmboot.sh @@ -108,14 +108,10 @@ function restore_counters_folder() { debug "Restoring counters folder after warmboot..." - modules=("portstat-0" "dropstat" "pfcstat-0" "queuestat-0" "intfstat-0") - for module in ${modules[@]} - do - statfile="/host/counters/$module" - if [[ -d $statfile ]]; then - mv $statfile /tmp/ - fi - done + cache_counters_folder="/host/counters" + if [[ -d $cache_counters_folder ]]; then + mv $cache_counters_folder /tmp/cache + fi } diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index ca1898e7df98..c7912fefefdb 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -178,6 +178,7 @@ start() { $SONIC_DB_CLI RESTAPI_DB FLUSHDB clean_up_tables STATE_DB "'PORT_TABLE*', 'MGMT_PORT_TABLE*', 'VLAN_TABLE*', 'VLAN_MEMBER_TABLE*', 'LAG_TABLE*', 'LAG_MEMBER_TABLE*', 'INTERFACE_TABLE*', 'MIRROR_SESSION*', 'VRF_TABLE*', 'FDB_TABLE*', 'FG_ROUTE_TABLE*', 'BUFFER_POOL*', 'BUFFER_PROFILE*', 'MUX_CABLE_TABLE*', 'ADVERTISE_NETWORK_TABLE*', 'VXLAN_TUNNEL_TABLE*', 'MACSEC_PORT_TABLE*', 'MACSEC_INGRESS_SA_TABLE*', 'MACSEC_EGRESS_SA_TABLE*', 'MACSEC_INGRESS_SC_TABLE*', 'MACSEC_EGRESS_SC_TABLE*', 'VRF_OBJECT_TABLE*'" $SONIC_DB_CLI APPL_STATE_DB FLUSHDB + rm -rf /tmp/cache fi # On supervisor card, skip starting asic related services here. In wait(), From 626919e250471d06f0b052673e65c80aea0eb52b Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 28 Jul 2022 09:08:53 -0700 Subject: [PATCH 608/817] Update WARM START FINALIZER to wait for linkmgrd to reconcile (#11477) Spanning from sonic-net/sonic-linkmgrd#76, this PR is to update warm restart finalizer to wait for linkmgrd to be reconciled. sign-off: Jing Zhang zhangjing@microsoft.com Why I did it To make sure finalizer save config after linkmgrd's reconciliation. How I did it Add linkmgrd to the reconciliation wait list of warmboot finalizer. How to verify it Verified on lab device, linkmgrd reconciled as expected. --- files/image_config/warmboot-finalizer/finalize-warmboot.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/warmboot-finalizer/finalize-warmboot.sh b/files/image_config/warmboot-finalizer/finalize-warmboot.sh index c4bb75b2681e..412559289026 100755 --- a/files/image_config/warmboot-finalizer/finalize-warmboot.sh +++ b/files/image_config/warmboot-finalizer/finalize-warmboot.sh @@ -10,6 +10,7 @@ declare -A RECONCILE_COMPONENTS=( \ ["swss"]="orchagent neighsyncd" \ ["bgp"]="bgp" \ ["nat"]="natsyncd" \ + ["mux"]="linkmgrd" \ ) for reconcile_file in $(find /etc/sonic/ -iname '*_reconcile' -type f); do From 3802585d0738425c859821db3b8046698ab46e2d Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Thu, 28 Jul 2022 12:23:31 -0400 Subject: [PATCH 609/817] [Nokia][Nokia-IXR7250E-36x400G] Updated BCM config file to disable the cmic dma abort during cold boot (#11378) * [Nokia][Nokia-IXR7250E-36x400G] Updated BCM config file to disable the cmic dma abort during cold boot Signed-off-by: Sakthivadivu Saravanaraj * [Nokia][Nokia-IXR7250E-36x400G] Added cmic_dma_abort_in_cold_boot to src/sonic-device-data/tests/permitted_list Signed-off-by: Sakthivadivu Saravanaraj * [NOKIA][Nokia-IXR7250E-36x100G & Nokia-IXR7250E-36x400G] Modified the header settings used for recycle port Ethernet-Rec Signed-off-by: Sakthivadivu Saravanaraj --- .../0/jr2cp-nokia-18x100g-4x25g-config.bcm | 4 ++-- .../1/jr2cp-nokia-18x100g-4x25g-config.bcm | 4 ++-- .../Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm | 5 +++-- .../Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm | 5 +++-- src/sonic-device-data/tests/permitted_list | 1 + 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm index 0fae0269330b..72c101facb35 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -1496,7 +1496,7 @@ tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP tm_port_header_type_in_232.BCM8885X=INJECTED_2 tm_port_header_type_in_19.BCM8885X=ETH -tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_in_20.BCM8885X=ETH tm_port_header_type_out_0.BCM8885X=CPU tm_port_header_type_out_200.BCM8885X=ETH tm_port_header_type_out_201.BCM8885X=ETH @@ -1504,7 +1504,7 @@ tm_port_header_type_out_202.BCM8885X=ETH tm_port_header_type_out_203.BCM8885X=ETH tm_port_header_type_out_232.BCM8885X=CPU tm_port_header_type_out_19.BCM8885X=ETH -tm_port_header_type_out_20.BCM8885X=RAW +tm_port_header_type_out_20.BCM8885X=ETH tslam_intr_enable.BCM8885X=0 tslam_timeout_usec.BCM8885X=1000000 ucode_port_0.BCM8885X=CPU.0:core_0.0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm index 33af71fd8abf..cc6d41ea3da6 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -1515,7 +1515,7 @@ tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP tm_port_header_type_in_232.BCM8885X=INJECTED_2 tm_port_header_type_in_19.BCM8885X=ETH -tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_in_20.BCM8885X=ETH tm_port_header_type_out_0.BCM8885X=CPU tm_port_header_type_out_200.BCM8885X=ETH tm_port_header_type_out_201.BCM8885X=ETH @@ -1523,7 +1523,7 @@ tm_port_header_type_out_202.BCM8885X=ETH tm_port_header_type_out_203.BCM8885X=ETH tm_port_header_type_out_232.BCM8885X=CPU tm_port_header_type_out_19.BCM8885X=ETH -tm_port_header_type_out_20.BCM8885X=RAW +tm_port_header_type_out_20.BCM8885X=ETH tslam_intr_enable.BCM8885X=0 tslam_timeout_usec.BCM8885X=1000000 ucode_port_0.BCM8885X=CPU.0:core_0.0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index 264cfb30a310..5303bb263ba2 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -1515,7 +1515,7 @@ tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP tm_port_header_type_in_232.BCM8885X=INJECTED_2 tm_port_header_type_in_19.BCM8885X=ETH -tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_in_20.BCM8885X=ETH tm_port_header_type_out_0.BCM8885X=CPU tm_port_header_type_out_200.BCM8885X=ETH tm_port_header_type_out_201.BCM8885X=ETH @@ -1523,7 +1523,7 @@ tm_port_header_type_out_202.BCM8885X=ETH tm_port_header_type_out_203.BCM8885X=ETH tm_port_header_type_out_232.BCM8885X=CPU tm_port_header_type_out_19.BCM8885X=ETH -tm_port_header_type_out_20.BCM8885X=RAW +tm_port_header_type_out_20.BCM8885X=ETH tslam_intr_enable.BCM8885X=0 tslam_timeout_usec.BCM8885X=1000000 ucode_port_0.BCM8885X=CPU.0:core_0.0 @@ -2055,3 +2055,4 @@ modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 +cmic_dma_abort_in_cold_boot=0 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index 733ab75004e4..eb58c1ca42e1 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -1515,7 +1515,7 @@ tm_port_header_type_in_202.BCM8885X=INJECTED_2_PP tm_port_header_type_in_203.BCM8885X=INJECTED_2_PP tm_port_header_type_in_232.BCM8885X=INJECTED_2 tm_port_header_type_in_19.BCM8885X=ETH -tm_port_header_type_in_20.BCM8885X=INJECTED_2 +tm_port_header_type_in_20.BCM8885X=ETH tm_port_header_type_out_0.BCM8885X=CPU tm_port_header_type_out_200.BCM8885X=ETH tm_port_header_type_out_201.BCM8885X=ETH @@ -1523,7 +1523,7 @@ tm_port_header_type_out_202.BCM8885X=ETH tm_port_header_type_out_203.BCM8885X=ETH tm_port_header_type_out_232.BCM8885X=CPU tm_port_header_type_out_19.BCM8885X=ETH -tm_port_header_type_out_20.BCM8885X=RAW +tm_port_header_type_out_20.BCM8885X=ETH tslam_intr_enable.BCM8885X=0 tslam_timeout_usec.BCM8885X=1000000 ucode_port_0.BCM8885X=CPU.0:core_0.0 @@ -2057,3 +2057,4 @@ modreg IPS_FORCE_LOCAL_OR_FABRIC FORCE_FABRIC=1 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 +cmic_dma_abort_in_cold_boot=0 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 3175e096cd11..41932882a32a 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -319,3 +319,4 @@ system_ref_core_clock_khz xflow_macsec_secure_chan_to_num_secure_assoc_encrypt xflow_macsec_secure_chan_to_num_secure_assoc_decrypt sai_mdio_access_clause22 +cmic_dma_abort_in_cold_boot From 8cc703f2767157c533b308450b62d77994ade25a Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Fri, 29 Jul 2022 01:23:39 +0800 Subject: [PATCH 610/817] [submodule]: update sairedis (#11545) Upgrade submodule sairedis to take the fix for saithrift build Upgrade SAI to latest for building in bullseye (#1093) involve other changes in sairedis: [sairedis] Fix reopen recoding file (#1087) Update PN with XPN support (#1081) [syncd] Remove error message when tryTranslateVidToRid fails (#1048) Signed-off-by: richardyu-ms --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index bc7ccc2d5c2d..cac90d762007 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit bc7ccc2d5c2ddad53ebd696f81ff3d45aacbf438 +Subproject commit cac90d7620072cb8bf6ac2abc360e107c3629fda From ae0d8a27405ed625243f622dc6fbb22daf03518f Mon Sep 17 00:00:00 2001 From: zitingguo-ms Date: Fri, 29 Jul 2022 01:30:03 +0800 Subject: [PATCH 611/817] [bcm sai] upgrade Broadcom XGS SAI to 7.1.0.0-8 (#11568) this upgrade contains two changes: 1. Add the following MacSec Initialization Condition: - When MacSec feature is not included MacSec block should not be brought out of reset irrespective of the value of the newly added config variable. - When included its initialization is controlled by the newly added config variable. 2. DNX buf fix: increase _BRCM_SAI_MAX_ACL_TABLES to 128 Signed-off-by: zitingguo --- platform/broadcom/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ad43e8ddbe5d..fb6c21e585ba 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,4 +1,4 @@ -LIBSAIBCM_XGS_VERSION = 7.1.0.0-6 +LIBSAIBCM_XGS_VERSION = 7.1.0.0-8 LIBSAIBCM_DNX_VERSION = 7.1.0.0-1 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" From 526cd92f5314ae1ec6fa41e6582319478df61b96 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Thu, 28 Jul 2022 23:46:24 -0700 Subject: [PATCH 612/817] Install celery in sonic-mgmt image (#11554) Install celery in sonic-mgmt image --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 06267ccaf6a3..42aaa3525a64 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -76,6 +76,8 @@ RUN pip install cffi==1.10.0 \ retry \ thrift==0.11.0 \ allure-pytest==2.8.22 \ + celery[redis]==4.4.7 \ + msrest==0.6.21 \ && git clone https://github.com/p4lang/scapy-vxlan.git \ && cd scapy-vxlan \ && python setup.py install \ @@ -246,7 +248,9 @@ RUN python3 -m pip install setuptools-rust \ retry \ thrift==0.11.0 \ ptf \ - scapy==2.4.5 + scapy==2.4.5 \ + celery[redis]==4.4.7 \ + msrest==0.6.21 # Deactivating a virtualenv. ENV PATH="$BACKUP_OF_PATH" From 8d37dd7f5ee7f10cc380f39da38fc279dca07b44 Mon Sep 17 00:00:00 2001 From: StormLiangMS <89824293+StormLiangMS@users.noreply.github.com> Date: Fri, 29 Jul 2022 23:33:09 +0800 Subject: [PATCH 613/817] [bgpcfgd] improve the log when delete a loopback interface (#11152) Why I did it The bgpcfgd doesn't support deletion of 'zebra set src', if an interface is deleted, the bgpcfgd will drop a warning message. In current implementation, we only care about the loopback0 interface but not others. To improve the log print to have the key info, which will give the name of the deleted interface. We can ignore it if it is not the loopback0 interface. The application layer should be aware of that update and deletion is not supported, delete or update with a new address of loopback0 could cause issue, this log can give enough info to root cause the issue. How I did it How to verify it --- src/sonic-bgpcfgd/bgpcfgd/managers_setsrc.py | 2 +- src/sonic-bgpcfgd/tests/test_setsrc.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_setsrc.py b/src/sonic-bgpcfgd/bgpcfgd/managers_setsrc.py index d1de585b0520..903760c9375c 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_setsrc.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_setsrc.py @@ -64,4 +64,4 @@ def set_handler(self, key, data): def del_handler(self, key): """ Implementation of 'DEL' command for this class """ self.directory.remove(self.db_name, self.table_name, key) - log_warn("Delete command is not supported for 'zebra set src' templates") \ No newline at end of file + log_warn("Delete key '%s' is not supported for 'zebra set src' templates" % str(key)) \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/test_setsrc.py b/src/sonic-bgpcfgd/tests/test_setsrc.py index 5d1a81908837..4de72102b613 100644 --- a/src/sonic-bgpcfgd/tests/test_setsrc.py +++ b/src/sonic-bgpcfgd/tests/test_setsrc.py @@ -58,5 +58,6 @@ def test_set_handler_invalid_ip(mocked_log_err): @patch('bgpcfgd.managers_setsrc.log_warn') def test_del_handler(mocked_log_warn): m = constructor() - m.del_handler("Loopback0|10.1.0.32/32") - mocked_log_warn.assert_called_with("Delete command is not supported for 'zebra set src' templates") + del_key = "Loopback0|10.1.0.32/32" + m.del_handler(del_key) + mocked_log_warn.assert_called_with("Delete key '%s' is not supported for 'zebra set src' templates" % del_key) From 8f6b568acf414b16438ffbb9da5d7eb34c528597 Mon Sep 17 00:00:00 2001 From: Nikola Dancejic <26731235+Ndancejic@users.noreply.github.com> Date: Fri, 29 Jul 2022 16:22:20 -0700 Subject: [PATCH 614/817] [swss] Adding bgp container as dependent of swss (#11000) What I did: Added bgp as a dependent of swss Why I did it: bgp container was not restarting on swss crash. When swss crashes, linkmgrd doesn't initate a switchover because it cannot access the default route from orchagent. Bringing down bgp with swss will isolate the ToR, causing linkmgrd to initiate a switchover to the peer ToR avoiding significant packet loss. How I did it: Added bgp to DEPENDENT Signed-off-by: Nikola Dancejic --- files/scripts/swss.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index c7912fefefdb..93a3c3dcf7d8 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -9,7 +9,7 @@ LOCKFILE="/tmp/swss-syncd-lock$DEV" NAMESPACE_PREFIX="asic" ETC_SONIC_PATH="/etc/sonic/" -DEPENDENT="radv" +DEPENDENT="radv bgp" MULTI_INST_DEPENDENT="teamd" . /usr/local/bin/asic_status.sh From d509587d139dcc628fe965b03982b445bfb6cb83 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 30 Jul 2022 10:11:02 +0800 Subject: [PATCH 615/817] [submodule]: Update sonic-wpa-supplicant (#11539) ``` 88d1eaea9 [mka]: Fix rekey of PN based cannot triggered in XPN cipher (#57) ``` Signed-off-by: Ze Gan --- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 3f43852b8ccd..88d1eaea944c 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 3f43852b8ccd5d2a0877c86b82d227893e4566d4 +Subproject commit 88d1eaea944c5ea90d9d7796dc10abc80823ed93 From cdd27861177e398bd9ea1139a2bc85656364fef4 Mon Sep 17 00:00:00 2001 From: tjchadaga <85581939+tjchadaga@users.noreply.github.com> Date: Sat, 30 Jul 2022 22:16:58 -0700 Subject: [PATCH 616/817] Fix for TSA error logging on multi-asic (#11519) --- dockers/docker-fpm-frr/base_image_files/TS | 34 ++++++++++++++----- dockers/docker-fpm-frr/base_image_files/TSA | 25 +++++--------- dockers/docker-fpm-frr/base_image_files/TSB | 20 ++++------- src/sonic-bgpcfgd/tests/test_device_global.py | 8 ++++- 4 files changed, 48 insertions(+), 39 deletions(-) diff --git a/dockers/docker-fpm-frr/base_image_files/TS b/dockers/docker-fpm-frr/base_image_files/TS index 799bf9ded700..e0e7ce0ebabf 100755 --- a/dockers/docker-fpm-frr/base_image_files/TS +++ b/dockers/docker-fpm-frr/base_image_files/TS @@ -5,12 +5,16 @@ PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} -if [[ $1 == "TSA" ]]; then +if [[ $1 == "TSA" ]]; then TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "true"}}}' log_msg='System Mode: Normal -> Maintenance' + err_msg='System is already in Maintenance' + desired_tsa_state=true elif [[ $1 == "TSB" ]]; then TSA_STATE_UPDATE='{"BGP_DEVICE_GLOBAL":{"STATE":{"tsa_enabled": "false"}}}' log_msg='System Mode: Maintenance -> Normal' + err_msg='System is already in Normal mode' + desired_tsa_state=false fi # Parse the device specific asic conf file, if it exists @@ -28,10 +32,16 @@ if [[ ($NUM_ASIC -gt 1) ]]; then if [ $sub_role == 'FrontEnd' ] then echo -e "BGP"$asic" : \c" - if [[ -n "$TSA_STATE_UPDATE" ]]; then - sonic-cfggen -a "$TSA_STATE_UPDATE" -w -n $NAMESPACE_PREFIX$asic - logger -t $1 -p user.info "BGP$asic: $log_msg" - echo "$log_msg" + if [[ -n "$TSA_STATE_UPDATE" ]]; then + current_tsa_state="$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled -n $NAMESPACE_PREFIX$asic)" + if [[ $current_tsa_state == $desired_tsa_state ]]; then + echo "$err_msg" + logger -t $1 -p user.info "$err_msg" + else + sonic-cfggen -a "$TSA_STATE_UPDATE" -w -n $NAMESPACE_PREFIX$asic + logger -t $1 -p user.info "$log_msg" + echo "$log_msg" + fi else # If TSC is executed, invoke FRR script to check installed route-maps docker exec -i bgp$asic /usr/bin/$1 @@ -40,10 +50,16 @@ if [[ ($NUM_ASIC -gt 1) ]]; then asic=$[$asic+1] done else - if [[ -n "$TSA_STATE_UPDATE" ]]; then - sonic-cfggen -a "$TSA_STATE_UPDATE" -w - logger -t $1 -p user.info "$log_msg" - echo "$log_msg" + if [[ -n "$TSA_STATE_UPDATE" ]]; then + current_tsa_state="$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled)" + if [[ $current_tsa_state == $desired_tsa_state ]]; then + echo "$err_msg" + logger -t $1 -p user.info "$err_msg" + else + sonic-cfggen -a "$TSA_STATE_UPDATE" -w + logger -t $1 -p user.info "$log_msg" + echo "$log_msg" + fi else # If TSC is executed, invoke FRR script to check installed route-maps docker exec -i bgp /usr/bin/$1 diff --git a/dockers/docker-fpm-frr/base_image_files/TSA b/dockers/docker-fpm-frr/base_image_files/TSA index 8c37525ef0a9..eba79c6ae87b 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSA +++ b/dockers/docker-fpm-frr/base_image_files/TSA @@ -1,20 +1,13 @@ #!/bin/bash - -if [[ "$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled)" == "true" ]]; then - echo "System is already in Maintenance" - logger -t TSA -p user.info "System is already in Maintenance" -else - # toggle the mux to standby if dualtor and any mux active - if - [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]] && - [[ $(show mux status | grep active | wc -l) > 0 ]]; - then - logger -t TSA -p user.info "Toggle all mux mode to standby" - sudo config mux mode standby all - fi - - /usr/bin/TS TSA - echo "Please execute 'config save' to preserve System mode in Maintenance after reboot or config reload" +# toggle the mux to standby if dualtor and any mux active +if +[[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]] && +[[ $(show mux status | grep active | wc -l) > 0 ]]; +then + logger -t TSA -p user.info "Toggle all mux mode to standby" + sudo config mux mode standby all fi +/usr/bin/TS TSA +echo "Please execute 'config save' to preserve System mode in Maintenance after reboot or config reload" diff --git a/dockers/docker-fpm-frr/base_image_files/TSB b/dockers/docker-fpm-frr/base_image_files/TSB index 5f8d90160fcb..1343a6349f9d 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSB +++ b/dockers/docker-fpm-frr/base_image_files/TSB @@ -1,17 +1,11 @@ #!/bin/bash -if [[ "$(sonic-cfggen -d -v BGP_DEVICE_GLOBAL.STATE.tsa_enabled)" == "false" ]]; then - echo "System is already in Normal mode" - logger -t TSB -p user.info "System is already in Normal mode" -else - # toggle the mux to auto if dualtor - if [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]]; - then - logger -t TSB -p user.info "Toggle all mux mode to auto" - sudo config mux mode auto all - fi - - /usr/bin/TS TSB - echo "Please execute 'config save' to preserve System mode in Normal state after reboot or config reload" +# toggle the mux to auto if dualtor +if [[ "$(sonic-cfggen -d -v DEVICE_METADATA.localhost.subtype | tr [:upper:] [:lower:])" == *"dualtor"* ]]; +then + logger -t TSB -p user.info "Toggle all mux mode to auto" + sudo config mux mode auto all fi +/usr/bin/TS TSB +echo "Please execute 'config save' to preserve System mode in Normal state after reboot or config reload" diff --git a/src/sonic-bgpcfgd/tests/test_device_global.py b/src/sonic-bgpcfgd/tests/test_device_global.py index eae1ff424e1f..ad79158aaa06 100644 --- a/src/sonic-bgpcfgd/tests/test_device_global.py +++ b/src/sonic-bgpcfgd/tests/test_device_global.py @@ -7,9 +7,15 @@ from .util import load_constants import bgpcfgd.managers_device_global from swsscommon import swsscommon +from copy import deepcopy TEMPLATE_PATH = os.path.abspath('../../dockers/docker-fpm-frr/frr') BASE_PATH = os.path.abspath('../sonic-bgpcfgd/tests/data/general/peer-group.conf/') +global_constants = { + "bgp": { + "traffic_shift_community" :"12345:12345" + } +} def constructor(): cfg_mgr = MagicMock() @@ -32,7 +38,7 @@ def get_config(): cfg_mgr.push = push cfg_mgr.get_config = get_config - constants = load_constants()['constants'] + constants = deepcopy(global_constants) common_objs = { 'directory': Directory(), 'cfg_mgr': cfg_mgr, From de4755be9aa39153878299832fc0a147e5559c5b Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Mon, 1 Aug 2022 09:27:36 +0800 Subject: [PATCH 617/817] Support queue 7 in dual ToR scenario (#11571) Signed-off-by: Stephen Sun --- .../buffers_defaults_objects.j2 | 12 +++ .../py3/buffers-mellanox4600c-t1-dynamic.json | 88 +++++++++---------- .../py3/buffers-mellanox4600c-t1.json | 88 +++++++++---------- 3 files changed, 100 insertions(+), 88 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 index e960447574c5..f0b0e3993bd4 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 @@ -143,7 +143,11 @@ {% endfor %} {% for port in port_names_active.split(',') %} {% if port not in port_names_extra_queues.split(',') %} +{% if port_names_extra_queues|length > 0 %} + "{{ port }}|5-7": { +{% else %} "{{ port }}|5-6": { +{% endif %} "profile" : "q_lossy_profile" }{% if not loop.last %},{% endif %} @@ -187,7 +191,11 @@ }, {% endfor %} {% for port in port_names_inactive.split(',') %} +{% if port_names_extra_queues|length > 0 %} + "{{ port }}|5-7": { +{% else %} "{{ port }}|5-6": { +{% endif %} "profile" : "q_lossy_profile" }{% if not loop.last %},{% endif %} @@ -204,7 +212,11 @@ }, {% endfor %} {% for port in port_names_inactive.split(',') %} +{% if port_names_extra_queues|length > 0 %} + "{{ port }}|5-7": { +{% else %} "{{ port }}|5-6": { +{% endif %} "profile" : "egress_lossy_zero_profile" }{% if not loop.last %},{% endif %} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json index 57be84be1fb1..d036b2d723bb 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1-dynamic.json @@ -996,28 +996,28 @@ "Ethernet84|0-2": { "profile" : "q_lossy_profile" }, - "Ethernet0|5-6": { + "Ethernet0|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet4|5-6": { + "Ethernet4|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet16|5-6": { + "Ethernet16|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet20|5-6": { + "Ethernet20|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet64|5-6": { + "Ethernet64|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet68|5-6": { + "Ethernet68|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet80|5-6": { + "Ethernet80|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet84|5-6": { + "Ethernet84|5-7": { "profile" : "q_lossy_profile" }, "Ethernet136|0-1": { @@ -1537,112 +1537,112 @@ "Ethernet236|0-2": { "profile" : "q_lossy_profile" }, - "Ethernet8|5-6": { + "Ethernet8|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet12|5-6": { + "Ethernet12|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet24|5-6": { + "Ethernet24|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet28|5-6": { + "Ethernet28|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet32|5-6": { + "Ethernet32|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet36|5-6": { + "Ethernet36|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet40|5-6": { + "Ethernet40|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet44|5-6": { + "Ethernet44|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet48|5-6": { + "Ethernet48|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet52|5-6": { + "Ethernet52|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet56|5-6": { + "Ethernet56|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet60|5-6": { + "Ethernet60|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet72|5-6": { + "Ethernet72|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet76|5-6": { + "Ethernet76|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet88|5-6": { + "Ethernet88|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet92|5-6": { + "Ethernet92|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet96|5-6": { + "Ethernet96|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet100|5-6": { + "Ethernet100|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet104|5-6": { + "Ethernet104|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet108|5-6": { + "Ethernet108|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet112|5-6": { + "Ethernet112|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet116|5-6": { + "Ethernet116|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet120|5-6": { + "Ethernet120|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet124|5-6": { + "Ethernet124|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet128|5-6": { + "Ethernet128|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet132|5-6": { + "Ethernet132|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet140|5-6": { + "Ethernet140|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet160|5-6": { + "Ethernet160|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet164|5-6": { + "Ethernet164|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet172|5-6": { + "Ethernet172|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet192|5-6": { + "Ethernet192|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet196|5-6": { + "Ethernet196|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet204|5-6": { + "Ethernet204|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet224|5-6": { + "Ethernet224|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet228|5-6": { + "Ethernet228|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet236|5-6": { + "Ethernet236|5-7": { "profile" : "q_lossy_profile" } } diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json index a545415612d5..43ec8bd4c6e8 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffers-mellanox4600c-t1.json @@ -772,28 +772,28 @@ "Ethernet84|0-2": { "profile" : "q_lossy_profile" }, - "Ethernet0|5-6": { + "Ethernet0|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet4|5-6": { + "Ethernet4|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet16|5-6": { + "Ethernet16|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet20|5-6": { + "Ethernet20|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet64|5-6": { + "Ethernet64|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet68|5-6": { + "Ethernet68|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet80|5-6": { + "Ethernet80|5-7": { "profile" : "q_lossy_profile" }, - "Ethernet84|5-6": { + "Ethernet84|5-7": { "profile" : "q_lossy_profile" }, "Ethernet136|0-1": { @@ -1313,112 +1313,112 @@ "Ethernet236|0-2": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet8|5-6": { + "Ethernet8|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet12|5-6": { + "Ethernet12|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet24|5-6": { + "Ethernet24|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet28|5-6": { + "Ethernet28|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet32|5-6": { + "Ethernet32|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet36|5-6": { + "Ethernet36|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet40|5-6": { + "Ethernet40|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet44|5-6": { + "Ethernet44|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet48|5-6": { + "Ethernet48|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet52|5-6": { + "Ethernet52|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet56|5-6": { + "Ethernet56|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet60|5-6": { + "Ethernet60|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet72|5-6": { + "Ethernet72|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet76|5-6": { + "Ethernet76|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet88|5-6": { + "Ethernet88|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet92|5-6": { + "Ethernet92|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet96|5-6": { + "Ethernet96|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet100|5-6": { + "Ethernet100|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet104|5-6": { + "Ethernet104|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet108|5-6": { + "Ethernet108|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet112|5-6": { + "Ethernet112|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet116|5-6": { + "Ethernet116|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet120|5-6": { + "Ethernet120|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet124|5-6": { + "Ethernet124|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet128|5-6": { + "Ethernet128|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet132|5-6": { + "Ethernet132|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet140|5-6": { + "Ethernet140|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet160|5-6": { + "Ethernet160|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet164|5-6": { + "Ethernet164|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet172|5-6": { + "Ethernet172|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet192|5-6": { + "Ethernet192|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet196|5-6": { + "Ethernet196|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet204|5-6": { + "Ethernet204|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet224|5-6": { + "Ethernet224|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet228|5-6": { + "Ethernet228|5-7": { "profile" : "egress_lossy_zero_profile" }, - "Ethernet236|5-6": { + "Ethernet236|5-7": { "profile" : "egress_lossy_zero_profile" } } From dc799356aad7a1856219705e93698030fea8bd0a Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Mon, 1 Aug 2022 09:35:34 +0800 Subject: [PATCH 618/817] Support different `DSCP_TO_TC_MAP` for T1 in dualtor deployment (#11569) * Support different DSCP_TO_TC_MAP for T1 in dualtor deployment --- .../Arista-7260CX3-C64/buffers_extra_pgs.j2 | 20 ----- .../Arista-7260CX3-Q64/buffers_extra_pgs.j2 | 1 - .../th2/7260/BALANCED/buffers_defaults_t1.j2 | 4 - .../profiles/th2/7260/BALANCED/qos.json.j2 | 67 +++++++++++++++ .../7260/RDMA-CENTRIC/buffers_defaults_t1.j2 | 5 +- .../th2/7260/RDMA-CENTRIC/qos.json.j2 | 66 +++++++++++++++ files/build_templates/buffers_config.j2 | 4 - .../py3/buffer-arista7260-t1.json | 48 ----------- .../sample_output/py3/qos-arista7260-t1.json | 82 +++++++++++++++++-- 9 files changed, 208 insertions(+), 89 deletions(-) delete mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 delete mode 120000 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 deleted file mode 100644 index 73c1c1a9b30e..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_extra_pgs.j2 +++ /dev/null @@ -1,20 +0,0 @@ -{% if DEVICE_METADATA is defined and 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' %} -{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pg) %} - "BUFFER_PG": { -{% for port in port_names.split(',') %} -{% if port not in port_names_require_no_extra_pg.split(',') %} - "{{ port }}|2": { - "profile" : "ingress_lossy_profile" - }, - "{{ port }}|6": { - "profile" : "ingress_lossy_profile" - }, -{% endif %} - "{{ port }}|0": { - "profile" : "ingress_lossy_profile" - }{% if not loop.last %},{% endif %} - -{% endfor %} - }, -{% endmacro %} -{% endif %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 deleted file mode 120000 index 7dfb03cbc9d0..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_extra_pgs.j2 +++ /dev/null @@ -1 +0,0 @@ -../Arista-7260CX3-C64/buffers_extra_pgs.j2 \ No newline at end of file diff --git a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 index 118dba43177a..08b1395d245e 100644 --- a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 +++ b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 @@ -51,11 +51,7 @@ {%- endmacro %} {% import 'buffers_extra_queues.j2' as defs1 with context %} -{% import 'buffers_extra_pgs.j2' as defs2 with context %} {%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} {{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} {%- endmacro %} -{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} -{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} -{%- endmacro %} diff --git a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 index d760038736a6..68daa8ee92f0 100644 --- a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 +++ b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 @@ -1,4 +1,5 @@ {% if ('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter') %} +{% set different_dscp_to_tc_map = true %} {%- macro generate_dscp_to_tc_map() %} "DSCP_TO_TC_MAP": { "AZURE": { @@ -66,6 +67,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_UPLINK": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, {%- endmacro %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 index 118dba43177a..b2766366b0d7 100644 --- a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -51,11 +51,8 @@ {%- endmacro %} {% import 'buffers_extra_queues.j2' as defs1 with context %} -{% import 'buffers_extra_pgs.j2' as defs2 with context %} {%- macro generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) %} {{ defs1.generate_queue_buffers_with_extra_lossless_queues(port_names, port_names_require_extra_buffer) }} {%- endmacro %} -{%- macro generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) %} -{{ defs2.generate_pg_buffers_with_extra_lossy_pgs(port_names, port_names_require_no_extra_pgs) }} -{%- endmacro %} + diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 index d760038736a6..faf682d3c176 100644 --- a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 @@ -66,6 +66,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_UPLINK": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, {%- endmacro %} diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index 0a72e325824a..21d730c74b2a 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -172,10 +172,6 @@ def {{ defs.generate_pg_profiles_with_extra_lossless_pgs_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }}, {% elif defs.generate_pg_profiles_with_inactive_ports is defined %} {{ defs.generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) }}, -{% elif (defs.generate_pg_buffers_with_extra_lossy_pgs is defined) and (port_names_extra_queues != '') %} -{{ defs.generate_pg_buffers_with_extra_lossy_pgs(port_names_active, port_names_extra_queues) }} -{% elif (defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports is defined) and (port_names_extra_queues != '') %} -{{ defs.generate_pg_buffers_with_extra_lossy_pgs_with_inactive_ports(port_names_active, port_names_extra_queues, port_names_inactive) }} {% elif defs.generate_pg_profils is defined %} {{ defs.generate_pg_profils(port_names_active) }} {% else %} diff --git a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json index 1ce8a99e4fb7..702076249ac6 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/buffer-arista7260-t1.json @@ -112,21 +112,9 @@ "Ethernet0|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet0|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet0|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet4|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet4|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet4|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet144|0": { "profile" : "ingress_lossy_profile" }, @@ -136,21 +124,9 @@ "Ethernet16|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet16|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet16|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet20|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet20|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet20|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet152|0": { "profile" : "ingress_lossy_profile" }, @@ -160,21 +136,9 @@ "Ethernet64|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet64|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet64|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet68|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet68|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet68|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet168|0": { "profile" : "ingress_lossy_profile" }, @@ -184,21 +148,9 @@ "Ethernet80|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet80|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet80|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet84|0": { "profile" : "ingress_lossy_profile" }, - "Ethernet84|2": { - "profile" : "ingress_lossy_profile" - }, - "Ethernet84|6": { - "profile" : "ingress_lossy_profile" - }, "Ethernet180|0": { "profile" : "ingress_lossy_profile" }, diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json index a479523fc1f1..a0e9ad63147e 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-t1.json @@ -89,6 +89,72 @@ "61": "1", "62": "1", "63": "1" + }, + "AZURE_UPLINK": { + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "TC_TO_PRIORITY_GROUP_MAP": { @@ -118,7 +184,7 @@ "dscp_to_tc_map" : "AZURE" }, "Ethernet0": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -126,7 +192,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet4": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -134,7 +200,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet16": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -142,7 +208,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet20": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -150,7 +216,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet64": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -158,7 +224,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet68": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -166,7 +232,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet80": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", @@ -174,7 +240,7 @@ "pfcwd_sw_enable" : "3,4" }, "Ethernet84": { - "dscp_to_tc_map" : "AZURE", + "dscp_to_tc_map" : "AZURE_UPLINK", "tc_to_queue_map" : "AZURE", "tc_to_pg_map" : "AZURE", "pfc_to_queue_map": "AZURE", From 9c64c1ea47b35c547f41233fe6db2a700c1bc3c8 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Mon, 1 Aug 2022 10:03:08 +0800 Subject: [PATCH 619/817] Update submodule sonic-dbsyncd (#11555) #### Why I did it Submodule update for sonic-dbsyncd with following change: ``` 0d67faf 2022-07-28 | Replace pyswsssdk with sonic-py-common (#45) [Hua Liu] 265c833 2022-01-11 | Updated the Azure pipeline for Code Coverage (#44) [abdosi] 6548116 2021-04-04 | [ci]: add proper azp [Guohan Lu] 43b9dab 2021-04-04 | [pytest]: add pytest.ini [Guohan Lu] ``` #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 #### Description for the changelog Submodule update for sonic-dbsyncd with following change: ``` 0d67faf 2022-07-28 | Replace pyswsssdk with sonic-py-common (#45) [Hua Liu] 265c833 2022-01-11 | Updated the Azure pipeline for Code Coverage (#44) [abdosi] 6548116 2021-04-04 | [ci]: add proper azp [Guohan Lu] 43b9dab 2021-04-04 | [pytest]: add pytest.ini [Guohan Lu] ``` #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- src/sonic-dbsyncd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-dbsyncd b/src/sonic-dbsyncd index df46ed418e66..0d67faf36b36 160000 --- a/src/sonic-dbsyncd +++ b/src/sonic-dbsyncd @@ -1 +1 @@ -Subproject commit df46ed418e661a9bccdb2639d8873def356f8ba0 +Subproject commit 0d67faf36b362be4fb38fdd449b98d67ff867c63 From 6f323b3e83207a22124b9de609b5d10243c7bf0e Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 1 Aug 2022 11:31:02 +0800 Subject: [PATCH 620/817] [ci] Support the cross build for armhf/arm64 (#11587) Why I did it [ci] Support the cross build for armhf/arm64 --- .azure-pipelines/azure-pipelines-build.yml | 12 ++++++++++-- .azure-pipelines/official-build.yml | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 73cf108df668..1b7d6225ac56 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -16,6 +16,9 @@ parameters: - name: 'jobGroups' type: object default: '' +- name: 'qemuOrCrossBuild' + type: boolean + default: false jobs: - template: azure-pipelines-image-template.yml @@ -36,6 +39,9 @@ jobs: docker_syncd_rpc_image: no syncd_rpc_image: no platform_rpc: no + ${{ if parameters.qemuOrCrossBuild }}: + SONIC_SLAVE_DOCKER_DRIVER: 'vfs' + CACHE_MODE: 'none' ${{ if ne(parameters.jobGroups, '') }}: jobGroups: ${{ parameters.jobGroups }} ${{ if eq(parameters.jobGroups, '') }}: @@ -67,7 +73,8 @@ jobs: platform_rpc: centec - name: centec-arm64 - pool: sonicbld-arm64 + ${{ if not(parameters.qemuOrCrossBuild) }}: + pool: sonicbld-arm64 timeoutInMinutes: 2880 variables: PLATFORM_ARCH: arm64 @@ -81,7 +88,8 @@ jobs: dbg_image: yes - name: marvell-armhf - pool: sonicbld-armhf + ${{ if not(parameters.qemuOrCrossBuild) }}: + pool: sonicbld-armhf timeoutInMinutes: 2880 variables: PLATFORM_ARCH: armhf diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml index fb986cf67039..21140fecf8b6 100644 --- a/.azure-pipelines/official-build.yml +++ b/.azure-pipelines/official-build.yml @@ -44,3 +44,5 @@ stages: parameters: buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' jobFilters: none + ${{ if contains(variables['Build.DefinitionName'], 'cross') }}: + qemuOrCrossBuild: true From d8f30c7bdeb286af2af4049587aa77d8b06669ac Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Sun, 31 Jul 2022 22:09:44 -0700 Subject: [PATCH 621/817] Yang model support for SRV6 CRM (#9487) #### Why I did it To support Yang models for SRV6 CM #### How I did it Added yang models for SRV6 MY_SID_ENTRY and Nexthop #### How to verify it Added SRV6 CRM yang tests. #### Which release branch to backport (provide reason below if selected) 202111 --- .../tests/yang_model_tests/tests/crm.json | 38 ++++++ .../yang_model_tests/tests_config/crm.json | 110 ++++++++++++++++++ .../yang-models/sonic-crm.yang | 52 +++++++++ 3 files changed, 200 insertions(+) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/crm.json b/src/sonic-yang-models/tests/yang_model_tests/tests/crm.json index cdfc531f212d..b799868194b6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/crm.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/crm.json @@ -115,5 +115,43 @@ }, "MPLS_NH_WITH_CORRECT_USED_VALUE": { "desc": "MPLS_NH_WITH_CORRECT_USED_VALUE no failure." + }, + "SRV6_MY_SID_ENTRY_WITH_WRONG_THRESHOLD_TYPE": { + "desc": "SRV6_MY_SID_ENTRY_WITH_WRONG_THRESHOLD_TYPE pattern failure.", + "eStrKey": "Pattern", + "eStr": ["wrong" ] + }, + "SRV6_MY_SID_ENTRY_WITH_WRONG_PERCENTAGE": { + "desc": "SRV6_MY_SID_ENTRY_WITH_WRONG_PERCENTAGE must condition failure.", + "eStrKey": "Must" + }, + "SRV6_MY_SID_ENTRY_WITH_HIGH_THRESHOLD_ERR": { + "desc": "SRV6_MY_SID_ENTRY_WITH_HIGH_THRESHOLD_ERR must condition failure about high threshold being lower than low threshold.", + "eStr": ["high_threshold should be more than low_threshold"] + }, + "SRV6_MY_SID_ENTRY_WITH_CORRECT_USED_VALUE": { + "desc": "SRV6_MY_SID_ENTRY_WITH_CORRECT_USED_VALUE no failure." + }, + "SRV6_MY_SID_ENTRY_WITH_CORRECT_FREE_VALUE": { + "desc": "SRV6_MY_SID_ENTRY_WITH_CORRECT_FREE_VALUE no failure." + }, + "SRV6_NH_WITH_WRONG_THRESHOLD_TYPE": { + "desc": "SRV6_NH_WITH_WRONG_THRESHOLD_TYPE pattern failure.", + "eStrKey": "Pattern", + "eStr": ["wrong" ] + }, + "SRV6_NH_WITH_WRONG_PERCENTAGE": { + "desc": "SRV6_NH_WITH_WRONG_PERCENTAGE must condition failure.", + "eStrKey": "Must" + }, + "SRV6_NH_WITH_HIGH_THRESHOLD_ERR": { + "desc": "SRV6_NH_WITH_HIGH_THRESHOLD_ERR must condition failure about high threshold being lower than low threshold.", + "eStr": ["high_threshold should be more than low_threshold"] + }, + "SRV6_NH_WITH_CORRECT_USED_VALUE": { + "desc": "SRV6_NH_WITH_CORRECT_USED_VALUE no failure." + }, + "SRV6_NH_WITH_CORRECT_USED_VALUE": { + "desc": "SRV6_NH_WITH_CORRECT_USED_VALUE no failure." } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/crm.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/crm.json index f2878bd7b2a8..5f910b0b6be2 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/crm.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/crm.json @@ -328,5 +328,115 @@ } } } + }, + "SRV6_MY_SID_ENTRY_WITH_CORRECT_FREE_VALUE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_my_sid_entry_high_threshold": 90, + "srv6_my_sid_entry_low_threshold": 70, + "srv6_my_sid_entry_threshold_type": "free" + } + } + } + }, + "SRV6_MY_SID_ENTRY_WITH_CORRECT_USED_VALUE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_my_sid_entry_high_threshold": 85, + "srv6_my_sid_entry_low_threshold": 25, + "srv6_my_sid_entry_threshold_type": "used" + } + } + } + }, + "SRV6_MY_SID_ENTRY_WITH_HIGH_THRESHOLD_ERR": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_my_sid_entry_high_threshold": 80, + "srv6_my_sid_entry_low_threshold": 81, + "srv6_my_sid_entry_threshold_type": "PERCENTAGE" + } + } + } + }, + "SRV6_MY_SID_ENTRY_WITH_WRONG_PERCENTAGE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_my_sid_entry_high_threshold": 110, + "srv6_my_sid_entry_low_threshold": 85, + "srv6_my_sid_entry_threshold_type": "PERCENTAGE" + } + } + } + }, + "SRV6_MY_SID_ENTRY_WITH_WRONG_THRESHOLD_TYPE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_my_sid_entry_high_threshold": 90, + "srv6_my_sid_entry_low_threshold": 70, + "srv6_my_sid_entry_threshold_type": "wrong" + } + } + } + }, + "SRV6_NH_WITH_CORRECT_FREE_VALUE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_nexthop_high_threshold": 90, + "srv6_nexthop_low_threshold": 70, + "srv6_nexthop_threshold_type": "free" + } + } + } + }, + "SRV6_NH_WITH_CORRECT_USED_VALUE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_nexthop_high_threshold": 85, + "srv6_nexthop_low_threshold": 25, + "srv6_nexthop_threshold_type": "used" + } + } + } + }, + "SRV6_NH_WITH_HIGH_THRESHOLD_ERR": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_nexthop_high_threshold": 80, + "srv6_nexthop_low_threshold": 81, + "srv6_nexthop_threshold_type": "PERCENTAGE" + } + } + } + }, + "SRV6_NH_WITH_WRONG_PERCENTAGE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_nexthop_high_threshold": 110, + "srv6_nexthop_low_threshold": 85, + "srv6_nexthop_threshold_type": "PERCENTAGE" + } + } + } + }, + "SRV6_NH_WITH_WRONG_THRESHOLD_TYPE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "srv6_nexthop_high_threshold": 90, + "srv6_nexthop_low_threshold": 70, + "srv6_nexthop_threshold_type": "wrong" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-crm.yang b/src/sonic-yang-models/yang-models/sonic-crm.yang index d1ac84eec391..f554358645f6 100644 --- a/src/sonic-yang-models/yang-models/sonic-crm.yang +++ b/src/sonic-yang-models/yang-models/sonic-crm.yang @@ -404,6 +404,58 @@ module sonic-crm { type threshold; } + leaf srv6_my_sid_entry_threshold_type { + description "CRM threshold support for SRV6 my_sid entries"; + + must "(((current()='PERCENTAGE' or current()='percentage') and + ../srv6_my_sid_entry_high_threshold<100 and + ../srv6_my_sid_entry_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf srv6_my_sid_entry_high_threshold { + description "CRM threshold support for SRV6 my_sid entries"; + + must "(current() > ../srv6_my_sid_entry_low_threshold)" + { + error-message "high_threshold should be more than low_threshold"; + } + type threshold; + } + + leaf srv6_my_sid_entry_low_threshold { + description "CRM threshold support for SRV6 my_sid entries"; + + type threshold; + } + + leaf srv6_nexthop_threshold_type { + description "CRM threshold support for SRV6 next-hops"; + + must "(((current()='PERCENTAGE' or current()='percentage') and + ../srv6_nexthop_high_threshold<100 and + ../srv6_nexthop_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf srv6_nexthop_high_threshold { + description "CRM threshold support for SRV6 next-hops"; + + must "(current() > ../srv6_nexthop_low_threshold)" + { + error-message "high_threshold should be more than low_threshold"; + } + type threshold; + } + + leaf srv6_nexthop_low_threshold { + description "CRM threshold support for SRV6 next-hops"; + + type threshold; + } + } /* end of Config */ } From b29dda2beae366b4632ee5759a4b8dc5c7771f64 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Mon, 1 Aug 2022 23:25:18 +0800 Subject: [PATCH 622/817] Extend t1-lag timeout to 360 (#11478) Signed-off-by: Stephen Sun --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 90113e8f793f..fff6e854c4c1 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -185,7 +185,7 @@ stages: - job: pool: sonictest-t1-lag displayName: "kvmtest-t1-lag" - timeoutInMinutes: 300 + timeoutInMinutes: 360 steps: - template: .azure-pipelines/run-test-template.yml From e3892c6b151137169d0f7f22101c639163a118b9 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 1 Aug 2022 17:38:50 -0700 Subject: [PATCH 623/817] submodule update (#11596) --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 945b10735db7..60b370dee69e 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 945b10735db7ab432c915b69edee89f73d9eac75 +Subproject commit 60b370dee69e937cf15de24985875e089974c89d From 7f7800622423c01daf4cfc7c6b472cb9b00a3823 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 2 Aug 2022 09:52:23 +0800 Subject: [PATCH 624/817] [Bug][Build] Fix the variable patterns not replaced issue (#11572) #### Why I did it The %%EXTRA_CMDLINE_LINUX%% is not replaced to the real value, it has impact on the kernel parameter settings. See the log sonic-vs.img.gz.log in the latest master build. In the grub.cfg, the %%EXTRA_CMDLINE_LINUX%% is set in the linux command line. ``` Installing for i386-pc platform. Installation finished. No error reported. Switch CPU vendor is: GenuineIntel Switch CPU cstates are: disabled EXTRA_CMDLINE_LINUX=%%EXTRA_CMDLINE_LINUX%% Installed SONiC base image SONiC-OS successfully ONIE: NOS install successful: file://dev/vdb/onie-installer.bin ``` --- installer/default_platform.conf | 2 -- installer/install.sh | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/installer/default_platform.conf b/installer/default_platform.conf index af3fa8fc2235..ea13f00c040a 100755 --- a/installer/default_platform.conf +++ b/installer/default_platform.conf @@ -64,7 +64,6 @@ create_partition() # determine ONIE partition type onie_partition_type=$(${onie_bin} onie-sysinfo -t) # demo partition size in MB - demo_part_size="%%ONIE_IMAGE_PART_SIZE%%" if [ "$firmware" = "uefi" ] ; then create_demo_uefi_partition $blk_dev elif [ "$onie_partition_type" = "gpt" ] ; then @@ -471,7 +470,6 @@ EOF fi # Add extra linux command line -extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX $extra_cmdline_linux" diff --git a/installer/install.sh b/installer/install.sh index 8f4a515579b0..8ae0fec0e8a2 100755 --- a/installer/install.sh +++ b/installer/install.sh @@ -236,6 +236,9 @@ if [ "$install_env" = "onie" ]; then fi fi +demo_part_size="%%ONIE_IMAGE_PART_SIZE%%" +echo "ONIE_IMAGE_PART_SIZE=$demo_part_size" + extra_cmdline_linux=%%EXTRA_CMDLINE_LINUX%% echo "EXTRA_CMDLINE_LINUX=$extra_cmdline_linux" From 9ff2e2cff38fa71d0e5ce38f92d4339206849a74 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Tue, 2 Aug 2022 16:24:14 +0800 Subject: [PATCH 625/817] [ci] Update azp reference to support transfering organization from Azure to sonic-net (#11601) Why I did it When transfer repo to another organization, azp reference also need change. Change azp reference to avoid pipeline failure. --- .azure-pipelines/azure-pipelines-UpgrateVersion.yml | 4 ++-- .azure-pipelines/build-commonlib.yml | 4 ++-- .azure-pipelines/docker-sonic-slave-arm64.yml | 4 ++-- .azure-pipelines/docker-sonic-slave-armhf.yml | 4 ++-- .azure-pipelines/docker-sonic-slave.yml | 4 ++-- .azure-pipelines/official-build.yml | 4 ++-- azure-pipelines.yml | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index cc6135b045ef..33f802b0d56c 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -22,9 +22,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net pool: sonicbld diff --git a/.azure-pipelines/build-commonlib.yml b/.azure-pipelines/build-commonlib.yml index df9bcb25ae70..a36adc625d71 100644 --- a/.azure-pipelines/build-commonlib.yml +++ b/.azure-pipelines/build-commonlib.yml @@ -11,9 +11,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net jobs: - template: .azure-pipelines/template-commonlib.yml@buildimage diff --git a/.azure-pipelines/docker-sonic-slave-arm64.yml b/.azure-pipelines/docker-sonic-slave-arm64.yml index 2a9af06c3d01..6350d8fd3b5d 100644 --- a/.azure-pipelines/docker-sonic-slave-arm64.yml +++ b/.azure-pipelines/docker-sonic-slave-arm64.yml @@ -7,9 +7,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net schedules: - cron: "0 8 * * *" diff --git a/.azure-pipelines/docker-sonic-slave-armhf.yml b/.azure-pipelines/docker-sonic-slave-armhf.yml index 69e73479f342..fcdad5f2cd19 100644 --- a/.azure-pipelines/docker-sonic-slave-armhf.yml +++ b/.azure-pipelines/docker-sonic-slave-armhf.yml @@ -7,9 +7,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net schedules: - cron: "0 8 * * *" diff --git a/.azure-pipelines/docker-sonic-slave.yml b/.azure-pipelines/docker-sonic-slave.yml index 3ae3f88f0154..cd8a6df4aff4 100644 --- a/.azure-pipelines/docker-sonic-slave.yml +++ b/.azure-pipelines/docker-sonic-slave.yml @@ -7,9 +7,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net schedules: - cron: "0 8 * * *" diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml index 21140fecf8b6..ee99d7ca3f28 100644 --- a/.azure-pipelines/official-build.yml +++ b/.azure-pipelines/official-build.yml @@ -22,9 +22,9 @@ resources: repositories: - repository: buildimage type: github - name: Azure/sonic-buildimage + name: sonic-net/sonic-buildimage ref: master - endpoint: build + endpoint: sonic-net trigger: none pr: none diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fff6e854c4c1..b9653c2bc8cd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -32,8 +32,8 @@ resources: endpoint: sonic-net - repository: buildimage type: github - name: Azure/sonic-buildimage - endpoint: build + name: sonic-net/sonic-buildimage + endpoint: sonic-net ref: master variables: From ba1e1a92563014b075b611cbd1ae8cb64a924f47 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:48:42 +0800 Subject: [PATCH 626/817] [sonic-swss-common] Update sonic-swss-common submodule (#11524) #### Why I did it Submodule update for sonic-swss-common with following change: ``` 2247dbe 2022-08-01 | Fix memory leak issue in ConfigDBConnector. (#655) [Hua Liu] 4af97d6 2022-07-27 | Add new table schemas for DASH (#654) [prabhataravind] d72e5ea 2022-07-23 | Fix epoll and socket resource leak issue. (#651) [Hua Liu] dda857b 2022-07-21 | Microsoft mandatory file (#620) [microsoft-github-policy-service[bot]] 4132d14 2022-07-21 | Fix PING database command not backward compatible with python version issue. (#650) [Hua Liu] ``` #### How I did it #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 #### Description for the changelog Submodule update for sonic-swss-common with following change: ``` 2247dbe 2022-08-01 | Fix memory leak issue in ConfigDBConnector. (#655) [Hua Liu] 4af97d6 2022-07-27 | Add new table schemas for DASH (#654) [prabhataravind] d72e5ea 2022-07-23 | Fix epoll and socket resource leak issue. (#651) [Hua Liu] dda857b 2022-07-21 | Microsoft mandatory file (#620) [microsoft-github-policy-service[bot]] 4132d14 2022-07-21 | Fix PING database command not backward compatible with python version issue. (#650) [Hua Liu] ``` #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 154cc9c05dd4..2247dbea47f9 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 154cc9c05dd44cdb179f802f78ae4344be50ccce +Subproject commit 2247dbea47f968411b28b5c04d4be89d72d08cbf From 847a29088b5cd221835938c3d896a2860377ffff Mon Sep 17 00:00:00 2001 From: Santhosh Kumar T <53558409+santhosh-kt@users.noreply.github.com> Date: Tue, 2 Aug 2022 22:26:17 +0530 Subject: [PATCH 627/817] [DellEMC] S6100 Platform Service optimization porting in master (#11330) To reduce rc.local script execution time. Porting changes from [DellEMC] S6100 Platform Service optimization #10989 Changes: Moving platform-modules-s6100.service and s6100-lpc-monitor.service asynchronous to rc.local script. --- .../debian/platform-modules-s6100.init | 40 ------------------ .../debian/platform-modules-s6100.postinst | 6 +-- .../sonic-platform-modules-dell/debian/rules | 3 ++ .../s6100/scripts/s6100_platform.sh | 41 +++++++++++-------- .../systemd/platform-modules-s6100.service | 2 +- .../systemd/s6100-platform-startup.service | 2 +- 6 files changed, 30 insertions(+), 64 deletions(-) delete mode 100755 platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.init diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.init b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.init deleted file mode 100755 index c798b24ef235..000000000000 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.init +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -### BEGIN INIT INFO -# Provides: setup-board -# Required-Start: -# Required-Stop: -# Should-Start: -# Should-Stop: -# Default-Start: S -# Default-Stop: 0 6 -# Short-Description: Setup S6100 board. -### END INIT INFO - -case "$1" in -start) - echo -n "Setting up board... " - - /usr/local/bin/iom_power_on.sh - /usr/local/bin/s6100_platform.sh init - - echo "done." - ;; - -stop) - /usr/local/bin/s6100_platform.sh deinit - echo "done." - - ;; - -force-reload|restart) - echo "Not supported" - ;; - -*) - echo "Usage: /etc/init.d/platform-modules-s6100.init {start|stop}" - exit 1 - ;; -esac - -exit 0 diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.postinst b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.postinst index eda8f7c8a41a..78c78fa0037f 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.postinst +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.postinst @@ -1,11 +1,7 @@ # postinst script for S6100 # Enable Dell-S6100-platform-service -depmod -a systemctl enable platform-modules-s6100.service -systemctl start platform-modules-s6100.service - -systemctl enable s6100-lpc-monitor.service -systemctl start s6100-lpc-monitor.service +systemctl start --no-block platform-modules-s6100.service #DEBHELPER# diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/rules b/platform/broadcom/sonic-platform-modules-dell/debian/rules index 9904cce52b6b..421057fdac33 100755 --- a/platform/broadcom/sonic-platform-modules-dell/debian/rules +++ b/platform/broadcom/sonic-platform-modules-dell/debian/rules @@ -95,6 +95,9 @@ override_dh_auto_install: override_dh_usrlocal: +override_dh_installmodules: + dh_installmodules --no-scripts; + override_dh_clean: dh_clean set -e; \ diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh index 15763bbc9e36..34973002dc38 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh @@ -3,6 +3,30 @@ #platform init script for Dell S6100 if [[ "$1" == "init" ]]; then + depmod -a + case "$(cat /proc/cmdline)" in + *SONIC_BOOT_TYPE=warm*) + TYPE='warm' + ;; + *SONIC_BOOT_TYPE=fastfast*) + TYPE='fastfast' + ;; + *SONIC_BOOT_TYPE=fast*|*fast-reboot*) + TYPE='fast' + ;; + *SONIC_BOOT_TYPE=soft*) + TYPE='soft' + ;; + *) + TYPE='cold' + esac + + if [[ "$TYPE" == "cold" ]]; then + /usr/local/bin/iom_power_on.sh + fi + + systemctl enable s6100-lpc-monitor.service + systemctl start --no-block s6100-lpc-monitor.service pericom="/sys/bus/pci/devices/0000:08:00.0" modprobe i2c-dev @@ -24,23 +48,6 @@ if [[ "$1" == "init" ]]; then systemctl start --no-block s6100-ssd-upgrade-status.service - case "$(cat /proc/cmdline)" in - *SONIC_BOOT_TYPE=warm*) - TYPE='warm' - ;; - *SONIC_BOOT_TYPE=fastfast*) - TYPE='fastfast' - ;; - *SONIC_BOOT_TYPE=fast*|*fast-reboot*) - TYPE='fast' - ;; - *SONIC_BOOT_TYPE=soft*) - TYPE='soft' - ;; - *) - TYPE='cold' - esac - if [[ "$TYPE" == "cold" ]]; then systemctl start s6100-platform-startup.service else diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/platform-modules-s6100.service b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/platform-modules-s6100.service index 4883ecf268fd..127426f09873 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/platform-modules-s6100.service +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/platform-modules-s6100.service @@ -1,6 +1,6 @@ [Unit] Description=Dell S6100 Platform modules -Before=pmon.service determine-reboot-cause.service +Before=pmon.service determine-reboot-cause.service pcie-check.service system-health.service watchdog-control.service DefaultDependencies=no [Service] diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service index d7a40f43033c..ecba7b006361 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/systemd/s6100-platform-startup.service @@ -1,6 +1,6 @@ [Unit] Description=Dell S6100 Platform Startup Service -Before=pmon.service determine-reboot-cause.service +Before=pmon.service determine-reboot-cause.service pcie-check.service system-health.service watchdog-control.service DefaultDependencies=no [Service] From 5ff323c707c6d6cb062877b2ff77e96f2fb452ac Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 3 Aug 2022 07:42:55 +0800 Subject: [PATCH 628/817] Replace swsssdk with swsscommon in bgpmon.py (#11387) #### Why I did it Update bgpmon.py from py-swsssdk to swsscommon #### How I did it Change bgpmon.py to use swsscommon. #### How to verify it Pass all E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Update bgpmon.py from py-swsssdk to swsscommon #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- src/sonic-bgpcfgd/bgpmon/bgpmon.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/sonic-bgpcfgd/bgpmon/bgpmon.py b/src/sonic-bgpcfgd/bgpmon/bgpmon.py index 2b50bd6cf58d..928f72fc34b6 100755 --- a/src/sonic-bgpcfgd/bgpmon/bgpmon.py +++ b/src/sonic-bgpcfgd/bgpmon/bgpmon.py @@ -27,7 +27,7 @@ import json import os import syslog -import swsssdk +from swsscommon import swsscommon import time PIPE_BATCH_MAX_COUNT = 50 @@ -43,10 +43,9 @@ def __init__(self): self.new_peer_l = set() self.new_peer_state = {} self.cached_timestamp = 0 - self.db = swsssdk.SonicV2Connector() + self.db = swsscommon.SonicV2Connector() self.db.connect(self.db.STATE_DB, False) - client = self.db.get_redis_client(self.db.STATE_DB) - self.pipe = client.pipeline() + self.pipe = swsscommon.RedisPipeline(self.db.get_redis_client(self.db.STATE_DB)) self.db.delete_all_by_pattern(self.db.STATE_DB, "NEIGH_STATE_TABLE|*" ) # A quick way to check if there are anything happening within BGP is to @@ -106,11 +105,16 @@ def flush_pipe(self, data): for key, value in data.items(): if value is None: # delete case - self.pipe.delete(key) + command = swsscommon.RedisCommand() + command.formatDEL(key) + self.pipe.push(command) else: # Add or Modify case - self.pipe.hmset(key, value) - self.pipe.execute() + command = swsscommon.RedisCommand() + command.formatHSET(key, value) + self.pipe.push(command) + + self.pipe.flush() data.clear() def update_neigh_states(self): From 45ded68d8d6aceaf3b114d02092b65ef1da82e9d Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 3 Aug 2022 10:18:00 +0800 Subject: [PATCH 629/817] Fix docker database flush_unused_database failed issue (#11600) #### Why I did it Fix docker-database flush_unused_database failed issue: https://github.com/Azure/sonic-buildimage/issues/11597 When change flush_unused_database from use swsssdk to use swsscommon, get_instancelist() and get_dblist() name changed but not update. #### How I did it Change flush_unused_database code to use swsscommon API: Change get_instancelist to getInstanceList. Change get_dblist to getDbList. #### How to verify it Pass all E2E test. Manually check syslog make sure error log not exist and swss, syncd, bgp service started. Search code in Azure make sure there all similer case are fixed in this PR. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Fix docker-database flush_unused_database failed issue: https://github.com/Azure/sonic-buildimage/issues/11597 When change flush_unused_database from use swsssdk to use swsscommon, get_instancelist() and get_dblist() name changed but not update. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 --- dockers/docker-database/docker-database-init.sh | 2 +- dockers/docker-database/flush_unused_database | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dockers/docker-database/docker-database-init.sh b/dockers/docker-database/docker-database-init.sh index 413bbc0b20df..9b92b5890c2d 100755 --- a/dockers/docker-database/docker-database-init.sh +++ b/dockers/docker-database/docker-database-init.sh @@ -79,7 +79,7 @@ rm $db_cfg_file_tmp # copy dump.rdb file to each instance for restoration DUMPFILE=/var/lib/redis/dump.rdb -redis_inst_list=`/usr/bin/python3 -c "import swsssdk; print(' '.join(swsssdk.SonicDBConfig.get_instancelist().keys()))"` +redis_inst_list=`/usr/bin/python3 -c "from swsscommon import swsscommon; print(' '.join(swsscommon.SonicDBConfig.getInstanceList().keys()))"` for inst in $redis_inst_list do mkdir -p /var/lib/$inst diff --git a/dockers/docker-database/flush_unused_database b/dockers/docker-database/flush_unused_database index 82a87392fdb3..11eb7215ebd0 100755 --- a/dockers/docker-database/flush_unused_database +++ b/dockers/docker-database/flush_unused_database @@ -11,15 +11,15 @@ while(True): break time.sleep(1) -instlists = swsscommon.SonicDBConfig.get_instancelist() +instlists = swsscommon.SonicDBConfig.getInstanceList() for instname, v in instlists.items(): - insthost = v['hostname'] - instsocket = v['unix_socket_path'] + insthost = v.hostname + instsocket = v.unixSocketPath - dblists = swsscommon.SonicDBConfig.get_dblist() + dblists = swsscommon.SonicDBConfig.getDbList() for dbname in dblists: - dbid = swsscommon.SonicDBConfig.get_dbid(dbname) - dbinst = swsscommon.SonicDBConfig.get_instancename(dbname) + dbid = swsscommon.SonicDBConfig.getDbId(dbname) + dbinst = swsscommon.SonicDBConfig.getDbInst(dbname) # this DB is on current instance, skip flush if dbinst == instname: From a99ea93b1455dd18b6e21f09567e31d2eb8b8d6e Mon Sep 17 00:00:00 2001 From: Vaibhav Hemant Dixit Date: Wed, 3 Aug 2022 09:08:09 -0700 Subject: [PATCH 630/817] Advance sairedis submodule to include warmboot fix (#11557) Warmboot w/ CPA fix (201811 to 202012): Add SAI_OBJECT_TYPE_TUNNEL object to break-before-make list sonic-net/sonic-sairedis@9652ea4 --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index cac90d762007..9652ea49b22e 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit cac90d7620072cb8bf6ac2abc360e107c3629fda +Subproject commit 9652ea49b22e5f14421e957e3c8e52a35729478b From 1b33f864e5327a02b01298c609e34fc494dca040 Mon Sep 17 00:00:00 2001 From: amulyan7 <98349131+amulyan7@users.noreply.github.com> Date: Wed, 3 Aug 2022 10:04:37 -0700 Subject: [PATCH 631/817] Add ping package to pmon docker (#11550) ping command is not working inside PMON docker (bullseye) Use case: chassisd checks for module reachability inside PMON for "show chassis modules midplane-status" CLI, and on Cisco chassis, this uses ping command to check network reachability --- dockers/docker-platform-monitor/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 1e8c28b0682e..5c34246ca8be 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -25,7 +25,8 @@ RUN apt-get update && \ i2c-tools \ psmisc \ python3-jsonschema \ - libpci3 + libpci3 \ + iputils-ping # On Arista devices, the sonic_platform wheel is not installed in the container. # Instead, the installation directory is mounted from the host OS. However, this method From a98407c58405ec54c34a3c9552e53906e4a96c88 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Thu, 4 Aug 2022 08:02:12 +0800 Subject: [PATCH 632/817] Upgrade sonic fips packages to version 0.2 (#11461) Why I did it Upgrade sonic fips packages to version 0.2 Upgrade openssl version from 1.1.1k-1+deb11u1+fips to 1.1.1n-0+deb11u3+fips Upgrade openssh version from 8.4p1-5+fips to 8.4p1-5+deb11u1+fips How I did it Change the makefile. --- rules/sonic-fips.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rules/sonic-fips.mk b/rules/sonic-fips.mk index 471f69e9ff4b..a63e00de3fa5 100644 --- a/rules/sonic-fips.mk +++ b/rules/sonic-fips.mk @@ -1,8 +1,8 @@ # fips packages -FIPS_VERSION = 0.1 -FIPS_OPENSSL_VERSION = 1.1.1k-1+deb11u1+fips -FIPS_OPENSSH_VERSION = 8.4p1-5+fips +FIPS_VERSION = 0.2 +FIPS_OPENSSL_VERSION = 1.1.1n-0+deb11u3+fips +FIPS_OPENSSH_VERSION = 8.4p1-5+deb11u1+fips FIPS_PYTHON_MAIN_VERSION = 3.9 FIPS_PYTHON_VERSION = 3.9.2-1+fips FIPS_GOLANG_MAIN_VERSION = 1.15 From 5dc4eb9693f47c29ae4984959506bc087c85f353 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Thu, 4 Aug 2022 09:18:00 -0700 Subject: [PATCH 633/817] [vs]Preventing ebtables cfg to be applied on vs (#11585) *Preventing ebtables rules to be applied on KVM image. The ebtables rules in SONiC are added to prevent ARP as well as L2 forwarding to be blocked in linux kernel since the hardware will take care of the actual L2 forward. However this is not the case with KVM where linux needs to forward even L2 packets --- files/build_templates/docker_image_ctl.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 19ca92a8e98c..99051ee62d8c 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -190,8 +190,9 @@ function postStartAction() fi fi # Setup ebtables configuration +{%- if sonic_asic_platform != "vs" %} ebtables_config - +{%- endif %} # chassisdb starts before database starts, bypass the PING check since other # databases are not availbale until database container is ready. # also chassisdb doesn't support warm/fast reboot, its dump.rdb is deleted From 59d570b9973040ad80e4d6d0ac8eb23d233976ca Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Thu, 4 Aug 2022 10:17:38 -0700 Subject: [PATCH 634/817] Event libswsscommon deps (#11618) Why I did it Building docker-sonic-vs requires dependencies installed in sonic-slave-buster How I did it Add libs to sonic-slave-buster and sonic-slave-bullseye How to verify it Check files --- sonic-slave-bullseye/Dockerfile.j2 | 2 ++ sonic-slave-buster/Dockerfile.j2 | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index 2258946c781d..e3169f888205 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -140,6 +140,7 @@ RUN apt-get update && apt-get install -y \ libswitch-perl \ libzmq5 \ libzmq3-dev \ + uuid-dev \ jq \ cron \ # For quagga build @@ -396,6 +397,7 @@ RUN apt-get update && apt-get install -y \ libboost-dev \ libboost-program-options-dev \ libboost-system-dev \ + libboost-serialization-dev \ libboost-thread-dev \ libboost-atomic-dev \ libboost-chrono-dev \ diff --git a/sonic-slave-buster/Dockerfile.j2 b/sonic-slave-buster/Dockerfile.j2 index b89d44656d3a..f2a91a27d54c 100644 --- a/sonic-slave-buster/Dockerfile.j2 +++ b/sonic-slave-buster/Dockerfile.j2 @@ -142,6 +142,7 @@ RUN apt-get update && apt-get install -y \ dh-systemd \ libzmq5 \ libzmq3-dev \ + uuid-dev \ jq \ # For quagga build libreadline-dev \ @@ -406,6 +407,7 @@ RUN apt-get update && apt-get install -y \ libbz2-dev \ # For linkmgrd libboost1.71-dev \ + libboost-serialization1.71-dev \ libboost-program-options1.71-dev \ libboost-system1.71-dev \ libboost-thread1.71-dev \ From 16eaece11d143150863ce3ff2ea9c67dd47a728a Mon Sep 17 00:00:00 2001 From: "Robert J. Halstead" Date: Thu, 4 Aug 2022 14:56:48 -0700 Subject: [PATCH 635/817] Update p4rt configuration to match SONiC upstream schema. (#10725) *The initial commit for the P4RT docker hard coded all the flags which makes it difficult to configure at runtime. Reading them from the CONFIG_DB allows for more flexibility. --- dockers/docker-sonic-p4rt/Dockerfile.j2 | 1 + dockers/docker-sonic-p4rt/p4rt.sh | 90 +++++++++++++++++++++++++ dockers/docker-sonic-p4rt/p4rt_vars.j2 | 5 ++ 3 files changed, 96 insertions(+) create mode 100644 dockers/docker-sonic-p4rt/p4rt_vars.j2 diff --git a/dockers/docker-sonic-p4rt/Dockerfile.j2 b/dockers/docker-sonic-p4rt/Dockerfile.j2 index 13713980e1e7..241f4724ea3f 100644 --- a/dockers/docker-sonic-p4rt/Dockerfile.j2 +++ b/dockers/docker-sonic-p4rt/Dockerfile.j2 @@ -24,6 +24,7 @@ RUN apt-get clean -y && \ rm -rf /debs COPY ["start.sh", "p4rt.sh", "/usr/bin/"] +COPY ["p4rt_vars.j2", "/usr/share/sonic/templates/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] diff --git a/dockers/docker-sonic-p4rt/p4rt.sh b/dockers/docker-sonic-p4rt/p4rt.sh index fa9e17f2fca4..128d21742979 100755 --- a/dockers/docker-sonic-p4rt/p4rt.sh +++ b/dockers/docker-sonic-p4rt/p4rt.sh @@ -1,5 +1,95 @@ #!/usr/bin/env bash +EXIT_P4RT_VARS_FILE_NOT_FOUND=1 +readonly P4RT_VARS_FILE=/usr/share/sonic/templates/p4rt_vars.j2 + +if [ ! -f "${P4RT_VARS_FILE}" ]; then + echo "P4rt vars template file not found" + exit ${EXIT_P4RT_VARS_FILE_NOT_FOUND} +fi + +# Try to read p4rt and certs config from ConfigDB. +# Use default value if no valid config exists +P4RT_VARS=$(sonic-cfggen -d -t ${P4RT_VARS_FILE}) +readonly P4RT_VARS=${P4RT_VARS//[\']/\"} +readonly X509=$(echo ${P4RT_VARS} | jq -r '.x509') +readonly P4RT=$(echo ${P4RT_VARS} | jq -r '.p4rt') +readonly CERTS=$(echo ${P4RT_VARS} | jq -r '.certs') + P4RT_ARGS=" --alsologtostderr --logbuflevel=-1" +if [ -n "${CERTS}" ]; then + readonly SERVER_CRT=$(echo ${CERTS} | jq -r '.server_crt // empty') + readonly SERVER_KEY=$(echo ${CERTS} | jq -r '.server_key // empty') + if [ -z "${SERVER_CRT}" ] || [ -z "${SERVER_KEY}" ]; then + P4RT_ARGS+=" --use_insecure_server_credentials" + else + P4RT_ARGS+=" --server_certificate_file=${SERVER_CRT} --server_key_file=${SERVER_KEY}" + fi + + readonly CA_CRT=$(echo ${CERTS} | jq -r '.ca_crt // empty') + if [ ! -z "${CA_CRT}" ]; then + P4RT_ARGS+=" --ca_certificate_file=${CA_CRT}" + readonly CRL=$(echo ${CERTS} | jq -r '.cert_crl_dir // empty') + if [ ! -z "$CRL" ]; then + P4RT_ARGS+=" --cert_crl_dir=${CRL}" + fi + fi +elif [ -n "${X509}" ]; then + readonly SERVER_CRT=$(echo ${X509} | jq -r '.server_crt // empty') + readonly SERVER_KEY=$(echo ${X509} | jq -r '.server_key // empty') + if [ -z "${SERVER_CRT}" ] || [ -z "${SERVER_KEY}" ]; then + P4RT_ARGS+=" --use_insecure_server_credentials" + else + P4RT_ARGS+=" --server_certificate_file=${SERVER_CRT} --server_key_file=${SERVER_KEY}" + fi + + readonly CA_CRT=$(echo ${X509} | jq -r '.ca_crt // empty') + if [ ! -z "${CA_CRT}" ]; then + P4RT_ARGS+=" --ca_certificate_file=${CA_CRT}" + readonly CRL=$(echo ${X509} | jq -r '.cert_crl_dir // empty') + if [ ! -z "$CRL" ]; then + P4RT_ARGS+=" --cert_crl_dir=${CRL}" + fi + fi +else + P4RT_ARGS+=" --use_insecure_server_credentials" +fi + +# Try to read P4RT authorization config from ConfigDB. +readonly AUTHZ_FILE=$(echo ${P4RT} | jq -r '.authz_policy // empty') +if [ ! -z "${AUTHZ_FILE}" ]; then + P4RT_ARGS+=" --authz_policy_enabled --authorization_policy_file=${AUTHZ_FILE}" +fi + +# Try to read P4RT port config from ConfigDB. +readonly PORT=$(echo ${P4RT} | jq -r '.port // empty') +if [ ! -z "${PORT}" ]; then + P4RT_ARGS+=" --p4rt_grpc_port=${PORT}" +fi + +# Try to read P4RT genetlink config from ConfigDB. +readonly GENETLINK=$(echo ${P4RT} | jq -r '.use_genetlink // empty') +if [ ! -z "${GENETLINK}" ]; then + P4RT_ARGS+=" --use_genetlink=${GENETLINK}" +fi + +# Try to read P4RT port ID config from ConfigDB. +readonly PORT_ID=$(echo ${P4RT} | jq -r '.use_port_ids // empty') +if [ ! -z "${PORT_ID}" ]; then + P4RT_ARGS+=" --use_port_ids=${PORT_ID}" +fi + +# Try to read P4RT save forwarding config from ConfigDB. +readonly SAVE_FORWARDING_CONFIG=$(echo ${P4RT} | jq -r '.save_forwarding_config_file // empty') +if [ ! -z "${SAVE_FORWARDING_CONFIG}" ]; then + P4RT_ARGS+=" --save_forwarding_config_file=${SAVE_FORWARDING_CONFIG}" +fi + +# Try to read P4RT unix socket config from ConfigDB. +readonly UNIX_SOCKET=$(echo ${P4RT} | jq -r '.p4rt_unix_socket // empty') +if [ ! -z "${UNIX_SOCKET}" ]; then + P4RT_ARGS+=" --p4rt_unix_socket=${UNIX_SOCKET}" +fi + exec /usr/local/bin/p4rt ${P4RT_ARGS} diff --git a/dockers/docker-sonic-p4rt/p4rt_vars.j2 b/dockers/docker-sonic-p4rt/p4rt_vars.j2 new file mode 100644 index 000000000000..a62fee18865d --- /dev/null +++ b/dockers/docker-sonic-p4rt/p4rt_vars.j2 @@ -0,0 +1,5 @@ +{ + "certs": {% if P4RT %}{% if "certs" in P4RT.keys() %}{{ P4RT["certs"] }}{% else %}""{% endif %}{% else %}""{% endif %}, + "p4rt" : {% if P4RT %}{% if "p4rt_app" in P4RT.keys() %}{{ P4RT["p4rt_app"] }}{% else %}""{% endif %}{% else %}""{% endif %}, + "x509" : {% if DEVICE_METADATA %}{% if "x509" in DEVICE_METADATA.keys() %}{{ DEVICE_METADATA["x509"] }}{% else %}""{% endif %}{% else %}""{% endif %} +} From 736c739bf492a73c60cfca000b853c040f53a104 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 5 Aug 2022 06:10:34 +0800 Subject: [PATCH 636/817] Fix issue: rsyslog rate limit does not work on version 8.2110.0 (#11588) #### Why I did it The default stable version of rsyslog on bullseye has a bug about rate limit. It causes rate limit not work. The bug has been fixed on backport version 8.2206.0-1~bpo11+1. Buster has no such issue. #### How I did it Upgrade rsyslog from 8.2110.0 to 8.2206.0-1~bpo11+1 #### How to verify it Manual test --- build_debian.sh | 5 ++++- dockers/docker-base-bullseye/Dockerfile.j2 | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 1dd77f3bee6e..7947aef22d64 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -331,7 +331,6 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in sysfsutils \ squashfs-tools \ grub2-common \ - rsyslog \ screen \ hping3 \ tcptraceroute \ @@ -356,6 +355,10 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in jq \ auditd +# default rsyslog version is 8.2110.0 which has a bug on log rate limit, +# use backport version +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -t bullseye-backports -y install rsyslog + # Have systemd create the auditd log directory sudo mkdir -p ${FILESYSTEM_ROOT}/etc/systemd/system/auditd.service.d sudo tee ${FILESYSTEM_ROOT}/etc/systemd/system/auditd.service.d/log-directory.conf >/dev/null < Date: Sun, 7 Aug 2022 13:38:50 +0800 Subject: [PATCH 637/817] [submodule]: Update sonic-wpa-supplicant (#11636) 24f505148 [eloop.c]: Increase timeout of signal termination (#62) 2b2c1ad72 [driver_macsec_sonic.c]: Fixbug: a wrong db_wait in delete sa (#61) Signed-off-by: Ze Gan --- src/wpasupplicant/sonic-wpa-supplicant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wpasupplicant/sonic-wpa-supplicant b/src/wpasupplicant/sonic-wpa-supplicant index 88d1eaea944c..24f505148191 160000 --- a/src/wpasupplicant/sonic-wpa-supplicant +++ b/src/wpasupplicant/sonic-wpa-supplicant @@ -1 +1 @@ -Subproject commit 88d1eaea944c5ea90d9d7796dc10abc80823ed93 +Subproject commit 24f5051481910677b9e5937c01b8b941185086d3 From 89772b6bdc917816d2bf7db2022bcb406517acda Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 8 Aug 2022 12:48:48 +0800 Subject: [PATCH 638/817] Fix CVE-2017-1000487 alert for thrift 0.14.1 (#11634) Why I did it Fix CVE-2017-1000487 alert in thrift 0.14.1. See https://nvd.nist.gov/vuln/detail/CVE-2017-1000487 How I did it Change the version of org.codehaus.plexus:plexus-utils from 3.0.14 to 3.0.16. --- src/thrift_0_14_1/thrift.patch/0002-cve-2017-1000487.patch | 1 + src/thrift_0_14_1/thrift.patch/series | 1 + 2 files changed, 2 insertions(+) create mode 120000 src/thrift_0_14_1/thrift.patch/0002-cve-2017-1000487.patch diff --git a/src/thrift_0_14_1/thrift.patch/0002-cve-2017-1000487.patch b/src/thrift_0_14_1/thrift.patch/0002-cve-2017-1000487.patch new file mode 120000 index 000000000000..ef6607064039 --- /dev/null +++ b/src/thrift_0_14_1/thrift.patch/0002-cve-2017-1000487.patch @@ -0,0 +1 @@ +../../thrift/patch/0002-cve-2017-1000487.patch \ No newline at end of file diff --git a/src/thrift_0_14_1/thrift.patch/series b/src/thrift_0_14_1/thrift.patch/series index 19ba4dba26f3..fa2f836a8e09 100644 --- a/src/thrift_0_14_1/thrift.patch/series +++ b/src/thrift_0_14_1/thrift.patch/series @@ -2,3 +2,4 @@ 0002-Fix-build-rules.patch 0003-Remove-minimist-packages.patch 0004-Remove-underscore-packages.patch +0002-cve-2017-1000487.patch From 4c1c0c185259cc5965b88ac1eeac61908de6c1bc Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 8 Aug 2022 20:06:52 +0800 Subject: [PATCH 639/817] [Mellanox] add more log while doing sysfs reading (#11556) - Why I did it Add more log while doing sysfs reading to increase the debug capability - How I did it Log the relevant file path and error number while sysfs reading return None - How to verify it Manual test --- .../mellanox/mlnx-platform-api/sonic_platform/utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py index adf931d37e90..0db7e1e26e30 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import ctypes import functools import subprocess import json @@ -43,7 +44,14 @@ def read_from_file(file_path, target_type, default='', raise_exception=False, lo """ try: with open(file_path, 'r') as f: - value = target_type(f.read().strip()) + value = f.read() + if value is None: + # None return value is not allowed in any case, so we log error here for further debug. + logger.log_error('Failed to read from {}, value is None, errno is {}'.format(file_path, ctypes.get_errno())) + # Raise ValueError for the except statement to handle this as a normal exception + raise ValueError('File content of {} is None'.format(file_path)) + else: + value = target_type(value.strip()) except (ValueError, IOError) as e: if log_func: log_func('Failed to read from file {} - {}'.format(file_path, repr(e))) From ae3f0589bc451abbf900be9cf5f09bed2f786636 Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Mon, 8 Aug 2022 08:29:51 -0700 Subject: [PATCH 640/817] Event libswsscommon deps (#11639) libswsscommon requires libboost-serialization1.71.0 to be installed for building docker-sonic-vs.gz --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 70ac1d9da8da..6594630cc20f 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -23,6 +23,7 @@ RUN apt-get install -y net-tools \ libqt5core5a \ libqt5network5 \ libboost-program-options1.71.0 \ + libboost-serialization1.71.0 \ libboost-system1.71.0 \ libboost-thread1.71.0 \ libgmp10 \ @@ -44,6 +45,8 @@ RUN apt-get install -y net-tools \ iptables \ jq \ libzmq5 \ + libzmq3-dev \ + uuid-dev \ # For installing Python m2crypto package # (these can be uninstalled after installation) build-essential \ From 1fb853614dd6788a9331f270c60d7fd44b78c422 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Mon, 8 Aug 2022 10:04:57 -0700 Subject: [PATCH 641/817] Update the DNX SAI to 7.1.0.0-7 and this don't have macsec support (#11529) --- platform/broadcom/sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index fb6c21e585ba..954996b97ece 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ LIBSAIBCM_XGS_VERSION = 7.1.0.0-8 -LIBSAIBCM_DNX_VERSION = 7.1.0.0-1 +LIBSAIBCM_DNX_VERSION = 7.1.0.0-7 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" LIBSAIBCM_DNX_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_DNX_VERSION)" From dd5101e81785836a929fd6a0aab2e2883040746c Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Tue, 9 Aug 2022 09:34:13 +0800 Subject: [PATCH 642/817] Support TC value above 7 in yang model (#11630) --- .../tests_config/qosmaps.json | 56 ++++++++++++++++++- .../yang-models/sonic-dot1p-tc-map.yang | 11 ++-- .../yang-models/sonic-dscp-tc-map.yang | 11 ++-- .../sonic-tc-priority-group-map.yang | 11 ++-- .../yang-models/sonic-tc-queue-map.yang | 11 ++-- .../yang-templates/sonic-types.yang.j2 | 9 +++ 6 files changed, 83 insertions(+), 26 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json index f5e5701938c3..a05d80631f1f 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json @@ -13,6 +13,10 @@ { "dscp":"2", "tc":"2" + }, + { + "dscp":"8", + "tc":"8" } ] }, @@ -26,6 +30,10 @@ { "dscp":"2", "tc":"2" + }, + { + "dscp":"8", + "tc":"8" } ] } @@ -65,7 +73,7 @@ "DSCP_TO_TC_MAP": [ { "dscp": "1", - "tc": "8" + "tc": "16" }, { "dscp":"2", @@ -92,6 +100,10 @@ { "dot1p":"2", "tc":"2" + }, + { + "dot1p":"3", + "tc":"8" } ] }, @@ -105,6 +117,10 @@ { "dot1p":"2", "tc":"2" + }, + { + "dot1p":"3", + "tc":"8" } ] } @@ -144,7 +160,7 @@ "DOT1P_TO_TC_MAP": [ { "dot1p": "1", - "tc": "8" + "tc": "16" }, { "dot1p":"2", @@ -171,6 +187,10 @@ { "tc":"2", "qindex":"2" + }, + { + "tc":"8", + "qindex":"3" } ] }, @@ -184,6 +204,10 @@ { "tc":"2", "qindex":"2" + }, + { + "tc":"8", + "qindex":"3" } ] } @@ -250,6 +274,10 @@ { "tc":"2", "pg":"2" + }, + { + "tc":"8", + "pg":"3" } ] }, @@ -263,6 +291,10 @@ { "tc":"2", "pg":"2" + }, + { + "tc":"8", + "pg":"3" } ] } @@ -487,6 +519,10 @@ { "dscp":"2", "tc":"2" + }, + { + "dscp":"8", + "tc":"8" } ] } @@ -507,6 +543,10 @@ { "dot1p":"2", "tc":"2" + }, + { + "dot1p":"3", + "tc":"8" } ] } @@ -527,6 +567,10 @@ { "tc":"2", "qindex":"2" + }, + { + "tc":"8", + "qindex":"3" } ] } @@ -546,6 +590,10 @@ { "tc":"2", "pg":"2" + }, + { + "tc":"8", + "pg":"3" } ] } @@ -643,6 +691,10 @@ { "dscp":"2", "tc":"2" + }, + { + "dscp":"8", + "tc":"8" } ] } diff --git a/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang b/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang index 0a756298c97e..1636f43f6c64 100644 --- a/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang @@ -6,6 +6,10 @@ module sonic-dot1p-tc-map { prefix dot1ptm; + import sonic-types { + prefix stypes; + } + organization "SONiC"; @@ -54,12 +58,7 @@ module sonic-dot1p-tc-map { } leaf tc { - type string { - pattern "[0-7]?"{ - error-message "Invalid Traffic Class"; - error-app-tag tc-invalid; - } - } + type stypes:tc_type; } } } diff --git a/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang b/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang index 71d9fcd4884d..fb590b85c6ff 100644 --- a/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang @@ -6,6 +6,10 @@ module sonic-dscp-tc-map { prefix dtm; + import sonic-types { + prefix stypes; + } + organization "SONiC"; @@ -54,12 +58,7 @@ module sonic-dscp-tc-map { } leaf tc { - type string { - pattern "[0-7]?" { - error-message "Invalid Traffic Class"; - error-app-tag tc-invalid; - } - } + type stypes:tc_type; } } } diff --git a/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang b/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang index 4290b79c3ee7..1b21673f58a0 100644 --- a/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang @@ -6,6 +6,10 @@ module sonic-tc-priority-group-map { prefix tpgm; + import sonic-types { + prefix stypes; + } + organization "SONiC"; @@ -45,12 +49,7 @@ module sonic-tc-priority-group-map { key "tc"; leaf tc { - type string { - pattern "[0-7]?" { - error-message "Invalid Traffic Class"; - error-app-tag tc-invalid; - } - } + type stypes:tc_type; } leaf pg { diff --git a/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang b/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang index fa22a8331294..3bcfab1f4598 100644 --- a/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang @@ -6,6 +6,10 @@ module sonic-tc-queue-map { prefix tqm; + import sonic-types { + prefix stypes; + } + organization "SONiC"; @@ -45,12 +49,7 @@ module sonic-tc-queue-map { key "tc"; leaf tc { - type string { - pattern "[0-7]?" { - error-message "Invalid Traffic Class"; - error-app-tag tc-invalid; - } - } + type stypes:tc_type; } leaf qindex { diff --git a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 index f8d9d2c30586..9de37d2cfc08 100644 --- a/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 +++ b/src/sonic-yang-models/yang-templates/sonic-types.yang.j2 @@ -270,6 +270,15 @@ module sonic-types { "VXLAN Network Identifier"; } + typedef tc_type { + type uint8 { + range "0..15" { + error-message "Invalid Traffic Class"; + error-app-tag tc-invalid; + } + } + } + {% if yang_model_type == "cvl" %} /* Required for CVL */ container operation { From c953168a8746a9f5778a7edd9e2c612cdb89f45b Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 9 Aug 2022 09:41:07 -0700 Subject: [PATCH 643/817] Update Broadcom SAI to 7.1.0.0-9 (#11612) This brings in a SAI library that is compiled on Bullseye. Signed-off-by: Saikrishna Arcot --- platform/broadcom/sai.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 954996b97ece..b4f5873ea3f5 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ -LIBSAIBCM_XGS_VERSION = 7.1.0.0-8 -LIBSAIBCM_DNX_VERSION = 7.1.0.0-7 +LIBSAIBCM_XGS_VERSION = 7.1.0.0-9 +LIBSAIBCM_DNX_VERSION = 7.1.0.0-9 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" LIBSAIBCM_DNX_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_DNX_VERSION)" From a3e3530d1d779911c688a8517aed4557b518ba5c Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 9 Aug 2022 14:21:29 -0700 Subject: [PATCH 644/817] [write_standby] update write_standby.py script (#11650) Why I did it The initial value has to be present for the state machines to work. In active-standby dual-tor scenario, or any hardware mux scenario, the value will be updtaed eventually with a delay. However, in active-active dual-tor scenario, there is no other mechanism to initialize the value and get state machines started. So this script will have to write something at start up time. For active-active dualtor, 'active' is a more preferred initial value, the state machine will switch the state to standby soon if link prober found link not in good state. How I did it Update the script to always provide initial values. How to verify it Tested on active-active dual-tor testbed. Signed-off-by: Ying Xie ying.xie@microsoft.com --- files/scripts/write_standby.py | 45 +++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/files/scripts/write_standby.py b/files/scripts/write_standby.py index 3a41fe58bbe6..86d50737b1c5 100755 --- a/files/scripts/write_standby.py +++ b/files/scripts/write_standby.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import argparse import time from sonic_py_common import logger as log @@ -19,11 +20,13 @@ class MuxStateWriter(object): Class used to write standby mux state to APP DB """ - def __init__(self): + def __init__(self, activeactive, activestandby): self.config_db_connector = None self.appl_db_connector = None self.state_db_connector = None self.asic_db_connector = None + self.default_active_active_state = activeactive + self.default_active_standby_state = activestandby @property def config_db(self): @@ -96,14 +99,25 @@ def is_warmrestart(self): return status and value == 'true' - def get_auto_mux_intfs(self): + def get_all_mux_intfs_modes(self): """ - Returns a list of all mux cable interfaces that are configured to auto-switch + Returns a list of all mux cable interfaces, with suggested modes + Setting mux initial modes is crucial to kick off the statemachines, + have to set the modes for all mux/gRPC ports. """ + intf_modes = {} all_intfs = self.config_db.get_table('MUX_CABLE') - auto_intfs = [intf for intf, status in all_intfs.items() - if status['state'].lower() == 'auto'] - return auto_intfs + for intf, status in all_intfs.items(): + state = status['state'].lower() + if state in ['active', 'standby']: + intf_modes[intf] = state + elif state in ['auto', 'manual']: + if ('soc_ipv4' in status or 'soc_ipv6' in status or + ('cable_type' in status and status['cable_type'] == 'active-active')): + intf_modes[intf] = self.default_active_active_state + else: + intf_modes[intf] = self.default_active_standby_state + return intf_modes def tunnel_exists(self): """ @@ -144,19 +158,26 @@ def apply_mux_config(self): logger.log_warning("Skip setting mux state due to ongoing warmrestart.") return - intfs = self.get_auto_mux_intfs() - state = 'standby' + modes = self.get_all_mux_intfs_modes() if self.wait_for_tunnel(): - logger.log_warning("Applying {} state to interfaces {}".format(state, intfs)) + logger.log_warning("Applying state to interfaces {}".format(modes)) producer_state_table = ProducerStateTable(self.appl_db, 'MUX_CABLE_TABLE') - fvs = create_fvs(state=state) - for intf in intfs: + for intf, state in modes.items(): + fvs = create_fvs(state=state) producer_state_table.set(intf, fvs) else: logger.log_error("Timed out waiting for tunnel {}, mux state will not be written".format(self.tunnel_name)) if __name__ == '__main__': - mux_writer = MuxStateWriter() + parser = argparse.ArgumentParser(description='Write initial mux state') + parser.add_argument('-a', '--active_active', + help='state: intial state for "auto" and/or "manual" config in active-active mode, default "active"', + type=str, required=False, default='active') + parser.add_argument('-s', '--active_standby', + help='state: intial state for "auto" and/or "manual" config in active-standby mode, default "standby"', + type=str, required=False, default='standby') + args = parser.parse_args() + mux_writer = MuxStateWriter(activeactive=args.active_active, activestandby=args.active_standby) mux_writer.apply_mux_config() From 889741c9bc833d2d1a810f5b511a26c19eb20d12 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 9 Aug 2022 16:19:42 -0700 Subject: [PATCH 645/817] [arp_update]: Resolve failed neighbors on dualtor (#11615) In arp_update, check for FAILED or INCOMPLETE kernel neighbor entries and manually ping them to try and resolve the neighbor Signed-off-by: Lawrence Lee --- files/scripts/arp_update | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/files/scripts/arp_update b/files/scripts/arp_update index 2f66fc84b396..df2758e187a7 100755 --- a/files/scripts/arp_update +++ b/files/scripts/arp_update @@ -54,6 +54,7 @@ while /bin/true; do done VLAN=$(echo $ARP_UPDATE_VARS | jq -r '.vlan') + SUBTYPE=$(sonic-db-cli CONFIG_DB hget 'DEVICE_METADATA|localhost' 'subtype' | tr '[:upper:]' '[:lower:]') for vlan in $VLAN; do # generate a list of arping commands: # arping -q -w 0 -c 1 -i ; @@ -75,7 +76,26 @@ while /bin/true; do ndisc6cmd="sed -e 's/^/ndisc6 -q -w 0 -1 /' -e 's/$/;/'" ip6cmd="ip -6 neigh show | grep -v fe80 | grep $vlan | cut -d ' ' -f 1,3 | $ndisc6cmd" eval `eval $ip6cmd` + + if [[ $SUBTYPE == "dualtor" ]]; then + # on dual ToR devices, try to resolve failed neighbor entries since + # these entries will have tunnel routes installed, preventing normal + # neighbor resolution (SWSS PR #2137) + + # since ndisc6 is a userland process, the above ndisc6 commands are + # insufficient to update the kernel neighbor table for failed entries + + # we don't need to do this for ipv4 neighbors since arping is able to + # update the kernel neighbor table + + # generates the following command for each failed or incomplete IPv6 neighbor + # timeout 0.2 ping -n -q -i 0 -c 1 -W 1 -I >/dev/null + ping6_template="sed -e 's/^/timeout 0.2 ping /' -e 's/,/ -n -q -i 0 -c 1 -W 1 -I /' -e 's/$/ >\/dev\/null;/'" + failed_ip6_neigh_cmd="ip -6 neigh show | grep -v fe80 | grep $vlan | grep -E 'FAILED|INCOMPLETE' | cut -d ' ' -f 1,3 --output-delimiter=',' | $ping6_template" + eval `eval $failed_ip6_neigh_cmd` + fi done + # sleep here before handling the mismatch as it is not required during startup sleep 300 From 4a996f3662a7c25c0e5a2e7616e3c0405715106e Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 9 Aug 2022 16:19:59 -0700 Subject: [PATCH 646/817] [swss]: Run tunnel_pkt_handler on dualtor only (#11627) At SWSS docker init time, check the device subtype and enable tunnel packet handler only if it is dualtor Signed-off-by: Lawrence Lee --- dockers/docker-orchagent/Dockerfile.j2 | 2 +- dockers/docker-orchagent/docker-init.j2 | 5 +++++ dockers/docker-orchagent/supervisord.conf.j2 | 12 ------------ dockers/docker-orchagent/tunnel_packet_handler.conf | 9 +++++++++ 4 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 dockers/docker-orchagent/tunnel_packet_handler.conf diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index a023862c1d9d..a7a314cdc8c9 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -68,7 +68,7 @@ RUN apt-get purge -y \ COPY ["files/arp_update", "/usr/bin"] COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] -COPY ["ndppd.conf", "/usr/share/sonic/templates/"] +COPY ["ndppd.conf", "tunnel_packet_handler.conf", "/usr/share/sonic/templates/"] COPY ["enable_counters.py", "tunnel_packet_handler.py", "/usr/bin/"] COPY ["orchagent.sh", "swssconfig.sh", "buffermgrd.sh", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] diff --git a/dockers/docker-orchagent/docker-init.j2 b/dockers/docker-orchagent/docker-init.j2 index 4cd6a53a11cd..18fc1b57a721 100755 --- a/dockers/docker-orchagent/docker-init.j2 +++ b/dockers/docker-orchagent/docker-init.j2 @@ -21,6 +21,7 @@ CFGGEN_PARAMS=" \ -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ " VLAN=$(sonic-cfggen $CFGGEN_PARAMS) +SUBTYPE=$(sonic-cfggen -d -v "DEVICE_METADATA['localhost']['subtype']") SWITCH_TYPE=${SWITCH_TYPE:-`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['switch_type']"`} chmod +x /usr/bin/wait_for_link.sh @@ -43,6 +44,10 @@ if [ "$VLAN" != "" ]; then cp /usr/share/sonic/templates/ndppd.conf /etc/supervisor/conf.d/ fi +if [ "$SUBTYPE" == "DualToR" ]; then + cp /usr/share/sonic/templates/tunnel_packet_handler.conf /etc/supervisor/conf.d/ +fi + USE_PCI_ID_IN_CHASSIS_STATE_DB=/usr/share/sonic/platform/use_pci_id_chassis ASIC_ID="asic$NAMESPACE_ID" if [ -f "$USE_PCI_ID_IN_CHASSIS_STATE_DB" ]; then diff --git a/dockers/docker-orchagent/supervisord.conf.j2 b/dockers/docker-orchagent/supervisord.conf.j2 index 9751a58bb833..eef040ee1784 100644 --- a/dockers/docker-orchagent/supervisord.conf.j2 +++ b/dockers/docker-orchagent/supervisord.conf.j2 @@ -288,15 +288,3 @@ dependent_startup_wait_for=swssconfig:exited environment=ASAN_OPTIONS="log_path=/var/log/asan/fdbsyncd-asan.log{{ asan_extra_options }}" {% endif %} {%- endif %} - -{% if is_fabric_asic == 0 %} -[program:tunnel_packet_handler] -command=/usr/bin/tunnel_packet_handler.py -priority=12 -autostart=false -autorestart=unexpected -stdout_logfile=syslog -stderr_logfile=syslog -dependent_startup=true -dependent_startup_wait_for=swssconfig:exited -{%- endif %} diff --git a/dockers/docker-orchagent/tunnel_packet_handler.conf b/dockers/docker-orchagent/tunnel_packet_handler.conf new file mode 100644 index 000000000000..aa6f3d2f3380 --- /dev/null +++ b/dockers/docker-orchagent/tunnel_packet_handler.conf @@ -0,0 +1,9 @@ +[program:tunnel_packet_handler] +command=/usr/bin/tunnel_packet_handler.py +priority=12 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited From 2af7498b38257d464a9cae37b2d9554ea25af4f9 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 9 Aug 2022 17:05:36 -0700 Subject: [PATCH 647/817] Upgrade LLDP docker to Bullseye (#11628) Signed-off-by: Saikrishna Arcot --- dockers/docker-lldp/Dockerfile.j2 | 2 +- rules/docker-lldp.mk | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dockers/docker-lldp/Dockerfile.j2 b/dockers/docker-lldp/Dockerfile.j2 index 496af3e11601..d7e38e663be8 100644 --- a/dockers/docker-lldp/Dockerfile.j2 +++ b/dockers/docker-lldp/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/rules/docker-lldp.mk b/rules/docker-lldp.mk index f9c77ec14c40..b2e7b350f3bb 100644 --- a/rules/docker-lldp.mk +++ b/rules/docker-lldp.mk @@ -8,13 +8,13 @@ $(DOCKER_LLDP)_PATH = $(DOCKERS_PATH)/docker-lldp $(DOCKER_LLDP)_DEPENDS += $(LLDPD) $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) -$(DOCKER_LLDP)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_LLDP)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_LLDP)_DBG_DEPENDS += $(LLDPD_DBG) $(LIBSWSSCOMMON_DBG) -$(DOCKER_LLDP)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_LLDP)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) $(DOCKER_LLDP)_PYTHON_WHEELS += $(DBSYNCD_PY3) -$(DOCKER_LLDP)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_LLDP)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_LLDP)_VERSION = 1.0.0 $(DOCKER_LLDP)_PACKAGE_NAME = lldp @@ -36,5 +36,5 @@ $(DOCKER_LLDP)_BASE_IMAGE_FILES += lldpctl:/usr/bin/lldpctl $(DOCKER_LLDP)_BASE_IMAGE_FILES += lldpcli:/usr/bin/lldpcli $(DOCKER_LLDP)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -SONIC_BUSTER_DOCKERS += $(DOCKER_LLDP) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_LLDP_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_LLDP) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_LLDP_DBG) From 1baa9191203890e746c83b1e43bcbedc34932657 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:01:54 +0300 Subject: [PATCH 648/817] [submodule] Advance sonic-platform-common pointer (#11661) Update sonic-platform-common submodule pointer to include the following: [eeprom] Add UT for eeprom_tlvinfo.py (#292) Fix Cmis memmap field offset (#290) Fix AttributeError for "sfputil show error-status -hw" (#291) --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 912797e2cabc..50c24a5c43e5 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 912797e2cabcd25a9a469827eb35807031ae13b5 +Subproject commit 50c24a5c43e5c33f79f70dfb3d0aecc30e13739d From a07f8efa16fa3e8168373fde7143df692a920d60 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:03:21 +0300 Subject: [PATCH 649/817] [submodule] Advance sonic-swss-common pointer (#11658) Update sonic-swss-common submodule pointer to include the following: Add docker-mux related table names (#627) Transfer organization from Azure to sonic-net (#656) Signed-off-by: dprital --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 4a6f940d976b..d36c17d62c17 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 4a6f940d976b693c379ce845f8bc35ccf978d388 +Subproject commit d36c17d62c17b7ae2617868989891bc7bb8c72f8 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 2247dbea47f9..515c09a9393d 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 2247dbea47f968411b28b5c04d4be89d72d08cbf +Subproject commit 515c09a9393d3ffabc55cbe8f0fe5969f73292a8 From 82e269fa5838b43479f2b99f29f354cd2e187d94 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:04:40 +0300 Subject: [PATCH 650/817] [submodule] Advance sonic-platform-daemons pointer (#11656) Update sonic-platform-daemons submodule pointer to include the following: Xcvrd changes to support 400G ZR configuration (#270) [ycabled] add secure channel support for grpc dualtor active-active connectivity (#275) Signed-off-by: dprital --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 005ec302783c..cc563670a5e8 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 005ec302783c6d31a31e89e2e98bbafa717f770d +Subproject commit cc563670a5e8a10a51057a4e1455a1e36b386653 From 3660129d688ccf3fd25b2e8f4163f11a01fac14d Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Wed, 10 Aug 2022 23:09:10 +0800 Subject: [PATCH 651/817] [Mellanox] Add Sensor conf to support respined platforms(SN3700/SN3700C/SN4600C) (#11553) - Why I did it Add new sensor conf file to support respined platforms(SN3700/SN3700C/SN4600C) - How I did it Add new sensor conf Update the get_sensors_conf_path scripts to apply the sensor conf according to the HW respin version info - How to verify it run platform test(including sensor test) Signed-off-by: Kebo Liu --- .../get_sensors_conf_path | 33 +++ .../sensors_respin.conf | 187 ++++++++++++++ .../sensors_swb_respin.conf | 203 +++++++++++++++ .../get_sensors_conf_path | 1 + .../sensors_respin.conf | 183 ++++++++++++++ .../sensors_swb_respin.conf | 199 +++++++++++++++ .../get_sensors_conf_path | 51 +++- .../sensors_respin.conf | 232 ++++++++++++++++++ .../sensors_respin.conf.a1 | 202 +++++++++++++++ 9 files changed, 1290 insertions(+), 1 deletion(-) create mode 100755 device/mellanox/x86_64-mlnx_msn3700-r0/get_sensors_conf_path create mode 100644 device/mellanox/x86_64-mlnx_msn3700-r0/sensors_respin.conf create mode 100644 device/mellanox/x86_64-mlnx_msn3700-r0/sensors_swb_respin.conf create mode 120000 device/mellanox/x86_64-mlnx_msn3700c-r0/get_sensors_conf_path create mode 100644 device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_respin.conf create mode 100644 device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_swb_respin.conf mode change 120000 => 100755 device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path create mode 100644 device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf create mode 100644 device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf.a1 diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/get_sensors_conf_path b/device/mellanox/x86_64-mlnx_msn3700-r0/get_sensors_conf_path new file mode 100755 index 000000000000..6bc639c57b96 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/get_sensors_conf_path @@ -0,0 +1,33 @@ +#!/bin/bash + +BWD_RESPIN_VERSION="/var/run/hw-management/system/config3" +SWB_RESPIN_VERSION="/var/run/hw-management/system/config1" +SENSORS_CONF_FILE="/usr/share/sonic/platform/sensors.conf" +SENSORS_RESPIN_CONF_FILE="/usr/share/sonic/platform/sensors_respin.conf" +SENSORS_SWB_RESPIN_CONF_FILE="/usr/share/sonic/platform/sensors_swb_respin.conf" + +function get_sensor_conf_path() { + local _BWD_RESPIN_VERSION="0" + local _SWB_RESPIN_VERSION="0" + if [[ -e $SWB_RESPIN_VERSION ]]; then + _SWB_RESPIN_VERSION=$(cat $SWB_RESPIN_VERSION 2>&1) + if (($_SWB_RESPIN_VERSION == "2" || $_SWB_RESPIN_VERSION == "6")); then + if [[ -e $SENSORS_SWB_RESPIN_CONF_FILE ]]; then + echo $SENSORS_SWB_RESPIN_CONF_FILE + return + fi + fi + fi + if [[ -e $BWD_RESPIN_VERSION ]]; then + _BWD_RESPIN_VERSION=$(cat $BWD_RESPIN_VERSION 2>&1) + if [[ "$_BWD_RESPIN_VERSION" == "1" ]]; then + if [[ -e $SENSORS_RESPIN_CONF_FILE ]]; then + echo $SENSORS_RESPIN_CONF_FILE + return + fi + fi + fi + echo $SENSORS_CONF_FILE +} + +get_sensor_conf_path diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_respin.conf b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_respin.conf new file mode 100644 index 000000000000..d3cd3091faa8 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_respin.conf @@ -0,0 +1,187 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "tps53679-i2c-*-70" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in4 "PMIC-1 ASIC 1.2V Rail (out)" + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "tps53679-i2c-*-71" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 ASIC 3.3V Rail (out)" + compute in3 (1.5)*@, @/(1.5) + label in4 "PMIC-2 ASIC 1.8V Rail (out)" + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in)" + label in2 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in3 "PMIC-1 ASIC 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "mp2975-i2c-*-66" + label in1 "PMIC-2 PSU 12V Rail (in)" + label in2 "PMIC-2 ASIC 3.3V Rail (out)" + compute in2 (2)*@, @/(2) + label in3 "PMIC-2 ASIC 1.8V Rail (out)" + ignore in4 + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 PSU 12V Rail (in2)" + label in3 "PMIC-3 COMEX 1.8V Rail (out)" + label in4 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label temp2 "PMIC-3 Temp 2" + label power1 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-3 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 PSU 12V Rail (in2)" + label in3 "PMIC-4 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2 220V Rail (in)" + ignore in2 + label in3 "PSU-2 12V Rail (out)" + label fan1 "PSU-2 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-2 Temp 1" + label temp2 "PSU-2 Temp 2" + label temp3 "PSU-2 Temp 3" + label power1 "PSU-2 220V Rail Pwr (in)" + label power2 "PSU-2 12V Rail Pwr (out)" + label curr1 "PSU-2 220V Rail Curr (in)" + label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1 Tach 1" + label fan2 "Chassis Fan Drawer-1 Tach 2" + label fan3 "Chassis Fan Drawer-2 Tach 1" + label fan4 "Chassis Fan Drawer-2 Tach 2" + label fan5 "Chassis Fan Drawer-3 Tach 1" + label fan6 "Chassis Fan Drawer-3 Tach 2" + label fan7 "Chassis Fan Drawer-4 Tach 1" + label fan8 "Chassis Fan Drawer-4 Tach 2" + label fan9 "Chassis Fan Drawer-5 Tach 1" + label fan10 "Chassis Fan Drawer-5 Tach 2" + label fan11 "Chassis Fan Drawer-6 Tach 1" + label fan12 "Chassis Fan Drawer-6 Tach 2" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_swb_respin.conf b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_swb_respin.conf new file mode 100644 index 000000000000..c10d0fd15950 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors_swb_respin.conf @@ -0,0 +1,203 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + chip "adt75-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "tps53679-i2c-*-70" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in4 "PMIC-1 ASIC 1.2V Rail (out)" + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "tps53679-i2c-*-71" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 ASIC 3.3V Rail (out)" + compute in3 (1.5)*@, @/(1.5) + label in4 "PMIC-2 ASIC 1.8V Rail (out)" + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in)" + label in2 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in3 "PMIC-1 ASIC 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-1 Temp 1" + label power1 "PMIC-1 PSU 12V Rail Pwr (in)" + label power2 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power3 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 PSU 12V Rail Curr (in)" + label curr2 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + ignore curr3 + ignore curr4 + ignore curr5 + ignore curr6 + ignore curr7 + ignore curr8 + label curr9 "PMIC-1 ASIC 1.2V Rail Curr (out)" + ignore curr10 + + chip "mp2975-i2c-*-66" + label in1 "PMIC-2 PSU 12V Rail (in)" + label in2 "PMIC-2 ASIC 3.3V Rail (out)" + compute in2 (2)*@, @/(2) + label in3 "PMIC-2 ASIC 1.8V Rail (out)" + ignore in4 + label temp1 "PMIC-2 Temp 1" + label power1 "PMIC-2 PSU 12V Rail Pwr (in)" + label power2 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power3 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 PSU 12V Rail Curr (in)" + label curr2 "PMIC-2 ASIC 3.3V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-2 ASIC 1.8V Rail Curr (out)" + ignore curr6 + ignore curr7 + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 PSU 12V Rail (in2)" + label in3 "PMIC-3 COMEX 1.8V Rail (out)" + label in4 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label temp2 "PMIC-3 Temp 2" + label power1 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-3 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 PSU 12V Rail (in2)" + label in3 "PMIC-4 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + ignore curr7 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2 220V Rail (in)" + ignore in2 + label in3 "PSU-2 12V Rail (out)" + label fan1 "PSU-2 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-2 Temp 1" + label temp2 "PSU-2 Temp 2" + label temp3 "PSU-2 Temp 3" + label power1 "PSU-2 220V Rail Pwr (in)" + label power2 "PSU-2 12V Rail Pwr (out)" + label curr1 "PSU-2 220V Rail Curr (in)" + label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1 Tach 1" + label fan2 "Chassis Fan Drawer-1 Tach 2" + label fan3 "Chassis Fan Drawer-2 Tach 1" + label fan4 "Chassis Fan Drawer-2 Tach 2" + label fan5 "Chassis Fan Drawer-3 Tach 1" + label fan6 "Chassis Fan Drawer-3 Tach 2" + label fan7 "Chassis Fan Drawer-4 Tach 1" + label fan8 "Chassis Fan Drawer-4 Tach 2" + label fan9 "Chassis Fan Drawer-5 Tach 1" + label fan10 "Chassis Fan Drawer-5 Tach 2" + label fan11 "Chassis Fan Drawer-6 Tach 1" + label fan12 "Chassis Fan Drawer-6 Tach 2" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/get_sensors_conf_path b/device/mellanox/x86_64-mlnx_msn3700c-r0/get_sensors_conf_path new file mode 120000 index 000000000000..fb7b1d6feda0 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/get_sensors_conf_path @@ -0,0 +1 @@ +../x86_64-mlnx_msn3700-r0/get_sensors_conf_path \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_respin.conf b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_respin.conf new file mode 100644 index 000000000000..740f9ae968fe --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_respin.conf @@ -0,0 +1,183 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "tps53679-i2c-*-70" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in4 "PMIC-1 ASIC 1.2V Rail (out)" + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "tps53679-i2c-*-71" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 ASIC 3.3V Rail (out)" + compute in3 (1.5)*@, @/(1.5) + label in4 "PMIC-2 ASIC 1.8V Rail (out)" + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in)" + label in2 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in3 "PMIC-1 ASIC 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "mp2975-i2c-*-66" + label in1 "PMIC-2 PSU 12V Rail (in)" + label in2 "PMIC-2 ASIC 3.3V Rail (out)" + compute in2 (2)*@, @/(2) + label in3 "PMIC-2 ASIC 1.8V Rail (out)" + ignore in4 + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 PSU 12V Rail (in2)" + label in3 "PMIC-3 COMEX 1.8V Rail (out)" + label in4 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label temp2 "PMIC-3 Temp 2" + label power1 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-3 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 PSU 12V Rail (in2)" + label in3 "PMIC-4 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2 220V Rail (in)" + ignore in2 + label in3 "PSU-2 12V Rail (out)" + label fan1 "PSU-2 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-2 Temp 1" + label temp2 "PSU-2 Temp 2" + label temp3 "PSU-2 Temp 3" + label power1 "PSU-2 220V Rail Pwr (in)" + label power2 "PSU-2 12V Rail Pwr (out)" + label curr1 "PSU-2 220V Rail Curr (in)" + label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1 Tach 1" + label fan2 "Chassis Fan Drawer-1 Tach 2" + label fan3 "Chassis Fan Drawer-2 Tach 1" + label fan4 "Chassis Fan Drawer-2 Tach 2" + label fan5 "Chassis Fan Drawer-3 Tach 1" + label fan6 "Chassis Fan Drawer-3 Tach 2" + label fan7 "Chassis Fan Drawer-4 Tach 1" + label fan8 "Chassis Fan Drawer-4 Tach 2" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_swb_respin.conf b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_swb_respin.conf new file mode 100644 index 000000000000..027c63d744e8 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors_swb_respin.conf @@ -0,0 +1,199 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + chip "adt75-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "tps53679-i2c-*-70" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in4 "PMIC-1 ASIC 1.2V Rail (out)" + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power2 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + label curr2 "PMIC-1 ASIC 1.2V Rail Curr (out)" + chip "tps53679-i2c-*-71" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 ASIC 3.3V Rail (out)" + compute in3 (1.5)*@, @/(1.5) + label in4 "PMIC-2 ASIC 1.8V Rail (out)" + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power2 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 ASIC 3.3V Rail Curr (out)" + label curr2 "PMIC-2 ASIC 1.8V Rail Curr (out)" + + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in)" + label in2 "PMIC-1 ASIC 0.8V VCORE Rail (out)" + label in3 "PMIC-1 ASIC 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-1 Temp 1" + label power1 "PMIC-1 PSU 12V Rail Pwr (in)" + label power2 "PMIC-1 ASIC 0.8V VCORE Rail Pwr (out)" + label power3 "PMIC-1 ASIC 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 PSU 12V Rail Curr (in)" + label curr2 "PMIC-1 ASIC 0.8V VCORE Rail Curr (out)" + ignore curr3 + ignore curr4 + ignore curr5 + ignore curr6 + ignore curr7 + ignore curr8 + label curr9 "PMIC-1 ASIC 1.2V Rail Curr (out)" + ignore curr10 + + chip "mp2975-i2c-*-66" + label in1 "PMIC-2 PSU 12V Rail (in)" + label in2 "PMIC-2 ASIC 3.3V Rail (out)" + compute in2 (2)*@, @/(2) + label in3 "PMIC-2 ASIC 1.8V Rail (out)" + ignore in4 + label temp1 "PMIC-2 Temp 1" + label power1 "PMIC-2 PSU 12V Rail Pwr (in)" + label power2 "PMIC-2 ASIC 3.3V Rail Pwr (out)" + label power3 "PMIC-2 ASIC 1.8V Rail Pwr (out)" + label curr1 "PMIC-2 PSU 12V Rail Curr (in)" + label curr2 "PMIC-2 ASIC 3.3V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-2 ASIC 1.8V Rail Curr (out)" + ignore curr6 + ignore curr7 + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 PSU 12V Rail (in2)" + label in3 "PMIC-3 COMEX 1.8V Rail (out)" + label in4 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label temp2 "PMIC-3 Temp 2" + label power1 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-3 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 PSU 12V Rail (in2)" + label in3 "PMIC-4 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + ignore curr7 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2 220V Rail (in)" + ignore in2 + label in3 "PSU-2 12V Rail (out)" + label fan1 "PSU-2 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-2 Temp 1" + label temp2 "PSU-2 Temp 2" + label temp3 "PSU-2 Temp 3" + label power1 "PSU-2 220V Rail Pwr (in)" + label power2 "PSU-2 12V Rail Pwr (out)" + label curr1 "PSU-2 220V Rail Curr (in)" + label curr2 "PSU-2 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1 Tach 1" + label fan2 "Chassis Fan Drawer-1 Tach 2" + label fan3 "Chassis Fan Drawer-2 Tach 1" + label fan4 "Chassis Fan Drawer-2 Tach 2" + label fan5 "Chassis Fan Drawer-3 Tach 1" + label fan6 "Chassis Fan Drawer-3 Tach 2" + label fan7 "Chassis Fan Drawer-4 Tach 1" + label fan8 "Chassis Fan Drawer-4 Tach 2" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path b/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path deleted file mode 120000 index f1509a1e1d3d..000000000000 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn4700-r0/get_sensors_conf_path \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path b/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path new file mode 100755 index 000000000000..07f1cb1e06f2 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/get_sensors_conf_path @@ -0,0 +1,50 @@ +#!/bin/bash + +HW_VERSION="/var/run/hw-management/system/config1" +HW_RESPIN_VERSION="/var/run/hw-management/system/config3" +SENSORS_CONF_FILE="/usr/share/sonic/platform/sensors.conf" +SENSORS_RESPIN_CONF_FILE="/usr/share/sonic/platform/sensors_respin.conf" +SENSORS_CONF_FILE_A1="/usr/share/sonic/platform/sensors.conf.a1" +SENSORS_RESPIN_CONF_FILE_A1="/usr/share/sonic/platform/sensors_respin.conf.a1" + +function get_sensor_conf_path() { + local _HW_VERSION="0" + local _HW_RESPIN_VERSION="0" + if [[ -e $HW_VERSION ]]; then + _HW_VERSION=$(cat $HW_VERSION 2>&1) + if [[ "$_HW_VERSION" == "1" ]]; then + if [[ -e $HW_RESPIN_VERSION ]]; then + _HW_RESPIN_VERSION=$(cat $HW_RESPIN_VERSION 2>&1) + if [[ "$_HW_RESPIN_VERSION" == "1" ]]; then + if [[ -e $SENSORS_RESPIN_CONF_FILE_A1 ]]; then + echo $SENSORS_RESPIN_CONF_FILE_A1 + return + fi + else + if [[ -e $SENSORS_CONF_FILE_A1 ]]; then + echo $SENSORS_CONF_FILE_A1 + return + fi + fi + else + if [[ -e $SENSORS_CONF_FILE_A1 ]]; then + echo $SENSORS_CONF_FILE_A1 + return + fi + fi + else + if [[ -e $HW_RESPIN_VERSION ]]; then + _HW_RESPIN_VERSION=$(cat $HW_RESPIN_VERSION 2>&1) + if [[ "$_HW_RESPIN_VERSION" == "1" ]]; then + if [[ -e $SENSORS_RESPIN_CONF_FILE ]]; then + echo $SENSORS_RESPIN_CONF_FILE + return + fi + fi + fi + fi + fi + echo $SENSORS_CONF_FILE +} + +get_sensor_conf_path diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf new file mode 100644 index 000000000000..e6890eb1cf10 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf @@ -0,0 +1,232 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "xdpe12284-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in1)" + ignore in2 + label in3 "PMIC-1 ASIC VCORE_MAIN Rail (out1)" + ignore in4 + label temp1 "PMIC-1 ASIC VCORE_MAIN Temp 1" + ignore temp2 + label power1 "PMIC-1 12V ASIC VCORE_MAIN Rail Pwr (in)" + ignore power2 + label power3 "PMIC-1 ASIC VCORE_MAIN Rail Pwr (out1)" + ignore power4 + label curr1 "PMIC-1 12V ASIC VCORE_MAIN Rail Curr (in1)" + ignore curr2 + label curr3 "PMIC-1 ASIC VCORE_MAIN Rail Curr (out1)" + ignore curr4 + chip "xdpe12284-i2c-*-64" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 ASIC 1.8V_MAIN Rail (out1)" + label in4 "PMIC-2 ASIC 1.2V_MAIN Rail (out2)" + label temp1 "PMIC-2 ASIC 1.8V_MAIN Temp 1" + label temp2 "PMIC-2 ASIC 1.2V_MAIN Temp 2" + label power1 "PMIC-2 12V ASIC 1.8V_1.2V_MAIN Rail Pwr (in)" + ignore power2 + label power3 "PMIC-2 ASIC 1.8V_MAIN Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.2V_MAIN Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC 1.8V_MAIN Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.2V_MAIN Rail Curr (in2)" + label curr3 "PMIC-2 ASIC 1.8V_MAIN Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.2V_MAIN Rail Curr (out2)" + chip "xdpe12284-i2c-*-66" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-3 ASIC VCORE_T0_1 Rail (out1)" + label in4 "PMIC-3 ASIC 1.8V_T0_1 Rail (out2)" + label temp1 "PMIC-3 ASIC VCORE_T0_1 Temp 1" + label temp2 "PMIC-3 ASIC 1.8V_T0_1 Temp 2" + label power1 "PMIC-3 12V ASIC VCORE_1.8V_T0_1 Rail Pwr (in) " + ignore power2 + label power3 "PMIC-2 ASIC VCORE_T0_1 Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.8V_T0_1 Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC VCORE_T0_1 Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.8V_T0_1 Rail Curr (in2)" + label curr3 "PMIC-2 ASIC VCORE_T0_1 Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.8V_T0_1 Rail Curr (out2)" + chip "xdpe12284-i2c-*-68" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-3 ASIC VCORE_T2_3 Rail (out1)" + label in4 "PMIC-3 ASIC 1.8V_T2_3 Rail (out2)" + label temp1 "PMIC-3 ASIC VCORE_T2_3 Temp 1" + label temp2 "PMIC-3 ASIC 1.8V_T2_3 Temp 2" + label power1 "PMIC-3 12V ASIC VCORE_1.8V_T2_3 Rail Pwr (in) " + ignore power2 + label power3 "PMIC-2 ASIC VCORE_T2_3 Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.8V_T2_3 Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC VCORE_T2_3 Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.8V_T2_3 Rail Curr (in2)" + label curr3 "PMIC-2 ASIC VCORE_T2_3 Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.8V_T2_3 Rail Curr (out2)" + chip "xdpe12284-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-3 ASIC VCORE_T4_5 Rail (out1)" + label in4 "PMIC-3 ASIC 1.8V_T4_5 Rail (out2)" + label temp1 "PMIC-3 ASIC VCORE_T4_5 Temp 1" + label temp2 "PMIC-3 ASIC 1.8V_T4_5 Temp 2" + label power1 "PMIC-3 12V ASIC VCORE_1.8V_T4_5 Rail Pwr (in) " + ignore power2 + label power3 "PMIC-2 ASIC VCORE_T4_5 Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.8V_T4_5 Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC VCORE_T4_5 Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.8V_T4_5 Rail Curr (in2)" + label curr3 "PMIC-2 ASIC VCORE_T4_5 Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.8V_T4_5 Rail Curr (out2)" + chip "xdpe12284-i2c-*-6c" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-3 ASIC VCORE_T6_7 Rail (out1)" + label in4 "PMIC-3 ASIC 1.8V_T6_7 Rail (out2)" + label temp1 "PMIC-3 ASIC VCORE_T6_7 Temp 1" + label temp2 "PMIC-3 ASIC 1.8V_T6_7 Temp 2" + label power1 "PMIC-3 12V ASIC VCORE_1.8V_T6_7 Rail Pwr (in) " + ignore power2 + label power3 "PMIC-2 ASIC VCORE_T6_7 Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.8V_T6_7 Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC VCORE_T6_7 Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.8V_T6_7 Rail Curr (in2)" + label curr3 "PMIC-2 ASIC VCORE_T6_7 Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.8V_T6_7 Rail Curr (out2)" + chip "xdpe12284-i2c-*-6e" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-3 ASIC 1.2V_T0_3 Rail (out1)" + label in4 "PMIC-3 ASIC 1.2V_T4_7 Rail (out2)" + label temp1 "PMIC-3 ASIC 1.2V_T0_3 Temp 1" + label temp2 "PMIC-3 ASIC 1.2V_T4_7 Temp 2" + label power1 "PMIC-3 12V ASIC 1.2V_T0_3_T4_7 Rail Pwr (in) " + ignore power2 + label power3 "PMIC-2 ASIC 1.2V_T0_3 Rail Pwr (out1)" + label power4 "PMIC-2 ASIC 1.2V_T4_7 Rail Pwr (out2)" + label curr1 "PMIC-2 12V ASIC 1.2V_T0_3 Rail Curr (in1)" + label curr2 "PMIC-2 12V ASIC 1.2V_T4_7 Rail Curr (in2)" + label curr3 "PMIC-2 ASIC 1.2V_T0_3 Rail Curr (out1)" + label curr4 "PMIC-2 ASIC 1.2V_T4_7 Rail Curr (out2)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-8 PSU 12V Rail (in1)" + label in2 "PMIC-8 PSU 12V Rail (in2)" + label in3 "PMIC-8 COMEX 1.8V Rail (out)" + label in4 "PMIC-8 COMEX 1.05V Rail (out)" + label temp1 "PMIC-8 Temp 1" + label temp2 "PMIC-8 Temp 2" + label power1 "PMIC-8 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-8 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-8 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-8 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-9 PSU 12V Rail (in1)" + label in2 "PMIC-9 PSU 12V Rail (in2)" + label in3 "PMIC-9 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-9 Temp 1" + label temp2 "PMIC-9 Temp 2" + label power1 "PMIC-9 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-9 COMEX 1.2V Rail Curr (out)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1(L) 220V Rail (in)" + ignore in2 + label in3 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label temp3 "PSU-1(L) Temp 3" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2(R) 220V Rail (in)" + ignore in2 + label in3 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label temp3 "PSU-2(R) Temp 3" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1" + label fan2 "Chassis Fan Drawer-2" + label fan3 "Chassis Fan Drawer-3" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf.a1 b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf.a1 new file mode 100644 index 000000000000..f3096b01f637 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors_respin.conf.a1 @@ -0,0 +1,202 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in)" + label in2 "PMIC-1 ASIC VCORE_MAIN Rail (out)" + ignore in3 + ignore in4 + label temp1 "PMIC-1 ASIC VCORE_MAIN Temp 1" + ignore temp2 + label power1 "PMIC-1 12V ASIC VCORE_MAIN Rail Pwr (in)" + label power2 "PMIC-1 ASIC VCORE_MAIN Rail Pwr (out)" + ignore power3 + ignore power4 + label curr1 "PMIC-1 12V ASIC VCORE_MAIN Rail Curr (in)" + label curr2 "PMIC-1 ASIC VCORE_MAIN Rail Curr (out)" + ignore curr3 + ignore curr4 + chip "mp2975-i2c-*-64" + label in1 "PMIC-2 PSU 12V Rail (in)" + label in2 "PMIC-2 ASIC 1.8V_MAIN Rail (out1)" + label in3 "PMIC-2 ASIC 1.2V_MAIN Rail (out2)" + ignore in4 + label temp1 "PMIC-2 ASIC 1.8V_1.2V_MAIN Temp 1" + ignore temp2 + label power1 "PMIC-2 12V ASIC 1.8V_1.2V_MAIN Rail Pwr (in)" + label power2 "PMIC-2 ASIC 1.8V_MAIN Rail Pwr (out)" + ignore power3 + ignore power4 + label curr1 "PMIC-2 12V ASIC 1.8V_1.2V_MAIN Rail Curr (in)" + label curr2 "PMIC-2 ASIC 1.8V_MAIN Rail Curr (out1)" + label curr3 "PMIC-2 ASIC 1.2V_MAIN Rail Curr (out2)" + ignore curr4 + chip "mp2975-i2c-*-66" + label in1 "PMIC-3 PSU 12V Rail (in)" + label in2 "PMIC-3 ASIC VCORE_T0_3 Rail (out1)" + label in3 "PMIC-3 ASIC 1.8V_T0_3 Rail (out2)" + ignore in4 + label temp1 "PMIC-3 ASIC VCORE_1.8V_T0_3 Temp 1" + ignore temp2 + label power1 "PMIC-3 12V ASIC VCORE_1.8V_T0_3 Rail Pwr (in) " + label power2 "PMIC-3 ASIC VCORE_T0_3 Rail Pwr (out)" + ignore power3 + ignore power4 + label curr1 "PMIC-3 12V ASIC VCORE_1.8V_T0_3 Rail Curr (in)" + label curr2 "PMIC-3 ASIC VCORE_T0_3 Rail Curr (out1)" + label curr3 "PMIC-3 ASIC 1.8V_T0_3 Rail Curr (out2)" + ignore curr4 + chip "mp2975-i2c-*-6a" + label in1 "PMIC-4 PSU 12V Rail (in)" + label in2 "PMIC-4 ASIC VCORE_T4_7 Rail (out1)" + label in3 "PMIC-3 ASIC 1.8V_T4_7 Rail (out2)" + ignore in4 + label temp1 "PMIC-4 ASIC VCORE_1.8V_T4_7 Temp 1" + ignore temp2 + label power1 "PMIC-4 12V ASIC VCORE_1.8V_T4_7 Rail Pwr (in) " + label power2 "PMIC-4 ASIC VCORE_T4_7 Rail Pwr (out)" + ignore power3 + ignore power4 + label curr1 "PMIC-4 12V ASIC VCORE_1.8V_T4_7 Rail Curr (in)" + label curr2 "PMIC-4 ASIC VCORE_T4_7 Rail Curr (out1)" + label curr3 "PMIC-4 ASIC 1.8V_T4_7 Rail Curr (out2)" + ignore curr4 + ignore curr4 + chip "mp2975-i2c-*-6e" + label in1 "PMIC-5 PSU 12V Rail (in)" + label in2 "PMIC-5 ASIC 1.2V_T0_3 Rail (out1)" + label in3 "PMIC-5 ASIC 1.2V_T4_7 Rail (out2)" + ignore in4 + label temp1 "PMIC-5 ASIC 1.2V_T0_3_T4_7 Temp 1" + ignore temp2 + label power1 "PMIC-5 12V ASIC 1.2V_T0_3_T4_7 Rail Pwr (in)" + label power2 "PMIC-5 ASIC 1.2V_T0_3 Rail Pwr (out)" + ignore power3 + ignore power4 + label curr1 "PMIC-5 12V ASIC 1.2V_T0_3_T4_7 Rail Curr (in)" + label curr2 "PMIC-5 ASIC 1.2V_T0_3 Rail Curr (out1)" + label curr3 "PMIC-5 ASIC 1.2V_T4_7 Rail Curr (out2)" + ignore curr4 +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-6 PSU 12V Rail (in1)" + label in2 "PMIC-6 PSU 12V Rail (in2)" + label in3 "PMIC-6 COMEX 1.8V Rail (out1)" + label in4 "PMIC-6 COMEX 1.05V Rail (out2)" + label temp1 "PMIC-6 Temp 1" + label temp2 "PMIC-6 Temp 2" + label power1 "PMIC-6 COMEX 1.8V Rail Pwr (out1)" + label power2 "PMIC-6 COMEX 1.05V Rail Pwr (out2)" + label curr1 "PMIC-6 COMEX 1.8V Rail Curr (out1)" + label curr2 "PMIC-6 COMEX 1.05V Rail Curr (out2)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-7 PSU 12V Rail (in1)" + label in2 "PMIC-7 PSU 12V Rail (in2)" + label in3 "PMIC-7 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-7 Temp 1" + label temp2 "PMIC-7 Temp 2" + label power1 "PMIC-7 COMEX 1.2V Rail Pwr (out1)" + ignore power2 + label curr1 "PMIC-7 COMEX 1.2V Rail Curr (out1)" + ignore curr2 + + chip "mp2975-i2c-*-6a" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 COMEX 1.8V Rail (out)" + label in3 "PMIC-3 COMEX 1.05V Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-3 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-3 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-3 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-3 COMEX 1.8V Rail Curr (out)" + ignore curr3 + ignore curr4 + label curr5 "PMIC-3 COMEX 1.05V Rail Curr (out)" + ignore curr6 + + chip "mp2975-i2c-*-61" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 COMEX 1.2V Rail (out)" + label temp1 "PMIC-4 Temp 1" + label temp2 "PMIC-4 Temp 2" + label power1 "PMIC-4 COMEX 12V Rail Pwr (in)" + label power2 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-4 COMEX 12V Rail Curr (in)" + label curr2 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr3 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1(L) 220V Rail (in)" + ignore in2 + label in3 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label temp3 "PSU-1(L) Temp 3" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + chip "dps460-i2c-*-59" + label in1 "PSU-2(R) 220V Rail (in)" + ignore in2 + label in3 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label temp3 "PSU-2(R) Temp 3" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + set in3_lcrit in3_crit * 0.662 + set in3_min in3_crit * 0.745 + set in3_max in3_crit * 0.952 + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1" + label fan2 "Chassis Fan Drawer-2" + label fan3 "Chassis Fan Drawer-3" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 From aec124825874ed0b466f73132935f9f523e2e56f Mon Sep 17 00:00:00 2001 From: orfarfara <33719090+orfar1994@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:10:55 +0300 Subject: [PATCH 652/817] [Mellanox] add PSU input voltage and current (#11510) - Why I did it Add PSU input voltage and input current to mlnx platform api. - How I did it Implement 2 function of getting the psu voltage and psu current input: Get the values from "power/psu{}_curr_in" , "power/psu{}_volt_in" - How to verify it Manual test. Run sonic-mgmt regression Signed-off-by: orfar1994 --- .../mlnx-platform-api/sonic_platform/psu.py | 49 ++++++++++++++++++- .../mlnx-platform-api/tests/test_psu.py | 10 +++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index 69f2f8930cc4..05f38f62a0f1 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -190,12 +190,32 @@ def get_temperature_high_threshold(self): """ return None - + def get_input_voltage(self): + """ + Retrieves current PSU voltage input + + Returns: + A float number, the input voltage in volts, + e.g. 12.1 + """ + return None + + def get_input_current(self): + """ + Retrieves the input current draw of the power supply + + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + return None + class Psu(FixedPsu): """Platform-specific Psu class""" PSU_CURRENT = "power/psu{}_curr" PSU_POWER = "power/psu{}_power" PSU_VPD = "eeprom/psu{}_vpd" + PSU_CURRENT_IN = "power/psu{}_curr_in" + PSU_VOLT_IN = "power/psu{}_volt_in" shared_led = None @@ -207,7 +227,10 @@ def __init__(self, psu_index): self._psu_voltage_max = None self._psu_voltage_capability = None + self.psu_voltage_in = os.path.join(PSU_PATH, self.PSU_VOLT_IN.format(self.index)) + self.psu_current = os.path.join(PSU_PATH, self.PSU_CURRENT.format(self.index)) + self.psu_current_in = os.path.join(PSU_PATH, self.PSU_CURRENT_IN.format(self.index)) self.psu_power = os.path.join(PSU_PATH, self.PSU_POWER.format(self.index)) self.psu_power_max = self.psu_power + "_max" self.psu_presence = os.path.join(PSU_PATH, "thermal/psu{}_status".format(self.index)) @@ -457,6 +480,30 @@ def get_maximum_supplied_power(self): else: return None + def get_input_voltage(self): + """ + Retrieves current PSU voltage input + + Returns: + A float number, the input voltage in volts, + e.g. 12.1 + """ + if self.get_powergood_status(): + voltage = utils.read_int_from_file(self.psu_voltage_in, log_func=logger.log_info) + return float(voltage) / 1000 + return None + + def get_input_current(self): + """ + Retrieves the input current draw of the power supply + + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + if self.get_powergood_status(): + amperes = utils.read_int_from_file(self.psu_current_in, log_func=logger.log_info) + return float(amperes) / 1000 + return None class InvalidPsuVolWA: """This class is created as a workaround for a known hardware issue that the PSU voltage threshold could be a diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 68260ef630f7..5deb72bfb0e1 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -49,6 +49,8 @@ def test_fixed_psu(self): assert psu.is_replaceable() is False assert psu.get_temperature() is None assert psu.get_temperature_high_threshold() is None + assert psu.get_input_voltage() is None + assert psu.get_input_current() is None @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) def test_psu(self): @@ -64,7 +66,9 @@ def test_psu(self): psu.psu_current: 20345, psu.psu_power: 30456, psu.psu_temp: 40567, - psu.psu_temp_threshold: 50678 + psu.psu_temp_threshold: 50678, + psu.psu_voltage_in: 102345, + psu.psu_current_in: 676, } def mock_read_int_from_file(file_path, **kwargs): @@ -85,6 +89,8 @@ def mock_read_int_from_file(file_path, **kwargs): assert psu.get_power() is None assert psu.get_temperature() is None assert psu.get_temperature_high_threshold() is None + assert psu.get_input_voltage() is None + assert psu.get_input_current() is None mock_sysfs_content[psu.psu_oper_status] = 1 assert psu.get_voltage() == 10.234 @@ -94,6 +100,8 @@ def mock_read_int_from_file(file_path, **kwargs): assert psu.get_power() == 0.030456 assert psu.get_temperature() == 40.567 assert psu.get_temperature_high_threshold() == 50.678 + assert psu.get_input_voltage() == 102.345 + assert psu.get_input_current() == 0.676 assert psu.get_position_in_parent() == 1 assert psu.is_replaceable() is True From f3d93d2638e30772c75b968219a599e7d3553fc9 Mon Sep 17 00:00:00 2001 From: Sumukha Tumkur Vani Date: Wed, 10 Aug 2022 13:00:54 -0700 Subject: [PATCH 653/817] [RESTAPI] Update submodule (#11674) --- src/sonic-restapi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-restapi b/src/sonic-restapi index 55683f2abb8e..bcc6f704a544 160000 --- a/src/sonic-restapi +++ b/src/sonic-restapi @@ -1 +1 @@ -Subproject commit 55683f2abb8e7be0e80b0e81128314c90006303c +Subproject commit bcc6f704a54454f326f069501b01759dbb732bb3 From 0a203baaa14fcc428fe2e171f398798fb6a97eb3 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Thu, 11 Aug 2022 06:44:39 +0800 Subject: [PATCH 654/817] [submodule] Advance sonic-swss and sonic-utilities pointer (#11643) * Advance sonic-utilities pointer 7919077f Add FEC correctable and uncorrectable port stats (#2027) ecb91367 Add CLI to configure YANG config validation (#2147) e9ab5235 Add override testcase to verify removal (#2288) c6794b55 Fix version in db_migrator for `PORT_QOS_MAP|global` (#2289) 92b889b7 [intfutil] Check whether the FEC mode is supported on the platform before configuring it to CONFIG_DB (#2223) dab0d065 Transfer organization from Azure to sonic-net (#2284) 6de18a1d [watermarkstat] Fix CLI script for unconfigured PG counters (#2239) ac2f5530 Improve the way to check port type of RJ45 port (#2249) 142185c9 Fix the issue that sonic_platform is not installed on vs image (#2300) ca14133f [crm] add checking for CRM interval range (#2293) Signed-off-by: Stephen Sun * Advance swss dc8bc1c4 [portsorch] Expose supported FEC modes to STABE_DB and check whether FEC mode is supported before setting it (#2333) 6565b502 Revert "[portsorch] Expose supported FEC modes to STABE_DB and check whether FEC mode is supported before setting it (#2333)" (#2396) dc88d55d Revert hwinfo count change (#2383) 75fc9659 [DualToR] Handle race condition between tunnel_decap and mux orchestrator (#2397) 525a57fa Fix for remote system interface not getting created (#2364) 3161eaae portsorch: initial support for link-training (#2359) dc477fb0 [swss/cfgmgr] teammgr configure lacp rate (#2121) 2489ad57 Improve pytest speend by grouping 20 tests together. (#2390) 168bd3b3 [EVPN]Modified tunnel creation logic when creating tunnel in VRF-VNI map creation flow (#2404) 1e1438e4 [portsorch] Expose supported FEC modes to STABE_DB and check whether FEC mode is supported before setting it (#2400) 9f2e27b4 [QoS] Fix issue: the WRED profile can not be set if current min > new max or current max < new min (#2379) d36c17d6 [asan][aclorch] fix a memory leak in the SaiAttrWrapper::swap() (#2382) Signed-off-by: Stephen Sun * More sonic-utilities PRs be1866fd Fix GCU bug when backend service modifying config (#2295) bcf36eb3 Fix issues for sonic_installer upgrade-docker and sonic_installer rollback-docker (#2278) Signed-off-by: Stephen Sun Signed-off-by: Stephen Sun --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index feeac8471bf0..be1866fd3f9d 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit feeac8471bf09b4d3e0286c75007e28f7f507127 +Subproject commit be1866fd3f9d2555c4036e9f1a9b820ae6d5c889 From 2d4299308ddf41e57d0b27bb11d54585a8761bb7 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Thu, 11 Aug 2022 06:57:07 +0300 Subject: [PATCH 655/817] [swss.sh/syncd.sh] Trap only on EXIT (#11590) When using trap on SIGTERM the script will not react to the SIGTERM signal sent while a child is executing. I.e, the following script does not react on SIGTERM sent to it if it is waiting for sleep to finish: ``` trap "echo Handled SIGTERM" 0 2 3 15 echo "Before sleep" sleep inf echo "After sleep" ``` Instead, trap only on EXIT which covers also a scenario with exit on SIGINT, SIGTERM. Signed-off-by: Stepan Blyschak --- files/scripts/swss.sh | 2 +- files/scripts/syncd_common.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 93a3c3dcf7d8..c1a46ced35a4 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -38,7 +38,7 @@ function lock_service_state_change() exec {LOCKFD}>${LOCKFILE} /usr/bin/flock -x ${LOCKFD} - trap "/usr/bin/flock -u ${LOCKFD}" 0 2 3 15 + trap "/usr/bin/flock -u ${LOCKFD}" EXIT debug "Locked ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service" } diff --git a/files/scripts/syncd_common.sh b/files/scripts/syncd_common.sh index 3adfb6cbfcf9..3d03c8b9e4e5 100755 --- a/files/scripts/syncd_common.sh +++ b/files/scripts/syncd_common.sh @@ -3,11 +3,11 @@ # # common functions used by "syncd" scipts (syncd.sh, gbsyncd.sh, etc..) # scripts using this must provide implementations of the following functions: -# +# # startplatform # waitplatform # stopplatform1 and stopplatform2 -# +# # For examples of these, see gbsyncd.sh and syncd.sh. # @@ -25,7 +25,7 @@ function lock_service_state_change() exec {LOCKFD}>${LOCKFILE} /usr/bin/flock -x ${LOCKFD} - trap "/usr/bin/flock -u ${LOCKFD}" 0 2 3 15 + trap "/usr/bin/flock -u ${LOCKFD}" EXIT debug "Locked ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service" } From 147f736cc9c2c51a1a56b7da23b544af581e4de2 Mon Sep 17 00:00:00 2001 From: StormLiangMS <89824293+StormLiangMS@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:22:14 +0800 Subject: [PATCH 656/817] [bgp-cfgd] BGP allow list enhancement (#11586) Why I did it 2 things are missing in current allow-prefix list implementation. In some usecase, need to tell the BGP neighbor and have different allow-prefix list for different neighbors, which is not supported. for the prefix list, can't support flexible le and ge. How I did it To enhance the bgp allow-prefix list feature to have: To include the neighbor type info for the allow-prefix list. To support flexible le and ge length for allow-prefix list. How to verify it 4 new unit test cases are added in this PR to cover changes. --- .../bgpcfgd/managers_allow_list.py | 112 ++++++++++----- src/sonic-bgpcfgd/tests/test_allow_list.py | 129 +++++++++++++++++- 2 files changed, 203 insertions(+), 38 deletions(-) diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py index 209d12fd2f97..4bdd488fc2eb 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_allow_list.py @@ -14,8 +14,11 @@ class BGPAllowListMgr(Manager): ALLOW_ADDRESS_PL_NAME_TMPL = "ALLOW_ADDRESS_%d_%s" # template for a name for the ALLOW_ADDRESS prefix-list ??? EMPTY_COMMUNITY = "empty" PL_NAME_TMPL = "PL_ALLOW_LIST_DEPLOYMENT_ID_%d_COMMUNITY_%s_V%s" + PL_NAME_TMPL_WITH_NEIGH = "PL_ALLOW_LIST_DEPLOYMENT_ID_%d_NEIGHBOR_%s_COMMUNITY_%s_V%s" COMMUNITY_NAME_TMPL = "COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_%d_COMMUNITY_%s" + COMMUNITY_NAME_TMPL_WITH_NEIGH = "COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_%d_NEIGHBOR_%s_COMMUNITY_%s" RM_NAME_TMPL = "ALLOW_LIST_DEPLOYMENT_ID_%d_V%s" + RM_NAME_TMPL_WITH_NEIGH = "ALLOW_LIST_DEPLOYMENT_ID_%d_NEIGHBOR_%s_V%s" ROUTE_MAP_ENTRY_WITH_COMMUNITY_START = 10 ROUTE_MAP_ENTRY_WITH_COMMUNITY_END = 29990 ROUTE_MAP_ENTRY_WITHOUT_COMMUNITY_START = 30000 @@ -38,7 +41,7 @@ def __init__(self, common_objs, db, table): db, table, ) - self.key_re = re.compile(r"^DEPLOYMENT_ID\|\d+\|\S+$|^DEPLOYMENT_ID\|\d+$") + self.key_re = re.compile(r"^DEPLOYMENT_ID\|\d+\|\S+$|^DEPLOYMENT_ID\|\d+$|^DEPLOYMENT_ID\|\d+\|\S+\|NEIGHBOR_TYPE\|\S+$|^DEPLOYMENT_ID\|\d+\|NEIGHBOR_TYPE\|\S+") self.enabled = self.__get_enabled() self.prefix_match_tag = self.__get_routemap_tag() self.__load_constant_lists() @@ -55,8 +58,14 @@ def set_handler(self, key, data): return True if not self.__set_handler_validate(key, data): return True - key = key.replace("DEPLOYMENT_ID|", "") - deployment_id, community_value = key.split('|', 1) if '|' in key else (key, BGPAllowListMgr.EMPTY_COMMUNITY) + if 'NEIGHBOR_TYPE' in key: + keys = key.split('|NEIGHBOR_TYPE|', 1) + deployment_id = keys[0].replace("DEPLOYMENT_ID|", "") + neighbor_type, community_value = keys[1].split('|', 1) if '|' in keys[1] else (keys[1], BGPAllowListMgr.EMPTY_COMMUNITY) + else: + key = key.replace("DEPLOYMENT_ID|", "") + deployment_id, community_value = key.split('|', 1) if '|' in key else (key, BGPAllowListMgr.EMPTY_COMMUNITY) + neighbor_type = '' deployment_id = int(deployment_id) prefixes_v4 = [] prefixes_v6 = [] @@ -65,7 +74,7 @@ def set_handler(self, key, data): if "prefixes_v6" in data: prefixes_v6 = str(data['prefixes_v6']).split(",") default_action_community = self.__get_default_action_community(data) - self.__update_policy(deployment_id, community_value, prefixes_v4, prefixes_v6, default_action_community) + self.__update_policy(deployment_id, community_value, prefixes_v4, prefixes_v6, default_action_community, neighbor_type) return True def __set_handler_validate(self, key, data): @@ -85,13 +94,13 @@ def __set_handler_validate(self, key, data): prefixes_v6 = [] if "prefixes_v4" in data: prefixes_v4 = str(data["prefixes_v4"]).split(",") - if not all(TemplateFabric.is_ipv4(prefix) for prefix in prefixes_v4): + if not all(TemplateFabric.is_ipv4(re.split('ge|le', prefix)[0]) for prefix in prefixes_v4): arguments = "prefixes_v4", str(data["prefixes_v4"]) log_err("BGPAllowListMgr::Received BGP ALLOWED 'SET' message with invalid input[%s]:'%s'" % arguments) return False if "prefixes_v6" in data: prefixes_v6 = str(data["prefixes_v6"]).split(",") - if not all(TemplateFabric.is_ipv6(prefix) for prefix in prefixes_v6): + if not all(TemplateFabric.is_ipv6(re.split('ge|le', prefix)[0]) for prefix in prefixes_v6): arguments = "prefixes_v6", str(data["prefixes_v6"]) log_err("BGPAllowListMgr::Received BGP ALLOWED 'SET' message with invalid input[%s]:'%s'" % arguments) return False @@ -113,10 +122,18 @@ def del_handler(self, key): return if not self.__del_handler_validate(key): return - key = key.replace('DEPLOYMENT_ID|', '') - deployment_id, community = key.split('|', 1) if '|' in key else (key, BGPAllowListMgr.EMPTY_COMMUNITY) + + if 'NEIGHBOR_TYPE' in key: + keys = key.split('|NEIGHBOR_TYPE|', 1) + deployment_id = keys[0].replace("DEPLOYMENT_ID|", "") + neighbor_type, community_value = keys[1].split('|', 1) if '|' in keys[1] else (keys[1], BGPAllowListMgr.EMPTY_COMMUNITY) + else: + key = key.replace("DEPLOYMENT_ID|", "") + deployment_id, community_value = key.split('|', 1) if '|' in key else (key, BGPAllowListMgr.EMPTY_COMMUNITY) + neighbor_type = '' + deployment_id = int(deployment_id) - self.__remove_policy(deployment_id, community) + self.__remove_policy(deployment_id, community_value, neighbor_type) def __del_handler_validate(self, key): """ @@ -129,7 +146,7 @@ def __del_handler_validate(self, key): return False return True - def __update_policy(self, deployment_id, community_value, prefixes_v4, prefixes_v6, default_action): + def __update_policy(self, deployment_id, community_value, prefixes_v4, prefixes_v6, default_action, neighbor_type): """ Update "allow list" policy with parameters :param deployment_id: deployment id which policy will be changed @@ -139,12 +156,13 @@ def __update_policy(self, deployment_id, community_value, prefixes_v4, prefixes_ :param default_action: the default action for the policy. should be either 'permit' or 'deny' """ # update all related entries with the information - info = deployment_id, community_value, str(prefixes_v4), str(prefixes_v6) + info = deployment_id, community_value, str(prefixes_v4), str(prefixes_v6), neighbor_type msg = "BGPAllowListMgr::Updating 'Allow list' policy." msg += " deployment_id '%s'. community: '%s'" msg += " prefix_v4 '%s'. prefix_v6: '%s'" + msg += " neighbor_type %s" log_info(msg % info) - names = self.__generate_names(deployment_id, community_value) + names = self.__generate_names(deployment_id, community_value, neighbor_type) self.cfg_mgr.update() cmds = [] cmds += self.__update_prefix_list(self.V4, names['pl_v4'], prefixes_v4) @@ -156,14 +174,14 @@ def __update_policy(self, deployment_id, community_value, prefixes_v4, prefixes_ cmds += self.__update_default_route_map_entry(names['rm_v6'], default_action) if cmds: self.cfg_mgr.push_list(cmds) - peer_groups = self.__find_peer_group_by_deployment_id(deployment_id) + peer_groups = self.__find_peer_group(deployment_id, neighbor_type) self.cfg_mgr.restart_peer_groups(peer_groups) log_debug("BGPAllowListMgr::__update_policy. The peers configuration scheduled for updates") else: log_debug("BGPAllowListMgr::__update_policy. Nothing to update") log_info("BGPAllowListMgr::Done") - def __remove_policy(self, deployment_id, community_value): + def __remove_policy(self, deployment_id, community_value, neighbor_type): """ Remove "allow list" policy for given deployment_id and community_value :param deployment_id: deployment id which policy will be removed @@ -177,7 +195,7 @@ def __remove_policy(self, deployment_id, community_value): log_info(msg % info) default_action = self.__get_default_action_community() - names = self.__generate_names(deployment_id, community_value) + names = self.__generate_names(deployment_id, community_value, neighbor_type) self.cfg_mgr.update() cmds = [] cmds += self.__remove_allow_route_map_entry(self.V4, names['pl_v4'], names['community'], names['rm_v4']) @@ -189,7 +207,7 @@ def __remove_policy(self, deployment_id, community_value): cmds += self.__update_default_route_map_entry(names['rm_v6'], default_action) if cmds: self.cfg_mgr.push_list(cmds) - peer_groups = self.__find_peer_group_by_deployment_id(deployment_id) + peer_groups = self.__find_peer_group(deployment_id, neighbor_type) self.cfg_mgr.restart_peer_groups(peer_groups) log_debug("BGPAllowListMgr::__remove_policy. 'Allow list' policy was scheduled for removal") else: @@ -197,26 +215,42 @@ def __remove_policy(self, deployment_id, community_value): log_info('BGPAllowListMgr::Done') @staticmethod - def __generate_names(deployment_id, community_value): + def __generate_names(deployment_id, community_value, neighbor_type): """ Generate prefix-list names for a given peer_ip and community value :param deployment_id: deployment_id for which we're going to filter prefixes :param community_value: community, which we want to use to filter prefixes :return: a dictionary with names """ - if community_value == BGPAllowListMgr.EMPTY_COMMUNITY: - community_name = BGPAllowListMgr.EMPTY_COMMUNITY + if not neighbor_type: + if community_value == BGPAllowListMgr.EMPTY_COMMUNITY: + community_name = BGPAllowListMgr.EMPTY_COMMUNITY + else: + community_name = BGPAllowListMgr.COMMUNITY_NAME_TMPL % (deployment_id, community_value) + names = { + "pl_v4": BGPAllowListMgr.PL_NAME_TMPL % (deployment_id, community_value, '4'), + "pl_v6": BGPAllowListMgr.PL_NAME_TMPL % (deployment_id, community_value, '6'), + "rm_v4": BGPAllowListMgr.RM_NAME_TMPL % (deployment_id, '4'), + "rm_v6": BGPAllowListMgr.RM_NAME_TMPL % (deployment_id, '6'), + "community": community_name, + 'neigh_type': neighbor_type, + } + arguments = deployment_id, community_value, str(names) + log_debug("BGPAllowListMgr::__generate_names. deployment_id: %d, community: %s. names: %s" % arguments) else: - community_name = BGPAllowListMgr.COMMUNITY_NAME_TMPL % (deployment_id, community_value) - names = { - "pl_v4": BGPAllowListMgr.PL_NAME_TMPL % (deployment_id, community_value, '4'), - "pl_v6": BGPAllowListMgr.PL_NAME_TMPL % (deployment_id, community_value, '6'), - "rm_v4": BGPAllowListMgr.RM_NAME_TMPL % (deployment_id, '4'), - "rm_v6": BGPAllowListMgr.RM_NAME_TMPL % (deployment_id, '6'), - "community": community_name, - } - arguments = deployment_id, community_value, str(names) - log_debug("BGPAllowListMgr::__generate_names. deployment_id: %d, community: %s. names: %s" % arguments) + if community_value == BGPAllowListMgr.EMPTY_COMMUNITY: + community_name = BGPAllowListMgr.EMPTY_COMMUNITY + else: + community_name = BGPAllowListMgr.COMMUNITY_NAME_TMPL_WITH_NEIGH % (deployment_id, neighbor_type, community_value) + names = { + "pl_v4": BGPAllowListMgr.PL_NAME_TMPL_WITH_NEIGH % (deployment_id, neighbor_type, community_value, '4'), + "pl_v6": BGPAllowListMgr.PL_NAME_TMPL_WITH_NEIGH % (deployment_id, neighbor_type, community_value, '6'), + "rm_v4": BGPAllowListMgr.RM_NAME_TMPL_WITH_NEIGH % (deployment_id, neighbor_type, '4'), + "rm_v6": BGPAllowListMgr.RM_NAME_TMPL_WITH_NEIGH % (deployment_id, neighbor_type, '6'), + "community": community_name, + } + arguments = deployment_id, neighbor_type, community_value, str(names) + log_debug("BGPAllowListMgr::__generate_names. deployment_id: %d, neighbor_type: %s, community: %s. names: %s" % arguments) return names def __update_prefix_list(self, af, pl_name, allow_list): @@ -630,7 +664,7 @@ def __get_routemap_tag(self): return prefix_match_tag @staticmethod - def __get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call): + def __get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call, neighbor_type): """ Get peer_groups which are assigned to deployment_id :deployment_id: deployment_id number @@ -639,14 +673,17 @@ def __get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call): :rm_2_call: a dictionary: key - name of a route-map, value - name of a route-map call defined for the route-map """ ret = set() - target_allow_list_prefix = 'ALLOW_LIST_DEPLOYMENT_ID_%d_V' % deployment_id + if not neighbor_type: + target_allow_list_prefix = 'ALLOW_LIST_DEPLOYMENT_ID_%d_V' % deployment_id + else: + target_allow_list_prefix = 'ALLOW_LIST_DEPLOYMENT_ID_%d_NEIGHBOR_%s_V' % (deployment_id, neighbor_type) for peer_group, route_map in pg_2_rm.items(): if route_map in rm_2_call: if rm_2_call[route_map].startswith(target_allow_list_prefix): ret.add(peer_group) return list(ret) - def __find_peer_group_by_deployment_id(self, deployment_id): + def __find_peer_group(self, deployment_id, neighbor_type): """ Deduce peer-group names which are connected to devices with requested deployment_id :param deployment_id: deployment_id number @@ -656,7 +693,7 @@ def __find_peer_group_by_deployment_id(self, deployment_id): peer_groups = self.__extract_peer_group_names() pg_2_rm = self.__get_peer_group_to_route_map(peer_groups) rm_2_call = self.__get_route_map_calls(set(pg_2_rm.values())) - ret = self.__get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call) + ret = self.__get_peer_group_to_restart(deployment_id, pg_2_rm, rm_2_call, neighbor_type) return list(ret) def __get_enabled(self): @@ -706,11 +743,14 @@ def __to_prefix_list(self, af, allow_list): res = [] prefix_mask_default = 32 if af == self.V4 else 128 for prefix in allow_list: - prefix_mask = int(prefix.split("/")[1]) - if prefix_mask == prefix_mask_default: + if 'le' in prefix or 'ge' in prefix: res.append("permit %s" % prefix) else: - res.append("permit %s le %d" % (prefix, prefix_mask_default)) + prefix_mask = int(prefix.split("/")[1]) + if prefix_mask == prefix_mask_default: + res.append("permit %s" % prefix) + else: + res.append("permit %s le %d" % (prefix, prefix_mask_default)) return res def __af_to_family(self, af): diff --git a/src/sonic-bgpcfgd/tests/test_allow_list.py b/src/sonic-bgpcfgd/tests/test_allow_list.py index e77c692ee593..c5bec039c3e4 100644 --- a/src/sonic-bgpcfgd/tests/test_allow_list.py +++ b/src/sonic-bgpcfgd/tests/test_allow_list.py @@ -866,6 +866,131 @@ def test_set_handler_no_community_update_prefixes_remove(): ] ) +def test_set_handler_with_neighbor_type(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5|NEIGHBOR_TYPE|OpticalLonghaulTerminal", { + "prefixes_v4": "10.62.64.0/22 ge 30,"\ + "10.1.44.0/23 ge 30,"\ + "10.17.92.0/23 ge 30,"\ + "10.73.92.0/23 ge 30,"\ + "10.26.170.0/24 ge 30,"\ + "10.26.171.0/24 ge 30,"\ + "10.26.255.0/24 ge 30", + "prefixes_v6": "fc01:20::/64", + }), + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 20 permit 20.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 30 permit 40.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 40 permit fc01:30::/64 le 128', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 30000', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 30000', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 65535', + ' set community 123:123 additive', + "" + ], + [ + 'no ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 20 permit 10.62.64.0/22 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 30 permit 10.1.44.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 40 permit 10.17.92.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 50 permit 10.73.92.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 60 permit 10.26.170.0/24 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 70 permit 10.26.171.0/24 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V4 seq 80 permit 10.26.255.0/24 ge 30', + 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_empty_V6 seq 30 permit fc01:20::/64 le 128', + ] + ) + +def test_set_handler_with_neighbor_type_and_community(): + set_del_test( + "SET", + ("DEPLOYMENT_ID|5|NEIGHBOR_TYPE|OpticalLonghaulTerminal|1010:2020", { + "prefixes_v4": "10.62.64.0/22 ge 30,"\ + "10.1.44.0/23 ge 30,"\ + "10.17.92.0/23 ge 30,"\ + "10.73.92.0/23 ge 30,"\ + "10.26.170.0/24 ge 30,"\ + "10.26.171.0/24 ge 30,"\ + "10.26.255.0/24 ge 30", + "prefixes_v6": "fc01:20::/64", + }), + [ + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 20 permit 20.20.30.0/24 le 32', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 30 permit 40.50.0.0/16 le 32', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 30 permit fc01:20::/64 le 128', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 40 permit fc01:30::/64 le 128', + 'bgp community-list standard COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020 permit 1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 10', + ' match ip address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 10', + ' match ipv6 address prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6', + ' match community COMMUNITY_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 65535', + ' set community 123:123 additive', + "" + ], + [ + 'no ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 10 deny 0.0.0.0/0 le 17', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 20 permit 10.62.64.0/22 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 30 permit 10.1.44.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 40 permit 10.17.92.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 50 permit 10.73.92.0/23 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 60 permit 10.26.170.0/24 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 70 permit 10.26.171.0/24 ge 30', + 'ip prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V4 seq 80 permit 10.26.255.0/24 ge 30', + 'no ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 10 deny ::/0 le 59', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 20 deny ::/0 ge 65', + 'ipv6 prefix-list PL_ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_COMMUNITY_1010:2020_V6 seq 30 permit fc01:20::/64 le 128', + ] + ) + +def test_del_handler_with_neighbor_type_community_no_data(): + set_del_test( + "DEL", + ("DEPLOYMENT_ID|5|NEIGHBOR_TYPE|OpticalLonghaulTerminal|1010:2020",), + [ + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 65535', + ' set community 123:123 additive' + ], + [] + ) + +def test_del_handler_with_neighbor_type_no_data(): + set_del_test( + "DEL", + ("DEPLOYMENT_ID|5|NEIGHBOR_TYPE|OpticalLonghaulTerminal",), + [ + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V4 permit 65535', + ' set community 123:123 additive', + 'route-map ALLOW_LIST_DEPLOYMENT_ID_5_NEIGHBOR_OpticalLonghaulTerminal_V6 permit 65535', + ' set community 123:123 additive' + ], + [] + ) + @patch.dict("sys.modules", swsscommon=swsscommon_module_mock) def test___set_handler_validate(): from bgpcfgd.managers_allow_list import BGPAllowListMgr @@ -894,7 +1019,7 @@ def test___set_handler_validate(): }) @patch.dict("sys.modules", swsscommon=swsscommon_module_mock) -def test___find_peer_group_by_deployment_id(): +def test___find_peer_group(): from bgpcfgd.managers_allow_list import BGPAllowListMgr cfg_mgr = MagicMock() cfg_mgr.update.return_value = None @@ -984,7 +1109,7 @@ def test___find_peer_group_by_deployment_id(): 'constants': global_constants, } mgr = BGPAllowListMgr(common_objs, "CONFIG_DB", "BGP_ALLOWED_PREFIXES") - values = mgr._BGPAllowListMgr__find_peer_group_by_deployment_id(0) + values = mgr._BGPAllowListMgr__find_peer_group(0, '') assert set(values) == {'PEER_V4_INT', 'PEER_V6_INT', 'PEER_V6', 'PEER_V4'} @patch.dict("sys.modules", swsscommon=swsscommon_module_mock) From 0031cc6c64b932426ff9050b5b3edb713c6d8626 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 11 Aug 2022 13:59:26 +0800 Subject: [PATCH 657/817] [Mellanox] Update hw-mgmt package to V.7.0020.3006 (#11538) - Why I did it Update HW-MGMT to V.7.0020.3006 1. Support new system SN2201 2. Add COMEX BRDWL respin support - How I did it Update the version number of the makefile Advance the hw-mgmt submodule pointer - How to verify it Run full regression on Nvidia platforms Signed-off-by: Kebo Liu --- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/hw-management/hw-mgmt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 6144ce67a746..0c8c8c1b548d 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -16,7 +16,7 @@ # # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = 7.0020.2004 +MLNX_HW_MANAGEMENT_VERSION = 7.0020.3006 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/hw-management/hw-mgmt b/platform/mellanox/hw-management/hw-mgmt index ec2e9173e9f2..137109ed15be 160000 --- a/platform/mellanox/hw-management/hw-mgmt +++ b/platform/mellanox/hw-management/hw-mgmt @@ -1 +1 @@ -Subproject commit ec2e9173e9f24cbc02eb87d81889d408528e090b +Subproject commit 137109ed15be147a99b59ceb9dfa1799688dfb71 From 15e59fce00fd35b30102ffdf83c863c062ec9e76 Mon Sep 17 00:00:00 2001 From: Vivek Date: Thu, 11 Aug 2022 00:37:33 -0700 Subject: [PATCH 658/817] [Mellanox] [SKU] Mellanox-SN4700-C128 SKU added (#11574) - Why I did it New SKU for MSN-4700 Platform i.e. Mellanox-SN4700-C128 Requirements: * Breakout: Port 1-32: 4x100G * Downlinks: 120 (1-30) * Uplinks: 8 (31-32) * Shared Headroom: Enabled * Over Subscribe Ratio: 1:8 * Default Topology: T2 * Default Cable Length for T2: 1500m * QoS params: The default ones defined in qos_config.j2 will be applied * Small Packet Percentage: Used 50% for traditional buffer model Note: For dynamic model, the value defined in LOSSLESS_TRAFFIC_PATTERN|AZURE|small_packet_percentage is used Additional Details: Switch Type has to be programmed as SpineRouter through config_db.json in DEVICE_METADATA|localhost|type field for the buffer values & cable lengths defined in the buffers_defaults_t2.j2 to apply on the device Cable Lengths Used for generating buffer_defaults_{t0,t1,t2}.j2 values Signed-off-by: Vivek Reddy Karri --- .../Mellanox-SN4700-C128/buffers.json.j2 | 15 + .../buffers_defaults_objects.j2 | 1 + .../buffers_defaults_t0.j2 | 39 ++ .../buffers_defaults_t1.j2 | 39 ++ .../buffers_defaults_t2.j2 | 44 ++ .../buffers_dynamic.json.j2 | 16 + .../Mellanox-SN4700-C128/hwsku.json | 388 ++++++++++++++++++ .../pg_profile_lookup.ini | 41 ++ .../Mellanox-SN4700-C128/port_config.ini | 129 ++++++ .../Mellanox-SN4700-C128/qos.json.j2 | 1 + .../Mellanox-SN4700-C128/sai.profile | 3 + .../sai_4700_128x100g.xml | 277 +++++++++++++ 12 files changed, 993 insertions(+) create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers.json.j2 create mode 120000 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_objects.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t0.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t1.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t2.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_dynamic.json.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/hwsku.json create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/pg_profile_lookup.ini create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini create mode 120000 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/qos.json.j2 create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile create mode 100644 device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers.json.j2 new file mode 100644 index 000000000000..2905747f5b04 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers.json.j2 @@ -0,0 +1,15 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_objects.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_objects.j2 new file mode 120000 index 000000000000..c01aebb7ae12 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_objects.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..f22c56702af5 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t0.j2 @@ -0,0 +1,39 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '44910592' %} +{% set ingress_lossless_pool_xoff = '1751040' %} +{% set egress_lossless_pool_size = '60817392' %} +{% set egress_lossy_pool_size = '44910592' %} + +{% import 'buffers_defaults_objects.j2' as defs with context %} + +{%- macro generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) %} +{{ defs.generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_profile_lists_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_profile_lists(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_queue_buffers(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_pg_profiles(port_names_active, port_names_inactive) }} +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..b87050280529 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t1.j2 @@ -0,0 +1,39 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '44587008' %} +{% set ingress_lossless_pool_xoff = '2074624' %} +{% set egress_lossless_pool_size = '60817392' %} +{% set egress_lossy_pool_size = '44587008' %} + +{% import 'buffers_defaults_objects.j2' as defs with context %} + +{%- macro generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) %} +{{ defs.generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_profile_lists_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_profile_lists(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_queue_buffers(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_pg_profiles(port_names_active, port_names_inactive) }} +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t2.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..b0df4defd449 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_defaults_t2.j2 @@ -0,0 +1,44 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% set default_cable = '1500m' %} +{%-set ports2cable = { + 'spinerouter_leafrouter' : '1500m', + 'spinerouter_spinerouter' : '1500m' + } +-%} +{% set ingress_lossless_pool_size = '35094528' %} +{% set ingress_lossless_pool_xoff = '11567104' %} +{% set egress_lossless_pool_size = '60817392' %} +{% set egress_lossy_pool_size = '35094528' %} + +{% import 'buffers_defaults_objects.j2' as defs with context %} + +{%- macro generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) %} +{{ defs.generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_profile_lists_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_profile_lists(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_queue_buffers_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_queue_buffers(port_names_active, port_names_inactive) }} +{%- endmacro %} + +{%- macro generate_pg_profiles_with_inactive_ports(port_names_active, port_names_inactive) %} +{{ defs.generate_pg_profiles(port_names_active, port_names_inactive) }} +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_dynamic.json.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_dynamic.json.j2 new file mode 100644 index 000000000000..4ec20f1d9e84 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/buffers_dynamic.json.j2 @@ -0,0 +1,16 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{%- set default_topo = 't2' %} +{%- set dynamic_mode = 'true' %} +{%- include 'buffers_config.j2' %} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/hwsku.json b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/hwsku.json new file mode 100644 index 000000000000..867637000a1f --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/hwsku.json @@ -0,0 +1,388 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet2": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet4": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet6": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet8": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet10": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet12": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet14": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet16": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet18": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet20": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet22": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet24": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet26": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet28": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet30": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet32": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet34": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet36": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet38": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet40": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet42": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet44": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet46": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet48": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet50": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet52": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet54": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet56": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet58": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet60": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet62": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet64": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet66": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet68": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet70": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet72": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet74": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet76": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet78": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet80": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet82": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet84": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet86": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet88": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet90": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet92": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet94": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet96": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet98": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet100": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet102": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet104": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet106": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet108": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet110": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet112": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet114": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet116": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet118": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet120": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet122": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet124": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet126": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet128": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet130": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet132": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet134": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet136": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet138": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet140": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet142": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet144": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet146": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet148": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet150": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet152": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet154": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet156": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet158": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet160": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet162": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet164": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet166": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet168": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet170": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet172": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet174": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet176": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet178": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet180": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet182": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet184": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet186": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet188": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet190": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet192": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet194": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet196": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet198": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet200": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet202": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet204": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet206": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet208": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet210": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet212": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet214": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet216": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet218": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet220": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet222": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet224": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet226": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet228": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet230": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet232": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet234": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet236": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet238": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet240": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet242": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet244": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet246": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet248": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet250": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet252": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + }, + "Ethernet254": { + "default_brkout_mode": "4x100G[50G,25G,10G,1G]" + } + } +} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/pg_profile_lookup.ini new file mode 100644 index 000000000000..7b78fb98ae37 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/pg_profile_lookup.ini @@ -0,0 +1,41 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 19456 19456 24576 0 + 25000 5m 19456 19456 26624 0 + 40000 5m 19456 19456 30720 0 + 50000 5m 19456 19456 33792 0 + 100000 5m 19456 19456 59392 0 + 200000 5m 19456 19456 66560 0 + 10000 40m 19456 19456 25600 0 + 25000 40m 19456 19456 28672 0 + 40000 40m 19456 19456 33792 0 + 50000 40m 19456 19456 36864 0 + 100000 40m 19456 19456 66560 0 + 200000 40m 19456 19456 80896 0 + 10000 300m 19456 19456 30720 0 + 25000 300m 19456 19456 41984 0 + 40000 300m 19456 19456 54272 0 + 50000 300m 19456 19456 63488 0 + 100000 300m 19456 19456 120832 0 + 200000 300m 19456 19456 188416 0 + 10000 1500m 19456 19456 55296 0 + 25000 1500m 19456 19456 103424 0 + 40000 1500m 19456 19456 153600 0 + 50000 1500m 19456 19456 187392 0 + 100000 1500m 19456 19456 366592 0 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini new file mode 100644 index 000000000000..d64b66b0b691 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini @@ -0,0 +1,129 @@ +# name lanes alias index speed +Ethernet0 0,1 etp1a 1 100000 +Ethernet2 2,3 etp1b 1 100000 +Ethernet4 4,5 etp1c 1 100000 +Ethernet6 6,7 etp1d 1 100000 +Ethernet8 8,9 etp2a 2 100000 +Ethernet10 10,11 etp2b 2 100000 +Ethernet12 12,13 etp2c 2 100000 +Ethernet14 14,15 etp2d 2 100000 +Ethernet16 16,17 etp3a 3 100000 +Ethernet18 18,19 etp3b 3 100000 +Ethernet20 20,21 etp3c 3 100000 +Ethernet22 22,23 etp3d 3 100000 +Ethernet24 24,25 etp4a 4 100000 +Ethernet26 26,27 etp4b 4 100000 +Ethernet28 28,29 etp4c 4 100000 +Ethernet30 30,31 etp4d 4 100000 +Ethernet32 32,33 etp5a 5 100000 +Ethernet34 34,35 etp5b 5 100000 +Ethernet36 36,37 etp5c 5 100000 +Ethernet38 38,39 etp5d 5 100000 +Ethernet40 40,41 etp6a 6 100000 +Ethernet42 42,43 etp6b 6 100000 +Ethernet44 44,45 etp6c 6 100000 +Ethernet46 46,47 etp6d 6 100000 +Ethernet48 48,49 etp7a 7 100000 +Ethernet50 50,51 etp7b 7 100000 +Ethernet52 52,53 etp7c 7 100000 +Ethernet54 54,55 etp7d 7 100000 +Ethernet56 56,57 etp8a 8 100000 +Ethernet58 58,59 etp8b 8 100000 +Ethernet60 60,61 etp8c 8 100000 +Ethernet62 62,63 etp8d 8 100000 +Ethernet64 64,65 etp9a 9 100000 +Ethernet66 66,67 etp9b 9 100000 +Ethernet68 68,69 etp9c 9 100000 +Ethernet70 70,71 etp9d 9 100000 +Ethernet72 72,73 etp10a 10 100000 +Ethernet74 74,75 etp10b 10 100000 +Ethernet76 76,77 etp10c 10 100000 +Ethernet78 78,79 etp10d 10 100000 +Ethernet80 80,81 etp11a 11 100000 +Ethernet82 82,83 etp11b 11 100000 +Ethernet84 84,85 etp11c 11 100000 +Ethernet86 86,87 etp11d 11 100000 +Ethernet88 88,89 etp12a 12 100000 +Ethernet90 90,91 etp12b 12 100000 +Ethernet92 92,93 etp12c 12 100000 +Ethernet94 94,95 etp12d 12 100000 +Ethernet96 96,97 etp13a 13 100000 +Ethernet98 98,99 etp13b 13 100000 +Ethernet100 100,101 etp13c 13 100000 +Ethernet102 102,103 etp13d 13 100000 +Ethernet104 104,105 etp14a 14 100000 +Ethernet106 106,107 etp14b 14 100000 +Ethernet108 108,109 etp14c 14 100000 +Ethernet110 110,111 etp14d 14 100000 +Ethernet112 112,113 etp15a 15 100000 +Ethernet114 114,115 etp15b 15 100000 +Ethernet116 116,117 etp15c 15 100000 +Ethernet118 118,119 etp15d 15 100000 +Ethernet120 120,121 etp16a 16 100000 +Ethernet122 122,123 etp16b 16 100000 +Ethernet124 124,125 etp16c 16 100000 +Ethernet126 126,127 etp16d 16 100000 +Ethernet128 128,129 etp17a 17 100000 +Ethernet130 130,131 etp17b 17 100000 +Ethernet132 132,133 etp17c 17 100000 +Ethernet134 134,135 etp17d 17 100000 +Ethernet136 136,137 etp18a 18 100000 +Ethernet138 138,139 etp18b 18 100000 +Ethernet140 140,141 etp18c 18 100000 +Ethernet142 142,143 etp18d 18 100000 +Ethernet144 144,145 etp19a 19 100000 +Ethernet146 146,147 etp19b 19 100000 +Ethernet148 148,149 etp19c 19 100000 +Ethernet150 150,151 etp19d 19 100000 +Ethernet152 152,153 etp20a 20 100000 +Ethernet154 154,155 etp20b 20 100000 +Ethernet156 156,157 etp20c 20 100000 +Ethernet158 158,159 etp20d 20 100000 +Ethernet160 160,161 etp21a 21 100000 +Ethernet162 162,163 etp21b 21 100000 +Ethernet164 164,165 etp21c 21 100000 +Ethernet166 166,167 etp21d 21 100000 +Ethernet168 168,169 etp22a 22 100000 +Ethernet170 170,171 etp22b 22 100000 +Ethernet172 172,173 etp22c 22 100000 +Ethernet174 174,175 etp22d 22 100000 +Ethernet176 176,177 etp23a 23 100000 +Ethernet178 178,179 etp23b 23 100000 +Ethernet180 180,181 etp23c 23 100000 +Ethernet182 182,183 etp23d 23 100000 +Ethernet184 184,185 etp24a 24 100000 +Ethernet186 186,187 etp24b 24 100000 +Ethernet188 188,189 etp24c 24 100000 +Ethernet190 190,191 etp24d 24 100000 +Ethernet192 192,193 etp25a 25 100000 +Ethernet194 194,195 etp25b 25 100000 +Ethernet196 196,197 etp25c 25 100000 +Ethernet198 198,199 etp25d 25 100000 +Ethernet200 200,201 etp26a 26 100000 +Ethernet202 202,203 etp26b 26 100000 +Ethernet204 204,205 etp26c 26 100000 +Ethernet206 206,207 etp26d 26 100000 +Ethernet208 208,209 etp27a 27 100000 +Ethernet210 210,211 etp27b 27 100000 +Ethernet212 212,213 etp27c 27 100000 +Ethernet214 214,215 etp27d 27 100000 +Ethernet216 216,217 etp28a 28 100000 +Ethernet218 218,219 etp28b 28 100000 +Ethernet220 220,221 etp28c 28 100000 +Ethernet222 222,223 etp28d 28 100000 +Ethernet224 224,225 etp29a 29 100000 +Ethernet226 226,227 etp29b 29 100000 +Ethernet228 228,229 etp29c 29 100000 +Ethernet230 230,231 etp29d 29 100000 +Ethernet232 232,233 etp30a 30 100000 +Ethernet234 234,235 etp30b 30 100000 +Ethernet236 236,237 etp30c 30 100000 +Ethernet238 238,239 etp30d 30 100000 +Ethernet240 240,241 etp31a 31 100000 +Ethernet242 242,243 etp31b 31 100000 +Ethernet244 244,245 etp31c 31 100000 +Ethernet246 246,247 etp31d 31 100000 +Ethernet248 248,249 etp32a 32 100000 +Ethernet250 250,251 etp32b 32 100000 +Ethernet252 252,253 etp32c 32 100000 +Ethernet254 254,255 etp32d 32 100000 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/qos.json.j2 new file mode 120000 index 000000000000..eccf286dc879 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/qos.json.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile new file mode 100644 index 000000000000..d20b5e46b843 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai.profile @@ -0,0 +1,3 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_4700_128x100g.xml +SAI_DUMP_STORE_PATH=/var/log/mellanox/sdk-dumps +SAI_DUMP_STORE_AMOUNT=10 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml new file mode 100644 index 000000000000..f5d49f8b86ab --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml @@ -0,0 +1,277 @@ + + + + + 00:02:03:04:05:00 + + + 1 + + + 32 + + + + + 1 + 8 + 17 + 3 + 1536 + 4 + + + 5 + 8 + 16 + 3 + 1536 + 4 + + + 9 + 8 + 19 + 3 + 1536 + 4 + + + 13 + 8 + 18 + 3 + 1536 + 4 + + + 17 + 8 + 21 + 3 + 1536 + 4 + + + 21 + 8 + 20 + 3 + 1536 + 4 + + + 25 + 8 + 23 + 3 + 1536 + 4 + + + 29 + 8 + 22 + 3 + 1536 + 4 + + + 33 + 8 + 29 + 3 + 1536 + 4 + + + 37 + 8 + 28 + 3 + 1536 + 4 + + + 41 + 8 + 31 + 3 + 1536 + 4 + + + 45 + 8 + 30 + 3 + 1536 + 4 + + + 49 + 8 + 25 + 3 + 1536 + 4 + + + 53 + 8 + 24 + 3 + 1536 + 4 + + + 57 + 8 + 27 + 3 + 1536 + 4 + + + 61 + 8 + 26 + 3 + 1536 + 4 + + + 65 + 8 + 14 + 3 + 1536 + 4 + + + 69 + 8 + 15 + 3 + 1536 + 4 + + + 73 + 8 + 12 + 3 + 1536 + 4 + + + 77 + 8 + 13 + 3 + 1536 + 4 + + + 81 + 8 + 10 + 3 + 1536 + 4 + + + 85 + 8 + 11 + 3 + 1536 + 4 + + + 89 + 8 + 8 + 3 + 1536 + 4 + + + 93 + 8 + 9 + 3 + 1536 + 4 + + + 97 + 8 + 2 + 3 + 1536 + 4 + + + 101 + 8 + 3 + 3 + 1536 + 4 + + + 105 + 8 + 0 + + + 3 + + + 1536 + 4 + + + 109 + 8 + 1 + 3 + 1536 + 4 + + + 113 + 8 + 6 + 3 + 1536 + 4 + + + 117 + 8 + 7 + 3 + 1536 + 4 + + + 121 + 8 + 4 + 3 + 1536 + 4 + + + 125 + 8 + 5 + 3 + 1536 + 4 + + + + From 6f06fee2e92e565963791c8cf6cbc832533b57dc Mon Sep 17 00:00:00 2001 From: gechiang <62408185+gechiang@users.noreply.github.com> Date: Thu, 11 Aug 2022 09:07:39 -0700 Subject: [PATCH 659/817] [BRCM SAI 7.1.7.1] catch up on all pending fix patches for REL_7.0/7.1 (#11693) --- platform/broadcom/sai.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index b4f5873ea3f5..8d78a89a97a5 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ -LIBSAIBCM_XGS_VERSION = 7.1.0.0-9 -LIBSAIBCM_DNX_VERSION = 7.1.0.0-9 +LIBSAIBCM_XGS_VERSION = 7.1.7.1 +LIBSAIBCM_DNX_VERSION = 7.1.7.1 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" LIBSAIBCM_DNX_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_DNX_VERSION)" From 02fd3c520c41d49b0be90f3f92f932e0e8925626 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 11 Aug 2022 19:47:20 +0200 Subject: [PATCH 660/817] [Arista] Update platform library (#11703) - Add Watchdog remaining time API - Add support for non-swappable fans via a FixedDrawer - Add ASIC voltage tweaks for PikeZ product - Add better pylint support - Fix reboot-cause decision issue for future products - Fix thermal issue for RJ45 ports - Deprecate Catalina prototype support --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 455c983efa18..d570713cdf71 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 455c983efa18c6c346e776ee69c7abd54207c6c5 +Subproject commit d570713cdf715ea9d722a0a8cf606148edc359f8 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 455c983efa18..d570713cdf71 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 455c983efa18c6c346e776ee69c7abd54207c6c5 +Subproject commit d570713cdf715ea9d722a0a8cf606148edc359f8 From f601f2f47a670a302c4830cec9c9f94847df3a70 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Thu, 11 Aug 2022 20:48:31 +0300 Subject: [PATCH 661/817] [submodule] Advance sonic-utilities pointer (#11698) Update sonic-utilities submodule pointer to include the following: * Convert IPv6 addresses to lowercase in apply-patch ([#2299](https://github.com/sonic-net/sonic-utilities/pull/2299)) * [CLI] Move hostname, mgmt interface/vrf config to hostcfgd ([#2173](https://github.com/sonic-net/sonic-utilities/pull/2173)) * [config][muxcable] add support to enable/disable ycable telemetry ([#2297](https://github.com/sonic-net/sonic-utilities/pull/2297)) Signed-off-by: dprital --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index be1866fd3f9d..28b6ba5fc11f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit be1866fd3f9d2555c4036e9f1a9b820ae6d5c889 +Subproject commit 28b6ba5fc11f65abaf421c70159a605d233eda41 From 43aa42f81f32a2831f64c34deef1c53161124c29 Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:50:50 -0700 Subject: [PATCH 662/817] Update sonic-swss-common submodule (#11688) Why I did it Update sonic-swss-common submodule to include events API that will be used to stream structured events Contains only: ecc13b2 2022-08-10 | APIs to support streaming structured events (https://github.com/sonic-net/sonic-buildimage/pull/667) [Zain Budhwani] How I did it Pull from latest commit in sonic-swss-common How to verify it Look at pointer for sonic-swss-common --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 515c09a9393d..ecc13b26f70c 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 515c09a9393d3ffabc55cbe8f0fe5969f73292a8 +Subproject commit ecc13b26f70c22812eda4c03ddcc063ed800d8b7 From 23dcfdf9b672a1f637f618741ca26c31490fe623 Mon Sep 17 00:00:00 2001 From: Nikola Dancejic <26731235+Ndancejic@users.noreply.github.com> Date: Fri, 12 Aug 2022 11:34:10 -0700 Subject: [PATCH 663/817] [swss] Adding conditional for bgp when on multi ASIC platform (#11691) bgp should be a per-asic service, and runs for each namespace on multi-asic platforms. However, putting bgp in MULTI_INST_DEPENDENT causes swss to be restarted as well as bgp. this is causing issues after #11000 Issue: #11653 This fix: removes bgp from dependents list adds a conditional that either adds bgp, or bgp@$DEV to separate between single and multi-asic platforms --- files/scripts/swss.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index c1a46ced35a4..3ab4242c902f 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -9,7 +9,9 @@ LOCKFILE="/tmp/swss-syncd-lock$DEV" NAMESPACE_PREFIX="asic" ETC_SONIC_PATH="/etc/sonic/" -DEPENDENT="radv bgp" +# DEPENDENT initially contains namespace independent services +# namespace specific services are added later in this script. +DEPENDENT="radv" MULTI_INST_DEPENDENT="teamd" . /usr/local/bin/asic_status.sh @@ -309,9 +311,11 @@ function check_peer_gbsyncd() if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace SONIC_DB_CLI="sonic-db-cli -n $NET_NS" + DEPENDENT+=" bgp@${DEV}" else NET_NS="" SONIC_DB_CLI="sonic-db-cli" + DEPENDENT+=" bgp" fi check_peer_gbsyncd From 743625c2b48dbda3735c38e6002b40b246bd7e28 Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Fri, 12 Aug 2022 11:55:18 -0700 Subject: [PATCH 664/817] [Chassis] parse 400g zr port config from minigraph (#11616) Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan arlakshm@microsoft.com Why I did it Generate the port configuration required 400G ZR port from minigraph. How I did it Add parse logic to get tx_power and laser_freq from LinkMetadata section of the minigraph. Add UT for packet-chassis and voq chassis How to verify it UT Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 20 ++++++++++++++++++- .../tests/sample-chassis-packet-lc-graph.xml | 19 ++++++++++++++++++ .../tests/sample-voq-graph.xml | 14 +++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 14 +++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 4e573cd22a4f..d267c24976bf 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -973,7 +973,8 @@ def parse_linkmeta(meta, hname): lower_tor_hostname = '' auto_negotiation = None macsec_enabled = False - + tx_power = None + laser_freq = None properties = linkmeta.find(str(QName(ns1, "Properties"))) for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))): name = device_property.find(str(QName(ns1, "Name"))).text @@ -990,6 +991,10 @@ def parse_linkmeta(meta, hname): auto_negotiation = value elif name == "MacSecEnabled": macsec_enabled = value + elif name == "TxPower": + tx_power = value + elif name == "Frequency": + laser_freq = value linkmetas[port] = {} if fec_disabled: @@ -1003,6 +1008,11 @@ def parse_linkmeta(meta, hname): linkmetas[port]["AutoNegotiation"] = auto_negotiation if macsec_enabled: linkmetas[port]["MacSecEnabled"] = macsec_enabled + if tx_power: + linkmetas[port]["tx_power"] = tx_power + # Convert the freq in GHz + if laser_freq: + linkmetas[port]["laser_freq"] = int(float(laser_freq)*1000) return linkmetas def parse_macsec_profile(val_string): @@ -1615,6 +1625,14 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if macsec_enabled and 'PrimaryKey' in macsec_profile: port['macsec'] = macsec_profile['PrimaryKey'] + tx_power = linkmetas.get(alias, {}).get('tx_power') + if tx_power: + port['tx_power'] = tx_power + + laser_freq = linkmetas.get(alias, {}).get('laser_freq') + if laser_freq: + port['laser_freq'] = laser_freq + # set port description if parsed from deviceinfo for port_name in port_descriptions: # ignore port not in port_config.ini diff --git a/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml b/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml index ac83d87b96ca..6b22d30336c7 100644 --- a/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml +++ b/src/sonic-config-engine/tests/sample-chassis-packet-lc-graph.xml @@ -222,6 +222,25 @@ + + + + + + + Frequency + 131 + + + TxPower + 7.5 + + + str2-8808-lc2-1:Eth1/1/13;ARISTA01-RH:Ethernet1/1 + + + + diff --git a/src/sonic-config-engine/tests/sample-voq-graph.xml b/src/sonic-config-engine/tests/sample-voq-graph.xml index f1fa43620345..a43e64cf6599 100644 --- a/src/sonic-config-engine/tests/sample-voq-graph.xml +++ b/src/sonic-config-engine/tests/sample-voq-graph.xml @@ -79,6 +79,20 @@ linecard-1:Ethernet1/1;ARISTA01-RH:Ethernet1/1
+ + + + + Frequency + 195.875 + + + TxPower + -10 + + + linecard-1:Ethernet2/1;ARISTA01-RH:Ethernet1/1 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 232fded47eb5..1190ef9680e5 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -1008,3 +1008,17 @@ def test_minigraph_bgp_packet_chassis_vlan_subintf(self): utils.to_dict(output.strip()), utils.to_dict("{('PortChannel32.2', '192.168.1.4/24'): {}, 'PortChannel32.2': {'admin_status': 'up'}, ('PortChannel33.2', '192.168.2.4/24'): {}, 'PortChannel33.2': {'admin_status': 'up'}}") ) + + def test_minigraph_voq_400g_zr_port_config(self): + argument = "-j {} -m {} -p {} -v \"PORT[\'Ethernet4\']\"".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config) + output = self.run_script(argument) + output_dict = utils.to_dict(output.strip()) + self.assertEqual(output_dict['tx_power'], '-10') + self.assertEqual(output_dict['laser_freq'], 195875) + + def test_minigraph_packet_chassis_400g_zr_port_config(self): + argument = "-m {} -p {} -n asic1 -v \"PORT[\'Ethernet13\']\"".format(self.packet_chassis_graph, self.packet_chassis_port_ini) + output = self.run_script(argument) + output_dict = utils.to_dict(output.strip()) + self.assertEqual(output_dict['tx_power'], '7.5') + self.assertEqual(output_dict['laser_freq'], 131000) \ No newline at end of file From 8d6431e754d2f964d1442453805bbcc31e48f7bb Mon Sep 17 00:00:00 2001 From: lixiaoyuner <35456895+lixiaoyuner@users.noreply.github.com> Date: Sat, 13 Aug 2022 23:01:35 +0800 Subject: [PATCH 665/817] Add k8s master feature (#11637) * Add k8s master feature Signed-off-by: Yun Li * Update kubernetes version mistake and make variable passing clear Signed-off-by: Yun Li * Add CRI-dockerd package Signed-off-by: Yun Li * Update version variable passing logic Signed-off-by: Yun Li * Upgrade the worker kubernetes version Signed-off-by: Yun Li * Install xml file parse tool Signed-off-by: Yun Li Signed-off-by: Yun Li --- Makefile.work | 2 + build_debian.sh | 47 +++++++++++++++---- .../build_templates/sonic_debian_extension.j2 | 21 +++++++++ .../kubernetes/kubernetes_master_entrance.sh | 2 + rules/config | 21 +++++++-- slave.mk | 8 ++++ 6 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 files/image_config/kubernetes/kubernetes_master_entrance.sh diff --git a/Makefile.work b/Makefile.work index 107134cf0979..3f64531ab11c 100644 --- a/Makefile.work +++ b/Makefile.work @@ -10,6 +10,7 @@ # * ENABLE_ZTP: Enables zero touch provisioning. # * SHUTDOWN_BGP_ON_START: Sets admin-down state for all bgp peerings after restart. # * INCLUDE_KUBERNETES: Allows including Kubernetes +# * INCLUDE_KUBERNETES_MASTER: Allows including Kubernetes master # * INCLUDE_MUX: Include MUX feature/services for TOR switch. # * ENABLE_PFCWD_ON_START: Enable PFC Watchdog (PFCWD) on server-facing ports # * by default for TOR switch. @@ -366,6 +367,7 @@ SONIC_BUILD_INSTRUCTION := make \ KUBERNETES_VERSION=$(KUBERNETES_VERSION) \ KUBERNETES_CNI_VERSION=$(KUBERNETES_CNI_VERSION) \ K8s_GCR_IO_PAUSE_VERSION=$(K8s_GCR_IO_PAUSE_VERSION) \ + INCLUDE_KUBERNETES_MASTER=$(INCLUDE_KUBERNETES_MASTER) \ SONIC_ENABLE_PFCWD_ON_START=$(ENABLE_PFCWD_ON_START) \ SONIC_ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ SONIC_INSTALL_DEBUG_TOOLS=$(INSTALL_DEBUG_TOOLS) \ diff --git a/build_debian.sh b/build_debian.sh index 7947aef22d64..927b051d2887 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -253,24 +253,55 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSIO # pip version of 'PyGObject' will be installed during installation of 'sonic-host-services' sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove software-properties-common gnupg2 python3-gi -if [ "$INCLUDE_KUBERNETES" == "y" ] -then - ## Install Kubernetes - echo '[INFO] Install kubernetes' +install_kubernetes () { + local ver="$1" sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -fsSL \ https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - ## Check out the sources list update matches current Debian version sudo cp files/image_config/kubernetes/kubernetes.list $FILESYSTEM_ROOT/etc/apt/sources.list.d/ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubernetes-cni=${KUBERNETES_CNI_VERSION}-00 - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubelet=${KUBERNETES_VERSION}-00 - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubectl=${KUBERNETES_VERSION}-00 - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubeadm=${KUBERNETES_VERSION}-00 + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubelet=${ver} + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubectl=${ver} + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubeadm=${ver} +} + +if [ "$INCLUDE_KUBERNETES" == "y" ] +then + ## Install Kubernetes + echo '[INFO] Install kubernetes' + install_kubernetes ${KUBERNETES_VERSION} + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubernetes-cni=${KUBERNETES_CNI_VERSION} else echo '[INFO] Skipping Install kubernetes' fi +if [ "$INCLUDE_KUBERNETES_MASTER" == "y" ] +then + ## Install Kubernetes master + echo '[INFO] Install kubernetes master' + install_kubernetes ${MASTER_KUBERNETES_VERSION} + + sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -fsSL \ + https://packages.microsoft.com/keys/microsoft.asc | \ + sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - + sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -fsSL \ + https://packages.microsoft.com/keys/msopentech.asc | \ + sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - + echo "deb [arch=amd64] https://packages.microsoft.com/repos/azurecore-debian $IMAGE_DISTRO main" | \ + sudo tee $FILESYSTEM_ROOT/etc/apt/sources.list.d/azure.list + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install hyperv-daemons gnupg xmlstarlet + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install metricsext2 + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove gnupg + sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT curl -o /tmp/cri-dockerd.deb -fsSL \ + https://github.com/Mirantis/cri-dockerd/releases/download/v${MASTER_CRI_DOCKERD}/cri-dockerd_${MASTER_CRI_DOCKERD}.3-0.debian-${IMAGE_DISTRO}_amd64.deb + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install -f /tmp/cri-dockerd.deb + sudo LANG=C chroot $FILESYSTEM_ROOT rm -f /tmp/cri-dockerd.deb +else + echo '[INFO] Skipping Install kubernetes master' +fi + ## Add docker config drop-in to specify dockerd command line sudo mkdir -p $FILESYSTEM_ROOT/etc/systemd/system/docker.service.d/ ## Note: $_ means last argument of last command diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index a15822046b61..4b7a77b3151c 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -731,6 +731,27 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIV echo "docker images pull complete" {% endif %} +{% if include_kubernetes_master == "y" %} +# Pull in kubernetes master docker images +echo "pulling kubernetes master images ..." +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/pause:${MASTER_PAUSE_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/kube-apiserver:${MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/kube-controller-manager:${MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/kube-scheduler:${MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/kube-proxy:${MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/coredns/coredns:${MASTER_COREDNS_VERSION} +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT docker $SONIC_NATIVE_DOCKERD_FOR_DOCKERFS pull k8s.gcr.io/etcd:${MASTER_ETCD_VERSION} +echo "kubernetes master docker images pull complete" +# Install python package for mdm service usage +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install psutil +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install statsd +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable mdm.service +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable kubelet.service +# Add kubernetes master entrance +sudo cp files/image_config/kubernetes/kubernetes_master_entrance.sh $FILESYSTEM_ROOT/usr/sbin/ +sudo sed -i '/^exit 0/i\bash /usr/sbin/kubernetes_master_entrance.sh' $FILESYSTEM_ROOT/etc/rc.local +{% endif %} + {% macro get_install_options(set_owner, enabled) -%} {% set args = ["-y", "-v", "DEBUG"] -%} {% if set_owner -%} diff --git a/files/image_config/kubernetes/kubernetes_master_entrance.sh b/files/image_config/kubernetes/kubernetes_master_entrance.sh new file mode 100644 index 000000000000..b7695a61cae5 --- /dev/null +++ b/files/image_config/kubernetes/kubernetes_master_entrance.sh @@ -0,0 +1,2 @@ +# This script is for kubernetes master image usage +# Will mount kubernetes master disk and execute kubernetes entrance script diff --git a/rules/config b/rules/config index 23622bcc8740..380b28bc7cd5 100644 --- a/rules/config +++ b/rules/config @@ -174,9 +174,24 @@ KUBE_DOCKER_PROXY = http://172.16.1.1:3128/ # These are Used *only* when INCLUDE_KUBERNETES=y # NOTE: As a worker node it has to run version compatible to kubernetes master. # -KUBERNETES_VERSION = 1.21.1 -KUBERNETES_CNI_VERSION = 0.8.7 -K8s_GCR_IO_PAUSE_VERSION = 3.4.1 +KUBERNETES_VERSION = 1.22.2-00 +KUBERNETES_CNI_VERSION = 0.8.7-00 +K8s_GCR_IO_PAUSE_VERSION = 3.5 + +# INCLUDE_KUBERNETES_MASTER - if set to y kubernetes packages are installed o be able +# to run as master node in kubernetes cluster +INCLUDE_KUBERNETES_MASTER ?= n + +# MASTER_KUBERNETES_VERSION - version of k8s components +# MASTER_PAUSE_VERSION - version of pause container image +# MASTER_COREDNS_VERSION - version of coredns container image +# MASTER_ETCD_VERSION = version of etcd container image +MASTER_KUBERNETES_VERSION = 1.22.2-00 +MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION = v1.22.2 +MASTER_PAUSE_VERSION = 3.5 +MASTER_COREDNS_VERSION = v1.8.4 +MASTER_ETCD_VERSION = 3.5.0-0 +MASTER_CRI_DOCKERD = 0.2.5 # SONIC_ENABLE_IMAGE_SIGNATURE - enable image signature # To not use the auto-generated self-signed certificate, the required files to sign the image as below: diff --git a/slave.mk b/slave.mk index 2e648b37f4c8..e1f4a0ef80d9 100644 --- a/slave.mk +++ b/slave.mk @@ -385,6 +385,7 @@ $(info "INCLUDE_NAT" : "$(INCLUDE_NAT)") $(info "INCLUDE_DHCP_RELAY" : "$(INCLUDE_DHCP_RELAY)") $(info "INCLUDE_P4RT" : "$(INCLUDE_P4RT)") $(info "INCLUDE_KUBERNETES" : "$(INCLUDE_KUBERNETES)") +$(info "INCLUDE_KUBERNETES_MASTER" : "$(INCLUDE_KUBERNETES_MASTER)") $(info "INCLUDE_MACSEC" : "$(INCLUDE_MACSEC)") $(info "INCLUDE_MUX" : "$(INCLUDE_MUX)") $(info "INCLUDE_BOOTCHART : "$(INCLUDE_BOOTCHART)") @@ -1188,6 +1189,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export shutdown_bgp_on_start="$(SHUTDOWN_BGP_ON_START)" export default_buffer_model="$(SONIC_BUFFER_MODEL)" export include_kubernetes="$(INCLUDE_KUBERNETES)" + export include_kubernetes_master="$(INCLUDE_KUBERNETES_MASTER)" export kube_docker_proxy="$(KUBE_DOCKER_PROXY)" export enable_pfcwd_on_start="$(ENABLE_PFCWD_ON_START)" export installer_debs="$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$($*_INSTALLS) $(FIPS_BASEIMAGE_INSTALLERS))" @@ -1358,6 +1360,12 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ + MASTER_KUBERNETES_VERSION=$(MASTER_KUBERNETES_VERSION) \ + MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION=$(MASTER_KUBERNETES_CONTAINER_IMAGE_VERSION) \ + MASTER_PAUSE_VERSION=$(MASTER_PAUSE_VERSION) \ + MASTER_COREDNS_VERSION=$(MASTER_COREDNS_VERSION) \ + MASTER_ETCD_VERSION=$(MASTER_ETCD_VERSION) \ + MASTER_CRI_DOCKERD=$(MASTER_CRI_DOCKERD) \ ./build_debian.sh $(LOG) USERNAME="$(USERNAME)" \ From 027bc7f04405cf94b4d826a898aa7356c55ae366 Mon Sep 17 00:00:00 2001 From: DavidZagury <32644413+DavidZagury@users.noreply.github.com> Date: Mon, 15 Aug 2022 11:47:56 +0300 Subject: [PATCH 666/817] [Mellanox] Add support for Service Port in SN5600 (#11609) - Why I did it SN5600 has an additional service interface with a different parameters than other interfaces. - How I did it Added the etp65 interface with the correct parameters. - How to verify it Run platform test on SN5600 platform. Check the service port can startup correctly. --- .../ACS-SN5600/hwsku.json | 3 +++ .../ACS-SN5600/port_config.ini | 1 + .../ACS-SN5600/sai_5600.xml | 11 +++++++++-- .../x86_64-nvidia_sn5600_simx-r0/platform.json | 7 +++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/hwsku.json b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/hwsku.json index 9eaac1e2cf86..3593da62c767 100644 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/hwsku.json +++ b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/hwsku.json @@ -191,6 +191,9 @@ }, "Ethernet504": { "default_brkout_mode": "1x800G[400G,200G,100G,50G,40G,25G,10G]" + }, + "Ethernet512": { + "default_brkout_mode": "1x25G[10G]" } } } diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/port_config.ini b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/port_config.ini index 591fe2a7d428..6ba6991bd002 100644 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/port_config.ini +++ b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/port_config.ini @@ -79,3 +79,4 @@ Ethernet480 480,481,482,483,484,485,486,487 etp61 61 Ethernet488 488,489,490,491,492,493,494,495 etp62 62 Ethernet496 496,497,498,499,500,501,502,503 etp63 63 Ethernet504 504,505,506,507,508,509,510,511 etp64 64 +Ethernet512 512 etp65 65 diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai_5600.xml b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai_5600.xml index b9ef3af7a82a..7fe318fc0808 100644 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai_5600.xml +++ b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/ACS-SN5600/sai_5600.xml @@ -25,7 +25,7 @@ 1 - 64 + 65 @@ -306,7 +306,7 @@ 153 8 - 26 + 26 3 1536 @@ -489,6 +489,13 @@ 3 1536 + + 257 + 1 + 64 + 0 + 64 + diff --git a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform.json b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform.json index fdc689855c80..a3bd96c7cd74 100644 --- a/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform.json +++ b/device/mellanox/x86_64-nvidia_sn5600_simx-r0/platform.json @@ -1277,6 +1277,13 @@ "4x200G[100G,50G,25G,10G]": ["etp64a", "etp64b", "etp64c", "etp64d"], "8x100G[50G,25G,10G]": ["etp64a", "etp64b", "etp64c", "etp64d", "etp64e", "etp64f", "etp64g", "etp64h"] } + }, + "Ethernet512": { + "index": "65", + "lanes": "512", + "breakout_modes": { + "1x25G[10G]": ["etp65"] + } } } } From a66941a6cec22416a09ff72f313962caab73f4db Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Mon, 15 Aug 2022 23:35:34 +0300 Subject: [PATCH 667/817] [syncd.sh] 'sxdkernel start' => 'sxdkernel restart' (#11718) Change `sxdkernel start` to `sxdkernel restart`. If `syncd` service crashes in `ExecStartPre` systemd will not call `ExecStop` and thus will not call `sxdkernel stop`. Use of `sxdkernel restart` is more robust in terms of guarantees to restore the system after unexpected crashes. Signed-off-by: Stepan Blyschak Signed-off-by: Stepan Blyschak --- files/scripts/syncd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index 10535a8ff448..812cf30e4001 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -24,7 +24,7 @@ function startplatform() { debug "Starting Firmware update procedure" /usr/bin/mst start --with_i2cdev /usr/bin/mlnx-fw-upgrade.sh - /etc/init.d/sxdkernel start + /etc/init.d/sxdkernel restart debug "Firmware update procedure ended" fi From 485edbfd67530744f9ce39c2e6878731a33ef1ae Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Tue, 16 Aug 2022 07:50:04 +0800 Subject: [PATCH 668/817] Disable tunnel qos remap on KVM (#11735) --- src/sonic-config-engine/minigraph.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index d267c24976bf..9518678bb5b7 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1460,7 +1460,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw # Enable tunnel_qos_remap if downstream_redundancy_types(T1) or redundancy_type(T0) = Gemini/Libra enable_tunnel_qos_map = False - if results['DEVICE_METADATA']['localhost']['type'].lower() == 'leafrouter' and ('gemini' in str(downstream_redundancy_types).lower() or 'libra' in str(downstream_redundancy_types).lower()): + if platform and 'kvm' in platform: + enable_tunnel_qos_map = False + elif results['DEVICE_METADATA']['localhost']['type'].lower() == 'leafrouter' and ('gemini' in str(downstream_redundancy_types).lower() or 'libra' in str(downstream_redundancy_types).lower()): enable_tunnel_qos_map = True elif results['DEVICE_METADATA']['localhost']['type'].lower() == 'torrouter' and ('gemini' in str(redundancy_type).lower() or 'libra' in str(redundancy_type).lower()): enable_tunnel_qos_map = True From 6f9f765f1e3f25c17eb5543483129a1bcfa441ab Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Tue, 16 Aug 2022 09:11:45 -0700 Subject: [PATCH 669/817] Updating sonic-swss pointer to latest (#11690) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index d36c17d62c17..fd0c585d34de 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit d36c17d62c17b7ae2617868989891bc7bb8c72f8 +Subproject commit fd0c585d34de63dc9cca57bb7d508cadfe1125d4 From 055b7d5fad0c40f5b4d1f0fe0b056e569799ab7c Mon Sep 17 00:00:00 2001 From: Michael Li <52540620+michaelli10@users.noreply.github.com> Date: Tue, 16 Aug 2022 11:46:03 -0700 Subject: [PATCH 670/817] =?UTF-8?q?Update=20BRCM=20KNET=20modules=20to=20s?= =?UTF-8?q?upport=20new=20psample=20definitions=20from=20sflow=E2=80=A6=20?= =?UTF-8?q?(#11709)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update BRCM KNET module to support new psample definitions from sflow dropmon feature * Update BRCM KNET module to support new psample definitions from sflow dropmon feature * Advance saibcm-modules-dnx --- platform/broadcom/saibcm-modules-dnx | 2 +- .../debian/opennsl-modules.init | 11 +- .../broadcom/saibcm-modules/sdklt/Makefile | 17 +- .../sdklt/linux/include/net/psample.h | 24 -- .../sdklt/linux/include/uapi/linux/psample.h | 35 -- .../sdklt/linux/knetcb/psample-cb.c | 10 +- .../saibcm-modules/sdklt/linux/psample/Kbuild | 18 -- .../sdklt/linux/psample/Makefile | 21 -- .../sdklt/linux/psample/psample.c | 302 ----------------- .../kernel/modules/include/net/psample.h | 24 -- .../modules/include/uapi/linux/psample.h | 35 -- .../linux/kernel/modules/knet-cb/Makefile | 6 - .../linux/kernel/modules/knet-cb/psample-cb.c | 12 +- .../linux/kernel/modules/psample/Makefile | 64 ---- .../linux/kernel/modules/psample/psample.c | 304 ------------------ .../systems/linux/user/common/Makefile | 16 +- src/sonic-linux-kernel | 2 +- 17 files changed, 22 insertions(+), 881 deletions(-) delete mode 100644 platform/broadcom/saibcm-modules/sdklt/linux/include/net/psample.h delete mode 100644 platform/broadcom/saibcm-modules/sdklt/linux/include/uapi/linux/psample.h delete mode 100644 platform/broadcom/saibcm-modules/sdklt/linux/psample/Kbuild delete mode 100644 platform/broadcom/saibcm-modules/sdklt/linux/psample/Makefile delete mode 100644 platform/broadcom/saibcm-modules/sdklt/linux/psample/psample.c delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/net/psample.h delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/uapi/linux/psample.h delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/Makefile delete mode 100644 platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c diff --git a/platform/broadcom/saibcm-modules-dnx b/platform/broadcom/saibcm-modules-dnx index 8771baa40be8..65bce4ea8315 160000 --- a/platform/broadcom/saibcm-modules-dnx +++ b/platform/broadcom/saibcm-modules-dnx @@ -1 +1 @@ -Subproject commit 8771baa40be8392c2cf662648fc166929efa4b64 +Subproject commit 65bce4ea8315a7cd0875b3ea2f5c35423f32f868 diff --git a/platform/broadcom/saibcm-modules/debian/opennsl-modules.init b/platform/broadcom/saibcm-modules/debian/opennsl-modules.init index 62274eaa36aa..e8e9e23f2815 100755 --- a/platform/broadcom/saibcm-modules/debian/opennsl-modules.init +++ b/platform/broadcom/saibcm-modules/debian/opennsl-modules.init @@ -45,17 +45,14 @@ function create_devices() function load_kernel_modules() { if [[ $is_ltsw_chip -eq 1 ]]; then - insmod /lib/modules/$(uname -r)/extra/psample.ko + modprobe psample modprobe linux_ngbde modprobe linux_ngknet modprobe linux_ngknetcb else modprobe linux-kernel-bde dmasize=$dmasize maxpayload=128 debug=4 dma_debug=1 usemsi=$usemsi modprobe linux-user-bde - - # Using insmod with absolute path for psample to make sure bcm psample is loaded. - # There is a different psample.ko module getting created at net/psample/psample.ko - insmod /lib/modules/$(uname -r)/extra/psample.ko + modprobe psample modprobe linux-bcm-knet use_rx_skb=1 rx_buffer_size=9238 debug=0x5020 default_mtu=9100 modprobe linux-knet-cb @@ -69,9 +66,9 @@ function remove_kernel_modules() rmmod linux_ngknetcb rmmod linux_ngknet rmmod linux_ngbde - rmmod psample.ko + rmmod psample else - rmmod psample.ko + rmmod psample rmmod linux-knet-cb rmmod linux-bcm-knet rmmod linux-user-bde diff --git a/platform/broadcom/saibcm-modules/sdklt/Makefile b/platform/broadcom/saibcm-modules/sdklt/Makefile index 83a77ebcd1e0..1ce04c788a32 100644 --- a/platform/broadcom/saibcm-modules/sdklt/Makefile +++ b/platform/broadcom/saibcm-modules/sdklt/Makefile @@ -44,12 +44,7 @@ export CROSS_COMPILE override SDK := $(CURDIR) -ifeq ($(BUILD_PSAMPLE),1) -PSAMPLE=psample -PSAMPLE_SYMVERS=$(SDK)/linux/psample/Module.symvers -endif - -kmod: bde knet knetcb $(PSAMPLE) +kmod: bde knet knetcb bde: $(MAKE) -C $(SDK)/linux/bde SDK=$(SDK) \ @@ -62,20 +57,12 @@ knet: bde $(TARGET) ln -sf $(SDK)/linux/knet/*.ko -knetcb: knet $(PSAMPLE) +knetcb: knet $(MAKE) -C $(SDK)/linux/knetcb SDK=$(SDK) \ KBUILD_EXTRA_SYMBOLS=$(SDK)/linux/knet/Module.symvers \ - KBUILD_EXTRA_SYMBOLS+=$(PSAMPLE_SYMVERS) \ $(TARGET) ln -sf $(SDK)/linux/knetcb/*.ko -ifeq ($(BUILD_PSAMPLE),1) -$(PSAMPLE): - $(MAKE) -C $(SDK)/linux/psample SDK=$(SDK) \ - $(TARGET) - ln -sf $(SDK)/linux/psample/*.ko -endif - clean: $(MAKE) kmod TARGET=clean rm -f *.ko diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/include/net/psample.h b/platform/broadcom/saibcm-modules/sdklt/linux/include/net/psample.h deleted file mode 100644 index 64188c95daeb..000000000000 --- a/platform/broadcom/saibcm-modules/sdklt/linux/include/net/psample.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __NET_PSAMPLE_H -#define __NET_PSAMPLE_H - -#include -#include -#include -#include - -struct psample_group { - struct list_head list; - struct net *net; - u32 group_num; - u32 refcount; - u32 seq; -}; - -extern struct psample_group *psample_group_get(struct net *net, u32 group_num); -extern void psample_group_put(struct psample_group *group); - -extern void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, - u32 trunc_size, int in_ifindex, int out_ifindex, - u32 sample_rate); - -#endif /* __NET_PSAMPLE_H */ diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/include/uapi/linux/psample.h b/platform/broadcom/saibcm-modules/sdklt/linux/include/uapi/linux/psample.h deleted file mode 100644 index ed48996ec0e8..000000000000 --- a/platform/broadcom/saibcm-modules/sdklt/linux/include/uapi/linux/psample.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __UAPI_PSAMPLE_H -#define __UAPI_PSAMPLE_H - -enum { - /* sampled packet metadata */ - PSAMPLE_ATTR_IIFINDEX, - PSAMPLE_ATTR_OIFINDEX, - PSAMPLE_ATTR_ORIGSIZE, - PSAMPLE_ATTR_SAMPLE_GROUP, - PSAMPLE_ATTR_GROUP_SEQ, - PSAMPLE_ATTR_SAMPLE_RATE, - PSAMPLE_ATTR_DATA, - - /* commands attributes */ - PSAMPLE_ATTR_GROUP_REFCOUNT, - - __PSAMPLE_ATTR_MAX -}; - -enum psample_command { - PSAMPLE_CMD_SAMPLE, - PSAMPLE_CMD_GET_GROUP, - PSAMPLE_CMD_NEW_GROUP, - PSAMPLE_CMD_DEL_GROUP, -}; - -/* Can be overridden at runtime by module option */ -#define PSAMPLE_ATTR_MAX (__PSAMPLE_ATTR_MAX - 1) - -#define PSAMPLE_NL_MCGRP_CONFIG_NAME "config" -#define PSAMPLE_NL_MCGRP_SAMPLE_NAME "packets" -#define PSAMPLE_GENL_NAME "psample" -#define PSAMPLE_GENL_VERSION 1 - -#endif diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/knetcb/psample-cb.c b/platform/broadcom/saibcm-modules/sdklt/linux/knetcb/psample-cb.c index a35c21cf37f4..142357134ff1 100644 --- a/platform/broadcom/saibcm-modules/sdklt/linux/knetcb/psample-cb.c +++ b/platform/broadcom/saibcm-modules/sdklt/linux/knetcb/psample-cb.c @@ -251,6 +251,7 @@ psample_task(struct work_struct *work) unsigned long flags; struct list_head *list_ptr, *list_next; psample_pkt_t *pkt; + struct psample_metadata md = {0}; spin_lock_irqsave(&psample_work->lock, flags); list_for_each_safe(list_ptr, list_next, &psample_work->pkt_list) { @@ -267,12 +268,13 @@ psample_task(struct work_struct *work) pkt->meta.trunc_size, pkt->meta.src_ifindex, pkt->meta.dst_ifindex, pkt->meta.sample_rate); + md.trunc_size = pkt->meta.trunc_size; + md.in_ifindex = pkt->meta.src_ifindex; + md.out_ifindex = pkt->meta.dst_ifindex; psample_sample_packet(pkt->group, pkt->skb, - pkt->meta.trunc_size, - pkt->meta.src_ifindex, - pkt->meta.dst_ifindex, - pkt->meta.sample_rate); + pkt->meta.sample_rate, + &md); g_psample_stats.pkts_f_psample_mod++; dev_kfree_skb_any(pkt->skb); diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/psample/Kbuild b/platform/broadcom/saibcm-modules/sdklt/linux/psample/Kbuild deleted file mode 100644 index 0049e399076b..000000000000 --- a/platform/broadcom/saibcm-modules/sdklt/linux/psample/Kbuild +++ /dev/null @@ -1,18 +0,0 @@ -# -*- Kbuild -*- -# -# Linux psample module. -# -# $Copyright: (c) 2020 Broadcom. -# Broadcom Proprietary and Confidential. All rights reserved.$ -# - -obj-m := linux_psample.o - -ccflags-y := $(LKM_CFLAGS) \ - -I$(SDK)/shr/include \ - -I$(SDK)/bcmdrd/include \ - -I$(SDK)/linux/include \ - -I$(SDK)/linux/knet/include \ - -I$(SDK)/linux/knet - -linux_psample-y := psample.o diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/psample/Makefile b/platform/broadcom/saibcm-modules/sdklt/linux/psample/Makefile deleted file mode 100644 index b37b8ebb1c29..000000000000 --- a/platform/broadcom/saibcm-modules/sdklt/linux/psample/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# -*- Makefile -*- -# -# Linux psample module. -# -# $Copyright: (c) 2020 Broadcom. -# Broadcom Proprietary and Confidential. All rights reserved.$ -# - -include Kbuild - -ifeq ($(KERNELRELEASE),) - -MOD_NAME = linux_psample - -include $(SDK)/make/lkm.mk - -endif - -.PHONY: distclean - -distclean: diff --git a/platform/broadcom/saibcm-modules/sdklt/linux/psample/psample.c b/platform/broadcom/saibcm-modules/sdklt/linux/psample/psample.c deleted file mode 100644 index f0c9beab5784..000000000000 --- a/platform/broadcom/saibcm-modules/sdklt/linux/psample/psample.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * net/psample/psample.c - Netlink channel for packet sampling - * Copyright (c) 2017 Yotam Gigi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PSAMPLE_MAX_PACKET_SIZE 0xffff - -static LIST_HEAD(psample_groups_list); -static DEFINE_SPINLOCK(psample_groups_lock); - -/* multicast groups */ -enum psample_nl_multicast_groups { - PSAMPLE_NL_MCGRP_CONFIG, - PSAMPLE_NL_MCGRP_SAMPLE, -}; - -static const struct genl_multicast_group psample_nl_mcgrps[] = { - [PSAMPLE_NL_MCGRP_CONFIG] = { .name = PSAMPLE_NL_MCGRP_CONFIG_NAME }, - [PSAMPLE_NL_MCGRP_SAMPLE] = { .name = PSAMPLE_NL_MCGRP_SAMPLE_NAME }, -}; - -static struct genl_family psample_nl_family; - -static int psample_group_nl_fill(struct sk_buff *msg, - struct psample_group *group, - enum psample_command cmd, u32 portid, u32 seq, - int flags) -{ - void *hdr; - int ret; - - hdr = genlmsg_put(msg, portid, seq, &psample_nl_family, flags, cmd); - if (!hdr) - return -EMSGSIZE; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_SAMPLE_GROUP, group->group_num); - if (ret < 0) - goto error; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_GROUP_REFCOUNT, group->refcount); - if (ret < 0) - goto error; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_GROUP_SEQ, group->seq); - if (ret < 0) - goto error; - - genlmsg_end(msg, hdr); - return 0; - -error: - genlmsg_cancel(msg, hdr); - return -EMSGSIZE; -} - -static int psample_nl_cmd_get_group_dumpit(struct sk_buff *msg, - struct netlink_callback *cb) -{ - struct psample_group *group; - int start = cb->args[0]; - int idx = 0; - int err; - - spin_lock(&psample_groups_lock); - list_for_each_entry(group, &psample_groups_list, list) { - if (!net_eq(group->net, sock_net(msg->sk))) - continue; - if (idx < start) { - idx++; - continue; - } - err = psample_group_nl_fill(msg, group, PSAMPLE_CMD_NEW_GROUP, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, NLM_F_MULTI); - if (err) - break; - idx++; - } - - spin_unlock(&psample_groups_lock); - cb->args[0] = idx; - return msg->len; -} - -static const struct genl_ops psample_nl_ops[] = { - { - .cmd = PSAMPLE_CMD_GET_GROUP, - .dumpit = psample_nl_cmd_get_group_dumpit, - /* can be retrieved by unprivileged users */ - } -}; - -static struct genl_family psample_nl_family = { - .name = PSAMPLE_GENL_NAME, - .version = PSAMPLE_GENL_VERSION, - .maxattr = PSAMPLE_ATTR_MAX, - .netnsok = true, - .module = THIS_MODULE, - .mcgrps = psample_nl_mcgrps, - .ops = psample_nl_ops, - .n_ops = ARRAY_SIZE(psample_nl_ops), - .n_mcgrps = ARRAY_SIZE(psample_nl_mcgrps), -}; - -static void psample_group_notify(struct psample_group *group, - enum psample_command cmd) -{ - struct sk_buff *msg; - int err; - - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); - if (!msg) - return; - - err = psample_group_nl_fill(msg, group, cmd, 0, 0, NLM_F_MULTI); - if (!err) - genlmsg_multicast_netns(&psample_nl_family, group->net, msg, 0, - PSAMPLE_NL_MCGRP_CONFIG, GFP_ATOMIC); - else - nlmsg_free(msg); -} - -static struct psample_group *psample_group_create(struct net *net, - u32 group_num) -{ - struct psample_group *group; - - group = kzalloc(sizeof(*group), GFP_ATOMIC); - if (!group) - return NULL; - - group->net = net; - group->group_num = group_num; - list_add_tail(&group->list, &psample_groups_list); - - psample_group_notify(group, PSAMPLE_CMD_NEW_GROUP); - return group; -} - -static void psample_group_destroy(struct psample_group *group) -{ - psample_group_notify(group, PSAMPLE_CMD_DEL_GROUP); - list_del(&group->list); - kfree(group); -} - -static struct psample_group * -psample_group_lookup(struct net *net, u32 group_num) -{ - struct psample_group *group; - - list_for_each_entry(group, &psample_groups_list, list) - if ((group->group_num == group_num) && (group->net == net)) - return group; - return NULL; -} - -struct psample_group *psample_group_get(struct net *net, u32 group_num) -{ - struct psample_group *group; - - spin_lock(&psample_groups_lock); - - group = psample_group_lookup(net, group_num); - if (!group) { - group = psample_group_create(net, group_num); - if (!group) - goto out; - } - group->refcount++; - -out: - spin_unlock(&psample_groups_lock); - return group; -} -EXPORT_SYMBOL_GPL(psample_group_get); - -void psample_group_put(struct psample_group *group) -{ - spin_lock(&psample_groups_lock); - - if (--group->refcount == 0) - psample_group_destroy(group); - - spin_unlock(&psample_groups_lock); -} -EXPORT_SYMBOL_GPL(psample_group_put); - -void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, - u32 trunc_size, int in_ifindex, int out_ifindex, - u32 sample_rate) -{ - struct sk_buff *nl_skb; - int data_len; - int meta_len; - void *data; - int ret; - - meta_len = (in_ifindex ? nla_total_size(sizeof(u16)) : 0) + - (out_ifindex ? nla_total_size(sizeof(u16)) : 0) + - nla_total_size(sizeof(u32)) + /* sample_rate */ - nla_total_size(sizeof(u32)) + /* orig_size */ - nla_total_size(sizeof(u32)) + /* group_num */ - nla_total_size(sizeof(u32)); /* seq */ - - data_len = min(skb->len, trunc_size); - if (meta_len + nla_total_size(data_len) > PSAMPLE_MAX_PACKET_SIZE) - data_len = PSAMPLE_MAX_PACKET_SIZE - meta_len - NLA_HDRLEN - - NLA_ALIGNTO; - - nl_skb = genlmsg_new(meta_len + nla_total_size(data_len), GFP_ATOMIC); - if (unlikely(!nl_skb)) - return; - - data = genlmsg_put(nl_skb, 0, 0, &psample_nl_family, 0, - PSAMPLE_CMD_SAMPLE); - if (unlikely(!data)) - goto error; - - if (in_ifindex) { - ret = nla_put_u16(nl_skb, PSAMPLE_ATTR_IIFINDEX, in_ifindex); - if (unlikely(ret < 0)) - goto error; - } - - if (out_ifindex) { - ret = nla_put_u16(nl_skb, PSAMPLE_ATTR_OIFINDEX, out_ifindex); - if (unlikely(ret < 0)) - goto error; - } - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_SAMPLE_RATE, sample_rate); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_ORIGSIZE, skb->len); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_SAMPLE_GROUP, group->group_num); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_GROUP_SEQ, group->seq++); - if (unlikely(ret < 0)) - goto error; - - if (data_len) { - int nla_len = nla_total_size(data_len); - struct nlattr *nla; - - nla = (struct nlattr *)skb_put(nl_skb, nla_len); - nla->nla_type = PSAMPLE_ATTR_DATA; - nla->nla_len = nla_attr_size(data_len); - - if (skb_copy_bits(skb, 0, nla_data(nla), data_len)) - goto error; - } - - genlmsg_end(nl_skb, data); - genlmsg_multicast_netns(&psample_nl_family, group->net, nl_skb, 0, - PSAMPLE_NL_MCGRP_SAMPLE, GFP_ATOMIC); - - return; -error: - pr_err_ratelimited("Could not create psample log message\n"); - nlmsg_free(nl_skb); -} -EXPORT_SYMBOL_GPL(psample_sample_packet); - -static int __init psample_module_init(void) -{ - return genl_register_family(&psample_nl_family); -} - -static void __exit psample_module_exit(void) -{ - genl_unregister_family(&psample_nl_family); -} - -module_init(psample_module_init); -module_exit(psample_module_exit); - -MODULE_AUTHOR("Yotam Gigi "); -MODULE_DESCRIPTION("netlink channel for packet sampling"); -MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/net/psample.h b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/net/psample.h deleted file mode 100644 index 57c000785e9c..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/net/psample.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __NET_PSAMPLE_H -#define __NET_PSAMPLE_H - -#include -#include -#include -#include - -struct psample_group { - struct list_head list; - struct net *net; - u32 group_num; - u32 refcount; - u32 seq; -}; - -extern struct psample_group *psample_group_get(struct net *net, u32 group_num); -extern void psample_group_put(struct psample_group *group); - -extern void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, - u32 trunc_size, int in_ifindex, int out_ifindex, - u32 sample_rate); - -#endif /* __NET_PSAMPLE_H */ diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/uapi/linux/psample.h b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/uapi/linux/psample.h deleted file mode 100644 index ed48996ec0e8..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/include/uapi/linux/psample.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __UAPI_PSAMPLE_H -#define __UAPI_PSAMPLE_H - -enum { - /* sampled packet metadata */ - PSAMPLE_ATTR_IIFINDEX, - PSAMPLE_ATTR_OIFINDEX, - PSAMPLE_ATTR_ORIGSIZE, - PSAMPLE_ATTR_SAMPLE_GROUP, - PSAMPLE_ATTR_GROUP_SEQ, - PSAMPLE_ATTR_SAMPLE_RATE, - PSAMPLE_ATTR_DATA, - - /* commands attributes */ - PSAMPLE_ATTR_GROUP_REFCOUNT, - - __PSAMPLE_ATTR_MAX -}; - -enum psample_command { - PSAMPLE_CMD_SAMPLE, - PSAMPLE_CMD_GET_GROUP, - PSAMPLE_CMD_NEW_GROUP, - PSAMPLE_CMD_DEL_GROUP, -}; - -/* Can be overridden at runtime by module option */ -#define PSAMPLE_ATTR_MAX (__PSAMPLE_ATTR_MAX - 1) - -#define PSAMPLE_NL_MCGRP_CONFIG_NAME "config" -#define PSAMPLE_NL_MCGRP_SAMPLE_NAME "packets" -#define PSAMPLE_GENL_NAME "psample" -#define PSAMPLE_GENL_VERSION 1 - -#endif diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/Makefile b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/Makefile index d888820fafba..52b776f82b6c 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/Makefile +++ b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/Makefile @@ -48,9 +48,6 @@ build: $(MODULE) $(KMODULE) endif KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../bcm-knet/kernel_module/Module.symvers -ifeq ($(BUILD_PSAMPLE),1) -KBUILD_EXTRA_SYMBOLS += ${BLDDIR}/../psample/kernel_module/Module.symvers -endif # BCM Network Device @@ -61,9 +58,6 @@ $(KMODULE): $(MODULE) rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR) mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR) cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile -ifeq ($(BUILD_PSAMPLE),1) - sed -i 's/0x......../0x00000000/' ${BLDDIR}/../psample/kernel_module/Module.symvers -endif cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers MOD_NAME=$(THIS_MOD_NAME) KBUILD_EXTRA_SYMBOLS="${KBUILD_EXTRA_SYMBOLS}" $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko endif diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c index 628ee1780c09..2228eb44d5d3 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c +++ b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/knet-cb/psample-cb.c @@ -394,6 +394,7 @@ psample_task(struct work_struct *work) unsigned long flags; struct list_head *list_ptr, *list_next; psample_pkt_t *pkt; + struct psample_metadata md = {0}; spin_lock_irqsave(&psample_work->lock, flags); list_for_each_safe(list_ptr, list_next, &psample_work->pkt_list) { @@ -410,12 +411,13 @@ psample_task(struct work_struct *work) pkt->meta.trunc_size, pkt->meta.src_ifindex, pkt->meta.dst_ifindex, pkt->meta.sample_rate); + md.trunc_size = pkt->meta.trunc_size; + md.in_ifindex = pkt->meta.src_ifindex; + md.out_ifindex = pkt->meta.dst_ifindex; psample_sample_packet(pkt->group, - pkt->skb, - pkt->meta.trunc_size, - pkt->meta.src_ifindex, - pkt->meta.dst_ifindex, - pkt->meta.sample_rate); + pkt->skb, + pkt->meta.sample_rate, + &md); g_psample_stats.pkts_f_psample_mod++; dev_kfree_skb_any(pkt->skb); diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/Makefile b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/Makefile deleted file mode 100644 index 53293a7ac93b..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# -# Copyright 2017 Broadcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 2, as -# published by the Free Software Foundation (the "GPL"). -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License version 2 (GPLv2) for more details. -# -# You should have received a copy of the GNU General Public License -# version 2 (GPLv2) along with this source code. -# -# -*- Makefile -*- -# $Id: Makefile,v 1.3 Broadcom SDK $ -# $Copyright: (c) 2005 Broadcom Corp. -# All Rights Reserved.$ -# -LOCALDIR = systems/linux/kernel/modules/psample - -include ${SDK}/make/Make.config - -LIBS = $(LIBDIR)/libkern.a - -ifeq ($(kernel_version),2_4) -MODULE = $(LIBDIR)/psample.o -else -KERNEL_MODULE_DIR = kernel_module - -THIS_MOD_NAME := psample -MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o -KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko - -build: $(MODULE) $(KMODULE) -endif - -KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../bcm-knet/kernel_module/Module.symvers - -# BCM Network Device - -$(MODULE): $(BLDDIR)/.tree $(BOBJS) $(LIBS) - $(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@ -ifneq ($(kernel_version),2_4) -$(KMODULE): $(MODULE) - rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR) - mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR) - cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile - cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers - MOD_NAME=$(THIS_MOD_NAME) KBUILD_EXTRA_SYMBOLS="${KBUILD_EXTRA_SYMBOLS}" $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko -endif - -# Make.depend is before clean:: so that Make.depend's clean:: runs first. - -include ${SDK}/make/Make.depend - -clean:: - $(RM) $(BLDDIR)/version.c $(BLDDIR)/version.o - $(RM) $(BOBJS) $(MODULE) - -ifneq ($(kernel_version),2_4) -.PHONY: build -endif diff --git a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c b/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c deleted file mode 100644 index 46a84c7f7c4a..000000000000 --- a/platform/broadcom/saibcm-modules/systems/linux/kernel/modules/psample/psample.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * net/psample/psample.c - Netlink channel for packet sampling - * Copyright (c) 2017 Yotam Gigi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PSAMPLE_MAX_PACKET_SIZE 0xffff - -static LIST_HEAD(psample_groups_list); -static DEFINE_SPINLOCK(psample_groups_lock); - -/* multicast groups */ -enum psample_nl_multicast_groups { - PSAMPLE_NL_MCGRP_CONFIG, - PSAMPLE_NL_MCGRP_SAMPLE, -}; - -static const struct genl_multicast_group psample_nl_mcgrps[] = { - [PSAMPLE_NL_MCGRP_CONFIG] = { .name = PSAMPLE_NL_MCGRP_CONFIG_NAME }, - [PSAMPLE_NL_MCGRP_SAMPLE] = { .name = PSAMPLE_NL_MCGRP_SAMPLE_NAME }, -}; - -static struct genl_family psample_nl_family; - -static int psample_group_nl_fill(struct sk_buff *msg, - struct psample_group *group, - enum psample_command cmd, u32 portid, u32 seq, - int flags) -{ - void *hdr; - int ret; - - hdr = genlmsg_put(msg, portid, seq, &psample_nl_family, flags, cmd); - if (!hdr) - return -EMSGSIZE; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_SAMPLE_GROUP, group->group_num); - if (ret < 0) - goto error; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_GROUP_REFCOUNT, group->refcount); - if (ret < 0) - goto error; - - ret = nla_put_u32(msg, PSAMPLE_ATTR_GROUP_SEQ, group->seq); - if (ret < 0) - goto error; - - genlmsg_end(msg, hdr); - return 0; - -error: - genlmsg_cancel(msg, hdr); - return -EMSGSIZE; -} - -static int psample_nl_cmd_get_group_dumpit(struct sk_buff *msg, - struct netlink_callback *cb) -{ - struct psample_group *group; - int start = cb->args[0]; - int idx = 0; - int err; - - spin_lock(&psample_groups_lock); - list_for_each_entry(group, &psample_groups_list, list) { - if (!net_eq(group->net, sock_net(msg->sk))) - continue; - if (idx < start) { - idx++; - continue; - } - err = psample_group_nl_fill(msg, group, PSAMPLE_CMD_NEW_GROUP, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, NLM_F_MULTI); - if (err) - break; - idx++; - } - - spin_unlock(&psample_groups_lock); - cb->args[0] = idx; - return msg->len; -} - -static const struct genl_ops psample_nl_ops[] = { - { - .cmd = PSAMPLE_CMD_GET_GROUP, - .dumpit = psample_nl_cmd_get_group_dumpit, - /* can be retrieved by unprivileged users */ - } -}; - -static struct genl_family psample_nl_family = { - .name = PSAMPLE_GENL_NAME, - .version = PSAMPLE_GENL_VERSION, - .maxattr = PSAMPLE_ATTR_MAX, - .netnsok = true, - .module = THIS_MODULE, - .mcgrps = psample_nl_mcgrps, - .ops = psample_nl_ops, - .n_ops = ARRAY_SIZE(psample_nl_ops), - .n_mcgrps = ARRAY_SIZE(psample_nl_mcgrps), -}; - -static void psample_group_notify(struct psample_group *group, - enum psample_command cmd) -{ - struct sk_buff *msg; - int err; - - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); - if (!msg) - return; - - err = psample_group_nl_fill(msg, group, cmd, 0, 0, NLM_F_MULTI); - if (!err) - genlmsg_multicast_netns(&psample_nl_family, group->net, msg, 0, - PSAMPLE_NL_MCGRP_CONFIG, GFP_ATOMIC); - else - nlmsg_free(msg); -} - -static struct psample_group *psample_group_create(struct net *net, - u32 group_num) -{ - struct psample_group *group; - - group = kzalloc(sizeof(*group), GFP_ATOMIC); - if (!group) - return NULL; - - group->net = net; - group->group_num = group_num; - list_add_tail(&group->list, &psample_groups_list); - - psample_group_notify(group, PSAMPLE_CMD_NEW_GROUP); - return group; -} - -static void psample_group_destroy(struct psample_group *group) -{ - psample_group_notify(group, PSAMPLE_CMD_DEL_GROUP); - list_del(&group->list); - kfree(group); -} - -static struct psample_group * -psample_group_lookup(struct net *net, u32 group_num) -{ - struct psample_group *group; - - list_for_each_entry(group, &psample_groups_list, list) - if ((group->group_num == group_num) && (group->net == net)) - return group; - return NULL; -} - -struct psample_group *psample_group_get(struct net *net, u32 group_num) -{ - struct psample_group *group; - - spin_lock(&psample_groups_lock); - - group = psample_group_lookup(net, group_num); - if (!group) { - group = psample_group_create(net, group_num); - if (!group) - goto out; - } - group->refcount++; - -out: - spin_unlock(&psample_groups_lock); - return group; -} -EXPORT_SYMBOL_GPL(psample_group_get); - -void psample_group_put(struct psample_group *group) -{ - spin_lock(&psample_groups_lock); - - if (--group->refcount == 0) - psample_group_destroy(group); - - spin_unlock(&psample_groups_lock); -} -EXPORT_SYMBOL_GPL(psample_group_put); - -#if IS_ENABLED(CONFIG_PSAMPLE) /* FIXUP:- Remove after GTS kernel is recompiled with change in CONFIG_PSAMPLE flag */ -void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, - u32 trunc_size, int in_ifindex, int out_ifindex, - u32 sample_rate) -{ - struct sk_buff *nl_skb; - int data_len; - int meta_len; - void *data; - int ret; - - meta_len = (in_ifindex ? nla_total_size(sizeof(u16)) : 0) + - (out_ifindex ? nla_total_size(sizeof(u16)) : 0) + - nla_total_size(sizeof(u32)) + /* sample_rate */ - nla_total_size(sizeof(u32)) + /* orig_size */ - nla_total_size(sizeof(u32)) + /* group_num */ - nla_total_size(sizeof(u32)); /* seq */ - - data_len = min(skb->len, trunc_size); - if (meta_len + nla_total_size(data_len) > PSAMPLE_MAX_PACKET_SIZE) - data_len = PSAMPLE_MAX_PACKET_SIZE - meta_len - NLA_HDRLEN - - NLA_ALIGNTO; - - nl_skb = genlmsg_new(meta_len + nla_total_size(data_len), GFP_ATOMIC); - if (unlikely(!nl_skb)) - return; - - data = genlmsg_put(nl_skb, 0, 0, &psample_nl_family, 0, - PSAMPLE_CMD_SAMPLE); - if (unlikely(!data)) - goto error; - - if (in_ifindex) { - ret = nla_put_u16(nl_skb, PSAMPLE_ATTR_IIFINDEX, in_ifindex); - if (unlikely(ret < 0)) - goto error; - } - - if (out_ifindex) { - ret = nla_put_u16(nl_skb, PSAMPLE_ATTR_OIFINDEX, out_ifindex); - if (unlikely(ret < 0)) - goto error; - } - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_SAMPLE_RATE, sample_rate); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_ORIGSIZE, skb->len); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_SAMPLE_GROUP, group->group_num); - if (unlikely(ret < 0)) - goto error; - - ret = nla_put_u32(nl_skb, PSAMPLE_ATTR_GROUP_SEQ, group->seq++); - if (unlikely(ret < 0)) - goto error; - - if (data_len) { - int nla_len = nla_total_size(data_len); - struct nlattr *nla; - - nla = (struct nlattr *)skb_put(nl_skb, nla_len); - nla->nla_type = PSAMPLE_ATTR_DATA; - nla->nla_len = nla_attr_size(data_len); - - if (skb_copy_bits(skb, 0, nla_data(nla), data_len)) - goto error; - } - - genlmsg_end(nl_skb, data); - genlmsg_multicast_netns(&psample_nl_family, group->net, nl_skb, 0, - PSAMPLE_NL_MCGRP_SAMPLE, GFP_ATOMIC); - - return; -error: - pr_err_ratelimited("Could not create psample log message\n"); - nlmsg_free(nl_skb); -} -EXPORT_SYMBOL_GPL(psample_sample_packet); -#endif - -static int __init psample_module_init(void) -{ - return genl_register_family(&psample_nl_family); -} - -static void __exit psample_module_exit(void) -{ - genl_unregister_family(&psample_nl_family); -} - -module_init(psample_module_init); -module_exit(psample_module_exit); - -MODULE_AUTHOR("Yotam Gigi "); -MODULE_DESCRIPTION("netlink channel for packet sampling"); -MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile b/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile index 7a342f6ef60e..a72dba96f6e2 100644 --- a/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile +++ b/platform/broadcom/saibcm-modules/systems/linux/user/common/Makefile @@ -106,9 +106,6 @@ KNET_CB := $(DEST_DIR)/$(KNET_CB_LOCAL) BCM_KNET_LOCAL :=linux-bcm-knet.$(KOBJ) BCM_KNET=$(DEST_DIR)/$(BCM_KNET_LOCAL) -PSAMPLE_LOCAL := psample.$(KOBJ) -PSAMPLE := $(DEST_DIR)/$(PSAMPLE_LOCAL) - ifeq (,$(findstring DELIVER,$(MAKECMDGOALS))) .DEFAULT_GOAL := all all_targets := kernel_modules $(KERNEL_BDE) $(USER_BDE) @@ -145,7 +142,6 @@ endif endif ifdef BUILD_PSAMPLE -all_targets += $(PSAMPLE) ADD_TO_CFLAGS += -DPSAMPLE_SUPPORT endif ADD_TO_CFLAGS += -I$(SDK)/systems/linux/kernel/modules/include @@ -178,10 +174,6 @@ kernel_modules: ifeq ($(BUILD_KNET),1) $(MAKE) -C $(SDK)/systems/linux/kernel/modules kernel_version=$(kernel_version) \ subdirs="shared bcm-knet" override-target=linux-$(platform) CFLAGS="$(CFLAGS)" -ifdef BUILD_PSAMPLE - $(MAKE) -C $(SDK)/systems/linux/kernel/modules kernel_version=$(kernel_version) \ - subdirs="psample" override-target=linux-$(platform) CFLAGS="$(CFLAGS)" -endif ifdef BUILD_KNET_CB $(MAKE) -C $(SDK)/systems/linux/kernel/modules kernel_version=$(kernel_version) \ subdirs="knet-cb" override-target=linux-$(platform) CFLAGS="$(CFLAGS)" @@ -201,11 +193,6 @@ $(BCM_KNET): $(KERN_BLDROOT)/linux-bcm-knet.$(KOBJ) $(KNET_CB): $(KERN_BLDROOT)/linux-knet-cb.$(KOBJ) $(OBJCOPY) --strip-debug $< $@ -$(PSAMPLE): $(KERN_BLDROOT)/psample.$(KOBJ) - $(OBJCOPY) --strip-debug $< $@ - - - ifeq ($(NO_LOCAL_TARGETS),) $(foreach targ,$(LOCAL_TARGETS),$(eval $(call LOCAL_TARGET_DEF,$(targ)))) endif @@ -214,7 +201,7 @@ clean:: $(MAKE) -C $(SDK)/systems/bde/linux/kernel $@ $(MAKE) -C $(SDK)/systems/bde/linux/user/kernel $@ $(MAKE) -C $(SDK)/systems/linux/kernel/modules \ - subdirs="shared bcm-knet knet-cb psample" \ + subdirs="shared bcm-knet knet-cb" \ override-target=linux-$(platform) $@ $(RM) $(KERNEL_BDE) $(USER_BDE) $(RM) $(BCM_KNET) $(KNET_CB) $(PSAMPLE) @@ -222,7 +209,6 @@ clean:: $(RM) $(KERN_BLDROOT)/linux-user-bde.$(KOBJ) $(RM) $(KERN_BLDROOT)/linux-bcm-knet.$(KOBJ) $(RM) $(KERN_BLDROOT)/linux-knet-cb.$(KOBJ) - $(RM) $(KERN_BLDROOT)/psample.$(KOBJ) $(RM) $(LOCAL_TARGETS) distclean:: clean diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index b9083b1a271e..fdd9bac78cfc 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit b9083b1a271e63757bef4fcd914ed524bd3c35c9 +Subproject commit fdd9bac78cfc2bbe932833b38c2191b1d382ed07 From 53a281008a96edcc22d0536ca4357a18f071c04e Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Wed, 17 Aug 2022 08:58:35 +0800 Subject: [PATCH 671/817] Update Yang for pfc_enable field (#11747) Why I did it This PR is to update Yang model for pfc_enable and pfcwd_sw_enable fields to support more than 2 queues, like 2,3,4,6. Before this change, the regex "[0-7](,[0-7])?" accepts only no more than 2 queues. How I did it Update the regex pattern for pfc_enable and pfcwd_sw_enable, from "[0-7](,[0-7])?" to "[0-7](,[0-7])* How to verify it The change is verified by UT. The test input is updated to cover the change. collected 3 items tests/test_sonic_yang_models.py .. [ 66%] tests/yang_model_tests/test_yang_model.py . --- .../tests/yang_model_tests/tests_config/qosmaps.json | 4 ++-- src/sonic-yang-models/yang-models/sonic-port-qos-map.yang | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json index a05d80631f1f..0992f8776df8 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json @@ -669,8 +669,8 @@ "pfc_to_pg_map": "map1", "dscp_to_tc_map": "map1", "dot1p_to_tc_map": "map1", - "pfc_enable": "3,4", - "pfcwd_sw_enable" : "3,4" + "pfc_enable": "2,3,4,6", + "pfcwd_sw_enable" : "2,3,4,6" } ] } diff --git a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang index 53ef7f48f5b7..09dcb7ce9c39 100644 --- a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang +++ b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang @@ -82,13 +82,13 @@ module sonic-port-qos-map { leaf pfc_enable { type string { - pattern "[0-7](,[0-7])?"; + pattern "[0-7](,[0-7])*"; } } leaf pfcwd_sw_enable { type string { - pattern "[0-7](,[0-7])?"; + pattern "[0-7](,[0-7])*"; } description "Specify the queue(s) on which software pfc watchdog are enabled."; From abda50c791d21f94e331ff50b8eb692b6c191ba1 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Wed, 17 Aug 2022 04:48:40 +0000 Subject: [PATCH 672/817] Correct port index in Arista-720DT-48S/phy24_config.json (#11699) Port index 22 is associated with phy23_config.json, then same port index 22 in phy24_config.json may cause gearbox port creation error. Port Ethernet22 maps to index 23. --- .../x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json index 2a781875b0b2..31b86a0bc5cb 100644 --- a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/phy24_config.json @@ -14,7 +14,7 @@ ], "ports": [ { - "index": 22, + "index": 23, "mdio_addr": "", "system_speed": 1000, "system_fec": "none", From 5846cdddfefd8a8ab6fe479a62a43fe1559103fe Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Wed, 17 Aug 2022 14:17:46 +0800 Subject: [PATCH 673/817] Add yang_config_validation in device_info (#11715) Why I did it Put yang_config_validation in common lib and make it reusabe How I did it Move the definition to device_info.py --- src/sonic-py-common/sonic_py_common/device_info.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 73654b8819b8..6126dd6dd284 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -403,6 +403,10 @@ def get_chassis_info(): return chassis_info_dict + +def is_yang_config_validation_enabled(config_db): + return get_localhost_info('yang_config_validation', config_db) == 'enable' + # # Multi-NPU functionality # From 2bb8306d8e20d798f89535eff9ab57f6f5b2e177 Mon Sep 17 00:00:00 2001 From: suresh-rupanagudi <52159821+suresh-rupanagudi@users.noreply.github.com> Date: Thu, 18 Aug 2022 01:59:40 +0530 Subject: [PATCH 674/817] upstream snmp sonic-yang files (#10828) Fix #10549 Fix #10550 #### Why I did it Create sonic yang model for SNMP Tables:SNMP, SNMP_COMMUNITY #### How I did it Defined yang models based for SNMP based on snmp.yml #### How to verify it Added test cases to verify --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 20 ++++- .../tests/yang_model_tests/tests/snmp.json | 28 +++++++ .../yang_model_tests/tests_config/snmp.json | 83 +++++++++++++++++++ .../yang-models/sonic-snmp.yang | 74 +++++++++++++++++ 5 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json create mode 100644 src/sonic-yang-models/yang-models/sonic-snmp.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 6e998737636e..ee4f7e55bca8 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -128,6 +128,7 @@ def run(self): './yang-models/sonic-route-map.yang', './yang-models/sonic-routing-policy-sets.yang', './yang-models/sonic-sflow.yang', + './yang-models/sonic-snmp.yang', './yang-models/sonic-syslog.yang', './yang-models/sonic-system-aaa.yang', './yang-models/sonic-system-tacacs.yang', @@ -190,6 +191,7 @@ def run(self): './cvlyang-models/sonic-route-map.yang', './cvlyang-models/sonic-routing-policy-sets.yang', './cvlyang-models/sonic-sflow.yang', + './cvlyang-models/sonic-snmp.yang', './cvlyang-models/sonic-system-aaa.yang', './cvlyang-models/sonic-system-tacacs.yang', './cvlyang-models/sonic-telemetry.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 332172d925c1..db7798f31835 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1924,10 +1924,28 @@ ] } }, + + "SNMP": { + "CONTACT": { + "Contact": "testuser@contoso.com" + }, + "LOCATION": { + "Location": "SNMP Server Location" + } + }, + "SNMP_COMMUNITY": { + "public": { + "TYPE": "RO" + }, + "private": { + "TYPE": "RW" + } + }, + "SYSTEM_DEFAULTS": { "tunnel_qos_remap": { "status": "enabled" - } + } }, "LOSSLESS_TRAFFIC_PATTERN": { "AZURE": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json b/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json new file mode 100644 index 000000000000..8c4754462830 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/snmp.json @@ -0,0 +1,28 @@ +{ + "SNMP_SYSTEM_TEST": { + "desc": "Load SNMP sysContact and sysLocation." + }, + "SNMP_SYSTEM_CONTACT_NEG_TEST": { + "desc": "Load SNMP sysContact with empty string", + "eStrKey": "Range" + }, + "SNMP_SYSTEM_LOCATION_NEG_TEST": { + "desc": "Load SNMP sysContact with empty string", + "eStrKey": "Range" + }, + "SNMP_COMMUNITY_TEST": { + "desc": "Load SNMP community string." + }, + "SNMP_COMMUNITY_MIN_NEG_TEST": { + "desc": "Load SNMP community string of length < 3.", + "eStrKey": "Range" + }, + "SNMP_COMMUNITY_MAX_NEG_TEST": { + "desc": "Load SNMP community string of lenth > 32.", + "eStrKey": "Range" + }, + "SNMP_COMMUNITY_WRONG_TYPE_TEST": { + "desc": "Load SNMP community string with un supported type.", + "eStrKey": "InvalidValue" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json new file mode 100644 index 000000000000..31c2f838d343 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/snmp.json @@ -0,0 +1,83 @@ +{ + "SNMP_SYSTEM_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP": { + "CONTACT": { + "Contact": "support@xyz.com" + }, + "LOCATION": { + "Location": "Test location" + } + } + } + }, + "SNMP_SYSTEM_CONTACT_NEG_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP": { + "CONTACT": { + "Contact": "" + } + } + } + }, + "SNMP_SYSTEM_LOCATION_NEG_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP": { + "LOCATION": { + "Location": "" + } + } + } + }, + + "SNMP_COMMUNITY_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_COMMUNITY": { + "SNMP_COMMUNITY_LIST": [ + { + "name": "sonicSnmp", + "TYPE": "RO" + }, + { + "name": "sonicSnmpRW", + "TYPE": "RW" + } + ] + } + } + }, + "SNMP_COMMUNITY_MIN_NEG_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_COMMUNITY": { + "SNMP_COMMUNITY_LIST": [ + { + "name": "abc" + } + ] + } + } + }, + "SNMP_COMMUNITY_MAX_NEG_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_COMMUNITY": { + "SNMP_COMMUNITY_LIST": [ + { + "name": "01234567890123456789012345678901234" + } + ] + } + } + }, + "SNMP_COMMUNITY_WRONG_TYPE_TEST": { + "sonic-snmp:sonic-snmp": { + "sonic-snmp:SNMP_COMMUNITY": { + "SNMP_COMMUNITY_LIST": [ + { + "name": "sonicSnmp", + "TYPE": "RR" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-snmp.yang b/src/sonic-yang-models/yang-models/sonic-snmp.yang new file mode 100644 index 000000000000..7e3db7b5dd09 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-snmp.yang @@ -0,0 +1,74 @@ +module sonic-snmp { + namespace "http://github.com/Azure/sonic-snmp"; + prefix ssnmp; + yang-version 1.1; + + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONIC SNMP"; + + revision 2022-05-13 { + description + "Initial revision."; + } + + + container sonic-snmp { + + container SNMP { + container CONTACT { + leaf Contact { + type string { + length "1..255"; + } + description + "SNMP System Contact."; + } + } + container LOCATION { + leaf Location { + type string { + length "1..255"; + } + description + "SNMP System Location."; + } + + } + } + + container SNMP_COMMUNITY { + list SNMP_COMMUNITY_LIST { + key name; + description + "List of communities."; + + leaf name { + type string { + length "4..32"; + pattern '[^ @,\\' +"']*" { + error-message 'Invalid snmp community string (Valid chars are ASCII printable except SPACE, single quote,"@", "," and "\")'; + } + } + description + "Index into the community list which must be the community name."; + } + + leaf TYPE { + type enumeration { + enum RO; + enum RW; + } + description + "Type of community, read-only or read-write."; + } + } + } + } +} From 535612f808a29960233813831575e844307c54f6 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Wed, 17 Aug 2022 14:02:21 -0700 Subject: [PATCH 675/817] Added support to add gbsyncd in Feature Table of Host Config DB (#11754) Why I did: In case of multi-asic platforms gbsyncd is not getting added to Feature Table of Host Config DB. Without this container_checker complains of not needed gbsyncd container's are running. How I did: Update Both Host and Namespace config db when gbsyncd docker is starting. How I verify: Verified on Multi-asic platforms. --- files/scripts/gbsyncd.sh | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/files/scripts/gbsyncd.sh b/files/scripts/gbsyncd.sh index 0990de5d8257..a7eaaced0cd6 100755 --- a/files/scripts/gbsyncd.sh +++ b/files/scripts/gbsyncd.sh @@ -3,11 +3,15 @@ . /usr/local/bin/syncd_common.sh function startplatform() { - # Add gbsyncd to FEATURE table, if not in. It did have same config as syncd. - if [ -z $($SONIC_DB_CLI CONFIG_DB HGET 'FEATURE|gbsyncd' state) ]; then - local CMD="local r=redis.call('DUMP', KEYS[1]); redis.call('RESTORE', KEYS[2], 0, r)" - $SONIC_DB_CLI CONFIG_DB EVAL "$CMD" 2 'FEATURE|syncd' 'FEATURE|gbsyncd' - fi + + declare -a DbCliArray=($SONIC_DB_CLI $SONIC_DB_NS_CLI) + for DB_CLI in ${DbCliArray[@]}; do + # Add gbsyncd to FEATURE table, if not in. It did have same config as syncd. + if [ -z $($DB_CLI CONFIG_DB HGET 'FEATURE|gbsyncd' state) ]; then + local CMD="local r=redis.call('DUMP', KEYS[1]); redis.call('RESTORE', KEYS[2], 0, r)" + $DB_CLI CONFIG_DB EVAL "$CMD" 2 'FEATURE|syncd' 'FEATURE|gbsyncd' + fi + done } function waitplatform() { @@ -30,12 +34,11 @@ PEER="swss" DEBUGLOG="/tmp/swss-$SERVICE-debug$DEV.log" LOCKFILE="/tmp/swss-$SERVICE-lock$DEV" NAMESPACE_PREFIX="asic" +SONIC_DB_CLI="sonic-db-cli" +SONIC_DB_NS_CLI="sonic-db-cli" if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace - SONIC_DB_CLI="sonic-db-cli -n $NET_NS" -else - NET_NS="" - SONIC_DB_CLI="sonic-db-cli" + SONIC_DB_NS_CLI="sonic-db-cli -n $NET_NS" fi case "$1" in From 5d9a46369593c623be9dab794bed1e96bac3bcfd Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Wed, 17 Aug 2022 17:30:58 -0400 Subject: [PATCH 676/817] Replace strtok in systemd-sonic-generator (#11710) Signed-off-by: maipbui #### Why I did it Replace unsafe functions to safe functions #### How I did it Replace `strtok()` by `strtok_r()` #### How to verify it #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- .../systemd-sonic-generator.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/systemd-sonic-generator/systemd-sonic-generator.c b/src/systemd-sonic-generator/systemd-sonic-generator.c index 96193b9fe3e3..0c419893c35b 100644 --- a/src/systemd-sonic-generator/systemd-sonic-generator.c +++ b/src/systemd-sonic-generator/systemd-sonic-generator.c @@ -121,6 +121,7 @@ static int get_install_targets_from_line(char* target_string, char* install_type ***/ char* token; char* target; + char* saveptr; char final_target[PATH_MAX]; int num_targets = 0; @@ -135,8 +136,8 @@ static int get_install_targets_from_line(char* target_string, char* install_type strip_trailing_newline(target); if (strstr(target, "%") != NULL) { - char* prefix = strtok(target, "."); - char* suffix = strtok(NULL, "."); + char* prefix = strtok_r(target, ".", &saveptr); + char* suffix = strtok_r(NULL, ".", &saveptr); int prefix_len = strlen(prefix); strncpy(final_target, prefix, prefix_len - 2); @@ -516,6 +517,7 @@ int get_num_of_asic() { char *line = NULL; char* token; char* platform; + char* saveptr; size_t len = 0; ssize_t nread; bool ans; @@ -534,8 +536,8 @@ int get_num_of_asic() { while ((nread = getline(&line, &len, fp)) != -1) { if ((strstr(line, "onie_platform") != NULL) || (strstr(line, "aboot_platform") != NULL)) { - token = strtok(line, "="); - platform = strtok(NULL, "="); + token = strtok_r(line, "=", &saveptr); + platform = strtok_r(NULL, "=", &saveptr); strip_trailing_newline(platform); break; } @@ -547,8 +549,8 @@ int get_num_of_asic() { if (fp != NULL) { while ((nread = getline(&line, &len, fp)) != -1) { if (strstr(line, "NUM_ASIC") != NULL) { - token = strtok(line, "="); - str_num_asic = strtok(NULL, "="); + token = strtok_r(line, "=", &saveptr); + str_num_asic = strtok_r(NULL, "=", &saveptr); strip_trailing_newline(str_num_asic); if (str_num_asic != NULL){ sscanf(str_num_asic, "%d",&num_asic); @@ -571,6 +573,7 @@ int ssg_main(int argc, char **argv) { char* unit_instance; char* prefix; char* suffix; + char* saveptr; int num_unit_files; int num_targets; int r; @@ -589,8 +592,8 @@ int ssg_main(int argc, char **argv) { for (int i = 0; i < num_unit_files; i++) { unit_instance = strdup(unit_files[i]); if ((num_asics == 1) && strstr(unit_instance, "@") != NULL) { - prefix = strtok(unit_instance, "@"); - suffix = strtok(NULL, "@"); + prefix = strtok_r(unit_instance, "@", &saveptr); + suffix = strtok_r(NULL, "@", &saveptr); strcpy(unit_instance, prefix); strcat(unit_instance, suffix); From 3e427419eef2404e82611b151892dcd696f7b527 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Wed, 17 Aug 2022 21:34:19 -0700 Subject: [PATCH 677/817] [master][sonic-linkmgrd] submodule update (#11749) [master][sonic-linkmgrd] submodule update 4bf8b3d Jing Zhang Fri Aug 12 12:07:40 2022 -0700 wait for handler to be completed (#114) cf849a0 Longxiang Lyu Fri Aug 12 17:21:43 2022 +0800 Use table to toggle peer forwarding state (#108) d4540ba Jing Zhang Thu Aug 11 16:08:03 2022 -0700 Adjust DbInterfaceRaceConditionCheck to Wait Longer for Handlers to be executed (#111) d5c47b3 Jing Zhang Thu Aug 11 15:31:22 2022 -0700 [lgtm]: add uuid-dev to lgtm prepare (#112) f4bb5d5 Jing Zhang Thu Aug 11 10:03:05 2022 -0700 Backoff mux probing for server down scenario (#106) 3f7a6f2 Jing Zhang Tue Aug 9 10:42:51 2022 -0700 Fix race condition caused by strand wrap method (#104) 4cff43f Jing Zhang Mon Aug 8 10:36:18 2022 -0700 [Active-Standby]Remove unnecessary handleMuxWaitTimeout logs (#100) 3b22533 Jing Zhang Tue Aug 2 13:18:01 2022 -0700 [active-active] Update unhealthy label definition (#102) sign-off: Jing Zhang zhangjing@microsoft.com --- src/linkmgrd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkmgrd b/src/linkmgrd index 60b370dee69e..4bf8b3df8bde 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 60b370dee69e937cf15de24985875e089974c89d +Subproject commit 4bf8b3df8bdebf1633b2dd54100aa1c6939fa7d8 From ca546ddec380c77c7d30558435f40c0e2460ca4c Mon Sep 17 00:00:00 2001 From: jerseyang <48576574+jerseyang@users.noreply.github.com> Date: Thu, 18 Aug 2022 12:56:04 +0800 Subject: [PATCH 678/817] Sync platform-modules-belgite deb's kernel version 5.10.0-8-2 with master runtime kernel version 5.10.0-12-2 (#10946) # Why I did it platform-modules-belgite's deb requests linux-image-5.10.0-8-2-amd64-unsigned, which does not match the runtime kernel version # How I did it update the belgite's deb configuration in deb's control # How to verify it check the firsttime boot log in belgite platform Co-authored-by: nicwu-cel --- device/celestica/x86_64-cel_belgite-r0/installer.conf | 2 +- platform/broadcom/platform-modules-cel.mk | 2 +- platform/broadcom/sonic-platform-modules-cel/debian/control | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/device/celestica/x86_64-cel_belgite-r0/installer.conf b/device/celestica/x86_64-cel_belgite-r0/installer.conf index 61846e4455e0..430473933330 100644 --- a/device/celestica/x86_64-cel_belgite-r0/installer.conf +++ b/device/celestica/x86_64-cel_belgite-r0/installer.conf @@ -1,4 +1,4 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=0 CONSOLE_SPEED=9600 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off module_blacklist=gpio_ich crashkernel=0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M acpi_no_watchdog" +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off modprobe.blacklist=gpio_ich,i2c-ismt,i2c_ismt,i2c-i801,i2c_i801 crashkernel=0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M acpi_no_watchdog" diff --git a/platform/broadcom/platform-modules-cel.mk b/platform/broadcom/platform-modules-cel.mk index d485f128c6c2..b25aeb7c0900 100644 --- a/platform/broadcom/platform-modules-cel.mk +++ b/platform/broadcom/platform-modules-cel.mk @@ -14,7 +14,7 @@ export CEL_BELGITE_PLATFORM_MODULE_VERSION CEL_DX010_PLATFORM_MODULE = platform-modules-dx010_$(CEL_DX010_PLATFORM_MODULE_VERSION)_amd64.deb $(CEL_DX010_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cel -$(CEL_DX010_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(CEL_DX010_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(PDDF_PLATFORM_MODULE_SYM) $(CEL_DX010_PLATFORM_MODULE)_PLATFORM = x86_64-cel_seastone-r0 SONIC_DPKG_DEBS += $(CEL_DX010_PLATFORM_MODULE) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/control b/platform/broadcom/sonic-platform-modules-cel/debian/control index 2ba492829d26..a47dae2639a4 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/control +++ b/platform/broadcom/sonic-platform-modules-cel/debian/control @@ -28,5 +28,5 @@ Description: kernel modules for platform devices such as led, sfp. Package: platform-modules-belgite Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as led, sfp From 46ebd06403172e3dee3b43d27f09f9813c9d6bce Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:07:38 +0800 Subject: [PATCH 679/817] [Mellanox] Fix issue: set lpmode by platform API does not work (#11732) - Why I did it Fix issue: set lpmode by platform API does not work - How I did it Fix miss return value in code - How to verify it Manual test --- platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py | 4 +++- platform/mellanox/mlnx-platform-api/tests/test_sfp.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 3ee8b348ce00..617b4f33d636 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -53,6 +53,8 @@ SX_PORT_MODULE_STATUS_UNPLUGGED = 2 SX_PORT_MODULE_STATUS_PLUGGED_WITH_ERROR = 3 SX_PORT_MODULE_STATUS_PLUGGED_DISABLED = 4 + SX_PORT_ADMIN_STATUS_UP = True + SX_PORT_ADMIN_STATUS_DOWN = False except KeyError: pass @@ -571,7 +573,7 @@ def _fetch_port_status(cls, sdk_handle, log_port): @classmethod def is_port_admin_status_up(cls, sdk_handle, log_port): _, admin_state = cls._fetch_port_status(sdk_handle, log_port); - admin_state == SX_PORT_ADMIN_STATUS_UP + return admin_state == SX_PORT_ADMIN_STATUS_UP @classmethod diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index b932856fa38c..f599e0241d25 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -111,3 +111,11 @@ def test_sfp_read_eeprom(self): sfp = SFP(0) assert output_sfp.y_cable_part_number == sfp.read_eeprom(offset, 16).decode() MlxregManager.read_mlxred_eeprom.assert_called_with(132, 4, 16) + + @mock.patch('sonic_platform.sfp.SFP._fetch_port_status') + def test_is_port_admin_status_up(self, mock_port_status): + mock_port_status.return_value = (0, True) + assert SFP.is_port_admin_status_up(None, None) + + mock_port_status.return_value = (0, False) + assert not SFP.is_port_admin_status_up(None, None) From 3ea5e83332b2aa2b0c2bc77c41b7e90eaa01be9f Mon Sep 17 00:00:00 2001 From: Muhammad Danish <88161975+mdanish-kh@users.noreply.github.com> Date: Fri, 19 Aug 2022 03:19:54 +0500 Subject: [PATCH 680/817] [doc] Update README.md (#11647) #### Why I did it - Building `sonic-$PLATFORM.img.gz` fails if KVM support is not enabled. - Repos have been transferred over from Azure to sonic-net domain - sonic-net repos no longer use Microsoft CLA, so updated the README to point towards Linux foundation CLA - p4 platform is no longer supported. Reference: https://github.com/sonic-net/sonic-buildimage/issues/2591#issuecomment-649425081 --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a3ca0cdb4e30..92684138845d 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ # Description -Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatible network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [list](https://github.com/Azure/SONiC/wiki/Supported-Devices-and-Platforms) +Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatible network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [list](https://github.com/sonic-net/SONiC/wiki/Supported-Devices-and-Platforms) # Hardware @@ -97,6 +97,8 @@ Any server can be a build image server as long as it has: * Multiple cores to increase build speed * Plenty of RAM (less than 8 GiB is likely to cause issues) * 300G of free disk space + * KVM Virtualization Support. +> Note: If you are in a VM, make sure you have support for nested virtualization. A good choice of OS for building SONiC is currently Ubuntu 20.04. @@ -116,7 +118,7 @@ sudo pip3 install j2cli ## Clone or fetch the code repository with all git submodules To clone the code repository recursively, assuming git version 1.9 or newer: - git clone https://github.com/Azure/sonic-buildimage.git + git clone https://github.com/sonic-net/sonic-buildimage.git ## Usage @@ -151,7 +153,6 @@ To build SONiC installer image and docker images, run the following commands: - PLATFORM=centec - PLATFORM=nephos - PLATFORM=innovium -- PLATFORM=p4 - PLATFORM=vs ## Usage for ARM Architecture @@ -238,10 +239,10 @@ Every target has a clean target, so in order to clean swss, execute: It is recommended to use clean targets to clean all packages that are built together, like dev packages for instance. In order to be more familiar with build process and make some changes to it, it is recommended to read this short [Documentation](README.buildsystem.md). ## Build debug dockers and debug SONiC installer image: -SONiC build system supports building dockers and ONIE-image with debug tools and debug symbols, to help with live & core debugging. For details refer to [(SONiC Buildimage Guide)](https://github.com/Azure/sonic-buildimage/blob/master/README.buildsystem.md). +SONiC build system supports building dockers and ONIE-image with debug tools and debug symbols, to help with live & core debugging. For details refer to [(SONiC Buildimage Guide)](https://github.com/sonic-net/sonic-buildimage/blob/master/README.buildsystem.md). ## SAI Version -Please refer to [SONiC roadmap](https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning) on the SAI version for each SONiC release. +Please refer to [SONiC roadmap](https://github.com/sonic-net/SONiC/wiki/Sonic-Roadmap-Planning) on the SAI version for each SONiC release. ## Notes: - If you are running make for the first time, a sonic-slave-${USER} docker image will be built automatically. @@ -263,11 +264,11 @@ This may take a while, but it is a one-time action, so please be patient. - docker-syncd-invm.gz: docker image for the daemon to sync database and Innovium switch ASIC (gzip tar archive) - docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) - docker-sonic-vs.gz: docker image for all-in-one for software virtual switch (gzip tar archive) - - docker-sonic-mgmt.gz: docker image for [managing, configuring and monitoring SONiC](https://github.com/Azure/sonic-mgmt) (gzip tar archive) + - docker-sonic-mgmt.gz: docker image for [managing, configuring and monitoring SONiC](https://github.com/sonic-net/sonic-mgmt) (gzip tar archive) ## Contribution Guide -All contributors must sign a contribution license agreement before contributions can be accepted. Contact [sonic-cla-agreements@microsoft.com](mailto:sonic-cla-agreements@microsoft.com). +All contributors must sign a contribution license agreement before contributions can be accepted. Visit [EasyCLA - Linux Foundation](https://easycla.lfx.linuxfoundation.org). ## GitHub Workflow From 56a679dc09081b41f55e3671a914eb9c7e4b0d8f Mon Sep 17 00:00:00 2001 From: geogchen <106694330+geogchen@users.noreply.github.com> Date: Fri, 19 Aug 2022 01:40:08 -0700 Subject: [PATCH 681/817] [Bgpcfgd] Enhance add_peer/add_peer_ipv6 unit tests (#11651) * [Bgpcfgd] Enhance add_peer/add_peer_ipv6 unit tests Why I did it The current input to add_peer/add_peer_ipv6 is admin status change, update the UT to supply new peer information. Current UT does not check for case when check_neig_meta is true, update UT to check for this case How I did it By changing the input to add_peer/add_peer_ipv6 By modifying load_constants/constructor to take constants path as an input, and add two UT that uses a version of constants.yml that sets check_neig_meta to true. How to verify it UT failing before the change, and passing after the change. --- .../data/constants/constants_use_neig.yml | 60 ++++++++++ src/sonic-bgpcfgd/tests/test_bgp.py | 109 +++++++++++------- src/sonic-bgpcfgd/tests/util.py | 4 +- 3 files changed, 129 insertions(+), 44 deletions(-) create mode 100644 src/sonic-bgpcfgd/tests/data/constants/constants_use_neig.yml diff --git a/src/sonic-bgpcfgd/tests/data/constants/constants_use_neig.yml b/src/sonic-bgpcfgd/tests/data/constants/constants_use_neig.yml new file mode 100644 index 000000000000..12144a8783b9 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/constants/constants_use_neig.yml @@ -0,0 +1,60 @@ +constants: + deployment_id_asn_map: + "1" : 65432 + "2" : 65433 + bgp: + traffic_shift_community: 12345:12345 + families: + - ipv4 + - ipv6 + use_deployment_id: false + use_neighbors_meta: true + graceful_restart: + enabled: true + restart_time: 240 + multipath_relax: + enabled: true + maximum_paths: + enabled: true + ipv4: 64 + ipv6: 64 + allow_list: + enabled: true + default_action: "permit" # or "deny" + drop_community: 5060:12345 # value of the community to identify a prefix to drop. Make sense only with allow_list_default_action equal to 'permit' + default_pl_rules: + v4: + - "deny 0.0.0.0/0 le 17" + - "permit 127.0.0.1/32" + v6: + - "deny 0::/0 le 59" + - "deny 0::/0 ge 65" + bbr: + enabled: true + default_state: "disabled" + peers: + general: # peer_type + db_table: "BGP_NEIGHBOR" + template_dir: "general" + bbr: + PEER_V4: + - ipv4 + PEER_V6: + - ipv6 + internal: # peer_type + db_table: "BGP_INTERNAL_NEIGHBOR" + template_dir: "internal" + monitors: # peer_type + enabled: true + db_table: "BGP_MONITORS" + peer_group: "BGPMON" + template_dir: "monitors" + dynamic: # peer_type + enabled: true + db_table: "BGP_PEER_RANGE" + peer_group: "BGP_SPEAKER" + template_dir: "dynamic" + voq_chassis: # peer_type + enabled: true + db_table: "BGP_VOQ_CHASSIS_NEIGHBOR" + template_dir: "voq_chassis" diff --git a/src/sonic-bgpcfgd/tests/test_bgp.py b/src/sonic-bgpcfgd/tests/test_bgp.py index a4c5ef997725..d332dc4348ba 100644 --- a/src/sonic-bgpcfgd/tests/test_bgp.py +++ b/src/sonic-bgpcfgd/tests/test_bgp.py @@ -10,9 +10,20 @@ TEMPLATE_PATH = os.path.abspath('../../dockers/docker-fpm-frr/frr') -def constructor(): +def load_constant_files(): + paths = ["tests/data/constants", "../../files/image_config/constants"] + constant_files = [] + + for path in paths: + constant_files += [os.path.abspath(os.path.join(path, name)) for name in os.listdir(path) + if os.path.isfile(os.path.join(path, name)) and name.startswith("constants")] + + return constant_files + + +def constructor(constants_path): cfg_mgr = MagicMock() - constants = load_constants()['constants'] + constants = load_constants(constants_path)['constants'] common_objs = { 'directory': Directory(), 'cfg_mgr': cfg_mgr, @@ -38,75 +49,89 @@ def constructor(): m.directory.put("LOCAL", "interfaces", "Ethernet4|30.30.30.30/24", {"anything": "anything"}) m.directory.put("LOCAL", "interfaces", "Ethernet8|fc00:20::20/96", {"anything": "anything"}) + if m.check_neig_meta: + m.directory.put("CONFIG_DB", swsscommon.CFG_DEVICE_NEIGHBOR_METADATA_TABLE_NAME, "TOR", {}) + return m @patch('bgpcfgd.managers_bgp.log_info') def test_update_peer_up(mocked_log_info): - m = constructor() - res = m.set_handler("10.10.10.1", {"admin_status": "up"}) - assert res, "Expect True return value for peer update" - mocked_log_info.assert_called_with("Peer 'default|10.10.10.1' admin state is set to 'up'") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("10.10.10.1", {"admin_status": "up"}) + assert res, "Expect True return value for peer update" + mocked_log_info.assert_called_with("Peer 'default|10.10.10.1' admin state is set to 'up'") @patch('bgpcfgd.managers_bgp.log_info') def test_update_peer_up_ipv6(mocked_log_info): - m = constructor() - res = m.set_handler("fc00:10::1", {"admin_status": "up"}) - assert res, "Expect True return value for peer update" - mocked_log_info.assert_called_with("Peer 'default|fc00:10::1' admin state is set to 'up'") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("fc00:10::1", {"admin_status": "up"}) + assert res, "Expect True return value for peer update" + mocked_log_info.assert_called_with("Peer 'default|fc00:10::1' admin state is set to 'up'") @patch('bgpcfgd.managers_bgp.log_info') def test_update_peer_down(mocked_log_info): - m = constructor() - res = m.set_handler("10.10.10.1", {"admin_status": "down"}) - assert res, "Expect True return value for peer update" - mocked_log_info.assert_called_with("Peer 'default|10.10.10.1' admin state is set to 'down'") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("10.10.10.1", {"admin_status": "down"}) + assert res, "Expect True return value for peer update" + mocked_log_info.assert_called_with("Peer 'default|10.10.10.1' admin state is set to 'down'") @patch('bgpcfgd.managers_bgp.log_err') def test_update_peer_no_admin_status(mocked_log_err): - m = constructor() - res = m.set_handler("10.10.10.1", {"anything": "anything"}) - assert res, "Expect True return value for peer update" - mocked_log_err.assert_called_with("Peer '(default|10.10.10.1)': Can't update the peer. Only 'admin_status' attribute is supported") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("10.10.10.1", {"anything": "anything"}) + assert res, "Expect True return value for peer update" + mocked_log_err.assert_called_with("Peer '(default|10.10.10.1)': Can't update the peer. Only 'admin_status' attribute is supported") @patch('bgpcfgd.managers_bgp.log_err') def test_update_peer_invalid_admin_status(mocked_log_err): - m = constructor() - res = m.set_handler("10.10.10.1", {"admin_status": "invalid"}) - assert res, "Expect True return value for peer update" - mocked_log_err.assert_called_with("Peer 'default|10.10.10.1': Can't update the peer. It has wrong attribute value attr['admin_status'] = 'invalid'") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("10.10.10.1", {"admin_status": "invalid"}) + assert res, "Expect True return value for peer update" + mocked_log_err.assert_called_with("Peer 'default|10.10.10.1': Can't update the peer. It has wrong attribute value attr['admin_status'] = 'invalid'") def test_add_peer(): - m = constructor() - res = m.set_handler("30.30.30.1", {"local_addr": "30.30.30.30", "admin_status": "up"}) - assert res, "Expect True return value" + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("30.30.30.1", {'asn': '65200', 'holdtime': '180', 'keepalive': '60', 'local_addr': '30.30.30.30', 'name': 'TOR', 'nhopself': '0', 'rrclient': '0'}) + assert res, "Expect True return value" def test_add_peer_ipv6(): - m = constructor() - res = m.set_handler("fc00:20::1", {"local_addr": "fc00:20::20", "admin_status": "up"}) - assert res, "Expect True return value" + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("fc00:20::1", {'asn': '65200', 'holdtime': '180', 'keepalive': '60', 'local_addr': 'fc00:20::20', 'name': 'TOR', 'nhopself': '0', 'rrclient': '0'}) + assert res, "Expect True return value" @patch('bgpcfgd.managers_bgp.log_warn') def test_add_peer_no_local_addr(mocked_log_warn): - m = constructor() - res = m.set_handler("30.30.30.1", {"admin_status": "up"}) - assert res, "Expect True return value" - mocked_log_warn.assert_called_with("Peer 30.30.30.1. Missing attribute 'local_addr'") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("30.30.30.1", {"admin_status": "up"}) + assert res, "Expect True return value" + mocked_log_warn.assert_called_with("Peer 30.30.30.1. Missing attribute 'local_addr'") @patch('bgpcfgd.managers_bgp.log_debug') def test_add_peer_invalid_local_addr(mocked_log_debug): - m = constructor() - res = m.set_handler("30.30.30.1", {"local_addr": "40.40.40.40", "admin_status": "up"}) - assert not res, "Expect False return value" - mocked_log_debug.assert_called_with("Peer '30.30.30.1' with local address '40.40.40.40' wait for the corresponding interface to be set") + for constant in load_constant_files(): + m = constructor(constant) + res = m.set_handler("30.30.30.1", {"local_addr": "40.40.40.40", "admin_status": "up"}) + assert not res, "Expect False return value" + mocked_log_debug.assert_called_with("Peer '30.30.30.1' with local address '40.40.40.40' wait for the corresponding interface to be set") @patch('bgpcfgd.managers_bgp.log_info') def test_del_handler(mocked_log_info): - m = constructor() - m.del_handler("10.10.10.1") - mocked_log_info.assert_called_with("Peer '(default|10.10.10.1)' has been removed") + for constant in load_constant_files(): + m = constructor(constant) + m.del_handler("10.10.10.1") + mocked_log_info.assert_called_with("Peer '(default|10.10.10.1)' has been removed") @patch('bgpcfgd.managers_bgp.log_warn') def test_del_handler_nonexist_peer(mocked_log_warn): - m = constructor() - m.del_handler("40.40.40.1") - mocked_log_warn.assert_called_with("Peer '(default|40.40.40.1)' has not been found") + for constant in load_constant_files(): + m = constructor(constant) + m.del_handler("40.40.40.1") + mocked_log_warn.assert_called_with("Peer '(default|40.40.40.1)' has not been found") diff --git a/src/sonic-bgpcfgd/tests/util.py b/src/sonic-bgpcfgd/tests/util.py index a328a272c836..d9b3273865cb 100644 --- a/src/sonic-bgpcfgd/tests/util.py +++ b/src/sonic-bgpcfgd/tests/util.py @@ -13,8 +13,8 @@ def load_constants_dir_mappings(): result[name] = value["template_dir"] return result -def load_constants(): - with open(CONSTANTS_PATH) as f: +def load_constants(constants = CONSTANTS_PATH): + with open(constants) as f: data = yaml.load(f) # FIXME" , Loader=yaml.FullLoader) assert "constants" in data, "'constants' key not found in constants.yml" return data From 5bb6d0deba7aa77bb4a28868125077118206ca53 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 19 Aug 2022 11:20:00 -0700 Subject: [PATCH 682/817] [snmpd]: Update to 5.9+dfsg-4+deb11u1 to match Debian version (#11763) * [snmpd]: Update to 5.9+dfsg-4+deb11u1 to match Debian version This brings in some security fixes. Signed-off-by: Saikrishna Arcot * Update snmpd makefile Signed-off-by: Saikrishna Arcot * Remove binNMU for snmpd Signed-off-by: Saikrishna Arcot Signed-off-by: Saikrishna Arcot --- rules/snmpd.mk | 2 +- src/snmpd/Makefile | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/rules/snmpd.mk b/rules/snmpd.mk index 52be51d1c549..e9e498556c5e 100644 --- a/rules/snmpd.mk +++ b/rules/snmpd.mk @@ -2,7 +2,7 @@ ifeq ($(BLDENV),bullseye) SNMPD_VERSION = 5.9+dfsg -SNMPD_VERSION_FULL = $(SNMPD_VERSION)-3+b1 +SNMPD_VERSION_FULL = $(SNMPD_VERSION)-4+deb11u1 else SNMPD_VERSION = 5.7.3+dfsg SNMPD_VERSION_FULL = $(SNMPD_VERSION)-5 diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile index 0445b1ed6bee..ce14d6a42d88 100644 --- a/src/snmpd/Makefile +++ b/src/snmpd/Makefile @@ -31,27 +31,13 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf net-snmp-$(SNMPD_VERSION) # download debian net-snmp -ifneq (,$(findstring 5.9,$(SNMPD_VERSION))) - dget -u https://sonicstorage.blob.core.windows.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION)-3.dsc -else dget -u https://sonicstorage.blob.core.windows.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION_FULL).dsc -endif pushd net-snmp-$(SNMPD_VERSION) git init git add -f * git commit -m "unmodified snmpd source" -ifneq (,$(findstring 5.9,$(SNMPD_VERSION))) - # Looks like Debian did a binNMU (binary non-maintainer upload), so the latest dsc - # file that we can get doesn't actually have the exact version number that Debian's - # repos have. - DEBEMAIL="$(shell git config --get user.name) <$(shell git config --get user.email)>" dch --bin-nmu "Rebuild against perl 5.32.0" - dch -r "" - git add debian/changelog - git commit -m "fix package version" -endif - # Apply patches stg init stg import -s ../patch-$(SNMPD_VERSION)/series From 9753f28d1798eb556ead1a26dea6c3a8dfc2a7e4 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 19 Aug 2022 11:20:17 -0700 Subject: [PATCH 683/817] Upgrade snmp docker to Bullseye (#11741) Signed-off-by: Saikrishna Arcot Signed-off-by: Saikrishna Arcot --- dockers/docker-snmp/Dockerfile.j2 | 2 +- rules/docker-snmp.mk | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dockers/docker-snmp/Dockerfile.j2 b/dockers/docker-snmp/Dockerfile.j2 index 944a8ed41385..1eb4ec4b7c8b 100644 --- a/dockers/docker-snmp/Dockerfile.j2 +++ b/dockers/docker-snmp/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python3_wheels, copy_files %} -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG image_version diff --git a/rules/docker-snmp.mk b/rules/docker-snmp.mk index af90cf3664e8..e0f7719c6034 100644 --- a/rules/docker-snmp.mk +++ b/rules/docker-snmp.mk @@ -9,13 +9,13 @@ $(DOCKER_SNMP)_PATH = $(DOCKERS_PATH)/docker-snmp ## TODO: remove LIBPY3_DEV if we can get pip3 directly $(DOCKER_SNMP)_DEPENDS += $(SNMP) $(SNMPD) -$(DOCKER_SNMP)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) +$(DOCKER_SNMP)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_SNMP)_DBG_DEPENDS += $(SNMP_DBG) $(SNMPD_DBG) $(LIBSNMP_DBG) -$(DOCKER_SNMP)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_SNMP)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) $(DOCKER_SNMP)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SWSSSDK_PY3) $(ASYNCSNMP_PY3) -$(DOCKER_SNMP)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) +$(DOCKER_SNMP)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_SNMP)_VERSION = 1.0.0 $(DOCKER_SNMP)_PACKAGE_NAME = snmp @@ -32,5 +32,5 @@ $(DOCKER_SNMP)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_SNMP)_RUN_OPT += -v /usr/share/sonic/scripts:/usr/share/sonic/scripts:ro $(DOCKER_SNMP)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) -SONIC_BUSTER_DOCKERS += $(DOCKER_SNMP) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_SNMP_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SNMP) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_SNMP_DBG) From 0f50835c1196debd61eeb3fe16051e471aae3a65 Mon Sep 17 00:00:00 2001 From: Dmytro Lytvynenko Date: Sat, 20 Aug 2022 02:02:01 +0300 Subject: [PATCH 684/817] [BFN] Upgrade syncd container to deb11 (#11374) * draft upgrade to deb11 of syncd and syncd-rpc * upgrade to python3 * revert workaround with libsaithrift * Provide urls for sai and platform debs * Downgrade python3 to python2 * Remove saithrift-patches * Upgrade modules * remove unnecessary lib * remove more unnecessary modules * Update sdk reference * remove unnecessary packages from syncd-rpc --- platform/barefoot/bfn-platform.mk | 2 +- platform/barefoot/bfn-sai.mk | 2 +- platform/barefoot/docker-syncd-bfn-rpc.mk | 2 +- .../docker-syncd-bfn-rpc/Dockerfile.j2 | 22 ++++++++----------- platform/barefoot/docker-syncd-bfn.mk | 4 ++-- .../barefoot/docker-syncd-bfn/Dockerfile.j2 | 8 +++---- 6 files changed, 17 insertions(+), 23 deletions(-) diff --git a/platform/barefoot/bfn-platform.mk b/platform/barefoot/bfn-platform.mk index a35795dda6c2..53e4ab9f807a 100644 --- a/platform/barefoot/bfn-platform.mk +++ b/platform/barefoot/bfn-platform.mk @@ -1,4 +1,4 @@ -BFN_PLATFORM = bfnplatform_20220512_sai_1.10.2_deb10.deb +BFN_PLATFORM = bfnplatform_20220815_sai_1.10_deb11.deb $(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_PLATFORM)" SONIC_ONLINE_DEBS += $(BFN_PLATFORM) diff --git a/platform/barefoot/bfn-sai.mk b/platform/barefoot/bfn-sai.mk index 13f2800c0b9a..b8888b59457b 100644 --- a/platform/barefoot/bfn-sai.mk +++ b/platform/barefoot/bfn-sai.mk @@ -1,4 +1,4 @@ -BFN_SAI = bfnsdk_20220512_sai_1.10.2_deb10.deb +BFN_SAI = bfnsdk_20220815_sai_1.10_deb11.deb $(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_SAI)" $(BFN_SAI)_DEPENDS += $(LIBNL_GENL3_DEV) diff --git a/platform/barefoot/docker-syncd-bfn-rpc.mk b/platform/barefoot/docker-syncd-bfn-rpc.mk index a2a741cea1e1..6e1359d59ccf 100644 --- a/platform/barefoot/docker-syncd-bfn-rpc.mk +++ b/platform/barefoot/docker-syncd-bfn-rpc.mk @@ -12,7 +12,7 @@ $(DOCKER_SYNCD_BFN_RPC)_DEPENDS += $(SYNCD_RPC_DBG) \ endif $(DOCKER_SYNCD_BFN_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BFN_RPC) -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_BFN_RPC) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_BFN_RPC) ifeq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BFN_RPC) endif diff --git a/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 b/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 index e520c55f9c39..5e1f4511ec9f 100644 --- a/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 +++ b/platform/barefoot/docker-syncd-bfn-rpc/Dockerfile.j2 @@ -12,20 +12,16 @@ debs/ RUN apt-get purge -y syncd ## Pre-install the fundamental packages -RUN apt-get update \ +RUN apt-get update \ && apt-get -y install \ - net-tools \ - python-pip \ - python-setuptools \ - build-essential \ - libssl-dev \ - libffi-dev \ - python-dev \ wget \ cmake \ libqt5core5a \ libqt5network5 \ - libboost-atomic1.71.0 + python3-setuptools \ + python3-pip \ + python-is-python3 \ + libboost-atomic1.74.0 RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ {% for deb in docker_syncd_bfn_rpc_debs.split(' ') -%} @@ -42,10 +38,10 @@ RUN wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && cd .. \ && rm -fr nanomsg-1.0.0 \ && rm -f 1.0.0.tar.gz \ - && pip2 install cffi==1.7.0 \ - && pip2 install --upgrade cffi==1.7.0 \ - && pip2 install wheel \ - && pip2 install nnpy \ + && pip3 install cffi==1.7.0 \ + && pip3 install --upgrade cffi==1.7.0 \ + && pip3 install wheel \ + && pip3 install nnpy \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ diff --git a/platform/barefoot/docker-syncd-bfn.mk b/platform/barefoot/docker-syncd-bfn.mk index c1cda4e3bef1..55303557c345 100644 --- a/platform/barefoot/docker-syncd-bfn.mk +++ b/platform/barefoot/docker-syncd-bfn.mk @@ -1,7 +1,7 @@ # docker image for syncd DOCKER_SYNCD_PLATFORM_CODE = bfn -include $(PLATFORM_PATH)/../template/docker-syncd-base.mk +include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) @@ -16,4 +16,4 @@ $(DOCKER_SYNCD_BASE)_PACKAGE_NAME = syncd $(DOCKER_SYNCD_BASE)_RUN_OPT += -v /host/warmboot:/var/warmboot -SONIC_BUSTER_DOCKERS += $(DOCKER_SYNCD_BASE) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_SYNCD_BASE) diff --git a/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 b/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 index 8fa30bc29874..2bb6e7a97287 100755 --- a/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 +++ b/platform/barefoot/docker-syncd-bfn/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name @@ -16,11 +16,9 @@ debs/ RUN apt-get install -y \ libxml2 \ libpcap-dev \ - libusb-1.0-0-dev \ - libcurl4 \ - libcurl4-gnutls-dev \ + libusb-1.0-0 \ + libcurl3-gnutls \ libunwind8-dev \ - libpython3.4 \ libc-ares2 \ libedit2 \ libgoogle-perftools4 From cafa829ace8002fa292d9825f9fc171c17c5dbfe Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Sat, 20 Aug 2022 14:43:51 +0300 Subject: [PATCH 685/817] Change submodule path from Azure to sonic-net (#11700) Why I did it Change the path of sonic submodules that point to "Azure" to point to "sonic-net" How I did it Replace "Azure" with "sonic-net" on all relevant paths of sonic submodules --- .gitmodules | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.gitmodules b/.gitmodules index eba302a62912..09ebc6da2373 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,15 @@ [submodule "sonic-swss-common"] path = src/sonic-swss-common - url = https://github.com/Azure/sonic-swss-common + url = https://github.com/sonic-net/sonic-swss-common [submodule "sonic-linux-kernel"] path = src/sonic-linux-kernel - url = https://github.com/Azure/sonic-linux-kernel + url = https://github.com/sonic-net/sonic-linux-kernel [submodule "sonic-sairedis"] path = src/sonic-sairedis - url = https://github.com/Azure/sonic-sairedis + url = https://github.com/sonic-net/sonic-sairedis [submodule "sonic-swss"] path = src/sonic-swss - url = https://github.com/Azure/sonic-swss + url = https://github.com/sonic-net/sonic-swss [submodule "src/p4c-bm/p4c-bm"] path = platform/p4/p4c-bm/p4c-bm url = https://github.com/krambn/p4c-bm @@ -18,34 +18,34 @@ url = https://github.com/p4lang/p4-hlir [submodule "sonic-dbsyncd"] path = src/sonic-dbsyncd - url = https://github.com/Azure/sonic-dbsyncd + url = https://github.com/sonic-net/sonic-dbsyncd [submodule "src/sonic-py-swsssdk"] path = src/sonic-py-swsssdk - url = https://github.com/Azure/sonic-py-swsssdk.git + url = https://github.com/sonic-net/sonic-py-swsssdk.git [submodule "src/sonic-snmpagent"] path = src/sonic-snmpagent - url = https://github.com/Azure/sonic-snmpagent + url = https://github.com/sonic-net/sonic-snmpagent [submodule "src/ptf"] path = src/ptf url = https://github.com/p4lang/ptf.git [submodule "src/sonic-utilities"] path = src/sonic-utilities - url = https://github.com/Azure/sonic-utilities + url = https://github.com/sonic-net/sonic-utilities [submodule "platform/broadcom/sonic-platform-modules-arista"] path = platform/broadcom/sonic-platform-modules-arista url = https://github.com/aristanetworks/sonic [submodule "src/sonic-platform-common"] path = src/sonic-platform-common - url = https://github.com/Azure/sonic-platform-common + url = https://github.com/sonic-net/sonic-platform-common [submodule "src/sonic-platform-daemons"] path = src/sonic-platform-daemons - url = https://github.com/Azure/sonic-platform-daemons + url = https://github.com/sonic-net/sonic-platform-daemons [submodule "src/sonic-platform-pde"] path = src/sonic-platform-pde - url = https://github.com/Azure/sonic-platform-pdk-pde + url = https://github.com/sonic-net/sonic-platform-pdk-pde [submodule "src/sonic-frr/frr"] path = src/sonic-frr/frr - url = https://github.com/Azure/sonic-frr.git + url = https://github.com/sonic-net/sonic-frr.git branch = frr/8.2 [submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] path = platform/p4/p4-hlir/p4-hlir-v1.1 @@ -70,36 +70,36 @@ url = https://github.com/Mellanox/SAI-Implementation [submodule "src/sonic-mgmt-framework"] path = src/sonic-mgmt-framework - url = https://github.com/Azure/sonic-mgmt-framework + url = https://github.com/sonic-net/sonic-mgmt-framework [submodule "Switch-SDK-drivers"] path = platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers url = https://github.com/Mellanox/Switch-SDK-drivers [submodule "src/sonic-ztp"] path = src/sonic-ztp - url = https://github.com/Azure/sonic-ztp + url = https://github.com/sonic-net/sonic-ztp [submodule "src/sonic-restapi"] path = src/sonic-restapi - url = https://github.com/Azure/sonic-restapi.git + url = https://github.com/sonic-net/sonic-restapi.git branch = master [submodule "src/sonic-mgmt-common"] path = src/sonic-mgmt-common - url = https://github.com/Azure/sonic-mgmt-common.git + url = https://github.com/sonic-net/sonic-mgmt-common.git [submodule "src/wpasupplicant/sonic-wpa-supplicant"] path = src/wpasupplicant/sonic-wpa-supplicant - url = https://github.com/Azure/sonic-wpa-supplicant.git + url = https://github.com/sonic-net/sonic-wpa-supplicant.git [submodule "platform/broadcom/saibcm-modules-dnx"] path = platform/broadcom/saibcm-modules-dnx - url = https://github.com/Azure/saibcm-modules.git + url = https://github.com/sonic-net/saibcm-modules.git branch = sdk-6.5.22-gpl-dnx [submodule "platform/broadcom/sonic-platform-modules-nokia"] path = platform/broadcom/sonic-platform-modules-nokia url = https://github.com/nokia/sonic-platform.git [submodule "src/linkmgrd"] path = src/linkmgrd - url = https://github.com/Azure/sonic-linkmgrd.git + url = https://github.com/sonic-net/sonic-linkmgrd.git [submodule "src/sonic-p4rt/sonic-pins"] path = src/sonic-p4rt/sonic-pins - url = https://github.com/Azure/sonic-pins.git + url = https://github.com/sonic-net/sonic-pins.git [submodule "src/ptf-py3"] path = src/ptf-py3 url = https://github.com/p4lang/ptf.git From 946bc3b969d1960261f806b16db6d2f3d6c4ecee Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Sat, 20 Aug 2022 18:09:04 -0700 Subject: [PATCH 686/817] [arping] install arping utility in the base image (#11791) Signed-off-by: Ying Xie Signed-off-by: Ying Xie --- build_debian.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build_debian.sh b/build_debian.sh index 927b051d2887..1db8f3b91ca1 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -344,6 +344,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in python3-apt \ traceroute \ iputils-ping \ + arping \ net-tools \ bsdmainutils \ ca-certificates \ From 2d4ab9e9792c41dd403f4345454bd83db3dfdf36 Mon Sep 17 00:00:00 2001 From: Hasan Naqvi <56742004+hasan-brcm@users.noreply.github.com> Date: Sun, 21 Aug 2022 17:04:47 -0700 Subject: [PATCH 687/817] Bullseye frr (#11777) Why I did it Migrate FRR to bullseye How I did it Makefile and docker config changes to refer to bullseye instead of buster. How to verify it Build bullseye frr docker. Co-authored-by: Rajendra Dendukuri --- dockers/docker-fpm-frr/Dockerfile.j2 | 3 +-- rules/docker-fpm-frr.mk | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index f885180c37d4..ad665e71ceae 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -1,5 +1,5 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +FROM docker-swss-layer-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name ARG frr_user_uid @@ -16,7 +16,6 @@ RUN apt-get update && \ apt-get install -y \ libc-ares2 \ iproute2 \ - libjson-c3 \ logrotate \ libunwind8 diff --git a/rules/docker-fpm-frr.mk b/rules/docker-fpm-frr.mk index ff594288419c..861e1d8e8b41 100644 --- a/rules/docker-fpm-frr.mk +++ b/rules/docker-fpm-frr.mk @@ -8,13 +8,13 @@ $(DOCKER_FPM_FRR)_PATH = $(DOCKERS_PATH)/$(DOCKER_FPM_FRR_STEM) $(DOCKER_FPM_FRR)_PYTHON_WHEELS += $(SONIC_BGPCFGD) $(SONIC_FRR_MGMT_FRAMEWORK) $(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(FRR_SNMP) $(SWSS) $(LIBYANG2) -$(DOCKER_FPM_FRR)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) +$(DOCKER_FPM_FRR)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_DEPENDS) $(DOCKER_FPM_FRR)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) \ $(FRR_DBG) $(FRR_SNMP_DBG) $(LIBYANG2_DBG) -$(DOCKER_FPM_FRR)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES) +$(DOCKER_FPM_FRR)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_FPM_FRR)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BUSTER) +$(DOCKER_FPM_FRR)_LOAD_DOCKERS += $(DOCKER_SWSS_LAYER_BULLSEYE) $(DOCKER_FPM_FRR)_VERSION = 1.0.0 $(DOCKER_FPM_FRR)_PACKAGE_NAME = fpm-frr @@ -40,5 +40,5 @@ $(DOCKER_FPM_FRR)_BASE_IMAGE_FILES += TSB:/usr/bin/TSB $(DOCKER_FPM_FRR)_BASE_IMAGE_FILES += TSC:/usr/bin/TSC $(DOCKER_FPM_FRR)_BASE_IMAGE_FILES += TS:/usr/bin/TS -SONIC_BUSTER_DOCKERS += $(DOCKER_FPM_FRR) -SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_FPM_FRR_DBG) +SONIC_BULLSEYE_DOCKERS += $(DOCKER_FPM_FRR) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_FPM_FRR_DBG) From f404ce60e01214f7eec7a2d36946b3c5bad3eb11 Mon Sep 17 00:00:00 2001 From: anamehra <54692434+anamehra@users.noreply.github.com> Date: Mon, 22 Aug 2022 10:08:29 -0700 Subject: [PATCH 688/817] container_checker on supervisor should check containers based on asic presence (#11442) Why I did it On a supervisor card in a chassis, syncd/teamd/swss/lldp etc dockers are created for each Switch Fabric card. However, not all chassis would have all the switch fabric cards present. In this case, only dockers for Switch Fabrics present would be created. The monit 'container_checker' fails in this scenario as it is expecting dockers for all Switch Fabrics (based on NUM_ASIC defined in asic.conf file). --- files/image_config/monit/container_checker | 22 ++++++++++--- .../sonic_py_common/multi_asic.py | 31 ++++++++++++++++++- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/files/image_config/monit/container_checker b/files/image_config/monit/container_checker index a67a96a0c18c..c6271d26c8b1 100755 --- a/files/image_config/monit/container_checker +++ b/files/image_config/monit/container_checker @@ -23,7 +23,6 @@ import swsssdk from sonic_py_common import multi_asic, device_info from swsscommon import swsscommon - def get_expected_running_containers(): """ @summary: This function will get the expected running & always-enabled containers by following the rule: @@ -41,7 +40,19 @@ def get_expected_running_containers(): expected_running_containers = set() always_running_containers = set() - + + # Get current asic presence list. For multi_asic system, multi instance containers + # should be checked only for asics present. + asics_id_presence = multi_asic.get_asic_presence_list() + + # Some services may run all the instances irrespective of asic presence. + # Add those to exception list. + # database service: Currently services have dependency on all database services to + # be up irrespective of asic presence. + # bgp service: Currently bgp runs all instances. Once this is fixed to be config driven, + # it will be removed from exception list. + run_all_instance_list = ['database', 'bgp'] + for container_name in feature_table.keys(): if feature_table[container_name]["state"] not in ["disabled", "always_disabled"]: if multi_asic.is_multi_asic(): @@ -50,7 +61,8 @@ def get_expected_running_containers(): if feature_table[container_name]["has_per_asic_scope"] == "True": num_asics = multi_asic.get_num_asics() for asic_id in range(num_asics): - expected_running_containers.add(container_name + str(asic_id)) + if asic_id in asics_id_presence or container_name in run_all_instance_list: + expected_running_containers.add(container_name + str(asic_id)) else: expected_running_containers.add(container_name) if feature_table[container_name]["state"] == 'always_enabled': @@ -60,9 +72,11 @@ def get_expected_running_containers(): if feature_table[container_name]["has_per_asic_scope"] == "True": num_asics = multi_asic.get_num_asics() for asic_id in range(num_asics): - always_running_containers.add(container_name + str(asic_id)) + if asic_id in asics_id_presence or container_name in run_all_instance_list: + always_running_containers.add(container_name + str(asic_id)) else: always_running_containers.add(container_name) + if device_info.is_supervisor(): always_running_containers.add("database-chassis") return expected_running_containers, always_running_containers diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index 8ba409165f8b..e08746be0367 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -22,7 +22,8 @@ NEIGH_DEVICE_METADATA_CFG_DB_TABLE = 'DEVICE_NEIGHBOR_METADATA' DEFAULT_NAMESPACE = '' PORT_ROLE = 'role' - +CHASSIS_STATE_DB='CHASSIS_STATE_DB' +CHASSIS_ASIC_INFO_TABLE='CHASSIS_ASIC_TABLE' # Dictionary to cache config_db connection handle per namespace # to prevent duplicate connections from being opened @@ -451,3 +452,31 @@ def validate_namespace(namespace): return True else: return False + +def get_asic_presence_list(): + """ + @summary: This function will get the asic presence list. On Supervisor, the list includes only the asics + for inserted and detected fabric cards. For non-supervisor cards, e.g. line card, the list should + contain all supported asics by the card. The function gets the asic list from CHASSIS_ASIC_TABLE from + CHASSIS_STATE_DB. The function assumes that the first N asic ids (asic0 to asic(N-1)) in + CHASSIS_ASIC_TABLE belongs to the supervisor, where N is the max number of asics supported by the Chassis + @return: List of asics present + """ + asics_list = [] + if is_multi_asic(): + if not is_supervisor(): + # This is not supervisor, all asics should be present. Assuming that asics + # are not removable entity on Line Cards. Add all asics, 0 - num_asics to the list. + asics_list = list(range(0, get_num_asics())) + else: + # This is supervisor card. Some fabric cards may not be inserted. + # Get asic list from CHASSIS_ASIC_TABLE which lists only the asics + # present based on Fabric card detection by the platform. + db = swsscommon.DBConnector(CHASSIS_STATE_DB, 0, True) + asic_table = swsscommon.Table(db, CHASSIS_ASIC_INFO_TABLE) + if asic_table: + asics_presence_list = list(asic_table.getKeys()) + for asic in asics_presence_list: + # asic is asid id: asic0, asic1.... asicN. Get the numeric value. + asics_list.append(int(get_asic_id_from_name(asic))) + return asics_list From 2501d1f6737f498877d743151a63e93733612906 Mon Sep 17 00:00:00 2001 From: vmittal-msft <46945843+vmittal-msft@users.noreply.github.com> Date: Mon, 22 Aug 2022 16:24:51 -0700 Subject: [PATCH 689/817] PFCWD fix for multi port multi priority scenario for HWSKU Dell Z9332 (#11640) PFCWD fix for multi port multi priority scenario for HWSKU Dell Z9332 --- .../th3-z9332f-16x400G-64x100G.config.bcm | 4 ++++ .../DellEMC-Z9332f-O32/th3-z9332f-32x400G.config.bcm | 4 ++++ src/sonic-device-data/tests/permitted_list | 2 ++ 3 files changed, 10 insertions(+) diff --git a/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-M-O16C64/th3-z9332f-16x400G-64x100G.config.bcm b/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-M-O16C64/th3-z9332f-16x400G-64x100G.config.bcm index 1433de4d3b6c..cef161ded3cb 100644 --- a/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-M-O16C64/th3-z9332f-16x400G-64x100G.config.bcm +++ b/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-M-O16C64/th3-z9332f-16x400G-64x100G.config.bcm @@ -53,6 +53,10 @@ l2xlrn_intr_en=0 sai_optimized_mmu=1 mmu_init_config="TH3-MSFT-T0" +hybrid_pfc_deadlock_enable=1 +pfc_deadlock_seq_control=1 +sai_pfc_dlr_init_capability=1 + pbmp_xport_xe=0xffffffFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE phy_an_c73=3 diff --git a/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-O32/th3-z9332f-32x400G.config.bcm b/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-O32/th3-z9332f-32x400G.config.bcm index a46ac765bb66..59d767df3104 100644 --- a/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-O32/th3-z9332f-32x400G.config.bcm +++ b/device/dell/x86_64-dellemc_z9332f_d1508-r0/DellEMC-Z9332f-O32/th3-z9332f-32x400G.config.bcm @@ -53,6 +53,10 @@ l2xlrn_intr_en=0 sai_optimized_mmu=1 mmu_init_config="TH3-MSFT-T1" +hybrid_pfc_deadlock_enable=1 +pfc_deadlock_seq_control=1 +sai_pfc_dlr_init_capability=1 + pbmp_xport_xe=0xffffffFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE phy_an_c73=3 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 41932882a32a..01ed79c41ff8 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -320,3 +320,5 @@ xflow_macsec_secure_chan_to_num_secure_assoc_encrypt xflow_macsec_secure_chan_to_num_secure_assoc_decrypt sai_mdio_access_clause22 cmic_dma_abort_in_cold_boot +hybrid_pfc_deadlock_enable +sai_pfc_dlr_init_capability From 770cb80017861b2c33911c37b4cdd7b244726d3a Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Tue, 23 Aug 2022 04:34:04 +0000 Subject: [PATCH 690/817] [BRCM SAI 7.1.7.2] catch up CS00012257483 patch (#11768) Why I did it It solves a swss orchagent crash issue on PikeZ device, due to link-training setting of external PHY port. How I did it Catch up the fix for CS00012257483 in version 7.1.7.2. --- platform/broadcom/sai.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 8d78a89a97a5..6de969a662bc 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,5 +1,5 @@ -LIBSAIBCM_XGS_VERSION = 7.1.7.1 -LIBSAIBCM_DNX_VERSION = 7.1.7.1 +LIBSAIBCM_XGS_VERSION = 7.1.7.2 +LIBSAIBCM_DNX_VERSION = 7.1.7.2 LIBSAIBCM_BRANCH_NAME = REL_7.0 LIBSAIBCM_XGS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_XGS_VERSION)" LIBSAIBCM_DNX_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmsai/$(LIBSAIBCM_BRANCH_NAME)/$(LIBSAIBCM_DNX_VERSION)" From fb774dd46aaa1c7bb2f5372bef9c1936054ccda8 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Tue, 23 Aug 2022 04:38:08 +0000 Subject: [PATCH 691/817] [gbsyncd] Build docker-gbsyncd-broncos image (#11748) The libsaibroncos debian package is published at $(LIBSAI_BRONCOS)_URL. Enable building docker-gbsyncd-broncos image on PLATFORM broadcom. --- platform/broadcom/rules.dep | 2 -- platform/broadcom/rules.mk | 2 -- platform/components/docker-gbsyncd-broncos.mk | 7 +++++-- platform/components/docker-gbsyncd-broncos/Dockerfile.j2 | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/platform/broadcom/rules.dep b/platform/broadcom/rules.dep index 220ee8019943..075636a8dedd 100644 --- a/platform/broadcom/rules.dep +++ b/platform/broadcom/rules.dep @@ -30,6 +30,4 @@ include $(PLATFORM_PATH)/libsaithrift-dev.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.dep include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.dep -ifeq ($(INCLUDE_GBSYNCD_BRONCOS), y) include $(PLATFORM_PATH)/../components/docker-gbsyncd-broncos.dep -endif diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 0b46bb1c8ec4..c43a66ee43e3 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -29,9 +29,7 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.mk include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.mk -ifeq ($(INCLUDE_GBSYNCD_BRONCOS), y) include $(PLATFORM_PATH)/../components/docker-gbsyncd-broncos.mk -endif BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/20190307/bcmcmd?sv=2015-04-05&sr=b&sig=sUdbU7oVbh5exbXXHVL5TDFBTWDDBASHeJ8Cp0B0TIc%3D&se=2038-05-06T22%3A34%3A19Z&sp=r" diff --git a/platform/components/docker-gbsyncd-broncos.mk b/platform/components/docker-gbsyncd-broncos.mk index 6e280ee5a655..1aad33f9680d 100644 --- a/platform/components/docker-gbsyncd-broncos.mk +++ b/platform/components/docker-gbsyncd-broncos.mk @@ -1,5 +1,8 @@ -LIBSAI_BRONCOS = libsaibroncos_0.0.1_amd64.deb -$(LIBSAI_BRONCOS)_URL = +LIBSAI_BRONCOS_VERSION = 3.8 +LIBSAI_BRONCOS_BRANCH_NAME = REL_3.8 +LIBSAI_BRONCOS_URL_PREFIX = "https://sonicstorage.blob.core.windows.net/public/sai/bcmpai/$(LIBSAI_BRONCOS_BRANCH_NAME)/$(LIBSAI_BRONCOS_VERSION)" +LIBSAI_BRONCOS = libsaibroncos_$(LIBSAI_BRONCOS_VERSION)_amd64.deb +$(LIBSAI_BRONCOS)_URL = "$(LIBSAI_BRONCOS_URL_PREFIX)/$(LIBSAI_BRONCOS)" ifneq ($($(LIBSAI_BRONCOS)_URL),) diff --git a/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 index f114679c6888..154c7735ce97 100644 --- a/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 +++ b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-config-engine-bullseye +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} ARG docker_container_name RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf From 0f4bca426eb0356fc88dc87c355a17ef4b85dfe1 Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Tue, 23 Aug 2022 09:48:42 -0400 Subject: [PATCH 692/817] [device/ruijie] Mitigation for security vulnerability #11779 Signed-off-by: maipbui maibui@microsoft.com Why I did it The xml.etree.ElementTree module is not secure against maliciously constructed data. How I did it Remove xml. Use lxml XML parsers package that prevent potentially malicious operation. --- device/ruijie/x86_64-ruijie_b6510-48vs8cq-r0/monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/ruijie/x86_64-ruijie_b6510-48vs8cq-r0/monitor.py b/device/ruijie/x86_64-ruijie_b6510-48vs8cq-r0/monitor.py index f9cbb31be401..103a2f30ac29 100755 --- a/device/ruijie/x86_64-ruijie_b6510-48vs8cq-r0/monitor.py +++ b/device/ruijie/x86_64-ruijie_b6510-48vs8cq-r0/monitor.py @@ -6,8 +6,8 @@ * PSU """ import os -import xml.etree.ElementTree as ET import glob +from lxml import etree as ET MAILBOX_DIR = "/sys/bus/i2c/devices/" PORTS_DIR = "/sys/class/net/" From 234b4973cddb0d3db550341b42c20785e9a0108c Mon Sep 17 00:00:00 2001 From: roberthong-qct <79961212+roberthong-qct@users.noreply.github.com> Date: Wed, 24 Aug 2022 01:10:08 +0800 Subject: [PATCH 693/817] [Quanta] Update files for Bullseye and kernel 5.10 with enhancements (#11755) * [Quanta][device][platform] Update files for IX7 Signed-off-by: roberthong-qct <10606901@qcttw.com> * [Quanta][device][platform] Update files for IX7_BDE Signed-off-by: roberthong-qct <10606901@qcttw.com> * [Quanta][device][platform] Update files for IX8 Signed-off-by: roberthong-qct <10606901@qcttw.com> * [Quanta][device][platform] Update files for IX8A_BDE Signed-off-by: roberthong-qct <10606901@qcttw.com> * [Quanta][device][platform] Update files for IX8C Signed-off-by: roberthong-qct <10606901@qcttw.com> * [Quanta][device][platform] Update files for IX9 Signed-off-by: roberthong-qct <10606901@qcttw.com> Signed-off-by: roberthong-qct <10606901@qcttw.com> --- .../media_settings.json | 254 ++++++++ .../preemphasis-32x100G.soc | 491 +++++++------- .../media_settings.json | 254 ++++++++ .../preemphasis-32x100G.soc | 515 ++++++++------- .../media_settings.json | 31 + .../preemphasis-48x25_8x100.soc | 224 +++---- .../media_settings.json | 21 + .../td3-ix8c-48x25G+8x100G.config.bcm | 161 +++-- .../led_proc_init.soc | 4 +- .../media_settings.json | 72 +++ .../Quanta-IX9-32X/hwsku.json | 132 ++++ .../Quanta-IX9-32X/th3-ix9-32x400G.config.bcm | 3 + .../x86_64-quanta_ix9_bwde-r0/custom_led.bin | Bin 204 -> 416 bytes .../led_proc_init.soc | 2 - .../media_settings.json | 132 ++++ .../x86_64-quanta_ix9_bwde-r0/platform.json | 600 ++++++++++++++++++ platform/broadcom/rules.mk | 2 +- .../ix7-32x/modules/qci_cpld_led.c | 2 +- .../ix7-32x/modules/quanta_hwmon_ipmi.c | 33 +- .../ix7-32x/modules/quanta_platform_ix7.c | 30 +- .../ix7-32x/sonic_platform/chassis.py | 25 +- .../ix7-32x/sonic_platform/component.py | 202 ++++++ .../ix7-32x/sonic_platform/fan_drawer.py | 2 +- .../ix7-32x/sonic_platform/psu.py | 4 +- .../ix7-32x/sonic_platform/sfp.py | 50 +- .../ix7-32x/sonic_platform/thermal.py | 4 +- .../ix7-32x/sonic_platform/watchdog.py | 15 +- .../ix7-32x/utils/quanta_ix7_util.py | 109 ++-- .../ix7-bwde-32x/modules/qci_cpld_led.c | 2 +- .../ix7-bwde-32x/modules/quanta_hwmon_ipmi.c | 33 +- .../modules/quanta_platform_ix7_bwde.c | 28 +- .../ix7-bwde-32x/sonic_platform/chassis.py | 45 +- .../ix7-bwde-32x/sonic_platform/component.py | 203 ++++++ .../ix7-bwde-32x/sonic_platform/fan.py | 91 +-- .../ix7-bwde-32x/sonic_platform/fan_drawer.py | 2 +- .../ix7-bwde-32x/sonic_platform/psu.py | 149 +++-- .../ix7-bwde-32x/sonic_platform/sfp.py | 50 +- .../ix7-bwde-32x/sonic_platform/thermal.py | 120 ++-- .../ix7-bwde-32x/sonic_platform/watchdog.py | 241 +++++++ .../utils/quanta_ix7_bwde_util.py | 109 ++-- .../ix8-56x/modules/qci_cpld_led.c | 2 +- .../ix8-56x/modules/qci_platform_ix8.c | 42 +- .../ix8-56x/modules/quanta_hwmon_ipmi.c | 37 +- .../ix8-56x/sonic_platform/chassis.py | 25 +- .../ix8-56x/sonic_platform/component.py | 203 ++++++ .../ix8-56x/sonic_platform/fan_drawer.py | 2 +- .../ix8-56x/sonic_platform/psu.py | 4 +- .../ix8-56x/sonic_platform/sfp.py | 50 +- .../ix8-56x/sonic_platform/thermal.py | 2 +- .../ix8-56x/sonic_platform/watchdog.py | 15 +- .../ix8-56x/utils/quanta_ix8_util.py | 117 ++-- .../ix8a-bwde-56x/modules/qci_cpld_led.c | 2 +- .../modules/qci_platform_ix8a_bwde.c | 40 +- .../ix8a-bwde-56x/modules/quanta_hwmon_ipmi.c | 145 ++++- .../ix8a-bwde-56x/sonic_platform/chassis.py | 25 +- .../ix8a-bwde-56x/sonic_platform/component.py | 204 ++++++ .../ix8a-bwde-56x/sonic_platform/fan.py | 75 ++- .../sonic_platform/fan_drawer.py | 2 +- .../ix8a-bwde-56x/sonic_platform/psu.py | 148 ++--- .../ix8a-bwde-56x/sonic_platform/sfp.py | 50 +- .../ix8a-bwde-56x/sonic_platform/thermal.py | 138 ++-- .../ix8a-bwde-56x/sonic_platform/watchdog.py | 15 +- .../utils/quanta_ix8a_bwde_util.py | 87 ++- .../ix8c-56x/modules/qci_cpld_led.c | 2 +- .../ix8c-56x/modules/qci_platform_ix8c.c | 40 +- .../ix8c-56x/modules/quanta_hwmon_ipmi.c | 135 +++- .../ix8c-56x/sonic_platform/chassis.py | 37 +- .../ix8c-56x/sonic_platform/component.py | 204 ++++++ .../ix8c-56x/sonic_platform/fan.py | 77 ++- .../ix8c-56x/sonic_platform/fan_drawer.py | 2 +- .../ix8c-56x/sonic_platform/psu.py | 190 ++++-- .../ix8c-56x/sonic_platform/sfp.py | 50 +- .../ix8c-56x/sonic_platform/thermal.py | 131 +++- .../ix8c-56x/sonic_platform/watchdog.py | 241 +++++++ .../ix8c-56x/utils/quanta_ix8c_util.py | 110 ++-- .../ix9-32x/modules/qci_cpld_led.c | 2 +- .../ix9-32x/modules/qci_platform_ix9.c | 28 +- .../ix9-32x/modules/quanta_hwmon_ipmi.c | 15 +- .../ix9-32x/sonic_platform/chassis.py | 35 +- .../ix9-32x/sonic_platform/component.py | 203 ++++++ .../ix9-32x/sonic_platform/fan.py | 75 ++- .../ix9-32x/sonic_platform/fan_drawer.py | 2 +- .../ix9-32x/sonic_platform/psu.py | 148 ++--- .../ix9-32x/sonic_platform/sfp.py | 61 +- .../ix9-32x/sonic_platform/thermal.py | 122 ++-- .../ix9-32x/sonic_platform/watchdog.py | 15 +- .../ix9-32x/utils/quanta_ix9_util.py | 132 ++-- 87 files changed, 5856 insertions(+), 2078 deletions(-) create mode 100644 device/quanta/x86_64-quanta_ix7_bwde-r0/media_settings.json create mode 100644 device/quanta/x86_64-quanta_ix7_rglbmc-r0/media_settings.json create mode 100644 device/quanta/x86_64-quanta_ix8_rglbmc-r0/media_settings.json create mode 100644 device/quanta/x86_64-quanta_ix8a_bwde-r0/media_settings.json create mode 100644 device/quanta/x86_64-quanta_ix8c_bwde-r0/media_settings.json create mode 100755 device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/hwsku.json create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/media_settings.json create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/platform.json create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/watchdog.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/watchdog.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/component.py diff --git a/device/quanta/x86_64-quanta_ix7_bwde-r0/media_settings.json b/device/quanta/x86_64-quanta_ix7_bwde-r0/media_settings.json new file mode 100644 index 000000000000..0ea47167be6a --- /dev/null +++ b/device/quanta/x86_64-quanta_ix7_bwde-r0/media_settings.json @@ -0,0 +1,254 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-1": { + "Default": { + "preemphasis": { + "lane0": "0x114D06", + "lane1": "0x0F4F06", + "lane2": "0x0F4F06", + "lane3": "0x104E06" + } + } + }, + "2,4": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x114D06", + "lane3": "0x104E06" + } + } + }, + "3-3": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x104E06", + "lane3": "0x104E06" + } + } + }, + "5-5": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x114D06", + "lane2": "0x0F4F06", + "lane3": "0x114D06" + } + } + }, + "6-6": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x0F4F06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "7-7": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x0F4F06", + "lane2": "0x0D5106", + "lane3": "0x0F4F06" + } + } + }, + "8-8": { + "Default": { + "preemphasis": { + "lane0": "0x0D5106", + "lane1": "0x0D5106", + "lane2": "0x0D5106", + "lane3": "0x0E5006" + } + } + }, + "9,23": { + "Default": { + "preemphasis": { + "lane0": "0x0C5206", + "lane1": "0x0C5206", + "lane2": "0x0C5206", + "lane3": "0x0C5206" + } + } + }, + "10-10": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0C5206" + } + } + }, + "11,13": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0B5306", + "lane2": "0x0A5406", + "lane3": "0x0B5306" + } + } + }, + "12,14": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0B5306", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "15,17": { + "Default": { + "preemphasis": { + "lane0": "0x095506", + "lane1": "0x095506", + "lane2": "0x095506", + "lane3": "0x095506" + } + } + }, + "16-16": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0A5406", + "lane2": "0x0A5406", + "lane3": "0x095506" + } + } + }, + "18,19": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0A5406", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "20-20": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0C5206" + } + } + }, + "21-21": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0B5306", + "lane2": "0x0B5306", + "lane3": "0x0B5306" + } + } + }, + "22-22": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "24-24": { + "Default": { + "preemphasis": { + "lane0": "0x0C5206", + "lane1": "0x0C5206", + "lane2": "0x0B5306", + "lane3": "0x0C5206" + } + } + }, + "25-25": { + "Default": { + "preemphasis": { + "lane0": "0x0E5006", + "lane1": "0x0D5106", + "lane2": "0x0D5106", + "lane3": "0x0D5106" + } + } + }, + "26-26": { + "Default": { + "preemphasis": { + "lane0": "0x0E5006", + "lane1": "0x0E5006", + "lane2": "0x0D5106", + "lane3": "0x0E5006" + } + } + }, + "27-27": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x114D06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "28,31": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x114D06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "29-29": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x104E06", + "lane2": "0x104E06", + "lane3": "0x104E06" + } + } + }, + "30-30": { + "Default": { + "preemphasis": { + "lane0": "0x114D06", + "lane1": "0x114D06", + "lane2": "0x114D06", + "lane3": "0x114D06" + } + } + }, + "32-32": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x114D06", + "lane3": "0x114D06" + } + } + } + } +} diff --git a/device/quanta/x86_64-quanta_ix7_bwde-r0/preemphasis-32x100G.soc b/device/quanta/x86_64-quanta_ix7_bwde-r0/preemphasis-32x100G.soc index 986bb271ca1b..f092f6c29aa3 100644 --- a/device/quanta/x86_64-quanta_ix7_bwde-r0/preemphasis-32x100G.soc +++ b/device/quanta/x86_64-quanta_ix7_bwde-r0/preemphasis-32x100G.soc @@ -1,546 +1,545 @@ # Pre-emphasis phy raw c45 0xa5 0x1 0xffde 0 -phy raw c45 0xa5 0x1 0xd130 0x4d -phy raw c45 0xa5 0x1 0xd131 0x0611 +phy raw c45 0xa5 0x1 0xd130 0x4D +phy raw c45 0xa5 0x1 0xd131 0x611 phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 1 -phy raw c45 0xa5 0x1 0xd130 0x4d -phy raw c45 0xa5 0x1 0xd131 0x0611 +phy raw c45 0xa5 0x1 0xd130 0x4F +phy raw c45 0xa5 0x1 0xd131 0x60F phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 2 -phy raw c45 0xa5 0x1 0xd130 0x4e -phy raw c45 0xa5 0x1 0xd131 0x0610 +phy raw c45 0xa5 0x1 0xd130 0x4F +phy raw c45 0xa5 0x1 0xd131 0x60F phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 3 -phy raw c45 0xa5 0x1 0xd130 0x4e -phy raw c45 0xa5 0x1 0xd131 0x0610 +phy raw c45 0xa5 0x1 0xd130 0x4E +phy raw c45 0xa5 0x1 0xd131 0x610 phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 0 -phy raw c45 0xa9 0x1 0xd130 0x4e -phy raw c45 0xa9 0x1 0xd131 0x0610 +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 1 -phy raw c45 0xa9 0x1 0xd130 0x4e -phy raw c45 0xa9 0x1 0xd131 0x0610 +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 2 -phy raw c45 0xa9 0x1 0xd130 0x4e -phy raw c45 0xa9 0x1 0xd131 0x0610 +phy raw c45 0xa9 0x1 0xd130 0x4D +phy raw c45 0xa9 0x1 0xd131 0x611 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 3 -phy raw c45 0xa9 0x1 0xd130 0x4e -phy raw c45 0xa9 0x1 0xd131 0x0610 +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 0 -phy raw c45 0xc1 0x1 0xd130 0x4e -phy raw c45 0xc1 0x1 0xd131 0x0610 +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 1 -phy raw c45 0xc1 0x1 0xd130 0x4d -phy raw c45 0xc1 0x1 0xd131 0x0611 +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 2 -phy raw c45 0xc1 0x1 0xd130 0x4e -phy raw c45 0xc1 0x1 0xd131 0x0610 +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 3 -phy raw c45 0xc1 0x1 0xd130 0x4e -phy raw c45 0xc1 0x1 0xd131 0x0610 +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 0 -phy raw c45 0xc5 0x1 0xd130 0x4e -phy raw c45 0xc5 0x1 0xd131 0x0610 +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 1 -phy raw c45 0xc5 0x1 0xd130 0x4e -phy raw c45 0xc5 0x1 0xd131 0x0610 +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 2 -phy raw c45 0xc5 0x1 0xd130 0x4d -phy raw c45 0xc5 0x1 0xd131 0x0611 +phy raw c45 0xc5 0x1 0xd130 0x4D +phy raw c45 0xc5 0x1 0xd131 0x611 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 3 -phy raw c45 0xc5 0x1 0xd130 0x4e -phy raw c45 0xc5 0x1 0xd131 0x0610 +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 0 -phy raw c45 0x81 0x1 0xd130 0x4e -phy raw c45 0x81 0x1 0xd131 0x0610 +phy raw c45 0x81 0x1 0xd130 0x4E +phy raw c45 0x81 0x1 0xd131 0x610 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 1 -phy raw c45 0x81 0x1 0xd130 0x4d -phy raw c45 0x81 0x1 0xd131 0x0611 +phy raw c45 0x81 0x1 0xd130 0x4D +phy raw c45 0x81 0x1 0xd131 0x611 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 2 -phy raw c45 0x81 0x1 0xd130 0x4e -phy raw c45 0x81 0x1 0xd131 0x0610 +phy raw c45 0x81 0x1 0xd130 0x4F +phy raw c45 0x81 0x1 0xd131 0x60F phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 3 -phy raw c45 0x81 0x1 0xd130 0x4e -phy raw c45 0x81 0x1 0xd131 0x0610 +phy raw c45 0x81 0x1 0xd130 0x4D +phy raw c45 0x81 0x1 0xd131 0x611 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 0 -phy raw c45 0x85 0x1 0xd130 0x4e -phy raw c45 0x85 0x1 0xd131 0x0610 +phy raw c45 0x85 0x1 0xd130 0x4F +phy raw c45 0x85 0x1 0xd131 0x60F phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 1 -phy raw c45 0x85 0x1 0xd130 0x4e -phy raw c45 0x85 0x1 0xd131 0x0610 +phy raw c45 0x85 0x1 0xd130 0x4F +phy raw c45 0x85 0x1 0xd131 0x60F phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 2 -phy raw c45 0x85 0x1 0xd130 0x4e -phy raw c45 0x85 0x1 0xd131 0x0610 +phy raw c45 0x85 0x1 0xd130 0x4E +phy raw c45 0x85 0x1 0xd131 0x610 phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 3 -phy raw c45 0x85 0x1 0xd130 0x4d -phy raw c45 0x85 0x1 0xd131 0x0611 +phy raw c45 0x85 0x1 0xd130 0x4D +phy raw c45 0x85 0x1 0xd131 0x611 phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 0 -phy raw c45 0x89 0x1 0xd130 0x50 -phy raw c45 0x89 0x1 0xd131 0x060e +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 1 -phy raw c45 0x89 0x1 0xd130 0x50 -phy raw c45 0x89 0x1 0xd131 0x060e +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 2 -phy raw c45 0x89 0x1 0xd130 0x50 -phy raw c45 0x89 0x1 0xd131 0x060e +phy raw c45 0x89 0x1 0xd130 0x51 +phy raw c45 0x89 0x1 0xd131 0x60D phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 3 -phy raw c45 0x89 0x1 0xd130 0x50 -phy raw c45 0x89 0x1 0xd131 0x060e +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 0 -phy raw c45 0x8d 0x1 0xd130 0x4f -phy raw c45 0x8d 0x1 0xd131 0x060f +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 1 -phy raw c45 0x8d 0x1 0xd130 0x4f -phy raw c45 0x8d 0x1 0xd131 0x060f +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 2 -phy raw c45 0x8d 0x1 0xd130 0x4f -phy raw c45 0x8d 0x1 0xd131 0x060f +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 3 -phy raw c45 0x8d 0x1 0xd130 0x4f -phy raw c45 0x8d 0x1 0xd131 0x060f +phy raw c45 0x8d 0x1 0xd130 0x50 +phy raw c45 0x8d 0x1 0xd131 0x60E phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 0 -phy raw c45 0x91 0x1 0xd130 0x50 -phy raw c45 0x91 0x1 0xd131 0x060e +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 1 -phy raw c45 0x91 0x1 0xd130 0x50 -phy raw c45 0x91 0x1 0xd131 0x060e +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 2 -phy raw c45 0x91 0x1 0xd130 0x50 -phy raw c45 0x91 0x1 0xd131 0x060e +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 3 -phy raw c45 0x91 0x1 0xd130 0x50 -phy raw c45 0x91 0x1 0xd131 0x060e +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 0 -phy raw c45 0x95 0x1 0xd130 0x52 -phy raw c45 0x95 0x1 0xd131 0x060c +phy raw c45 0x95 0x1 0xd130 0x54 +phy raw c45 0x95 0x1 0xd131 0x60A phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 1 phy raw c45 0x95 0x1 0xd130 0x52 -phy raw c45 0x95 0x1 0xd131 0x060c +phy raw c45 0x95 0x1 0xd131 0x60C phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 2 -phy raw c45 0x95 0x1 0xd130 0x52 -phy raw c45 0x95 0x1 0xd131 0x060c +phy raw c45 0x95 0x1 0xd130 0x54 +phy raw c45 0x95 0x1 0xd131 0x60A phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 3 phy raw c45 0x95 0x1 0xd130 0x52 -phy raw c45 0x95 0x1 0xd131 0x060c +phy raw c45 0x95 0x1 0xd131 0x60C phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 0 -phy raw c45 0xa1 0x1 0xd130 0x52 -phy raw c45 0xa1 0x1 0xd131 0x060c +phy raw c45 0xa1 0x1 0xd130 0x54 +phy raw c45 0xa1 0x1 0xd131 0x60A phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 1 -phy raw c45 0xa1 0x1 0xd130 0x52 -phy raw c45 0xa1 0x1 0xd131 0x060c +phy raw c45 0xa1 0x1 0xd130 0x53 +phy raw c45 0xa1 0x1 0xd131 0x60B phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 2 -phy raw c45 0xa1 0x1 0xd130 0x52 -phy raw c45 0xa1 0x1 0xd131 0x060c +phy raw c45 0xa1 0x1 0xd130 0x54 +phy raw c45 0xa1 0x1 0xd131 0x60A phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 3 -phy raw c45 0xa1 0x1 0xd130 0x52 -phy raw c45 0xa1 0x1 0xd131 0x060c +phy raw c45 0xa1 0x1 0xd130 0x53 +phy raw c45 0xa1 0x1 0xd131 0x60B phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 0 -phy raw c45 0xad 0x1 0xd130 0x53 -phy raw c45 0xad 0x1 0xd131 0x060b +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 1 phy raw c45 0xad 0x1 0xd130 0x53 -phy raw c45 0xad 0x1 0xd131 0x060b +phy raw c45 0xad 0x1 0xd131 0x60B phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 2 -phy raw c45 0xad 0x1 0xd130 0x53 -phy raw c45 0xad 0x1 0xd131 0x060b +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 3 -phy raw c45 0xad 0x1 0xd130 0x53 -phy raw c45 0xad 0x1 0xd131 0x060b +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 0 -phy raw c45 0xc9 0x1 0xd130 0x53 -phy raw c45 0xc9 0x1 0xd131 0x060b +phy raw c45 0xc9 0x1 0xd130 0x54 +phy raw c45 0xc9 0x1 0xd131 0x60A phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 1 phy raw c45 0xc9 0x1 0xd130 0x53 -phy raw c45 0xc9 0x1 0xd131 0x060b +phy raw c45 0xc9 0x1 0xd131 0x60B phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 2 -phy raw c45 0xc9 0x1 0xd130 0x53 -phy raw c45 0xc9 0x1 0xd131 0x060b +phy raw c45 0xc9 0x1 0xd130 0x54 +phy raw c45 0xc9 0x1 0xd131 0x60A phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 3 phy raw c45 0xc9 0x1 0xd130 0x53 -phy raw c45 0xc9 0x1 0xd131 0x060b +phy raw c45 0xc9 0x1 0xd131 0x60B phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 0 phy raw c45 0xcd 0x1 0xd130 0x54 -phy raw c45 0xcd 0x1 0xd131 0x060a +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 1 -phy raw c45 0xcd 0x1 0xd130 0x54 -phy raw c45 0xcd 0x1 0xd131 0x060a +phy raw c45 0xcd 0x1 0xd130 0x53 +phy raw c45 0xcd 0x1 0xd131 0x60B phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 2 phy raw c45 0xcd 0x1 0xd130 0x54 -phy raw c45 0xcd 0x1 0xd131 0x060a +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 3 phy raw c45 0xcd 0x1 0xd130 0x54 -phy raw c45 0xcd 0x1 0xd131 0x060a +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 0 -phy raw c45 0xd1 0x1 0xd130 0x56 -phy raw c45 0xd1 0x1 0xd131 0x0608 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 1 -phy raw c45 0xd1 0x1 0xd130 0x56 -phy raw c45 0xd1 0x1 0xd131 0x0608 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 2 -phy raw c45 0xd1 0x1 0xd130 0x56 -phy raw c45 0xd1 0x1 0xd131 0x0608 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 3 -phy raw c45 0xd1 0x1 0xd130 0x56 -phy raw c45 0xd1 0x1 0xd131 0x0608 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 0 -phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x0609 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 1 -phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x0609 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 2 -phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x0609 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 3 phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x0609 +phy raw c45 0xd5 0x1 0xd131 0x609 phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 0 -phy raw c45 0xe1 0x1 0xd130 0x56 -phy raw c45 0xe1 0x1 0xd131 0x0608 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 1 -phy raw c45 0xe1 0x1 0xd130 0x56 -phy raw c45 0xe1 0x1 0xd131 0x0608 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 2 -phy raw c45 0xe1 0x1 0xd130 0x56 -phy raw c45 0xe1 0x1 0xd131 0x0608 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 3 -phy raw c45 0xe1 0x1 0xd130 0x56 -phy raw c45 0xe1 0x1 0xd131 0x0608 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 0 -phy raw c45 0xe5 0x1 0xd130 0x55 -phy raw c45 0xe5 0x1 0xd131 0x0609 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 1 -phy raw c45 0xe5 0x1 0xd130 0x55 -phy raw c45 0xe5 0x1 0xd131 0x0609 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 2 -phy raw c45 0xe5 0x1 0xd130 0x55 -phy raw c45 0xe5 0x1 0xd131 0x0609 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 3 -phy raw c45 0xe5 0x1 0xd130 0x55 -phy raw c45 0xe5 0x1 0xd131 0x0609 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 0 -phy raw c45 0xe9 0x1 0xd130 0x56 -phy raw c45 0xe9 0x1 0xd131 0x0608 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 1 -phy raw c45 0xe9 0x1 0xd130 0x56 -phy raw c45 0xe9 0x1 0xd131 0x0608 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 2 -phy raw c45 0xe9 0x1 0xd130 0x56 -phy raw c45 0xe9 0x1 0xd131 0x0608 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 3 -phy raw c45 0xe9 0x1 0xd130 0x56 -phy raw c45 0xe9 0x1 0xd131 0x0608 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 0 -phy raw c45 0xed 0x1 0xd130 0x55 -phy raw c45 0xed 0x1 0xd131 0x0609 +phy raw c45 0xed 0x1 0xd130 0x53 +phy raw c45 0xed 0x1 0xd131 0x60B phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 1 -phy raw c45 0xed 0x1 0xd130 0x53 -phy raw c45 0xed 0x1 0xd131 0x060b +phy raw c45 0xed 0x1 0xd130 0x52 +phy raw c45 0xed 0x1 0xd131 0x60C phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 2 phy raw c45 0xed 0x1 0xd130 0x54 -phy raw c45 0xed 0x1 0xd131 0x060a +phy raw c45 0xed 0x1 0xd131 0x60A phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 3 -phy raw c45 0xed 0x1 0xd130 0x54 -phy raw c45 0xed 0x1 0xd131 0x060a +phy raw c45 0xed 0x1 0xd130 0x52 +phy raw c45 0xed 0x1 0xd131 0x60C phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 0 -phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x0609 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 1 -phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x0609 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 2 -phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x0609 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 3 -phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x0609 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 0 -phy raw c45 0x18d 0x1 0xd130 0x54 -phy raw c45 0x18d 0x1 0xd131 0x060a +phy raw c45 0x18d 0x1 0xd130 0x53 +phy raw c45 0x18d 0x1 0xd131 0x60B phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 1 -phy raw c45 0x18d 0x1 0xd130 0x53 -phy raw c45 0x18d 0x1 0xd131 0x060b +phy raw c45 0x18d 0x1 0xd130 0x52 +phy raw c45 0x18d 0x1 0xd131 0x60C phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 2 -phy raw c45 0x18d 0x1 0xd130 0x53 -phy raw c45 0x18d 0x1 0xd131 0x060b +phy raw c45 0x18d 0x1 0xd130 0x54 +phy raw c45 0x18d 0x1 0xd131 0x60A phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 3 -phy raw c45 0x18d 0x1 0xd130 0x53 -phy raw c45 0x18d 0x1 0xd131 0x060b +phy raw c45 0x18d 0x1 0xd130 0x54 +phy raw c45 0x18d 0x1 0xd131 0x60A phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 0 -phy raw c45 0x1a1 0x1 0xd130 0x55 -phy raw c45 0x1a1 0x1 0xd131 0x0609 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 1 -phy raw c45 0x1a1 0x1 0xd130 0x54 -phy raw c45 0x1a1 0x1 0xd131 0x060a +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 2 -phy raw c45 0x1a1 0x1 0xd130 0x55 -phy raw c45 0x1a1 0x1 0xd131 0x0609 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 3 -phy raw c45 0x1a1 0x1 0xd130 0x53 -phy raw c45 0x1a1 0x1 0xd131 0x060b +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 0 -phy raw c45 0x1a5 0x1 0xd130 0x54 -phy raw c45 0x1a5 0x1 0xd131 0x060a +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 1 -phy raw c45 0x1a5 0x1 0xd130 0x53 -phy raw c45 0x1a5 0x1 0xd131 0x060b +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 2 phy raw c45 0x1a5 0x1 0xd130 0x53 -phy raw c45 0x1a5 0x1 0xd131 0x060b +phy raw c45 0x1a5 0x1 0xd131 0x60B phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 3 -phy raw c45 0x1a5 0x1 0xd130 0x53 -phy raw c45 0x1a5 0x1 0xd131 0x060b +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 0 -phy raw c45 0x1a9 0x1 0xd130 0x54 -phy raw c45 0x1a9 0x1 0xd131 0x060a +phy raw c45 0x1a9 0x1 0xd130 0x50 +phy raw c45 0x1a9 0x1 0xd131 0x60E phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 1 phy raw c45 0x1a9 0x1 0xd130 0x51 -phy raw c45 0x1a9 0x1 0xd131 0x060d +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 2 -phy raw c45 0x1a9 0x1 0xd130 0x52 -phy raw c45 0x1a9 0x1 0xd131 0x060c +phy raw c45 0x1a9 0x1 0xd130 0x51 +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 3 -phy raw c45 0x1a9 0x1 0xd130 0x52 -phy raw c45 0x1a9 0x1 0xd131 0x060c +phy raw c45 0x1a9 0x1 0xd130 0x51 +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 0 -phy raw c45 0x1ad 0x1 0xd130 0x51 -phy raw c45 0x1ad 0x1 0xd131 0x060d +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 1 -phy raw c45 0x1ad 0x1 0xd130 0x4f -phy raw c45 0x1ad 0x1 0xd131 0x060f +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 2 -phy raw c45 0x1ad 0x1 0xd130 0x4f -phy raw c45 0x1ad 0x1 0xd131 0x060f +phy raw c45 0x1ad 0x1 0xd130 0x51 +phy raw c45 0x1ad 0x1 0xd131 0x60D phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 3 -phy raw c45 0x1ad 0x1 0xd130 0x4f -phy raw c45 0x1ad 0x1 0xd131 0x060f +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 0 -phy raw c45 0x1b1 0x1 0xd130 0x4f -phy raw c45 0x1b1 0x1 0xd131 0x060f +phy raw c45 0x1b1 0x1 0xd130 0x4F +phy raw c45 0x1b1 0x1 0xd131 0x60F phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 1 -phy raw c45 0x1b1 0x1 0xd130 0x4f -phy raw c45 0x1b1 0x1 0xd131 0x060f +phy raw c45 0x1b1 0x1 0xd130 0x4D +phy raw c45 0x1b1 0x1 0xd131 0x611 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 2 -phy raw c45 0x1b1 0x1 0xd130 0x4f -phy raw c45 0x1b1 0x1 0xd131 0x060f +phy raw c45 0x1b1 0x1 0xd130 0x4E +phy raw c45 0x1b1 0x1 0xd131 0x610 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 3 -phy raw c45 0x1b1 0x1 0xd130 0x4f -phy raw c45 0x1b1 0x1 0xd131 0x060f +phy raw c45 0x1b1 0x1 0xd130 0x4D +phy raw c45 0x1b1 0x1 0xd131 0x611 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 0 -phy raw c45 0x1b5 0x1 0xd130 0x4e -phy raw c45 0x1b5 0x1 0xd131 0x0610 +phy raw c45 0x1b5 0x1 0xd130 0x4E +phy raw c45 0x1b5 0x1 0xd131 0x610 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 1 -phy raw c45 0x1b5 0x1 0xd130 0x4d -phy raw c45 0x1b5 0x1 0xd131 0x0611 +phy raw c45 0x1b5 0x1 0xd130 0x4D +phy raw c45 0x1b5 0x1 0xd131 0x611 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 2 -phy raw c45 0x1b5 0x1 0xd130 0x4d -phy raw c45 0x1b5 0x1 0xd131 0x0611 +phy raw c45 0x1b5 0x1 0xd130 0x4E +phy raw c45 0x1b5 0x1 0xd131 0x610 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 3 -phy raw c45 0x1b5 0x1 0xd130 0x4d -phy raw c45 0x1b5 0x1 0xd131 0x0611 +phy raw c45 0x1b5 0x1 0xd130 0x4D +phy raw c45 0x1b5 0x1 0xd131 0x611 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 0 -phy raw c45 0xf1 0x1 0xd130 0x4f -phy raw c45 0xf1 0x1 0xd131 0x060f +phy raw c45 0xf1 0x1 0xd130 0x4F +phy raw c45 0xf1 0x1 0xd131 0x60F phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 1 -phy raw c45 0xf1 0x1 0xd130 0x4f -phy raw c45 0xf1 0x1 0xd131 0x060f +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 2 -phy raw c45 0xf1 0x1 0xd130 0x4f -phy raw c45 0xf1 0x1 0xd131 0x060f +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 3 -phy raw c45 0xf1 0x1 0xd130 0x4f -phy raw c45 0xf1 0x1 0xd131 0x060f +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 0 -phy raw c45 0xf5 0x1 0xd130 0x4d -phy raw c45 0xf5 0x1 0xd131 0x0611 +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 1 -phy raw c45 0xf5 0x1 0xd130 0x4d -phy raw c45 0xf5 0x1 0xd131 0x0611 +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 2 -phy raw c45 0xf5 0x1 0xd130 0x4d -phy raw c45 0xf5 0x1 0xd131 0x0611 +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 3 -phy raw c45 0xf5 0x1 0xd130 0x4d -phy raw c45 0xf5 0x1 0xd131 0x0611 +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 0 -phy raw c45 0x181 0x1 0xd130 0x4e -phy raw c45 0x181 0x1 0xd131 0x0610 +phy raw c45 0x181 0x1 0xd130 0x4E +phy raw c45 0x181 0x1 0xd131 0x610 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 1 -phy raw c45 0x181 0x1 0xd130 0x4e -phy raw c45 0x181 0x1 0xd131 0x0610 +phy raw c45 0x181 0x1 0xd130 0x4D +phy raw c45 0x181 0x1 0xd131 0x611 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 2 -phy raw c45 0x181 0x1 0xd130 0x4e -phy raw c45 0x181 0x1 0xd131 0x0610 +phy raw c45 0x181 0x1 0xd130 0x4E +phy raw c45 0x181 0x1 0xd131 0x610 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 3 -phy raw c45 0x181 0x1 0xd130 0x4e -phy raw c45 0x181 0x1 0xd131 0x0610 +phy raw c45 0x181 0x1 0xd130 0x4D +phy raw c45 0x181 0x1 0xd131 0x611 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 0 -phy raw c45 0x189 0x1 0xd130 0x4d -phy raw c45 0x189 0x1 0xd131 0x0611 +phy raw c45 0x189 0x1 0xd130 0x4E +phy raw c45 0x189 0x1 0xd131 0x610 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 1 -phy raw c45 0x189 0x1 0xd130 0x4d -phy raw c45 0x189 0x1 0xd131 0x0611 +phy raw c45 0x189 0x1 0xd130 0x4E +phy raw c45 0x189 0x1 0xd131 0x610 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 2 -phy raw c45 0x189 0x1 0xd130 0x4d -phy raw c45 0x189 0x1 0xd131 0x0611 +phy raw c45 0x189 0x1 0xd130 0x4D +phy raw c45 0x189 0x1 0xd131 0x611 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 3 -phy raw c45 0x189 0x1 0xd130 0x4d -phy raw c45 0x189 0x1 0xd131 0x0611 -phy raw c45 0x189 0x1 0xd134 1 - +phy raw c45 0x189 0x1 0xd130 0x4D +phy raw c45 0x189 0x1 0xd131 0x611 +phy raw c45 0x189 0x1 0xd134 1 \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/media_settings.json b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/media_settings.json new file mode 100644 index 000000000000..0ea47167be6a --- /dev/null +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/media_settings.json @@ -0,0 +1,254 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-1": { + "Default": { + "preemphasis": { + "lane0": "0x114D06", + "lane1": "0x0F4F06", + "lane2": "0x0F4F06", + "lane3": "0x104E06" + } + } + }, + "2,4": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x114D06", + "lane3": "0x104E06" + } + } + }, + "3-3": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x104E06", + "lane3": "0x104E06" + } + } + }, + "5-5": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x114D06", + "lane2": "0x0F4F06", + "lane3": "0x114D06" + } + } + }, + "6-6": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x0F4F06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "7-7": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x0F4F06", + "lane2": "0x0D5106", + "lane3": "0x0F4F06" + } + } + }, + "8-8": { + "Default": { + "preemphasis": { + "lane0": "0x0D5106", + "lane1": "0x0D5106", + "lane2": "0x0D5106", + "lane3": "0x0E5006" + } + } + }, + "9,23": { + "Default": { + "preemphasis": { + "lane0": "0x0C5206", + "lane1": "0x0C5206", + "lane2": "0x0C5206", + "lane3": "0x0C5206" + } + } + }, + "10-10": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0C5206" + } + } + }, + "11,13": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0B5306", + "lane2": "0x0A5406", + "lane3": "0x0B5306" + } + } + }, + "12,14": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0B5306", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "15,17": { + "Default": { + "preemphasis": { + "lane0": "0x095506", + "lane1": "0x095506", + "lane2": "0x095506", + "lane3": "0x095506" + } + } + }, + "16-16": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0A5406", + "lane2": "0x0A5406", + "lane3": "0x095506" + } + } + }, + "18,19": { + "Default": { + "preemphasis": { + "lane0": "0x0A5406", + "lane1": "0x0A5406", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "20-20": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0C5206" + } + } + }, + "21-21": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0B5306", + "lane2": "0x0B5306", + "lane3": "0x0B5306" + } + } + }, + "22-22": { + "Default": { + "preemphasis": { + "lane0": "0x0B5306", + "lane1": "0x0C5206", + "lane2": "0x0A5406", + "lane3": "0x0A5406" + } + } + }, + "24-24": { + "Default": { + "preemphasis": { + "lane0": "0x0C5206", + "lane1": "0x0C5206", + "lane2": "0x0B5306", + "lane3": "0x0C5206" + } + } + }, + "25-25": { + "Default": { + "preemphasis": { + "lane0": "0x0E5006", + "lane1": "0x0D5106", + "lane2": "0x0D5106", + "lane3": "0x0D5106" + } + } + }, + "26-26": { + "Default": { + "preemphasis": { + "lane0": "0x0E5006", + "lane1": "0x0E5006", + "lane2": "0x0D5106", + "lane3": "0x0E5006" + } + } + }, + "27-27": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x114D06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "28,31": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x114D06", + "lane2": "0x104E06", + "lane3": "0x114D06" + } + } + }, + "29-29": { + "Default": { + "preemphasis": { + "lane0": "0x0F4F06", + "lane1": "0x104E06", + "lane2": "0x104E06", + "lane3": "0x104E06" + } + } + }, + "30-30": { + "Default": { + "preemphasis": { + "lane0": "0x114D06", + "lane1": "0x114D06", + "lane2": "0x114D06", + "lane3": "0x114D06" + } + } + }, + "32-32": { + "Default": { + "preemphasis": { + "lane0": "0x104E06", + "lane1": "0x104E06", + "lane2": "0x114D06", + "lane3": "0x114D06" + } + } + } + } +} diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/preemphasis-32x100G.soc b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/preemphasis-32x100G.soc index 5837a6fdce87..f092f6c29aa3 100644 --- a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/preemphasis-32x100G.soc +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/preemphasis-32x100G.soc @@ -1,546 +1,545 @@ # Pre-emphasis phy raw c45 0xa5 0x1 0xffde 0 -phy raw c45 0xa5 0x1 0xd130 0x41 -phy raw c45 0xa5 0x1 0xd131 0xd +phy raw c45 0xa5 0x1 0xd130 0x4D +phy raw c45 0xa5 0x1 0xd131 0x611 phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 1 -phy raw c45 0xa5 0x1 0xd130 0x41 -phy raw c45 0xa5 0x1 0xd131 0xd +phy raw c45 0xa5 0x1 0xd130 0x4F +phy raw c45 0xa5 0x1 0xd131 0x60F phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 2 -phy raw c45 0xa5 0x1 0xd130 0x41 -phy raw c45 0xa5 0x1 0xd131 0xd +phy raw c45 0xa5 0x1 0xd130 0x4F +phy raw c45 0xa5 0x1 0xd131 0x60F phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa5 0x1 0xffde 3 -phy raw c45 0xa5 0x1 0xd130 0x41 -phy raw c45 0xa5 0x1 0xd131 0xd +phy raw c45 0xa5 0x1 0xd130 0x4E +phy raw c45 0xa5 0x1 0xd131 0x610 phy raw c45 0xa5 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 0 -phy raw c45 0xa9 0x1 0xd130 0x41 -phy raw c45 0xa9 0x1 0xd131 0xd +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 1 -phy raw c45 0xa9 0x1 0xd130 0x41 -phy raw c45 0xa9 0x1 0xd131 0xd +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 2 -phy raw c45 0xa9 0x1 0xd130 0x41 -phy raw c45 0xa9 0x1 0xd131 0xd +phy raw c45 0xa9 0x1 0xd130 0x4D +phy raw c45 0xa9 0x1 0xd131 0x611 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xa9 0x1 0xffde 3 -phy raw c45 0xa9 0x1 0xd130 0x41 -phy raw c45 0xa9 0x1 0xd131 0xd +phy raw c45 0xa9 0x1 0xd130 0x4E +phy raw c45 0xa9 0x1 0xd131 0x610 phy raw c45 0xa9 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 0 -phy raw c45 0xc1 0x1 0xd130 0x41 -phy raw c45 0xc1 0x1 0xd131 0xd +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 1 -phy raw c45 0xc1 0x1 0xd130 0x41 -phy raw c45 0xc1 0x1 0xd131 0xd +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 2 -phy raw c45 0xc1 0x1 0xd130 0x41 -phy raw c45 0xc1 0x1 0xd131 0xd +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc1 0x1 0xffde 3 -phy raw c45 0xc1 0x1 0xd130 0x41 -phy raw c45 0xc1 0x1 0xd131 0xd +phy raw c45 0xc1 0x1 0xd130 0x4E +phy raw c45 0xc1 0x1 0xd131 0x610 phy raw c45 0xc1 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 0 -phy raw c45 0xc5 0x1 0xd130 0x41 -phy raw c45 0xc5 0x1 0xd131 0xd +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 1 -phy raw c45 0xc5 0x1 0xd130 0x41 -phy raw c45 0xc5 0x1 0xd131 0xd +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 2 -phy raw c45 0xc5 0x1 0xd130 0x41 -phy raw c45 0xc5 0x1 0xd131 0xd +phy raw c45 0xc5 0x1 0xd130 0x4D +phy raw c45 0xc5 0x1 0xd131 0x611 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0xc5 0x1 0xffde 3 -phy raw c45 0xc5 0x1 0xd130 0x41 -phy raw c45 0xc5 0x1 0xd131 0xd +phy raw c45 0xc5 0x1 0xd130 0x4E +phy raw c45 0xc5 0x1 0xd131 0x610 phy raw c45 0xc5 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 0 -phy raw c45 0x81 0x1 0xd130 0x41 -phy raw c45 0x81 0x1 0xd131 0xd +phy raw c45 0x81 0x1 0xd130 0x4E +phy raw c45 0x81 0x1 0xd131 0x610 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 1 -phy raw c45 0x81 0x1 0xd130 0x41 -phy raw c45 0x81 0x1 0xd131 0xd +phy raw c45 0x81 0x1 0xd130 0x4D +phy raw c45 0x81 0x1 0xd131 0x611 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 2 -phy raw c45 0x81 0x1 0xd130 0x41 -phy raw c45 0x81 0x1 0xd131 0xd +phy raw c45 0x81 0x1 0xd130 0x4F +phy raw c45 0x81 0x1 0xd131 0x60F phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x81 0x1 0xffde 3 -phy raw c45 0x81 0x1 0xd130 0x41 -phy raw c45 0x81 0x1 0xd131 0xd +phy raw c45 0x81 0x1 0xd130 0x4D +phy raw c45 0x81 0x1 0xd131 0x611 phy raw c45 0x81 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 0 -phy raw c45 0x85 0x1 0xd130 0x41 -phy raw c45 0x85 0x1 0xd131 0xd +phy raw c45 0x85 0x1 0xd130 0x4F +phy raw c45 0x85 0x1 0xd131 0x60F phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 1 -phy raw c45 0x85 0x1 0xd130 0x41 -phy raw c45 0x85 0x1 0xd131 0xd +phy raw c45 0x85 0x1 0xd130 0x4F +phy raw c45 0x85 0x1 0xd131 0x60F phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 2 -phy raw c45 0x85 0x1 0xd130 0x41 -phy raw c45 0x85 0x1 0xd131 0xd +phy raw c45 0x85 0x1 0xd130 0x4E +phy raw c45 0x85 0x1 0xd131 0x610 phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x85 0x1 0xffde 3 -phy raw c45 0x85 0x1 0xd130 0x41 -phy raw c45 0x85 0x1 0xd131 0xd +phy raw c45 0x85 0x1 0xd130 0x4D +phy raw c45 0x85 0x1 0xd131 0x611 phy raw c45 0x85 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 0 -phy raw c45 0x89 0x1 0xd130 0x41 -phy raw c45 0x89 0x1 0xd131 0xd +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 1 -phy raw c45 0x89 0x1 0xd130 0x41 -phy raw c45 0x89 0x1 0xd131 0xd +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 2 -phy raw c45 0x89 0x1 0xd130 0x41 -phy raw c45 0x89 0x1 0xd131 0xd +phy raw c45 0x89 0x1 0xd130 0x51 +phy raw c45 0x89 0x1 0xd131 0x60D phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x89 0x1 0xffde 3 -phy raw c45 0x89 0x1 0xd130 0x41 -phy raw c45 0x89 0x1 0xd131 0xd +phy raw c45 0x89 0x1 0xd130 0x4F +phy raw c45 0x89 0x1 0xd131 0x60F phy raw c45 0x89 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 0 -phy raw c45 0x8d 0x1 0xd130 0x41 -phy raw c45 0x8d 0x1 0xd131 0xd +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 1 -phy raw c45 0x8d 0x1 0xd130 0x41 -phy raw c45 0x8d 0x1 0xd131 0xd +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 2 -phy raw c45 0x8d 0x1 0xd130 0x41 -phy raw c45 0x8d 0x1 0xd131 0xd +phy raw c45 0x8d 0x1 0xd130 0x51 +phy raw c45 0x8d 0x1 0xd131 0x60D phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x8d 0x1 0xffde 3 -phy raw c45 0x8d 0x1 0xd130 0x41 -phy raw c45 0x8d 0x1 0xd131 0xd +phy raw c45 0x8d 0x1 0xd130 0x50 +phy raw c45 0x8d 0x1 0xd131 0x60E phy raw c45 0x8d 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 0 -phy raw c45 0x91 0x1 0xd130 0x41 -phy raw c45 0x91 0x1 0xd131 0x0408 +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 1 -phy raw c45 0x91 0x1 0xd130 0x41 -phy raw c45 0x91 0x1 0xd131 0x0408 +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 2 -phy raw c45 0x91 0x1 0xd130 0x41 -phy raw c45 0x91 0x1 0xd131 0x0408 +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x91 0x1 0xffde 3 -phy raw c45 0x91 0x1 0xd130 0x41 -phy raw c45 0x91 0x1 0xd131 0x0408 +phy raw c45 0x91 0x1 0xd130 0x52 +phy raw c45 0x91 0x1 0xd131 0x60C phy raw c45 0x91 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 0 -phy raw c45 0x95 0x1 0xd130 0x41 -phy raw c45 0x95 0x1 0xd131 0x0307 +phy raw c45 0x95 0x1 0xd130 0x54 +phy raw c45 0x95 0x1 0xd131 0x60A phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 1 -phy raw c45 0x95 0x1 0xd130 0x41 -phy raw c45 0x95 0x1 0xd131 0x0307 +phy raw c45 0x95 0x1 0xd130 0x52 +phy raw c45 0x95 0x1 0xd131 0x60C phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 2 -phy raw c45 0x95 0x1 0xd130 0x41 -phy raw c45 0x95 0x1 0xd131 0x0307 +phy raw c45 0x95 0x1 0xd130 0x54 +phy raw c45 0x95 0x1 0xd131 0x60A phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0x95 0x1 0xffde 3 -phy raw c45 0x95 0x1 0xd130 0x41 -phy raw c45 0x95 0x1 0xd131 0x0307 +phy raw c45 0x95 0x1 0xd130 0x52 +phy raw c45 0x95 0x1 0xd131 0x60C phy raw c45 0x95 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 0 -phy raw c45 0xa1 0x1 0xd130 0x41 -phy raw c45 0xa1 0x1 0xd131 0x0307 +phy raw c45 0xa1 0x1 0xd130 0x54 +phy raw c45 0xa1 0x1 0xd131 0x60A phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 1 -phy raw c45 0xa1 0x1 0xd130 0x41 -phy raw c45 0xa1 0x1 0xd131 0x0307 +phy raw c45 0xa1 0x1 0xd130 0x53 +phy raw c45 0xa1 0x1 0xd131 0x60B phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 2 -phy raw c45 0xa1 0x1 0xd130 0x41 -phy raw c45 0xa1 0x1 0xd131 0x0307 +phy raw c45 0xa1 0x1 0xd130 0x54 +phy raw c45 0xa1 0x1 0xd131 0x60A phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xa1 0x1 0xffde 3 -phy raw c45 0xa1 0x1 0xd130 0x41 -phy raw c45 0xa1 0x1 0xd131 0x0307 +phy raw c45 0xa1 0x1 0xd130 0x53 +phy raw c45 0xa1 0x1 0xd131 0x60B phy raw c45 0xa1 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 0 -phy raw c45 0xad 0x1 0xd130 0x41 -phy raw c45 0xad 0x1 0xd131 0x0307 +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 1 -phy raw c45 0xad 0x1 0xd130 0x41 -phy raw c45 0xad 0x1 0xd131 0x0307 +phy raw c45 0xad 0x1 0xd130 0x53 +phy raw c45 0xad 0x1 0xd131 0x60B phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 2 -phy raw c45 0xad 0x1 0xd130 0x41 -phy raw c45 0xad 0x1 0xd131 0x0307 +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xad 0x1 0xffde 3 -phy raw c45 0xad 0x1 0xd130 0x41 -phy raw c45 0xad 0x1 0xd131 0x0307 +phy raw c45 0xad 0x1 0xd130 0x54 +phy raw c45 0xad 0x1 0xd131 0x60A phy raw c45 0xad 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 0 -phy raw c45 0xc9 0x1 0xd130 0x41 -phy raw c45 0xc9 0x1 0xd131 0x0307 +phy raw c45 0xc9 0x1 0xd130 0x54 +phy raw c45 0xc9 0x1 0xd131 0x60A phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 1 -phy raw c45 0xc9 0x1 0xd130 0x41 -phy raw c45 0xc9 0x1 0xd131 0x0307 +phy raw c45 0xc9 0x1 0xd130 0x53 +phy raw c45 0xc9 0x1 0xd131 0x60B phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 2 -phy raw c45 0xc9 0x1 0xd130 0x41 -phy raw c45 0xc9 0x1 0xd131 0x0307 +phy raw c45 0xc9 0x1 0xd130 0x54 +phy raw c45 0xc9 0x1 0xd131 0x60A phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xc9 0x1 0xffde 3 -phy raw c45 0xc9 0x1 0xd130 0x41 -phy raw c45 0xc9 0x1 0xd131 0x0307 +phy raw c45 0xc9 0x1 0xd130 0x53 +phy raw c45 0xc9 0x1 0xd131 0x60B phy raw c45 0xc9 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 0 -phy raw c45 0xcd 0x1 0xd130 0x41 -phy raw c45 0xcd 0x1 0xd131 0x0307 +phy raw c45 0xcd 0x1 0xd130 0x54 +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 1 -phy raw c45 0xcd 0x1 0xd130 0x41 -phy raw c45 0xcd 0x1 0xd131 0x0307 +phy raw c45 0xcd 0x1 0xd130 0x53 +phy raw c45 0xcd 0x1 0xd131 0x60B phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 2 -phy raw c45 0xcd 0x1 0xd130 0x41 -phy raw c45 0xcd 0x1 0xd131 0x0307 +phy raw c45 0xcd 0x1 0xd130 0x54 +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xcd 0x1 0xffde 3 -phy raw c45 0xcd 0x1 0xd130 0x41 -phy raw c45 0xcd 0x1 0xd131 0x0307 +phy raw c45 0xcd 0x1 0xd130 0x54 +phy raw c45 0xcd 0x1 0xd131 0x60A phy raw c45 0xcd 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 0 -phy raw c45 0xd1 0x1 0xd130 0x41 -phy raw c45 0xd1 0x1 0xd131 0x0307 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 1 -phy raw c45 0xd1 0x1 0xd130 0x41 -phy raw c45 0xd1 0x1 0xd131 0x0307 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 2 -phy raw c45 0xd1 0x1 0xd130 0x41 -phy raw c45 0xd1 0x1 0xd131 0x0307 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd1 0x1 0xffde 3 -phy raw c45 0xd1 0x1 0xd130 0x41 -phy raw c45 0xd1 0x1 0xd131 0x0307 +phy raw c45 0xd1 0x1 0xd130 0x55 +phy raw c45 0xd1 0x1 0xd131 0x609 phy raw c45 0xd1 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 0 -phy raw c45 0xd5 0x1 0xd130 0x41 -phy raw c45 0xd5 0x1 0xd131 0x0307 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 1 -phy raw c45 0xd5 0x1 0xd130 0x41 -phy raw c45 0xd5 0x1 0xd131 0x0307 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 2 -phy raw c45 0xd5 0x1 0xd130 0x41 -phy raw c45 0xd5 0x1 0xd131 0x0307 +phy raw c45 0xd5 0x1 0xd130 0x54 +phy raw c45 0xd5 0x1 0xd131 0x60A phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xd5 0x1 0xffde 3 -phy raw c45 0xd5 0x1 0xd130 0x41 -phy raw c45 0xd5 0x1 0xd131 0x0307 +phy raw c45 0xd5 0x1 0xd130 0x55 +phy raw c45 0xd5 0x1 0xd131 0x609 phy raw c45 0xd5 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 0 -phy raw c45 0xe1 0x1 0xd130 0x41 -phy raw c45 0xe1 0x1 0xd131 0x0307 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 1 -phy raw c45 0xe1 0x1 0xd130 0x41 -phy raw c45 0xe1 0x1 0xd131 0x0307 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 2 -phy raw c45 0xe1 0x1 0xd130 0x41 -phy raw c45 0xe1 0x1 0xd131 0x0307 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe1 0x1 0xffde 3 -phy raw c45 0xe1 0x1 0xd130 0x41 -phy raw c45 0xe1 0x1 0xd131 0x0307 +phy raw c45 0xe1 0x1 0xd130 0x55 +phy raw c45 0xe1 0x1 0xd131 0x609 phy raw c45 0xe1 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 0 -phy raw c45 0xe5 0x1 0xd130 0x41 -phy raw c45 0xe5 0x1 0xd131 0x0307 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 1 -phy raw c45 0xe5 0x1 0xd130 0x41 -phy raw c45 0xe5 0x1 0xd131 0x0307 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 2 -phy raw c45 0xe5 0x1 0xd130 0x41 -phy raw c45 0xe5 0x1 0xd131 0x0307 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe5 0x1 0xffde 3 -phy raw c45 0xe5 0x1 0xd130 0x41 -phy raw c45 0xe5 0x1 0xd131 0x0307 +phy raw c45 0xe5 0x1 0xd130 0x54 +phy raw c45 0xe5 0x1 0xd131 0x60A phy raw c45 0xe5 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 0 -phy raw c45 0xe9 0x1 0xd130 0x41 -phy raw c45 0xe9 0x1 0xd131 0x0307 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 1 -phy raw c45 0xe9 0x1 0xd130 0x41 -phy raw c45 0xe9 0x1 0xd131 0x0307 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 2 -phy raw c45 0xe9 0x1 0xd130 0x41 -phy raw c45 0xe9 0x1 0xd131 0x0307 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xe9 0x1 0xffde 3 -phy raw c45 0xe9 0x1 0xd130 0x41 -phy raw c45 0xe9 0x1 0xd131 0x0307 +phy raw c45 0xe9 0x1 0xd130 0x54 +phy raw c45 0xe9 0x1 0xd131 0x60A phy raw c45 0xe9 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 0 -phy raw c45 0xed 0x1 0xd130 0x41 -phy raw c45 0xed 0x1 0xd131 0xb +phy raw c45 0xed 0x1 0xd130 0x53 +phy raw c45 0xed 0x1 0xd131 0x60B phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 1 -phy raw c45 0xed 0x1 0xd130 0x41 -phy raw c45 0xed 0x1 0xd131 0xb +phy raw c45 0xed 0x1 0xd130 0x52 +phy raw c45 0xed 0x1 0xd131 0x60C phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 2 -phy raw c45 0xed 0x1 0xd130 0x41 -phy raw c45 0xed 0x1 0xd131 0xb +phy raw c45 0xed 0x1 0xd130 0x54 +phy raw c45 0xed 0x1 0xd131 0x60A phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0xed 0x1 0xffde 3 -phy raw c45 0xed 0x1 0xd130 0x41 -phy raw c45 0xed 0x1 0xd131 0xb +phy raw c45 0xed 0x1 0xd130 0x52 +phy raw c45 0xed 0x1 0xd131 0x60C phy raw c45 0xed 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 0 -phy raw c45 0x185 0x1 0xd130 0x41 -phy raw c45 0x185 0x1 0xd131 0x0307 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 1 -phy raw c45 0x185 0x1 0xd130 0x41 -phy raw c45 0x185 0x1 0xd131 0x0307 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 2 -phy raw c45 0x185 0x1 0xd130 0x41 -phy raw c45 0x185 0x1 0xd131 0x0307 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x185 0x1 0xffde 3 -phy raw c45 0x185 0x1 0xd130 0x41 -phy raw c45 0x185 0x1 0xd131 0x0307 +phy raw c45 0x185 0x1 0xd130 0x53 +phy raw c45 0x185 0x1 0xd131 0x60B phy raw c45 0x185 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 0 -phy raw c45 0x18d 0x1 0xd130 0x41 -phy raw c45 0x18d 0x1 0xd131 0x0307 +phy raw c45 0x18d 0x1 0xd130 0x53 +phy raw c45 0x18d 0x1 0xd131 0x60B phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 1 -phy raw c45 0x18d 0x1 0xd130 0x41 -phy raw c45 0x18d 0x1 0xd131 0x0307 +phy raw c45 0x18d 0x1 0xd130 0x52 +phy raw c45 0x18d 0x1 0xd131 0x60C phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 2 -phy raw c45 0x18d 0x1 0xd130 0x41 -phy raw c45 0x18d 0x1 0xd131 0x0307 +phy raw c45 0x18d 0x1 0xd130 0x54 +phy raw c45 0x18d 0x1 0xd131 0x60A phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x18d 0x1 0xffde 3 -phy raw c45 0x18d 0x1 0xd130 0x41 -phy raw c45 0x18d 0x1 0xd131 0x0307 +phy raw c45 0x18d 0x1 0xd130 0x54 +phy raw c45 0x18d 0x1 0xd131 0x60A phy raw c45 0x18d 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 0 -phy raw c45 0x1a1 0x1 0xd130 0x41 -phy raw c45 0x1a1 0x1 0xd131 0x0408 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 1 -phy raw c45 0x1a1 0x1 0xd130 0x41 -phy raw c45 0x1a1 0x1 0xd131 0x0408 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 2 -phy raw c45 0x1a1 0x1 0xd130 0x41 -phy raw c45 0x1a1 0x1 0xd131 0x0408 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a1 0x1 0xffde 3 -phy raw c45 0x1a1 0x1 0xd130 0x41 -phy raw c45 0x1a1 0x1 0xd131 0x0408 +phy raw c45 0x1a1 0x1 0xd130 0x52 +phy raw c45 0x1a1 0x1 0xd131 0x60C phy raw c45 0x1a1 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 0 -phy raw c45 0x1a5 0x1 0xd130 0x41 -phy raw c45 0x1a5 0x1 0xd131 0x0408 +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 1 -phy raw c45 0x1a5 0x1 0xd130 0x41 -phy raw c45 0x1a5 0x1 0xd131 0x0408 +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 2 -phy raw c45 0x1a5 0x1 0xd130 0x41 -phy raw c45 0x1a5 0x1 0xd131 0x0408 +phy raw c45 0x1a5 0x1 0xd130 0x53 +phy raw c45 0x1a5 0x1 0xd131 0x60B phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a5 0x1 0xffde 3 -phy raw c45 0x1a5 0x1 0xd130 0x41 -phy raw c45 0x1a5 0x1 0xd131 0x0408 +phy raw c45 0x1a5 0x1 0xd130 0x52 +phy raw c45 0x1a5 0x1 0xd131 0x60C phy raw c45 0x1a5 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 0 -phy raw c45 0x1a9 0x1 0xd130 0x41 -phy raw c45 0x1a9 0x1 0xd131 0xb +phy raw c45 0x1a9 0x1 0xd130 0x50 +phy raw c45 0x1a9 0x1 0xd131 0x60E phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 1 -phy raw c45 0x1a9 0x1 0xd130 0x41 -phy raw c45 0x1a9 0x1 0xd131 0xb +phy raw c45 0x1a9 0x1 0xd130 0x51 +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 2 -phy raw c45 0x1a9 0x1 0xd130 0x41 -phy raw c45 0x1a9 0x1 0xd131 0xb +phy raw c45 0x1a9 0x1 0xd130 0x51 +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1a9 0x1 0xffde 3 -phy raw c45 0x1a9 0x1 0xd130 0x41 -phy raw c45 0x1a9 0x1 0xd131 0xb +phy raw c45 0x1a9 0x1 0xd130 0x51 +phy raw c45 0x1a9 0x1 0xd131 0x60D phy raw c45 0x1a9 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 0 -phy raw c45 0x1ad 0x1 0xd130 0x41 -phy raw c45 0x1ad 0x1 0xd131 0xc +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 1 -phy raw c45 0x1ad 0x1 0xd130 0x41 -phy raw c45 0x1ad 0x1 0xd131 0xc +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 2 -phy raw c45 0x1ad 0x1 0xd130 0x41 -phy raw c45 0x1ad 0x1 0xd131 0xc +phy raw c45 0x1ad 0x1 0xd130 0x51 +phy raw c45 0x1ad 0x1 0xd131 0x60D phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1ad 0x1 0xffde 3 -phy raw c45 0x1ad 0x1 0xd130 0x41 -phy raw c45 0x1ad 0x1 0xd131 0xc +phy raw c45 0x1ad 0x1 0xd130 0x50 +phy raw c45 0x1ad 0x1 0xd131 0x60E phy raw c45 0x1ad 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 0 -phy raw c45 0x1b1 0x1 0xd130 0x41 -phy raw c45 0x1b1 0x1 0xd131 0xd +phy raw c45 0x1b1 0x1 0xd130 0x4F +phy raw c45 0x1b1 0x1 0xd131 0x60F phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 1 -phy raw c45 0x1b1 0x1 0xd130 0x41 -phy raw c45 0x1b1 0x1 0xd131 0xd +phy raw c45 0x1b1 0x1 0xd130 0x4D +phy raw c45 0x1b1 0x1 0xd131 0x611 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 2 -phy raw c45 0x1b1 0x1 0xd130 0x41 -phy raw c45 0x1b1 0x1 0xd131 0xd +phy raw c45 0x1b1 0x1 0xd130 0x4E +phy raw c45 0x1b1 0x1 0xd131 0x610 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b1 0x1 0xffde 3 -phy raw c45 0x1b1 0x1 0xd130 0x41 -phy raw c45 0x1b1 0x1 0xd131 0xd +phy raw c45 0x1b1 0x1 0xd130 0x4D +phy raw c45 0x1b1 0x1 0xd131 0x611 phy raw c45 0x1b1 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 0 -phy raw c45 0x1b5 0x1 0xd130 0x41 -phy raw c45 0x1b5 0x1 0xd131 0xf +phy raw c45 0x1b5 0x1 0xd130 0x4E +phy raw c45 0x1b5 0x1 0xd131 0x610 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 1 -phy raw c45 0x1b5 0x1 0xd130 0x41 -phy raw c45 0x1b5 0x1 0xd131 0xf +phy raw c45 0x1b5 0x1 0xd130 0x4D +phy raw c45 0x1b5 0x1 0xd131 0x611 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 2 -phy raw c45 0x1b5 0x1 0xd130 0x41 -phy raw c45 0x1b5 0x1 0xd131 0xf +phy raw c45 0x1b5 0x1 0xd130 0x4E +phy raw c45 0x1b5 0x1 0xd131 0x610 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0x1b5 0x1 0xffde 3 -phy raw c45 0x1b5 0x1 0xd130 0x41 -phy raw c45 0x1b5 0x1 0xd131 0xf +phy raw c45 0x1b5 0x1 0xd130 0x4D +phy raw c45 0x1b5 0x1 0xd131 0x611 phy raw c45 0x1b5 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 0 -phy raw c45 0xf1 0x1 0xd130 0x41 -phy raw c45 0xf1 0x1 0xd131 0xd +phy raw c45 0xf1 0x1 0xd130 0x4F +phy raw c45 0xf1 0x1 0xd131 0x60F phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 1 -phy raw c45 0xf1 0x1 0xd130 0x41 -phy raw c45 0xf1 0x1 0xd131 0xd +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 2 -phy raw c45 0xf1 0x1 0xd130 0x41 -phy raw c45 0xf1 0x1 0xd131 0xd +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf1 0x1 0xffde 3 -phy raw c45 0xf1 0x1 0xd130 0x41 -phy raw c45 0xf1 0x1 0xd131 0xd +phy raw c45 0xf1 0x1 0xd130 0x4E +phy raw c45 0xf1 0x1 0xd131 0x610 phy raw c45 0xf1 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 0 -phy raw c45 0xf5 0x1 0xd130 0x41 -phy raw c45 0xf5 0x1 0xd131 0xf +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 1 -phy raw c45 0xf5 0x1 0xd130 0x41 -phy raw c45 0xf5 0x1 0xd131 0xf +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 2 -phy raw c45 0xf5 0x1 0xd130 0x41 -phy raw c45 0xf5 0x1 0xd131 0xf +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0xf5 0x1 0xffde 3 -phy raw c45 0xf5 0x1 0xd130 0x41 -phy raw c45 0xf5 0x1 0xd131 0xf +phy raw c45 0xf5 0x1 0xd130 0x4D +phy raw c45 0xf5 0x1 0xd131 0x611 phy raw c45 0xf5 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 0 -phy raw c45 0x181 0x1 0xd130 0x41 -phy raw c45 0x181 0x1 0xd131 0xd +phy raw c45 0x181 0x1 0xd130 0x4E +phy raw c45 0x181 0x1 0xd131 0x610 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 1 -phy raw c45 0x181 0x1 0xd130 0x41 -phy raw c45 0x181 0x1 0xd131 0xd +phy raw c45 0x181 0x1 0xd130 0x4D +phy raw c45 0x181 0x1 0xd131 0x611 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 2 -phy raw c45 0x181 0x1 0xd130 0x41 -phy raw c45 0x181 0x1 0xd131 0xd +phy raw c45 0x181 0x1 0xd130 0x4E +phy raw c45 0x181 0x1 0xd131 0x610 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x181 0x1 0xffde 3 -phy raw c45 0x181 0x1 0xd130 0x41 -phy raw c45 0x181 0x1 0xd131 0xd +phy raw c45 0x181 0x1 0xd130 0x4D +phy raw c45 0x181 0x1 0xd131 0x611 phy raw c45 0x181 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 0 -phy raw c45 0x189 0x1 0xd130 0x41 -phy raw c45 0x189 0x1 0xd131 0xe +phy raw c45 0x189 0x1 0xd130 0x4E +phy raw c45 0x189 0x1 0xd131 0x610 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 1 -phy raw c45 0x189 0x1 0xd130 0x41 -phy raw c45 0x189 0x1 0xd131 0xe +phy raw c45 0x189 0x1 0xd130 0x4E +phy raw c45 0x189 0x1 0xd131 0x610 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 2 -phy raw c45 0x189 0x1 0xd130 0x41 -phy raw c45 0x189 0x1 0xd131 0xe +phy raw c45 0x189 0x1 0xd130 0x4D +phy raw c45 0x189 0x1 0xd131 0x611 phy raw c45 0x189 0x1 0xd134 1 phy raw c45 0x189 0x1 0xffde 3 -phy raw c45 0x189 0x1 0xd130 0x41 -phy raw c45 0x189 0x1 0xd131 0xe -phy raw c45 0x189 0x1 0xd134 1 - +phy raw c45 0x189 0x1 0xd130 0x4D +phy raw c45 0x189 0x1 0xd131 0x611 +phy raw c45 0x189 0x1 0xd134 1 \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/media_settings.json b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/media_settings.json new file mode 100644 index 000000000000..9b69cade2898 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/media_settings.json @@ -0,0 +1,31 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-48": { + "Default": { + "preemphasis": { + "lane0": "0x0a5503" + } + } + }, + "49,51-56": { + "Default": { + "preemphasis": { + "lane0": "0x0a5703", + "lane1": "0x0a5703", + "lane2": "0x0a5703", + "lane3": "0x0a5703" + } + } + }, + "50-50": { + "Default": { + "preemphasis": { + "lane0": "0x0a5003", + "lane1": "0x0a5003", + "lane2": "0x0a5003", + "lane3": "0x0a5003" + } + } + } + } +} diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/preemphasis-48x25_8x100.soc b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/preemphasis-48x25_8x100.soc index 3a0193b73da5..fe049e4c1356 100644 --- a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/preemphasis-48x25_8x100.soc +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/preemphasis-48x25_8x100.soc @@ -6,320 +6,320 @@ linkscan off phy raw c45 0xd1 0x1 0xffde 0 phy raw c45 0xd1 0x1 0xd130 0x55 -phy raw c45 0xd1 0x1 0xd131 0x303 +phy raw c45 0xd1 0x1 0xd131 0x30a phy raw c45 0xd1 0x1 0xd134 0x1 phy raw c45 0xd1 0x1 0xffde 1 phy raw c45 0xd1 0x1 0xd130 0x55 -phy raw c45 0xd1 0x1 0xd131 0x303 +phy raw c45 0xd1 0x1 0xd131 0x30a phy raw c45 0xd1 0x1 0xd134 0x1 phy raw c45 0xd1 0x1 0xffde 2 phy raw c45 0xd1 0x1 0xd130 0x55 -phy raw c45 0xd1 0x1 0xd131 0x303 +phy raw c45 0xd1 0x1 0xd131 0x30a phy raw c45 0xd1 0x1 0xd134 0x1 phy raw c45 0xd1 0x1 0xffde 3 phy raw c45 0xd1 0x1 0xd130 0x55 -phy raw c45 0xd1 0x1 0xd131 0x303 +phy raw c45 0xd1 0x1 0xd131 0x30a phy raw c45 0xd1 0x1 0xd134 0x1 phy raw c45 0xd5 0x1 0xffde 0 phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x303 +phy raw c45 0xd5 0x1 0xd131 0x30a phy raw c45 0xd5 0x1 0xd134 0x1 phy raw c45 0xd5 0x1 0xffde 1 phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x303 +phy raw c45 0xd5 0x1 0xd131 0x30a phy raw c45 0xd5 0x1 0xd134 0x1 phy raw c45 0xd5 0x1 0xffde 2 phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x303 +phy raw c45 0xd5 0x1 0xd131 0x30a phy raw c45 0xd5 0x1 0xd134 0x1 phy raw c45 0xd5 0x1 0xffde 3 phy raw c45 0xd5 0x1 0xd130 0x55 -phy raw c45 0xd5 0x1 0xd131 0x303 +phy raw c45 0xd5 0x1 0xd131 0x30a phy raw c45 0xd5 0x1 0xd134 0x1 phy raw c45 0xc9 0x1 0xffde 0 phy raw c45 0xc9 0x1 0xd130 0x55 -phy raw c45 0xc9 0x1 0xd131 0x303 +phy raw c45 0xc9 0x1 0xd131 0x30a phy raw c45 0xc9 0x1 0xd134 0x1 phy raw c45 0xc9 0x1 0xffde 1 phy raw c45 0xc9 0x1 0xd130 0x55 -phy raw c45 0xc9 0x1 0xd131 0x303 +phy raw c45 0xc9 0x1 0xd131 0x30a phy raw c45 0xc9 0x1 0xd134 0x1 phy raw c45 0xc9 0x1 0xffde 2 phy raw c45 0xc9 0x1 0xd130 0x55 -phy raw c45 0xc9 0x1 0xd131 0x303 +phy raw c45 0xc9 0x1 0xd131 0x30a phy raw c45 0xc9 0x1 0xd134 0x1 phy raw c45 0xc9 0x1 0xffde 3 phy raw c45 0xc9 0x1 0xd130 0x55 -phy raw c45 0xc9 0x1 0xd131 0x303 +phy raw c45 0xc9 0x1 0xd131 0x30a phy raw c45 0xc9 0x1 0xd134 0x1 phy raw c45 0x81 0x1 0xffde 0 phy raw c45 0x81 0x1 0xd130 0x55 -phy raw c45 0x81 0x1 0xd131 0x303 +phy raw c45 0x81 0x1 0xd131 0x30a phy raw c45 0x81 0x1 0xd134 0x1 phy raw c45 0x81 0x1 0xffde 1 phy raw c45 0x81 0x1 0xd130 0x55 -phy raw c45 0x81 0x1 0xd131 0x303 +phy raw c45 0x81 0x1 0xd131 0x30a phy raw c45 0x81 0x1 0xd134 0x1 phy raw c45 0x81 0x1 0xffde 2 phy raw c45 0x81 0x1 0xd130 0x55 -phy raw c45 0x81 0x1 0xd131 0x303 +phy raw c45 0x81 0x1 0xd131 0x30a phy raw c45 0x81 0x1 0xd134 0x1 phy raw c45 0x81 0x1 0xffde 3 phy raw c45 0x81 0x1 0xd130 0x55 -phy raw c45 0x81 0x1 0xd131 0x303 +phy raw c45 0x81 0x1 0xd131 0x30a phy raw c45 0x81 0x1 0xd134 0x1 phy raw c45 0x85 0x1 0xffde 0 phy raw c45 0x85 0x1 0xd130 0x55 -phy raw c45 0x85 0x1 0xd131 0x303 +phy raw c45 0x85 0x1 0xd131 0x30a phy raw c45 0x85 0x1 0xd134 0x1 phy raw c45 0x85 0x1 0xffde 1 phy raw c45 0x85 0x1 0xd130 0x55 -phy raw c45 0x85 0x1 0xd131 0x303 +phy raw c45 0x85 0x1 0xd131 0x30a phy raw c45 0x85 0x1 0xd134 0x1 phy raw c45 0x85 0x1 0xffde 2 phy raw c45 0x85 0x1 0xd130 0x55 -phy raw c45 0x85 0x1 0xd131 0x303 +phy raw c45 0x85 0x1 0xd131 0x30a phy raw c45 0x85 0x1 0xd134 0x1 phy raw c45 0x85 0x1 0xffde 3 phy raw c45 0x85 0x1 0xd130 0x55 -phy raw c45 0x85 0x1 0xd131 0x303 +phy raw c45 0x85 0x1 0xd131 0x30a phy raw c45 0x85 0x1 0xd134 0x1 phy raw c45 0x8d 0x1 0xffde 0 phy raw c45 0x8d 0x1 0xd130 0x55 -phy raw c45 0x8d 0x1 0xd131 0x303 +phy raw c45 0x8d 0x1 0xd131 0x30a phy raw c45 0x8d 0x1 0xd134 0x1 phy raw c45 0x8d 0x1 0xffde 1 phy raw c45 0x8d 0x1 0xd130 0x55 -phy raw c45 0x8d 0x1 0xd131 0x303 +phy raw c45 0x8d 0x1 0xd131 0x30a phy raw c45 0x8d 0x1 0xd134 0x1 phy raw c45 0x8d 0x1 0xffde 2 phy raw c45 0x8d 0x1 0xd130 0x55 -phy raw c45 0x8d 0x1 0xd131 0x303 +phy raw c45 0x8d 0x1 0xd131 0x30a phy raw c45 0x8d 0x1 0xd134 0x1 phy raw c45 0x8d 0x1 0xffde 3 phy raw c45 0x8d 0x1 0xd130 0x55 -phy raw c45 0x8d 0x1 0xd131 0x303 +phy raw c45 0x8d 0x1 0xd131 0x30a phy raw c45 0x8d 0x1 0xd134 0x1 phy raw c45 0x95 0x1 0xffde 0 phy raw c45 0x95 0x1 0xd130 0x55 -phy raw c45 0x95 0x1 0xd131 0x303 +phy raw c45 0x95 0x1 0xd131 0x30a phy raw c45 0x95 0x1 0xd134 0x1 phy raw c45 0x95 0x1 0xffde 1 phy raw c45 0x95 0x1 0xd130 0x55 -phy raw c45 0x95 0x1 0xd131 0x303 +phy raw c45 0x95 0x1 0xd131 0x30a phy raw c45 0x95 0x1 0xd134 0x1 phy raw c45 0x95 0x1 0xffde 2 phy raw c45 0x95 0x1 0xd130 0x55 -phy raw c45 0x95 0x1 0xd131 0x303 +phy raw c45 0x95 0x1 0xd131 0x30a phy raw c45 0x95 0x1 0xd134 0x1 phy raw c45 0x95 0x1 0xffde 3 phy raw c45 0x95 0x1 0xd130 0x55 -phy raw c45 0x95 0x1 0xd131 0x303 +phy raw c45 0x95 0x1 0xd131 0x30a phy raw c45 0x95 0x1 0xd134 0x1 phy raw c45 0xa5 0x1 0xffde 0 phy raw c45 0xa5 0x1 0xd130 0x55 -phy raw c45 0xa5 0x1 0xd131 0x303 +phy raw c45 0xa5 0x1 0xd131 0x30a phy raw c45 0xa5 0x1 0xd134 0x1 phy raw c45 0xa5 0x1 0xffde 1 phy raw c45 0xa5 0x1 0xd130 0x55 -phy raw c45 0xa5 0x1 0xd131 0x303 +phy raw c45 0xa5 0x1 0xd131 0x30a phy raw c45 0xa5 0x1 0xd134 0x1 phy raw c45 0xa5 0x1 0xffde 2 phy raw c45 0xa5 0x1 0xd130 0x55 -phy raw c45 0xa5 0x1 0xd131 0x303 +phy raw c45 0xa5 0x1 0xd131 0x30a phy raw c45 0xa5 0x1 0xd134 0x1 phy raw c45 0xa5 0x1 0xffde 3 phy raw c45 0xa5 0x1 0xd130 0x55 -phy raw c45 0xa5 0x1 0xd131 0x303 +phy raw c45 0xa5 0x1 0xd131 0x30a phy raw c45 0xa5 0x1 0xd134 0x1 phy raw c45 0xa9 0x1 0xffde 0 phy raw c45 0xa9 0x1 0xd130 0x55 -phy raw c45 0xa9 0x1 0xd131 0x303 +phy raw c45 0xa9 0x1 0xd131 0x30a phy raw c45 0xa9 0x1 0xd134 0x1 phy raw c45 0xa9 0x1 0xffde 1 phy raw c45 0xa9 0x1 0xd130 0x55 -phy raw c45 0xa9 0x1 0xd131 0x303 +phy raw c45 0xa9 0x1 0xd131 0x30a phy raw c45 0xa9 0x1 0xd134 0x1 phy raw c45 0xa9 0x1 0xffde 2 phy raw c45 0xa9 0x1 0xd130 0x55 -phy raw c45 0xa9 0x1 0xd131 0x303 +phy raw c45 0xa9 0x1 0xd131 0x30a phy raw c45 0xa9 0x1 0xd134 0x1 phy raw c45 0xa9 0x1 0xffde 3 phy raw c45 0xa9 0x1 0xd130 0x55 -phy raw c45 0xa9 0x1 0xd131 0x303 +phy raw c45 0xa9 0x1 0xd131 0x30a phy raw c45 0xa9 0x1 0xd134 0x1 phy raw c45 0xc1 0x1 0xffde 0 phy raw c45 0xc1 0x1 0xd130 0x55 -phy raw c45 0xc1 0x1 0xd131 0x303 +phy raw c45 0xc1 0x1 0xd131 0x30a phy raw c45 0xc1 0x1 0xd134 0x1 phy raw c45 0xc1 0x1 0xffde 1 phy raw c45 0xc1 0x1 0xd130 0x55 -phy raw c45 0xc1 0x1 0xd131 0x303 +phy raw c45 0xc1 0x1 0xd131 0x30a phy raw c45 0xc1 0x1 0xd134 0x1 phy raw c45 0xc1 0x1 0xffde 2 phy raw c45 0xc1 0x1 0xd130 0x55 -phy raw c45 0xc1 0x1 0xd131 0x303 +phy raw c45 0xc1 0x1 0xd131 0x30a phy raw c45 0xc1 0x1 0xd134 0x1 phy raw c45 0xc1 0x1 0xffde 3 phy raw c45 0xc1 0x1 0xd130 0x55 -phy raw c45 0xc1 0x1 0xd131 0x303 +phy raw c45 0xc1 0x1 0xd131 0x30a phy raw c45 0xc1 0x1 0xd134 0x1 phy raw c45 0xf5 0x1 0xffde 0 phy raw c45 0xf5 0x1 0xd130 0x55 -phy raw c45 0xf5 0x1 0xd131 0x303 +phy raw c45 0xf5 0x1 0xd131 0x30a phy raw c45 0xf5 0x1 0xd134 0x1 phy raw c45 0xf5 0x1 0xffde 1 phy raw c45 0xf5 0x1 0xd130 0x55 -phy raw c45 0xf5 0x1 0xd131 0x303 +phy raw c45 0xf5 0x1 0xd131 0x30a phy raw c45 0xf5 0x1 0xd134 0x1 phy raw c45 0xf5 0x1 0xffde 2 phy raw c45 0xf5 0x1 0xd130 0x55 -phy raw c45 0xf5 0x1 0xd131 0x303 +phy raw c45 0xf5 0x1 0xd131 0x30a phy raw c45 0xf5 0x1 0xd134 0x1 phy raw c45 0xf5 0x1 0xffde 3 phy raw c45 0xf5 0x1 0xd130 0x55 -phy raw c45 0xf5 0x1 0xd131 0x303 +phy raw c45 0xf5 0x1 0xd131 0x30a phy raw c45 0xf5 0x1 0xd134 0x1 phy raw c45 0x185 0x1 0xffde 0 phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x303 +phy raw c45 0x185 0x1 0xd131 0x30a phy raw c45 0x185 0x1 0xd134 0x1 phy raw c45 0x185 0x1 0xffde 1 phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x303 +phy raw c45 0x185 0x1 0xd131 0x30a phy raw c45 0x185 0x1 0xd134 0x1 phy raw c45 0x185 0x1 0xffde 2 phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x303 +phy raw c45 0x185 0x1 0xd131 0x30a phy raw c45 0x185 0x1 0xd134 0x1 phy raw c45 0x185 0x1 0xffde 3 phy raw c45 0x185 0x1 0xd130 0x55 -phy raw c45 0x185 0x1 0xd131 0x303 +phy raw c45 0x185 0x1 0xd131 0x30a phy raw c45 0x185 0x1 0xd134 0x1 # Start of 8x100G phy raw c45 0xe1 0x1 0xffde 0 -phy raw c45 0xe1 0x1 0xd130 0x55 -phy raw c45 0xe1 0x1 0xd131 0x303 +phy raw c45 0xe1 0x1 0xd130 0x57 +phy raw c45 0xe1 0x1 0xd131 0x30a phy raw c45 0xe1 0x1 0xffde 1 -phy raw c45 0xe1 0x1 0xd130 0x55 -phy raw c45 0xe1 0x1 0xd131 0x303 +phy raw c45 0xe1 0x1 0xd130 0x57 +phy raw c45 0xe1 0x1 0xd131 0x30a phy raw c45 0xe1 0x1 0xffde 2 -phy raw c45 0xe1 0x1 0xd130 0x55 -phy raw c45 0xe1 0x1 0xd131 0x303 +phy raw c45 0xe1 0x1 0xd130 0x57 +phy raw c45 0xe1 0x1 0xd131 0x30a phy raw c45 0xe1 0x1 0xffde 3 -phy raw c45 0xe1 0x1 0xd130 0x59 -phy raw c45 0xe1 0x1 0xd131 0x505 +phy raw c45 0xe1 0x1 0xd130 0x57 +phy raw c45 0xe1 0x1 0xd131 0x30a phy raw c45 0xe1 0x1 0xd134 0x1 phy raw c45 0xe5 0x1 0xffde 0 -phy raw c45 0xe5 0x1 0xd130 0x59 -phy raw c45 0xe5 0x1 0xd131 0x502 +phy raw c45 0xe5 0x1 0xd130 0x50 +phy raw c45 0xe5 0x1 0xd131 0x30a phy raw c45 0xe5 0x1 0xffde 1 -phy raw c45 0xe5 0x1 0xd130 0x59 -phy raw c45 0xe5 0x1 0xd131 0x502 +phy raw c45 0xe5 0x1 0xd130 0x50 +phy raw c45 0xe5 0x1 0xd131 0x30a phy raw c45 0xe5 0x1 0xffde 2 -phy raw c45 0xe5 0x1 0xd130 0x59 -phy raw c45 0xe5 0x1 0xd131 0x502 +phy raw c45 0xe5 0x1 0xd130 0x50 +phy raw c45 0xe5 0x1 0xd131 0x30a phy raw c45 0xe5 0x1 0xffde 3 -phy raw c45 0xe5 0x1 0xd130 0x59 -phy raw c45 0xe5 0x1 0xd131 0x502 +phy raw c45 0xe5 0x1 0xd130 0x50 +phy raw c45 0xe5 0x1 0xd131 0x30a phy raw c45 0xe5 0x1 0xd134 0x1 phy raw c45 0xed 0x1 0xffde 0 -phy raw c45 0xed 0x1 0xd130 0x59 -phy raw c45 0xed 0x1 0xd131 0x502 +phy raw c45 0xed 0x1 0xd130 0x57 +phy raw c45 0xed 0x1 0xd131 0x30a phy raw c45 0xed 0x1 0xffde 1 -phy raw c45 0xed 0x1 0xd130 0x59 -phy raw c45 0xed 0x1 0xd131 0x502 +phy raw c45 0xed 0x1 0xd130 0x57 +phy raw c45 0xed 0x1 0xd131 0x30a phy raw c45 0xed 0x1 0xffde 2 -phy raw c45 0xed 0x1 0xd130 0x59 -phy raw c45 0xed 0x1 0xd131 0x502 +phy raw c45 0xed 0x1 0xd130 0x57 +phy raw c45 0xed 0x1 0xd131 0x30a phy raw c45 0xed 0x1 0xffde 3 -phy raw c45 0xed 0x1 0xd130 0x59 -phy raw c45 0xed 0x1 0xd131 0x502 +phy raw c45 0xed 0x1 0xd130 0x57 +phy raw c45 0xed 0x1 0xd131 0x30a phy raw c45 0xed 0x1 0xd134 0x1 phy raw c45 0x189 0x1 0xffde 0 -phy raw c45 0x189 0x1 0xd130 0x59 -phy raw c45 0x189 0x1 0xd131 0x502 +phy raw c45 0x189 0x1 0xd130 0x57 +phy raw c45 0x189 0x1 0xd131 0x30a phy raw c45 0x189 0x1 0xffde 1 -phy raw c45 0x189 0x1 0xd130 0x59 -phy raw c45 0x189 0x1 0xd131 0x502 +phy raw c45 0x189 0x1 0xd130 0x57 +phy raw c45 0x189 0x1 0xd131 0x30a phy raw c45 0x189 0x1 0xffde 2 -phy raw c45 0x189 0x1 0xd130 0x59 -phy raw c45 0x189 0x1 0xd131 0x502 +phy raw c45 0x189 0x1 0xd130 0x57 +phy raw c45 0x189 0x1 0xd131 0x30a phy raw c45 0x189 0x1 0xffde 3 -phy raw c45 0x189 0x1 0xd130 0x59 -phy raw c45 0x189 0x1 0xd131 0x502 +phy raw c45 0x189 0x1 0xd130 0x57 +phy raw c45 0x189 0x1 0xd131 0x30a phy raw c45 0x189 0x1 0xd134 0x1 phy raw c45 0x1a1 0x1 0xffde 0 -phy raw c45 0x1a1 0x1 0xd130 0x59 -phy raw c45 0x1a1 0x1 0xd131 0x502 +phy raw c45 0x1a1 0x1 0xd130 0x57 +phy raw c45 0x1a1 0x1 0xd131 0x30a phy raw c45 0x1a1 0x1 0xffde 1 -phy raw c45 0x1a1 0x1 0xd130 0x59 -phy raw c45 0x1a1 0x1 0xd131 0x502 +phy raw c45 0x1a1 0x1 0xd130 0x57 +phy raw c45 0x1a1 0x1 0xd131 0x30a phy raw c45 0x1a1 0x1 0xffde 2 -phy raw c45 0x1a1 0x1 0xd130 0x59 -phy raw c45 0x1a1 0x1 0xd131 0x502 +phy raw c45 0x1a1 0x1 0xd130 0x57 +phy raw c45 0x1a1 0x1 0xd131 0x30a phy raw c45 0x1a1 0x1 0xffde 3 -phy raw c45 0x1a1 0x1 0xd130 0x59 -phy raw c45 0x1a1 0x1 0xd131 0x502 +phy raw c45 0x1a1 0x1 0xd130 0x57 +phy raw c45 0x1a1 0x1 0xd131 0x30a phy raw c45 0x1a1 0x1 0xd134 0x1 phy raw c45 0x1a9 0x1 0xffde 0 -phy raw c45 0x1a9 0x1 0xd130 0x59 -phy raw c45 0x1a9 0x1 0xd131 0x502 +phy raw c45 0x1a9 0x1 0xd130 0x57 +phy raw c45 0x1a9 0x1 0xd131 0x30a phy raw c45 0x1a9 0x1 0xffde 1 -phy raw c45 0x1a9 0x1 0xd130 0x59 -phy raw c45 0x1a9 0x1 0xd131 0x502 +phy raw c45 0x1a9 0x1 0xd130 0x57 +phy raw c45 0x1a9 0x1 0xd131 0x30a phy raw c45 0x1a9 0x1 0xffde 2 -phy raw c45 0x1a9 0x1 0xd130 0x59 -phy raw c45 0x1a9 0x1 0xd131 0x502 +phy raw c45 0x1a9 0x1 0xd130 0x57 +phy raw c45 0x1a9 0x1 0xd131 0x30a phy raw c45 0x1a9 0x1 0xffde 3 -phy raw c45 0x1a9 0x1 0xd130 0x59 -phy raw c45 0x1a9 0x1 0xd131 0x502 +phy raw c45 0x1a9 0x1 0xd130 0x57 +phy raw c45 0x1a9 0x1 0xd131 0x30a phy raw c45 0x1a9 0x1 0xd134 0x1 phy raw c45 0x1b1 0x1 0xffde 0 -phy raw c45 0x1b1 0x1 0xd130 0x59 -phy raw c45 0x1b1 0x1 0xd131 0x502 +phy raw c45 0x1b1 0x1 0xd130 0x57 +phy raw c45 0x1b1 0x1 0xd131 0x30a phy raw c45 0x1b1 0x1 0xffde 1 -phy raw c45 0x1b1 0x1 0xd130 0x59 -phy raw c45 0x1b1 0x1 0xd131 0x502 +phy raw c45 0x1b1 0x1 0xd130 0x57 +phy raw c45 0x1b1 0x1 0xd131 0x30a phy raw c45 0x1b1 0x1 0xffde 2 -phy raw c45 0x1b1 0x1 0xd130 0x59 -phy raw c45 0x1b1 0x1 0xd131 0x502 +phy raw c45 0x1b1 0x1 0xd130 0x57 +phy raw c45 0x1b1 0x1 0xd131 0x30a phy raw c45 0x1b1 0x1 0xffde 3 -phy raw c45 0x1b1 0x1 0xd130 0x59 -phy raw c45 0x1b1 0x1 0xd131 0x502 +phy raw c45 0x1b1 0x1 0xd130 0x57 +phy raw c45 0x1b1 0x1 0xd131 0x30a phy raw c45 0x1b1 0x1 0xd134 0x1 phy raw c45 0x1b5 0x1 0xffde 0 -phy raw c45 0x1b5 0x1 0xd130 0x59 -phy raw c45 0x1b5 0x1 0xd131 0x502 +phy raw c45 0x1b5 0x1 0xd130 0x57 +phy raw c45 0x1b5 0x1 0xd131 0x30a phy raw c45 0x1b5 0x1 0xffde 1 -phy raw c45 0x1b5 0x1 0xd130 0x59 -phy raw c45 0x1b5 0x1 0xd131 0x502 +phy raw c45 0x1b5 0x1 0xd130 0x57 +phy raw c45 0x1b5 0x1 0xd131 0x30a phy raw c45 0x1b5 0x1 0xffde 2 -phy raw c45 0x1b5 0x1 0xd130 0x59 -phy raw c45 0x1b5 0x1 0xd131 0x502 +phy raw c45 0x1b5 0x1 0xd130 0x57 +phy raw c45 0x1b5 0x1 0xd131 0x30a phy raw c45 0x1b5 0x1 0xffde 3 -phy raw c45 0x1b5 0x1 0xd130 0x59 -phy raw c45 0x1b5 0x1 0xd131 0x502 +phy raw c45 0x1b5 0x1 0xd130 0x57 +phy raw c45 0x1b5 0x1 0xd131 0x30a phy raw c45 0x1b5 0x1 0xd134 0x1 linkscan on \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix8a_bwde-r0/media_settings.json b/device/quanta/x86_64-quanta_ix8a_bwde-r0/media_settings.json new file mode 100644 index 000000000000..2f6b52abea75 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix8a_bwde-r0/media_settings.json @@ -0,0 +1,21 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-48": { + "Default": { + "preemphasis": { + "lane0": "0x063203" + } + } + }, + "49-56": { + "Default": { + "preemphasis": { + "lane0": "0x0a500a", + "lane1": "0x0a500a", + "lane2": "0x0a500a", + "lane3": "0x0a500a" + } + } + } + } +} \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm index aa8c6d02c57d..a5dc7f6f433d 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm @@ -479,84 +479,83 @@ phy_chain_rx_polarity_flip_physical{131.0}=0x0 phy_chain_rx_polarity_flip_physical{132.0}=0x0 -serdes_preemphasis_1=0x35503 -serdes_preemphasis_2=0x35503 -serdes_preemphasis_3=0x35503 -serdes_preemphasis_4=0x35503 -serdes_preemphasis_5=0x35503 -serdes_preemphasis_6=0x35503 -serdes_preemphasis_7=0x35503 -serdes_preemphasis_8=0x35503 -serdes_preemphasis_13=0x35503 -serdes_preemphasis_14=0x35503 -serdes_preemphasis_15=0x35503 -serdes_preemphasis_16=0x35503 -serdes_preemphasis_21=0x35503 -serdes_preemphasis_22=0x35503 -serdes_preemphasis_23=0x35503 -serdes_preemphasis_24=0x35503 -serdes_preemphasis_29=0x35503 -serdes_preemphasis_30=0x35503 -serdes_preemphasis_31=0x35503 -serdes_preemphasis_32=0x35503 -serdes_preemphasis_33=0x35503 -serdes_preemphasis_34=0x35503 -serdes_preemphasis_35=0x35503 -serdes_preemphasis_36=0x35503 -serdes_preemphasis_41=0x35503 -serdes_preemphasis_42=0x35503 -serdes_preemphasis_43=0x35503 -serdes_preemphasis_44=0x35503 -serdes_preemphasis_49=0x35503 -serdes_preemphasis_50=0x35503 -serdes_preemphasis_51=0x35503 -serdes_preemphasis_52=0x35503 -serdes_preemphasis_57=0x35503 -serdes_preemphasis_58=0x35503 -serdes_preemphasis_59=0x35503 -serdes_preemphasis_60=0x35503 -serdes_preemphasis_61=0x35503 -serdes_preemphasis_62=0x35503 -serdes_preemphasis_63=0x35503 -serdes_preemphasis_64=0x35503 -serdes_preemphasis_lane0_67=0x25905 -serdes_preemphasis_lane1_67=0x25905 -serdes_preemphasis_lane2_67=0x25905 -serdes_preemphasis_lane3_67=0x25905 -serdes_preemphasis_lane0_71=0x25905 -serdes_preemphasis_lane1_71=0x25905 -serdes_preemphasis_lane2_71=0x25905 -serdes_preemphasis_lane3_71=0x25905 -serdes_preemphasis_lane0_79=0x25905 -serdes_preemphasis_lane1_79=0x25905 -serdes_preemphasis_lane2_79=0x25905 -serdes_preemphasis_lane3_79=0x25905 -serdes_preemphasis_87=0x35503 -serdes_preemphasis_88=0x35503 -serdes_preemphasis_89=0x35503 -serdes_preemphasis_90=0x35503 -serdes_preemphasis_95=0x35503 -serdes_preemphasis_96=0x35503 -serdes_preemphasis_97=0x35503 -serdes_preemphasis_98=0x35503 -serdes_preemphasis_lane0_99=0x35503 -serdes_preemphasis_lane1_99=0x35503 -serdes_preemphasis_lane2_99=0x35503 -serdes_preemphasis_lane3_99=0x55905 -serdes_preemphasis_lane0_107=0x25905 -serdes_preemphasis_lane1_107=0x25905 -serdes_preemphasis_lane2_107=0x25905 -serdes_preemphasis_lane3_107=0x25905 -serdes_preemphasis_lane0_115=0x25905 -serdes_preemphasis_lane1_115=0x25905 -serdes_preemphasis_lane2_115=0x25905 -serdes_preemphasis_lane3_115=0x25905 -serdes_preemphasis_lane0_123=0x25905 -serdes_preemphasis_lane1_123=0x25905 -serdes_preemphasis_lane2_123=0x25905 -serdes_preemphasis_lane3_123=0x25905 -serdes_preemphasis_lane0_127=0x25905 -serdes_preemphasis_lane1_127=0x25905 -serdes_preemphasis_lane2_127=0x25905 -serdes_preemphasis_lane3_127=0x25905 - +serdes_preemphasis_60=0x0c5602 +serdes_preemphasis_59=0x0c5602 +serdes_preemphasis_58=0x0c5602 +serdes_preemphasis_57=0x0c5602 +serdes_preemphasis_64=0x0c5602 +serdes_preemphasis_63=0x0c5602 +serdes_preemphasis_62=0x0c5602 +serdes_preemphasis_61=0x0c5602 +serdes_preemphasis_49=0x0c5602 +serdes_preemphasis_50=0x0c5602 +serdes_preemphasis_51=0x0c5602 +serdes_preemphasis_52=0x0c5602 +serdes_preemphasis_4=0x0c5602 +serdes_preemphasis_3=0x0c5602 +serdes_preemphasis_2=0x085804 +serdes_preemphasis_1=0x0c5602 +serdes_preemphasis_8=0x085804 +serdes_preemphasis_7=0x085804 +serdes_preemphasis_6=0x085804 +serdes_preemphasis_5=0x085804 +serdes_preemphasis_16=0x065806 +serdes_preemphasis_15=0x085804 +serdes_preemphasis_14=0x085804 +serdes_preemphasis_13=0x085804 +serdes_preemphasis_24=0x065806 +serdes_preemphasis_23=0x065806 +serdes_preemphasis_22=0x065806 +serdes_preemphasis_21=0x065806 +serdes_preemphasis_32=0x065806 +serdes_preemphasis_31=0x065806 +serdes_preemphasis_30=0x065806 +serdes_preemphasis_29=0x075805 +serdes_preemphasis_36=0x075805 +serdes_preemphasis_35=0x075805 +serdes_preemphasis_34=0x065806 +serdes_preemphasis_33=0x085804 +serdes_preemphasis_44=0x085804 +serdes_preemphasis_43=0x085804 +serdes_preemphasis_42=0x085804 +serdes_preemphasis_41=0x085804 +serdes_preemphasis_88=0x085804 +serdes_preemphasis_87=0x085804 +serdes_preemphasis_90=0x085804 +serdes_preemphasis_89=0x085804 +serdes_preemphasis_96=0x085804 +serdes_preemphasis_95=0x085804 +serdes_preemphasis_98=0x085804 +serdes_preemphasis_97=0x085804 +serdes_preemphasis_lane0_99=0x0c5404 +serdes_preemphasis_lane1_99=0x0c5404 +serdes_preemphasis_lane2_99=0x0c5404 +serdes_preemphasis_lane3_99=0x0c5404 +serdes_preemphasis_lane0_107=0x0c5404 +serdes_preemphasis_lane1_107=0x0c5404 +serdes_preemphasis_lane2_107=0x0c5404 +serdes_preemphasis_lane3_107=0x0c5404 +serdes_preemphasis_lane0_115=0x105202 +serdes_preemphasis_lane1_115=0x105202 +serdes_preemphasis_lane2_115=0x105202 +serdes_preemphasis_lane3_115=0x105202 +serdes_preemphasis_lane0_123=0x0c5404 +serdes_preemphasis_lane1_123=0x0c5404 +serdes_preemphasis_lane2_123=0x0c5404 +serdes_preemphasis_lane3_123=0x0c5404 +serdes_preemphasis_lane0_79=0x0d5205 +serdes_preemphasis_lane1_79=0x0d5205 +serdes_preemphasis_lane2_79=0x0d5205 +serdes_preemphasis_lane3_79=0x0d5205 +serdes_preemphasis_lane0_67=0x105202 +serdes_preemphasis_lane1_67=0x105202 +serdes_preemphasis_lane2_67=0x105202 +serdes_preemphasis_lane3_67=0x105202 +serdes_preemphasis_lane0_71=0x115201 +serdes_preemphasis_lane1_71=0x115201 +serdes_preemphasis_lane2_71=0x115201 +serdes_preemphasis_lane3_71=0x115201 +serdes_preemphasis_lane0_127=0x105202 +serdes_preemphasis_lane1_127=0x105202 +serdes_preemphasis_lane2_127=0x105202 +serdes_preemphasis_lane3_127=0x105202 diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/led_proc_init.soc b/device/quanta/x86_64-quanta_ix8c_bwde-r0/led_proc_init.soc index 49f097daca34..8470ab26efeb 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/led_proc_init.soc +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/led_proc_init.soc @@ -1,4 +1,2 @@ -sleep 10 -m0 Load 0 0x3800 /usr/share/sonic/platform/custom_led.bin -led auto on +m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin led start diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/media_settings.json b/device/quanta/x86_64-quanta_ix8c_bwde-r0/media_settings.json new file mode 100644 index 000000000000..31a774aee28b --- /dev/null +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/media_settings.json @@ -0,0 +1,72 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1-14,16": { + "Default": { + "preemphasis": { + "lane0": "0x0c5602" + } + } + }, + "15,17-20,22-24,36-48": { + "Default": { + "preemphasis": { + "lane0": "0x085804" + } + } + }, + "21,25-31,35": { + "Default": { + "preemphasis": { + "lane0": "0x065806" + } + } + }, + "32-34": { + "Default": { + "preemphasis": { + "lane0": "0x075805" + } + } + }, + "49,50,52": { + "Default": { + "preemphasis": { + "lane0": "0x0c5404", + "lane1": "0x0c5404", + "lane2": "0x0c5404", + "lane3": "0x0c5404" + } + } + }, + "51,54,56": { + "Default": { + "preemphasis": { + "lane0": "0x105202", + "lane1": "0x105202", + "lane2": "0x105202", + "lane3": "0x105202" + } + } + }, + "53-53": { + "Default": { + "preemphasis": { + "lane0": "0x0d5205", + "lane1": "0x0d5205", + "lane2": "0x0d5205", + "lane3": "0x0d5205" + } + } + }, + "55-55": { + "Default": { + "preemphasis": { + "lane0": "0x115201", + "lane1": "0x115201", + "lane2": "0x115201", + "lane3": "0x115201" + } + } + } + } +} \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/hwsku.json b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/hwsku.json new file mode 100755 index 000000000000..f2d75a388a24 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G", + "fec":"rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G", + "fec":"rs" + } + } +} diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm index 93937398e832..c45c402b7277 100644 --- a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm @@ -1,6 +1,7 @@ phy_null=1 pll_bypass=1 +sai_tunnel_global_sip_mask_enable=1 core_clock_frequency=1325 dpr_clock_frequency=1000 device_clock_frequency=1325 @@ -235,6 +236,8 @@ dport_map_port_132=125 dport_map_port_133=126 dport_map_port_134=127 dport_map_port_135=128 +dport_map_port_136=129 +dport_map_port_137=130 ### lane swap and polarity follow front port order ### phy_chain_tx_lane_map_physical{33.0}=0x75206431 diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/custom_led.bin b/device/quanta/x86_64-quanta_ix9_bwde-r0/custom_led.bin index 1f12caa4fa08118ecc4d4be3e4ae5ffd5340a16c..2f86cb209d2e0000e6b6b9386efcf0042d9eb634 100644 GIT binary patch literal 416 zcmeycHQp`E&DYJv?ZcMl4J~dA3XBsN)ESi~yD=-za${2Fc8GEcc8qpnm|XrqrsDx; zoST6|n46jt;{}E}3J$E!er^RZA~F-47;du2EZW3k%xKuTX}8nMi|%f$R+BfeY3tmW z#o*>WJ7T^YzhZ)$L&m{i^#_S=o*7jV{K^cv3>R3Hg&X7^B)dgt{DO)Ey9qalK1gv( z$*_`ys9^%C;dzkeR+g~~DiRG;!~6hdBFMaI34Wzn4Io|ClKg6NjUc~<@GK{>@uIniD@Igv$qapI#y2SvrCdd0+~ z#YvBn8Wa_i_bVnQFHU}xd_YMl<-bx=%HkB}4K{lwxXpB1E428JvP2rhxr MZ9sYk5U&Da04}VBh5!Hn literal 204 zcmeycHQde5&DHI}76#RoZj9>8YD~)94pC0Qj?qpt-1wE}xamBQ>^Q|~<-q5}c)`() z%R$7M#W>jY%SGpmR}#r?3_1)K*p-DF95b>dlH6v2X{kmKZx)!8Y67#tq*ODQ-K=2R zpnRKQt`pk@ri@@o1*0IzNp3!Fr=K$_9ZFzOW=^zMc1~nbZcaRu=%C1$RIlim)SPrE osX>u3dB37#a&z*b9)x2!`=gK0AzJVhX4Qo diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc b/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc index b6c5d5073931..05022542de4b 100644 --- a/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc @@ -1,6 +1,4 @@ -sleep 10 m0 Load 0 0x3800 /usr/share/sonic/platform/custom_led.bin -led auto on led start rcload /usr/share/sonic/platform/preemphasis-32x400G.soc diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/media_settings.json b/device/quanta/x86_64-quanta_ix9_bwde-r0/media_settings.json new file mode 100644 index 000000000000..989ccb756003 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/media_settings.json @@ -0,0 +1,132 @@ +{ + "GLOBAL_MEDIA_SETTINGS": { + "1,3-32": { + "Default": { + "main":{ + "lane0": "0x00000098", + "lane1": "0x00000098", + "lane2": "0x00000098", + "lane3": "0x00000098", + "lane4": "0x00000098", + "lane5": "0x00000098", + "lane6": "0x00000098", + "lane7": "0x00000098" + }, + "post1":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + }, + "post2":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + }, + "post3":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + }, + "pre1":{ + "lane0": "0xfffffff0", + "lane1": "0xfffffff0", + "lane2": "0xfffffff0", + "lane3": "0xfffffff0", + "lane4": "0xfffffff0", + "lane5": "0xfffffff0", + "lane6": "0xfffffff0", + "lane7": "0xfffffff0" + }, + "pre2":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + } + } + }, + "2-2": { + "Default": { + "main":{ + "lane0": "0x00000098", + "lane1": "0x00000098", + "lane2": "0x00000098", + "lane3": "0x00000098", + "lane4": "0x00000098", + "lane5": "0x00000098", + "lane6": "0x00000098", + "lane7": "0x00000090" + }, + "post1":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0xfffffffc" + }, + "post2":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + }, + "post3":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + }, + "pre1":{ + "lane0": "0xfffffff0", + "lane1": "0xfffffff0", + "lane2": "0xfffffff0", + "lane3": "0xfffffff0", + "lane4": "0xfffffff0", + "lane5": "0xfffffff0", + "lane6": "0xfffffff0", + "lane7": "0xffffffee" + }, + "pre2":{ + "lane0": "0x00000000", + "lane1": "0x00000000", + "lane2": "0x00000000", + "lane3": "0x00000000", + "lane4": "0x00000000", + "lane5": "0x00000000", + "lane6": "0x00000000", + "lane7": "0x00000000" + } + } + } + } +} \ No newline at end of file diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/platform.json b/device/quanta/x86_64-quanta_ix9_bwde-r0/platform.json new file mode 100644 index 000000000000..306a8ddaab3a --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/platform.json @@ -0,0 +1,600 @@ +{ + "chassis": { + "name": "T9032-IX9", + "components": [ + { + "name": "BIOS" + }, + { + "name": "BMC" + }, + { + "name": "BOOT_CPLD" + }, + { + "name": "FAN_CPLD" + }, + { + "name": "MB_CPLD_IO_1" + }, + { + "name": "MB_CPLD_IO_2" + }, + { + "name": "MB_CPLD_LED_1" + }, + { + "name": "MB_CPLD_LED_2" + }, + { + "name": "PCIe" + } + ], + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + }, + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + }, + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + }, + { + "name": "Fantray4_1" + }, + { + "name": "Fantray4_2" + }, + { + "name": "Fantray5_1" + }, + { + "name": "Fantray5_2" + }, + { + "name": "Fantray6_1" + }, + { + "name": "Fantray6_2" + } + ], + "fan_drawers": [ + { + "name": "Fantray1", + "fans": [ + { + "name": "Fantray1_1" + }, + { + "name": "Fantray1_2" + } + ] + }, + { + "name": "Fantray2", + "fans": [ + { + "name": "Fantray2_1" + }, + { + "name": "Fantray2_2" + } + ] + }, + { + "name": "Fantray3", + "fans": [ + { + "name": "Fantray3_1" + }, + { + "name": "Fantray3_2" + } + ] + }, + { + "name": "Fantray4", + "fans": [ + { + "name": "Fantray4_1" + }, + { + "name": "Fantray4_2" + } + ] + }, + { + "name": "Fantray5", + "fans": [ + { + "name": "Fantray5_1" + }, + { + "name": "Fantray5_2" + } + ] + }, + { + "name": "Fantray6", + "fans": [ + { + "name": "Fantray6_1" + }, + { + "name": "Fantray6_2" + } + ] + } + ], + "psus": [ + { + "name": "PSU 1", + "fans": [ + { + "name": "PSU-1_FAN" + } + ] + }, + { + "name": "PSU 2", + "fans": [ + { + "name": "PSU-2_FAN" + } + ] + } + ], + "thermals": [ + { + "name": "PSU1_TEMP1" + }, + { + "name": "PSU1_TEMP2" + }, + { + "name": "PSU1_TEMP3" + }, + { + "name": "PSU2_TEMP1" + }, + { + "name": "PSU2_TEMP2" + }, + { + "name": "PSU2_TEMP3" + }, + { + "name": "Temp_1V05_PCH_VR" + }, + { + "name": "Temp_Ambient_0" + }, + { + "name": "Temp_Ambient_1" + }, + { + "name": "Temp_Ambient_2" + }, + { + "name": "Temp_Ambient_3" + }, + { + "name": "Temp_Ambient_4" + }, + { + "name": "Temp_Ambient_5" + }, + { + "name": "Temp_CPU" + }, + { + "name": "Temp_DDRAB_VR" + }, + { + "name": "Temp_SOC_DIMMA0" + }, + { + "name": "Temp_VCCGBE_VR" + }, + { + "name": "Temp_VCCIN_VR" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet128" + }, + { + "name": "Ethernet136" + }, + { + "name": "Ethernet144" + }, + { + "name": "Ethernet152" + }, + { + "name": "Ethernet160" + }, + { + "name": "Ethernet168" + }, + { + "name": "Ethernet176" + }, + { + "name": "Ethernet184" + }, + { + "name": "Ethernet192" + }, + { + "name": "Ethernet200" + }, + { + "name": "Ethernet208" + }, + { + "name": "Ethernet216" + }, + { + "name": "Ethernet224" + }, + { + "name": "Ethernet232" + }, + { + "name": "Ethernet240" + }, + { + "name": "Ethernet248" + } + ] + }, + "interfaces": { + "Ethernet0": { + "breakout_modes": { + "1x400G": ["Eth1/1"], + "2x200G[100G]": ["Eth1/1/1", "Eth1/1/2"], + "4x100G[50G]": ["Eth1/1/1", "Eth1/1/2", "Eth1/1/3", "Eth1/1/4"] + }, + "index": "1,1,1,1,1,1,1,1", + "lanes": "33,34,35,36,37,38,39,40" + }, + "Ethernet8": { + "breakout_modes": { + "1x400G": ["Eth1/2"], + "2x200G[100G]": ["Eth1/2/1", "Eth1/2/2"], + "4x100G[50G]": ["Eth1/2/1", "Eth1/2/2", "Eth1/2/3", "Eth1/2/4"] + }, + "index": "2,2,2,2,2,2,2,2", + "lanes": "25,26,27,28,29,30,31,32" + }, + "Ethernet16": { + "breakout_modes": { + "1x400G": ["Eth1/3"], + "2x200G[100G]": ["Eth1/3/1", "Eth1/3/2"], + "4x100G[50G]": ["Eth1/3/1", "Eth1/3/2", "Eth1/3/3", "Eth1/3/4"] + }, + "index": "3,3,3,3,3,3,3,3", + "lanes": "49,50,51,52,53,54,55,56" + }, + "Ethernet24": { + "breakout_modes": { + "1x400G": ["Eth1/4"], + "2x200G[100G]": ["Eth1/4/1", "Eth1/4/2"], + "4x100G[50G]": ["Eth1/4/1", "Eth1/4/2", "Eth1/4/3", "Eth1/4/4"] + }, + "index": "4,4,4,4,4,4,4,4", + "lanes": "57,58,59,60,61,62,63,64" + }, + "Ethernet32": { + "breakout_modes": { + "1x400G": ["Eth1/5"], + "2x200G[100G]": ["Eth1/5/1", "Eth1/5/2"], + "4x100G[50G]": ["Eth1/5/1", "Eth1/5/2", "Eth1/5/3", "Eth1/5/4"] + }, + "index": "5,5,5,5,5,5,5,5", + "lanes": "65,66,67,68,69,70,71,72" + }, + "Ethernet40": { + "breakout_modes": { + "1x400G": ["Eth1/6"], + "2x200G[100G]": ["Eth1/6/1", "Eth1/6/2"], + "4x100G[50G]": ["Eth1/6/1", "Eth1/6/2", "Eth1/6/3", "Eth1/6/4"] + }, + "index": "6,6,6,6,6,6,6,6", + "lanes": "73,74,75,76,77,78,79,80" + }, + "Ethernet48": { + "breakout_modes": { + "1x400G": ["Eth1/7"], + "2x200G[100G]": ["Eth1/7/1", "Eth1/7/2"], + "4x100G[50G]": ["Eth1/7/1", "Eth1/7/2", "Eth1/7/3", "Eth1/7/4"] + }, + "index": "7,7,7,7,7,7,7,7", + "lanes": "81,82,83,84,85,86,87,88" + }, + "Ethernet56": { + "breakout_modes": { + "1x400G": ["Eth1/8"], + "2x200G[100G]": ["Eth1/8/1", "Eth1/8/2"], + "4x100G[50G]": ["Eth1/8/1", "Eth1/8/2", "Eth1/8/3", "Eth1/8/4"] + }, + "index": "8,8,8,8,8,8,8,8", + "lanes": "89,90,91,92,93,94,95,96" + }, + "Ethernet64": { + "breakout_modes": { + "1x400G": ["Eth1/9"], + "2x200G[100G]": ["Eth1/9/1", "Eth1/9/2"], + "4x100G[50G]": ["Eth1/9/1", "Eth1/9/2", "Eth1/9/3", "Eth1/9/4"] + }, + "index": "9,9,9,9,9,9,9,9", + "lanes": "17,18,19,20,21,22,23,24" + }, + "Ethernet72": { + "breakout_modes": { + "1x400G": ["Eth1/10"], + "2x200G[100G]": ["Eth1/10/1", "Eth1/10/2"], + "4x100G[50G]": ["Eth1/10/1", "Eth1/10/2", "Eth1/10/3", "Eth1/10/4"] + }, + "index": "10,10,10,10,10,10,10,10", + "lanes": "97,98,99,100,101,102,103,104" + }, + "Ethernet80": { + "breakout_modes": { + "1x400G": ["Eth1/11"], + "2x200G[100G]": ["Eth1/11/1", "Eth1/11/2"], + "4x100G[50G]": ["Eth1/11/1", "Eth1/11/2", "Eth1/11/3", "Eth1/11/4"] + }, + "index": "11,11,11,11,11,11,11,11", + "lanes": "9,10,11,12,13,14,15,16" + }, + "Ethernet88": { + "breakout_modes": { + "1x400G": ["Eth1/12"], + "2x200G[100G]": ["Eth1/12/1", "Eth1/12/2"], + "4x100G[50G]": ["Eth1/12/1", "Eth1/12/2", "Eth1/12/3", "Eth1/12/4"] + }, + "index": "12,12,12,12,12,12,12,12", + "lanes": "41,42,43,44,45,46,47,48" + }, + "Ethernet96": { + "breakout_modes": { + "1x400G": ["Eth1/13"], + "2x200G[100G]": ["Eth1/13/1", "Eth1/13/2"], + "4x100G[50G]": ["Eth1/13/1", "Eth1/13/2", "Eth1/13/3", "Eth1/13/4"] + }, + "index": "13,13,13,13,13,13,13,13", + "lanes": "113,114,115,116,117,118,119,120" + }, + "Ethernet104": { + "breakout_modes": { + "1x400G": ["Eth1/14"], + "2x200G[100G]": ["Eth1/14/1", "Eth1/14/2"], + "4x100G[50G]": ["Eth1/14/1", "Eth1/14/2", "Eth1/14/3", "Eth1/14/4"] + }, + "index": "14,14,14,14,14,14,14,14", + "lanes": "105,106,107,108,109,110,111,112" + }, + "Ethernet112": { + "breakout_modes": { + "1x400G": ["Eth1/15"], + "2x200G[100G]": ["Eth1/15/1", "Eth1/15/2"], + "4x100G[50G]": ["Eth1/15/1", "Eth1/15/2", "Eth1/15/3", "Eth1/15/4"] + }, + "index": "15,15,15,15,15,15,15,15", + "lanes": "121,122,123,124,125,126,127,128" + }, + "Ethernet120": { + "breakout_modes": { + "1x400G": ["Eth1/16"], + "2x200G[100G]": ["Eth1/16/1", "Eth1/16/2"], + "4x100G[50G]": ["Eth1/16/1", "Eth1/16/2", "Eth1/16/3", "Eth1/16/4"] + }, + "index": "16,16,16,16,16,16,16,16", + "lanes": "1,2,3,4,5,6,7,8" + }, + "Ethernet128": { + "breakout_modes": { + "1x400G": ["Eth1/17"], + "2x200G[100G]": ["Eth1/17/1", "Eth1/17/2"], + "4x100G[50G]": ["Eth1/17/1", "Eth1/17/2", "Eth1/17/3", "Eth1/17/4"] + }, + "index": "17,17,17,17,17,17,17,17", + "lanes": "137,138,139,140,141,142,143,144" + }, + "Ethernet136": { + "breakout_modes": { + "1x400G": ["Eth1/18"], + "2x200G[100G]": ["Eth1/18/1", "Eth1/18/2"], + "4x100G[50G]": ["Eth1/18/1", "Eth1/18/2", "Eth1/18/3", "Eth1/18/4"] + }, + "index": "18,18,18,18,18,18,18,18", + "lanes": "129,130,131,132,133,134,135,136" + }, + "Ethernet144": { + "breakout_modes": { + "1x400G": ["Eth1/19"], + "2x200G[100G]": ["Eth1/19/1", "Eth1/19/2"], + "4x100G[50G]": ["Eth1/19/1", "Eth1/19/2", "Eth1/19/3", "Eth1/19/4"] + }, + "index": "19,19,19,19,19,19,19,19", + "lanes": "241,242,243,244,245,246,247,248" + }, + "Ethernet152": { + "breakout_modes": { + "1x400G": ["Eth1/20"], + "2x200G[100G]": ["Eth1/20/1", "Eth1/20/2"], + "4x100G[50G]": ["Eth1/20/1", "Eth1/20/2", "Eth1/20/3", "Eth1/20/4"] + }, + "index": "20,20,20,20,20,20,20,20", + "lanes": "249,250,251,252,253,254,255,256" + }, + "Ethernet160": { + "breakout_modes": { + "1x400G": ["Eth1/21"], + "2x200G[100G]": ["Eth1/21/1", "Eth1/21/2"], + "4x100G[50G]": ["Eth1/21/1", "Eth1/21/2", "Eth1/21/3", "Eth1/21/4"] + }, + "index": "21,21,21,21,21,21,21,21", + "lanes": "225,226,227,228,229,230,231,232" + }, + "Ethernet168": { + "breakout_modes": { + "1x400G": ["Eth1/22"], + "2x200G[100G]": ["Eth1/22/1", "Eth1/22/2"], + "4x100G[50G]": ["Eth1/22/1", "Eth1/22/2", "Eth1/22/3", "Eth1/22/4"] + }, + "index": "22,22,22,22,22,22,22,22", + "lanes": "145,146,147,148,149,150,151,152" + }, + "Ethernet176": { + "breakout_modes": { + "1x400G": ["Eth1/23"], + "2x200G[100G]": ["Eth1/23/1", "Eth1/23/2"], + "4x100G[50G]": ["Eth1/23/1", "Eth1/23/2", "Eth1/23/3", "Eth1/23/4"] + }, + "index": "23,23,23,23,23,23,23,23", + "lanes": "153,154,155,156,157,158,159,160" + }, + "Ethernet184": { + "breakout_modes": { + "1x400G": ["Eth1/24"], + "2x200G[100G]": ["Eth1/24/1", "Eth1/24/2"], + "4x100G[50G]": ["Eth1/24/1", "Eth1/24/2", "Eth1/24/3", "Eth1/24/4"] + }, + "index": "24,24,24,24,24,24,24,24", + "lanes": "233,234,235,236,237,238,239,240" + }, + "Ethernet192": { + "breakout_modes": { + "1x400G": ["Eth1/25"], + "2x200G[100G]": ["Eth1/25/1", "Eth1/25/2"], + "4x100G[50G]": ["Eth1/25/1", "Eth1/25/2", "Eth1/25/3", "Eth1/25/4"] + }, + "index": "25,25,25,25,25,25,25,25", + "lanes": "161,162,163,164,165,166,167,168" + }, + "Ethernet200": { + "breakout_modes": { + "1x400G": ["Eth1/26"], + "2x200G[100G]": ["Eth1/26/1", "Eth1/26/2"], + "4x100G[50G]": ["Eth1/26/1", "Eth1/26/2", "Eth1/26/3", "Eth1/26/4"] + }, + "index": "26,26,26,26,26,26,26,26", + "lanes": "169,170,171,172,173,174,175,176" + }, + "Ethernet208": { + "breakout_modes": { + "1x400G": ["Eth1/27"], + "2x200G[100G]": ["Eth1/27/1", "Eth1/27/2"], + "4x100G[50G]": ["Eth1/27/1", "Eth1/27/2", "Eth1/27/3", "Eth1/27/4"] + }, + "index": "27,27,27,27,27,27,27,27", + "lanes": "177,178,179,180,181,182,183,184" + }, + "Ethernet216": { + "breakout_modes": { + "1x400G": ["Eth1/28"], + "2x200G[100G]": ["Eth1/28/1", "Eth1/28/2"], + "4x100G[50G]": ["Eth1/28/1", "Eth1/28/2", "Eth1/28/3", "Eth1/28/4"] + }, + "index": "28,28,28,28,28,28,28,28", + "lanes": "185,186,187,188,189,190,191,192" + }, + "Ethernet224": { + "breakout_modes": { + "1x400G": ["Eth1/29"] + }, + "index": "29,29,29,29,29,29,29,29", + "lanes": "193,194,195,196,197,198,199,200" + }, + "Ethernet232": { + "breakout_modes": { + "1x400G": ["Eth1/30"] + }, + "index": "30,30,30,30,30,30,30,30", + "lanes": "201,202,203,204,205,206,207,208" + }, + "Ethernet240": { + "breakout_modes": { + "1x400G": ["Eth1/31"], + "2x200G[100G]": ["Eth1/31/1", "Eth1/31/2"], + "4x100G[50G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4"], + "8x50G[25G][10G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4", "Eth1/31/5", "Eth1/31/6", "Eth1/31/7", "Eth1/31/8"] + }, + "index": "31,31,31,31,31,31,31,31", + "lanes": "209,210,211,212,213,214,215,216" + }, + "Ethernet248": { + "breakout_modes": { + "1x400G": ["Eth1/32"], + "2x200G[100G]": ["Eth1/32/1", "Eth1/32/2"], + "4x100G[50G]": ["Eth1/32/1", "Eth1/32/2", "Eth1/32/3", "Eth1/32/4"], + "8x50G[25G][10G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4", "Eth1/31/5", "Eth1/31/6", "Eth1/31/7", "Eth1/31/8"] + }, + "index": "32,32,32,32,32,32,32,32", + "lanes": "217,218,219,220,221,222,223,224" + } + } +} diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index c43a66ee43e3..c7c7381b9735 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -9,7 +9,7 @@ include $(PLATFORM_PATH)/platform-modules-accton.mk #include $(PLATFORM_PATH)/platform-modules-inventec.mk include $(PLATFORM_PATH)/platform-modules-cel.mk #include $(PLATFORM_PATH)/platform-modules-delta.mk -#include $(PLATFORM_PATH)/platform-modules-quanta.mk +include $(PLATFORM_PATH)/platform-modules-quanta.mk ##include $(PLATFORM_PATH)/platform-modules-mitac.mk include $(PLATFORM_PATH)/platform-modules-juniper.mk #include $(PLATFORM_PATH)/platform-modules-brcm-xlr-gts.mk diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/qci_cpld_led.c index 64841e8538f6..147a2a7f8611 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/qci_cpld_led.c @@ -49,7 +49,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_hwmon_ipmi.c index 08d6a97d9a09..29b439f290ae 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_hwmon_ipmi.c @@ -86,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; @@ -1829,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) @@ -1856,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void) return 0; init_sensor_err: - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; ipmi_create_err: hwmon_device_unregister(data->ipmi_hwmon_dev); hwmon_register_err: platform_device_unregister(data->ipmi_platform_dev); device_reg_err: - if (data) - { - kfree(data); - data = NULL; - } + kfree(data); + data = NULL; alloc_err: return err; } @@ -1886,17 +1882,10 @@ static void __exit quanta_hwmon_ipmi_exit(void) platform_device_unregister(data->ipmi_platform_dev); - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } - - if (data) - { - kfree(data); - data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; + kfree(data); + data = NULL; } module_init(quanta_hwmon_ipmi_init); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_platform_ix7.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_platform_ix7.c index 02705e37d828..742b6b6e7daf 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_platform_ix7.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/modules/quanta_platform_ix7.c @@ -151,9 +151,9 @@ static int __init ix7_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix7_i2c_devices[0]); // pca9546 - g_client[1] = i2c_new_device(adapter, &ix7_i2c_devices[1]); // pca9548 - g_client[2] = i2c_new_device(adapter, &ix7_i2c_devices[10]); // pca9546 in CPU board + g_client[0] = i2c_new_client_device(adapter, &ix7_i2c_devices[0]); // pca9546 + g_client[1] = i2c_new_client_device(adapter, &ix7_i2c_devices[1]); // pca9548 + g_client[2] = i2c_new_client_device(adapter, &ix7_i2c_devices[10]); // pca9546 in CPU board i2c_put_adapter(adapter); } @@ -164,7 +164,7 @@ static int __init ix7_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix7_i2c_devices[11]); // CPU Board Data + g_client[3] = i2c_new_client_device(adapter, &ix7_i2c_devices[11]); // CPU Board Data i2c_put_adapter(adapter); } @@ -175,8 +175,8 @@ static int __init ix7_platform_init(void) } else { - g_client[4] = i2c_new_device(adapter, &ix7_i2c_devices[8]); // CPLD2 - g_client[5] = i2c_new_device(adapter, &ix7_i2c_devices[13]); // CPLD_led_1 + g_client[4] = i2c_new_client_device(adapter, &ix7_i2c_devices[8]); // CPLD2 + g_client[5] = i2c_new_client_device(adapter, &ix7_i2c_devices[13]); // CPLD_led_1 i2c_put_adapter(adapter); } @@ -187,8 +187,8 @@ static int __init ix7_platform_init(void) } else { - g_client[6] = i2c_new_device(adapter, &ix7_i2c_devices[9]); // CPLD3 - g_client[7] = i2c_new_device(adapter, &ix7_i2c_devices[14]); // CPLD_led_2 + g_client[6] = i2c_new_client_device(adapter, &ix7_i2c_devices[9]); // CPLD3 + g_client[7] = i2c_new_client_device(adapter, &ix7_i2c_devices[14]); // CPLD_led_2 i2c_put_adapter(adapter); } @@ -199,7 +199,7 @@ static int __init ix7_platform_init(void) } else { - g_client[8] = i2c_new_device(adapter, &ix7_i2c_devices[2]); // MB_BOARDINFO_EEPROM + g_client[8] = i2c_new_client_device(adapter, &ix7_i2c_devices[2]); // MB_BOARDINFO_EEPROM i2c_put_adapter(adapter); } @@ -210,7 +210,7 @@ static int __init ix7_platform_init(void) } else { - g_client[9] = i2c_new_device(adapter, &ix7_i2c_devices[7]); // pca9555 MB Board Data + g_client[9] = i2c_new_client_device(adapter, &ix7_i2c_devices[7]); // pca9555 MB Board Data i2c_put_adapter(adapter); } @@ -221,7 +221,7 @@ static int __init ix7_platform_init(void) } else { - g_client[10] = i2c_new_device(adapter, &ix7_i2c_devices[3]); // pca9548_1 SFP + g_client[10] = i2c_new_client_device(adapter, &ix7_i2c_devices[3]); // pca9548_1 SFP i2c_put_adapter(adapter); } @@ -232,7 +232,7 @@ static int __init ix7_platform_init(void) } else { - g_client[11] = i2c_new_device(adapter, &ix7_i2c_devices[4]); // pca9548_2 SFP + g_client[11] = i2c_new_client_device(adapter, &ix7_i2c_devices[4]); // pca9548_2 SFP i2c_put_adapter(adapter); } @@ -243,7 +243,7 @@ static int __init ix7_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix7_i2c_devices[5]); // pca9548_3 SFP + g_client[12] = i2c_new_client_device(adapter, &ix7_i2c_devices[5]); // pca9548_3 SFP i2c_put_adapter(adapter); } @@ -254,7 +254,7 @@ static int __init ix7_platform_init(void) } else { - g_client[13] = i2c_new_device(adapter, &ix7_i2c_devices[6]); // pca9548_4 SFP + g_client[13] = i2c_new_client_device(adapter, &ix7_i2c_devices[6]); // pca9548_4 SFP i2c_put_adapter(adapter); } @@ -266,7 +266,7 @@ static int __init ix7_platform_init(void) } else { - g_client_port[i - 17] = i2c_new_device(adapter, &ix7_i2c_devices[12]); + g_client_port[i - 17] = i2c_new_client_device(adapter, &ix7_i2c_devices[12]); i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/chassis.py index 58d44f4c553e..a14eb81b7df5 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/chassis.py @@ -72,6 +72,13 @@ def __init__(self): for index in range(1, self.__num_of_ports + 1): self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) + ############################################## # Device methods ############################################## @@ -189,19 +196,7 @@ def get_reboot_cause(self): is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used to pass a description of the reboot cause. """ - hw_reboot_cause = "" - with open("/sys/class/watchdog/watchdog0/reboot_reason", "r") as f: - hw_reboot_cause = f.read().strip('\n') - - if hw_reboot_cause == "2": - reboot_cause = self.REBOOT_CAUSE_WATCHDOG - description = 'Hardware Watchdog Reset' - else: - reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE - description = 'Unknown reason' - - return (reboot_cause, description) - + return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") ############################################## # Other methods @@ -239,10 +234,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/component.py new file mode 100644 index 000000000000..9f5f69f422a9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/component.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX7 +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("UART_CPLD", 1, "UART"), + 2: Cpld("BOOT_CPLD", 2, "Power sequence"), + 3: Cpld("FAN_CPLD", 3, "Fan"), + 4: Cpld("MB_CPLD_IO_1", 5, "Port IO-1"), + 5: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"), + 6: Cpld("MB_CPLD_LED_1", 4, "Port LED-1"), + 7: Cpld("MB_CPLD_LED_2", 7, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/psu.py index 49846fff48ff..3ef0c6816cfb 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/psu.py @@ -213,10 +213,10 @@ def get_current(self): def get_input_voltage(self): """ - Retrieves current PSU voltage output + Retrieves current PSU voltage input Returns: - A float number, the output voltage in volts, + A float number, the input voltage in volts, e.g. 12.1 """ voltage_in = 0.0 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/sfp.py index a00fc8f2977c..c8336473051e 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/sfp.py @@ -10,13 +10,10 @@ import os import time -#import subprocess -#import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase -# from sonic_platform_base.sonic_eeprom import eeprom_dts from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId @@ -175,7 +172,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type self.lpmode_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/lpmode" self.reset_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/reset" @@ -262,15 +258,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -325,26 +312,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -503,9 +470,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -560,7 +525,8 @@ def get_transceiver_info(self): ['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \ ['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = 'N/A' + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \ + ['data']['type_abbrv_name']['value'] if self.sfp_type == QSFP_TYPE: for key in qsfp_cable_length_tup: if key in sfp_interface_bulk_data['data']: @@ -830,7 +796,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key]) + transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key]) return transceiver_dom_threshold_dict @@ -878,7 +844,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key]) + transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key]) return transceiver_dom_threshold_info_dict @@ -1425,7 +1391,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -1478,7 +1444,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -1565,7 +1531,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/thermal.py index bf5757c9fa22..238d15fbeae8 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta +# Quanta IX7 # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information @@ -57,7 +57,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open ", attr_path, " file !") + logging.error("Unable to open " + attr_path + " file !") retval = retval.rstrip(' \t\n\r') return retval diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/watchdog.py index 282f356f4e73..0e63d9368cb0 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/sonic_platform/watchdog.py @@ -48,12 +48,16 @@ WDT_SYSFS_PATH = "/sys/class/watchdog/" DEFAULT_TIMEOUT=180 +watchdog=0 class Watchdog(WatchdogBase): def __init__(self): self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name @@ -74,14 +78,16 @@ def _get_wdt(self): """ Retrieves watchdog device """ + global watchdog wdt_main_dev_list = [dev for dev in os.listdir( "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] if not wdt_main_dev_list: - return None + return (None, None) wdt_main_dev_name = wdt_main_dev_list[0] watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) - self.watchdog = os.open(watchdog_device_path, os.O_RDWR) - return self.watchdog, wdt_main_dev_name + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name def _read_file(self, file_path): """ @@ -228,7 +234,8 @@ def __del__(self): Close watchdog """ - os.close(self.watchdog) + if self.watchdog is not None : + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/utils/quanta_ix7_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/utils/quanta_ix7_util.py index 901f7ba1ae86..4196e24f4625 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/utils/quanta_ix7_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-32x/utils/quanta_ix7_util.py @@ -28,7 +28,7 @@ """ import os -import commands +import subprocess import sys, getopt import logging import time @@ -38,18 +38,16 @@ FORCE = 0 i2c_prefix = '/sys/bus/i2c/devices/' - if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] - + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG global args global FORCE - if len(sys.argv)<2: + if len(sys.argv) < 2: show_help() options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', @@ -57,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -73,34 +71,43 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() - return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX7-32X]"+txt + print("[IX7-32X]" + txt) return def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) + logging.info('Run :' + cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output + print('Failed :' + cmd) + return status, output + +pca954x_bus_addr =[ +'0-0071', +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073' +] instantiate =[ #Enable front-ports LED decoding @@ -119,7 +126,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld', @@ -155,11 +162,24 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe "+drivers[i], 1) - if status: - print output - if FORCE == 0: - return status + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status + + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) #turn on module power exec_cmd("echo 21 > /sys/class/gpio/export ", 1) @@ -174,15 +194,15 @@ def system_install(): exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1) #instantiate devices - for i in range(0,len(instantiate)): + for i in range(0, len(instantiate)): status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + if status: + print(output) + if FORCE == 0: + return status #QSFP for 1~32 port - for port_number in range(1,33): + for port_number in range(1, 33): bus_number = port_number + 16 os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) return @@ -195,36 +215,37 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: - return status + return status status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status else: - print " ix7 driver already installed...." + print(" ix7 driver already installed....") return def uninstall(): global FORCE #uninstall drivers - for i in range(len(un_drivers)-1,-1,-1): - status, output = exec_cmd("rmmod "+un_drivers[i], 1) + for i in range(len(un_drivers) - 1, -1, -1): + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output + print(output) if FORCE == 0: return status status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status + return def device_found(): diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/qci_cpld_led.c index d924f51ebc29..7354e9071c7b 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/qci_cpld_led.c @@ -51,7 +51,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_hwmon_ipmi.c index 08d6a97d9a09..29b439f290ae 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_hwmon_ipmi.c @@ -86,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; @@ -1829,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) @@ -1856,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void) return 0; init_sensor_err: - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; ipmi_create_err: hwmon_device_unregister(data->ipmi_hwmon_dev); hwmon_register_err: platform_device_unregister(data->ipmi_platform_dev); device_reg_err: - if (data) - { - kfree(data); - data = NULL; - } + kfree(data); + data = NULL; alloc_err: return err; } @@ -1886,17 +1882,10 @@ static void __exit quanta_hwmon_ipmi_exit(void) platform_device_unregister(data->ipmi_platform_dev); - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } - - if (data) - { - kfree(data); - data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; + kfree(data); + data = NULL; } module_init(quanta_hwmon_ipmi_init); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_platform_ix7_bwde.c b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_platform_ix7_bwde.c index 4658cee28583..01f116993984 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_platform_ix7_bwde.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/modules/quanta_platform_ix7_bwde.c @@ -148,9 +148,9 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[0]); // pca9546 - g_client[1] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[1]); // pca9548 - g_client[2] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[10]); // CPU Board Data + g_client[0] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[0]); // pca9546 + g_client[1] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[1]); // pca9548 + g_client[2] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[10]); // CPU Board Data i2c_put_adapter(adapter); } @@ -161,8 +161,8 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[8]); // CPLD2 - g_client[4] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[12]); // CPLD_led_1 + g_client[3] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[8]); // CPLD2 + g_client[4] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[12]); // CPLD_led_1 i2c_put_adapter(adapter); } @@ -173,8 +173,8 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[5] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[9]); // CPLD3 - g_client[6] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[13]); // CPLD_led_2 + g_client[5] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[9]); // CPLD3 + g_client[6] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[13]); // CPLD_led_2 i2c_put_adapter(adapter); } @@ -185,7 +185,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[7] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[2]); // MB_BOARDINFO_EEPROM + g_client[7] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[2]); // MB_BOARDINFO_EEPROM i2c_put_adapter(adapter); } @@ -196,7 +196,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[8] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[7]); // pca9555 MB Board Data + g_client[8] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[7]); // pca9555 MB Board Data i2c_put_adapter(adapter); } @@ -207,7 +207,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[9] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[3]); // pca9548_1 SFP + g_client[9] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[3]); // pca9548_1 SFP i2c_put_adapter(adapter); } @@ -218,7 +218,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[10] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[4]); // pca9548_2 SFP + g_client[10] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[4]); // pca9548_2 SFP i2c_put_adapter(adapter); } @@ -229,7 +229,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[11] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[5]); // pca9548_3 SFP + g_client[11] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[5]); // pca9548_3 SFP i2c_put_adapter(adapter); } @@ -240,7 +240,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[6]); // pca9548_4 SFP + g_client[12] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[6]); // pca9548_4 SFP i2c_put_adapter(adapter); } @@ -252,7 +252,7 @@ static int __init ix7_bwde_platform_init(void) } else { - g_client_port[i - 13] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[11]); + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[11]); i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/chassis.py index 92a8c433ce80..bcd0739e5ff6 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/chassis.py @@ -8,6 +8,7 @@ try: import sys import time + import syslog from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.eeprom import Eeprom from sonic_platform.psu import Psu @@ -71,6 +72,13 @@ def __init__(self): for index in range(1, self.__num_of_ports + 1): self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) + ############################################## # Device methods ############################################## @@ -178,6 +186,39 @@ def get_system_eeprom_info(self): """ return self._eeprom.system_eeprom_info() + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + + ############################################## + # Other methods + ############################################## + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + try: + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + # Create the watchdog Instance + self._watchdog = Watchdog() + + except Exception as e: + syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e)) + return self._watchdog + def get_change_event(self, timeout=0): """ Currently only support transceiver change events @@ -193,10 +234,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/component.py new file mode 100644 index 000000000000..ae0c25228930 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/component.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX7_BDE +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("BOOT_CPLD", 1, "Power sequence"), + 2: Cpld("FAN_CPLD", 2, "Fan"), + 3: Cpld("MB_CPLD_IO_1", 4, "Port IO-1"), + 4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"), + 5: Cpld("MB_CPLD_LED_1", 3, "Port LED-1"), + 6: Cpld("MB_CPLD_LED_2", 6, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01") + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00") + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan.py index 5567eaff9395..fbd8004ce713 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta IX7 +# Quanta IX7_BDE # # Module contains an implementation of SONiC Platform Base API and # provides the FAN information @@ -11,6 +11,7 @@ try: import logging import os + import glob from sonic_platform_base.fan_base import FanBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -19,9 +20,7 @@ ############### # Global ############### -HWMON_DIR = "/sys/class/hwmon/hwmon2/" -FAN_INDEX_START = 18 -NUM_FANTRAYS = 6 +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" FANS_PERTRAY = 2 class Fan(FanBase): @@ -30,30 +29,46 @@ class Fan(FanBase): def __init__(self, index, is_psu_fan=False): self.is_psu_fan = is_psu_fan self.fan_index = index - self.psu_fan_index_mapping = { - 1:37, - 2:47, - } - self.psu_index_mapping = { - 1:39, - 2:49, - } + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + if self.is_psu_fan: - self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index]) - self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index]) - self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index]) - self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index]) + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power') + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan') + self.fan_presence_attr = power_out_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' else: - self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1)) - self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1)) - self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1)) - self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1)) + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 + fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan') + self.fan_presence_attr = fan_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' ####################### # private function ####################### + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval + def __get_attr_value(self, attr_path): retval = 'ERR' @@ -64,7 +79,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -95,8 +110,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.fan_presence_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == '1'): return True @@ -112,11 +126,13 @@ def get_status(self): Returns: A boolean value, True if device is operating properly, False if not """ - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + if self.get_presence(): + attr_rv = self.__get_attr_value(self.fan_rpm_attr) - if (attr_rv != 'ERR' and attr_rv != '0.0'): - return True + if (attr_rv != 'ERR' and attr_rv != '0.0'): + return True + else: + return False else: return False @@ -132,8 +148,7 @@ def get_direction(self): A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST depending on fan direction """ - attr_path = HWMON_DIR + self.fan_direction_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_direction_attr) if attr_rv == '2': return self.FAN_DIRECTION_INTAKE @@ -148,13 +163,15 @@ def get_speed(self): An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) """ - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + if self.get_presence(): + attr_rv = self.__get_attr_value(self.fan_pwm_attr) - if (attr_rv != 'ERR'): - return int(float(attr_rv)) + if (attr_rv != 'ERR'): + return int(float(attr_rv)) + else: + return False else: - return False + return 0 def get_speed_rpm(self): """ @@ -163,8 +180,7 @@ def get_speed_rpm(self): Returns: An integer, speed of the fan in RPM """ - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -179,8 +195,7 @@ def get_target_speed(self): An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) """ - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/psu.py index 3fcb9e979ab5..6188c95c7692 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/psu.py @@ -8,58 +8,61 @@ try: import logging import os + import glob from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" - +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" class Psu(PsuBase): def __init__(self, index): PsuBase.__init__(self) fan = Fan(index, True) self._fan_list.append(fan) + self.index = index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + + current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr') + current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr') + power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power') + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power') + voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in') + voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in') + temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp') + + self.psu_current_in_attr = current_in_prefix + 'input' + self.psu_current_out_attr = current_out_prefix + 'input' + self.psu_power_in_attr = power_in_prefix + 'input' + self.psu_power_out_attr = power_out_prefix + 'input' + self.psu_voltage_in_attr = voltage_in_prefix + 'input' + self.psu_voltage_out_attr = voltage_out_prefix + 'input' + self.psu_status_attr = current_out_prefix + 'input' + self.psu_presence_attr = power_out_prefix + 'present' + self.psu_serial_attr = power_out_prefix + 'sn' + self.psu_model_attr = power_out_prefix + 'model' + self.psu_mfr_id_attr = power_out_prefix + 'mfrid' + self.psu_capacity_attr = power_out_prefix + 'pout_max' + self.psu_type_attr = power_out_prefix + 'vin_type' + self.psu_temp_attr = temp1_prefix + 'input' + + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) - self.psu_index_mapping = { - 1:39, - 2:49, - } - self.psu_powerin_index_mapping = { - 1:38, - 2:48, - } - self.psu_currentout_index_mapping = { - 1:36, - 2:46, - } - self.psu_currentin_index_mapping = { - 1:35, - 2:45, - } - self.psu_voltageout_index_mapping = { - 1:44, - 2:54, - } - self.psu_voltagein_index_mapping = { - 1:43, - 2:53, - } - self.index = index - self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index]) - self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index]) - self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index]) - self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index]) - self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index]) - self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index]) - self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index]) - self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index]) - self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index]) - self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index]) - self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index]) + return retval def __get_attr_value(self, attr_path): @@ -71,10 +74,9 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') - fd.close() return retval ############################################## @@ -98,10 +100,9 @@ def get_presence(self): bool: True if device is present, False if not """ presence = False - attr_path = HWMON_DIR+self.psu_presence_attr attr_normal = '1' - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == attr_normal): presence = True @@ -116,8 +117,7 @@ def get_model(self): string: Model/part number of device """ model = "N/A" - attr_path = HWMON_DIR+self.psu_model_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_model_attr) if (attr_rv != 'ERR'): model = attr_rv @@ -131,8 +131,7 @@ def get_mfr_id(self): string: Manufacturer's id of device """ mfr_id = "N/A" - attr_path = HWMON_DIR+self.psu_mfr_id_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_mfr_id_attr) if (attr_rv != 'ERR'): mfr_id = attr_rv @@ -146,9 +145,7 @@ def get_serial(self): string: Serial number of device """ serial = "N/A" - attr_path = HWMON_DIR+self.psu_serial_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_serial_attr) if (attr_rv != 'ERR'): serial = attr_rv @@ -162,9 +159,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ status = False - attr_path = HWMON_DIR+self.psu_status_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_status_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) if (int(attr_rv) != 0): @@ -185,9 +180,7 @@ def get_voltage(self): e.g. 12.1 """ voltage_out = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_out = float(attr_rv) / 1000 @@ -202,9 +195,7 @@ def get_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_out = 0.0 - attr_path = HWMON_DIR+self.psu_current_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_out = float(attr_rv) / 1000 @@ -213,16 +204,14 @@ def get_current(self): def get_input_voltage(self): """ - Retrieves current PSU voltage output + Retrieves current PSU voltage input Returns: - A float number, the output voltage in volts, + A float number, the input voltage in volts, e.g. 12.1 """ voltage_in = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_in = float(attr_rv) / 1000 @@ -237,9 +226,7 @@ def get_input_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_in = 0.0 - attr_path = HWMON_DIR+self.psu_current_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_in = float(attr_rv) / 1000 @@ -254,9 +241,7 @@ def get_power(self): A float number, the power in watts, e.g. 302.6 """ power_out = 0.0 - attr_path = HWMON_DIR+self.psu_power_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_power_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) power_out = float(attr_rv) / 1000 @@ -293,8 +278,7 @@ def get_type(self): A string, the type of PSU (AC/DC) """ type = "AC" - attr_path = HWMON_DIR+self.psu_type_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_type_attr) if (attr_rv != 'ERR'): type = attr_rv @@ -308,8 +292,7 @@ def get_capacity(self): An integer, the capacity of PSU """ capacity = 0 - attr_path = HWMON_DIR+self.psu_capacity_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_capacity_attr) if (attr_rv != 'ERR'): try: capacity = int(attr_rv) @@ -318,3 +301,19 @@ def get_capacity(self): return capacity + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + + tout = 0.0 + attr_rv = self.__get_attr_value(self.psu_temp_attr) + if (attr_rv != 'ERR'): + tout = float(attr_rv) + + # tout is in milli degree celcius + return float(tout/1000.0) + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/sfp.py index 759fa99a4bea..1faf552c7b56 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/sfp.py @@ -10,13 +10,10 @@ import os import time -#import subprocess -#import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase -# from sonic_platform_base.sonic_eeprom import eeprom_dts from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId @@ -175,7 +172,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type self.lpmode_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/lpmode" self.reset_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/reset" @@ -262,15 +258,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -325,26 +312,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -503,9 +470,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -560,7 +525,8 @@ def get_transceiver_info(self): ['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \ ['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = 'N/A' + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \ + ['data']['type_abbrv_name']['value'] if self.sfp_type == QSFP_TYPE: for key in qsfp_cable_length_tup: if key in sfp_interface_bulk_data['data']: @@ -830,7 +796,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key]) + transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key]) return transceiver_dom_threshold_dict @@ -878,7 +844,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key]) + transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key]) return transceiver_dom_threshold_info_dict @@ -1425,7 +1391,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -1478,7 +1444,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -1565,7 +1531,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/thermal.py index a80a07a999ba..cf6073438d3e 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta +# Quanta IX7_BDE # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information @@ -10,45 +10,68 @@ import logging import os +import glob try: from sonic_platform_base.thermal_base import ThermalBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" thermal_index_mapping = { - 1:40, - 2:41, - 3:42, - 4:50, - 5:51, - 6:52, - 7:73, - 8:74, - 9:75, - 10:76, - 11:77, - 12:78, - 13:79, - 14:80, - 15:81, - 16:82, - 17:83, - 18:84 + 1:'PSU1_TEMP1', + 2:'PSU1_TEMP2', + 3:'PSU1_TEMP3', + 4:'PSU2_TEMP1', + 5:'PSU2_TEMP2', + 6:'PSU2_TEMP3', + 7:'Temp_1V05_PCH_VR', + 8:'Temp_Ambient_1', + 9:'Temp_Ambient_2', + 10:'Temp_Ambient_3', + 11:'Temp_Ambient_4', + 12:'Temp_Ambient_5', + 13:'Temp_Ambient_6', + 14:'Temp_CPU', + 15:'Temp_DDRAB_VR', + 16:'Temp_SOC_DIMMA0', + 17:'Temp_VCCGBE_VR', + 18:'Temp_VCCIN_VR' } + + class Thermal(ThermalBase): """Platform-specific Thermal class""" def __init__(self, thermal_index): - self.index = thermal_index - self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index]) - self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index]) - self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index]) - self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index]) + self.index = thermal_index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp') + self.temp_attr = "{}input".format(thermal_prefix) + self.high_th_attr = "{}ncrit".format(thermal_prefix) + self.high_crit_th_attr = "{}crit".format(thermal_prefix) + self.low_th_attr = "{}lncrit".format(thermal_prefix) + self.low_crit_th_attr = "{}lcrit".format(thermal_prefix) + self.name_attr = "{}label".format(thermal_prefix) + + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + return retval def __get_attr_value(self, attr_path): @@ -60,7 +83,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open ", attr_path, " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -72,8 +95,7 @@ def get_name(self): Returns: string: The name of the device """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return attr_rv @@ -87,8 +109,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return True @@ -115,8 +136,37 @@ def get_temperature(self): A float number of current temperature in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.temp_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.temp_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_th_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -131,8 +181,7 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -147,8 +196,7 @@ def get_high_critical_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_crit_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/watchdog.py new file mode 100644 index 000000000000..0e63d9368cb0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/sonic_platform/watchdog.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python + +############################################################################# +# +# Watchdog contains an implementation of SONiC Platform Base Watchdog API +# +############################################################################# +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +""" ioctl constants """ +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +""" Watchdog ioctl commands """ +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +""" Watchdog status constants """ +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WD_MAIN_IDENTITY = "iTCO_wdt" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + +DEFAULT_TIMEOUT=180 +watchdog=0 + +class Watchdog(WatchdogBase): + + def __init__(self): + + self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name + self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name + self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name + # Set default value + self._disable() + self.armed = False + self.timeout = DEFAULT_TIMEOUT + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WD_MAIN_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + global watchdog + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + return (None, None) + wdt_main_dev_name = wdt_main_dev_list[0] + watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self, timeout_path): + """ + Get watchdog timeout + @return watchdog timeout + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + ################################################################# + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + if self.armed: + self._keepalive() + else: + self._settimeout(seconds) + self._enable() + self.armed = True + ret = self.timeout + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + + timeleft = WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + + if self.watchdog is not None : + os.close(self.watchdog) + + + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/utils/quanta_ix7_bwde_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/utils/quanta_ix7_bwde_util.py index 952fc11a6816..a20aa33828e4 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/utils/quanta_ix7_bwde_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix7-bwde-32x/utils/quanta_ix7_bwde_util.py @@ -28,27 +28,26 @@ """ import os -import commands +import subprocess import sys, getopt import logging +import time DEBUG = False args = [] FORCE = 0 i2c_prefix = '/sys/bus/i2c/devices/' - if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] - + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG global args global FORCE - if len(sys.argv)<2: + if len(sys.argv) < 2: show_help() options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', @@ -56,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -72,34 +71,42 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() - return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX7-BWDE-32X]"+txt + print("[IX7-BWDE-32X]"+txt) return def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) + logging.info('Run :' + cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output + print('Failed :' + cmd) + return status, output + +pca954x_bus_addr =[ +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073' +] instantiate =[ #Enable front-ports LED decoding @@ -118,7 +125,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld', @@ -149,18 +156,30 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe "+drivers[i], 1) - if status: - print output - if FORCE == 0: - return status - + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status #reload ethernet drivers for correct order exec_cmd("rmmod ixgbe ", 1) exec_cmd("rmmod igb ", 1) exec_cmd("modprobe igb ", 1) exec_cmd("modprobe ixgbe ", 1) + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) + #turn on module power exec_cmd("echo 21 > /sys/class/gpio/export ", 1) exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1) @@ -174,23 +193,23 @@ def system_install(): exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1) #instantiate devices - for i in range(0,len(instantiate)): + for i in range(0, len(instantiate)): status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + if status: + print(output) + if FORCE == 0: + return status #QSFP for 1~32 port - for port_number in range(1,33): + for port_number in range(1, 33): bus_number = port_number + 12 os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status return @@ -202,29 +221,29 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: - return status + return status else: - print " ix7-bwde driver already installed...." + print(" ix7-bwde driver already installed....") return def uninstall(): global FORCE #uninstall drivers - for i in range(len(un_drivers)-1,-1,-1): - status, output = exec_cmd("rmmod "+un_drivers[i], 1) + for i in range(len(un_drivers) - 1, -1, -1): + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output + print(output) if FORCE == 0: return status status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status return def device_found(): diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_cpld_led.c index 64841e8538f6..147a2a7f8611 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_cpld_led.c @@ -49,7 +49,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_platform_ix8.c b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_platform_ix8.c index 51876246e1a2..fe295b5dfebb 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_platform_ix8.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/qci_platform_ix8.c @@ -192,9 +192,9 @@ static int __init ix8_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix8_i2c_devices[0]); // pca9546 - g_client[1] = i2c_new_device(adapter, &ix8_i2c_devices[1]); // pca9548 - g_client[2] = i2c_new_device(adapter, &ix8_i2c_devices[16]); // pca9546cpu + g_client[0] = i2c_new_client_device(adapter, &ix8_i2c_devices[0]); // pca9546 + g_client[1] = i2c_new_client_device(adapter, &ix8_i2c_devices[1]); // pca9548 + g_client[2] = i2c_new_client_device(adapter, &ix8_i2c_devices[16]); // pca9546cpu i2c_put_adapter(adapter); } @@ -205,7 +205,7 @@ static int __init ix8_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix8_i2c_devices[17]); // CPU Board Data + g_client[3] = i2c_new_client_device(adapter, &ix8_i2c_devices[17]); // CPU Board Data i2c_put_adapter(adapter); } @@ -216,9 +216,9 @@ static int __init ix8_platform_init(void) } else { - g_client[4] = i2c_new_device(adapter, &ix8_i2c_devices[10]); // CPLD_1 - g_client[5] = i2c_new_device(adapter, &ix8_i2c_devices[18]); // CPLD_4 - g_client[6] = i2c_new_device(adapter, &ix8_i2c_devices[19]); // CPLD_6 + g_client[4] = i2c_new_client_device(adapter, &ix8_i2c_devices[10]); // CPLD_1 + g_client[5] = i2c_new_client_device(adapter, &ix8_i2c_devices[18]); // CPLD_4 + g_client[6] = i2c_new_client_device(adapter, &ix8_i2c_devices[19]); // CPLD_6 i2c_put_adapter(adapter); } @@ -229,7 +229,7 @@ static int __init ix8_platform_init(void) } else { - g_client[7] = i2c_new_device(adapter, &ix8_i2c_devices[11]); // CPLD_2 + g_client[7] = i2c_new_client_device(adapter, &ix8_i2c_devices[11]); // CPLD_2 i2c_put_adapter(adapter); } @@ -240,8 +240,8 @@ static int __init ix8_platform_init(void) } else { - g_client[8] = i2c_new_device(adapter, &ix8_i2c_devices[12]); // CPLD_3 - g_client[9] = i2c_new_device(adapter, &ix8_i2c_devices[2]); // MB_BOARDINFO_EEPROM + g_client[8] = i2c_new_client_device(adapter, &ix8_i2c_devices[12]); // CPLD_3 + g_client[9] = i2c_new_client_device(adapter, &ix8_i2c_devices[2]); // MB_BOARDINFO_EEPROM i2c_put_adapter(adapter); } @@ -252,8 +252,8 @@ static int __init ix8_platform_init(void) } else { - g_client[10] = i2c_new_device(adapter, &ix8_i2c_devices[13]); // MB Board Data - g_client[11] = i2c_new_device(adapter, &ix8_i2c_devices[14]); // QSFP:49~52 + g_client[10] = i2c_new_client_device(adapter, &ix8_i2c_devices[13]); // MB Board Data + g_client[11] = i2c_new_client_device(adapter, &ix8_i2c_devices[14]); // QSFP:49~52 i2c_put_adapter(adapter); } @@ -264,7 +264,7 @@ static int __init ix8_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix8_i2c_devices[3]); // pca9548_1 SFP + g_client[12] = i2c_new_client_device(adapter, &ix8_i2c_devices[3]); // pca9548_1 SFP i2c_put_adapter(adapter); } @@ -275,7 +275,7 @@ static int __init ix8_platform_init(void) } else { - g_client[13] = i2c_new_device(adapter, &ix8_i2c_devices[4]); // pca9548_2 SFP + g_client[13] = i2c_new_client_device(adapter, &ix8_i2c_devices[4]); // pca9548_2 SFP i2c_put_adapter(adapter); } @@ -286,7 +286,7 @@ static int __init ix8_platform_init(void) } else { - g_client[14] = i2c_new_device(adapter, &ix8_i2c_devices[5]); // pca9548_3 SFP + g_client[14] = i2c_new_client_device(adapter, &ix8_i2c_devices[5]); // pca9548_3 SFP i2c_put_adapter(adapter); } @@ -297,7 +297,7 @@ static int __init ix8_platform_init(void) } else { - g_client[15] = i2c_new_device(adapter, &ix8_i2c_devices[6]); // pca9548_4 SFP + g_client[15] = i2c_new_client_device(adapter, &ix8_i2c_devices[6]); // pca9548_4 SFP i2c_put_adapter(adapter); } @@ -308,7 +308,7 @@ static int __init ix8_platform_init(void) } else { - g_client[16] = i2c_new_device(adapter, &ix8_i2c_devices[7]); // pca9548_5 SFP + g_client[16] = i2c_new_client_device(adapter, &ix8_i2c_devices[7]); // pca9548_5 SFP i2c_put_adapter(adapter); } @@ -319,7 +319,7 @@ static int __init ix8_platform_init(void) } else { - g_client[17] = i2c_new_device(adapter, &ix8_i2c_devices[8]); // pca9548_6 SFP + g_client[17] = i2c_new_client_device(adapter, &ix8_i2c_devices[8]); // pca9548_6 SFP i2c_put_adapter(adapter); } @@ -330,7 +330,7 @@ static int __init ix8_platform_init(void) } else { - g_client[18] = i2c_new_device(adapter, &ix8_i2c_devices[9]); // pca9548_7 QSFP + g_client[18] = i2c_new_client_device(adapter, &ix8_i2c_devices[9]); // pca9548_7 QSFP i2c_put_adapter(adapter); } @@ -342,7 +342,7 @@ static int __init ix8_platform_init(void) } else { - g_client_port[i - 17] = i2c_new_device(adapter, &ix8_i2c_devices[15]); + g_client_port[i - 17] = i2c_new_client_device(adapter, &ix8_i2c_devices[15]); i2c_put_adapter(adapter); } } @@ -355,7 +355,7 @@ static int __init ix8_platform_init(void) else { adapter = i2c_get_adapter_wait(i); - g_client_port[i - 17] = i2c_new_device(adapter, &ix8_i2c_devices[20]); + g_client_port[i - 17] = i2c_new_client_device(adapter, &ix8_i2c_devices[20]); i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/quanta_hwmon_ipmi.c index 5c9570c1035a..ce932d9b6ca8 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/modules/quanta_hwmon_ipmi.c @@ -86,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; @@ -1090,7 +1092,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val, result = (m * (int16_t)val) * decimal_point + b; break; default: - return; + return result; } pow_convert(&result, k2); @@ -1242,7 +1244,7 @@ int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf) if (rv) { printk("BMC down at (%d)!!\n", __LINE__); } - else { + else { switch (returnData) { case 0x7: //LVDC @@ -1830,7 +1832,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) @@ -1857,21 +1859,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void) return 0; init_sensor_err: - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; ipmi_create_err: hwmon_device_unregister(data->ipmi_hwmon_dev); hwmon_register_err: platform_device_unregister(data->ipmi_platform_dev); device_reg_err: - if (data) - { - kfree(data); - data = NULL; - } + kfree(data); + data = NULL; alloc_err: return err; } @@ -1887,17 +1883,10 @@ static void __exit quanta_hwmon_ipmi_exit(void) platform_device_unregister(data->ipmi_platform_dev); - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } - - if (data) - { - kfree(data); - data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; + kfree(data); + data = NULL; } module_init(quanta_hwmon_ipmi_init); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/chassis.py index b959d6678048..5599f703f413 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/chassis.py @@ -72,6 +72,13 @@ def __init__(self): for index in range(1, self.__num_of_ports + 1): self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) + ############################################## # Device methods ############################################## @@ -79,7 +86,7 @@ def __init__(self): def get_sfp(self, index): """ Retrieves sfp represented by (1-based) index - For Quanta IX8 the index in sfputil.py starts from 1, so override + For Quanta the index in sfputil.py starts from 1, so override Args: index: An integer, the index (1-based) of the sfp to retrieve. @@ -179,6 +186,18 @@ def get_system_eeprom_info(self): """ return self._eeprom.system_eeprom_info() + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + ############################################## # Other methods ############################################## @@ -215,10 +234,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/component.py new file mode 100644 index 000000000000..95f275014f5b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/component.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX8 +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("UART_CPLD", 1, "UART"), + 2: Cpld("BOOT_CPLD", 2, "Power sequence"), + 3: Cpld("FAN_CPLD", 3, "Fan"), + 4: Cpld("MB_CPLD_IO_1", 5, "Port IO-1"), + 5: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"), + 6: Cpld("MB_CPLD_IO_3", 8, "Port IO-3"), + 7: Cpld("MB_CPLD_LED_1", 7, "Port LED-1"), + 8: Cpld("MB_CPLD_LED_2", 4, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/psu.py index 60e0f29740db..e03960251043 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/psu.py @@ -212,10 +212,10 @@ def get_current(self): def get_input_voltage(self): """ - Retrieves current PSU voltage output + Retrieves current PSU voltage input Returns: - A float number, the output voltage in volts, + A float number, the input voltage in volts, e.g. 12.1 """ voltage_in = 0.0 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/sfp.py index a1a3d92f8c2d..f7a9a105a5c7 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/sfp.py @@ -10,13 +10,10 @@ import os import time -#import subprocess -#import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase -# from sonic_platform_base.sonic_eeprom import eeprom_dts from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId @@ -175,7 +172,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type # Init eeprom path eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' @@ -284,15 +280,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -355,26 +342,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -533,9 +500,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -590,7 +555,8 @@ def get_transceiver_info(self): ['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \ ['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = 'N/A' + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \ + ['data']['type_abbrv_name']['value'] if self.sfp_type == QSFP_TYPE: for key in qsfp_cable_length_tup: if key in sfp_interface_bulk_data['data']: @@ -860,7 +826,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key]) + transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key]) return transceiver_dom_threshold_dict @@ -908,7 +874,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key]) + transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key]) return transceiver_dom_threshold_info_dict @@ -1453,7 +1419,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -1506,7 +1472,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -1594,7 +1560,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/thermal.py index f2ba18754759..770a2dfd5be5 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta +# Quanta IX8 # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/watchdog.py index 282f356f4e73..0e63d9368cb0 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/sonic_platform/watchdog.py @@ -48,12 +48,16 @@ WDT_SYSFS_PATH = "/sys/class/watchdog/" DEFAULT_TIMEOUT=180 +watchdog=0 class Watchdog(WatchdogBase): def __init__(self): self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name @@ -74,14 +78,16 @@ def _get_wdt(self): """ Retrieves watchdog device """ + global watchdog wdt_main_dev_list = [dev for dev in os.listdir( "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] if not wdt_main_dev_list: - return None + return (None, None) wdt_main_dev_name = wdt_main_dev_list[0] watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) - self.watchdog = os.open(watchdog_device_path, os.O_RDWR) - return self.watchdog, wdt_main_dev_name + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name def _read_file(self, file_path): """ @@ -228,7 +234,8 @@ def __del__(self): Close watchdog """ - os.close(self.watchdog) + if self.watchdog is not None : + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/utils/quanta_ix8_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/utils/quanta_ix8_util.py index 19dc24e370bd..833bfe27c420 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/utils/quanta_ix8_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8-56x/utils/quanta_ix8_util.py @@ -28,7 +28,7 @@ """ import os -import commands +import subprocess import sys, getopt import logging import time @@ -38,18 +38,16 @@ FORCE = 0 i2c_prefix = '/sys/bus/i2c/devices/' - if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] - + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG global args global FORCE - if len(sys.argv)<2: + if len(sys.argv) < 2: show_help() options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', @@ -57,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -73,34 +71,46 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() - return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX8-56X]"+txt + print("[IX8-56X]" + txt) return def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) + logging.info('Run :' + cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output + print('Failed :' + cmd) + return status, output + +pca954x_bus_addr =[ +'0-0071', +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073', +'9-0073', +'10-0073', +'11-0073' +] instantiate =[ #export pca9698 for qsfp present @@ -207,7 +217,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld_sfp28', @@ -243,11 +253,24 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe "+drivers[i], 1) - if status: - print output - if FORCE == 0: - return status + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status + + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) #turn on module power exec_cmd("echo 21 > /sys/class/gpio/export ", 1) @@ -268,23 +291,23 @@ def system_install(): exec_cmd("echo 1 >/sys/class/gpio/gpio73/value", 1) #instantiate devices - for i in range(0,len(instantiate)): + for i in range(0, len(instantiate)): status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + if status: + print(output) + if FORCE == 0: + return status #QSFP for 1~56 port - for port_number in range(1,57): + for port_number in range(1, 57): bus_number = port_number + 16 os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status #Enable front-ports LED decoding exec_cmd('echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode', 1) @@ -299,29 +322,31 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: - return status + return status else: - print " ix8 driver already installed...." + print(" ix8 driver already installed....") return def uninstall(): global FORCE #uninstall drivers - for i in range(len(un_drivers)-1,-1,-1): - status, output = exec_cmd("rmmod "+un_drivers[i], 1) + for i in range(len(un_drivers) - 1, -1, -1): + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status + status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status + return def device_found(): diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_cpld_led.c index 9be8920f51e9..1f594e7bec6f 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_cpld_led.c @@ -49,7 +49,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_platform_ix8a_bwde.c b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_platform_ix8a_bwde.c index e5f6a6529d40..2b82674e74d1 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_platform_ix8a_bwde.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/qci_platform_ix8a_bwde.c @@ -170,9 +170,9 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[0]); // pca9546_1 - g_client[1] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[1]); // pca9548_1 - g_client[2] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus // + g_client[0] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[0]); // pca9546_1 + g_client[1] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[1]); // pca9548_1 + g_client[2] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus // i2c_put_adapter(adapter); } @@ -183,9 +183,9 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[11]); // CPLD_1 - g_client[4] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[17]); // CPLD_4 // - g_client[5] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[18]); // CPLD_6 // + g_client[3] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[11]); // CPLD_1 + g_client[4] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[17]); // CPLD_4 // + g_client[5] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[18]); // CPLD_6 // i2c_put_adapter(adapter); } @@ -196,7 +196,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[6] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[12]); // CPLD_2 + g_client[6] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[12]); // CPLD_2 i2c_put_adapter(adapter); } @@ -207,7 +207,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[7] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[13]); // CPLD_3 + g_client[7] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[13]); // CPLD_3 i2c_put_adapter(adapter); } @@ -218,8 +218,8 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[8] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[2]); // pca9539_1 - g_client[9] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[14]); // pca9698_QSFP + g_client[8] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[2]); // pca9539_1 + g_client[9] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[14]); // pca9698_QSFP i2c_put_adapter(adapter); } @@ -230,7 +230,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[10] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[4]); // pca9548_1 SFP + g_client[10] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[4]); // pca9548_1 SFP i2c_put_adapter(adapter); } @@ -241,7 +241,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[11] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[5]); // pca9548_2 SFP + g_client[11] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[5]); // pca9548_2 SFP i2c_put_adapter(adapter); } @@ -252,7 +252,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[6]); // pca9548_3 SFP + g_client[12] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[6]); // pca9548_3 SFP i2c_put_adapter(adapter); } @@ -263,7 +263,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[7]); // pca9548_4 SFP + g_client[13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[7]); // pca9548_4 SFP i2c_put_adapter(adapter); } @@ -274,7 +274,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[14] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[8]); // pca9548_5 SFP + g_client[14] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[8]); // pca9548_5 SFP i2c_put_adapter(adapter); } @@ -285,7 +285,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[15] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[9]); // pca9548_6 SFP + g_client[15] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[9]); // pca9548_6 SFP i2c_put_adapter(adapter); } @@ -296,7 +296,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[16] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[10]); // pca9548_7 SFP + g_client[16] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[10]); // pca9548_7 SFP i2c_put_adapter(adapter); } @@ -307,7 +307,7 @@ static int __init ix8a_bwde_platform_init(void) } else { - g_client[17] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[3]); // eeprom + g_client[17] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[3]); // eeprom i2c_put_adapter(adapter); } @@ -320,9 +320,9 @@ static int __init ix8a_bwde_platform_init(void) else { if (i < 61) // SFP28 1~48 EEPROM - g_client_port[i - 13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[19]); + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[19]); else // QSFP 49~56 EEPROM - g_client_port[i - 13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[15]); + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[15]); i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/quanta_hwmon_ipmi.c index 65517e5d915a..d927647b51f6 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/modules/quanta_hwmon_ipmi.c @@ -28,7 +28,7 @@ #define __TO_R_EXP(bacc) (int32_t)(tos32(((BSWAP_32(bacc) & 0xf0) >> 4), 4)) #define __TO_B_EXP(bacc) (int32_t)(tos32((BSWAP_32(bacc) & 0xf), 4)) -#define SENSOR_ATTR_MAX 17 +#define SENSOR_ATTR_MAX 19 #define SENSOR_ATTR_NAME_LENGTH 20 #define SENSOR_GET_CAP_LABEL 0x001 @@ -44,7 +44,7 @@ #define SENSOR_GET_CAP_UNR 0x100 #define SENSOR_GET_CAP_MODEL 0x200 -#define SENSOR_GET_CAP_SN 0x400 +#define SENSOR_GET_CAP_SN 0x400 #define SENSOR_GET_CAP_PWM 0x800 #define SENSOR_GET_CAP_CONMODE 0x1000 @@ -52,7 +52,9 @@ #define SENSOR_GET_CAP_FAN_PRESENT 0x4000 #define SENSOR_GET_CAP_PSU_PRESENT 0x8000 -#define SENSOR_GET_CAP_MFRID 0x10000 +#define SENSOR_GET_CAP_MFRID 0x10000 +#define SENSOR_GET_CAP_VIN_TYPE 0x20000 +#define SENSOR_GET_CAP_POUT_MAX 0x40000 #define SDR_SENSOR_TYPE_TEMP 0x01 #define SDR_SENSOR_TYPE_VOLT 0x02 @@ -84,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; @@ -1007,6 +1011,8 @@ void ipmi_sdr_set_sensor_factor(uint8_t idx, g_sensor_data[idx].capability |= SENSOR_GET_CAP_SN; g_sensor_data[idx].capability |= SENSOR_GET_CAP_MFRID; g_sensor_data[idx].capability |= SENSOR_GET_CAP_PSU_PRESENT; + g_sensor_data[idx].capability |= SENSOR_GET_CAP_VIN_TYPE; + g_sensor_data[idx].capability |= SENSOR_GET_CAP_POUT_MAX; } sprintf(g_sensor_data[idx].attrinfo.attr_type_str, "power"); } @@ -1086,7 +1092,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val, result = (m * (int16_t)val) * decimal_point + b; break; default: - return; + return result; } pow_convert(&result, k2); @@ -1218,6 +1224,82 @@ int32_t ipmi_get_psu_info(uint8_t idx, uint8_t cmd, uint8_t *retbuf) return sprintf(retbuf, "N/A\n"); } +int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf) +{ + uint8_t psu_slot = 0; + int32_t rv = 0; + + uint8_t returnData = 0; + uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x01, 0xd8 }; // read line status + + if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1; + else psu_slot = 2; + + msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2; + if (ipmi_check_psu_present(psu_slot)) { + mutex_lock(&ipmi_lock); + rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), &returnData, 1); + mutex_unlock(&ipmi_lock); + + if (rv) { + printk("BMC down at (%d)!!\n", __LINE__); + } + else { + switch (returnData) + { + case 0x7: //LVDC + case 0x3: //HVDC + return sprintf(retbuf, "DC\n"); + default: + return sprintf(retbuf, "AC\n"); + } + } + } + else { + //printk("Error ! cannot detect PSU%d\n", psu_slot); + } + + return sprintf(retbuf, "N/A\n"); +} + +int32_t ipmi_get_pout_max(uint8_t idx, uint8_t *retbuf) +{ + uint8_t psu_slot = 0; + int32_t rv = 0, pout_max = 0; + + uint8_t returnData[2] = { 0 }; + uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x02, 0xa7 }; + + if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1; + else psu_slot = 2; + + msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2; + if (ipmi_check_psu_present(psu_slot)) { + mutex_lock(&ipmi_lock); + rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), returnData, 1); + mutex_unlock(&ipmi_lock); + + if (rv) { + printk("BMC down at (%d)!!\n", __LINE__); + } + else { + /* MFR_POUT_MAX has 2 data format: Direct and Linear Data (see PMbus spec). + Query command is needed to tell the data format, but since we have not use PSU + whose output power is over 0x07ff (2047), just check the first 5 bits*/ + if ((returnData[1] & 0xf8) == 0) // Direct + pout_max = (returnData[1] << 8) | returnData[0]; + else // Linear Data + pout_max = (((returnData[1] & 0x07) << 8) | returnData[0]) << ((returnData[1] & 0xf8) >> 3); + return sprintf(retbuf, "%d\n", pout_max); + } + } + else { + //printk("Error ! cannot detect PSU%d\n", psu_slot); + } + + return sprintf(retbuf, "N/A\n"); +} + void ipmi_fan_control(uint8_t cmd_data1, uint8_t cmd_data2, uint8_t *retbuf) { int32_t rv = 0; @@ -1356,6 +1438,18 @@ static ssize_t show_mfrid(struct device *dev, struct device_attribute *devattr, return ipmi_get_psu_info(attr->index + DEBUGUSE_SHIFT, 0x99, buf); } +static ssize_t show_vin_type(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + return ipmi_get_vin_type(attr->index + DEBUGUSE_SHIFT, buf); +} + +static ssize_t show_pout_max(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + return ipmi_get_pout_max(attr->index + DEBUGUSE_SHIFT, buf); +} + static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, char *buf) { @@ -1432,7 +1526,6 @@ static ssize_t show_fanpresent(struct device *dev, uint8_t msg_data[] = { 0x36, 0xB9, 0x4C, 0x1C, 0x00, 0x02 }; /*netfn = 0x36; cmd = 0xB9; */ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct kernel_ipmi_msg msg; fan_idx = (g_sensor_data[attr->index].sensor_idstring[8] - '0') - 1; @@ -1465,7 +1558,8 @@ static ssize_t(*const attr_show_func_ptr[SENSOR_ATTR_MAX])(struct device *dev, , show_unc, show_ucr, show_unr , show_model, show_sn, show_pwm , show_controlmode, show_direction, show_fanpresent - , show_psupresent, show_mfrid + , show_psupresent, show_mfrid, show_vin_type + , show_pout_max }; static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX])(struct device *dev, @@ -1476,7 +1570,8 @@ static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX])(struct device *dev, , NULL, NULL, NULL , NULL, NULL, store_pwm , store_controlmode, NULL, NULL - , NULL, NULL + , NULL, NULL, NULL + , NULL }; static const char *const sensor_attrnames[SENSOR_ATTR_MAX] = @@ -1486,7 +1581,8 @@ static const char *const sensor_attrnames[SENSOR_ATTR_MAX] = , "%s%d_ncrit", "%s%d_crit", "%s%d_max" , "%s%d_model", "%s%d_sn", "%s%d_pwm" , "%s%d_controlmode", "%s%d_direction", "%s%d_present" - , "%s%d_present", "%s%d_mfrid" + , "%s%d_present", "%s%d_mfrid", "%s%d_vin_type" + , "%s%d_pout_max" }; static int32_t create_sensor_attrs(int32_t attr_no) @@ -1735,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) @@ -1762,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void) return 0; init_sensor_err: - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; ipmi_create_err: hwmon_device_unregister(data->ipmi_hwmon_dev); hwmon_register_err: platform_device_unregister(data->ipmi_platform_dev); device_reg_err: - if (data) - { - kfree(data); - data = NULL; - } + kfree(data); + data = NULL; alloc_err: return err; } @@ -1792,23 +1882,16 @@ static void __exit quanta_hwmon_ipmi_exit(void) platform_device_unregister(data->ipmi_platform_dev); - if (g_sensor_data) - { - kfree(g_sensor_data); - g_sensor_data = NULL; - } - - if (data) - { - kfree(data); - data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; + kfree(data); + data = NULL; } module_init(quanta_hwmon_ipmi_init); module_exit(quanta_hwmon_ipmi_exit); MODULE_AUTHOR("Charcar~~Charcar~Charlie li li"); -MODULE_VERSION("2.0"); +MODULE_VERSION("2.1"); MODULE_DESCRIPTION("Quanta BMC hardware monitor driver"); MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/chassis.py index c765f3734473..44528964c584 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/chassis.py @@ -72,6 +72,13 @@ def __init__(self): for index in range(1, self.__num_of_ports + 1): self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) + ############################################## # Device methods ############################################## @@ -79,7 +86,7 @@ def __init__(self): def get_sfp(self, index): """ Retrieves sfp represented by (1-based) index - For Quanta IX8A the index in sfputil.py starts from 1, so override + For Quanta the index in sfputil.py starts from 1, so override Args: index: An integer, the index (1-based) of the sfp to retrieve. @@ -179,6 +186,18 @@ def get_system_eeprom_info(self): """ return self._eeprom.system_eeprom_info() + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + ############################################## # Other methods ############################################## @@ -215,10 +234,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/component.py new file mode 100644 index 000000000000..f697f9bbe53b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/component.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX8A_BDE +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("BOOT_CPLD", 1, "Power sequence"), + 2: Cpld("FAN_CPLD", 2, "Fan"), + 3: Cpld("MB_CPLD_IO_1", 7, "Port IO-1"), + 4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"), + 5: Cpld("MB_CPLD_IO_3", 4, "Port IO-3"), + 6: Cpld("MB_CPLD_LED_1", 6, "Port LED-1"), + 7: Cpld("MB_CPLD_LED_2", 3, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01") + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00") + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan.py index 8aae9147c444..934891f3702d 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta IX8A-BWDE +# Quanta IX8A_BDE # # Module contains an implementation of SONiC Platform Base API and # provides the FAN information @@ -11,6 +11,7 @@ try: import logging import os + import glob from sonic_platform_base.fan_base import FanBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -19,9 +20,7 @@ ############### # Global ############### -HWMON_DIR = "/sys/class/hwmon/hwmon2/" -FAN_INDEX_START = 18 -NUM_FANTRAYS = 6 +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" FANS_PERTRAY = 2 class Fan(FanBase): @@ -30,30 +29,46 @@ class Fan(FanBase): def __init__(self, index, is_psu_fan=False): self.is_psu_fan = is_psu_fan self.fan_index = index - self.psu_fan_index_mapping = { - 1:120, - 2:132, - } - self.psu_index_mapping = { - 1:114, - 2:126, - } + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + if self.is_psu_fan: - self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index]) - self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index]) - self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index]) - self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index]) + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power') + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan') + self.fan_presence_attr = power_out_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' else: - self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1)) - self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1)) - self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1)) - self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1)) + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 + fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan') + self.fan_presence_attr = fan_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' ####################### # private function ####################### + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval + def __get_attr_value(self, attr_path): retval = 'ERR' @@ -64,7 +79,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -95,8 +110,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.fan_presence_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == '1'): return True @@ -113,8 +127,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR' and attr_rv != '0.0'): return True @@ -135,8 +148,7 @@ def get_direction(self): A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST depending on fan direction """ - attr_path = HWMON_DIR + self.fan_direction_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_direction_attr) if attr_rv == '2': return self.FAN_DIRECTION_INTAKE @@ -152,8 +164,7 @@ def get_speed(self): to 100 (full speed) """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -169,8 +180,7 @@ def get_speed_rpm(self): Returns: An integer, speed of the fan in RPM """ - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -185,8 +195,7 @@ def get_target_speed(self): An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) """ - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/psu.py index bd3f4ce8089e..6188c95c7692 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/psu.py @@ -8,57 +8,61 @@ try: import logging import os + import glob from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" class Psu(PsuBase): def __init__(self, index): PsuBase.__init__(self) fan = Fan(index, True) self._fan_list.append(fan) + self.index = index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + + current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr') + current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr') + power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power') + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power') + voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in') + voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in') + temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp') + + self.psu_current_in_attr = current_in_prefix + 'input' + self.psu_current_out_attr = current_out_prefix + 'input' + self.psu_power_in_attr = power_in_prefix + 'input' + self.psu_power_out_attr = power_out_prefix + 'input' + self.psu_voltage_in_attr = voltage_in_prefix + 'input' + self.psu_voltage_out_attr = voltage_out_prefix + 'input' + self.psu_status_attr = current_out_prefix + 'input' + self.psu_presence_attr = power_out_prefix + 'present' + self.psu_serial_attr = power_out_prefix + 'sn' + self.psu_model_attr = power_out_prefix + 'model' + self.psu_mfr_id_attr = power_out_prefix + 'mfrid' + self.psu_capacity_attr = power_out_prefix + 'pout_max' + self.psu_type_attr = power_out_prefix + 'vin_type' + self.psu_temp_attr = temp1_prefix + 'input' + + def __get_hwmon_attr_prefix(self, dir, label, type): - self.psu_index_mapping = { - 1:114, - 2:126, - } - self.psu_powerin_index_mapping = { - 1:119, - 2:131, - } - self.psu_currentout_index_mapping = { - 1:130, - 2:115, - } - self.psu_currentin_index_mapping = { - 1:130, - 2:115, - } - self.psu_voltageout_index_mapping = { - 1:129, - 2:124, - } - self.psu_voltagein_index_mapping = { - 1:125, - 2:128, - } - self.index = index - self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index]) - self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index]) - self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index]) - self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index]) - self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index]) - self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index]) - self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index]) - self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index]) - self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index]) - self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index]) - self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index]) + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval def __get_attr_value(self, attr_path): @@ -70,10 +74,9 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') - fd.close() return retval ############################################## @@ -97,10 +100,9 @@ def get_presence(self): bool: True if device is present, False if not """ presence = False - attr_path = HWMON_DIR+self.psu_presence_attr attr_normal = '1' - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == attr_normal): presence = True @@ -115,8 +117,7 @@ def get_model(self): string: Model/part number of device """ model = "N/A" - attr_path = HWMON_DIR+self.psu_model_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_model_attr) if (attr_rv != 'ERR'): model = attr_rv @@ -130,8 +131,7 @@ def get_mfr_id(self): string: Manufacturer's id of device """ mfr_id = "N/A" - attr_path = HWMON_DIR+self.psu_mfr_id_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_mfr_id_attr) if (attr_rv != 'ERR'): mfr_id = attr_rv @@ -145,9 +145,7 @@ def get_serial(self): string: Serial number of device """ serial = "N/A" - attr_path = HWMON_DIR+self.psu_serial_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_serial_attr) if (attr_rv != 'ERR'): serial = attr_rv @@ -161,9 +159,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ status = False - attr_path = HWMON_DIR+self.psu_status_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_status_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) if (int(attr_rv) != 0): @@ -184,9 +180,7 @@ def get_voltage(self): e.g. 12.1 """ voltage_out = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_out = float(attr_rv) / 1000 @@ -201,9 +195,7 @@ def get_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_out = 0.0 - attr_path = HWMON_DIR+self.psu_current_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_out = float(attr_rv) / 1000 @@ -212,16 +204,14 @@ def get_current(self): def get_input_voltage(self): """ - Retrieves current PSU voltage output + Retrieves current PSU voltage input Returns: - A float number, the output voltage in volts, + A float number, the input voltage in volts, e.g. 12.1 """ voltage_in = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_in = float(attr_rv) / 1000 @@ -236,9 +226,7 @@ def get_input_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_in = 0.0 - attr_path = HWMON_DIR+self.psu_current_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_in = float(attr_rv) / 1000 @@ -253,9 +241,7 @@ def get_power(self): A float number, the power in watts, e.g. 302.6 """ power_out = 0.0 - attr_path = HWMON_DIR+self.psu_power_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_power_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) power_out = float(attr_rv) / 1000 @@ -292,8 +278,7 @@ def get_type(self): A string, the type of PSU (AC/DC) """ type = "AC" - attr_path = HWMON_DIR+self.psu_type_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_type_attr) if (attr_rv != 'ERR'): type = attr_rv @@ -307,8 +292,7 @@ def get_capacity(self): An integer, the capacity of PSU """ capacity = 0 - attr_path = HWMON_DIR+self.psu_capacity_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_capacity_attr) if (attr_rv != 'ERR'): try: capacity = int(attr_rv) @@ -317,3 +301,19 @@ def get_capacity(self): return capacity + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + + tout = 0.0 + attr_rv = self.__get_attr_value(self.psu_temp_attr) + if (attr_rv != 'ERR'): + tout = float(attr_rv) + + # tout is in milli degree celcius + return float(tout/1000.0) + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/sfp.py index bd7692be168b..abbebb03434a 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/sfp.py @@ -10,13 +10,10 @@ import os import time -#import subprocess -#import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase -# from sonic_platform_base.sonic_eeprom import eeprom_dts from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId @@ -175,7 +172,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type # Init eeprom path eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' @@ -284,15 +280,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -355,26 +342,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -533,9 +500,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -590,7 +555,8 @@ def get_transceiver_info(self): ['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \ ['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = 'N/A' + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \ + ['data']['type_abbrv_name']['value'] if self.sfp_type == QSFP_TYPE: for key in qsfp_cable_length_tup: if key in sfp_interface_bulk_data['data']: @@ -860,7 +826,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key]) + transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key]) return transceiver_dom_threshold_dict @@ -908,7 +874,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key]) + transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key]) return transceiver_dom_threshold_info_dict @@ -1461,7 +1427,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -1514,7 +1480,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -1602,7 +1568,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/thermal.py index 1e07cb0e3efd..32da974f891d 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta +# Quanta IX8A_BDE # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information @@ -10,43 +10,44 @@ import logging import os +import glob try: from sonic_platform_base.thermal_base import ThermalBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" thermal_index_mapping = { - 1:53, - 2:54, - 3:55, - 4:56, - 5:57, - 6:58, - 7:59, - 8:60, - 9:61, - 10:62, - 11:63, - 12:64, - 13:86, - 14:87, - 15:88, - 16:89, - 17:90, - 18:91, - 19:92, - 20:93, - 21:94, - 22:109, - 23:116, - 24:117, - 25:121, - 26:122, - 27:123, - 28:127 + 1:'PSU1_TEMP1', + 2:'PSU1_TEMP2', + 3:'PSU1_TEMP3', + 4:'PSU2_TEMP1', + 5:'PSU2_TEMP2', + 6:'PSU2_TEMP3', + 7:'QMACTemp_0', + 8:'QMACTemp_1', + 9:'QMACTemp_2', + 10:'QMACTemp_3', + 11:'QMACTemp_4', + 12:'QMACTemp_5', + 13:'QMACTemp_6', + 14:'QMACTemp_7', + 15:'QMACTemp_8', + 16:'QMACTemp_9', + 17:'Temp_1V05_PCH_VR', + 18:'Temp_Ambient_1', + 19:'Temp_Ambient_2', + 20:'Temp_Ambient_3', + 21:'Temp_Ambient_4', + 22:'Temp_Ambient_5', + 23:'Temp_Ambient_6', + 24:'Temp_CPU', + 25:'Temp_DDRAB_VR', + 26:'Temp_SOC_DIMMA0', + 27:'Temp_VCCGBE_VR', + 28:'Temp_VCCIN_VR' } @@ -55,12 +56,32 @@ class Thermal(ThermalBase): """Platform-specific Thermal class""" def __init__(self, thermal_index): - self.index = thermal_index - self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index]) - self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index]) - self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index]) - self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index]) + self.index = thermal_index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp') + self.temp_attr = "{}input".format(thermal_prefix) + self.high_th_attr = "{}ncrit".format(thermal_prefix) + self.high_crit_th_attr = "{}crit".format(thermal_prefix) + self.low_th_attr = "{}lncrit".format(thermal_prefix) + self.low_crit_th_attr = "{}lcrit".format(thermal_prefix) + self.name_attr = "{}label".format(thermal_prefix) + + def __get_hwmon_attr_prefix(self, dir, label, type): + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval def __get_attr_value(self, attr_path): @@ -72,7 +93,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -84,8 +105,7 @@ def get_name(self): Returns: string: The name of the device """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return attr_rv @@ -99,8 +119,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return True @@ -127,8 +146,37 @@ def get_temperature(self): A float number of current temperature in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.temp_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.temp_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_th_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -143,8 +191,7 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -159,8 +206,7 @@ def get_high_critical_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_crit_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/watchdog.py index 282f356f4e73..0e63d9368cb0 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/sonic_platform/watchdog.py @@ -48,12 +48,16 @@ WDT_SYSFS_PATH = "/sys/class/watchdog/" DEFAULT_TIMEOUT=180 +watchdog=0 class Watchdog(WatchdogBase): def __init__(self): self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name @@ -74,14 +78,16 @@ def _get_wdt(self): """ Retrieves watchdog device """ + global watchdog wdt_main_dev_list = [dev for dev in os.listdir( "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] if not wdt_main_dev_list: - return None + return (None, None) wdt_main_dev_name = wdt_main_dev_list[0] watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) - self.watchdog = os.open(watchdog_device_path, os.O_RDWR) - return self.watchdog, wdt_main_dev_name + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name def _read_file(self, file_path): """ @@ -228,7 +234,8 @@ def __del__(self): Close watchdog """ - os.close(self.watchdog) + if self.watchdog is not None : + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/utils/quanta_ix8a_bwde_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/utils/quanta_ix8a_bwde_util.py index ed8c5fef6bd9..c23824779373 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/utils/quanta_ix8a_bwde_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8a-bwde-56x/utils/quanta_ix8a_bwde_util.py @@ -28,7 +28,7 @@ """ import os -import commands +import subprocess import sys, getopt import logging import time @@ -39,8 +39,8 @@ i2c_prefix = '/sys/bus/i2c/devices/' if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG @@ -55,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -71,26 +71,26 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX8A-BWDE-56X]" + txt + print("[IX8A-BWDE-56X]" + txt) return def exec_cmd(cmd, show): logging.info('Run :' + cmd) - status, output = commands.getstatusoutput(cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) show_log (" output:" + output) if status: @@ -99,6 +99,18 @@ def exec_cmd(cmd, show): print('Failed :' + cmd) return status, output +pca954x_bus_addr =[ +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073', +'9-0073', +'10-0073', +'11-0073' +] + instantiate =[ #export pca9698 for qsfp present 'echo 34 > /sys/class/gpio/export', @@ -204,7 +216,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld_sfp28', @@ -235,11 +247,20 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe " + drivers[i], 1) - if status: - print output - if FORCE == 0: - return status + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status #reload ethernet drivers in correct order exec_cmd("rmmod ixgbe ", 1) @@ -247,6 +268,10 @@ def system_install(): exec_cmd("modprobe igb ", 1) exec_cmd("modprobe ixgbe ", 1) + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) + #turn on module power exec_cmd("echo 21 > /sys/class/gpio/export ", 1) exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1) @@ -268,10 +293,10 @@ def system_install(): #instantiate devices for i in range(0, len(instantiate)): status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + if status: + print(output) + if FORCE == 0: + return status #QSFP for 1~56 port for port_number in range(1, 57): @@ -291,35 +316,35 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: return status status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8a_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status else: - print " ix8a-bwde driver already installed...." + print(" ix8a-bwde driver already installed....") return def uninstall(): global FORCE #uninstall drivers for i in range(len(un_drivers) - 1, -1, -1): - status, output = exec_cmd("rmmod " + un_drivers[i], 1) + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output + print(output) if FORCE == 0: return status status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status return diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_cpld_led.c index 2b0fe902c4a8..23f91455f699 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_cpld_led.c @@ -49,7 +49,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_platform_ix8c.c b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_platform_ix8c.c index d0ae085cd417..0dfd926a47aa 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_platform_ix8c.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/qci_platform_ix8c.c @@ -171,9 +171,9 @@ static int __init ix8c_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix8c_i2c_devices[0]); // pca9546 - g_client[1] = i2c_new_device(adapter, &ix8c_i2c_devices[1]); // pca9548 - g_client[2] = i2c_new_device(adapter, &ix8c_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus + g_client[0] = i2c_new_client_device(adapter, &ix8c_i2c_devices[0]); // pca9546 + g_client[1] = i2c_new_client_device(adapter, &ix8c_i2c_devices[1]); // pca9548 + g_client[2] = i2c_new_client_device(adapter, &ix8c_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus i2c_put_adapter(adapter); } @@ -184,9 +184,9 @@ static int __init ix8c_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix8c_i2c_devices[10]); // CPLD_1 - g_client[4] = i2c_new_device(adapter, &ix8c_i2c_devices[17]); // CPLD_4 - g_client[5] = i2c_new_device(adapter, &ix8c_i2c_devices[18]); // CPLD_6 + g_client[3] = i2c_new_client_device(adapter, &ix8c_i2c_devices[10]); // CPLD_1 + g_client[4] = i2c_new_client_device(adapter, &ix8c_i2c_devices[17]); // CPLD_4 + g_client[5] = i2c_new_client_device(adapter, &ix8c_i2c_devices[18]); // CPLD_6 i2c_put_adapter(adapter); } @@ -197,7 +197,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[6] = i2c_new_device(adapter, &ix8c_i2c_devices[11]); // CPLD_2 + g_client[6] = i2c_new_client_device(adapter, &ix8c_i2c_devices[11]); // CPLD_2 i2c_put_adapter(adapter); } @@ -208,8 +208,8 @@ static int __init ix8c_platform_init(void) } else { - g_client[7] = i2c_new_device(adapter, &ix8c_i2c_devices[12]); // CPLD_3 - g_client[8] = i2c_new_device(adapter, &ix8c_i2c_devices[2]); // MB_BOARDINFO_EEPROM + g_client[7] = i2c_new_client_device(adapter, &ix8c_i2c_devices[12]); // CPLD_3 + g_client[8] = i2c_new_client_device(adapter, &ix8c_i2c_devices[2]); // MB_BOARDINFO_EEPROM i2c_put_adapter(adapter); } @@ -220,8 +220,8 @@ static int __init ix8c_platform_init(void) } else { - g_client[9] = i2c_new_device(adapter, &ix8c_i2c_devices[13]); // MB Board Data - g_client[10] = i2c_new_device(adapter, &ix8c_i2c_devices[14]); // QSFP:49~52 + g_client[9] = i2c_new_client_device(adapter, &ix8c_i2c_devices[13]); // MB Board Data + g_client[10] = i2c_new_client_device(adapter, &ix8c_i2c_devices[14]); // QSFP:49~52 i2c_put_adapter(adapter); } @@ -232,7 +232,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[11] = i2c_new_device(adapter, &ix8c_i2c_devices[3]); // pca9548_1 SFP + g_client[11] = i2c_new_client_device(adapter, &ix8c_i2c_devices[3]); // pca9548_1 SFP i2c_put_adapter(adapter); } @@ -243,7 +243,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix8c_i2c_devices[4]); // pca9548_2 SFP + g_client[12] = i2c_new_client_device(adapter, &ix8c_i2c_devices[4]); // pca9548_2 SFP i2c_put_adapter(adapter); } @@ -254,7 +254,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[13] = i2c_new_device(adapter, &ix8c_i2c_devices[5]); // pca9548_3 SFP + g_client[13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[5]); // pca9548_3 SFP i2c_put_adapter(adapter); } @@ -265,7 +265,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[14] = i2c_new_device(adapter, &ix8c_i2c_devices[6]); // pca9548_4 SFP + g_client[14] = i2c_new_client_device(adapter, &ix8c_i2c_devices[6]); // pca9548_4 SFP i2c_put_adapter(adapter); } @@ -276,7 +276,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[15] = i2c_new_device(adapter, &ix8c_i2c_devices[7]); // pca9548_5 SFP + g_client[15] = i2c_new_client_device(adapter, &ix8c_i2c_devices[7]); // pca9548_5 SFP i2c_put_adapter(adapter); } @@ -287,7 +287,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[16] = i2c_new_device(adapter, &ix8c_i2c_devices[8]); // pca9548_6 SFP + g_client[16] = i2c_new_client_device(adapter, &ix8c_i2c_devices[8]); // pca9548_6 SFP i2c_put_adapter(adapter); } @@ -298,7 +298,7 @@ static int __init ix8c_platform_init(void) } else { - g_client[17] = i2c_new_device(adapter, &ix8c_i2c_devices[9]); // pca9548_7 QSFP + g_client[17] = i2c_new_client_device(adapter, &ix8c_i2c_devices[9]); // pca9548_7 QSFP i2c_put_adapter(adapter); } @@ -311,9 +311,9 @@ static int __init ix8c_platform_init(void) else { if (i < 61) // SFP28 1~48 EEPROM - g_client_port[i - 13] = i2c_new_device(adapter, &ix8c_i2c_devices[19]); + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[19]); else // QSFP 49~56 EEPROM - g_client_port[i - 13] = i2c_new_device(adapter, &ix8c_i2c_devices[15]); + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[15]); i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/quanta_hwmon_ipmi.c index 157ae94778d5..1da44bda029f 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/modules/quanta_hwmon_ipmi.c @@ -28,7 +28,7 @@ #define __TO_R_EXP(bacc) (int32_t)(tos32(((BSWAP_32(bacc) & 0xf0) >> 4), 4)) #define __TO_B_EXP(bacc) (int32_t)(tos32((BSWAP_32(bacc) & 0xf), 4)) -#define SENSOR_ATTR_MAX 17 +#define SENSOR_ATTR_MAX 19 #define SENSOR_ATTR_NAME_LENGTH 20 #define SENSOR_GET_CAP_LABEL 0x001 @@ -53,6 +53,8 @@ #define SENSOR_GET_CAP_PSU_PRESENT 0x8000 #define SENSOR_GET_CAP_MFRID 0x10000 +#define SENSOR_GET_CAP_VIN_TYPE 0x20000 +#define SENSOR_GET_CAP_POUT_MAX 0x40000 #define SDR_SENSOR_TYPE_TEMP 0x01 #define SDR_SENSOR_TYPE_VOLT 0x02 @@ -84,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; struct device *ipmi_hwmon_dev; @@ -912,6 +916,8 @@ void ipmi_sdr_set_sensor_factor(uint8_t idx, struct sdr_record_full_sensor *sens g_sensor_data[idx].capability |= SENSOR_GET_CAP_SN; g_sensor_data[idx].capability |= SENSOR_GET_CAP_MFRID; g_sensor_data[idx].capability |= SENSOR_GET_CAP_PSU_PRESENT; + g_sensor_data[idx].capability |= SENSOR_GET_CAP_VIN_TYPE; + g_sensor_data[idx].capability |= SENSOR_GET_CAP_POUT_MAX; } sprintf(g_sensor_data[idx].attrinfo.attr_type_str, "power"); } @@ -976,7 +982,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val, int32_t *point_resu result = (m * (int16_t)val) * decimal_point + b; break; default: - return; + return result; } pow_convert(&result, k2); @@ -1074,6 +1080,83 @@ int32_t ipmi_get_psu_info(uint8_t idx, uint8_t cmd, uint8_t *retbuf) return sprintf(retbuf, "N/A\n"); } +int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf) +{ + uint8_t psu_slot = 0; + int32_t rv = 0; + + uint8_t returnData = 0; + uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x01, 0xd8 }; // read line status + + if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1; + else psu_slot = 2; + + msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2; + if (ipmi_check_psu_present(psu_slot)) { + mutex_lock(&ipmi_lock); + rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), &returnData, 1); + mutex_unlock(&ipmi_lock); + + if (rv) { + printk("BMC down at (%d)!!\n", __LINE__); + } + else { + switch (returnData) + { + case 0x7: //LVDC + case 0x3: //HVDC + return sprintf(retbuf, "DC\n"); + default: + return sprintf(retbuf, "AC\n"); + } + } + } + else { + //printk("Error ! cannot detect PSU%d\n", psu_slot); + } + + return sprintf(retbuf, "N/A\n"); +} + +int32_t ipmi_get_pout_max(uint8_t idx, uint8_t *retbuf) +{ + uint8_t psu_slot = 0; + int32_t rv = 0, pout_max = 0; + + uint8_t returnData[2] = { 0 }, tempData[2] = { 0 }; + uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x02, 0xa7 }; + + if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1; + else psu_slot = 2; + + msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2; + if (ipmi_check_psu_present(psu_slot)) { + mutex_lock(&ipmi_lock); + rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), returnData, 1); + mutex_unlock(&ipmi_lock); + + if (rv) { + printk("BMC down at (%d)!!\n", __LINE__); + } + else { + /* MFR_POUT_MAX has 2 data format: Direct and Linear Data (see PMbus spec). + Query command is needed to tell the data format, but since we have not use PSU + whose output power is over 0x07ff (2047), just check the first 5 bits*/ + if (returnData[1] & 0xf8 == 0) // Direct + pout_max = (returnData[1] << 8) | returnData[0]; + else // Linear Data + pout_max = (((returnData[1] & 0x07) << 8) | returnData[0]) << ((returnData[1] & 0xf8) >> 3); + return sprintf(retbuf, "%d\n", pout_max); + } + } + else { + //printk("Error ! cannot detect PSU%d\n", psu_slot); + } + + return sprintf(retbuf, "N/A\n"); +} + + void ipmi_fan_control(uint8_t cmd_data1, uint8_t cmd_data2, uint8_t *retbuf) { int32_t rv = 0; @@ -1183,6 +1266,18 @@ static ssize_t show_mfrid(struct device *dev, struct device_attribute *devattr, return ipmi_get_psu_info(attr->index + DEBUGUSE_SHIFT, 0x99, buf); } +static ssize_t show_vin_type(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + return ipmi_get_vin_type(attr->index + DEBUGUSE_SHIFT, buf); +} + +static ssize_t show_pout_max(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + return ipmi_get_pout_max(attr->index + DEBUGUSE_SHIFT, buf); +} + static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, char *buf) { uint8_t returnData[10] = { 0 }; @@ -1277,7 +1372,8 @@ static ssize_t(*const attr_show_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev, , show_unc, show_ucr, show_unr , show_model, show_sn, show_pwm , show_controlmode, show_direction, show_fanpresent - , show_psupresent, show_mfrid + , show_psupresent, show_mfrid, show_vin_type + , show_pout_max }; static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) = @@ -1287,7 +1383,8 @@ static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev, , NULL, NULL, NULL , NULL, NULL, store_pwm , store_controlmode, NULL, NULL - , NULL, NULL + , NULL, NULL, NULL + , NULL }; static const char *const sensor_attrnames[SENSOR_ATTR_MAX] = @@ -1297,7 +1394,8 @@ static const char *const sensor_attrnames[SENSOR_ATTR_MAX] = , "%s%d_ncrit", "%s%d_crit", "%s%d_max" , "%s%d_model", "%s%d_sn", "%s%d_pwm" , "%s%d_controlmode", "%s%d_direction", "%s%d_present" - , "%s%d_present", "%s%d_mfrid" + , "%s%d_present", "%s%d_mfrid", "%s%d_vin_type" + , "%s%d_pout_max" }; static int32_t create_sensor_attrs(int32_t attr_no) @@ -1516,7 +1614,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, NULL); + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) { printk("hwmon register fail\n"); @@ -1539,19 +1637,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void) return 0; init_sensor_err: - if (g_sensor_data) { - kfree(g_sensor_data); - g_sensor_data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; ipmi_create_err: hwmon_device_unregister(data->ipmi_hwmon_dev); hwmon_register_err: platform_device_unregister(data->ipmi_platform_dev); device_reg_err: - if (data) { - kfree(data); - data = NULL; - } + kfree(data); + data = NULL; alloc_err: return err; } @@ -1567,15 +1661,10 @@ static void __exit quanta_hwmon_ipmi_exit(void) platform_device_unregister(data->ipmi_platform_dev); - if (g_sensor_data) { - kfree(g_sensor_data); - g_sensor_data = NULL; - } - - if (data) { - kfree(data); - data = NULL; - } + kfree(g_sensor_data); + g_sensor_data = NULL; + kfree(data); + data = NULL; } module_init(quanta_hwmon_ipmi_init); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/chassis.py index 544a3ee27c64..7cb5c4c1e6ae 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/chassis.py @@ -8,6 +8,7 @@ try: import sys import time + import syslog from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.eeprom import Eeprom from sonic_platform.psu import Psu @@ -71,6 +72,13 @@ def __init__(self): for index in range(1, self.__num_of_ports + 1): self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) + ############################################## # Device methods ############################################## @@ -78,7 +86,7 @@ def __init__(self): def get_sfp(self, index): """ Retrieves sfp represented by (1-based) index - For Quanta IX8C the index in sfputil.py starts from 1, so override + For Quanta the index in sfputil.py starts from 1, so override Args: index: An integer, the index (1-based) of the sfp to retrieve. @@ -188,13 +196,34 @@ def get_reboot_cause(self): is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used to pass a description of the reboot cause. """ - #raise NotImplementedError return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + ############################################## + # Other methods + ############################################## + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + try: + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + # Create the watchdog Instance + self._watchdog = Watchdog() + + except Exception as e: + syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e)) + return self._watchdog + def get_change_event(self, timeout=0): """ Currently only support transceiver change events """ + start_ms = time.time() * 1000 xcvr_change_event_dict = {} event = False @@ -205,10 +234,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/component.py new file mode 100644 index 000000000000..75066275d2c3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/component.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX8C +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("BOOT_CPLD", 1, "Power sequence"), + 2: Cpld("FAN_CPLD", 2, "Fan"), + 3: Cpld("MB_CPLD_IO_1", 7, "Port IO-1"), + 4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"), + 5: Cpld("MB_CPLD_IO_3", 4, "Port IO-3"), + 6: Cpld("MB_CPLD_LED_1", 6, "Port LED-1"), + 7: Cpld("MB_CPLD_LED_2", 3, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01") + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00") + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan.py index ed3a836ba150..94a9b74df8dd 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Inventec d7264 +# Quanta IX8C # # Module contains an implementation of SONiC Platform Base API and # provides the FAN information @@ -11,6 +11,7 @@ try: import logging import os + import glob from sonic_platform_base.fan_base import FanBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -19,9 +20,7 @@ ############### # Global ############### -HWMON_DIR = "/sys/class/hwmon/hwmon2/" -FAN_INDEX_START = 20 -NUM_FANTRAYS = 6 +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" FANS_PERTRAY = 2 class Fan(FanBase): @@ -30,30 +29,46 @@ class Fan(FanBase): def __init__(self, index, is_psu_fan=False): self.is_psu_fan = is_psu_fan self.fan_index = index - self.psu_fan_index_mapping = { - 1:39, - 2:49, - } - self.psu_index_mapping = { - 1:41, - 2:51, - } + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + if self.is_psu_fan: - self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index]) - self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index]) - self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index]) - self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index]) + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power') + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan') + self.fan_presence_attr = power_out_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' else: - self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1)) - self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1)) - self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1)) - self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1)) + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 + fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan') + self.fan_presence_attr = fan_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' ####################### # private function ####################### + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval + def __get_attr_value(self, attr_path): retval = 'ERR' @@ -64,7 +79,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -84,7 +99,7 @@ def get_name(self): if self.is_psu_fan: return "PSU-{}_FAN".format(self.fan_index) else: - fantray_index = (self.fan_index-1)/FANS_PERTRAY+1 + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) return "Fantray{}_{}".format(fantray_index, fan_index_intray) @@ -95,8 +110,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.fan_presence_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == '1'): return True @@ -113,8 +127,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR' and attr_rv != '0.0'): return True @@ -135,8 +148,7 @@ def get_direction(self): A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST depending on fan direction """ - attr_path = HWMON_DIR + self.fan_direction_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_direction_attr) if attr_rv == '2': return self.FAN_DIRECTION_INTAKE @@ -152,8 +164,7 @@ def get_speed(self): to 100 (full speed) """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -169,8 +180,7 @@ def get_speed_rpm(self): Returns: An integer, speed of the fan in RPM """ - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -185,8 +195,7 @@ def get_target_speed(self): An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) """ - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/psu.py index 941d8faef4f5..6188c95c7692 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/psu.py @@ -8,44 +8,61 @@ try: import logging import os + import glob from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" class Psu(PsuBase): def __init__(self, index): PsuBase.__init__(self) fan = Fan(index, True) self._fan_list.append(fan) + self.index = index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + + current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr') + current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr') + power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power') + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power') + voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in') + voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in') + temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp') + + self.psu_current_in_attr = current_in_prefix + 'input' + self.psu_current_out_attr = current_out_prefix + 'input' + self.psu_power_in_attr = power_in_prefix + 'input' + self.psu_power_out_attr = power_out_prefix + 'input' + self.psu_voltage_in_attr = voltage_in_prefix + 'input' + self.psu_voltage_out_attr = voltage_out_prefix + 'input' + self.psu_status_attr = current_out_prefix + 'input' + self.psu_presence_attr = power_out_prefix + 'present' + self.psu_serial_attr = power_out_prefix + 'sn' + self.psu_model_attr = power_out_prefix + 'model' + self.psu_mfr_id_attr = power_out_prefix + 'mfrid' + self.psu_capacity_attr = power_out_prefix + 'pout_max' + self.psu_type_attr = power_out_prefix + 'vin_type' + self.psu_temp_attr = temp1_prefix + 'input' + + def __get_hwmon_attr_prefix(self, dir, label, type): - self.psu_index_mapping = { - 1:41, - 2:51, - } - self.psu_powerin_index_mapping = { - 1:40, - 2:50, - } - self.psu_current_index_mapping = { - 1:38, - 2:48, - } - self.psu_voltageout_index_mapping = { - 1:46, - 2:56, - } - self.index = index - self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index]) - self.psu_status_attr = "curr{}_input".format(self.psu_current_index_mapping[self.index]) - self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index]) - self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index]) - self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index]) - self.psu_current_out_attr = "curr{}_input".format(self.psu_current_index_mapping[self.index]) - self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index]) - self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index]) + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval def __get_attr_value(self, attr_path): @@ -57,10 +74,9 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') - fd.close() return retval ############################################## @@ -84,10 +100,9 @@ def get_presence(self): bool: True if device is present, False if not """ presence = False - attr_path = HWMON_DIR+self.psu_presence_attr attr_normal = '1' - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == attr_normal): presence = True @@ -102,13 +117,26 @@ def get_model(self): string: Model/part number of device """ model = "N/A" - attr_path = HWMON_DIR+self.psu_model_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_model_attr) if (attr_rv != 'ERR'): model = attr_rv return model + def get_mfr_id(self): + """ + Retrieves the manufacturer's name (or id) of the device + + Returns: + string: Manufacturer's id of device + """ + mfr_id = "N/A" + attr_rv = self.__get_attr_value(self.psu_mfr_id_attr) + if (attr_rv != 'ERR'): + mfr_id = attr_rv + + return mfr_id + def get_serial(self): """ Retrieves the serial number of the device @@ -117,9 +145,7 @@ def get_serial(self): string: Serial number of device """ serial = "N/A" - attr_path = HWMON_DIR+self.psu_serial_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_serial_attr) if (attr_rv != 'ERR'): serial = attr_rv @@ -133,9 +159,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ status = False - attr_path = HWMON_DIR+self.psu_status_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_status_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) if (int(attr_rv) != 0): @@ -156,9 +180,7 @@ def get_voltage(self): e.g. 12.1 """ voltage_out = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_out = float(attr_rv) / 1000 @@ -173,15 +195,44 @@ def get_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_out = 0.0 - attr_path = HWMON_DIR+self.psu_current_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_out = float(attr_rv) / 1000 return current_out + def get_input_voltage(self): + """ + Retrieves current PSU voltage input + + Returns: + A float number, the input voltage in volts, + e.g. 12.1 + """ + voltage_in = 0.0 + attr_rv = self.__get_attr_value(self.psu_voltage_in_attr) + if (attr_rv != 'ERR'): + attr_rv, dummy = attr_rv.split('.', 1) + voltage_in = float(attr_rv) / 1000 + + return voltage_in + + def get_input_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + current_in = 0.0 + attr_rv = self.__get_attr_value(self.psu_current_in_attr) + if (attr_rv != 'ERR'): + attr_rv, dummy = attr_rv.split('.', 1) + current_in = float(attr_rv) / 1000 + + return current_in + def get_power(self): """ Retrieves current energy supplied by PSU @@ -190,9 +241,7 @@ def get_power(self): A float number, the power in watts, e.g. 302.6 """ power_out = 0.0 - attr_path = HWMON_DIR+self.psu_power_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_power_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) power_out = float(attr_rv) / 1000 @@ -221,3 +270,50 @@ def get_status_led(self): else: return self.STATUS_LED_COLOR_OFF + def get_type(self): + """ + Gets the type of the PSU + + Returns: + A string, the type of PSU (AC/DC) + """ + type = "AC" + attr_rv = self.__get_attr_value(self.psu_type_attr) + if (attr_rv != 'ERR'): + type = attr_rv + + return type + + def get_capacity(self): + """ + Gets the capacity (maximum output power) of the PSU in watts + + Returns: + An integer, the capacity of PSU + """ + capacity = 0 + attr_rv = self.__get_attr_value(self.psu_capacity_attr) + if (attr_rv != 'ERR'): + try: + capacity = int(attr_rv) + except ValueError: + capacity = 0 + + return capacity + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + + tout = 0.0 + attr_rv = self.__get_attr_value(self.psu_temp_attr) + if (attr_rv != 'ERR'): + tout = float(attr_rv) + + # tout is in milli degree celcius + return float(tout/1000.0) + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/sfp.py index e7d0146b5504..305d78aba4cc 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/sfp.py @@ -10,13 +10,10 @@ import os import time -#import subprocess -#import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase -# from sonic_platform_base.sonic_eeprom import eeprom_dts from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId @@ -175,7 +172,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type # Init eeprom path eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' @@ -284,15 +280,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -355,26 +342,6 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -533,9 +500,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -590,7 +555,8 @@ def get_transceiver_info(self): ['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \ ['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = 'N/A' + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \ + ['data']['type_abbrv_name']['value'] if self.sfp_type == QSFP_TYPE: for key in qsfp_cable_length_tup: if key in sfp_interface_bulk_data['data']: @@ -860,7 +826,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key]) + transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key]) return transceiver_dom_threshold_dict @@ -908,7 +874,7 @@ def get_transceiver_threshold_info(self): transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] for key in transceiver_dom_threshold_info_dict: - transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key]) + transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key]) return transceiver_dom_threshold_info_dict @@ -1453,7 +1419,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -1506,7 +1472,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -1594,7 +1560,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/thermal.py index f30bdc8d71da..11be0f93acc2 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Inventec d7264 +# Quanta IX8C # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information @@ -10,44 +10,68 @@ import logging import os +import glob try: from sonic_platform_base.thermal_base import ThermalBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" thermal_index_mapping = { - 1:1, - 2:2, - 3:42, - 4:43, - 5:44, - 6:52, - 7:53, - 8:54, - 9:75, - 10:76, - 11:77, - 12:78, - 13:79, - 14:80, - 15:81, - 16:82, - 17:83, - 18:84, + 1:'PSU1_TEMP1', + 2:'PSU1_TEMP2', + 3:'PSU1_TEMP3', + 4:'PSU2_TEMP1', + 5:'PSU2_TEMP2', + 6:'PSU2_TEMP3', + 7:'Temp_1V05_PCH_VR', + 8:'Temp_Ambient_1', + 9:'Temp_Ambient_2', + 10:'Temp_Ambient_3', + 11:'Temp_Ambient_4', + 12:'Temp_Ambient_6', + 13:'Temp_DDRAB_VR', + 14:'Temp_SOC_DIMMA0', + 15:'Temp_VCCGBE_VR', + 16:'Temp_VCCIN_VR', + 17:'Temp_cpu', + 18:'Temp_switch' } + + class Thermal(ThermalBase): """Platform-specific Thermal class""" def __init__(self, thermal_index): - self.index = thermal_index - self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index]) - self.high_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index]) - self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index]) + self.index = thermal_index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp') + self.temp_attr = "{}input".format(thermal_prefix) + self.high_th_attr = "{}ncrit".format(thermal_prefix) + self.high_crit_th_attr = "{}crit".format(thermal_prefix) + self.low_th_attr = "{}lncrit".format(thermal_prefix) + self.low_crit_th_attr = "{}lcrit".format(thermal_prefix) + self.name_attr = "{}label".format(thermal_prefix) + + def __get_hwmon_attr_prefix(self, dir, label, type): + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval def __get_attr_value(self, attr_path): @@ -59,7 +83,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open ", attr_path, " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -71,8 +95,7 @@ def get_name(self): Returns: string: The name of the device """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return attr_rv @@ -86,8 +109,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return True @@ -114,8 +136,37 @@ def get_temperature(self): A float number of current temperature in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.temp_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.temp_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_th_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -130,8 +181,22 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_th_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_high_critical_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.high_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/watchdog.py new file mode 100644 index 000000000000..0e63d9368cb0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/sonic_platform/watchdog.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python + +############################################################################# +# +# Watchdog contains an implementation of SONiC Platform Base Watchdog API +# +############################################################################# +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +""" ioctl constants """ +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +""" Watchdog ioctl commands """ +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +""" Watchdog status constants """ +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WD_MAIN_IDENTITY = "iTCO_wdt" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + +DEFAULT_TIMEOUT=180 +watchdog=0 + +class Watchdog(WatchdogBase): + + def __init__(self): + + self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name + self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name + self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name + # Set default value + self._disable() + self.armed = False + self.timeout = DEFAULT_TIMEOUT + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WD_MAIN_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + global watchdog + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + return (None, None) + wdt_main_dev_name = wdt_main_dev_list[0] + watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self, timeout_path): + """ + Get watchdog timeout + @return watchdog timeout + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + ################################################################# + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + if self.armed: + self._keepalive() + else: + self._settimeout(seconds) + self._enable() + self.armed = True + ret = self.timeout + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + + timeleft = WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + + if self.watchdog is not None : + os.close(self.watchdog) + + + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/utils/quanta_ix8c_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/utils/quanta_ix8c_util.py index f8e8b0f0f96b..a7e50d908fe4 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/utils/quanta_ix8c_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix8c-56x/utils/quanta_ix8c_util.py @@ -28,7 +28,7 @@ """ import os -import commands +import subprocess import sys, getopt import logging import time @@ -39,8 +39,8 @@ i2c_prefix = '/sys/bus/i2c/devices/' if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG @@ -55,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -71,34 +71,45 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() - return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX8C-56X]"+txt + print("[IX8C-56X]" + txt) return def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) + logging.info('Run :' + cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output + print('Failed :' + cmd) + return status, output + +pca954x_bus_addr =[ +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073', +'9-0073', +'10-0073', +'11-0073' +] instantiate =[ #export pca9698 for qsfp present @@ -201,7 +212,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld_sfp28', @@ -232,11 +243,20 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe " + drivers[i], 1) - if status: - print output - if FORCE == 0: - return status + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status #reload ethernet drivers in correct order exec_cmd("rmmod ixgbe ", 1) @@ -244,6 +264,10 @@ def system_install(): exec_cmd("modprobe igb ", 1) exec_cmd("modprobe ixgbe ", 1) + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) + #turn on module power exec_cmd("echo 21 > /sys/class/gpio/export ", 1) exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1) @@ -263,15 +287,15 @@ def system_install(): exec_cmd("echo 1 >/sys/class/gpio/gpio73/value", 1) #instantiate devices - for i in range(0,len(instantiate)): - status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + for i in range(0, len(instantiate)): + status, output = exec_cmd(instantiate[i], 1) + if status: + print(output) + if FORCE == 0: + return status #QSFP for 1~56 port - for port_number in range(1,57): + for port_number in range(1, 57): bus_number = port_number + 12 os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) @@ -285,35 +309,35 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: - return status + return status status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8c_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status else: - print " ix8c driver already installed...." + print(" ix8c driver already installed....") return def uninstall(): global FORCE #uninstall drivers for i in range(len(un_drivers) - 1, -1, -1): - status, output = exec_cmd("rmmod " + un_drivers[i], 1) + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status return diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c index fdbc6c6c1634..0f0ad02be895 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c @@ -51,7 +51,7 @@ static struct class *cpld_class = NULL; struct cpld_data { struct i2c_client *cpld_client; - char name[8]; + char name[16]; u8 cpld_id; }; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c index 803b2b42f495..c243bd5d5794 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c @@ -141,9 +141,9 @@ static int __init ix9_platform_init(void) } else { - g_client[0] = i2c_new_device(adapter, &ix9_i2c_devices[0]); // pca9546_1 - Address: 0x72 - g_client[1] = i2c_new_device(adapter, &ix9_i2c_devices[1]); // pca9548_1 - Address: 0x77 - g_client[2] = i2c_new_device(adapter, &ix9_i2c_devices[11]); // CPU Linking Board at CPU's I2C Bus - Address: 0x22 + g_client[0] = i2c_new_client_device(adapter, &ix9_i2c_devices[0]); // pca9546_1 - Address: 0x72 + g_client[1] = i2c_new_client_device(adapter, &ix9_i2c_devices[1]); // pca9548_1 - Address: 0x77 + g_client[2] = i2c_new_client_device(adapter, &ix9_i2c_devices[11]); // CPU Linking Board at CPU's I2C Bus - Address: 0x22 i2c_put_adapter(adapter); } @@ -154,8 +154,8 @@ static int __init ix9_platform_init(void) } else { - g_client[3] = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #2 - Address: 0x38 - g_client[4] = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #4 - Address: 0x39 + g_client[3] = i2c_new_client_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #2 - Address: 0x38 + g_client[4] = i2c_new_client_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #4 - Address: 0x39 i2c_put_adapter(adapter); } @@ -166,8 +166,8 @@ static int __init ix9_platform_init(void) } else { - g_client[5] = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #3 - Address: 0x38 - g_client[6] = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #5 - Address: 0x39 + g_client[5] = i2c_new_client_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #3 - Address: 0x38 + g_client[6] = i2c_new_client_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #5 - Address: 0x39 i2c_put_adapter(adapter); } @@ -178,7 +178,7 @@ static int __init ix9_platform_init(void) } else { - g_client[7] = i2c_new_device(adapter, &ix9_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54 + g_client[7] = i2c_new_client_device(adapter, &ix9_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54 i2c_put_adapter(adapter); } @@ -189,7 +189,7 @@ static int __init ix9_platform_init(void) } else { - g_client[8] = i2c_new_device(adapter, &ix9_i2c_devices[2]); // tca9539_1 Board ID and QSFP-DD PW EN/PG - Address: 0x74 + g_client[8] = i2c_new_client_device(adapter, &ix9_i2c_devices[2]); // tca9539_1 Board ID and QSFP-DD PW EN/PG - Address: 0x74 i2c_put_adapter(adapter); } @@ -200,7 +200,7 @@ static int __init ix9_platform_init(void) } else { - g_client[9] = i2c_new_device(adapter, &ix9_i2c_devices[4]); // pca9548 #1 QSFPDD - Address: 0x73 + g_client[9] = i2c_new_client_device(adapter, &ix9_i2c_devices[4]); // pca9548 #1 QSFPDD - Address: 0x73 i2c_put_adapter(adapter); } @@ -211,7 +211,7 @@ static int __init ix9_platform_init(void) } else { - g_client[10] = i2c_new_device(adapter, &ix9_i2c_devices[5]); // pca9548 #2 QSFPDD - Address: 0x73 + g_client[10] = i2c_new_client_device(adapter, &ix9_i2c_devices[5]); // pca9548 #2 QSFPDD - Address: 0x73 i2c_put_adapter(adapter); } @@ -222,7 +222,7 @@ static int __init ix9_platform_init(void) } else { - g_client[11] = i2c_new_device(adapter, &ix9_i2c_devices[6]); // pca9548 #3 QSFPDD - Address: 0x73 + g_client[11] = i2c_new_client_device(adapter, &ix9_i2c_devices[6]); // pca9548 #3 QSFPDD - Address: 0x73 i2c_put_adapter(adapter); } @@ -233,7 +233,7 @@ static int __init ix9_platform_init(void) } else { - g_client[12] = i2c_new_device(adapter, &ix9_i2c_devices[7]); // pca9548 #4 QSFPDD - Address: 0x73 + g_client[12] = i2c_new_client_device(adapter, &ix9_i2c_devices[7]); // pca9548 #4 QSFPDD - Address: 0x73 i2c_put_adapter(adapter); } @@ -246,7 +246,7 @@ static int __init ix9_platform_init(void) } else { - g_client_port[i - 13] = i2c_new_device(adapter, &ix9_i2c_devices[10]); // eeprom for loopback module - Address: 0x50 + g_client_port[i - 13] = i2c_new_client_device(adapter, &ix9_i2c_devices[10]); // eeprom for loopback module - Address: 0x50 i2c_put_adapter(adapter); } } diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/quanta_hwmon_ipmi.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/quanta_hwmon_ipmi.c index 05a9e044c75b..d49ca44856be 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/quanta_hwmon_ipmi.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/quanta_hwmon_ipmi.c @@ -86,6 +86,8 @@ #define IPMI_TIMEOUT (4 * HZ) #define IPMI_MAX_WAIT_QUEUE 1 +typedef struct ipmi_user *ipmi_user_t; + struct quanta_hwmon_ipmi_data { struct platform_device *ipmi_platform_dev; struct device *ipmi_hwmon_dev; @@ -839,7 +841,7 @@ void ipmi_sdr_set_sensor_threshold(uint8_t idx, struct sdr_record_full_sensor *s /*refer to Table 35-, Get Sensor Event Enable*/ /* // change detect threshold method, keep it for record detail format - // in this version function input is + // in this version function input is "void ipmi_sdr_set_sensor_threshold(uint8_t idx, uint8_t *rec)" #define offset_threshold_enable 9 #define offset_threshold_data 31 @@ -1100,7 +1102,7 @@ int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf) if (rv) { printk("BMC down at (%d)!!\n", __LINE__); } - else { + else { switch (returnData) { case 0x7: //LVDC @@ -1338,7 +1340,7 @@ static ssize_t show_fanpresent(struct device *dev, struct device_attribute *deva uint8_t returnData[10] = { 0 }; uint8_t msg_data[] = { 0x36, 0xB9, 0x4C, 0x1C, 0x00, 0x02 }; //netfn = 0x36; cmd = 0xB9; - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); fan_idx = (g_sensor_data[attr->index].sensor_idstring[8] - '0') - 1; @@ -1611,7 +1613,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) goto device_reg_err; } - data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, NULL); + data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL); err = IS_ERR(data->ipmi_hwmon_dev); if (err) { printk("hwmon register fail\n"); @@ -1646,7 +1648,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void) } static void __exit quanta_hwmon_ipmi_exit(void) -{ +{ remove_sensor_attrs(); hwmon_device_unregister(data->ipmi_hwmon_dev); platform_device_unregister(data->ipmi_platform_dev); @@ -1656,8 +1658,9 @@ static void __exit quanta_hwmon_ipmi_exit(void) mutex_unlock(&ipmi_lock); kfree(g_sensor_data); + g_sensor_data = NULL; kfree(data); - return; + data = NULL; } module_init(quanta_hwmon_ipmi_init); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/chassis.py index 33f67b0b9d90..6a8b760f3762 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/chassis.py @@ -8,6 +8,7 @@ try: import sys import time + import syslog from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.eeprom import Eeprom from sonic_platform.psu import Psu @@ -64,6 +65,12 @@ def __init__(self): self._sfp_list.append(sfp) self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence() + # Initialize components + from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE + self._component_list.append(ComponentBIOS()) + self._component_list.append(ComponentBMC()) + self._component_list.extend(ComponentCPLD.get_component_list()) + self._component_list.append(ComponentPCIE()) ############################################## # Device methods @@ -72,7 +79,7 @@ def __init__(self): def get_sfp(self, index): """ Retrieves sfp represented by (1-based) index - For Quanta IX8C the index in sfputil.py starts from 1, so override + For Quanta the index in sfputil.py starts from 1, so override Args: index: An integer, the index (1-based) of the sfp to retrieve. @@ -182,9 +189,29 @@ def get_reboot_cause(self): is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used to pass a description of the reboot cause. """ - #raise NotImplementedError return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + ############################################## + # Other methods + ############################################## + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + try: + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + # Create the watchdog Instance + self._watchdog = Watchdog() + + except Exception as e: + syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e)) + return self._watchdog + def get_change_event(self, timeout=0): """ Currently only support transceiver change events @@ -200,10 +227,10 @@ def get_change_event(self, timeout=0): cur_xcvr_presence = self._sfp_list[index-1].get_presence() if cur_xcvr_presence != self.__xcvr_presence[index]: if cur_xcvr_presence is True: - xcvr_change_event_dict[str(index)] = '1' + xcvr_change_event_dict[index] = '1' self.__xcvr_presence[index] = True elif cur_xcvr_presence is False: - xcvr_change_event_dict[str(index)] = '0' + xcvr_change_event_dict[index] = '0' self.__xcvr_presence[index] = False event = True diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/component.py new file mode 100644 index 000000000000..49d25f31cbcc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/component.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python + +######################################################################## +# Quanta IX9 +# +# Name: component.py, version: 1.3 +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + from collections import namedtuple +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Component(ComponentBase): + def __init__(self): + ComponentBase.__init__(self) + self.name = None + self.description = None + + def get_name(self): + return self.name + + def get_description(self): + return self.description + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + return False + + @staticmethod + def _get_command_result(cmdline): + try: + proc = subprocess.Popen(cmdline, + stdout=subprocess.PIPE, + shell=True, stderr=subprocess.STDOUT, + universal_newlines=True) + stdout = proc.communicate()[0] + rc = proc.wait() + result = stdout.rstrip('\n') + if rc != 0: + raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout)) + + except OSError as e: + raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e))) + + return result + + +class ComponentBIOS(Component): + COMPONENT_NAME = 'BIOS' + COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System' + + BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version" + + def __init__(self): + super(ComponentBIOS, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND) + if not bios_ver: + return 'ERR' + else: + return bios_ver + + +class ComponentBMC(Component): + COMPONENT_NAME = 'BMC' + COMPONENT_DESCRIPTION = 'BMC - Board Management Controller' + BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'" + + def __init__(self): + super(ComponentBMC, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND) + if not bmc_ver: + return 'ERR' + else: + bmc_ver = bmc_ver.split(": ")[1] + return bmc_ver.strip() + + +class ComponentCPLD(Component): + Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description']) + + cplds = { + 1: Cpld("BOOT_CPLD", 1, "Power sequence"), + 2: Cpld("FAN_CPLD", 2, "Fan"), + 3: Cpld("MB_CPLD_IO_1", 3, "Port IO-1"), + 4: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"), + 5: Cpld("MB_CPLD_LED_1", 4, "Port LED-1"), + 6: Cpld("MB_CPLD_LED_2", 5, "Port LED-2"), + } + + def __init__(self, component_index): + super(ComponentCPLD, self).__init__() + self.index = component_index + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.name = self.cplds[self.index].name + + return self.name + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.description = self.cplds[self.index].description + + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01") + res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index)) + self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00") + if not res: + return 'ERR' + else: + return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper() + + @classmethod + def get_component_list(cls): + component_list = [] + cpld_number = len(cls.cplds) + + for cpld_idx in range(1, cpld_number + 1): + component_list.append(cls(cpld_idx)) + + return component_list + + +class ComponentPCIE(Component): + COMPONENT_NAME = 'PCIe' + COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware' + PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'" + + def __init__(self): + super(ComponentPCIE, self).__init__() + + self.name = self.COMPONENT_NAME + self.description = self.COMPONENT_DESCRIPTION + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Returns: + A string containing the firmware version of the component + """ + version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND) + if not version: + return 'ERR' + else: + version = version.split(": ")[1] + return version.strip() diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan.py index e668013df900..7b63aa3aed58 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan.py @@ -11,6 +11,7 @@ try: import logging import os + import glob from sonic_platform_base.fan_base import FanBase except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -19,9 +20,7 @@ ############### # Global ############### -HWMON_DIR = "/sys/class/hwmon/hwmon2/" -FAN_INDEX_START = 18 -NUM_FANTRAYS = 6 +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" FANS_PERTRAY = 2 class Fan(FanBase): @@ -30,30 +29,46 @@ class Fan(FanBase): def __init__(self, index, is_psu_fan=False): self.is_psu_fan = is_psu_fan self.fan_index = index - self.psu_fan_index_mapping = { - 1:37, - 2:47, - } - self.psu_index_mapping = { - 1:39, - 2:49, - } + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + if self.is_psu_fan: - self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index]) - self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index]) - self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index]) - self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index]) + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power') + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan') + self.fan_presence_attr = power_out_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' else: - self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1)) - self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1)) - self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1)) - self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1)) + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 + fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) + fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan') + self.fan_presence_attr = fan_prefix + 'present' + self.fan_pwm_attr = fan_prefix + 'pwm' + self.fan_rpm_attr = fan_prefix + 'input' + self.fan_direction_attr = fan_prefix + 'direction' ####################### # private function ####################### + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval + def __get_attr_value(self, attr_path): retval = 'ERR' @@ -64,7 +79,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -84,7 +99,7 @@ def get_name(self): if self.is_psu_fan: return "PSU-{}_FAN".format(self.fan_index) else: - fantray_index = (self.fan_index-1)/FANS_PERTRAY+1 + fantray_index = (self.fan_index-1)//FANS_PERTRAY+1 fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY) return "Fantray{}_{}".format(fantray_index, fan_index_intray) @@ -95,8 +110,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.fan_presence_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == '1'): return True @@ -113,8 +127,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR' and attr_rv != '0.0'): return True @@ -135,8 +148,7 @@ def get_direction(self): A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST depending on fan direction """ - attr_path = HWMON_DIR + self.fan_direction_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_direction_attr) if attr_rv == '2': return self.FAN_DIRECTION_INTAKE @@ -152,8 +164,7 @@ def get_speed(self): to 100 (full speed) """ if self.get_presence(): - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -169,8 +180,7 @@ def get_speed_rpm(self): Returns: An integer, speed of the fan in RPM """ - attr_path = HWMON_DIR + self.fan_rpm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_rpm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) @@ -185,8 +195,7 @@ def get_target_speed(self): An integer, the percentage of full fan speed, in the range 0 (off) to 100 (full speed) """ - attr_path = HWMON_DIR + self.fan_pwm_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.fan_pwm_attr) if (attr_rv != 'ERR'): return int(float(attr_rv)) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan_drawer.py index 75e954576a28..3d5f767477ee 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan_drawer.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/fan_drawer.py @@ -28,7 +28,7 @@ def get_name(self): Returns: string: The name of the device """ - return 'Fan {}'.format(self._index) + return 'Fantray{}'.format(self._index) def get_presence(self): """ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/psu.py index 1043a4fe1857..6188c95c7692 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/psu.py @@ -8,57 +8,61 @@ try: import logging import os + import glob from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" class Psu(PsuBase): def __init__(self, index): PsuBase.__init__(self) fan = Fan(index, True) self._fan_list.append(fan) + self.index = index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + + current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr') + current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr') + power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power') + power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power') + voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in') + voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in') + temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp') + + self.psu_current_in_attr = current_in_prefix + 'input' + self.psu_current_out_attr = current_out_prefix + 'input' + self.psu_power_in_attr = power_in_prefix + 'input' + self.psu_power_out_attr = power_out_prefix + 'input' + self.psu_voltage_in_attr = voltage_in_prefix + 'input' + self.psu_voltage_out_attr = voltage_out_prefix + 'input' + self.psu_status_attr = current_out_prefix + 'input' + self.psu_presence_attr = power_out_prefix + 'present' + self.psu_serial_attr = power_out_prefix + 'sn' + self.psu_model_attr = power_out_prefix + 'model' + self.psu_mfr_id_attr = power_out_prefix + 'mfrid' + self.psu_capacity_attr = power_out_prefix + 'pout_max' + self.psu_type_attr = power_out_prefix + 'vin_type' + self.psu_temp_attr = temp1_prefix + 'input' + + def __get_hwmon_attr_prefix(self, dir, label, type): - self.psu_index_mapping = { - 1:39, - 2:49, - } - self.psu_powerin_index_mapping = { - 1:38, - 2:48, - } - self.psu_currentout_index_mapping = { - 1:36, - 2:46, - } - self.psu_currentin_index_mapping = { - 1:35, - 2:45, - } - self.psu_voltageout_index_mapping = { - 1:44, - 2:54, - } - self.psu_voltagein_index_mapping = { - 1:43, - 2:53, - } - self.index = index - self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index]) - self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index]) - self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index]) - self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index]) - self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index]) - self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index]) - self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index]) - self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index]) - self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index]) - self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index]) - self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index]) - self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index]) + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + + return retval def __get_attr_value(self, attr_path): @@ -70,10 +74,9 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') - fd.close() return retval ############################################## @@ -97,10 +100,9 @@ def get_presence(self): bool: True if device is present, False if not """ presence = False - attr_path = HWMON_DIR+self.psu_presence_attr attr_normal = '1' - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_presence_attr) if (attr_rv != 'ERR'): if (attr_rv == attr_normal): presence = True @@ -115,8 +117,7 @@ def get_model(self): string: Model/part number of device """ model = "N/A" - attr_path = HWMON_DIR+self.psu_model_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_model_attr) if (attr_rv != 'ERR'): model = attr_rv @@ -130,8 +131,7 @@ def get_mfr_id(self): string: Manufacturer's id of device """ mfr_id = "N/A" - attr_path = HWMON_DIR+self.psu_mfr_id_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_mfr_id_attr) if (attr_rv != 'ERR'): mfr_id = attr_rv @@ -145,9 +145,7 @@ def get_serial(self): string: Serial number of device """ serial = "N/A" - attr_path = HWMON_DIR+self.psu_serial_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_serial_attr) if (attr_rv != 'ERR'): serial = attr_rv @@ -161,9 +159,7 @@ def get_status(self): A boolean value, True if device is operating properly, False if not """ status = False - attr_path = HWMON_DIR+self.psu_status_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_status_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) if (int(attr_rv) != 0): @@ -184,9 +180,7 @@ def get_voltage(self): e.g. 12.1 """ voltage_out = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_out = float(attr_rv) / 1000 @@ -201,9 +195,7 @@ def get_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_out = 0.0 - attr_path = HWMON_DIR+self.psu_current_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_out = float(attr_rv) / 1000 @@ -212,16 +204,14 @@ def get_current(self): def get_input_voltage(self): """ - Retrieves current PSU voltage output + Retrieves current PSU voltage input Returns: - A float number, the output voltage in volts, + A float number, the input voltage in volts, e.g. 12.1 """ voltage_in = 0.0 - attr_path = HWMON_DIR+self.psu_voltage_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_voltage_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) voltage_in = float(attr_rv) / 1000 @@ -236,9 +226,7 @@ def get_input_current(self): A float number, the electric current in amperes, e.g 15.4 """ current_in = 0.0 - attr_path = HWMON_DIR+self.psu_current_in_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_current_in_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) current_in = float(attr_rv) / 1000 @@ -253,9 +241,7 @@ def get_power(self): A float number, the power in watts, e.g. 302.6 """ power_out = 0.0 - attr_path = HWMON_DIR+self.psu_power_out_attr - - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_power_out_attr) if (attr_rv != 'ERR'): attr_rv, dummy = attr_rv.split('.', 1) power_out = float(attr_rv) / 1000 @@ -292,8 +278,7 @@ def get_type(self): A string, the type of PSU (AC/DC) """ type = "AC" - attr_path = HWMON_DIR+self.psu_type_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_type_attr) if (attr_rv != 'ERR'): type = attr_rv @@ -307,8 +292,7 @@ def get_capacity(self): An integer, the capacity of PSU """ capacity = 0 - attr_path = HWMON_DIR+self.psu_capacity_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.psu_capacity_attr) if (attr_rv != 'ERR'): try: capacity = int(attr_rv) @@ -317,3 +301,19 @@ def get_capacity(self): return capacity + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + + tout = 0.0 + attr_rv = self.__get_attr_value(self.psu_temp_attr) + if (attr_rv != 'ERR'): + tout = float(attr_rv) + + # tout is in milli degree celcius + return float(tout/1000.0) + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/sfp.py index 726e18b23153..77176ad083f5 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/sfp.py @@ -278,7 +278,6 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index - #self.dom_supported = False self.sfp_type = sfp_type self.reset_path = "/sys/class/cpld-qsfpdd/port-"+str(self.port_num)+"/reset" self.lpmode_path = "/sys/class/cpld-qsfpdd/port-"+str(self.port_num)+"/lpmode" @@ -329,7 +328,7 @@ def __init__(self, sfp_index, sfp_type): self.info_dict_keys = ['type', 'vendor_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', 'ext_rateselect_compliance', 'cable_type', 'cable_length', - 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', 'application_advertisement'] + 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', 'application_advertisement', 'type_abbrv_name'] SfpBase.__init__(self) @@ -354,15 +353,6 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __is_host(self): return os.system(self.HOST_CHK_CMD) == 0 @@ -425,7 +415,7 @@ def _detect_sfp_type(self, sfp_type): elif eeprom_raw[0] in QSFP_TYPE_CODE_LIST: self.sfp_type = QSFP_TYPE elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: - self.sfp_type = QSFP_TYPE + self.sfp_type = QSFP_DD_TYPE else: # we don't regonize this identifier value, treat the xSFP module as the default type self.sfp_type = sfp_type @@ -437,26 +427,6 @@ def _detect_sfp_type(self, sfp_type): # in this case we treat it as the default type according to the SKU self.sfp_type = sfp_type - def __convert_string_to_num(self, value_str): - if "-inf" in value_str: - return 'N/A' - elif "Unknown" in value_str: - return 'N/A' - elif 'dBm' in value_str: - t_str = value_str.rstrip('dBm') - return float(t_str) - elif 'mA' in value_str: - t_str = value_str.rstrip('mA') - return float(t_str) - elif 'C' in value_str: - t_str = value_str.rstrip('C') - return float(t_str) - elif 'Volts' in value_str: - t_str = value_str.rstrip('Volts') - return float(t_str) - else: - return 'N/A' - def _dom_capability_detect(self): if not self.get_presence(): self.dom_supported = False @@ -544,6 +514,7 @@ def _dom_capability_detect(self): self.dom_rx_tx_power_bias_supported = False else: self.dom_supported = False + self.second_application_list = False self.dom_temp_supported = False self.dom_volt_supported = False self.dom_rx_power_supported = False @@ -620,6 +591,7 @@ def get_transceiver_info(self): return transceiver_info_dict self._detect_sfp_type(self.sfp_type) + self._dom_capability_detect() transceiver_info_dict = {} compliance_code_dict = {} @@ -638,6 +610,7 @@ def get_transceiver_info(self): sfp_type_raw = self._read_eeprom_specific_bytes((offset + OSFP_TYPE_OFFSET), XCVR_TYPE_WIDTH) if sfp_type_raw is not None: sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + sfp_type_abbrv_name_data = sfpi_obj.parse_sfp_type_abbrv_name(sfp_type_raw, 0) else: return None @@ -666,6 +639,7 @@ def get_transceiver_info(self): return None transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] + transceiver_info_dict['type_abbrv_name'] = sfp_type_abbrv_name_data['data']['type_abbrv_name']['value'] transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] @@ -703,6 +677,7 @@ def get_transceiver_info(self): sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) if sfp_type_raw is not None: sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + sfp_type_abbrv_name_data = sfpi_obj.parse_sfp_type_abbrv_name(sfp_type_raw, 0) else: return None @@ -791,6 +766,7 @@ def get_transceiver_info(self): return None transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) + transceiver_info_dict['type_abbrv_name'] = sfp_type_abbrv_name_data['data']['type_abbrv_name']['value'] transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) transceiver_info_dict['vendor_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) @@ -828,9 +804,7 @@ def get_transceiver_info(self): else: if not self.get_presence(): return transceiver_info_dict - elif i == max_retry-1: - pass - else: + elif i < max_retry-1: time.sleep(0.5) if sfp_interface_bulk_raw is None: @@ -865,6 +839,7 @@ def get_transceiver_info(self): sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] @@ -960,8 +935,6 @@ def get_transceiver_bulk_status(self): if not self.get_presence(): return {} - self._dom_capability_detect() - if self.sfp_type == OSFP_TYPE: pass @@ -1302,7 +1275,7 @@ def get_reset_status(self): return False elif self.sfp_type == QSFP_TYPE: return False - elif self.sfp_type == OSFP_TYPE or self.sfp_type == QSFP_DD_TYPE: + elif self.sfp_type == QSFP_DD_TYPE: try: reg_file = open(self.reset_path) except IOError as e: @@ -1509,7 +1482,7 @@ def get_lpmode(self): return False elif self.sfp_type == QSFP_TYPE: return False - elif self.sfp_type == OSFP_TYPE: + elif self.sfp_type == QSFP_DD_TYPE: try: reg_file = open(self.lpmode_path) except IOError as e: @@ -1899,7 +1872,7 @@ def reset(self): return False elif self.sfp_type == QSFP_TYPE: return False - elif self.sfp_type == OSFP_TYPE: + elif self.sfp_type == QSFP_DD_TYPE: try: reg_file = open(self.reset_path, "r+") except IOError as e: @@ -1957,7 +1930,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET) sysfsfile_eeprom.write(buffer[0]) @@ -2010,7 +1983,7 @@ def tx_disable_channel(self, channel, disable): else: tx_disable_ctl = channel_state & (~channel) buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) + buffer[0] = tx_disable_ctl # Write to eeprom sysfsfile_eeprom = open( self.port_to_eeprom_mapping[self.port_num], "r+b") @@ -2045,7 +2018,7 @@ def set_lpmode(self, lpmode): return False elif self.sfp_type == QSFP_TYPE: return False - elif self.sfp_type == OSFP_TYPE: + elif self.sfp_type == QSFP_DD_TYPE: try: reg_file = open(self.lpmode_path, "r+") except IOError as e: @@ -2099,7 +2072,7 @@ def set_power_override(self, power_override, power_set): power_set_bit |= 1 << 1 buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) + buffer[0] = power_override_bit | power_set_bit # Write to eeprom sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b") sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/thermal.py index 5fb209749223..b3e2c89b79ce 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/thermal.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/thermal.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ############################################################################# -# Quanta +# Quanta IX9 # # Module contains an implementation of SONiC Platform Base API and # provides the Thermal information @@ -10,46 +10,69 @@ import logging import os +import glob try: from sonic_platform_base.thermal_base import ThermalBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -HWMON_DIR = "/sys/class/hwmon/hwmon2/" +HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/" thermal_index_mapping = { - 1:40, - 2:41, - 3:42, - 4:50, - 5:51, - 6:52, - 7:73, - 8:74, - 9:75, - 10:76, - 11:77, - 12:78, - 13:79, - 14:80, - 15:81, - 16:82, - 17:83, - 18:84, - 19:85 + 1:'PSU1_TEMP1', + 2:'PSU1_TEMP2', + 3:'PSU1_TEMP3', + 4:'PSU2_TEMP1', + 5:'PSU2_TEMP2', + 6:'PSU2_TEMP3', + 7:'Temp_1V05_PCH_VR', + 8:'Temp_Ambient_0', + 9:'Temp_Ambient_1', + 10:'Temp_Ambient_2', + 11:'Temp_Ambient_3', + 12:'Temp_Ambient_4', + 13:'Temp_Ambient_5', + 14:'Temp_CPU', + 15:'Temp_DDRAB_VR', + 16:'Temp_Inlet', + 17:'Temp_SOC_DIMMA0', + 18:'Temp_VCCGBE_VR', + 19:'Temp_VCCIN_VR' } + + class Thermal(ThermalBase): """Platform-specific Thermal class""" def __init__(self, thermal_index): - self.index = thermal_index - self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index]) - self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index]) - self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index]) - self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index]) + self.index = thermal_index + hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0] + thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp') + self.temp_attr = "{}input".format(thermal_prefix) + self.high_th_attr = "{}ncrit".format(thermal_prefix) + self.high_crit_th_attr = "{}crit".format(thermal_prefix) + self.low_th_attr = "{}lncrit".format(thermal_prefix) + self.low_crit_th_attr = "{}lcrit".format(thermal_prefix) + self.name_attr = "{}label".format(thermal_prefix) + + def __get_hwmon_attr_prefix(self, dir, label, type): + + retval = 'ERR' + if not os.path.isdir(dir): + return retval + + try: + for filename in os.listdir(dir): + if filename[-5:] == 'label' and type in filename: + file_path = os.path.join(dir, filename) + if os.path.isfile(file_path) and label == self.__get_attr_value(file_path): + return file_path[0:-5] + except Exception as error: + logging.error("Error when getting {} label path: {}".format(label, error)) + return retval def __get_attr_value(self, attr_path): @@ -61,7 +84,7 @@ def __get_attr_value(self, attr_path): with open(attr_path, 'r') as fd: retval = fd.read() except Exception as error: - logging.error("Unable to open " + attr_path + " file !") + logging.error("Unable to open {} file: {}".format(attr_path, error)) retval = retval.rstrip(' \t\n\r') return retval @@ -73,8 +96,7 @@ def get_name(self): Returns: string: The name of the device """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return attr_rv @@ -88,8 +110,7 @@ def get_presence(self): Returns: bool: True if device is present, False if not """ - attr_path = HWMON_DIR + self.name_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.name_attr) if (attr_rv != 'ERR'): return True @@ -116,8 +137,37 @@ def get_temperature(self): A float number of current temperature in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.temp_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.temp_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_th_attr) + + if (attr_rv != 'ERR'): + return float(attr_rv) / 1000 + else: + return None + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + attr_rv = self.__get_attr_value(self.low_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -132,8 +182,7 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 @@ -148,8 +197,7 @@ def get_high_critical_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - attr_path = HWMON_DIR + self.high_crit_th_attr - attr_rv = self.__get_attr_value(attr_path) + attr_rv = self.__get_attr_value(self.high_crit_th_attr) if (attr_rv != 'ERR'): return float(attr_rv) / 1000 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/watchdog.py index 282f356f4e73..0e63d9368cb0 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/watchdog.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/sonic_platform/watchdog.py @@ -48,12 +48,16 @@ WDT_SYSFS_PATH = "/sys/class/watchdog/" DEFAULT_TIMEOUT=180 +watchdog=0 class Watchdog(WatchdogBase): def __init__(self): self.watchdog, self.wdt_main_dev_name = self._get_wdt() + if self.wdt_main_dev_name is None: + raise Exception("Watchdog device is not instantiated") + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name @@ -74,14 +78,16 @@ def _get_wdt(self): """ Retrieves watchdog device """ + global watchdog wdt_main_dev_list = [dev for dev in os.listdir( "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] if not wdt_main_dev_list: - return None + return (None, None) wdt_main_dev_name = wdt_main_dev_list[0] watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) - self.watchdog = os.open(watchdog_device_path, os.O_RDWR) - return self.watchdog, wdt_main_dev_name + if not watchdog: + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name def _read_file(self, file_path): """ @@ -228,7 +234,8 @@ def __del__(self): Close watchdog """ - os.close(self.watchdog) + if self.watchdog is not None : + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py index 0554ccbf1b71..ec14e10ad6d1 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py @@ -28,27 +28,26 @@ """ import os -import commands +import subprocess import sys, getopt import logging +import time DEBUG = False args = [] FORCE = 0 i2c_prefix = '/sys/bus/i2c/devices/' - if DEBUG == True: - print sys.argv[0] - print 'ARGV :', sys.argv[1:] - + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) def main(): global DEBUG global args global FORCE - if len(sys.argv)<2: + if len(sys.argv) < 2: show_help() options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', @@ -56,9 +55,9 @@ def main(): 'force', ]) if DEBUG == True: - print options - print args - print len(sys.argv) + print(options) + print(args) + print(len(sys.argv)) for opt, arg in options: if opt in ('-h', '--help'): @@ -72,44 +71,44 @@ def main(): logging.info('no option') for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() return 0 def show_help(): - print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) sys.exit(0) def show_log(txt): if DEBUG == True: - print "[IX9-32X]"+txt + print("[IX9-32X]" + txt) return def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) + logging.info('Run :' + cmd) + status, output = subprocess.getstatusoutput(cmd) show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output + print('Failed :' + cmd) + return status, output + +pca954x_bus_addr =[ +'0-0072', +'0-0077', +'5-0073', +'6-0073', +'7-0073', +'8-0073' +] instantiate =[ -#turn on module power -'echo 21 > /sys/class/gpio/export', -'echo out > /sys/class/gpio/gpio21/direction', -'echo 1 >/sys/class/gpio/gpio21/value', -#Reset fron-ports LED CPLD -'echo 33 > /sys/class/gpio/export', -'echo out > /sys/class/gpio/gpio33/direction', -'echo 0 >/sys/class/gpio/gpio33/value', -'echo 1 >/sys/class/gpio/gpio33/value', #Enable front-ports LED decoding 'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode', 'echo 1 > /sys/class/cpld-led/CPLDLED-2/led_decode', @@ -159,7 +158,7 @@ def exec_cmd(cmd, show): 'lpc_ich', 'i2c-i801', 'i2c-dev', -'i2c-mux-pca954x force_deselect_on_exit=1', +'i2c-mux-pca954x', 'gpio-pca953x', 'optoe', 'qci_cpld_qsfpdd', @@ -190,11 +189,20 @@ def system_install(): exec_cmd("depmod -a ", 1) #install drivers for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe " + drivers[i], 1) - if status: - print output - if FORCE == 0: - return status + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: + print(output) + #retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted + if drivers[i] == 'quanta_hwmon_ipmi': + for _ in range(0, 3): + time.sleep(3) + ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1) + if ret == 0: + break + if ret and FORCE == 0: + return ret + elif FORCE == 0: + return status #reload ethernet drivers in correct order exec_cmd("rmmod ixgbe ", 1) @@ -202,16 +210,32 @@ def system_install(): exec_cmd("modprobe igb ", 1) exec_cmd("modprobe ixgbe ", 1) + # set pca954x idle_state as -2: MUX_IDLE_DISCONNECT + for i in range(0,len(pca954x_bus_addr)): + exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1) + + #turn on module power + exec_cmd("echo 21 > /sys/class/gpio/export ", 1) + exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1) + + #Reset fron-ports LED CPLD + exec_cmd("echo 33 > /sys/class/gpio/export ", 1) + status, output = exec_cmd("cat /sys/class/gpio/gpio33/value", 1) + if output != '1': + exec_cmd("echo out > /sys/class/gpio/gpio33/direction ", 1) + exec_cmd("echo 0 >/sys/class/gpio/gpio33/value", 1) + exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1) + #instantiate devices - for i in range(0,len(instantiate)): - status, output = exec_cmd(instantiate[i], 1) - if status: - print output - if FORCE == 0: - return status + for i in range(0, len(instantiate)): + status, output = exec_cmd(instantiate[i], 1) + if status: + print(output) + if FORCE == 0: + return status #QSFPDD for 1~32 port - for port_number in range(1,33): + for port_number in range(1, 33): bus_number = port_number + 12 os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) @@ -224,35 +248,35 @@ def system_ready(): def install(): if not device_found(): - print "No device, installing...." + print("No device, installing....") status = system_install() if status: if FORCE == 0: - return status + return status status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix9_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status else: - print " ix9 driver already installed...." + print(" ix9 driver already installed....") return def uninstall(): global FORCE #uninstall drivers for i in range(len(un_drivers) - 1, -1, -1): - status, output = exec_cmd("rmmod " + un_drivers[i], 1) + status, output = exec_cmd("rmmod " + un_drivers[i], 1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1) if status: - print output - if FORCE == 0: - return status + print(output) + if FORCE == 0: + return status return From b7aa69595f9d229ddfa8d6a08ad27e43dbb3bf7a Mon Sep 17 00:00:00 2001 From: arlakshm <55814491+arlakshm@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:40:54 -0700 Subject: [PATCH 694/817] [Chassis]: filter inband and recirc ports as internal ports (#11764) Why I did it Currently the CLI commands show interface status show interface counters and show interface description displays Ethernet-IB and Ethernet-Rec ports in the output. These are internal ports should only be displayed when the option -d all is used for the above mentioned CLI commands How I did it Add the port roles Inb and Rec when classifing a port as internal port. How to verify it Verify the CLI output of the command show interface status doesnt display the Ethenet-IB and Ethernet-Rec port when -d all option in not present Before Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-py-common/sonic_py_common/multi_asic.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index e08746be0367..e03dc6447c90 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -15,6 +15,8 @@ BACKEND_ASIC_SUB_ROLE = 'BackEnd' EXTERNAL_PORT = 'Ext' INTERNAL_PORT = 'Int' +INBAND_PORT = 'Inb' +RECIRC_PORT ='Rec' PORT_CHANNEL_CFG_DB_TABLE = 'PORTCHANNEL' PORT_CFG_DB_TABLE = 'PORT' BGP_NEIGH_CFG_DB_TABLE = 'BGP_NEIGHBOR' @@ -323,7 +325,7 @@ def is_port_internal(port_name, namespace=None): role = get_port_role(port_name, namespace) - if role == INTERNAL_PORT: + if role in [INTERNAL_PORT, INBAND_PORT, RECIRC_PORT]: return True return False From cd33c7fc7145ac86566c69d454c26c3229245645 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 24 Aug 2022 12:36:47 +0800 Subject: [PATCH 695/817] Replace swsssdk with swsscommon in accton device (#11348) #### Why I did it Update scripts in sonic-buildimage from py-swsssdk to swsscommon #### How I did it Remove unused swsssdk import from accton device code #### How to verify it Pass all E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Remove unused swsssdk import from accton device code #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- device/accton/x86_64-accton_minipack-r0/plugins/led_control.py | 1 - 1 file changed, 1 deletion(-) diff --git a/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py b/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py index a11a31062367..5aa00638d835 100755 --- a/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py +++ b/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py @@ -5,7 +5,6 @@ try: from sonic_led.led_control_base import LedControlBase - import swsssdk import threading import os import logging From 776c93b96e5e713c5cfa8a290c9266985e96ebf4 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 24 Aug 2022 12:39:51 +0800 Subject: [PATCH 696/817] Replace swsssdk with swsscommon in centec devices. (#11350) #### Why I did it Update scripts in sonic-buildimage from py-swsssdk to swsscommon #### How I did it Replace swsssdk with swsscommon in centec devices. #### How to verify it Pass all E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Replace swsssdk with swsscommon in centec devices. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- .../x86_64-centec_e582_48x2q4z-r0/plugins/led_control.py | 1 - .../centec/x86_64-centec_e582_48x6q-r0/plugins/led_control.py | 1 - .../48x2q4z/scripts/48x2q4z_platform_monitor.py | 4 ++-- .../48x6q/scripts/48x6q_platform_monitor.py | 4 ++-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/device/centec/x86_64-centec_e582_48x2q4z-r0/plugins/led_control.py b/device/centec/x86_64-centec_e582_48x2q4z-r0/plugins/led_control.py index 48a4d8d04eae..ed017335d6ee 100644 --- a/device/centec/x86_64-centec_e582_48x2q4z-r0/plugins/led_control.py +++ b/device/centec/x86_64-centec_e582_48x2q4z-r0/plugins/led_control.py @@ -5,7 +5,6 @@ try: from sonic_led.led_control_base import LedControlBase - import swsssdk import threading import os import logging diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/plugins/led_control.py b/device/centec/x86_64-centec_e582_48x6q-r0/plugins/led_control.py index eb9e9143a9bf..abde0678743d 100644 --- a/device/centec/x86_64-centec_e582_48x6q-r0/plugins/led_control.py +++ b/device/centec/x86_64-centec_e582_48x6q-r0/plugins/led_control.py @@ -5,7 +5,6 @@ try: from sonic_led.led_control_base import LedControlBase - import swsssdk import threading import os import logging diff --git a/platform/centec/sonic-platform-modules-e582/48x2q4z/scripts/48x2q4z_platform_monitor.py b/platform/centec/sonic-platform-modules-e582/48x2q4z/scripts/48x2q4z_platform_monitor.py index 2d8d2c440a8f..5112b7e012d8 100644 --- a/platform/centec/sonic-platform-modules-e582/48x2q4z/scripts/48x2q4z_platform_monitor.py +++ b/platform/centec/sonic-platform-modules-e582/48x2q4z/scripts/48x2q4z_platform_monitor.py @@ -15,7 +15,7 @@ import logging import struct import syslog - import swsssdk + from swsscommon import swsscommon from socket import * from select import * except ImportError, e: @@ -96,7 +96,7 @@ def initialize_configdb(self): aligned_last_byte = format(int(int(str(last_byte), 16) + 1), '02x') mac_addr = mac_addr[:-2] + aligned_last_byte DBG_PRINT("start connect swss config-db to set device mac-address") - swss = swsssdk.SonicV2Connector() + swss = swsscommon.SonicV2Connector() swss.connect(swss.CONFIG_DB) swss.set(swss.CONFIG_DB, "DEVICE_METADATA|localhost", 'mac', mac_addr) mac_addr = swss.get(swss.CONFIG_DB, "DEVICE_METADATA|localhost", 'mac') diff --git a/platform/centec/sonic-platform-modules-e582/48x6q/scripts/48x6q_platform_monitor.py b/platform/centec/sonic-platform-modules-e582/48x6q/scripts/48x6q_platform_monitor.py index d08802a35f3b..9c45d3ea1a34 100644 --- a/platform/centec/sonic-platform-modules-e582/48x6q/scripts/48x6q_platform_monitor.py +++ b/platform/centec/sonic-platform-modules-e582/48x6q/scripts/48x6q_platform_monitor.py @@ -15,7 +15,7 @@ import logging import struct import syslog - import swsssdk + from swsscommon import swsscommon from socket import * from select import * except ImportError, e: @@ -96,7 +96,7 @@ def initialize_configdb(self): aligned_last_byte = format(int(int(str(last_byte), 16) + 1), '02x') mac_addr = mac_addr[:-2] + aligned_last_byte DBG_PRINT("start connect swss config-db to set device mac-address") - swss = swsssdk.SonicV2Connector() + swss = swsscommon.SonicV2Connector() swss.connect(swss.CONFIG_DB) swss.set(swss.CONFIG_DB, "DEVICE_METADATA|localhost", 'mac', mac_addr) mac_addr = swss.get(swss.CONFIG_DB, "DEVICE_METADATA|localhost", 'mac') From 3fc0fe1841b465090a1ac9584b9f36929cc1e603 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Wed, 24 Aug 2022 12:40:12 +0800 Subject: [PATCH 697/817] Replace swsssdk with swsscommon in alphanetworks devices (#11349) #### Why I did it Update scripts in sonic-buildimage from py-swsssdk to swsscommon #### How I did it Replace swsssdk with swsscommon in alphanetworks devices code. #### How to verify it Pass all E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Replace swsssdk with swsscommon in alphanetworks devices code. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- .../plugins/led_control.py | 4 ++-- .../plugins/led_control.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/plugins/led_control.py b/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/plugins/led_control.py index 4da72e7f7a04..7ce532554f95 100644 --- a/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/plugins/led_control.py +++ b/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/plugins/led_control.py @@ -3,7 +3,7 @@ # try: # from sonic_led.led_control_base import LedControlBase -# import swsssdk +# from swsscommon import swsscommon # except ImportError as e: # raise ImportError (str(e) + " - required module not found") @@ -181,7 +181,7 @@ def _port_name_to_qsfp_index(self, port_name): sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) - swss = swsssdk.SonicV2Connector() + swss = swsscommon.SonicV2Connector() swss.connect(swss.APPL_DB) lanes = swss.get( diff --git a/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/plugins/led_control.py b/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/plugins/led_control.py index 53cc43c6cce3..e7c8d3bc1e2d 100644 --- a/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/plugins/led_control.py +++ b/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/plugins/led_control.py @@ -5,7 +5,7 @@ # try: # from sonic_led.led_control_base import LedControlBase -# import swsssdk +# from swsscommon import swsscommon # except ImportError as e: # raise ImportError (str(e) + " - required module not found") @@ -148,7 +148,7 @@ def _port_name_to_qsfp_index(self, port_name): sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) - swss = swsssdk.SonicV2Connector() + swss = swsscommon.SonicV2Connector() swss.connect(swss.APPL_DB) lanes = swss.get( From d9f3e6ce4fffff55bb7e936f70dbae26c3a39df6 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Wed, 24 Aug 2022 16:45:16 +0800 Subject: [PATCH 698/817] update Mellanox SDK/FW to 4.5.2318 2010.2318 (#11773) - Why I did it Update SDK/FW version - 4.5.2318/2010_2318 to pick up new fixes: 1. Cr space timeout on Hold and Release GW - at warm boot 2. Spectrum Port in stuck PHY_UP after peer side rebooted 3. Memory leak in sx_api_router_ecmp_update_set - How I did it Update the make file with the new version number Update submodule Switch-SDK-drivers pointer - How to verify it Run sonic regression Signed-off-by: Kebo Liu --- platform/mellanox/fw.mk | 6 +++--- platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers | 2 +- platform/mellanox/sdk.mk | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 0dc3800155ea..f6beeb990bd7 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -27,17 +27,17 @@ else FW_FROM_URL = n endif -MLNX_SPC_FW_VERSION = 13.2010.2262 +MLNX_SPC_FW_VERSION = 13.2010.2318 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2010.2262 +MLNX_SPC2_FW_VERSION = 29.2010.2318 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) -MLNX_SPC3_FW_VERSION = 30.2010.2262 +MLNX_SPC3_FW_VERSION = 30.2010.2318 MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) diff --git a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers index e9fa9a843702..7d4071a89f34 160000 --- a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers +++ b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers @@ -1 +1 @@ -Subproject commit e9fa9a843702aa55b13c8eb01c7a1f188e4a16a9 +Subproject commit 7d4071a89f34dc1dce4a9e832a0fd27c26acb485 diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index e0861ddc93f8..ad60fd1fa045 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -16,7 +16,7 @@ # MLNX_SDK_BASE_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel/Switch-SDK-drivers/bin/ MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/$(CONFIGURED_ARCH)/ -MLNX_SDK_VERSION = 4.5.2262 +MLNX_SDK_VERSION = 4.5.2318 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DEB_VERSION = $(subst -,.,$(subst _,.,$(MLNX_SDK_VERSION))) From 0193c8e90cc0db40389ea958deea4b216003c1e2 Mon Sep 17 00:00:00 2001 From: Vivek Date: Wed, 24 Aug 2022 01:53:11 -0700 Subject: [PATCH 699/817] [sonic_py_common] Cache Static Information in device_info to speed up CLI response (#11696) - Why I did it Profiled the execution for the following cmd intfutil -c status - How I did it Cached the following information: 1. get_sonic_version_info() 2. get_platform_info() None of the API exposed to the user libraries (for eg: sonic-utilities) has been modified These methods involve reading text files or from redis. Thus, caching helped to improve the execution time - How to verify it Added UT's. Verified on the device Signed-off-by: Vivek Reddy Karri --- .../sonic_py_common/device_info.py | 22 ++++-- src/sonic-py-common/tests/device_info_test.py | 79 +++++++++++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 6126dd6dd284..92809474ad6a 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -39,6 +39,10 @@ CHASSIS_INFO_MODEL_FIELD = 'model' CHASSIS_INFO_REV_FIELD = 'revision' +# Cacheable Objects +sonic_ver_info = {} +hw_info_dict = {} + def get_localhost_info(field, config_db=None): try: # TODO: enforce caller to provide config_db explicitly and remove its default value @@ -333,14 +337,17 @@ def get_sonic_version_info(): if not os.path.isfile(SONIC_VERSION_YAML_PATH): return None - data = {} + global sonic_ver_info + if sonic_ver_info: + return sonic_ver_info + with open(SONIC_VERSION_YAML_PATH) as stream: if yaml.__version__ >= "5.1": - data = yaml.full_load(stream) + sonic_ver_info = yaml.full_load(stream) else: - data = yaml.load(stream) + sonic_ver_info = yaml.load(stream) - return data + return sonic_ver_info def get_sonic_version_file(): if not os.path.isfile(SONIC_VERSION_YAML_PATH): @@ -354,9 +361,12 @@ def get_platform_info(config_db=None): """ This function is used to get the HW info helper function """ - from .multi_asic import get_num_asics + global hw_info_dict - hw_info_dict = {} + if hw_info_dict: + return hw_info_dict + + from .multi_asic import get_num_asics version_info = get_sonic_version_info() diff --git a/src/sonic-py-common/tests/device_info_test.py b/src/sonic-py-common/tests/device_info_test.py index 1256037ff560..44e0d3a5b162 100644 --- a/src/sonic-py-common/tests/device_info_test.py +++ b/src/sonic-py-common/tests/device_info_test.py @@ -52,6 +52,32 @@ 'onie_kernel_version': '4.10.11' } +SONIC_VERISON_YML = """\ +--- +build_version: 'test_branch.1-a8fbac59d' +debian_version: '11.4' +kernel_version: '5.10.0-12-2-amd64' +asic_type: mellanox +asic_subtype: 'mellanox' +commit_id: 'a8fbac59d' +branch: 'test_branch' +release: 'master' +libswsscommon: 1.0.0 +sonic_utilities: 1.2""" + +SONIC_VERISON_YML_RESULT = { + 'build_version': 'test_branch.1-a8fbac59d', + 'debian_version': '11.4', + 'kernel_version': '5.10.0-12-2-amd64', + 'asic_type': 'mellanox', + 'asic_subtype': 'mellanox', + 'commit_id': 'a8fbac59d', + 'branch': 'test_branch', + 'release': 'master', + 'libswsscommon': '1.0.0', + 'sonic_utilities': 1.2 +} + class TestDeviceInfo(object): @pytest.fixture(scope="class", autouse=True) def sanitize_environment(self): @@ -83,6 +109,59 @@ def test_get_chassis_info(self): "revision": SonicV2Connector.TEST_REV} assert result == truth + @mock.patch("os.path.isfile") + def test_get_sonic_version(self, mock_isfile): + mock_isfile.return_value = True + open_mocked = mock.mock_open(read_data=SONIC_VERISON_YML) + with mock.patch("{}.open".format(BUILTINS), open_mocked): + for _ in range(0,5): + assert device_info.get_sonic_version_info() == SONIC_VERISON_YML_RESULT + # Assert the file was read only once + open_mocked.assert_called_once_with(device_info.SONIC_VERSION_YAML_PATH) + + @mock.patch("sonic_py_common.device_info.get_platform_info") + def test_is_chassis(self, mock_platform_info): + mock_platform_info.return_value = {"switch_type": "npu"} + assert device_info.is_chassis() == False + assert device_info.is_voq_chassis() == False + assert device_info.is_packet_chassis() == False + + mock_platform_info.return_value = {"switch_type": "voq"} + assert device_info.is_voq_chassis() == True + assert device_info.is_packet_chassis() == False + assert device_info.is_chassis() == True + + mock_platform_info.return_value = {"switch_type": "chassis-packet"} + assert device_info.is_voq_chassis() == False + assert device_info.is_packet_chassis() == True + assert device_info.is_chassis() == True + + mock_platform_info.return_value = {} + assert device_info.is_voq_chassis() == False + assert device_info.is_packet_chassis() == False + assert device_info.is_chassis() == False + + @mock.patch("sonic_py_common.device_info.ConfigDBConnector", autospec=True) + @mock.patch("sonic_py_common.device_info.get_sonic_version_info") + @mock.patch("sonic_py_common.device_info.get_machine_info") + @mock.patch("sonic_py_common.device_info.get_hwsku") + def test_get_platform_info(self, mock_hwsku, mock_machine_info, mock_sonic_ver, mock_cfg_db): + mock_cfg_inst = mock_cfg_db.return_value + mock_cfg_inst.get_table.return_value = {"localhost": {"switch_type": "npu"}} + mock_sonic_ver.return_value = SONIC_VERISON_YML_RESULT + mock_machine_info.return_value = {"onie_platform" : "x86_64-mlnx_msn2700-r0"} + mock_hwsku.return_value = "Mellanox-SN2700" + for _ in range(0,5): + hw_info_dict = device_info.get_platform_info() + assert hw_info_dict["asic_type"] == "mellanox" + assert hw_info_dict["platform"] == "x86_64-mlnx_msn2700-r0" + assert hw_info_dict["hwsku"] == "Mellanox-SN2700" + assert hw_info_dict["switch_type"] == "npu" + assert mock_sonic_ver.called_once() + assert mock_machine_info.called_once() + assert mock_hwsku.called_once() + mock_cfg_inst.get_table.assert_called_once_with("DEVICE_METADATA") + @classmethod def teardown_class(cls): print("TEARDOWN") From 6462f454330921c68386cd4e4b5f3cacbc3564bb Mon Sep 17 00:00:00 2001 From: Yakiv Huryk <62013282+Yakiv-Huryk@users.noreply.github.com> Date: Wed, 24 Aug 2022 11:53:54 +0300 Subject: [PATCH 700/817] [bullseye] add dependencies for saithriftv2 build (#11666) - Why I did it To support saithriftv2 build for bullseye dockers - How I did it Added the dependencies documented in the SAI docs and used in sonic-slave-buster - How to verify it Build saithriftv2 in the sonic-slave-bullseye Signed-off-by: Yakiv Huryk --- sonic-slave-bullseye/Dockerfile.j2 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sonic-slave-bullseye/Dockerfile.j2 b/sonic-slave-bullseye/Dockerfile.j2 index e3169f888205..1ffca8bc86c1 100644 --- a/sonic-slave-bullseye/Dockerfile.j2 +++ b/sonic-slave-bullseye/Dockerfile.j2 @@ -176,6 +176,13 @@ RUN apt-get update && apt-get install -y \ libxml-simple-perl \ graphviz \ aspell \ +# For SAI meta rpc build - make rpc + libgetopt-long-descriptive-perl \ + libconst-fast-perl \ + libtemplate-perl \ + libnamespace-autoclean-perl \ + libmoose-perl \ + libmoosex-aliases-perl \ # For linux build bc \ fakeroot \ From f3c1c14d22b345a1bdde844b0957aec0dbe78a90 Mon Sep 17 00:00:00 2001 From: Vivek Date: Wed, 24 Aug 2022 01:55:33 -0700 Subject: [PATCH 701/817] [Mellanox] [4700] Update platform capability file to support new breakout mode (#11614) - Why I did it This new breakout mode is required when a QSFP cable is used on the QSFP-DD supported 4700 port. since QSFP only uses the first 4 lanes, this mode is required to restrict the child ports to only use the first four lanes - How I did it Updated the platfrom.json file with the extended data - How to verify it Tested on one port: root@msn-4700:/home/admin# show int status Interface Lanes Speed MTU FEC Alias Vlan Oper Admin Type Asym PFC ----------- ------------------------------- ------- ----- ----- ------- ------ ------ ------- ----------------------------------------------- ---------- Ethernet0 0 25G 9100 N/A etp1a routed up up QSFP28 or later N/A Ethernet1 1 25G 9100 N/A etp1b routed down up N/A N/A Ethernet2 2 25G 9100 N/A etp1c routed down up N/A N/A Ethernet3 3 25G 9100 N/A etp1d routed down up N/A N/A Signed-off-by: Vivek Reddy Karri --- .../x86_64-mlnx_msn4700-r0/platform.json | 98 ++++++++++++------- 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/platform.json b/device/mellanox/x86_64-mlnx_msn4700-r0/platform.json index 58fd5d08c6e1..49211914ec54 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/platform.json @@ -413,7 +413,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp1"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp1a", "etp1b"], - "4x100G[50G,25G,10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"] + "4x100G[50G,25G,10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"], + "4x25G(4)[10G,1G]": ["etp1a", "etp1b", "etp1c", "etp1d"] } }, "Ethernet8": { @@ -422,7 +423,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp2"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp2a", "etp2b"], - "4x100G[50G,25G,10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"] + "4x100G[50G,25G,10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"], + "4x25G(4)[10G,1G]": ["etp2a", "etp2b", "etp2c", "etp2d"] } }, "Ethernet16": { @@ -431,7 +433,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp3"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp3a", "etp3b"], - "4x100G[50G,25G,10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"] + "4x100G[50G,25G,10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"], + "4x25G(4)[10G,1G]": ["etp3a", "etp3b", "etp3c", "etp3d"] } }, "Ethernet24": { @@ -440,7 +443,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp4"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp4a", "etp4b"], - "4x100G[50G,25G,10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"] + "4x100G[50G,25G,10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"], + "4x25G(4)[10G,1G]": ["etp4a", "etp4b", "etp4c", "etp4d"] } }, "Ethernet32": { @@ -449,7 +453,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp5"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp5a", "etp5b"], - "4x100G[50G,25G,10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"] + "4x100G[50G,25G,10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"], + "4x25G(4)[10G,1G]": ["etp5a", "etp5b", "etp5c", "etp5d"] } }, "Ethernet40": { @@ -458,7 +463,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp6"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp6a", "etp6b"], - "4x100G[50G,25G,10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"] + "4x100G[50G,25G,10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"], + "4x25G(4)[10G,1G]": ["etp6a", "etp6b", "etp6c", "etp6d"] } }, "Ethernet48": { @@ -467,7 +473,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp7"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp7a", "etp7b"], - "4x100G[50G,25G,10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"] + "4x100G[50G,25G,10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"], + "4x25G(4)[10G,1G]": ["etp7a", "etp7b", "etp7c", "etp7d"] } }, "Ethernet56": { @@ -476,7 +483,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp8"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp8a", "etp8b"], - "4x100G[50G,25G,10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"] + "4x100G[50G,25G,10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"], + "4x25G(4)[10G,1G]": ["etp8a", "etp8b", "etp8c", "etp8d"] } }, "Ethernet64": { @@ -485,7 +493,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp9"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp9a", "etp9b"], - "4x100G[50G,25G,10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"] + "4x100G[50G,25G,10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"], + "4x25G(4)[10G,1G]": ["etp9a", "etp9b", "etp9c", "etp9d"] } }, "Ethernet72": { @@ -494,16 +503,18 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp10"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp10a", "etp10b"], - "4x100G[50G,25G,10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"] + "4x100G[50G,25G,10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"], + "4x25G(4)[10G,1G]": ["etp10a", "etp10b", "etp10c", "etp10d"] } - }, + }, "Ethernet80": { "index": "11,11,11,11,11,11,11,11", "lanes": "80,81,82,83,84,85,86,87", "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp11"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp11a", "etp11b"], - "4x100G[50G,25G,10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"] + "4x100G[50G,25G,10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"], + "4x25G(4)[10G,1G]": ["etp11a", "etp11b", "etp11c", "etp11d"] } }, "Ethernet88": { @@ -512,7 +523,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp12"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp12a", "etp12b"], - "4x100G[50G,25G,10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"] + "4x100G[50G,25G,10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"], + "4x25G(4)[10G,1G]": ["etp12a", "etp12b", "etp12c", "etp12d"] } }, "Ethernet96": { @@ -521,7 +533,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp13"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp13a", "etp13b"], - "4x100G[50G,25G,10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"] + "4x100G[50G,25G,10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"], + "4x25G(4)[10G,1G]": ["etp13a", "etp13b", "etp13c", "etp13d"] } }, "Ethernet104": { @@ -530,7 +543,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp14"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp14a", "etp14b"], - "4x100G[50G,25G,10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"] + "4x100G[50G,25G,10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"], + "4x25G(4)[10G,1G]": ["etp14a", "etp14b", "etp14c", "etp14d"] } }, "Ethernet112": { @@ -539,7 +553,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp15"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp15a", "etp15b"], - "4x100G[50G,25G,10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"] + "4x100G[50G,25G,10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"], + "4x25G(4)[10G,1G]": ["etp15a", "etp15b", "etp15c", "etp15d"] } }, "Ethernet120": { @@ -548,7 +563,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp16"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp16a", "etp16b"], - "4x100G[50G,25G,10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"] + "4x100G[50G,25G,10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"], + "4x25G(4)[10G,1G]": ["etp16a", "etp16b", "etp16c", "etp16d"] } }, "Ethernet128": { @@ -557,7 +573,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp17"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp17a", "etp17b"], - "4x100G[50G,25G,10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"] + "4x100G[50G,25G,10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"], + "4x25G(4)[10G,1G]": ["etp17a", "etp17b", "etp17c", "etp17d"] } }, "Ethernet136": { @@ -566,7 +583,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp18"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp18a", "etp18b"], - "4x100G[50G,25G,10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"] + "4x100G[50G,25G,10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"], + "4x25G(4)[10G,1G]": ["etp18a", "etp18b", "etp18c", "etp18d"] } }, "Ethernet144": { @@ -575,7 +593,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp19"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp19a", "etp19b"], - "4x100G[50G,25G,10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"] + "4x100G[50G,25G,10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"], + "4x25G(4)[10G,1G]": ["etp19a", "etp19b", "etp19c", "etp19d"] } }, "Ethernet152": { @@ -584,7 +603,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp20"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp20a", "etp20b"], - "4x100G[50G,25G,10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"] + "4x100G[50G,25G,10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"], + "4x25G(4)[10G,1G]": ["etp20a", "etp20b", "etp20c", "etp20d"] } }, "Ethernet160": { @@ -593,7 +613,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp21"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp21a", "etp21b"], - "4x100G[50G,25G,10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"] + "4x100G[50G,25G,10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"], + "4x25G(4)[10G,1G]": ["etp21a", "etp21b", "etp21c", "etp21d"] } }, "Ethernet168": { @@ -602,7 +623,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp22"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp22a", "etp22b"], - "4x100G[50G,25G,10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"] + "4x100G[50G,25G,10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"], + "4x25G(4)[10G,1G]": ["etp22a", "etp22b", "etp22c", "etp22d"] } }, "Ethernet176": { @@ -611,7 +633,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp23"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp23a", "etp23b"], - "4x100G[50G,25G,10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"] + "4x100G[50G,25G,10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"], + "4x25G(4)[10G,1G]": ["etp23a", "etp23b", "etp23c", "etp23d"] } }, "Ethernet184": { @@ -620,7 +643,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp24"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp24a", "etp24b"], - "4x100G[50G,25G,10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"] + "4x100G[50G,25G,10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"], + "4x25G(4)[10G,1G]": ["etp24a", "etp24b", "etp24c", "etp24d"] } }, "Ethernet192": { @@ -629,7 +653,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp25"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp25a", "etp25b"], - "4x100G[50G,25G,10G,1G]": ["etp25a", "etp25b", "etp25c", "etp25d"] + "4x100G[50G,25G,10G,1G]": ["etp25a", "etp25b", "etp25c", "etp25d"], + "4x25G(4)[10G,1G]": ["etp25a", "etp25b", "etp25c", "etp25d"] } }, "Ethernet200": { @@ -638,7 +663,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp26"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp26a", "etp26b"], - "4x100G[50G,25G,10G,1G]": ["etp26a", "etp26b", "etp26c", "etp26d"] + "4x100G[50G,25G,10G,1G]": ["etp26a", "etp26b", "etp26c", "etp26d"], + "4x25G(4)[10G,1G]": ["etp26a", "etp26b", "etp26c", "etp26d"] } }, "Ethernet208": { @@ -647,7 +673,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp27"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp27a", "etp27b"], - "4x100G[50G,25G,10G,1G]": ["etp27a", "etp27b", "etp27c", "etp27d"] + "4x100G[50G,25G,10G,1G]": ["etp27a", "etp27b", "etp27c", "etp27d"], + "4x25G(4)[10G,1G]": ["etp27a", "etp27b", "etp27c", "etp27d"] } }, "Ethernet216": { @@ -656,7 +683,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp28"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp28a", "etp28b"], - "4x100G[50G,25G,10G,1G]": ["etp28a", "etp28b", "etp28c", "etp28d"] + "4x100G[50G,25G,10G,1G]": ["etp28a", "etp28b", "etp28c", "etp28d"], + "4x25G(4)[10G,1G]": ["etp28a", "etp28b", "etp28c", "etp28d"] } }, "Ethernet224": { @@ -665,7 +693,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp29"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp29a", "etp29b"], - "4x100G[50G,25G,10G,1G]": ["etp29a", "etp29b", "etp29c", "etp29d"] + "4x100G[50G,25G,10G,1G]": ["etp29a", "etp29b", "etp29c", "etp29d"], + "4x25G(4)[10G,1G]": ["etp29a", "etp29b", "etp29c", "etp29d"] } }, "Ethernet232": { @@ -674,7 +703,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp30"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp30a", "etp30b"], - "4x100G[50G,25G,10G,1G]": ["etp30a", "etp30b", "etp30c", "etp30d"] + "4x100G[50G,25G,10G,1G]": ["etp30a", "etp30b", "etp30c", "etp30d"], + "4x25G(4)[10G,1G]": ["etp30a", "etp30b", "etp30c", "etp30d"] } }, "Ethernet240": { @@ -683,7 +713,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp31"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp31a", "etp31b"], - "4x100G[50G,25G,10G,1G]": ["etp31a", "etp31b", "etp31c", "etp31d"] + "4x100G[50G,25G,10G,1G]": ["etp31a", "etp31b", "etp31c", "etp31d"], + "4x25G(4)[10G,1G]": ["etp31a", "etp31b", "etp31c", "etp31d"] } }, "Ethernet248": { @@ -692,7 +723,8 @@ "breakout_modes": { "1x400G[200G,100G,50G,40G,25G,10G,1G]": ["etp32"], "2x200G[100G,50G,40G,25G,10G,1G]": ["etp32a", "etp32b"], - "4x100G[50G,25G,10G,1G]": ["etp32a", "etp32b", "etp32c", "etp32d"] + "4x100G[50G,25G,10G,1G]": ["etp32a", "etp32b", "etp32c", "etp32d"], + "4x25G(4)[10G,1G]": ["etp32a", "etp32b", "etp32c", "etp32d"] } } } From adffbd4643f721dae7d523ff84ebd72025b28ddc Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Wed, 24 Aug 2022 11:42:15 -0700 Subject: [PATCH 702/817] Build the Broadcom DNX RPC container as part of the official build (#11829) With the Broadcom syncd containers getting upgraded to Bullseye, the DNX RPC container is no longer automatically built. Explicitly add a make command to build it. Signed-off-by: Saikrishna Arcot Signed-off-by: Saikrishna Arcot --- .azure-pipelines/azure-pipelines-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 1b7d6225ac56..e8e74e8d1882 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -139,6 +139,9 @@ jobs: fi if [ $(docker_syncd_rpc_image) == yes ]; then make $BUILD_OPTIONS ENABLE_SYNCD_RPC=y target/docker-syncd-$(platform_rpc)-rpc.gz + if [ $(GROUP_NAME) == broadcom ]; then + make $BUILD_OPTIONS ENABLE_SYNCD_RPC=y target/docker-syncd-$(platform_rpc)-dnx-rpc.gz + fi fi if [ $(syncd_rpc_image) == yes ]; then make $BUILD_OPTIONS ENABLE_SYNCD_RPC=y target/sonic-$(GROUP_NAME).bin From e7405738925f8cd8a5faf1976cf04719deea6ced Mon Sep 17 00:00:00 2001 From: rajendra-dendukuri <47423477+rajendra-dendukuri@users.noreply.github.com> Date: Wed, 24 Aug 2022 19:42:01 -0400 Subject: [PATCH 703/817] Fix TARGET_BOOTLOADER variable assignment (#11722) - Pass TARGET_BOOTLOADER variable value to slave build infra #### Why I did it The TARGET_BOOTLOADER is always blank when referred to in the Makefiles which are executed inside the slave build container. #### How I did it Pass it on the make command invoking slave.mk explicitly similar to other environment variables. #### How to verify it kdump-tools package is installed on sonic-broadcom.bin image. --- Makefile.work | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.work b/Makefile.work index 3f64531ab11c..139d15ed2f59 100644 --- a/Makefile.work +++ b/Makefile.work @@ -354,6 +354,7 @@ SONIC_BUILD_INSTRUCTION := make \ PLATFORM=$(PLATFORM) \ PLATFORM_ARCH=$(PLATFORM_ARCH) \ MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ + TARGET_BOOTLOADER=$(TARGET_BOOTLOADER) \ CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ BUILD_NUMBER=$(BUILD_NUMBER) \ BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \ From 214e394ac01c411b5aac228c14a30fdbe3f73ad5 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 25 Aug 2022 08:35:51 +0800 Subject: [PATCH 704/817] Remove swsssdk from rules and image. (#11469) #### Why I did it To deprecate swsssdk, remove all dependency to it. #### How I did it Remove swsssdk from rules and build image scripts. #### How to verify it Pass all UT and E2E test case #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Remove swsssdk from rules and build image scripts. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- files/image_config/monit/container_checker | 3 +-- files/scripts/supervisor-proc-exit-listener | 4 ++-- rules/asyncsnmp-py3.mk | 2 +- rules/dbsyncd-py3.mk | 2 +- rules/docker-config-engine-bullseye.mk | 1 - rules/docker-config-engine-buster.mk | 1 - rules/docker-config-engine-stretch.mk | 1 - rules/docker-config-engine.mk | 1 - rules/docker-platform-monitor.mk | 1 - rules/docker-snmp.mk | 3 ++- rules/sonic-host-services.mk | 3 +-- rules/sonic-utilities.mk | 1 - rules/sonic-ztp.mk | 3 ++- 13 files changed, 10 insertions(+), 16 deletions(-) diff --git a/files/image_config/monit/container_checker b/files/image_config/monit/container_checker index c6271d26c8b1..0958368559ad 100755 --- a/files/image_config/monit/container_checker +++ b/files/image_config/monit/container_checker @@ -19,7 +19,6 @@ check program container_checker with path "/usr/bin/container_checker" import docker import sys -import swsssdk from sonic_py_common import multi_asic, device_info from swsscommon import swsscommon @@ -34,7 +33,7 @@ def get_expected_running_containers(): @return: A set which contains the expected running containers and a set that has containers marked as "always_enabled". """ - config_db = swsssdk.ConfigDBConnector() + config_db = swsscommon.ConfigDBConnector() config_db.connect() feature_table = config_db.get_table("FEATURE") diff --git a/files/scripts/supervisor-proc-exit-listener b/files/scripts/supervisor-proc-exit-listener index 7bf3059b5e9a..a17ffb7e45fa 100755 --- a/files/scripts/supervisor-proc-exit-listener +++ b/files/scripts/supervisor-proc-exit-listener @@ -10,7 +10,7 @@ import syslog import time from collections import defaultdict -import swsssdk +from swsscommon import swsscommon from supervisor import childutils @@ -87,7 +87,7 @@ def get_autorestart_state(container_name): @summary: Read the status of auto-restart feature from Config_DB. @return: Return the status of auto-restart feature. """ - config_db = swsssdk.ConfigDBConnector() + config_db = swsscommon.ConfigDBConnector() config_db.connect() features_table = config_db.get_table(FEATURE_TABLE_NAME) if not features_table: diff --git a/rules/asyncsnmp-py3.mk b/rules/asyncsnmp-py3.mk index 2592eb004ee8..60e83140374e 100644 --- a/rules/asyncsnmp-py3.mk +++ b/rules/asyncsnmp-py3.mk @@ -4,6 +4,6 @@ ASYNCSNMP_PY3 = asyncsnmp-2.1.0-py3-none-any.whl $(ASYNCSNMP_PY3)_SRC_PATH = $(SRC_PATH)/sonic-snmpagent $(ASYNCSNMP_PY3)_PYTHON_VERSION = 3 # Depends on sonic-platform-common so it is possible to import sonic_psu -$(ASYNCSNMP_PY3)_DEPENDS += $(SWSSSDK_PY3) $(SONIC_PLATFORM_COMMON_PY3) +$(ASYNCSNMP_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(ASYNCSNMP_PY3)_DEBS_DEPENDS += $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) SONIC_PYTHON_WHEELS += $(ASYNCSNMP_PY3) diff --git a/rules/dbsyncd-py3.mk b/rules/dbsyncd-py3.mk index 12cf13cafe3b..5d05b8829920 100644 --- a/rules/dbsyncd-py3.mk +++ b/rules/dbsyncd-py3.mk @@ -3,6 +3,6 @@ DBSYNCD_PY3 = sonic_d-2.0.0-py3-none-any.whl $(DBSYNCD_PY3)_SRC_PATH = $(SRC_PATH)/sonic-dbsyncd $(DBSYNCD_PY3)_PYTHON_VERSION = 3 -$(DBSYNCD_PY3)_DEPENDS += $(SWSSSDK_PY3) +$(DBSYNCD_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) $(DBSYNCD_PY3)_DEBS_DEPENDS += $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) SONIC_PYTHON_WHEELS += $(DBSYNCD_PY3) diff --git a/rules/docker-config-engine-bullseye.mk b/rules/docker-config-engine-bullseye.mk index 0c4aad67a8d7..c125aa65b209 100644 --- a/rules/docker-config-engine-bullseye.mk +++ b/rules/docker-config-engine-bullseye.mk @@ -9,7 +9,6 @@ $(DOCKER_CONFIG_ENGINE_BULLSEYE)_DEPENDS += $(LIBSWSSCOMMON) \ $(LIBYANG_PY3) \ $(PYTHON3_SWSSCOMMON) \ $(SONIC_DB_CLI) -$(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SWSSSDK_PY3) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ $(SONIC_YANG_MODELS_PY3) diff --git a/rules/docker-config-engine-buster.mk b/rules/docker-config-engine-buster.mk index 079fc6dd074c..ae5589a59595 100644 --- a/rules/docker-config-engine-buster.mk +++ b/rules/docker-config-engine-buster.mk @@ -9,7 +9,6 @@ $(DOCKER_CONFIG_ENGINE_BUSTER)_DEPENDS += $(LIBSWSSCOMMON) \ $(LIBYANG_PY3) \ $(PYTHON3_SWSSCOMMON) \ $(SONIC_DB_CLI) -$(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SWSSSDK_PY3) $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ $(SONIC_YANG_MODELS_PY3) diff --git a/rules/docker-config-engine-stretch.mk b/rules/docker-config-engine-stretch.mk index 8644102abed3..dfceb7ecdb63 100644 --- a/rules/docker-config-engine-stretch.mk +++ b/rules/docker-config-engine-stretch.mk @@ -5,7 +5,6 @@ $(DOCKER_CONFIG_ENGINE_STRETCH)_PATH = $(DOCKERS_PATH)/docker-config-engine-stre $(DOCKER_CONFIG_ENGINE_STRETCH)_DEPENDS += $(LIBSWSSCOMMON) \ $(PYTHON_SWSSCOMMON) \ $(SONIC_DB_CLI) -$(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY2) $(DOCKER_CONFIG_ENGINE_STRETCH)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY2) $(DOCKER_CONFIG_ENGINE_STRETCH)_LOAD_DOCKERS += $(DOCKER_BASE_STRETCH) diff --git a/rules/docker-config-engine.mk b/rules/docker-config-engine.mk index 3923a970b4d6..bdb96984bd06 100644 --- a/rules/docker-config-engine.mk +++ b/rules/docker-config-engine.mk @@ -4,7 +4,6 @@ DOCKER_CONFIG_ENGINE = docker-config-engine.gz $(DOCKER_CONFIG_ENGINE)_PATH = $(DOCKERS_PATH)/docker-config-engine $(DOCKER_CONFIG_ENGINE)_DEPENDS += $(LIBSWSSCOMMON) \ $(SONIC_DB_CLI) -$(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY2) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY2) $(DOCKER_CONFIG_ENGINE)_LOAD_DOCKERS += $(DOCKER_BASE) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index cb9be990e61b..5c3c760f192e 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -10,7 +10,6 @@ $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(LIBSENSORS) $(LM_SENSORS) $(FANCONTROL) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY3) -$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SWSSSDK_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_PLATFORM_API_PY3) diff --git a/rules/docker-snmp.mk b/rules/docker-snmp.mk index e0f7719c6034..313b233a8557 100644 --- a/rules/docker-snmp.mk +++ b/rules/docker-snmp.mk @@ -11,10 +11,11 @@ $(DOCKER_SNMP)_DEPENDS += $(SNMP) $(SNMPD) $(DOCKER_SNMP)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) $(DOCKER_SNMP)_DBG_DEPENDS += $(SNMP_DBG) $(SNMPD_DBG) $(LIBSNMP_DBG) +$(DOCKER_SNMP)_DBG_DEPENDS += $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) $(DOCKER_SNMP)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) -$(DOCKER_SNMP)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SWSSSDK_PY3) $(ASYNCSNMP_PY3) +$(DOCKER_SNMP)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(ASYNCSNMP_PY3) $(DOCKER_SNMP)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) $(DOCKER_SNMP)_VERSION = 1.0.0 diff --git a/rules/sonic-host-services.mk b/rules/sonic-host-services.mk index 87463d2ba8cc..eeb931ce5666 100644 --- a/rules/sonic-host-services.mk +++ b/rules/sonic-host-services.mk @@ -3,8 +3,7 @@ SONIC_HOST_SERVICES_PY3 = sonic_host_services-1.0-py3-none-any.whl $(SONIC_HOST_SERVICES_PY3)_SRC_PATH = $(SRC_PATH)/sonic-host-services $(SONIC_HOST_SERVICES_PY3)_PYTHON_VERSION = 3 -$(SONIC_HOST_SERVICES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) \ - $(SWSSSDK_PY3) +$(SONIC_HOST_SERVICES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) $(SONIC_HOST_SERVICES_PY3)_DEBS_DEPENDS = $(LIBSWSSCOMMON) \ $(PYTHON3_SWSSCOMMON) SONIC_PYTHON_WHEELS += $(SONIC_HOST_SERVICES_PY3) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 519f633cc772..9c59ebab4858 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -8,7 +8,6 @@ $(SONIC_UTILITIES_PY3)_PYTHON_VERSION = 3 $(SONIC_UTILITIES_PY3)_NAME = $(SONIC_UTILITIES_PY3_NAME) $(SONIC_UTILITIES_PY3)_VERSION = $(SONIC_UTILITIES_PY3_VERSION) $(SONIC_UTILITIES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) \ - $(SWSSSDK_PY3) \ $(SONIC_CONFIG_ENGINE_PY3) \ $(SONIC_PLATFORM_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ diff --git a/rules/sonic-ztp.mk b/rules/sonic-ztp.mk index 0c4819ec6004..a4bcc5e285fa 100644 --- a/rules/sonic-ztp.mk +++ b/rules/sonic-ztp.mk @@ -5,7 +5,8 @@ SONIC_ZTP_VERSION = 1.0.0 SONIC_ZTP = sonic-ztp_$(SONIC_ZTP_VERSION)_all.deb $(SONIC_ZTP)_SRC_PATH = $(SRC_PATH)/sonic-ztp -$(SONIC_ZTP)_WHEEL_DEPENDS += $(SWSSSDK_PY3) +$(SONIC_ZTP)_PYTHON_VERSION = 3 +$(SONIC_ZTP)_DEBS_DEPENDS += $(LIBSWSSCOMMON) $(PYTHON3_SWSSCOMMON) SONIC_DPKG_DEBS += $(SONIC_ZTP) export SONIC_ZTP_VERSION From 30e79a1a3f0276d08893e6c0a3fe26b2b71f7ac0 Mon Sep 17 00:00:00 2001 From: Sangita Maity Date: Thu, 25 Aug 2022 00:24:53 -0700 Subject: [PATCH 705/817] [snmpd] Fixed snmpd memory leak issue (#11812) #### Why I did it This fixed memory leak in ETHERLIKE-MIB. The fix is not part of net-snmp(5.7.3 version). This PR includes the patch to fix memory leak issue. ``` ke->name in stdup-ed at line 297: n->name = strdup(RTA_DATA(tb[IFLA_IFNAME])); ``` #### How I did it patched the fix. [net-snmp] upstream fix link -> [snmpd}upstream link](https://github.com/net-snmp/net-snmp/commit/ed4e48b5fab165d1ba4c431e31e543f808a2c25f) #### How to verify it **Before The fix** used valgrind to find memory leak. ``` root@lnos-x1-a-csw06:/# grep "definitely lost" valgrind-out.txt ==493== 4 bytes in 1 blocks are definitely lost in loss record 1 of 333 ==493== 16 bytes in 1 blocks are definitely lost in loss record 25 of 333 ==493== 757 bytes in 71 blocks are definitely lost in loss record 214 of 333 ==493== 1,168 (32 direct, 1,136 indirect) bytes in 1 blocks are definitely lost in loss record 293 of 333 ==493== 1,168 (32 direct, 1,136 indirect) bytes in 1 blocks are definitely lost in loss record 294 of 333 ==493== 1,168 (32 direct, 1,136 indirect) bytes in 1 blocks are definitely lost in loss record 295 of 333 ==493== 1,168 (32 direct, 1,136 indirect) bytes in 1 blocks are definitely lost in loss record 296 of 333 ==493== definitely lost: 905 bytes in 77 blocks ``` _we can see the memory leak see in stack trace._ -> dot3stats_linux -> get_nlmsg -> strdup https://github.com/net-snmp/net-snmp/blob/v5.7.3/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c https://github.com/net-snmp/net-snmp/blob/v5.7.3/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c#L277 ``` n = malloc(sizeof(*n)); memset(n, 0, sizeof(*n)); n->ifindex = ifi->ifi_index; n->name = strdup(RTA_DATA(tb[IFLA_IFNAME])); memcpy(&n->stats, RTA_DATA(tb[IFLA_STATS]), sizeof(n->stats)); n->next = kern_db; kern_db = n; return 0; ``` we were not freeing space for EtherLike-MIB.AS interface mib queries were getting increased, we see memory increment. ``` kern_db = ke->next; free(ke); ``` https://github.com/net-snmp/net-snmp/blob/v5.7.3/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c#L467 ``` ==55== 757 bytes in 71 blocks are definitely lost in loss record 186 of 299 ==55== at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==55== by 0x4EB6E49: strdup (strdup.c:42) ==55== by 0x493F278: get_nlmsg (dot3stats_linux.c:299) ==55== by 0x493F529: rtnl_dump_filter_l.constprop.3 (dot3stats_linux.c:370) ==55== by 0x493FD7A: rtnl_dump_filter (dot3stats_linux.c:401) ==55== by 0x493FD7A: _dot3Stats_netlink_get_errorcntrs (dot3stats_linux.c:424) ==55== by 0x494009F: interface_dot3stats_get_errorcounters (dot3stats_linux.c:530) ==55== by 0x48F6FDA: dot3StatsTable_container_load (dot3StatsTable_data_access.c:330) ==55== by 0x485E76B: _cache_load (cache_handler.c:700) ==55== by 0x485FA37: netsnmp_cache_helper_handler (cache_handler.c:638) ==55== by 0x48720BC: netsnmp_call_handler (agent_handler.c:526) ==55== by 0x48720BC: netsnmp_call_next_handler (agent_handler.c:640) ==55== by 0x4865F75: table_helper_handler (table.c:717) ==55== by 0x4871B66: netsnmp_call_handler (agent_handler.c:526) ==55== by 0x4871B66: netsnmp_call_handlers (agent_handler.c:611) 757 bytes in 71 blocks are definitely lost in loss record 214 of 333 ==493== at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==493== by 0x4EB6E49: strdup (strdup.c:42) ==493== by 0x493F278: ??? (in /usr/lib/x86_64-linux-gnu/libnetsnmpmibs.so.30.0.3) ==493== by 0x493F529: ??? (in /usr/lib/x86_64-linux-gnu/libnetsnmpmibs.so.30.0.3) ==493== by 0x493FD7A: _dot3Stats_netlink_get_errorcntrs (in /usr/lib/x86_64-linux-gnu/libnetsnmpmibs.so.30.0.3) ==493== by 0x494009F: interface_dot3stats_get_errorcounters (in /usr/lib/x86_64-linux-gnu/libnetsnmpmibs.so.30.0.3) ==493== by 0x48F6FDA: dot3StatsTable_container_load (in /usr/lib/x86_64-linux-gnu/libnetsnmpmibs.so.30.0.3) ==493== by 0x485E76B: _cache_load (cache_handler.c:700) ==493== by 0x485FA37: netsnmp_cache_helper_handler (cache_handler.c:638) ==493== by 0x48720BC: netsnmp_call_handler (agent_handler.c:526) ==493== by 0x48720BC: netsnmp_call_next_handler (agent_handler.c:640) ==493== by 0x4865F75: table_helper_handler (table.c:717) ==493== by 0x4871B66: netsnmp_call_handler (agent_handler.c:526) ==493== by 0x4871B66: netsnmp_call_handlers (agent_handler.c:611) ``` ``` **After The fix** no memory leak in valgrind stack trace related to etherlike MIB. ``` --- .../patch-5.7.3+dfsg/0022-etherlike-mib-memleak.patch | 9 +++++++++ src/snmpd/patch-5.7.3+dfsg/series | 1 + 2 files changed, 10 insertions(+) create mode 100644 src/snmpd/patch-5.7.3+dfsg/0022-etherlike-mib-memleak.patch diff --git a/src/snmpd/patch-5.7.3+dfsg/0022-etherlike-mib-memleak.patch b/src/snmpd/patch-5.7.3+dfsg/0022-etherlike-mib-memleak.patch new file mode 100644 index 000000000000..eb921786b444 --- /dev/null +++ b/src/snmpd/patch-5.7.3+dfsg/0022-etherlike-mib-memleak.patch @@ -0,0 +1,9 @@ +--- net-snmp-5.7.3+dfsg/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c.org 2020-09-03 19:09:26.241863000 -0700 ++++ net-snmp-5.7.3+dfsg/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c 2020-09-03 19:24:27.054098000 -0700 +@@ -465,6 +465,7 @@ + done = 1; + } + kern_db = ke->next; ++ free(ke->name); + free(ke); + } diff --git a/src/snmpd/patch-5.7.3+dfsg/series b/src/snmpd/patch-5.7.3+dfsg/series index 769b2938d37a..11dabe8d1d64 100644 --- a/src/snmpd/patch-5.7.3+dfsg/series +++ b/src/snmpd/patch-5.7.3+dfsg/series @@ -4,3 +4,4 @@ 0007-Linux-VRF-5.7.3-Support.patch 0008-Enable-macro-DEB_BUILD_ARCH_OS-in-order-to-build-ipv.patch cross-compile-changes.patch +0022-etherlike-mib-memleak.patch From 83704d995544c3e80c6451512f5f3d48b227b571 Mon Sep 17 00:00:00 2001 From: ShiyanWangMS Date: Thu, 25 Aug 2022 15:55:01 +0800 Subject: [PATCH 706/817] Upgrade docker-sonic-mgmt base image from Ubuntu18.04 to 20.04 (#11831) Update base image from ubuntu18.04 to ubuntu20.04 Fix necessary dependencies. After upgrade, Py2 is 2.7.18, Py3 is 3.8.10. --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 42aaa3525a64..1275a21c5af2 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -1,5 +1,5 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} -FROM {{ prefix }}ubuntu:18.04 +FROM {{ prefix }}ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive @@ -21,8 +21,6 @@ RUN apt-get update && apt-get install -y build-essential \ psmisc \ python \ python-dev \ - python-scapy \ - python-pip \ python3-pip \ python3-venv \ rsyslog \ @@ -31,10 +29,16 @@ RUN apt-get update && apt-get install -y build-essential \ sudo \ tcpdump \ telnet \ - vim + vim \ + python-is-python2 \ + software-properties-common + +RUN add-apt-repository -y universe +RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py \ + && python2 get-pip.py RUN pip install setuptools==44.1.1 -RUN pip install cffi==1.10.0 \ +RUN pip install cffi==1.12.0 \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ "future>=0.16.0" \ @@ -96,7 +100,7 @@ RUN pip install cffi==1.10.0 \ && rm -f 1.0.0.tar.gz \ && pip install nnpy \ && pip install dpkt \ - && pip install scapy==2.4.5 --upgrade + && pip install scapy==2.4.5 --upgrade --ignore-installed # Install docker-ce-cli RUN apt-get update \ @@ -127,7 +131,7 @@ debs/{{ deb }}{{' '}} {%- endfor -%} debs/ -RUN dpkg -i \ +RUN dpkg --force-all -i \ {% for deb in docker_sonic_mgmt_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} @@ -193,8 +197,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 PYTHONIOENCODING=UTF-8 -RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 - +RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 wheel==0.33.6 RUN python3 -m pip install setuptools-rust \ aiohttp \ defusedxml \ @@ -237,7 +240,6 @@ RUN python3 -m pip install setuptools-rust \ tabulate \ textfsm==1.1.2 \ virtualenv \ - wheel==0.33.6 \ pysubnettree \ nnpy \ dpkt \ From 0cdef2ebc6a87a2ab93cb9c8aa177923622c4b90 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 25 Aug 2022 08:46:45 -0700 Subject: [PATCH 707/817] [YANG] add peer switch model (#11828) Why I did it Address issue #10966 sign-off: Jing Zhang zhangjing@microsoft.com How I did it Add sonic-peer-switch.yang and unit tests. How to verify it Compile Compile target/python-wheels/sonic_yang_mgmt-1.0-py3-none-any.whl and target/python-wheels/sonic_yang_models-1.0-py3-none-any.whl. Which release branch to backport (provide reason below if selected) 201811 201911 202006 202012 202106 202111 202205 Description for the changelog Link to config_db schema for YANG module changes https://github.com/sonic-net/sonic-buildimage/blob/b721ff87b976a6a38bdd65443ea3bc686014e783/src/sonic-yang-models/doc/Configuration.md#peer-switch --- src/sonic-yang-models/doc/Configuration.md | 142 ++++++++++-------- src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 5 + .../yang_model_tests/tests/peer-switch.json | 13 ++ .../tests_config/peer-switch.json | 39 +++++ .../yang-models/sonic-peer-switch.yang | 49 ++++++ 6 files changed, 185 insertions(+), 64 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/peer-switch.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/peer-switch.json create mode 100644 src/sonic-yang-models/yang-models/sonic-peer-switch.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 6c01344f63af..2167cab027ed 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -36,6 +36,7 @@ Table of Contents * [MAP_PFC_PRIORITY_TO_QUEUE](#map_pfc_priority_to_queue) * [NTP Global Configuration](#ntp-global-configuration) * [NTP and SYSLOG servers](#ntp-and-syslog-servers) + * [Peer Switch](#peer-switch) * [Policer](#policer) * [Port](#port) * [Port Channel](#port-channel) @@ -724,13 +725,13 @@ This kind of profiles will be handled by buffer manager and won't be applied to ### Data Plane L3 Interfaces -IP configuration for data plane are defined in **INTERFACE**, **VLAN_SUB_INTERFACE**, -**PORTCHANNEL_INTERFACE** and **VLAN_INTERFACE** table. The objects -in all four tables have the interface (could be physical port, port -channel, vlan or vlan sub interface) that IP address is attached to as first-level key, and -IP prefix as second-level key. IP interface address objects don't have any attributes. -IP interface attributes, resides in those tables as well, key is the interface name -and value is a list of field-values representing the interface attributes, e.g. loopback action. +IP configuration for data plane are defined in **INTERFACE**, **VLAN_SUB_INTERFACE**, +**PORTCHANNEL_INTERFACE** and **VLAN_INTERFACE** table. The objects +in all four tables have the interface (could be physical port, port +channel, vlan or vlan sub interface) that IP address is attached to as first-level key, and +IP prefix as second-level key. IP interface address objects don't have any attributes. +IP interface attributes, resides in those tables as well, key is the interface name +and value is a list of field-values representing the interface attributes, e.g. loopback action. ``` { @@ -738,27 +739,27 @@ and value is a list of field-values representing the interface attributes, e.g. "Ethernet0|10.0.0.0/31": {}, "Ethernet4|10.0.0.2/31": {}, "Ethernet8|10.0.0.4/31": {} - "Ethernet8": { - "loopback_action": "drop" - } + "Ethernet8": { + "loopback_action": "drop" + } }, - + "PORTCHANNEL_INTERFACE": { "PortChannel01|10.0.0.56/31": {}, "PortChannel01|FC00::71/126": {}, "PortChannel02|10.0.0.58/31": {}, "PortChannel02|FC00::75/126": {} }, - + "VLAN_INTERFACE": { "Vlan1000|192.168.0.1/27": {} - }, - -"VLAN_SUB_INTERFACE": { - "Ethernet4.1|10.0.0.2/31": {}, - "Ethernet4.1": { - "loopback_action": "drop" - } + }, + +"VLAN_SUB_INTERFACE": { + "Ethernet4.1|10.0.0.2/31": {}, + "Ethernet4.1": { + "loopback_action": "drop" + } } } ``` @@ -1114,51 +1115,64 @@ These information are configured in individual tables. Domain name or IP address of the server is used as object key. Currently there are no attributes in those objects. -***NTP server*** -``` -{ - "NTP_SERVER": { - "2.debian.pool.ntp.org": {}, - "1.debian.pool.ntp.org": {}, - "3.debian.pool.ntp.org": {}, - "0.debian.pool.ntp.org": {} - }, - - "NTP_SERVER": { - "23.92.29.245": {}, - "204.2.134.164": {} - } -} -``` - -***Syslog server*** -``` -{ - "SYSLOG_SERVER": { - "10.0.0.5": {}, - "10.0.0.6": {}, - "10.11.150.5": {} - }, - - "SYSLOG_SERVER" : { - "2.2.2.2": { - "source": "1.1.1.1", - "port": "514", - "vrf": "default" - }, - "4.4.4.4": { - "source": "3.3.3.3", - "port": "514", - "vrf": "mgmt" - }, - "2222::2222": { - "source": "1111::1111", - "port": "514", - "vrf": "Vrf-Data" - } - } -} -``` +***NTP server*** +``` +{ + "NTP_SERVER": { + "2.debian.pool.ntp.org": {}, + "1.debian.pool.ntp.org": {}, + "3.debian.pool.ntp.org": {}, + "0.debian.pool.ntp.org": {} + }, + + "NTP_SERVER": { + "23.92.29.245": {}, + "204.2.134.164": {} + } +} +``` + +***Syslog server*** +``` +{ + "SYSLOG_SERVER": { + "10.0.0.5": {}, + "10.0.0.6": {}, + "10.11.150.5": {} + }, + + "SYSLOG_SERVER" : { + "2.2.2.2": { + "source": "1.1.1.1", + "port": "514", + "vrf": "default" + }, + "4.4.4.4": { + "source": "3.3.3.3", + "port": "514", + "vrf": "mgmt" + }, + "2222::2222": { + "source": "1111::1111", + "port": "514", + "vrf": "Vrf-Data" + } + } +} +``` + +### Peer Switch + +Below is an exmaple of the peer switch table configuration. +``` +{ + "PEER_SWITCH": { + "vlab-05": { + "address_ipv4": "10.1.0.33" + } + } +} +``` ### Policer diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index ee4f7e55bca8..f5ff5b5fe5f2 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -152,6 +152,7 @@ def run(self): './yang-models/sonic-storm-control.yang', './yang-models/sonic-tc-priority-group-map.yang', './yang-models/sonic-tc-queue-map.yang', + './yang-models/sonic-peer-switch.yang', './yang-models/sonic-pfc-priority-queue-map.yang', './yang-models/sonic-pfc-priority-priority-group-map.yang', './yang-models/sonic-port-qos-map.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index db7798f31835..c7d199fa9f24 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1798,6 +1798,11 @@ } }, + "PEER_SWITCH": { + "vlab-05": { + "address_ipv4": "10.1.0.33" + } + }, "POLICER": { "everflow_static_policer": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/peer-switch.json b/src/sonic-yang-models/tests/yang_model_tests/tests/peer-switch.json new file mode 100644 index 000000000000..b8ee10dbdf9c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/peer-switch.json @@ -0,0 +1,13 @@ +{ + "PEER_SWITCH_LOAD_NORMAL": { + "desc": "Load PEER_SWITCH for dualtor device." + }, + "PEER_SWITCH_MISSING_DEVICE__NAME": { + "desc": "Load PEER_SWITCH missing PEER Device name.", + "eStrKey": "Mandatory" + }, + "PEER_SWITCH_INVALID_IP_ADDRESS": { + "desc": "Load PEER_SWITCH with invalid IPv4 Address.", + "eStrKey": "Pattern" + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/peer-switch.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/peer-switch.json new file mode 100644 index 000000000000..e3857fc392e8 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/peer-switch.json @@ -0,0 +1,39 @@ +{ + "PEER_SWITCH_LOAD_NORMAL": { + "sonic-peer-switch:sonic-peer-switch": { + "sonic-peer-switch:PEER_SWITCH": { + "PEER_SWITCH_LIST": [ + { + "peer_switch": "vlab-05", + "address_ipv4": "10.1.0.33" + } + ] + } + } + }, + + "PEER_SWITCH_MISSING_DEVICE__NAME": { + "sonic-peer-switch:sonic-peer-switch": { + "sonic-peer-switch:PEER_SWITCH": { + "PEER_SWITCH_LIST": [ + { + "address_ipv4": "10.1.0.33" + } + ] + } + } + }, + + "PEER_SWITCH_INVALID_IP_ADDRESS": { + "sonic-peer-switch:sonic-peer-switch": { + "sonic-peer-switch:PEER_SWITCH": { + "PEER_SWITCH_LIST": [ + { + "peer_switch": "vlab-05", + "address_ipv4": "10.1.0.33/32" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-peer-switch.yang b/src/sonic-yang-models/yang-models/sonic-peer-switch.yang new file mode 100644 index 000000000000..79a94c95c2c0 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-peer-switch.yang @@ -0,0 +1,49 @@ +module sonic-peer-switch { + yang-version 1.1; + namespace "http://github.com/Azure/sonic-peer-switch"; + prefix peer_switch; + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONiC DualToR peer switch data"; + + revision 2022-08-23 { + description + "Initial revision"; + } + + container sonic-peer-switch { + container PEER_SWITCH { + list PEER_SWITCH_LIST { + max-elements 1; + + key "peer_switch"; + + leaf peer_switch { + type stypes:hostname; + + description "SONiC DualToR peer host name."; + } + + leaf address_ipv4 { + type inet:ipv4-address; + + description "SONiC DualToR peer's IPv4 address."; + } + } + } + } +} From 8d06de37aea7b1c3c4206ecf1ff6b136ecf9dcd2 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Thu, 25 Aug 2022 12:39:52 -0700 Subject: [PATCH 708/817] Add support to get fabric asic namespaces list. (#11793) Why I did it VoQ chassis supervisor will have Fabric asics and the sub_role for fabric asics will be "Fabric". The fabric asics namespaces are not being returned in get_all_namespaces() and is required in caclmgrd to add right cacl to allow internal docker traffic from fabric asic namespaces. test_cacl_application fails on VoQ chassis Supervisor with the error: Failed: Missing expected iptables rules: set(['-A INPUT -s 240.127.1.1/32 -d 240.127.1.1/32 -j ACCEPT', '-A INPUT -s 240.127.1.3/32 -d 240.127.1.1/32 -j ACCEPT', '-A INPUT -s 240.127.1.2/32 -d 240.127.1.1/32 -j ACCEPT']) How I did it Update get_all_namespaces to return fabric namespaces list. How to verify it Verified on VoQ chassis. --- src/sonic-py-common/sonic_py_common/multi_asic.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index e03dc6447c90..d63c698392e4 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -13,6 +13,7 @@ ASIC_CONF_FILENAME = 'asic.conf' FRONTEND_ASIC_SUB_ROLE = 'FrontEnd' BACKEND_ASIC_SUB_ROLE = 'BackEnd' +FABRIC_ASIC_SUB_ROLE = 'Fabric' EXTERNAL_PORT = 'Ext' INTERNAL_PORT = 'Int' INBAND_PORT = 'Inb' @@ -210,6 +211,7 @@ def get_all_namespaces(): """ front_ns = [] back_ns = [] + fabric_ns = [] num_asics = get_num_asics() if is_multi_asic(): @@ -224,8 +226,10 @@ def get_all_namespaces(): front_ns.append(namespace) elif metadata['localhost']['sub_role'] == BACKEND_ASIC_SUB_ROLE: back_ns.append(namespace) + elif metadata['localhost']['sub_role'] == FABRIC_ASIC_SUB_ROLE: + fabric_ns.append(namespace) - return {'front_ns': front_ns, 'back_ns': back_ns} + return {'front_ns': front_ns, 'back_ns': back_ns, 'fabric_ns': fabric_ns} def get_namespace_list(namespace=None): From 13bd63e73a4bad961e9b32f0dec11459fd0f2958 Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 26 Aug 2022 05:37:23 +0530 Subject: [PATCH 709/817] DellEMC: S5296F Platform API 2.0 changes (#11162) Why I did it S5296F - Platform API 2.0 changes How I did it Implemented the functional API's needed for Platform API 2.0 How to verify it Used the API 2.0 test suite to validate the test cases. --- .../platform.json | 578 ++++++++++++++++++ .../pmon_daemon_control.json | 7 +- .../debian/platform-modules-s5296f.install | 1 + .../sonic-platform-modules-dell/debian/rules | 10 + .../s5296f/modules/dell_s5296f_fpga_ocores.c | 513 ++++++---------- .../s5296f/setup.py | 1 + .../s5296f/sonic_platform/__init__.py | 3 + .../s5296f/sonic_platform/chassis.py | 453 ++++++++++++++ .../s5296f/sonic_platform/component.py | 233 +++++++ .../s5296f/sonic_platform/eeprom.py | 133 ++++ .../s5296f/sonic_platform/fan.py | 214 +++++++ .../s5296f/sonic_platform/fan_drawer.py | 110 ++++ .../s5296f/sonic_platform/hwaccess.py | 1 + .../sonic_platform/media_settings_plugin.py | 13 + .../s5296f/sonic_platform/platform.py | 24 + .../s5296f/sonic_platform/psu.py | 325 ++++++++++ .../s5296f/sonic_platform/sfp.py | 367 +++++++++++ .../s5296f/sonic_platform/thermal.py | 189 ++++++ .../s5296f/sonic_platform/watchdog.py | 207 +++++++ 19 files changed, 3049 insertions(+), 333 deletions(-) create mode 100644 device/dell/x86_64-dellemc_s5296f_c3538-r0/platform.json create mode 120000 platform/broadcom/sonic-platform-modules-dell/s5296f/setup.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan_drawer.py create mode 120000 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/hwaccess.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/media_settings_plugin.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/platform.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/watchdog.py diff --git a/device/dell/x86_64-dellemc_s5296f_c3538-r0/platform.json b/device/dell/x86_64-dellemc_s5296f_c3538-r0/platform.json new file mode 100644 index 000000000000..b38f625d6270 --- /dev/null +++ b/device/dell/x86_64-dellemc_s5296f_c3538-r0/platform.json @@ -0,0 +1,578 @@ +{ + "chassis": { + "name": "S5296F-ON", + "status_led": { + "controllable": true, + "colors": ["green", "flashing green", "yellow", "flashing yellow"] + }, + "thermal_manager" : false, + "components": [ + { + "name": "BIOS" + }, + { + "name": "FPGA" + }, + { + "name": "BMC" + }, + { + "name": "System CPLD" + }, + { + "name": "Secondary CPLD 1" + }, + { + "name": "Secondary CPLD 2" + }, + { + "name": "Secondary CPLD 3" + }, + { + "name": "Secondary CPLD 4" + } + ], + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ], + "fan_drawers":[ + { + "name": "FanTray1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray1-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray2-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray3", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray3-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "FanTray4", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FanTray4-Fan1", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU1", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "PSU2", + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2 Fan", + "speed": { + "controllable": false + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "ASIC On-board", + "controllable": false, + "low-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "CPU On-board", + "controllable": false, + "low-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "Inlet Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU1 Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU1 Sensor", + "controllable": false, + "low-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU2 Airflow Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PSU2 Sensor", + "controllable": false, + "low-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PT Left Sensor", + "controllable": false, + "low-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PT Middle Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + }, + { + "name": "PT Right Sensor", + "controllable": false, + "low-crit-threshold": false, + "high-threshold": false, + "high-crit-threshold": false, + "minimum-recorded": false, + "maximum-recorded": false + } + ], + "modules": [], + "sfps": [ + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "SFP/SFP+/SFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + }, + { + "name": "QSFP28" + } + ] + }, + "interfaces": {} +} diff --git a/device/dell/x86_64-dellemc_s5296f_c3538-r0/pmon_daemon_control.json b/device/dell/x86_64-dellemc_s5296f_c3538-r0/pmon_daemon_control.json index 72ef3c2210a2..94592fa8cebc 100644 --- a/device/dell/x86_64-dellemc_s5296f_c3538-r0/pmon_daemon_control.json +++ b/device/dell/x86_64-dellemc_s5296f_c3538-r0/pmon_daemon_control.json @@ -1,8 +1,3 @@ { - "skip_sensors": true, - "skip_fancontrol": true, - "skip_ledd": true, - "skip_psud": true, - "skip_syseepromd": true, - "skip_thermalctld": true + "skip_ledd": true } diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s5296f.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s5296f.install index 497554a476c1..f102aa9e318a 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s5296f.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s5296f.install @@ -4,6 +4,7 @@ s5296f/scripts/sensors usr/bin s5296f/scripts/pcisysfs.py usr/bin s5296f/cfg/s5296f-modules.conf etc/modules-load.d s5296f/systemd/platform-modules-s5296f.service etc/systemd/system +s5296f/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dellemc_s5296f_c3538-r0 common/platform_reboot usr/share/sonic/device/x86_64-dellemc_s5296f_c3538-r0 common/fw-updater usr/local/bin common/onie_mode_set usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/rules b/platform/broadcom/sonic-platform-modules-dell/debian/rules index 421057fdac33..871bab3a46b0 100755 --- a/platform/broadcom/sonic-platform-modules-dell/debian/rules +++ b/platform/broadcom/sonic-platform-modules-dell/debian/rules @@ -55,6 +55,11 @@ override_dh_auto_build: cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ cd $(MOD_SRC_DIR); \ + elif [ $$mod = "s5296f" ]; then \ + cp $(COMMON_DIR)/ipmihelper.py $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ elif [ $$mod = "n3248te" ]; then \ cd $(MOD_SRC_DIR)/$${mod}; \ python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ @@ -143,6 +148,11 @@ override_dh_clean: rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ + elif [ $$mod = "s5296f" ]; then \ + rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ + rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \ elif [ $$mod = "z9332f" ]; then \ rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \ rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \ diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/modules/dell_s5296f_fpga_ocores.c b/platform/broadcom/sonic-platform-modules-dell/s5296f/modules/dell_s5296f_fpga_ocores.c index 0673d6e9d0ac..d2bb1b6f7617 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5296f/modules/dell_s5296f_fpga_ocores.c +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/modules/dell_s5296f_fpga_ocores.c @@ -89,7 +89,7 @@ struct fpgapci_dev { unsigned int irq_first; unsigned int irq_length; unsigned int irq_assigned; - unsigned int xcvr_intr_count; + }; static int use_irq = 1; @@ -107,6 +107,13 @@ MODULE_PARM_DESC(num_bus, /* Subsystem: Xilinx Corporation Device 0007 */ //#define VENDOR 0x10EE #define DEVICE 0x7021 + +/* Altera FPGA PCIE info: + Unassigned class [ff00]: Altera Corporation Device 0004 (rev 01) + Subsystem: Altera Corporation Device 0004 */ +#define PCI_VENDOR_ID_ALTERA 0x1172 +#define PCI_DEVICE_ID_ALTERA 0x0004 + static phys_addr_t fpga_phys_addr; typedef signed char s8; @@ -190,7 +197,7 @@ struct fpgalogic_i2c { #define FPGAI2C_REG_STAT_NACK 0x80 /* SR[7:0] - Status register */ -#define FPGAI2C_REG_SR_RXACK (1 << 7) /* Receive acknowledge from slave 1 = No acknowledge received*/ +#define FPGAI2C_REG_SR_RXACK (1 << 7) /* Receive acknowledge from secondary �1� = No acknowledge received*/ #define FPGAI2C_REG_SR_BUSY (1 << 6) /* Busy, I2C bus busy (as defined by start / stop bits) */ #define FPGAI2C_REG_SR_AL (1 << 5) /* Arbitration lost - fpga i2c logic lost arbitration */ #define FPGAI2C_REG_SR_TIP (1 << 1) /* Transfer in progress */ @@ -227,13 +234,6 @@ enum { #define I2C_PCI_BUS_NUM_12 12 #define I2C_PCI_BUS_NUM_16 16 -#define IRQ_LTCH_STS 0x20 -#define PRSNT_LTCH_STS 0x10 - -#define PORT_CTRL_OFFSET 0x4000 -#define PORT_STS_OFFSET 0x4004 -#define PORT_IRQ_STS_OFFSET 0x4008 -#define PORT_IRQ_EN_OFFSET 0x400C #define MB_BRD_REV_TYPE 0x0008 #define MB_BRD_REV_MASK 0x00f0 #define MB_BRD_REV_00 0x0000 @@ -256,7 +256,7 @@ enum { #define BRD_TYPE_S5232_NON_NEBS 0xc #define BRD_TYPE_S5232_NEBS 0xd -#define FPGA_CTL_REG_SIZE 0x6000 +#define FPGA_CTL_REG_SIZE 0x60 #define MSI_VECTOR_MAP_MASK 0x1f #define MSI_VECTOR_MAP1 0x58 #define I2C_CH1_MSI_MAP_VECT_8 0x00000008 @@ -292,8 +292,6 @@ enum { #define MSI_VECTOR_REV_00 16 #define MSI_VECTOR_REV_01 32 -#define FPGA_MSI_VECTOR_ID_4 4 -#define FPGA_MSI_VECTOR_ID_5 5 #define FPGA_MSI_VECTOR_ID_8 8 #define FPGA_MSI_VECTOR_ID_9 9 #define FPGA_MSI_VECTOR_ID_10 10 @@ -312,7 +310,7 @@ enum { #define FPGA_MSI_VECTOR_ID_23 23 #define FPGA_MSI_VECTOR_ID_24 24 - +#define MAX_WAIT_LOOP 10 static int total_i2c_pci_bus = 0; static uint32_t board_rev_type = 0; @@ -431,7 +429,7 @@ static int fpgai2c_poll(struct fpgalogic_i2c *i2c) } /* Error? */ - if (stat & FPGAI2C_REG_STAT_ARBLOST) { + if ((stat & FPGAI2C_REG_STAT_ARBLOST) || ( i2c->msg == NULL) || ( i2c->msg->buf == NULL)) { i2c->state = STATE_ERROR; fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_STOP); return -EAGAIN; @@ -516,72 +514,6 @@ static int fpgai2c_poll(struct fpgalogic_i2c *i2c) return 0; } -static ssize_t get_mod_msi(struct device *dev, struct device_attribute *devattr, char *buf) -{ - int ind = 0, port_status=0, port_irq_status=0; - struct fpgapci_dev *fpgapci = (struct fpgapci_dev*) dev_get_drvdata(dev); - PRINT("%s:xcvr_intr_count:%u\n", __FUNCTION__, fpgapci->xcvr_intr_count); - for(ind=0;ind<64;ind++) - { - port_status = ioread32(fpga_ctl_addr + PORT_STS_OFFSET + (ind*16)); - port_irq_status = ioread32(fpga_ctl_addr + PORT_IRQ_STS_OFFSET + (ind*16)); - PRINT("%s:port:%d, port_status:%#x, port_irq_status:%#x\n", __FUNCTION__, ind, port_status, port_irq_status); - } - return sprintf(buf,"0x%04x\n",fpgapci->xcvr_intr_count); -} -static DEVICE_ATTR(port_msi, S_IRUGO, get_mod_msi, NULL); - -static struct attribute *port_attrs[] = { - &dev_attr_port_msi.attr, - NULL, -}; - -static struct attribute_group port_attr_grp = { - .attrs = port_attrs, -}; - - -static irqreturn_t fpgaport_1_32_isr(int irq, void *dev) -{ - struct pci_dev *pdev = dev; - struct fpgapci_dev *fpgapci = (struct fpgapci_dev*) dev_get_drvdata(&pdev->dev); - int ind = 0, port_status=0, port_irq_status=0; - for(ind=0;ind<32;ind++) - { - port_irq_status = ioread32(fpga_ctl_addr + PORT_IRQ_STS_OFFSET + (ind*16)); - if(port_irq_status&(IRQ_LTCH_STS|PRSNT_LTCH_STS)) - { - PRINT("%s:port:%d, port_status:%#x, port_irq_status:%#x\n", __FUNCTION__, ind, port_status, port_irq_status); - //write on clear - iowrite32( IRQ_LTCH_STS|PRSNT_LTCH_STS,fpga_ctl_addr + PORT_IRQ_STS_OFFSET + (ind*16)); - } - } - fpgapci->xcvr_intr_count++; - PRINT("%s: xcvr_intr_count:%u\n", __FUNCTION__, fpgapci->xcvr_intr_count); - sysfs_notify(&pdev->dev.kobj, NULL, "port_msi"); - return IRQ_HANDLED; -} - -static irqreturn_t fpgaport_33_64_isr(int irq, void *dev) -{ - struct pci_dev *pdev = dev; - struct fpgapci_dev *fpgapci = (struct fpgapci_dev*) dev_get_drvdata(&pdev->dev); - int ind = 0, port_status=0, port_irq_status=0; - for(ind=32;ind<64;ind++) - { - port_irq_status = ioread32(fpga_ctl_addr + PORT_IRQ_STS_OFFSET + (ind*16)); - if(port_irq_status| (IRQ_LTCH_STS|PRSNT_LTCH_STS)) - { - PRINT("%s:port:%d, port_status:%#x, port_irq_status:%#x\n", __FUNCTION__, ind, port_status, port_irq_status); - iowrite32( IRQ_LTCH_STS|PRSNT_LTCH_STS,fpga_ctl_addr + PORT_IRQ_STS_OFFSET + (ind*16)); - } - } - fpgapci->xcvr_intr_count++; - PRINT("%s: xcvr_intr_count:%u\n", __FUNCTION__, fpgapci->xcvr_intr_count); - sysfs_notify(&pdev->dev.kobj, NULL, "port_msi"); - return IRQ_HANDLED; -} - static void fpgai2c_process(struct fpgalogic_i2c *i2c) { struct i2c_msg *msg = i2c->msg; @@ -610,6 +542,12 @@ static void fpgai2c_process(struct fpgalogic_i2c *i2c) return; } + /* Spurious IRQs would lead to invocation of handler with msg being NULL. + * Skip handling them. + */ + if (msg == NULL) + return; + if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { i2c->state = (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; @@ -621,6 +559,11 @@ static void fpgai2c_process(struct fpgalogic_i2c *i2c) } } else { + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..1 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + msg->buf[i2c->pos++] = fpgai2c_reg_get(i2c, FPGAI2C_REG_DATA); } @@ -657,12 +600,25 @@ static void fpgai2c_process(struct fpgalogic_i2c *i2c) } if (i2c->state == STATE_READ) { + + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..2 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + + PRINT("fpgai2c_poll STATE_READ i2c->pos=%d msg->len-1 = 0x%x set FPGAI2C_REG_CMD = 0x%x\n",i2c->pos, msg->len-1, - i2c->pos == (msg->len-1) ? FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); + i2c->pos == (msg->len-1) ? FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, i2c->pos == (msg->len-1) ? - FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); + FPGAI2C_REG_CMD_READ_NACK : FPGAI2C_REG_CMD_READ_ACK); } else { PRINT("fpgai2c_process set FPGAI2C_REG_DATA(0x%x)\n",FPGAI2C_REG_DATA); + + if(( i2c->msg == NULL) || ( i2c->msg->buf == NULL) || (i2c->pos >= i2c->msg->len) ) { + printk("crash debug..3 fpgai2c_process MSG and MAS->BUFF is NULL or pos > len "); + return; + } + fpgai2c_reg_set(i2c, FPGAI2C_REG_DATA, msg->buf[i2c->pos++]); fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_WRITE); } @@ -745,7 +701,7 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c) { int prescale; int diff; - u8 ctrl; + u8 ctrl = 0, stat, loop = 0; if (i2c->reg_io_width == 0) i2c->reg_io_width = 1; /* Set to default value */ @@ -776,9 +732,7 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c) } } - ctrl = fpgai2c_reg_get(i2c, FPGAI2C_REG_CONTROL); - - PRINT("%s(), line:%d\n", __func__, __LINE__); + PRINT("%s(), line:%d\n", __func__, __LINE__); PRINT("i2c->base = 0x%p\n",i2c->base); PRINT("ctrl = 0x%x\n",ctrl); @@ -806,12 +760,23 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c) fpgai2c_reg_set(i2c, FPGAI2C_REG_PREHIGH, prescale >> 8); /* Init the device */ - fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); - if (!use_irq) - fpgai2c_reg_set(i2c, FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_EN); - else - fpgai2c_reg_set(i2c, FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_IEN | FPGAI2C_REG_CTRL_EN); - + fpgai2c_reg_set(i2c, FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_EN); + if (use_irq) { + /* Clear any pending interrupts */ + fpgai2c_reg_set(i2c, FPGAI2C_REG_CMD, FPGAI2C_REG_CMD_IACK); + while (loop < MAX_WAIT_LOOP) { + stat = fpgai2c_reg_get(i2c, FPGAI2C_REG_STATUS); + if (stat & FPGAI2C_REG_STAT_IF) { + udelay(100); + loop++; + } else { + break; + } + } + if (loop >=10) { + printk("interrupts can't be cleared: loop %d\n", loop); + } + } fpgai2c_dump(i2c); /* Initialize interrupt handlers if not already done */ @@ -820,6 +785,17 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c) return 0; } +static int fpgai2c_interrupt_enable(struct fpgapci_dev *fpgapci) +{ + int i; + u8 ctrl = 0; + + /* Enable Interrupts */ + for (i = 0 ; i < total_i2c_pci_bus; i ++) { + fpgai2c_reg_set(&fpgalogic_i2c[i], FPGAI2C_REG_CONTROL, ctrl | FPGAI2C_REG_CTRL_IEN | FPGAI2C_REG_CTRL_EN); + } + return 0; +} static u32 fpgai2c_func(struct i2c_adapter *adap) { @@ -861,56 +837,17 @@ static int i2c_init_internal_data(void) } -static int i2c_pci_init (void) +static int i2c_pci_init (struct fpgapci_dev *fpgapci) { int i; - if (num_bus == 0) { - board_rev_type = ioread32(fpga_ctl_addr + MB_BRD_REV_TYPE); - - if ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_00) { - num_bus = I2C_PCI_MAX_BUS_REV00; - } else if (((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_01) || - ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_02) || - ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_03)) { - switch (board_rev_type & MB_BRD_TYPE_MASK){ - case BRD_TYPE_S5212_NON_NEBS: - case BRD_TYPE_S5212_NEBS: - num_bus = I2C_PCI_BUS_NUM_5; - break; - case BRD_TYPE_S5224_NON_NEBS: - case BRD_TYPE_S5224_NEBS: - num_bus = I2C_PCI_BUS_NUM_7; - break; - case BRD_TYPE_Z9232_NON_NEBS: - case BRD_TYPE_Z9232_NEBS: - case BRD_TYPE_S5232_NON_NEBS: - case BRD_TYPE_S5232_NEBS: - num_bus = I2C_PCI_BUS_NUM_8; - break; - case BRD_TYPE_S5248_NON_NEBS: - case BRD_TYPE_S5248_NEBS: - num_bus = I2C_PCI_BUS_NUM_10; - break; - case BRD_TYPE_Z9264_NON_NEBS: - case BRD_TYPE_Z9264_NEBS: - num_bus = I2C_PCI_BUS_NUM_12; - break; - case BRD_TYPE_S5296_NON_NEBS: - case BRD_TYPE_S5296_NEBS: - num_bus = I2C_PCI_BUS_NUM_16; - break; - default: - num_bus = I2C_PCI_BUS_NUM_16; - printk("Wrong BRD_TYPE: 0x%x\n", board_rev_type); - break; - } + if ((fpgapci != NULL) && (fpgapci->pci_dev->vendor == PCI_VENDOR_ID_ALTERA)) { + num_bus = I2C_PCI_BUS_NUM_10; } else { - printk("Wrong board_rev_type 0x%x\n", board_rev_type); - } - } + num_bus = I2C_PCI_MAX_BUS; + } - printk("board_rev_type 0x%x, num_bus 0x%x\n", board_rev_type, num_bus); + printk("vendor 0x%x, num_bus 0x%x\n", fpgapci->pci_dev->vendor, num_bus); total_i2c_pci_bus = num_bus; memset (&i2c_pci_adap, 0, sizeof(i2c_pci_adap)); @@ -1100,196 +1037,119 @@ static int register_intr_handler(struct pci_dev *dev, int irq_num_id) PRINT ( ": fpgapci_dev is 0\n"); return err; } - - if ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_00) { - /* Request interrupt line for unique function - * alternatively function will be called from free_irq as well - * with flag IRQF_SHARED */ - switch(irq_num_id) { - /* Currently we only support test vector 2 for FPGA Logic I2C channel - * controller 1-7 interrupt*/ - case FPGA_MSI_VECTOR_ID_4: - err = request_irq(dev->irq + irq_num_id, fpgaport_1_32_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, dev); - PRINT ( "%d: fpgapci_dev: irq: %d, %d\n", __LINE__, dev->irq, irq_num_id); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_5: - err = request_irq(dev->irq + irq_num_id, fpgaport_33_64_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, dev); - PRINT ( "%d: fpgapci_dev: irq: %d, %d\n", __LINE__, dev->irq, irq_num_id); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_8: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + /* FPGA SPEC 4.3.1.34, First i2c channel mapped to vector 8 */ + switch (irq_num_id) { + case FPGA_MSI_VECTOR_ID_8: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[0]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_9: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_9: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[1]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_10: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_10: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[2]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_11: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_11: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[3]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_12: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_12: + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[4]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_13: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[5]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_14: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[6]); - fpgapci->irq_assigned++; - break; - - default: - PRINT("No more interrupt handler for number (%d)\n", + fpgapci->irq_assigned++; + break; + case FPGA_MSI_VECTOR_ID_13: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[5]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_14: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[6]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_15: + /*it is an external interrupt number. Ignore this case */ + break; + case FPGA_MSI_VECTOR_ID_16: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_7) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[7]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_17: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[8]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_18: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[9]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_19: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[10]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_20: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[11]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_21: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[12]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_22: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[13]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_23: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[14]); + fpgapci->irq_assigned++; + } + break; + case FPGA_MSI_VECTOR_ID_24: + if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { + err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, + IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[15]); + fpgapci->irq_assigned++; + } + break; + + default: + PRINT("No more interrupt handler for number (%d)\n", dev->irq + irq_num_id); - break; - } - } else if (((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_01) || - ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_02) || - ((board_rev_type & MB_BRD_REV_MASK) == MB_BRD_REV_03)) { - /* FPGA SPEC 4.3.1.34, First i2c channel mapped to vector 8 */ - switch (irq_num_id) { - case FPGA_MSI_VECTOR_ID_4: - err = request_irq(dev->irq + irq_num_id, fpgaport_1_32_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, dev); - PRINT ( "%d: fpgapci_dev: irq: %d, %d\n", __LINE__, dev->irq, irq_num_id); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_5: - err = request_irq(dev->irq + irq_num_id, fpgaport_33_64_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, dev); - PRINT ( "%d: fpgapci_dev: irq: %d, %d\n", __LINE__, dev->irq, irq_num_id); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_8: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[0]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_9: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[1]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_10: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[2]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_11: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[3]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_12: - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, IRQF_EARLY_RESUME, - FPGA_PCI_NAME, &fpgalogic_i2c[4]); - fpgapci->irq_assigned++; - break; - case FPGA_MSI_VECTOR_ID_13: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[5]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_14: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_5) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[6]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_15: - /*it is an external interrupt number. Ignore this case */ - break; - case FPGA_MSI_VECTOR_ID_16: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_7) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[7]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_17: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[8]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_18: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_8) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[9]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_19: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[10]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_20: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_10) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[11]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_21: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[12]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_22: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[13]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_23: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[14]); - fpgapci->irq_assigned++; - } - break; - case FPGA_MSI_VECTOR_ID_24: - if (total_i2c_pci_bus > I2C_PCI_BUS_NUM_12) { - err = request_irq(dev->irq + irq_num_id, fpgai2c_isr, - IRQF_EARLY_RESUME, FPGA_PCI_NAME, &fpgalogic_i2c[15]); - fpgapci->irq_assigned++; - } - break; - - default: - PRINT("No more interrupt handler for number (%d)\n", - dev->irq + irq_num_id); - break; + break; } - } return err; } @@ -1415,7 +1275,7 @@ static int fpgapci_setup_device(struct fpgapci_dev *fpgapci,struct pci_dev *dev) goto fail_map_bars; } - i2c_pci_init(); + i2c_pci_init(fpgapci); return 0; /* ERROR HANDLING */ @@ -1491,7 +1351,6 @@ static int fpgapci_configure_msi(struct fpgapci_dev *fpgapci,struct pci_dev *dev static int fpgapci_probe(struct pci_dev *dev, const struct pci_device_id *id) { struct fpgapci_dev *fpgapci = 0; - int status = 0; #ifdef TEST PRINT ( " vendor = 0x%x, device = 0x%x, class = 0x%x, bus:slot.func = %02x:%02x.%02x\n", @@ -1508,11 +1367,6 @@ static int fpgapci_probe(struct pci_dev *dev, const struct pci_device_id *id) fpgapci->pci_dev = dev; dev_set_drvdata(&dev->dev, (void*)fpgapci); - status = sysfs_create_group(&dev->dev.kobj, &port_attr_grp); - if (status) { - printk(KERN_INFO "%s:Cannot create sysfs\n", __FUNCTION__); - } - fpgapci->upstream = find_upstream_dev (dev); if(fpgapci_setup_device(fpgapci,dev)) { @@ -1523,6 +1377,9 @@ static int fpgapci_probe(struct pci_dev *dev, const struct pci_device_id *id) if(fpgapci_configure_msi(fpgapci,dev)) { goto error_cannot_configure; } + /* Enable interrupt after config msi */ + fpgai2c_interrupt_enable(fpgapci); + } @@ -1581,6 +1438,7 @@ static void fpgapci_remove(struct pci_dev *dev) static const struct pci_device_id fpgapci_ids[] = { {PCI_DEVICE(PCI_VENDOR_ID_XILINX, DEVICE)}, + {PCI_DEVICE(PCI_VENDOR_ID_ALTERA, PCI_DEVICE_ID_ALTERA)}, {0, }, }; @@ -1624,3 +1482,4 @@ MODULE_LICENSE("GPL"); MODULE_AUTHOR("joyce_yu@dell.com"); MODULE_DESCRIPTION ("Driver for FPGA Logic I2C bus"); MODULE_SUPPORTED_DEVICE ("FPGA Logic I2C bus"); +MODULE_VERSION ("01.01"); diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/setup.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/setup.py new file mode 120000 index 000000000000..4f6de9941d96 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/setup.py @@ -0,0 +1 @@ +../s6100/setup.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/__init__.py new file mode 100644 index 000000000000..28edc0b13f3b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/__init__.py @@ -0,0 +1,3 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "thermal", "psu", "fan","fan_drawer","watchdog"] +from sonic_platform import * + diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/chassis.py new file mode 100644 index 000000000000..c981e4bc7ade --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/chassis.py @@ -0,0 +1,453 @@ +#!/usr/bin/env python + +############################################################################# +# DELLEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import os + import time + import sys + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp + from sonic_platform.eeprom import Eeprom + from sonic_platform.component import Component + from sonic_platform.psu import Psu + from sonic_platform.thermal import Thermal + from sonic_platform.watchdog import Watchdog + from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.hwaccess import pci_get_value, pci_set_value +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +MAX_S5296F_COMPONENT = 8 # BIOS,BMC,FPGA,SYSTEM CPLD,4 SECONDARY CPLDs +MAX_S5296F_FANTRAY = 4 +MAX_S5296F_FAN = 1 +MAX_S5296F_PSU = 2 +MAX_S5296F_THERMAL = 10 +SYSTEM_LED_REG = 0x24 +SYSTEM_BEACON_LED_SET = 0x8 +SYSTEM_BEACON_LED_CLEAR = 0xFFFFFFF7 + +media_part_num_list = set([ \ +"8T47V","XTY28","MHVPK","GF76J","J6FGD","F1KMV","9DN5J","H4DHD","6MCNV","0WRX0","X7F70","5R2PT","WTRD1","WTRD1","WTRD1","WTRD1","5250G","WTRD1","C5RNH","C5RNH","FTLX8571D3BCL-FC", +"C5RNH","5250G","N8TDR","7D64H","7D64H","RN84N","RN84N","HMTNW","6K3Y6","6K3Y6","TY5FM","50M0R","PGYJT","WP2PP","85Y13","1HCGH","FP9R1","FYD0M","C6Y7M","C6Y7M","V250M","V250M", +"5CWK6","5CWK6","53HVN","53HVN","358VV","358VV","MV799","MV799","YJF03","P9GND","T1KCN","1DXKP","MT7R2","K0T7R","W5G04","7TCDN","7TCDN","7TCDN","7TCDN","7TCDN","V3XJK","0MV31", +"5FVP7","N6KM9","C41MF","77KC3","XW7J0","V4NJV","2XJHY","H93DH","H93DH","F8CG0","F8CG0","F8CG0","119N6","WFMF5","794RX","288F6","1M31V","1M31V","5NP8R","5NP8R","4TC09","4TC09", +"FC6KV","FC6KV","J90VN","J90VN","05RH0","05RH0","YDN52","0C2YV","YDN52","0C2YV","9JT65","D7M6H","6GW14","FYVFW","0VF5H","P4YPY","P4YPY","TCPM2","TCPM2","JNPF8","JNPF8","27GG5", +"27GG5","P8T4W","P8T4W","JR54Y","M6N0J","XJYD0","K44H9","035KG","P7C7N","76V43","3CC35","FN4FC","26FN3","YFNDD","YFNDD","7R9N9","035KG","P7C7N","76V43","3CC35","PLRXPLSCS43811", +"FN4FC","26FN3","YFNDD","YFNDD","7R9N9","G86YJ","V407F","V407F","9KH6T","G86YJ","V407F","9KH6T","2JVDD","D0R73","VXFJY","9X8JP","2JVDD","D0R73","VXFJY","9X8JP","2JVDD","D0R73","VXFJY", +"9X8JP","GMFC5","GMFC5","GMFC5","D7P80","3MFXG","3MFXG","0GWXJ","THPF3","THPF3","THPF3","THPF3","THPF3","PJ62G","3XCX1","JJYKG","RRRTK","16K56","86JM2","K5R6C","7MG2C","WTPPN","9HTT2", +"NKM4F","VXGGG","JC9W6","6MR8M","RP3GV","M5PPJ","XKY55","TKCXT","05J8P","5WGKD","XFDRT","NW8DM","YPKH3","5WGKD","XFDRT","NW8DM","YPKH3","71XXK","MVCX6","0XYP6","HPPVW","3GHRT","71XXK", +"MVCX6","0XYP6","HPPVW","3GHRT","2X5T6","135V2","KD5MV","2X5T6","KD5MV","HHFK0","3YWG7","5CMT2","RCVP5","X5DH4","HHFK0","3YWG7","5CMT2","RCVP5","X5DH4","3YWG7","5CMT2","RCVP5","X5DH4", +"4WJ41","4WJ41","14NV5","14NV5","14NV5","4WGYD","YKMH7","X7CCC","X7CCC","0X9CT","0CY8V","P7D7R","W4GPP","W4GPP","W4GPP","HHHCHC","07RN7","07RN7","0YR96","0YR96","JCYM9","FTLX8571D3BCL", +"DDW0X","VPFDJ","229KM","9FC7D","DDW0X","VPFDJ","6FMR5","J7K20","N3K9W","6FMR5","8R4VM","7VN5T","D9YM8","8R4VM","VYXPW","87TPX","WY6FK","VYXPW","87TPX","WY6FK","WG8C4","N8K82","2DV6Y", +"77C3C","RC0HM","77C3C","RC0HM","JHXTN","3P3PG","92YVM","4VX5M","4VX5M","6RRGD","W4JWV","22V6R","XR11M","9GMDY","JMCWK","TP2F0","6MGDY","78RHK", "C0TP5","0WDNV","FCLF8522P2BTL"\ +]) + +class Chassis(ChassisBase): + """ + DELLEMC Platform-specific Chassis class + """ + + REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason" + OIR_FD_PATH = "/sys/bus/pci/devices/0000:04:00.0/port_msi" + PCI_RES = "/sys/bus/pci/devices/0000:04:00.0/resource0" + oir_fd = -1 + + sysled_offset = 0x0024 + SYSLED_COLOR_TO_REG = { + "blinking_green": 0x0, + "green" : 0x10, + "amber" : 0x20, + "blinking_amber": 0x30 + } + + REG_TO_SYSLED_COLOR = { + 0x0 : "blinking_green", + 0x10 : "green", + 0x20 : "amber", + 0x30 : "blinking_amber" + } + + _global_port_pres_dict = {} + + def __init__(self): + ChassisBase.__init__(self) + # sfp.py will read eeprom contents and retrive the eeprom data. + # We pass the eeprom path from chassis.py + self.PORT_START = 1 + self.PORT_END = 104 + self.SFP28_PORT_END = 96 + i2c_bus_for_port = 2 + i2c_mux_to_populate = 603 + i2c_mux_is_good = False + + PORTS_IN_BLOCK = (self.PORT_END + 1) + _sfp_port = range(1, self.SFP28_PORT_END + 1) + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + mux_channel = "/sys/class/i2c-adapter/i2c-{0}/{0}-0074/channel-0" + + for index in range(self.PORT_START, PORTS_IN_BLOCK): + eeprom_path = "" + if index%8 == 1: # 8 buses per i2c mux + i2c_mux_is_good = True if os.path.exists(mux_channel.format(i2c_mux_to_populate)) else False + i2c_mux_to_populate += 1 + if i2c_mux_is_good: + eeprom_path = eeprom_base.format(i2c_bus_for_port) + i2c_bus_for_port += 1 + if index not in _sfp_port: + sfp_node = Sfp(index, 'QSFP', eeprom_path) + else: + sfp_node = Sfp(index, 'SFP', eeprom_path) + self._sfp_list.append(sfp_node) + self._num_sfps = len(self._sfp_list) + + self._eeprom = Eeprom() + + for i in range(MAX_S5296F_THERMAL): + self._thermal_list.append(Thermal(i)) + + for i in range(MAX_S5296F_COMPONENT): + self._component_list.append(Component(i)) + + for i in range(MAX_S5296F_PSU): + self._psu_list.append(Psu(i)) + + for i in range(MAX_S5296F_FANTRAY): + fandrawer = FanDrawer(i) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + self._num_fans = MAX_S5296F_FANTRAY * MAX_S5296F_FAN + + self._watchdog = Watchdog() + + def __del__(self): + if self.oir_fd != -1: + self.epoll.unregister(self.oir_fd.fileno()) + self.epoll.close() + self.oir_fd.close() + +# not needed /delete after validation + + def _get_register(self, reg_file): + retval = 'ERR' + if (not os.path.isfile(reg_file)): + print(reg_file, 'not found !') + return retval + + try: + with os.fdopen(os.open(reg_file, os.O_RDONLY)) as fd: + retval = fd.read() + except Exception as ex: + pass + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + return retval + +# not needed /delete after validation + + def _check_interrupts(self, port_dict): + retval = 0 + is_port_dict_updated = False + for port_num in range(self.PORT_START, (self.PORT_END + 1)): + sfp = self.get_sfp(port_num) + presence = sfp.get_presence() + if(presence and (self._global_port_pres_dict[port_num] == '0')): + is_port_dict_updated = True + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and (self._global_port_pres_dict[port_num] == '1')): + is_port_dict_updated = True + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + return retval, is_port_dict_updated + +# check for this event change for sfp / do we need to handle timeout/sleep + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + """ + start_ms = time.time() * 1000 + port_dict = {} + change_dict = {} + change_dict['sfp'] = port_dict + if not self._global_port_pres_dict: + for port_num in self._sfp_port: + presence = self.get_sfp(port_num).get_presence() + self._global_port_pres_dict[port_num] = '1' if presence else '0' + + while True: + time.sleep(0.5) + for port_num in range(self.PORT_START, (self.PORT_END + 1)): + presence = self.get_sfp(port_num).get_presence() + if(presence and self._global_port_pres_dict[port_num] == '0'): + self._global_port_pres_dict[port_num] = '1' + port_dict[port_num] = '1' + elif(not presence and + self._global_port_pres_dict[port_num] == '1'): + self._global_port_pres_dict[port_num] = '0' + port_dict[port_num] = '0' + + if(len(port_dict) > 0): + return True, change_dict + + if timeout: + now_ms = time.time() * 1000 + if (now_ms - start_ms >= timeout): + return True, change_dict + + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 0. + For example, 0 for Ethernet0, 1 for Ethernet4 and so on. + + Returns: + An object dervied from SfpBase representing the specified sfp + """ + sfp = None + + try: + # The 'index' is 1-based + sfp = self._sfp_list[index-1] + except IndexError: + sys.stderr.write("SFP index {} out of range (1-{})\n".format( + index, len(self._sfp_list))) + return sfp + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + return self._eeprom.modelstr() + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + return self._eeprom.part_number_str() + + def get_serial(self): + """ + Retrieves the serial number of the chassis (Service tag) + Returns: + string: Serial number of chassis + """ + return self._eeprom.serial_str() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + + def set_status_led(self, color): + """ + Sets the state of the system LED + Args: + color: A string representing the color with which to set the + system LED + Returns: + bool: True if system LED state is set successfully, False if not + """ + if color not in list(self.SYSLED_COLOR_TO_REG.keys()): + return False + + val = pci_get_value(self.PCI_RES, self.sysled_offset) + val = (val & 0xFFCF) | self.SYSLED_COLOR_TO_REG[color] + + pci_set_value(self.PCI_RES, val, self.sysled_offset) + self.sys_ledcolor = color + return True + + def get_status_led(self): + """ + Gets the state of the system LED + Returns: + A string, one of the valid LED color strings which could be + vendor specified. + """ + val = pci_get_value(self.PCI_RES, self.sysled_offset) + if val != -1: + val = val & 0x30 + return self.REG_TO_SYSLED_COLOR.get(val) + return self.sys_ledcolor + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.base_mac_addr() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.serial_number_str() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.system_eeprom_info() + + def get_eeprom(self): + """ + Retrieves the Sys Eeprom instance for the chassis. + Returns : + The instance of the Sys Eeprom + """ + return self._eeprom + + def get_num_fans(self): + """ + Retrives the number of Fans on the chassis. + Returns : + An integer represents the number of Fans on the chassis. + """ + return self._num_fans + + def get_num_sfps(self): + """ + Retrives the numnber of Media on the chassis. + Returns: + An integer represences the number of SFPs on the chassis. + """ + return self._num_sfps + + def get_revision(self): + """ + Retrieves the revision number of the chassis (Service tag) + Returns: + string: Revision number of chassis + """ + return self._eeprom.revision_str() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + try: + with open(self.REBOOT_CAUSE_PATH) as fd: + reboot_cause = int(fd.read(), 16) + except Exception as ex: + return (self.REBOOT_CAUSE_NON_HARDWARE, None) + + if reboot_cause & 0x1: + return (self.REBOOT_CAUSE_POWER_LOSS, "Power on reset") + elif reboot_cause & 0x2: + return (self.REBOOT_CAUSE_NON_HARDWARE, None) + elif reboot_cause & 0x4: + return (self.REBOOT_CAUSE_HARDWARE_OTHER, "PSU Shutdown") + elif reboot_cause & 0x8: + return (self.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU, None) + elif reboot_cause & 0x10: + return (self.REBOOT_CAUSE_WATCHDOG, None) + elif reboot_cause & 0x20: + return (self.REBOOT_CAUSE_HARDWARE_OTHER, "BMC Shutdown") + elif reboot_cause & 0x40: + return (self.REBOOT_CAUSE_HARDWARE_OTHER, "Hot-Swap Shutdown") + elif reboot_cause & 0x80: + return (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Shutdown") + elif reboot_cause & 0x100: + return (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Cold Reboot") + else: + return (self.REBOOT_CAUSE_NON_HARDWARE, None) + + def get_qualified_media_list(self): + return media_part_num_list + + def set_locator_led(self, color): + """ + Sets the state of the Chassis Locator LED + + Args: + color: A string representing the color with which to set the Chassis Locator LED + + Returns: + bool: True if the Chassis Locator LED state is set successfully, False if not + + """ + val = pci_get_value(self.PCI_RES, SYSTEM_LED_REG) + if self.LOCATOR_LED_ON == color: + val = int(val) | SYSTEM_BEACON_LED_SET + elif self.LOCATOR_LED_OFF == color: + val = int(val) & SYSTEM_BEACON_LED_CLEAR + else: + return False + pci_set_value(self.PCI_RES, val, SYSTEM_LED_REG) + return True + + def get_locator_led(self): + """ + Gets the state of the Chassis Locator LED + + Returns: + LOCATOR_LED_ON or LOCATOR_LED_OFF + """ + val = pci_get_value(self.PCI_RES, SYSTEM_LED_REG) + val = int(val) & SYSTEM_BEACON_LED_SET + if not val: + return self.LOCATOR_LED_OFF + else: + return self.LOCATOR_LED_ON + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether Chassis is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py new file mode 100644 index 000000000000..43c43e0a4ef6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python + +######################################################################## +# DELLEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, BMC etc.) available in +# the platform +# +######################################################################## + + +try: + import subprocess + from sonic_platform_base.component_base import ComponentBase + import sonic_platform.hwaccess as hwaccess + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +def get_bios_version(): + return subprocess.check_output(['dmidecode', '-s', + 'system-version']).decode('utf-8').strip() + +def get_fpga_version(): + val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:04:00.0/resource0', 0) + return '{}.{}'.format((val >> 8) & 0xff, val & 0xff) + +def get_bmc_version(): + """ Returns BMC Version """ + bmc_ver = '' + try: + bmc_ver = subprocess.check_output( + "ipmitool mc info | awk '/Firmware Revision/ { print $NF }'", + shell=True, text=True).strip() + except (FileNotFoundError, subprocess.CalledProcessError): + pass + return bmc_ver + +def get_cpld_version(bus, i2caddr): + """ Return CPLD version """ + major = hwaccess.i2c_get(bus, i2caddr, 1) + minor = hwaccess.i2c_get(bus, i2caddr, 0) + if major != -1 and minor != -1: + return '{}.{}'.format(major, minor) + return '' + +def get_cpld0_version(): + return get_cpld_version(601, 0x31) + +def get_cpld1_version(): + return get_cpld_version(600, 0x30) + +def get_cpld2_version(): + return get_cpld_version(600, 0x31) + +def get_cpld3_version(): + return get_cpld_version(600, 0x32) + +def get_cpld4_version(): + return get_cpld_version(600, 0x33) + + +class Component(ComponentBase): + """DellEMC Platform-specific Component class""" + + CHASSIS_COMPONENTS = [ + ['BIOS', + 'Performs initialization of hardware components during booting', + get_bios_version + ], + + ['FPGA', + 'Used for managing the system LEDs', + get_fpga_version + ], + + ['BMC', + 'Platform management controller for on-board temperature monitoring, in-chassis power, Fan and LED control', + get_bmc_version + ], + + ['System CPLD', + 'Used for managing the CPU power sequence and CPU states', + get_cpld0_version + ], + + ['Secondary CPLD 1', + 'Used for managing SFP28/QSFP28 port transceivers (SFP28 1-24, QSFP28 1-4)', + get_cpld1_version + ], + + ['Secondary CPLD 2', + 'Used for managing SFP28/QSFP28 port transceivers (SFP28 25-48, QSFP28 5-8)', + get_cpld2_version + ], + + ['Secondary CPLD 3', + 'Used for managing SFP28/QSFP28 port transceivers (SFP28 49-72)', + get_cpld3_version + ], + + ['Secondary CPLD 4', + 'Used for managing SFP28/QSFP28 port transceivers (SFP28 73-96)', + get_cpld4_version + ] + ] + + def __init__(self, component_index = 0): + self.index = component_index + self.name = self.CHASSIS_COMPONENTS[self.index][0] + self.description = self.CHASSIS_COMPONENTS[self.index][1] + self.version = self.CHASSIS_COMPONENTS[self.index][2]() + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return self.name + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return self.description + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + Returns: + A string containing the firmware version of the component + """ + return self.version + + def get_presence(self): + """ + Retrieves the presence of the component + Returns: + bool: True if present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the part number of the component + Returns: + string: Part number of component + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the component + Returns: + string: Serial number of component + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the component + Returns: + bool: True if component is operating properly, False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether component is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def install_firmware(self, image_path): + """ + Installs firmware to the component + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install was successful, False if not + """ + return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + Note: the firmware version will be read from image + Args: + image_path: A string, path to firmware image + Returns: + A string containing the available firmware version of the component + """ + return "N/A" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + Args: + image_path: A string, path to firmware image + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return "None" + + def update_firmware(self, image_path): + """ + Updates firmware of the component + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + Args: + image_path: A string, path to firmware image + Raises: + RuntimeError: update failed + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/eeprom.py new file mode 100644 index 000000000000..dbe660f9de10 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/eeprom.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +############################################################################# +# DellEmc S5296F +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os.path + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self): + self.eeprom_path = None + for b in (0, 1): + f = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom'.format(b) + if os.path.exists(f): + self.eeprom_path = f + break + if self.eeprom_path is None: + return + super(Eeprom, self).__init__(self.eeprom_path, 0, '', True) + self.eeprom_tlv_dict = dict() + try: + self.eeprom_data = self.read_eeprom() + except: + self.eeprom_data = "N/A" + raise RuntimeError("Eeprom is not Programmed") + else: + eeprom = self.eeprom_data + + if not self.is_valid_tlvinfo_header(eeprom): + return + + total_length = (eeprom[9] << 8) | eeprom[10] + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_length + + while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: + if not self.is_valid_tlv(eeprom[tlv_index:]): + break + + tlv = eeprom[tlv_index:tlv_index + 2 + + eeprom[tlv_index + 1]] + code = "0x%02X" % tlv[0] + name, value = self.decoder(None, tlv) + + self.eeprom_tlv_dict[code] = value + if eeprom[tlv_index] == self._TLV_CODE_CRC_32: + break + + tlv_index += eeprom[tlv_index+1] + 2 + + def serial_number_str(self): + """ + Returns the serial number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERIAL_NUMBER) + if not is_valid: + return "N/A" + return results[2].decode('ascii') + + def base_mac_addr(self): + """ + Returns the base mac address found in the system EEPROM + """ + (is_valid, t) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_MAC_BASE) + if not is_valid or t[1] != 6: + return super(TlvInfoDecoder, self).switchaddrstr(e) + + return ":".join(["{:02x}".format(T) for T in t[2]]).upper() + + def modelstr(self): + """ + Returns the Model name + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PRODUCT_NAME) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def part_number_str(self): + """ + Returns the part number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_PART_NUMBER) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def serial_str(self): + """ + Returns the servicetag number + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_SERVICE_TAG) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def revision_str(self): + """ + Returns the device revision + """ + (is_valid, results) = self.get_tlv_field( + self.eeprom_data, self._TLV_CODE_LABEL_REVISION) + if not is_valid: + return "N/A" + + return results[2].decode('ascii') + + def system_eeprom_info(self): + """ + Returns a dictionary, where keys are the type code defined in + ONIE EEPROM format and values are their corresponding values + found in the system EEPROM. + """ + return self.eeprom_tlv_dict diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan.py new file mode 100644 index 000000000000..bf172a2ac2fb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fans' information which are available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_base import FanBase + from sonic_platform.ipmihelper import IpmiSensor, IpmiFru +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN1_MAX_SPEED_OFFSET = 71 +PSU_FAN_MAX_SPEED_OFFSET = 50 +FAN_DIRECTION_OFFSET = 69 +PSU_FAN_DIRECTION_OFFSET = 47 + + +class Fan(FanBase): + """DellEMC Platform-specific Fan class""" + # { FAN-ID: { Sensor-Name: Sensor-ID } } + FAN_SENSOR_MAPPING = { 1: {"Prsnt": 0x53, "State": 0x5b, "Speed": 0x20}, + 2: {"Prsnt": 0x54, "State": 0x5c, "Speed": 0x21}, + 3: {"Prsnt": 0x55, "State": 0x5d, "Speed": 0x22}, + 4: {"Prsnt": 0x56, "State": 0x5e, "Speed": 0x23} + } + PSU_FAN_SENSOR_MAPPING = { 1: {"State": 0x31, "Speed": 0x28}, + 2: {"State": 0x32, "Speed": 0x29} } + + # { FANTRAY-ID: FRU-ID } + FAN_FRU_MAPPING = { 1: 3, 2: 4, 3: 5, 4: 6 } + PSU_FRU_MAPPING = { 1: 1, 2: 2 } + + def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, + dependency=None): + self.is_psu_fan = psu_fan + if not self.is_psu_fan: + # API index is starting from 0, DellEMC platform index is + # starting from 1 + self.fantrayindex = fantray_index + 1 + self.fanindex = fan_index + 1 + self.max_speed_offset = FAN1_MAX_SPEED_OFFSET + self.fan_direction_offset = FAN_DIRECTION_OFFSET + self.index = self.fantrayindex + self.prsnt_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Prsnt"], + is_discrete = True) + self.state_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["State"], + is_discrete = True) + self.speed_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Speed"]) + self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex]) + else: + self.dependency = dependency + self.fanindex = fan_index + self.state_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["State"], + is_discrete = True) + self.speed_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["Speed"]) + self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex]) + self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET + self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET + self.max_speed = 0 + + def get_name(self): + """ + Retrieves the name of the device + Returns: + String: The name of the device + """ + if self.is_psu_fan: + return "PSU{} Fan".format(self.fanindex) + else: + return "FanTray{}-Fan{}".format(self.fantrayindex, self.fanindex) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + String: Part number of FAN + """ + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + String: Serial number of FAN + """ + return self.fru.get_board_serial() + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + presence = False + if self.is_psu_fan: + return self.dependency.get_presence() + else: + is_valid, state = self.prsnt_sensor.get_reading() + if is_valid: + if (state & 0b1): + presence = True + return presence + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if not state > 1: + status = True + return status + + def get_direction(self): + """ + Retrieves the fan airfow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + In DellEMC platforms, + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + direction = [self.FAN_DIRECTION_EXHAUST, self.FAN_DIRECTION_INTAKE] + fan_status = self.get_presence() + if not fan_status: + return None + is_valid, fan_direction = self.fru.get_fru_data(self.fan_direction_offset) + if is_valid and fan_direction[0] < len(direction): + return direction[fan_direction[0]] + else: + return None + + def get_speed_rpm(self): + """ + Retrieves the speed of fan in revolutions per minute (RPM) + + Returns: + An integer, speed of the fan in RPM + """ + is_valid, fan_speed = self.speed_sensor.get_reading() + return fan_speed if is_valid else None + + def get_speed(self): + """ + Retrieves the speed of the fan + Returns: + int: percentage of the max fan speed + """ + rpm = self.get_speed_rpm() + if rpm is None: + return None + if self.max_speed == 0: + is_valid, resp = self.fru.get_fru_data(self.max_speed_offset, 2) + if is_valid: + self.max_speed = (resp[1] << 8) | resp[0] + if self.max_speed == 0: + return None + return (100 * rpm) // self.max_speed + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fanindex + + def is_replaceable(self): + """ + Indicate whether Fan is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + if self.get_presence(): + # The tolerance value is fixed as 20% for all the DellEMC platforms + tolerance = 20 + else: + tolerance = 0 + + return tolerance + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by HW + # Return True to avoid thermalctld alarm + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..8cd0f3ba327d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/fan_drawer.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +S5296F_FANS_PER_FANTRAY = 1 + + +class FanDrawer(FanDrawerBase): + """DellEMC Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 1-based in DellEMC platforms + self.fantrayindex = fantray_index + 1 + for i in range(S5296F_FANS_PER_FANTRAY): + self._fan_list.append(Fan(fantray_index, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex) + + + def get_presence(self): + """ + Retrives the presence of the fan drawer + Returns: + bool: True if fan_tray is present, False if not + """ + return self.get_fan(0).get_presence() + + def get_model(self): + """ + Retrieves the part number of the fan drawer + Returns: + string: Part number of fan drawer + """ + return "NA" + + def get_serial(self): + """ + Retrieves the serial number of the fan drawer + Returns: + string: Serial number of the fan drawer + """ + return "NA" + + def get_status(self): + """ + Retrieves the operational status of the fan drawer + Returns: + bool: True if fan drawer is operating properly, False if not + """ + return self.get_fan(0).get_status() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.fantrayindex + + def is_replaceable(self): + """ + Indicate whether this fan drawer is replaceable. + Returns: + bool: True if it is replaceable, False if not + """ + return True + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # Fan tray status LED controlled by BMC + # Return True to avoid thermalctld alarm + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + Returns: + A float, with value of the maximum consumable power of the + component. + """ + # Value based on the hw spec + return 54.0 diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/hwaccess.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/hwaccess.py new file mode 120000 index 000000000000..e8fa340a444d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/hwaccess.py @@ -0,0 +1 @@ +../../common/sonic_platform/hwaccess.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/media_settings_plugin.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/media_settings_plugin.py new file mode 100644 index 000000000000..3b7667846eda --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/media_settings_plugin.py @@ -0,0 +1,13 @@ +# Media settings key plugin +# +# Generate keys used for lookup in media_settings,json + +def get_media_settings_key(physical_port, transceiver_dict): + d = transceiver_dict[physical_port] + media_interface = d['media_interface'] + generic_key = '{}-{}'.format(d['form_factor'], media_interface) + if media_interface == 'CR': + generic_key = '{}-{}'.format(generic_key, d['cable_length_detailed']) + return ['{}-{}'.format(d['manufacturename'], d['modelname']), + generic_key + ] diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/platform.py new file mode 100644 index 000000000000..996d94cf5a6e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/platform.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Platform(PlatformBase): + """ + DELLEMC Platform-specific class + """ + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/psu.py new file mode 100644 index 000000000000..8e2c06f7ae74 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/psu.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs' information which are available in the platform +# +######################################################################## + + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.ipmihelper import IpmiSensor, IpmiFru + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Psu(PsuBase): + """DellEMC Platform-specific PSU class""" + + # { PSU-ID: { Sensor-Name: Sensor-ID } } + SENSOR_MAPPING = { 1: { "State": 0x31, "Current": 0x39, + "Power": 0x37, "Voltage": 0x38, + "InCurrent": 0x36, "InPower": 0x34, + "InVoltage": 0x35, "Temperature": 0xc }, + 2: { "State": 0x32, "Current": 0x3F, + "Power": 0x3D, "Voltage": 0x3E, + "InCurrent": 0x3C, "InPower": 0x3A, + "InVoltage": 0x3B, "Temperature": 0xd } } + # ( PSU-ID: FRU-ID } + FRU_MAPPING = { 1: 1, 2: 2 } + + def __init__(self, psu_index): + PsuBase.__init__(self) + # PSU is 1-based in DellEMC platforms + self.index = psu_index + 1 + self.state_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["State"], + is_discrete=True) + self.voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Voltage"]) + self.current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Current"]) + self.power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Power"]) + self.input_voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InVoltage"]) + self.input_current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InCurrent"]) + self.input_power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InPower"]) + self.temp_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Temperature"]) + self.fru = IpmiFru(self.FRU_MAPPING[self.index]) + + self._fan_list.append(Fan(fan_index=self.index, psu_fan=True, + dependency=self)) + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return "PSU{}".format(self.index) + + def get_presence(self): + """ + Retrieves the presence of the Power Supply Unit (PSU) + + Returns: + bool: True if PSU is present, False if not + """ + presence = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if (state & 0b1) == 1: + presence = True + + return presence + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celcius up to + nearest thousandth of one degree celcius, e.g. 30.125 + """ + is_valid, temperature = self.temp_sensor.get_reading() + if not is_valid: + temperature = 0 + return float(temperature) + + def get_model(self): + """ + Retrieves the part number of the PSU + + Returns: + string: Part number of PSU + """ + return self.fru.get_board_part_number() + + def get_serial(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + return self.fru.get_board_serial() + + def get_revision(self): + """ + Retrives thehardware revision of the device + Returns: + String: revision value of device + """ + serial = self.fru.get_board_serial() + if serial != "NA" and len(serial) == 23: + return serial[-3:] + else: + return "NA" + + def is_replaceable(self): + """ + Indicate whether this PSU is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_status(self): + """ + Retrieves the operational status of the PSU + + Returns: + bool: True if PSU is operating properly, False if not + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if (state == 0x01): + status = True + + return status + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + is_valid, voltage = self.voltage_sensor.get_reading() + if not is_valid: + return None + return float(voltage) + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + is_valid, current = self.current_sensor.get_reading() + if not is_valid: + return None + + return float(current) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + is_valid, power = self.power_sensor.get_reading() + if not is_valid: + return None + + return float(power) + + def get_input_voltage(self): + """ + Retrieves current PSU voltage input + + Returns: + A float number, the input voltage in volts, + e.g. 12.1 + """ + is_valid, input_voltage = self.input_voltage_sensor.get_reading() + if not is_valid: + return None + + return float(input_voltage) + + def get_input_current(self): + """ + Retrieves present electric current supplied to PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + is_valid, input_current = self.input_current_sensor.get_reading() + if not is_valid: + return None + + return float(input_current) + + def get_input_power(self): + """ + Retrieves current energy supplied to PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + is_valid, input_power = self.input_power_sensor.get_reading() + if not is_valid: + return None + + return float(input_power) + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and + passed all its internal self-tests, False if not. + """ + status = False + is_valid, state = self.state_sensor.get_reading() + if is_valid: + if (state == 0x01): + status = True + + return status + + def get_mfr_id(self): + """ + Retrives the Manufacturer Id of PSU + + Returns: + A string, the manunfacturer id. + """ + return self.fru.get_board_mfr_id() + + def get_type(self): + """ + Retrives the Power Type of PSU + + Returns : + A string, PSU power type + """ + board_product = self.fru.get_board_product() + if board_product is not None : + info = board_product.split(',') + if 'AC' in info : return 'AC' + if 'DC' in info : return 'DC' + return None + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def get_temperature_high_threshold(self): + """ + Returns the high temperature threshold for PSU in Celsius + """ + is_valid, high_threshold = self.temp_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 105 + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) + + def get_voltage_low_threshold(self): + """ + Returns PSU low threshold in Volts + """ + is_valid, low_threshold = self.voltage_sensor.get_threshold("LowerCritical") + if not is_valid: + low_threshold = 11.4 #Revisit the value + low_threshold = "{:.2f}".format(low_threshold) + + return float(low_threshold) + + + def get_voltage_high_threshold(self): + """ + Returns PSU high threshold in Volts + """ + is_valid, high_threshold = self.voltage_sensor.get_threshold("UpperCritical") + if not is_valid: + high_threshold = 12.6 #Revisit the value + high_threshold = "{:.2f}".format(high_threshold) + + return float(high_threshold) + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(750) + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py new file mode 100644 index 000000000000..d87ad3db746c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python + +############################################################################# +# DELLEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import os + import time + import struct + import mmap + from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +QSFP_INFO_OFFSET = 128 +SFP_INFO_OFFSET = 0 +QSFP_DD_PAGE0 = 0 + +SFP_TYPE_LIST = [ + '0x3' # SFP/SFP+/SFP28 and later +] +QSFP_TYPE_LIST = [ + '0xc', # QSFP + '0xd', # QSFP+ or later + '0x11' # QSFP28 or later +] +QSFP_DD_TYPE_LIST = [ + '0x18' #QSFP-DD Type +] + +class Sfp(SfpOptoeBase): + """ + DELLEMC Platform-specific Sfp class + """ + BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0" + + def __init__(self, index, sfp_type, eeprom_path): + SfpOptoeBase.__init__(self) + self.port_type = sfp_type + self.sfp_type = sfp_type + self.index = index + self.eeprom_path = eeprom_path + self._initialize_media(delay=False) + + def get_eeprom_path(self): + return self.eeprom_path + + def get_name(self): + return "SFP/SFP+/SFP28" if self.index < 96 else "QSFP28 or later" + + def pci_mem_read(self, mm, offset): + mm.seek(offset) + read_data_stream = mm.read(4) + reg_val = struct.unpack('I', read_data_stream) + mem_val = str(reg_val)[1:-2] + # print "reg_val read:%x"%reg_val + return mem_val + + def pci_mem_write(self, mm, offset, data): + mm.seek(offset) + # print "data to write:%x"%data + mm.write(struct.pack('I', data)) + + def pci_set_value(self, resource, val, offset): + fd = os.open(resource, os.O_RDWR) + mm = mmap.mmap(fd, 0) + val = self.pci_mem_write(mm, offset, val) + mm.close() + os.close(fd) + return val + + def pci_get_value(self, resource, offset): + fd = os.open(resource, os.O_RDWR) + mm = mmap.mmap(fd, 0) + val = self.pci_mem_read(mm, offset) + mm.close() + os.close(fd) + return val + + def _initialize_media(self,delay=False): + """ + Initialize the media type and eeprom driver for SFP + """ + if delay: + time.sleep(1) + self._xcvr_api = None + self.get_xcvr_api() + + self.set_media_type() + self.reinit_sfp_driver() + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_presence(self): + """ + Retrieves the presence of the sfp + Returns : True if sfp is present and false if it is absent + """ + # Check for invalid port_num + mask = {'QSFP' : (1 << 4), 'SFP' : (1 << 0)} + # Port offset starts with 0x4004 + port_offset = 16388 + ((self.index-1) * 16) + + try: + reg_value = int(self.pci_get_value(self.BASE_RES_PATH, port_offset)) + # ModPrsL is active low + if reg_value & mask[self.port_type] == 0: + return True + except ValueError: + pass + + return False + + def get_reset_status(self): + """ + Retrives the reset status of SFP + """ + reset_status = False + if (self.port_type == 'QSFP'): + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + reg_value = int(self.pci_get_value(self.BASE_RES_PATH, port_offset)) + + # Absence of status throws error + if (reg_value == ""): + return reset_status + + # Mask off 4th bit for reset status + mask = (1 << 4) + + if ((reg_value & mask) == 0): + reset_status = True + else: + reset_status = False + + return reset_status + + def get_lpmode(self): + """ + Retrieves the lpmode(low power mode) of this SFP + """ + lpmode_state = False + if (self.port_type == 'QSFP'): + + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + reg_value = int(self.pci_get_value(self.BASE_RES_PATH, port_offset)) + + # Absence of status throws error + if (reg_value == ""): + return lpmode_state + + # Mask off 6th bit for lpmode + mask = (1 << 6) + + # LPMode is active high + if reg_value & mask == 0: + lpmode_state = False + else: + lpmode_state = True + + return lpmode_state + + def reset(self): + """ + Reset the SFP and returns all user settings to their default state + """ + if (self.port_type == 'QSFP'): + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + reg_value = int(self.pci_get_value(self.BASE_RES_PATH, port_offset)) + + # Absence of status throws error + if (reg_value == ""): + return False + + # Mask off 4th bit for reset + mask = (1 << 4) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + + # Sleep 1 second to allow it to settle + time.sleep(1) + + reg_value = reg_value | mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + + return True + + else: + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode(low power mode) of this SFP + """ + if (self.port_type == 'QSFP'): + # Port offset starts with 0x4000 + port_offset = 16384 + ((self.index-1) * 16) + + reg_value = int(self.pci_get_value(self.BASE_RES_PATH, port_offset)) + + # Absence of status throws error + if (reg_value == ""): + return False + + # Mask off 6th bit for lowpower mode + mask = (1 << 6) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset) + + return True + + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + """ + reset = self.get_reset_status() + + if (reset == True): + status = False + else: + status = True + + return status + + def set_media_type(self): + """ + Reads optic eeprom byte to determine media type inserted + """ + eeprom_raw = [] + eeprom_raw = self._xcvr_api_factory._get_id() + if eeprom_raw is not None: + eeprom_raw = hex(eeprom_raw) + if eeprom_raw in SFP_TYPE_LIST: + self.sfp_type = 'SFP' + elif eeprom_raw in QSFP_TYPE_LIST: + self.sfp_type = 'QSFP' + elif eeprom_raw in QSFP_DD_TYPE_LIST: + self.sfp_type = 'QSFP_DD' + else: + #Set native port type if EEPROM type is not recognized/readable + self.sfp_type = self.port_type + else: + self.sfp_type = self.port_type + + return self.sfp_type + + def reinit_sfp_driver(self): + """ + Changes the driver based on media type detected + """ + del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) + new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) + driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) + delete_device = "echo 0x50 >" + del_sfp_path + + if not os.path.isfile(driver_path): + print(driver_path, "does not exist") + return False + + try: + with os.fdopen(os.open(driver_path, os.O_RDONLY)) as fd: + driver_name = fd.read() + driver_name = driver_name.rstrip('\r\n') + driver_name = driver_name.lstrip(" ") + + #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. + if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe2 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe1 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: + subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + time.sleep(0.2) + new_device = "echo optoe3 0x50 >" + new_sfp_path + subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + time.sleep(2) + + except IOError as e: + print("Error: Unable to open file: %s" % str(e)) + return False + + def get_max_port_power(self): + """ + Retrieves the maximumum power allowed on the port in watts + """ + return 5.0 if self.sfp_type == 'QSFP' else 2.5 + + def get_error_description(self): + """ + Retrives the error descriptions of the SFP module + Returns: + String that represents the current error descriptions of vendor specific errors + In case there are multiple errors, they should be joined by '|', + like: "Bad EEPROM|Unsupported cable" + """ + if not self.get_presence(): + return self.SFP_STATUS_UNPLUGGED + else: + if not os.path.isfile(self.eeprom_path): + return "EEPROM driver is not attached" + + if self.sfp_type == 'SFP': + offset = SFP_INFO_OFFSET + elif self.sfp_type == 'QSFP': + offset = QSFP_INFO_OFFSET + elif self.sfp_type == 'QSFP_DD': + offset = QSFP_DD_PAGE0 + + try: + with open(self.eeprom_path, mode="rb", buffering=0) as eeprom: + eeprom.seek(offset) + eeprom.read(1) + except OSError as e: + return "EEPROM read failed ({})".format(e.strerror) + + return self.SFP_STATUS_OK + diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/thermal.py new file mode 100644 index 000000000000..c6761ceaefb5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/thermal.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python + +######################################################################## +# DellEMC S5296F +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## + + +try: + from sonic_platform_base.thermal_base import ThermalBase + from sonic_platform.ipmihelper import IpmiSensor +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """DellEMC Platform-specific Thermal class""" + + # [ Sensor-Name, Sensor-ID ] + SENSOR_MAPPING = [ + ['PT Middle Sensor', 0x1], + ['ASIC On-board', 0x2], + ['PT Left Sensor', 0x3], + ['PT Right Sensor', 0x4], + ['Inlet Airflow Sensor', 0x5], + ['PSU1 Airflow Sensor', 0x7], + ['PSU2 Airflow Sensor', 0x8], + ['PSU1 Sensor', 0xc], + ['PSU2 Sensor', 0xd], + ['CPU On-board', 0xe] + ] + + def __init__(self, thermal_index): + ThermalBase.__init__(self) + self.index = thermal_index + 1 + self.sensor = IpmiSensor(self.SENSOR_MAPPING[self.index - 1][1]) + + def get_name(self): + """ + Retrieves the name of the thermal + + Returns: + string: The name of the thermal + """ + return self.SENSOR_MAPPING[self.index - 1][0] + + def get_presence(self): + """ + Retrieves the presence of the thermal + + Returns: + bool: True if thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the Thermal + + Returns: + string: Model/part number of Thermal + """ + return 'NA' + + def get_serial(self): + """ + Retrieves the serial number of the Thermal + + Returns: + string: Serial number of Thermal + """ + return 'NA' + + def get_status(self): + """ + Retrieves the operational status of the thermal + + Returns: + A boolean value, True if thermal is operating properly, + False if not + """ + return True + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to + nearest thousandth of one degree Celsius, e.g. 30.125 + """ + is_valid, temperature = self.sensor.get_reading() + if not is_valid: + temperature = 0 + + return float(temperature) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + is_valid, high_threshold = self.sensor.get_threshold("UpperNonCritical") + if not is_valid: + return 0.0 + + return float(high_threshold) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + + Returns: + A float number, the high critical threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + is_valid, high_crit_threshold = self.sensor.get_threshold("UpperCritical") + if not is_valid: + return 0.0 + + return float(high_crit_threshold) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in + Celsius up to nearest thousandth of one degree Celsius, + e.g. 30.125 + """ + is_valid, low_threshold = self.sensor.get_threshold("LowerNonRecoverable") + if not is_valid: + low_threshold = 0 + + return float(low_threshold) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one + degree Celsius, e.g. 30.125 + Returns: + A boolean, True if threshold is set successfully, False if + not + """ + # Thermal threshold values are pre-defined based on HW. + return False + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. + Returns: + integer: The 1-based relative physical position in parent + device or -1 if cannot determine the position + """ + return self.index + + def is_replaceable(self): + """ + Indicate whether this Thermal is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/watchdog.py new file mode 100644 index 000000000000..491224d18c15 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/watchdog.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python + +######################################################################## +# +# DELLEMC S5296F +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + import ctypes + import subprocess + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class _timespec(ctypes.Structure): + _fields_ = [ + ('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long) + ] + + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240] + + armed_time = 0 + timeout = 0 + CLOCK_MONOTONIC = 1 + + def __init__(self): + self._librt = ctypes.CDLL('librt.so.1', use_errno=True) + self._clock_gettime = self._librt.clock_gettime + self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)] + + def _get_command_result(self, cmdline): + try: + proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + result = stdout.rstrip('\n'.encode()) + except OSError: + result = None + + return result + + def _get_reg_val(self): + # 0x31 = CPLD I2C Base Address + # 0x07 = Watchdog Function Register + value = self._get_command_result("/usr/sbin/i2cget -y 601 0x31 0x07") + if not value: + return None + else: + return int(value, 16) + + def _set_reg_val(self,val): + # 0x31 = CPLD I2C Base Address + # 0x07 = Watchdog Function Register + value = self._get_command_result("/usr/sbin/i2cset -y 601 0x31 0x07 %s" + % (val)) + return value + + def _get_time(self): + """ + To get clock monotonic time + """ + ts = _timespec() + if self._clock_gettime(self.CLOCK_MONOTONIC, ctypes.pointer(ts)) != 0: + self._errno = ctypes.get_errno() + return 0 + return ts.tv_sec + ts.tv_nsec * 1e-9 + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + timer_offset = -1 + for key,timer_seconds in enumerate(self.TIMERS): + if seconds > 0 and seconds <= timer_seconds: + timer_offset = key + seconds = timer_seconds + break + + if timer_offset == -1: + return -1 + +# cpld_version = Component.get_cpld0_version() +# wd_enabled_version = "0.8" + +# if cpld_version < wd_enabled_version: +# syslog.syslog(syslog.LOG_ERR, +# 'Older System CPLD ver, Update to 0.8 to support watchdog ') +# return -1 + + # Extracting 5th to 8th bits for WD timer values + reg_val = self._get_reg_val() + wd_timer_offset = (reg_val >> 4) & 0xf + + if wd_timer_offset != timer_offset: + # Setting 5th to 7th bits + # value from timer_offset + self.disarm() + self._set_reg_val((reg_val & 0x07) | (timer_offset << 4)) + + if self.is_armed(): + # Setting last bit to WD Timer punch + # Last bit = WD Timer punch + self._set_reg_val(reg_val & 0xFE) + + else: + # Setting 4th bit to enable WD + # 4th bit = Enable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val | 0x8) + + self.armed_time = self._get_time() + self.timeout = seconds + return seconds + + def disarm(self): + """ + Disarm the hardware watchdog + + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + if self.is_armed(): + # Setting 4th bit to disable WD + # 4th bit = Disable WD + reg_val = self._get_reg_val() + self._set_reg_val(reg_val & 0xF7) + + self.armed_time = 0 + self.timeout = 0 + return True + + return False + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + + Returns: + A boolean, True if watchdog is armed, False if not + """ + + # Extracting 4th bit to get WD Enable/Disable status + # 0 - Disabled WD + # 1 - Enabled WD + reg_val = self._get_reg_val() + wd_offset = (reg_val >> 3) & 1 + + return bool(wd_offset) + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + + S5296F doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + if not self.is_armed(): + return -1 + + if self.armed_time > 0 and self.timeout != 0: + cur_time = self._get_time() + + if cur_time <= 0: + return 0 + + diff_time = int(cur_time - self.armed_time) + + if diff_time > self.timeout: + return self.timeout + else: + return self.timeout - diff_time + + return 0 + From 1b83e418f85694ae1a22b84f213d4cd146b227ac Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Thu, 25 Aug 2022 18:30:11 -0700 Subject: [PATCH 710/817] Enable AN for Ethernet24-47 (#11839) Enable port AN ON explicitly and then port will become (oper status) UP. Somehow those ports AN are not default ON in bcm sdk. --- .../Arista-720DT-48S/hwsku.json | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json index e0dc3fc5e55c..44f0a20457e1 100644 --- a/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json +++ b/device/arista/x86_64-arista_720dt_48s/Arista-720DT-48S/hwsku.json @@ -98,98 +98,122 @@ }, "Ethernet24": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet25": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet26": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet27": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet28": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet29": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet30": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet31": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet32": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet33": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet34": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet35": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet36": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet37": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet38": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet39": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet40": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet41": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet42": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet43": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet44": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet45": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet46": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet47": { "default_brkout_mode": "1x1G", + "autoneg": "on", "port_type": "RJ45" }, "Ethernet48": { @@ -205,4 +229,4 @@ "default_brkout_mode": "1x10G" } } -} \ No newline at end of file +} From a1eae940d559472ee02dc2496395d169ca838966 Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Fri, 26 Aug 2022 13:51:53 +0800 Subject: [PATCH 711/817] [SAIServer] support saiserver v2 in bullseye (#11849) Upgrade libboost-atomic1.71 to libboost-atomic1.74 Signed-off-by: richardyu-ms Signed-off-by: richardyu-ms --- platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 | 2 +- platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 index 782320a4b39b..92914d7abbf8 100644 --- a/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-saiserver-brcm/Dockerfile.j2 @@ -11,7 +11,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get -y install \ gdb \ - libboost-atomic1.71.0 + libboost-atomic1.74.0 COPY \ {% for deb in docker_saiserver_brcm_debs.split(' ') -%} diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index 20f966eb3e83..0f6745d580ab 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -27,7 +27,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get -y install \ gdb \ - libboost-atomic1.71.0 + libboost-atomic1.74.0 COPY \ {% for deb in docker_saiserver_mlnx_debs.split(' ') -%} From 0c820a1826576bb0715d3995e27373ea276ce484 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 26 Aug 2022 14:00:45 +0000 Subject: [PATCH 712/817] Mount directory warmboot in docker gbsyncd (#11852) Why I did it The directory /var/warmboot as top directory for warmboot feature is also needed in docker gbsyncd. Some vendor SAI might save data under it. Without it, the SAI init/creation API failure has happened on PikeZ platform. How I did it Mount host directory /host/warmboot as /var/warmboot in docker gbsyncd, which is same as what it has done on docker syncd. --- platform/components/docker-gbsyncd-broncos.mk | 1 + platform/template/docker-gbsyncd-base.mk | 1 + 2 files changed, 2 insertions(+) diff --git a/platform/components/docker-gbsyncd-broncos.mk b/platform/components/docker-gbsyncd-broncos.mk index 1aad33f9680d..56ec6806b6b1 100644 --- a/platform/components/docker-gbsyncd-broncos.mk +++ b/platform/components/docker-gbsyncd-broncos.mk @@ -30,6 +30,7 @@ $(DOCKER_GBSYNCD_BRONCOS)_CONTAINER_NAME = gbsyncd $(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += --privileged -t $(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_GBSYNCD_BRONCOS)_RUN_OPT += -v /host/warmboot:/var/warmboot SONIC_ONLINE_DEBS += $(LIBSAI_BRONCOS) diff --git a/platform/template/docker-gbsyncd-base.mk b/platform/template/docker-gbsyncd-base.mk index 712554405080..404b7513a980 100644 --- a/platform/template/docker-gbsyncd-base.mk +++ b/platform/template/docker-gbsyncd-base.mk @@ -27,3 +27,4 @@ $(DOCKER_GBSYNCD_BASE)_CONTAINER_NAME = gbsyncd $(DOCKER_GBSYNCD_BASE)_RUN_OPT += --privileged -t $(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /host/warmboot:/var/warmboot From 0ed53bbc1ba0f0987720bf1964ebd72ca1daf1d3 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Fri, 26 Aug 2022 08:04:00 -0700 Subject: [PATCH 713/817] New API to support runtime metadata needed for Feature Table field jinja rendering. (#11795) Added new API to return runtime metadata dictionary as needed during Feature Table field rendering by hostcfgd. --- src/sonic-py-common/sonic_py_common/device_info.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 92809474ad6a..6605c798ec1a 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -442,7 +442,7 @@ def is_multi_npu(): def is_voq_chassis(): switch_type = get_platform_info().get('switch_type') - return True if switch_type and switch_type == 'voq' else False + return True if switch_type and (switch_type == 'voq' or switch_type == 'fabric') else False def is_packet_chassis(): @@ -469,6 +469,14 @@ def is_supervisor(): return True return False +def get_device_runtime_metadata(): + chassis_metadata = {} + if is_chassis(): + chassis_metadata = {'CHASSIS_METADATA': {'module_type' : 'supervisor' if is_supervisor() else 'linecard', + 'chassis_type': 'voq' if is_voq_chassis() else 'packet'}} + + port_metadata = {'ETHERNET_PORTS_PRESENT': True if get_path_to_port_config_file(hwsku=None, asic="0" if is_multi_npu() else None) else False} + return {'DEVICE_RUNTIME_METADATA': chassis_metadata | port_metadata } def get_npu_id_from_name(npu_name): if npu_name.startswith(NPU_NAME_PREFIX): From 8ccae96bfeba9b4ebcf4b0def06b25022176ef5a Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 26 Aug 2022 18:38:45 +0200 Subject: [PATCH 714/817] [Arista] Update platform submodule (#11853) --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index d570713cdf71..b65a69a9e1c2 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit d570713cdf715ea9d722a0a8cf606148edc359f8 +Subproject commit b65a69a9e1c2c876ba5210ce8b2a1cc9b5c8b18f diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index d570713cdf71..b65a69a9e1c2 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit d570713cdf715ea9d722a0a8cf606148edc359f8 +Subproject commit b65a69a9e1c2c876ba5210ce8b2a1cc9b5c8b18f From bd55b342d9f52c24da0f9d188113097499c9996f Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Sun, 28 Aug 2022 04:48:22 +0000 Subject: [PATCH 715/817] Advance submodule sonic-sairedis (#11704) 2022-07-28 854d54e: Add support of mdio IPC server class using sai switch api and unix socket (sonic-net/sonic-sairedis#1080) (Jiahua Wang) 2022-07-27 513cb2a: [FlexCounter] Refactor FlexCounter class (sonic-net/sonic-sairedis#1073) (Junchao-Mellanox) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 9652ea49b22e..854d54e07fd8 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 9652ea49b22e5f14421e957e3c8e52a35729478b +Subproject commit 854d54e07fd8eeff9cae0410e8e7f04d6385400b From 178a30bc3bf8e4cf2dc5fac4949660d5a7c8b9c0 Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Sun, 28 Aug 2022 12:28:58 -0700 Subject: [PATCH 716/817] Update swss common submodule for events api (#11858) #### Why I did it Structured events code like eventd, rsyslogplugin, requires changes made in swss-common Submodule adds these newest commits: 56b0f18 (HEAD, origin/master, origin/HEAD, master) Events: APIs to set/get global options (#672) 5467c89 Add changes to yml file to improve pytest (#674) #### How I did it Updated git submodule #### How to verify it Check new commit pointer --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index ecc13b26f70c..56b0f1877a02 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit ecc13b26f70c22812eda4c03ddcc063ed800d8b7 +Subproject commit 56b0f1877a02c43b51595a2d7e6f09e1fabd3d32 From f2c9a3584df071d18ad4cf66721d8a449e7e2533 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 29 Aug 2022 04:45:24 +0200 Subject: [PATCH 717/817] [Arista] Fix content of platform.json for DCS-720DT-48S (#11855) Why I did it Content of platform.json was outdated and some platform_tests/api of sonic-mgmt were failing. How I did it Added the necessary values to platform.json How to verify it Running platform_tests/api of sonic-mgmt should yield 100% passrate. --- .../x86_64-arista_720dt_48s/platform.json | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/device/arista/x86_64-arista_720dt_48s/platform.json b/device/arista/x86_64-arista_720dt_48s/platform.json index 90fa1ea1f57c..625e64335278 100644 --- a/device/arista/x86_64-arista_720dt_48s/platform.json +++ b/device/arista/x86_64-arista_720dt_48s/platform.json @@ -2,15 +2,38 @@ "chassis": { "name": "CCS-720DT-48S", "components": [], - "fans": [ - { - "name": "fan1" - }, - { - "name": "fan2" + "fan_drawers": [ + { + "name": "fixed1", + "status_led": { + "controllable": false, + "available": false + }, + "fans": [ + { + "name": "fan1", + "status_led": { + "available": false + } + } + ] + }, + { + "name": "fixed2", + "status_led": { + "controllable": false, + "available": false + }, + "fans": [ + { + "name": "fan2", + "status_led": { + "available": false + } + } + ] } ], - "fan_drawers": [], "psus": [ { "name": "psu1", @@ -21,7 +44,10 @@ "temperature": false, "voltage": false, "voltage_high_threshold": false, - "voltage_low_threshold": false + "voltage_low_threshold": false, + "status_led": { + "controllable": false + } }, { "name": "psu2", @@ -32,21 +58,28 @@ "temperature": false, "voltage": false, "voltage_high_threshold": false, - "voltage_low_threshold": false + "voltage_low_threshold": false, + "status_led": { + "controllable": false + } } ], "thermals": [ { - "name": "Cpu temp sensor" + "name": "Cpu temp sensor", + "controllable": false }, { - "name": "Psu temp sensor" + "name": "Psu temp sensor", + "controllable": false }, { - "name": "SFP+ connector temp sensor" + "name": "SFP+ connector temp sensor", + "controllable": false }, { - "name": "MAC external temp sensor" + "name": "MAC external temp sensor", + "controllable": false } ], "sfps": [ From 4b4e311c14dcc94a40dcb1802348dcf2ee87c468 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Mon, 29 Aug 2022 11:24:57 +0800 Subject: [PATCH 718/817] [actions] Update github actions label and automerge. (#11736) 1. Add auto approve step when adding label to version upgrading PR. 2. Use mssonicbld TOKEN to merge version upgrading PR instead of 'github actions' --- .github/workflows/automerge.yml | 2 +- .github/workflows/label.yml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 502f5d8987d9..ee27244bfb1f 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -15,7 +15,7 @@ jobs: - name: automerge uses: 'pascalgn/automerge-action@v0.13.1' env: - GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' + GITHUB_TOKEN: '${{ secrets.TOKEN }}' MERGE_LABELS: 'automerge' MERGE_METHOD: 'squash' MERGE_FILTER_AUTHOR: 'mssonicbld' diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 5f8c0279b7e1..307cbd86f871 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -22,6 +22,13 @@ jobs: label: runs-on: ubuntu-latest steps: + - name: approve + run: | + set -e + echo ${{ secrets.GITHUB_TOKEN }} | gh auth login --with-token + url=$(echo $GITHUB_CONTEXT | jq -r '.event.pull_request._links.html.href') + echo PR: $url + gh pr review $url --approve - uses: actions/labeler@main with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From 35945c9015472fb0c2feb019c6cf9dc9479c7e9e Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Mon, 29 Aug 2022 11:26:15 +0800 Subject: [PATCH 719/817] [ci] Update reproducible build related pipeline. (#11810) --- .azure-pipelines/azure-pipelines-repd-build-variables.yml | 2 +- .azure-pipelines/official-build.yml | 2 +- azure-pipelines.yml | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-repd-build-variables.yml b/.azure-pipelines/azure-pipelines-repd-build-variables.yml index 1bd897dafb92..af77e97e2ff0 100644 --- a/.azure-pipelines/azure-pipelines-repd-build-variables.yml +++ b/.azure-pipelines/azure-pipelines-repd-build-variables.yml @@ -1,6 +1,6 @@ variables: ${{ if eq(variables['Build.Reason'],'PullRequest') }}: - VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=$([ "$(System.PullRequest.TargetBranch)" != "master" ] && echo deb,py2,py3,web,git,docker)' + VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=$([[ "$(System.PullRequest.TargetBranch)" =~ ^20[2-9][0-9]{3}$ ]] && echo deb,py2,py3,web,git,docker)' ${{ elseif ne(variables['Build.SourceBranchName'],'master') }}: VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web,git,docker' ${{ else }}: diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml index ee99d7ca3f28..c73124f2e91f 100644 --- a/.azure-pipelines/official-build.yml +++ b/.azure-pipelines/official-build.yml @@ -38,7 +38,7 @@ stages: variables: - name: CACHE_MODE value: wcache - - template: azure-pipelines-repd-build-variables.yml + - template: azure-pipelines-repd-build-variables.yml@buildimage jobs: - template: azure-pipelines-build.yml parameters: diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b9653c2bc8cd..5876080411a2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -38,10 +38,7 @@ resources: variables: - template: .azure-pipelines/azure-pipelines-repd-build-variables.yml@buildimage -- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - - template: .azure-pipelines/template-variables.yml -- ${{ else }}: - - template: .azure-pipelines/template-variables.yml@buildimage +- template: .azure-pipelines/template-variables.yml@buildimage - name: CACHE_MODE value: rcache - name: ENABLE_FIPS From 3bf1abb2dcaa03f02a245609127fc316829a89a2 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Mon, 29 Aug 2022 08:19:28 -0700 Subject: [PATCH 720/817] Address Review Comment to define SONIC_GLOBAL_DB_CLI in gbsyncd.sh (#11857) As part of PR #11754 Change was added to use variable SONIC_DB_NS_CLI for namespace but that will not work since ./files/scripts/syncd_common.sh uses SONIC_DB_CLI. So revert back to use SONIC_DB_CLI and define new variable for SONIC_GLOBAL_DB_CLI for global/host db cli access Also fixed DB_CLI not working for namespace. --- files/scripts/gbsyncd.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/scripts/gbsyncd.sh b/files/scripts/gbsyncd.sh index a7eaaced0cd6..0948aaadc199 100755 --- a/files/scripts/gbsyncd.sh +++ b/files/scripts/gbsyncd.sh @@ -4,8 +4,8 @@ function startplatform() { - declare -a DbCliArray=($SONIC_DB_CLI $SONIC_DB_NS_CLI) - for DB_CLI in ${DbCliArray[@]}; do + declare -A DbCliArray=([0]=$SONIC_GLOBAL_DB_CLI [1]=$SONIC_DB_CLI) + for DB_CLI in "${DbCliArray[@]}"; do # Add gbsyncd to FEATURE table, if not in. It did have same config as syncd. if [ -z $($DB_CLI CONFIG_DB HGET 'FEATURE|gbsyncd' state) ]; then local CMD="local r=redis.call('DUMP', KEYS[1]); redis.call('RESTORE', KEYS[2], 0, r)" @@ -34,11 +34,11 @@ PEER="swss" DEBUGLOG="/tmp/swss-$SERVICE-debug$DEV.log" LOCKFILE="/tmp/swss-$SERVICE-lock$DEV" NAMESPACE_PREFIX="asic" +SONIC_GLOBAL_DB_CLI="sonic-db-cli" SONIC_DB_CLI="sonic-db-cli" -SONIC_DB_NS_CLI="sonic-db-cli" if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace - SONIC_DB_NS_CLI="sonic-db-cli -n $NET_NS" + SONIC_DB_CLI="sonic-db-cli -n $NET_NS" fi case "$1" in From a1d3d994576cfb467c19e2a7394277b6d92a4e71 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 30 Aug 2022 02:15:42 +0800 Subject: [PATCH 721/817] [Build] Increase the size of the installer image (#11869) #### Why I did it Fix the build failure caused by the installer image size too small. The installer image is only used during the build, not impact the final images. See https://dev.azure.com/mssonic/build/_build/results?buildId=139926&view=logs&j=cef3d8a9-152e-5193-620b-567dc18af272&t=359769c4-8b5e-5976-a793-85da132e0a6f ``` + fallocate -l 2048M ./sonic-installer.img + mkfs.vfat ./sonic-installer.img mkfs.fat 4.2 (2021-01-31) ++ mktemp -d + tmpdir=/tmp/tmp.TqdDSc00Cn + mount -o loop ./sonic-installer.img /tmp/tmp.TqdDSc00Cn + cp target/sonic-vs.bin /tmp/tmp.TqdDSc00Cn/onie-installer.bin cp: error writing '/tmp/tmp.TqdDSc00Cn/onie-installer.bin': No space left on device [ FAIL LOG END ] [ target/sonic-vs.img.gz ] ``` #### How I did it Increase the size from 2048M to 4096M. Why not increase to 16G like qcow2 image? The qcow2 supports the sparse disk, although a big disk size allocated, but it will not consume the real disk size. The falocate does not support the sparse disk. We do not want to allocate a very big disk, but no use at all. It will require more space to build. --- scripts/build_kvm_image.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_kvm_image.sh b/scripts/build_kvm_image.sh index 6e5fd7dec742..44009ed013f4 100755 --- a/scripts/build_kvm_image.sh +++ b/scripts/build_kvm_image.sh @@ -36,7 +36,7 @@ create_disk() prepare_installer_disk() { - fallocate -l 2048M $INSTALLER_DISK + fallocate -l 4096M $INSTALLER_DISK mkfs.vfat $INSTALLER_DISK From 186568a21d1998868ca0a8d8e888ef35a5d17bf8 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 29 Aug 2022 11:34:23 -0700 Subject: [PATCH 722/817] Update sensor names for msn4600c for the 5.10 kernel (#11491) * Update sensor names for msn4600c for the 5.10 kernel Looks like a sensor was removed in the 5.10 kernel for the tps53679 sensor, so the names/indexing has changed. Related to Azure/sonic-mgmt#4513. Signed-off-by: Saikrishna Arcot * Update sensors file Signed-off-by: Saikrishna Arcot Signed-off-by: Saikrishna Arcot --- .../x86_64-mlnx_msn4600c-r0/sensors.conf | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf index 3ff78f15023f..b0ad1ff407b4 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/sensors.conf @@ -129,27 +129,29 @@ bus "i2c-5" "i2c-1-mux (chan_id 4)" bus "i2c-15" "i2c-1-mux (chan_id 6)" chip "tps53679-i2c-*-58" - label in1 "PMIC-8 PSU 12V Rail (in1)" - label in2 "PMIC-8 PSU 12V Rail (in2)" - label in3 "PMIC-8 COMEX 1.8V Rail (out)" - label in4 "PMIC-8 COMEX 1.05V Rail (out)" + label in1 "PMIC-8 PSU 12V Rail (in)" + label in2 "PMIC-8 COMEX 1.8V Rail (out)" + label in3 "PMIC-8 COMEX 1.05V Rail (out)" label temp1 "PMIC-8 Temp 1" label temp2 "PMIC-8 Temp 2" - label power1 "PMIC-8 COMEX 1.8V Rail Pwr (out)" - label power2 "PMIC-8 COMEX 1.05V Rail Pwr (out)" - label curr1 "PMIC-8 COMEX 1.8V Rail Curr (out)" - label curr2 "PMIC-8 COMEX 1.05V Rail Curr (out)" + ignore power1 + label power2 "PMIC-8 COMEX 1.8V Rail Pwr (out)" + label power3 "PMIC-8 COMEX 1.05V Rail Pwr (out)" + ignore curr1 + label curr2 "PMIC-8 COMEX 1.8V Rail Curr (out)" + label curr3 "PMIC-8 COMEX 1.05V Rail Curr (out)" chip "tps53679-i2c-*-61" - label in1 "PMIC-9 PSU 12V Rail (in1)" - label in2 "PMIC-9 PSU 12V Rail (in2)" - label in3 "PMIC-9 COMEX 1.2V Rail (out)" - ignore in4 + label in1 "PMIC-9 PSU 12V Rail (in)" + label in2 "PMIC-9 COMEX 1.2V Rail (out)" + ignore in3 label temp1 "PMIC-9 Temp 1" label temp2 "PMIC-9 Temp 2" - label power1 "PMIC-9 COMEX 1.2V Rail Pwr (out)" - ignore power2 - label curr1 "PMIC-9 COMEX 1.2V Rail Curr (out)" - ignore curr2 + ignore power1 + label power2 "PMIC-9 COMEX 1.2V Rail Pwr (out)" + ignore power3 + ignore curr1 + label curr2 "PMIC-9 COMEX 1.2V Rail Curr (out)" + ignore curr3 # Power supplies bus "i2c-4" "i2c-1-mux (chan_id 3)" From de54eece467452b0909cdf13a8a085b8303812ca Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Mon, 29 Aug 2022 11:35:07 -0700 Subject: [PATCH 723/817] Fix error handling when failing to install a deb package (#11846) The current error handling code for when a deb package fails to be installed currently has a chain of commands linked together by && and ends with `exit 1`. The assumption is that the commands would succeed, and the last `exit 1` would end it with a non-zero return code, thus fully failing the target and causing the build to stop because of bash's -e flag. However, if one of the commands prior to `exit 1` returns a non-zero return code, then bash won't actually treat it as a terminating error. From bash's man page: ``` -e Exit immediately if a pipeline (which may consist of a single simple command), a list, or a compound command (see SHELL GRAMMAR above), exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !. If a compound command other than a subshell returns a non-zero status because a command failed while -e was being ignored, the shell does not exit. ``` The part `part of any command executed in a && or || list except the command following the final && or ||` says that if the failing command is not the `exit 1` that we have at the end, then bash doesn't treat it as an error and exit immediately. Additionally, since this is a compound command, but isn't in a subshell (subshell are marked by `(` and `)`, whereas `{` and `}` just tells bash to run the commands in the current environment), bash doesn't exist. The result of this is that in the deb-install target, if a package installation fails, it may be infinitely stuck in that while-loop. There are two fixes for this: change to using a subshell, or use `;` instead of `&&`. Using a subshell would, I think, require exporting any shell variables used in the subshell, so I chose to change the `&&` to `;`. In addition, at the start of the subshell, `set +e` is added in, which removes the exit-on-error handling of bash. This makes sure that all commands are run (the output of which may help for debugging) and that it still exits with 1, which will then fully fail the target. Signed-off-by: Saikrishna Arcot Signed-off-by: Saikrishna Arcot --- slave.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index e1f4a0ef80d9..7cdee954ad73 100644 --- a/slave.mk +++ b/slave.mk @@ -736,13 +736,13 @@ $(SONIC_INSTALL_DEBS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -install # put a lock here because dpkg does not allow installing packages in parallel if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then ifneq ($(CROSS_BUILD_ENVIRON),y) - { sudo DEBIAN_FRONTEND=noninteractive dpkg -i $(DEBS_PATH)/$* $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && sudo lsof /var/lib/dpkg/lock-frontend && ps aux && exit 1 ; } + { sudo DEBIAN_FRONTEND=noninteractive dpkg -i $(DEBS_PATH)/$* $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { set +e; rm -d $(DEBS_PATH)/dpkg_lock; sudo lsof /var/lib/dpkg/lock-frontend; ps aux; exit 1 ; } else # Relocate debian packages python libraries to the cross python virtual env location { sudo DEBIAN_FRONTEND=noninteractive dpkg -i $(if $(findstring $(LINUX_HEADERS),$*),--force-depends) $(DEBS_PATH)/$* $(LOG) && \ rm -rf tmp && mkdir tmp && dpkg -x $(DEBS_PATH)/$* tmp && (sudo cp -rf tmp/usr/lib/python2*/dist-packages/* $(VIRTENV_LIB_CROSS_PYTHON2)/python2*/site-packages/ 2>/dev/null || true) && \ (sudo cp -rf tmp/usr/lib/python3/dist-packages/* $(VIRTENV_LIB_CROSS_PYTHON3)/python3.*/site-packages/ 2>/dev/null || true) && \ - rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && sudo lsof /var/lib/dpkg/lock-frontend && ps aux && exit 1 ; } + rm -d $(DEBS_PATH)/dpkg_lock && break; } || { set +e; rm -d $(DEBS_PATH)/dpkg_lock; sudo lsof /var/lib/dpkg/lock-frontend; ps aux; exit 1 ; } endif fi sleep 10 From 4733053c53dde1c07dbfe72aeb4232e41bef54a4 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:19:58 +0800 Subject: [PATCH 724/817] Fix vs check install login timeout issue (#11727) Why I did it Fix a build not stable issue: #11620 The vs vm has started successfully, but failed to wait for the message "sonic login:". There were 55 builds failed caused by the issue in the last 30 days. AzurePipelineBuildLogs | where startTime > ago(30d) | where type =~ "task" | where result =~ "failed" | where name =~ "Build sonic image" | where content contains "Timeout exceeded" | where content contains "re.compile('sonic login:')" | project-away content | extend branchName=case(reason=~"pullRequest", tostring(todynamic(parameters)['system.pullRequest.targetBranch']), replace("refs/heads/", "", sourceBranch)) | summarize FailedCount=dcount(buildId) by branchName branchName FailedCount master 37 202012 9 202106 4 202111 2 202205 1 201911 1 It is caused by the login message mixed with the output message of the /etc/rc.local, one of the examples as below: (see the message rc.local[307]: sonic+ onie_disco_subnet=255.255.255.0 login: ) The check_install.py was waiting for the message "sonic login:", and Linux console was waiting for the username input (the login message has already printed in the console). https://dev.azure.com/mssonic/build/_build/results?buildId=123294&view=logs&j=cef3d8a9-152e-5193-620b-567dc18af272&t=359769c4-8b5e-5976-a793-85da132e0a6f 2022-07-17T15:00:58.9198877Z [ 25.493855] rc.local[307]: + onie_disco_opt53=05 2022-07-17T15:00:58.9199330Z [ 25.595054] rc.local[307]: + onie_disco_router=10.0.2.2 2022-07-17T15:00:58.9199781Z [ 25.699409] rc.local[307]: + onie_disco_serverid=10.0.2.2 2022-07-17T15:00:58.9200252Z [ 25.789891] rc.local[307]: + onie_disco_siaddr=10.0.2.2 2022-07-17T15:00:58.9200622Z [ 25.880920] 2022-07-17T15:00:58.9200745Z 2022-07-17T15:00:58.9201019Z Debian GNU/Linux 10 sonic ttyS0 2022-07-17T15:00:58.9201201Z 2022-07-17T15:00:58.9201542Z rc.local[307]: sonic+ onie_disco_subnet=255.255.255.0 login: 2022-07-17T15:00:58.9202309Z [ 26.079767] rc.local[307]: + onie_exec_url=file://dev/vdb/onie-installer.bin How I did it Input a newline when finished to run the script /etc/rc.local. If entering a newline, the message "sonic login:" will prompt again. --- check_install.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/check_install.py b/check_install.py index ecd3a8ee9a3b..b8fc3936f751 100755 --- a/check_install.py +++ b/check_install.py @@ -19,6 +19,7 @@ def main(): passwd_prompt = 'Password:' cmd_prompt = "{}@sonic:~\$ $".format(args.u) grub_selection = "The highlighted entry will be executed" + firsttime_prompt = 'firsttime_exit' i = 0 while True: @@ -38,13 +39,17 @@ def main(): # bootup sonic image while True: - i = p.expect([login_prompt, passwd_prompt, cmd_prompt]) + i = p.expect([login_prompt, passwd_prompt, firsttime_prompt, cmd_prompt]) if i == 0: # send user name p.sendline(args.u) elif i == 1: # send password p.sendline(args.P) + elif i == 2: + # fix a login timeout issue, caused by the login_prompt message mixed with the output message of the rc.local + time.sleep(1) + p.sendline() else: break From cf69206d020a4b905bdd2f408c974ed4fe8cc9a2 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Tue, 30 Aug 2022 14:23:09 +0800 Subject: [PATCH 725/817] [ci] Fix bug involved by PR 11810 which affect official build pipeline (#11891) Why I did it Fix the official build not triggered correctly issue, caused by the azp template path not existing. How I did it Change the azp template path. --- .azure-pipelines/official-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml index c73124f2e91f..3ebb106a621b 100644 --- a/.azure-pipelines/official-build.yml +++ b/.azure-pipelines/official-build.yml @@ -38,7 +38,7 @@ stages: variables: - name: CACHE_MODE value: wcache - - template: azure-pipelines-repd-build-variables.yml@buildimage + - template: .azure-pipelines/azure-pipelines-repd-build-variables.yml@buildimage jobs: - template: azure-pipelines-build.yml parameters: From 092e0394b5bb0e74daa8b984c4ee6da5fdaac625 Mon Sep 17 00:00:00 2001 From: Arun Saravanan Balachandran <52521751+ArunSaravananBalachandran@users.noreply.github.com> Date: Tue, 30 Aug 2022 23:53:52 +0530 Subject: [PATCH 726/817] DellEMC: Z9332f - Graceful platform reboot (#10240) Why I did it To gracefully unmount filesystems and stop containers while performing a cold reboot. Unmount ONIE-BOOT if mounted during fast/soft/warm reboot How I did it Override systemd-reboot service to perform a cold reboot. Unmount ONIE-BOOT if mounted using fast/soft/warm-reboot plugins. How to verify it On reboot, verify that the container stop and filesystem unmount services have completed execution before the platform reboot. --- .../debian/platform-modules-z9332f.install | 6 ++++- .../z9332f/scripts/fast-reboot_plugin | 8 +++++++ .../z9332f/scripts/override.conf | 3 +++ .../z9332f/scripts/platform_reboot_override | 23 +++++++++++++++++++ .../z9332f/scripts/soft-reboot_plugin | 1 + .../z9332f/scripts/warm-reboot_plugin | 1 + 6 files changed, 41 insertions(+), 1 deletion(-) create mode 100755 platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/fast-reboot_plugin create mode 100644 platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/override.conf create mode 100755 platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_reboot_override create mode 120000 platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/soft-reboot_plugin create mode 120000 platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/warm-reboot_plugin diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install index ad25015472da..ecbd88a6ffef 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9332f.install @@ -4,7 +4,11 @@ z9332f/scripts/sensors usr/bin z9332f/cfg/z9332f-modules.conf etc/modules-load.d z9332f/systemd/platform-modules-z9332f.service etc/systemd/system z9332f/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 -common/platform_reboot usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 +z9332f/scripts/platform_reboot_override usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 +z9332f/scripts/override.conf /etc/systemd/system/systemd-reboot.service.d +z9332f/scripts/fast-reboot_plugin usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 +z9332f/scripts/soft-reboot_plugin usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 +z9332f/scripts/warm-reboot_plugin usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0 common/pcisysfs.py usr/bin common/io_rd_wr.py usr/local/bin common/fw-updater usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/fast-reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/fast-reboot_plugin new file mode 100755 index 000000000000..0335f71d02b5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/fast-reboot_plugin @@ -0,0 +1,8 @@ +#!/bin/bash + +ONIE_PATH="/mnt/onie-boot" + +# Unmount ONIE partition if mounted +if grep -qs ${ONIE_PATH} /proc/mounts; then + umount ${ONIE_PATH} +fi diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/override.conf b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/override.conf new file mode 100644 index 000000000000..9f17da1c2335 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=/usr/share/sonic/device/x86_64-dellemc_z9332f_d1508-r0/platform_reboot_override diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_reboot_override b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_reboot_override new file mode 100755 index 000000000000..ca04ac0635a7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_reboot_override @@ -0,0 +1,23 @@ +#!/usr/bin/python3 +import os +import struct + +PORT_RES = '/dev/port' + + +def portio_reg_write(resource, offset, val): + fd = os.open(resource, os.O_RDWR) + if(fd < 0): + print('file open failed %s' % resource) + return + if(os.lseek(fd, offset, os.SEEK_SET) != offset): + print('lseek failed on %s' % resource) + return + ret = os.write(fd, struct.pack('B', val)) + if(ret != 1): + print('write failed %d' % ret) + return + os.close(fd) + +if __name__ == "__main__": + portio_reg_write(PORT_RES, 0xcf9, 0xe) diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/soft-reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/soft-reboot_plugin new file mode 120000 index 000000000000..180742bbc4d5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/soft-reboot_plugin @@ -0,0 +1 @@ +fast-reboot_plugin \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/warm-reboot_plugin b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/warm-reboot_plugin new file mode 120000 index 000000000000..180742bbc4d5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/warm-reboot_plugin @@ -0,0 +1 @@ +fast-reboot_plugin \ No newline at end of file From 1e75abc274e019d12496ffd8c9e16a9600245ec6 Mon Sep 17 00:00:00 2001 From: saksarav-nokia Date: Tue, 30 Aug 2022 23:23:17 -0400 Subject: [PATCH 727/817] [Nokia][Nokia-IXR7250E-36x100G & Nokia-IXR7250E-36x400G] Update BCM (#11577) config to support ERSPAN egress mirror and also set flag to preserve ECN --- .../0/jr2cp-nokia-18x100g-4x25g-config.bcm | 44 +++++++++++++++++-- .../0/sai_postinit_cmd.soc | 37 +--------------- .../1/jr2cp-nokia-18x100g-4x25g-config.bcm | 44 +++++++++++++++++-- .../1/sai_postinit_cmd.soc | 7 +-- .../0/jr2cp-nokia-18x400g-config.bcm | 43 ++++++++++++++++-- .../0/sai_postinit_cmd.soc | 2 + .../1/jr2cp-nokia-18x400g-config.bcm | 43 ++++++++++++++++-- .../1/sai_postinit_cmd.soc | 2 + 8 files changed, 168 insertions(+), 54 deletions(-) diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm index 72c101facb35..3eb3ba20a424 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -8,7 +8,7 @@ dma_desc_aggregator_chain_length_max.BCM8885X=1000 dma_desc_aggregator_enable_specific_MDB_LPM.BCM8885X=1 dma_desc_aggregator_timeout_usec.BCM8885X=1000 dport_map_direct.BCM8885X=1 - +sai_postinit_cmd_file=/usr/share/sonic/hwsku/sai_postinit_cmd.soc dtm_flow_mapping_mode_region_64.BCM8885X=3 dtm_flow_mapping_mode_region_65.BCM8885X=3 dtm_flow_mapping_mode_region_66.BCM8885X=3 @@ -1532,12 +1532,50 @@ ucode_port_15.BCM8885X=CGE6:core_0.15 ucode_port_16.BCM8885X=CGE4:core_0.16 ucode_port_17.BCM8885X=CGE2:core_0.17 ucode_port_18.BCM8885X=CGE0:core_0.18 - - ucode_port_19.BCM8885X=RCY0:core_0.19 ucode_port_20.BCM8885X=RCY1:core_1.20 ucode_port_21.BCM8885X=OLP:core_1.21 +ucode_port_100.BCM8885X=RCY_MIRROR.0:core_0.100 +ucode_port_101.BCM8885X=RCY_MIRROR.1:core_0.101 +ucode_port_102.BCM8885X=RCY_MIRROR.2:core_0.102 +ucode_port_103.BCM8885X=RCY_MIRROR.3:core_0.103 +ucode_port_104.BCM8885X=RCY_MIRROR.4:core_0.104 +ucode_port_105.BCM8885X=RCY_MIRROR.5:core_0.105 +ucode_port_106.BCM8885X=RCY_MIRROR.6:core_0.106 +ucode_port_107.BCM8885X=RCY_MIRROR.7:core_0.107 +ucode_port_108.BCM8885X=RCY_MIRROR.8:core_0.108 +ucode_port_109.BCM8885X=RCY_MIRROR.9:core_0.109 +ucode_port_110.BCM8885X=RCY_MIRROR.10:core_0.110 +ucode_port_111.BCM8885X=RCY_MIRROR.11:core_0.111 +ucode_port_112.BCM8885X=RCY_MIRROR.12:core_0.112 +ucode_port_113.BCM8885X=RCY_MIRROR.13:core_0.113 +ucode_port_114.BCM8885X=RCY_MIRROR.14:core_0.114 +ucode_port_115.BCM8885X=RCY_MIRROR.15:core_0.115 +ucode_port_116.BCM8885X=RCY_MIRROR.16:core_0.116 +ucode_port_117.BCM8885X=RCY_MIRROR.17:core_0.117 +ucode_port_118.BCM8885X=RCY_MIRROR.18:core_0.118 +ucode_port_119.BCM8885X=RCY_MIRROR.19:core_0.119 +ucode_port_120.BCM8885X=RCY_MIRROR.0:core_1.120 +ucode_port_121.BCM8885X=RCY_MIRROR.1:core_1.121 +ucode_port_122.BCM8885X=RCY_MIRROR.2:core_1.122 +ucode_port_123.BCM8885X=RCY_MIRROR.3:core_1.123 +ucode_port_124.BCM8885X=RCY_MIRROR.4:core_1.124 +ucode_port_125.BCM8885X=RCY_MIRROR.5:core_1.125 +ucode_port_126.BCM8885X=RCY_MIRROR.6:core_1.126 +ucode_port_127.BCM8885X=RCY_MIRROR.7:core_1.127 +ucode_port_128.BCM8885X=RCY_MIRROR.8:core_1.128 +ucode_port_129.BCM8885X=RCY_MIRROR.9:core_1.129 +ucode_port_130.BCM8885X=RCY_MIRROR.10:core_1.130 +ucode_port_131.BCM8885X=RCY_MIRROR.11:core_1.131 +ucode_port_132.BCM8885X=RCY_MIRROR.12:core_1.132 +ucode_port_133.BCM8885X=RCY_MIRROR.13:core_1.133 +ucode_port_134.BCM8885X=RCY_MIRROR.14:core_1.134 +ucode_port_135.BCM8885X=RCY_MIRROR.15:core_1.135 +ucode_port_136.BCM8885X=RCY_MIRROR.16:core_1.136 +ucode_port_137.BCM8885X=RCY_MIRROR.17:core_1.137 +ucode_port_138.BCM8885X=RCY_MIRROR.18:core_1.138 +ucode_port_139.BCM8885X=RCY_MIRROR.19:core_1.139 port_init_speed_1.BCM8885X=100000 port_init_speed_2.BCM8885X=100000 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc index 26466f89ae44..20e19b8faebe 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/0/sai_postinit_cmd.soc @@ -1,36 +1 @@ -phy set 3 reg=0xd134 data=-8 lane=0 -phy set 3 reg=0xd135 data=132 lane=0 -phy set 3 reg=0xd136 data=-8 lane=0 -phy set 3 reg=0xd137 data=0 lane=0 -phy set 3 reg=0xd138 data=0 lane=0 -phy set 3 reg=0xd133 data=0x1802 lane=0 - -phy set 3 reg=0xd134 data=-8 lane=1 -phy set 3 reg=0xd135 data=132 lane=1 -phy set 3 reg=0xd136 data=-12 lane=1 -phy set 3 reg=0xd137 data=0 lane=1 -phy set 3 reg=0xd138 data=0 lane=1 -phy set 3 reg=0xd133 data=0x1800 lane=1 - -phy set 3 reg=0xd134 data=-8 lane=7 -phy set 3 reg=0xd135 data=132 lane=7 -phy set 3 reg=0xd136 data=-8 lane=7 -phy set 3 reg=0xd137 data=0 lane=7 -phy set 3 reg=0xd138 data=0 lane=7 -phy set 3 reg=0xd133 data=0x1804 lane=7 - - -phy set 6 reg=0xd134 data=-8 lane=1 -phy set 6 reg=0xd135 data=132 lane=1 -phy set 6 reg=0xd136 data=-8 lane=1 -phy set 6 reg=0xd137 data=0 lane=1 -phy set 6 reg=0xd138 data=0 lane=1 -phy set 6 reg=0xd133 data=0x1802 lane=1 - - -phy set 8 reg=0xd134 data=-8 lane=1 -phy set 8 reg=0xd135 data=132 lane=1 -phy set 8 reg=0xd136 data=-8 lane=1 -phy set 8 reg=0xd137 data=0 lane=1 -phy set 8 reg=0xd138 data=0 lane=1 -phy set 8 reg=0xd133 data=0x1802 lane=1 +mod ETPPC_MAP_FWD_QOS_DP_TO_TYPE_FWD 0 128 TYPE_FWD_KEEP_ECN_BITS=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm index cc6d41ea3da6..57e966b35315 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/jr2cp-nokia-18x100g-4x25g-config.bcm @@ -8,7 +8,7 @@ dma_desc_aggregator_chain_length_max.BCM8885X=1000 dma_desc_aggregator_enable_specific_MDB_LPM.BCM8885X=1 dma_desc_aggregator_timeout_usec.BCM8885X=1000 dport_map_direct.BCM8885X=1 - +sai_postinit_cmd_file=/usr/share/sonic/hwsku/sai_postinit_cmd.soc dtm_flow_mapping_mode_region_64.BCM8885X=3 dtm_flow_mapping_mode_region_65.BCM8885X=3 dtm_flow_mapping_mode_region_66.BCM8885X=3 @@ -1551,12 +1551,50 @@ ucode_port_15.BCM8885X=CGE6:core_0.15 ucode_port_16.BCM8885X=CGE4:core_0.16 ucode_port_17.BCM8885X=CGE2:core_0.17 ucode_port_18.BCM8885X=CGE0:core_0.18 - - ucode_port_19.BCM8885X=RCY0:core_0.19 ucode_port_20.BCM8885X=RCY1:core_1.20 ucode_port_21.BCM8885X=OLP:core_1.21 +ucode_port_100.BCM8885X=RCY_MIRROR.0:core_0.100 +ucode_port_101.BCM8885X=RCY_MIRROR.1:core_0.101 +ucode_port_102.BCM8885X=RCY_MIRROR.2:core_0.102 +ucode_port_103.BCM8885X=RCY_MIRROR.3:core_0.103 +ucode_port_104.BCM8885X=RCY_MIRROR.4:core_0.104 +ucode_port_105.BCM8885X=RCY_MIRROR.5:core_0.105 +ucode_port_106.BCM8885X=RCY_MIRROR.6:core_0.106 +ucode_port_107.BCM8885X=RCY_MIRROR.7:core_0.107 +ucode_port_108.BCM8885X=RCY_MIRROR.8:core_0.108 +ucode_port_109.BCM8885X=RCY_MIRROR.9:core_0.109 +ucode_port_110.BCM8885X=RCY_MIRROR.10:core_0.110 +ucode_port_111.BCM8885X=RCY_MIRROR.11:core_0.111 +ucode_port_112.BCM8885X=RCY_MIRROR.12:core_0.112 +ucode_port_113.BCM8885X=RCY_MIRROR.13:core_0.113 +ucode_port_114.BCM8885X=RCY_MIRROR.14:core_0.114 +ucode_port_115.BCM8885X=RCY_MIRROR.15:core_0.115 +ucode_port_116.BCM8885X=RCY_MIRROR.16:core_0.116 +ucode_port_117.BCM8885X=RCY_MIRROR.17:core_0.117 +ucode_port_118.BCM8885X=RCY_MIRROR.18:core_0.118 +ucode_port_119.BCM8885X=RCY_MIRROR.19:core_0.119 +ucode_port_120.BCM8885X=RCY_MIRROR.0:core_1.120 +ucode_port_121.BCM8885X=RCY_MIRROR.1:core_1.121 +ucode_port_122.BCM8885X=RCY_MIRROR.2:core_1.122 +ucode_port_123.BCM8885X=RCY_MIRROR.3:core_1.123 +ucode_port_124.BCM8885X=RCY_MIRROR.4:core_1.124 +ucode_port_125.BCM8885X=RCY_MIRROR.5:core_1.125 +ucode_port_126.BCM8885X=RCY_MIRROR.6:core_1.126 +ucode_port_127.BCM8885X=RCY_MIRROR.7:core_1.127 +ucode_port_128.BCM8885X=RCY_MIRROR.8:core_1.128 +ucode_port_129.BCM8885X=RCY_MIRROR.9:core_1.129 +ucode_port_130.BCM8885X=RCY_MIRROR.10:core_1.130 +ucode_port_131.BCM8885X=RCY_MIRROR.11:core_1.131 +ucode_port_132.BCM8885X=RCY_MIRROR.12:core_1.132 +ucode_port_133.BCM8885X=RCY_MIRROR.13:core_1.133 +ucode_port_134.BCM8885X=RCY_MIRROR.14:core_1.134 +ucode_port_135.BCM8885X=RCY_MIRROR.15:core_1.135 +ucode_port_136.BCM8885X=RCY_MIRROR.16:core_1.136 +ucode_port_137.BCM8885X=RCY_MIRROR.17:core_1.137 +ucode_port_138.BCM8885X=RCY_MIRROR.18:core_1.138 +ucode_port_139.BCM8885X=RCY_MIRROR.19:core_1.139 port_init_speed_1.BCM8885X=100000 port_init_speed_2.BCM8885X=100000 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc index db5ad5ebb264..20e19b8faebe 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x100G/1/sai_postinit_cmd.soc @@ -1,6 +1 @@ -phy set 8 reg=0xd134 data=-8 lane=1 -phy set 8 reg=0xd135 data=132 lane=1 -phy set 8 reg=0xd136 data=-8 lane=1 -phy set 8 reg=0xd137 data=0 lane=1 -phy set 8 reg=0xd138 data=0 lane=1 -phy set 8 reg=0xd133 data=0x1802 lane=1 +mod ETPPC_MAP_FWD_QOS_DP_TO_TYPE_FWD 0 128 TYPE_FWD_KEEP_ECN_BITS=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm index 5303bb263ba2..1da65733155a 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/jr2cp-nokia-18x400g-config.bcm @@ -1551,13 +1551,50 @@ ucode_port_15.BCM8885X=CDGE3:core_0.15 ucode_port_16.BCM8885X=CDGE2:core_0.16 ucode_port_17.BCM8885X=CDGE1:core_0.17 ucode_port_18.BCM8885X=CDGE0:core_0.18 - - ucode_port_19.BCM8885X=RCY0:core_0.19 ucode_port_20.BCM8885X=RCY1:core_1.20 ucode_port_21.BCM8885X=OLP:core_1.21 - +ucode_port_100.BCM8885X=RCY_MIRROR.0:core_0.100 +ucode_port_101.BCM8885X=RCY_MIRROR.1:core_0.101 +ucode_port_102.BCM8885X=RCY_MIRROR.2:core_0.102 +ucode_port_103.BCM8885X=RCY_MIRROR.3:core_0.103 +ucode_port_104.BCM8885X=RCY_MIRROR.4:core_0.104 +ucode_port_105.BCM8885X=RCY_MIRROR.5:core_0.105 +ucode_port_106.BCM8885X=RCY_MIRROR.6:core_0.106 +ucode_port_107.BCM8885X=RCY_MIRROR.7:core_0.107 +ucode_port_108.BCM8885X=RCY_MIRROR.8:core_0.108 +ucode_port_109.BCM8885X=RCY_MIRROR.9:core_0.109 +ucode_port_110.BCM8885X=RCY_MIRROR.10:core_0.110 +ucode_port_111.BCM8885X=RCY_MIRROR.11:core_0.111 +ucode_port_112.BCM8885X=RCY_MIRROR.12:core_0.112 +ucode_port_113.BCM8885X=RCY_MIRROR.13:core_0.113 +ucode_port_114.BCM8885X=RCY_MIRROR.14:core_0.114 +ucode_port_115.BCM8885X=RCY_MIRROR.15:core_0.115 +ucode_port_116.BCM8885X=RCY_MIRROR.16:core_0.116 +ucode_port_117.BCM8885X=RCY_MIRROR.17:core_0.117 +ucode_port_118.BCM8885X=RCY_MIRROR.18:core_0.118 +ucode_port_119.BCM8885X=RCY_MIRROR.19:core_0.119 +ucode_port_120.BCM8885X=RCY_MIRROR.0:core_1.120 +ucode_port_121.BCM8885X=RCY_MIRROR.1:core_1.121 +ucode_port_122.BCM8885X=RCY_MIRROR.2:core_1.122 +ucode_port_123.BCM8885X=RCY_MIRROR.3:core_1.123 +ucode_port_124.BCM8885X=RCY_MIRROR.4:core_1.124 +ucode_port_125.BCM8885X=RCY_MIRROR.5:core_1.125 +ucode_port_126.BCM8885X=RCY_MIRROR.6:core_1.126 +ucode_port_127.BCM8885X=RCY_MIRROR.7:core_1.127 +ucode_port_128.BCM8885X=RCY_MIRROR.8:core_1.128 +ucode_port_129.BCM8885X=RCY_MIRROR.9:core_1.129 +ucode_port_130.BCM8885X=RCY_MIRROR.10:core_1.130 +ucode_port_131.BCM8885X=RCY_MIRROR.11:core_1.131 +ucode_port_132.BCM8885X=RCY_MIRROR.12:core_1.132 +ucode_port_133.BCM8885X=RCY_MIRROR.13:core_1.133 +ucode_port_134.BCM8885X=RCY_MIRROR.14:core_1.134 +ucode_port_135.BCM8885X=RCY_MIRROR.15:core_1.135 +ucode_port_136.BCM8885X=RCY_MIRROR.16:core_1.136 +ucode_port_137.BCM8885X=RCY_MIRROR.17:core_1.137 +ucode_port_138.BCM8885X=RCY_MIRROR.18:core_1.138 +ucode_port_139.BCM8885X=RCY_MIRROR.19:core_1.139 serdes_lane_config_dfe_1.BCM8885X=on serdes_lane_config_dfe_2.BCM8885X=on diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc index 650134e7e589..fd18216d3c84 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/0/sai_postinit_cmd.soc @@ -35,3 +35,5 @@ phy set 17 reg=0xd136 data=-16 lane=2 phy set 17 reg=0xd137 data=0 lane=2 phy set 17 reg=0xd138 data=0 lane=2 phy set 17 reg=0xd133 data=0x1804 lane=2 + +mod ETPPC_MAP_FWD_QOS_DP_TO_TYPE_FWD 0 128 TYPE_FWD_KEEP_ECN_BITS=1 diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm index eb58c1ca42e1..4d6790d5398b 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/jr2cp-nokia-18x400g-config.bcm @@ -1551,13 +1551,50 @@ ucode_port_15.BCM8885X=CDGE3:core_0.15 ucode_port_16.BCM8885X=CDGE2:core_0.16 ucode_port_17.BCM8885X=CDGE1:core_0.17 ucode_port_18.BCM8885X=CDGE0:core_0.18 - - ucode_port_19.BCM8885X=RCY0:core_0.19 ucode_port_20.BCM8885X=RCY1:core_1.20 ucode_port_21.BCM8885X=OLP:core_1.21 - +ucode_port_100.BCM8885X=RCY_MIRROR.0:core_0.100 +ucode_port_101.BCM8885X=RCY_MIRROR.1:core_0.101 +ucode_port_102.BCM8885X=RCY_MIRROR.2:core_0.102 +ucode_port_103.BCM8885X=RCY_MIRROR.3:core_0.103 +ucode_port_104.BCM8885X=RCY_MIRROR.4:core_0.104 +ucode_port_105.BCM8885X=RCY_MIRROR.5:core_0.105 +ucode_port_106.BCM8885X=RCY_MIRROR.6:core_0.106 +ucode_port_107.BCM8885X=RCY_MIRROR.7:core_0.107 +ucode_port_108.BCM8885X=RCY_MIRROR.8:core_0.108 +ucode_port_109.BCM8885X=RCY_MIRROR.9:core_0.109 +ucode_port_110.BCM8885X=RCY_MIRROR.10:core_0.110 +ucode_port_111.BCM8885X=RCY_MIRROR.11:core_0.111 +ucode_port_112.BCM8885X=RCY_MIRROR.12:core_0.112 +ucode_port_113.BCM8885X=RCY_MIRROR.13:core_0.113 +ucode_port_114.BCM8885X=RCY_MIRROR.14:core_0.114 +ucode_port_115.BCM8885X=RCY_MIRROR.15:core_0.115 +ucode_port_116.BCM8885X=RCY_MIRROR.16:core_0.116 +ucode_port_117.BCM8885X=RCY_MIRROR.17:core_0.117 +ucode_port_118.BCM8885X=RCY_MIRROR.18:core_0.118 +ucode_port_119.BCM8885X=RCY_MIRROR.19:core_0.119 +ucode_port_120.BCM8885X=RCY_MIRROR.0:core_1.120 +ucode_port_121.BCM8885X=RCY_MIRROR.1:core_1.121 +ucode_port_122.BCM8885X=RCY_MIRROR.2:core_1.122 +ucode_port_123.BCM8885X=RCY_MIRROR.3:core_1.123 +ucode_port_124.BCM8885X=RCY_MIRROR.4:core_1.124 +ucode_port_125.BCM8885X=RCY_MIRROR.5:core_1.125 +ucode_port_126.BCM8885X=RCY_MIRROR.6:core_1.126 +ucode_port_127.BCM8885X=RCY_MIRROR.7:core_1.127 +ucode_port_128.BCM8885X=RCY_MIRROR.8:core_1.128 +ucode_port_129.BCM8885X=RCY_MIRROR.9:core_1.129 +ucode_port_130.BCM8885X=RCY_MIRROR.10:core_1.130 +ucode_port_131.BCM8885X=RCY_MIRROR.11:core_1.131 +ucode_port_132.BCM8885X=RCY_MIRROR.12:core_1.132 +ucode_port_133.BCM8885X=RCY_MIRROR.13:core_1.133 +ucode_port_134.BCM8885X=RCY_MIRROR.14:core_1.134 +ucode_port_135.BCM8885X=RCY_MIRROR.15:core_1.135 +ucode_port_136.BCM8885X=RCY_MIRROR.16:core_1.136 +ucode_port_137.BCM8885X=RCY_MIRROR.17:core_1.137 +ucode_port_138.BCM8885X=RCY_MIRROR.18:core_1.138 +ucode_port_139.BCM8885X=RCY_MIRROR.19:core_1.139 serdes_lane_config_dfe_1.BCM8885X=on serdes_lane_config_dfe_2.BCM8885X=on diff --git a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc index b22dde093132..109b18ecaaf2 100644 --- a/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc +++ b/device/nokia/x86_64-nokia_ixr7250e_36x400g-r0/Nokia-IXR7250E-36x400G/1/sai_postinit_cmd.soc @@ -12,3 +12,5 @@ phy set 8 reg=0xd136 data=-8 lane=1 phy set 8 reg=0xd137 data=0 lane=1 phy set 8 reg=0xd138 data=0 lane=1 phy set 8 reg=0xd133 data=0x1802 lane=1 + +mod ETPPC_MAP_FWD_QOS_DP_TO_TYPE_FWD 0 128 TYPE_FWD_KEEP_ECN_BITS=1 From 402714723805baff2d49c053a9513a1ab6519f1e Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Wed, 31 Aug 2022 10:48:15 -0700 Subject: [PATCH 728/817] Align API get_device_runtime_metadata() for python version < 3.9 (#11900) Why I did it: API get_device_runtime_metadata() added by #11795 uses merge operator for dict but that is supported only for python version >=3.9. This API will be be used by scrips eg:hostcfgd which is still build for buster which does not have python 3.9 support. --- src/sonic-py-common/sonic_py_common/device_info.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 6605c798ec1a..8173c2677275 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -476,7 +476,10 @@ def get_device_runtime_metadata(): 'chassis_type': 'voq' if is_voq_chassis() else 'packet'}} port_metadata = {'ETHERNET_PORTS_PRESENT': True if get_path_to_port_config_file(hwsku=None, asic="0" if is_multi_npu() else None) else False} - return {'DEVICE_RUNTIME_METADATA': chassis_metadata | port_metadata } + runtime_metadata = {} + runtime_metadata.update(chassis_metadata) + runtime_metadata.update(port_metadata) + return {'DEVICE_RUNTIME_METADATA': runtime_metadata } def get_npu_id_from_name(npu_name): if npu_name.startswith(NPU_NAME_PREFIX): From c601f241396bc4f4f23082fc50311fd5f69fe1a8 Mon Sep 17 00:00:00 2001 From: Dev Ojha <47282568+developfast@users.noreply.github.com> Date: Wed, 31 Aug 2022 11:08:32 -0700 Subject: [PATCH 729/817] [Arista7050cx3] TD3 SKU changes for pg headroom value after interop testing with cisco 8102 (#11901) Why I did it After PFC interop testing between 8102 and 7050cx3, data packet losses were observed on the Rx ports of the 7050cx3 (inflow from 8102) during testing. This was primarily due to the slower response times to react to PFC pause packets for the 8102, when receiving such frames from neighboring devices. To solve for the packet drops, the 7050cx3 pg headroom size has to be increased to 160kB. How I did it Modified the xoff threshold value to 160kB in the pg_profile file to allow for the buffer manager to read that value when building the image, and configuring the device How to verify it run "mmuconfig -l" once image is built Signed-off-by: dojha --- .../Arista-7050CX3-32S-C32/pg_profile_lookup.ini | 12 ++++++------ .../Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini index dd405301f720..5b4482bc74c7 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 50000 5m 4608 4608 33792 0 4608 - 100000 5m 4608 4608 49408 0 4608 - 50000 40m 4608 4608 36352 0 4608 - 100000 40m 4608 4608 54528 0 4608 - 50000 300m 4608 4608 55296 0 4608 - 100000 300m 4608 4608 92672 0 4608 + 50000 5m 4608 4608 160000 0 4608 + 100000 5m 4608 4608 160000 0 4608 + 50000 40m 4608 4608 160000 0 4608 + 100000 40m 4608 4608 160000 0 4608 + 50000 300m 4608 4608 160000 0 4608 + 100000 300m 4608 4608 160000 0 4608 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini index 8ee7a6714b1e..5b4482bc74c7 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 50000 5m 4608 4608 79872 0 4608 - 100000 5m 4608 4608 54528 0 4608 - 50000 40m 4608 4608 39936 0 4608 - 100000 40m 4608 4608 60416 0 4608 - 50000 300m 4608 4608 61440 0 4608 - 100000 300m 4608 4608 103680 0 4608 + 50000 5m 4608 4608 160000 0 4608 + 100000 5m 4608 4608 160000 0 4608 + 50000 40m 4608 4608 160000 0 4608 + 100000 40m 4608 4608 160000 0 4608 + 50000 300m 4608 4608 160000 0 4608 + 100000 300m 4608 4608 160000 0 4608 From 46292d71bee9378460ffed833867bf12ae10090b Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 1 Sep 2022 04:09:36 +0800 Subject: [PATCH 730/817] Add linux perf tool to sonic image (#11906) --- build_debian.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 1db8f3b91ca1..8dcd8596f684 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -385,7 +385,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in fdisk \ gpg \ jq \ - auditd + auditd \ + linux-perf # default rsyslog version is 8.2110.0 which has a bug on log rate limit, # use backport version From 6e878a36da87082788ee737a624ff66d99c86167 Mon Sep 17 00:00:00 2001 From: Longxiang Lyu <35479537+lolyu@users.noreply.github.com> Date: Thu, 1 Sep 2022 04:10:22 +0800 Subject: [PATCH 731/817] [mux] Exit to write `standby` state to `active-active` ports (#11821) [mux] Exit to write standby state to `active-active` ports Signed-off-by: Longxiang Lyu --- files/build_templates/mux.service.j2 | 2 +- files/scripts/write_standby.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/files/build_templates/mux.service.j2 b/files/build_templates/mux.service.j2 index abc04ab30d18..ee1f8ce75389 100644 --- a/files/build_templates/mux.service.j2 +++ b/files/build_templates/mux.service.j2 @@ -14,7 +14,7 @@ ExecStartPre=/usr/local/bin/mark_dhcp_packet.py ExecStartPre=/usr/bin/{{docker_container_name}}.sh start ExecStart=/usr/bin/{{docker_container_name}}.sh wait ExecStop=/usr/bin/{{docker_container_name}}.sh stop -ExecStopPost=/usr/local/bin/write_standby.py +ExecStopPost=/usr/local/bin/write_standby.py --shutdown mux Restart=always RestartSec=30 diff --git a/files/scripts/write_standby.py b/files/scripts/write_standby.py index 86d50737b1c5..85b6ee8b04e8 100755 --- a/files/scripts/write_standby.py +++ b/files/scripts/write_standby.py @@ -178,6 +178,12 @@ def apply_mux_config(self): parser.add_argument('-s', '--active_standby', help='state: intial state for "auto" and/or "manual" config in active-standby mode, default "standby"', type=str, required=False, default='standby') + parser.add_argument('--shutdown', help='write mux state after shutdown other services, supported: mux', + type=str, required=False, choices=['mux']) args = parser.parse_args() - mux_writer = MuxStateWriter(activeactive=args.active_active, activestandby=args.active_standby) + active_active_state = args.active_active + active_standby_state = args.active_standby + if args.shutdown == 'mux': + active_active_state = "standby" + mux_writer = MuxStateWriter(activeactive=active_active_state, activestandby=active_standby_state) mux_writer.apply_mux_config() From 353b2742b23f2529af9733ddca0c712c6f68a17b Mon Sep 17 00:00:00 2001 From: Jing Kan <672454911@qq.com> Date: Thu, 1 Sep 2022 07:58:16 +0800 Subject: [PATCH 732/817] [YANG] Create YANG Model for Console (#11806) How I did it Create YANG Model for SONiC console related features. How to verify it Add tests Signed-off-by: Jing Kan jika@microsoft.com --- src/sonic-yang-models/doc/Configuration.md | 24 +++++ src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 17 ++++ .../tests/yang_model_tests/tests/console.json | 40 +++++++++ .../tests_config/console.json | 88 +++++++++++++++++++ .../yang-models/sonic-console.yang | 76 ++++++++++++++++ 6 files changed, 246 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/console.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/console.json create mode 100644 src/sonic-yang-models/yang-models/sonic-console.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 2167cab027ed..118fca806d0d 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -19,6 +19,7 @@ Table of Contents * [Buffer port egress profile list](#buffer-port-egress-profile-list) * [Cable length](#cable-length) * [COPP_TABLE](#copp_table) + * [Console](#console) * [CRM](#crm) * [Data Plane L3 Interfaces](#data-plane-l3-interfaces) * [DEFAULT_LOSSLESS_BUFFER_PARAMETER](#DEFAULT_LOSSLESS_BUFFER_PARAMETER) @@ -687,6 +688,29 @@ This kind of profiles will be handled by buffer manager and won't be applied to } ``` +### Console + +``` +{ +"CONSOLE_PORT": { + "1": { + "baud_rate": "115200", + "flow_control": "0", + "remote_device": "host-1" + }, + "2": { + "baud_rate": "9600", + "flow_control": "1" + } + }, +"CONSOLE_SWITCH": { + "console_mgmt": { + "enabled": "yes" + } + } +} +``` + ### CRM ``` diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index f5ff5b5fe5f2..790143053260 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -98,6 +98,7 @@ def run(self): './yang-models/sonic-buffer-queue.yang', './yang-models/sonic-cable-length.yang', './yang-models/sonic-copp.yang', + './yang-models/sonic-console.yang', './yang-models/sonic-crm.yang', './yang-models/sonic-default-lossless-buffer-parameter.yang', './yang-models/sonic-device_metadata.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index c7d199fa9f24..44724f00d5d6 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1964,6 +1964,23 @@ "default_dynamic_th": "0", "over_subscribe_ratio": "0" } + }, + + "CONSOLE_PORT": { + "1": { + "baud_rate": "115200", + "flow_control": "0", + "remote_device": "host-1" + }, + "2": { + "baud_rate": "9600", + "flow_control": "1" + } + }, + "CONSOLE_SWITCH": { + "console_mgmt": { + "enabled": "yes" + } } }, "SAMPLE_CONFIG_DB_UNKNOWN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/console.json b/src/sonic-yang-models/tests/yang_model_tests/tests/console.json new file mode 100644 index 000000000000..cd305e4a2086 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/console.json @@ -0,0 +1,40 @@ +{ + "CONSOLE_DISABLED": { + "desc": "Verifying CONSOLE_SWITCH configuration." + }, + "CONSOLE_DEFAULT_CONSOLE_MGMT": { + "desc": "CONSOLE_SWITCH default value for console_mgmt enabled field.", + "eStrKey": "Verify", + "verify": { + "xpath": "/sonic-console:sonic-console/CONSOLE_SWITCH/console_mgmt/enabled", + "key": "sonic-console:enabled", + "value": "no" + } + }, + "CONSOLE_DISABLED_INCORRECT_PATTERN": { + "desc": "CONSOLE_SWITCH configuration pattern failure.", + "eStrKey": "Pattern" + }, + "CONSOLE_PORT_DEFAULT_FLOW_CONTROL": { + "desc": "CONSOLE_PORT default value for flow_control field.", + "eStrKey": "Verify", + "verify": { + "xpath": "/sonic-console:sonic-console/CONSOLE_PORT/CONSOLE_PORT_LIST[name='1']/flow_control", + "key": "sonic-console:flow_control", + "value": "0" + } + }, + "CONSOLE_PORT_INVALID_NAME": { + "desc": "CONSOLE_PORT invalid name failure.", + "eStrKey": "InvalidValue", + "eStr": ["name"] + }, + "CONSOLE_PORT_INVALID_BAUD": { + "desc": "CONSOLE_PORT invalid baud failure.", + "eStrKey": "InvalidValue", + "eStr": ["baud"] + }, + "CONSOLE_PORT_VALID": { + "desc": "Verifying CONSOLE_PORT configuration no failure." + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/console.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/console.json new file mode 100644 index 000000000000..1ccfb4a3ae11 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/console.json @@ -0,0 +1,88 @@ +{ + "CONSOLE_DISABLED": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_SWITCH": { + "sonic-console:console_mgmt": { + "enabled": "no" + } + } + } + }, + "CONSOLE_DEFAULT_CONSOLE_MGMT": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_SWITCH": { + "sonic-console:console_mgmt": { + } + } + } + }, + "CONSOLE_DISABLED_INCORRECT_PATTERN": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_SWITCH": { + "sonic-console:console_mgmt": { + "enabled": "false" + } + } + } + }, + "CONSOLE_PORT_DEFAULT_FLOW_CONTROL": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_PORT": { + "CONSOLE_PORT_LIST": [ + { + "name": "1", + "baud_rate": "9600" + } + ] + } + } + }, + "CONSOLE_PORT_INVALID_NAME": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_PORT": { + "CONSOLE_PORT_LIST": [ + { + "name": "invalid", + "baud_rate": "9600" + } + ] + } + } + }, + "CONSOLE_PORT_INVALID_BAUD": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_PORT": { + "CONSOLE_PORT_LIST": [ + { + "name": "1", + "baud_rate": "invalid" + } + ] + } + } + }, + "CONSOLE_PORT_VALID": { + "sonic-console:sonic-console": { + "sonic-console:CONSOLE_PORT": { + "CONSOLE_PORT_LIST": [ + { + "name": "1", + "baud_rate": "9600", + "flow_control": "1", + "remote_device": "remote_host_1" + }, + { + "name": "2", + "baud_rate": "9600", + "flow_control": "0", + "remote_device": "remote_host_2" + }, + { + "name": "3", + "baud_rate": "9600" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-console.yang b/src/sonic-yang-models/yang-models/sonic-console.yang new file mode 100644 index 000000000000..ed0af5390f49 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-console.yang @@ -0,0 +1,76 @@ +module sonic-console { + yang-version 1.1; + namespace "http://github.com/Azure/sonic-console"; + prefix console; + + import sonic-types { + prefix stypes; + } + + description "SONiC CONSOLE"; + + revision 2022-08-22 { + description "First Revision"; + } + + typedef console-mgmt-enabled { + description "configuration to set if console switch is enabled or not"; + type string { + pattern "yes|no"; + } + } + + typedef console-flow-control { + description "configuration to set if enable flow control on a console port"; + type string { + pattern "0|1"; + } + } + + container sonic-console { + container CONSOLE_PORT { + description "CONSOLE_PORT part of config_db.json"; + + list CONSOLE_PORT_LIST { + key "name"; + + leaf name { + description "Configure console port name"; + type uint16; + } + + leaf baud_rate { + description "Configure baud rate"; + type uint32; + } + + leaf flow_control { + description "Configure if enable/disable flow control"; + type console-flow-control; + default "0"; + } + + leaf remote_device { + description "Configure the remote device name"; + type stypes:hostname; + } + } + + } /* end of container CONSOLE_PORT */ + + container CONSOLE_SWITCH { + description "CONSOLE_SWITCH part of config_db.json"; + + container console_mgmt { + leaf enabled { + description "This configuration indicate if enable console management feature on SONiC"; + type console-mgmt-enabled; + default "no"; + } + } + + } /* end of container CONSOLE_SWITCH */ + + } /* end of top level container */ + +} /* end of module sonic-console */ From 88191b063bd40e27c1a7ce817487a2a7cc4e70aa Mon Sep 17 00:00:00 2001 From: Zhaohui Sun <94606222+ZhaohuiS@users.noreply.github.com> Date: Thu, 1 Sep 2022 08:13:24 +0800 Subject: [PATCH 733/817] Add python-is-python3 package for bullseye base docker (#11895) Why I did it In latest syncd container, it is installed bullseye, can't find command '/usr/bin/python'. Some scripts such as test_copp still calls /usr/bin/python in syncd. Submitted the change in #11807 for syncd docker, but it's better to add it in bullseye base docker. How I did it Install python-is-python3 package in bullseye base docker to resolve this issue, whatever run python or python3, it will run /usr/bin/python3, will not cause the error of can't find command '/usr/bin/python' How to verify it run python in syncd container. Signed-off-by: Zhaohui Sun --- dockers/docker-base-bullseye/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index d08316dbb4df..8d197d3c9011 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -48,6 +48,7 @@ RUN apt-get update && \ python3 \ python3-distutils \ python3-pip \ + python-is-python3 \ vim-tiny \ # Install redis-tools redis-tools \ From fdd9130ecf45b15ec8675f6afddb74895fabc276 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 1 Sep 2022 11:52:02 -0700 Subject: [PATCH 734/817] [YANG] Add MUX_CABLE yang model (#11797) Why I did it Address issue #10970 sign-off: Jing Zhang zhangjing@microsoft.com How I did it Add sonic-mux-cable.yang and unit tests. How to verify it Compile Compile target/python-wheels/sonic_yang_mgmt-1.0-py3-none-any.whl and target/python-wheels/sonic_yang_models-1.0-py3-none-any.whl. Pass sonic-config-engine unit test. Which release branch to backport (provide reason below if selected) 201811 201911 202006 202012 202106 202111 202205 Description for the changelog Link to config_db schema for YANG module changes https://github.com/sonic-net/sonic-buildimage/blob/f8fe41a0238b8a7b9e32ae42262f41b63050c55f/src/sonic-yang-models/doc/Configuration.md#mux_cable --- src/sonic-yang-models/doc/Configuration.md | 21 ++++- src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 16 ++++ .../yang_model_tests/tests/mux_cable.json | 16 ++++ .../tests_config/mux_cable.json | 93 +++++++++++++++++++ .../yang-models/sonic-mux-cable.yang | 92 ++++++++++++++++++ 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/mux_cable.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/mux_cable.json create mode 100644 src/sonic-yang-models/yang-models/sonic-mux-cable.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 118fca806d0d..bd7b51ce5ae2 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -35,9 +35,10 @@ Table of Contents * [Management port](#management-port) * [Management VRF](#management-vrf) * [MAP_PFC_PRIORITY_TO_QUEUE](#map_pfc_priority_to_queue) + * [MUX_CABLE](#muxcable) * [NTP Global Configuration](#ntp-global-configuration) * [NTP and SYSLOG servers](#ntp-and-syslog-servers) - * [Peer Switch](#peer-switch) + * [Peer Switch](#peer-switch) * [Policer](#policer) * [Port](#port) * [Port Channel](#port-channel) @@ -1090,6 +1091,24 @@ instead of data network. } } ``` +### MUX_CABLE + +The **MUX_CABLE** table is used for dualtor interface configuration. The `cable_type` and `soc_ipv4` objects are optional. + +``` +{ + "MUX_CABLE": { + "Ethernet4": { + "cable_type": "active-active", + "server_ipv4": "192.168.0.2/32", + "server_ipv6": "fc02:1000::30/128", + "soc_ipv4": "192.168.0.3/32", + "state": "auto" + } + } +} +``` + ### NTP Global Configuration These configuration options are used to modify the way that diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 790143053260..975b84b68245 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -116,6 +116,7 @@ def run(self): './yang-models/sonic-mgmt_port.yang', './yang-models/sonic-mgmt_vrf.yang', './yang-models/sonic-mirror-session.yang', + './yang-models/sonic-mux-cable.yang', './yang-models/sonic-ntp.yang', './yang-models/sonic-nat.yang', './yang-models/sonic-nvgre-tunnel.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 44724f00d5d6..b833fab06ddd 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1804,6 +1804,22 @@ } }, + "MUX_CABLE": { + "Ethernet4": { + "cable_type": "active-active", + "server_ipv4": "192.168.0.2/32", + "server_ipv6": "fc02:1000::30/128", + "soc_ipv4": "192.168.0.3/32", + "state": "auto" + }, + "Ethernet0": { + "server_ipv4": "192.168.0.2/32", + "server_ipv6": "fc02:1000::30/128", + "state": "auto" + } + }, + + "POLICER": { "everflow_static_policer": { "meter_type": "bytes", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/mux_cable.json b/src/sonic-yang-models/tests/yang_model_tests/tests/mux_cable.json new file mode 100644 index 000000000000..0d02097fdf63 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/mux_cable.json @@ -0,0 +1,16 @@ +{ + "MUX_CABLE_ACTIVE_STANDBY_INTERFACE": { + "desc": "Load MUX_CABLE for active-standby interface." + }, + "MUX_CABLE_ACTIVE_ACTIVE_INTERFACE": { + "desc":"Load MUX_CABLE for active-active interface." + }, + "MUX_CABLE_INVALID_STATE": { + "desc": "Load MUX_CABLE with invalid state.", + "eStrKey": "InvalidValue" + }, + "MUX_CABLE_INVALID_IP": { + "desc": "Load MUX_CABLE with invalid server ip address.", + "eStrKey": "Pattern" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux_cable.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux_cable.json new file mode 100644 index 000000000000..815171306bdc --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mux_cable.json @@ -0,0 +1,93 @@ +{ + "MUX_CABLE_ACTIVE_STANDBY_INTERFACE": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "lanes": "65", + "mtu": "9000", + "name": "Ethernet0", + "tpid": "0x8100", + "speed": "25000" + } + ] + } + }, + "sonic-mux-cable:sonic-mux-cable": { + "sonic-mux-cable:MUX_CABLE": { + "MUX_CABLE_LIST": [ + { + "ifname": "Ethernet0", + "server_ipv4": "192.168.0.2/32", + "server_ipv6": "fc02:1000::30/128", + "state": "auto" + } + ] + + } + } + }, + + "MUX_CABLE_ACTIVE_ACTIVE_INTERFACE": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet4", + "lanes": "65", + "mtu": "9000", + "name": "Ethernet4", + "tpid": "0x8100", + "speed": "25000" + } + ] + } + }, + "sonic-mux-cable:sonic-mux-cable": { + "sonic-mux-cable:MUX_CABLE": { + "MUX_CABLE_LIST": [ + { + "ifname": "Ethernet4", + "cable_type": "active-active", + "server_ipv4": "192.168.0.2/32", + "server_ipv6": "fc02:1000::30/128", + "soc_ipv4": "192.168.0.3/32", + "state": "auto" + } + ] + + } + } + }, + + "MUX_CABLE_INVALID_STATE": { + "sonic-mux-cable:sonic-mux-cable": { + "sonic-mux-cable:MUX_CABLE": { + "MUX_CABLE_LIST": [ + { + "state": "Standby" + } + ] + + } + } + }, + + "MUX_CABLE_INVALID_IP": { + "sonic-mux-cable:sonic-mux-cable": { + "sonic-mux-cable:MUX_CABLE": { + "MUX_CABLE_LIST": [ + { + "server_ipv4": "999.999.999.999/32" + } + ] + + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-mux-cable.yang b/src/sonic-yang-models/yang-models/sonic-mux-cable.yang new file mode 100644 index 000000000000..a66a588c91da --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-mux-cable.yang @@ -0,0 +1,92 @@ +module sonic-mux-cable { + namespace "http://github.com/Azure/sonic-mux-cable"; + prefix mux_cable; + yang-version 1.1; + + import ietf-inet-types { + prefix inet; + } + + import sonic-port { + prefix prt; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description + "SONiC DualToR MUX CABLE confifuration data"; + + revision 2022-08-19 { + description + "Initial revision"; + } + + container sonic-mux-cable { + + container MUX_CABLE { + + list MUX_CABLE_LIST { + + key "ifname"; + + leaf ifname { + type leafref { + path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:name"; + } + description + "Reference of port on which MUX cable to be configured."; + } + + leaf cable_type { + type enumeration { + enum active-active; + enum active-standby; + } + default active-standby; + description "SONiC DualToR interface cable type."; + } + + leaf server_ipv4 { + type inet:ipv4-prefix; + + description "Server IPv4 Address."; + } + + leaf server_ipv6 { + type inet:ipv6-prefix; + + description "Server IPv6 Address."; + } + + leaf soc_ipv4 { + type inet:ipv4-prefix; + + description "SoC IPv4 address. Optional and for active-active ports only. "; + } + + leaf soc_ipv6 { + type inet:ipv6-prefix; + + description "SoC IPv6 address. Optional and for active-active ports only. "; + } + + leaf state { + type enumeration { + enum auto; + enum manual; + enum detach; + enum active; + enum standby; + } + + default auto; + description "MUX mode determining if auto failover is enabled. "; + } + } + } + } +} From f82c1fd8ae992ffd4dd9791f064f91ea499026eb Mon Sep 17 00:00:00 2001 From: arunlk-dell <83708154+arunlk-dell@users.noreply.github.com> Date: Fri, 2 Sep 2022 05:25:41 +0530 Subject: [PATCH 735/817] Z9432F kernel dependency of platform module (#11941) Why I did it Z9432F Update the kernel dependency of platform module How I did it Modified the kernel version to current latest 5.10.0-12-2 --- platform/broadcom/sonic-platform-modules-dell/debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/control b/platform/broadcom/sonic-platform-modules-dell/debian/control index 7821dbd4f21b..8e3db2f0fd7e 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/control +++ b/platform/broadcom/sonic-platform-modules-dell/debian/control @@ -57,7 +57,7 @@ Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-z9432f Architecture: amd64 -Depends: linux-image-5.10.0-8-2-amd64-unsigned +Depends: linux-image-5.10.0-12-2-amd64-unsigned Description: kernel modules for platform devices such as fan, led, sfp Package: platform-modules-n3248pxe From 030de9f26d8ebd09ca56d7aa5ab1ede0ec187607 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Fri, 2 Sep 2022 14:07:48 +0800 Subject: [PATCH 736/817] [actions] Add github context env in label action. (#11926) --- .github/workflows/label.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 307cbd86f871..ec04157110ae 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -23,6 +23,8 @@ jobs: runs-on: ubuntu-latest steps: - name: approve + env: + GITHUB_CONTEXT: ${{ toJson(github) }} run: | set -e echo ${{ secrets.GITHUB_TOKEN }} | gh auth login --with-token From a762b35cbca847902410de13693f0e94edcbe8ee Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 2 Sep 2022 13:40:40 -0700 Subject: [PATCH 737/817] [arp_update]: Set failed IPv6 neighbors to incomplete (#11919) After pinging any failed IPv6 neighbor entries, set the remaining failed/incomplete entries to a permanent INCOMPLETE state. This manual setting to INCOMPLETE prevents these entries from automatically transitioning to FAILED state, and since they are now incomplete any subsequent NA messages for these neighbors is able to resolve the entry in the cache. Signed-off-by: Lawrence Lee --- files/scripts/arp_update | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/files/scripts/arp_update b/files/scripts/arp_update index df2758e187a7..5522ea46828a 100755 --- a/files/scripts/arp_update +++ b/files/scripts/arp_update @@ -78,6 +78,17 @@ while /bin/true; do eval `eval $ip6cmd` if [[ $SUBTYPE == "dualtor" ]]; then + # manually set any remaining FAILED/INCOMPLETE entries to permanently INCOMPLETE + # this prevents any remaining INCOMPLETE entries from automatically transitioning to FAILED + # once these entries are incomplete, any subsequent neighbor advertisement messages + # are able to resolve the entry + + # generates the following command for each failed or incomplete IPv6 neighbor + # ip neigh replace dev nud incomplete + neigh_replace_template="sed -e 's/^/ip neigh replace /' -e 's/,/ dev /' -e 's/$/ nud incomplete;/'" + ip_neigh_replace_cmd="ip -6 neigh show | grep -v fe80 | grep Vlan1000 | grep -E 'FAILED|INCOMPLETE' | cut -d ' ' -f 1,3 --output-delimiter=',' | $neigh_replace_template" + eval `eval $ip_neigh_replace_cmd` + # on dual ToR devices, try to resolve failed neighbor entries since # these entries will have tunnel routes installed, preventing normal # neighbor resolution (SWSS PR #2137) From a6843927d9b25ec32adf24841ff138da0d5efcbd Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 2 Sep 2022 13:50:42 -0700 Subject: [PATCH 738/817] [mux] skip mux operations during warm shutdown (#11937) * [mux] skip mux operations during warm shutdown - Enhance write_standby.py script to skip actions during warm shutdown. - Expand the support to BGP service. - MuX support was added by a previous PR. - don't skip action during warm recovery Signed-off-by: Ying Xie --- .../per_namespace/bgp.service.j2 | 2 +- files/scripts/write_standby.py | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/files/build_templates/per_namespace/bgp.service.j2 b/files/build_templates/per_namespace/bgp.service.j2 index 5ef30a164f69..0c9f01fe8b68 100644 --- a/files/build_templates/per_namespace/bgp.service.j2 +++ b/files/build_templates/per_namespace/bgp.service.j2 @@ -15,7 +15,7 @@ User={{ sonicadmin_user }} ExecStartPre=/usr/local/bin/{{docker_container_name}}.sh start{% if multi_instance == 'true' %} %i{% endif %} ExecStart=/usr/local/bin/{{docker_container_name}}.sh wait{% if multi_instance == 'true' %} %i{% endif %} ExecStop=/usr/local/bin/{{docker_container_name}}.sh stop{% if multi_instance == 'true' %} %i{% endif %} -ExecStopPost=/usr/local/bin/write_standby.py +ExecStopPost=/usr/local/bin/write_standby.py --shutdown bgp RestartSec=30 diff --git a/files/scripts/write_standby.py b/files/scripts/write_standby.py index 85b6ee8b04e8..13c5b17ea64e 100755 --- a/files/scripts/write_standby.py +++ b/files/scripts/write_standby.py @@ -20,13 +20,15 @@ class MuxStateWriter(object): Class used to write standby mux state to APP DB """ - def __init__(self, activeactive, activestandby): + def __init__(self, activeactive, activestandby, shutdown_module): self.config_db_connector = None self.appl_db_connector = None self.state_db_connector = None self.asic_db_connector = None self.default_active_active_state = activeactive self.default_active_standby_state = activestandby + self.shutdown_module = shutdown_module + self.is_shutdwon = (self.shutdown_module != None) @property def config_db(self): @@ -97,7 +99,15 @@ def is_warmrestart(self): tbl = Table(self.state_db, 'WARM_RESTART_ENABLE_TABLE') (status, value) = tbl.hget('system', 'enable') - return status and value == 'true' + if status and value == 'true': + return True + + if self.shutdown_module: + (status, value) = tbl.hget(self.shutdown_module, 'enable') + if status and value == 'true': + return True + + return False def get_all_mux_intfs_modes(self): """ @@ -153,7 +163,7 @@ def apply_mux_config(self): # If not running on a dual ToR system, take no action return - if self.is_warmrestart: + if self.is_warmrestart and self.is_shutdwon: # If in warmrestart context, take no action logger.log_warning("Skip setting mux state due to ongoing warmrestart.") return @@ -178,12 +188,12 @@ def apply_mux_config(self): parser.add_argument('-s', '--active_standby', help='state: intial state for "auto" and/or "manual" config in active-standby mode, default "standby"', type=str, required=False, default='standby') - parser.add_argument('--shutdown', help='write mux state after shutdown other services, supported: mux', - type=str, required=False, choices=['mux']) + parser.add_argument('--shutdown', help='write mux state after shutdown other services, supported: mux, bgp', + type=str, required=False, choices=['mux', 'bgp'], default=None) args = parser.parse_args() active_active_state = args.active_active active_standby_state = args.active_standby - if args.shutdown == 'mux': + if args.shutdown in ['mux', 'bgp']: active_active_state = "standby" - mux_writer = MuxStateWriter(activeactive=active_active_state, activestandby=active_standby_state) + mux_writer = MuxStateWriter(activeactive=active_active_state, activestandby=active_standby_state, shutdown_module=args.shutdown) mux_writer.apply_mux_config() From 750e1b3017f8dfafcc153c5b931b13bbf2f8e20e Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Fri, 2 Sep 2022 15:53:54 -0700 Subject: [PATCH 739/817] Define whether a test is required by code (#11921) * Define whether a test is required by code Why I did it Define whether a test job is required before merging by code. Let the failure of multi-asic and t0-sonic don't block pr merge. The 'required' configuration can be modified by the owner in the future. How I did it Required: t1-lag, t0 Not required: multi-asic, t0-sonic How to verify it AZP itself verifies it. Signed-off-by: jianquanye@microsoft.com --- .azure-pipelines/run-test-template.yml | 3 --- azure-pipelines.yml | 15 ++++++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml index 7ea0a982780f..2f1b3d8702d9 100644 --- a/.azure-pipelines/run-test-template.yml +++ b/.azure-pipelines/run-test-template.yml @@ -51,9 +51,6 @@ steps: rm -rf $(Build.ArtifactStagingDirectory)/* docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }} ${{ parameters.section }}" displayName: "Run tests" - ${{ if eq(parameters.tbtype, 'multi-asic-t1-lag-pr') }}: - continueOnError: true - - script: | # save dut state if test fails virsh_version=$(virsh --version) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5876080411a2..7856915f9b60 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -81,6 +81,10 @@ stages: - name: testbed_file value: vtestbed.csv +# For every test job: +# continueOnError: false means it's a required test job and will block merge if it fails +# continueOnError: true means it's an optional test job and will not block merge even though it fails(unless a required test job depends on its result) + jobs: - job: pool: sonictest @@ -133,7 +137,7 @@ stages: pool: sonictest displayName: "kvmtest-t0-part1" timeoutInMinutes: 360 - + continueOnError: true steps: - template: .azure-pipelines/run-test-template.yml parameters: @@ -147,7 +151,7 @@ stages: pool: sonictest displayName: "kvmtest-t0-part2" timeoutInMinutes: 360 - + continueOnError: true steps: - template: .azure-pipelines/run-test-template.yml parameters: @@ -165,6 +169,7 @@ stages: - t0_part1 - t0_part2 condition: always() + continueOnError: false variables: resultOfPart1: $[ dependencies.t0_part1.result ] resultOfPart2: $[ dependencies.t0_part2.result ] @@ -183,7 +188,7 @@ stages: pool: sonictest-t1-lag displayName: "kvmtest-t1-lag" timeoutInMinutes: 360 - + continueOnError: false steps: - template: .azure-pipelines/run-test-template.yml parameters: @@ -196,7 +201,7 @@ stages: pool: sonictest-sonic-t0 displayName: "kvmtest-t0-sonic" timeoutInMinutes: 360 - + continueOnError: true steps: - template: .azure-pipelines/run-test-template.yml parameters: @@ -210,7 +215,7 @@ stages: pool: sonictest-ma displayName: "kvmtest-multi-asic-t1-lag" timeoutInMinutes: 240 - + continueOnError: true steps: - template: .azure-pipelines/run-test-template.yml parameters: From e96ec5a74cf67011b17b8a65e9167d7be41b2ebb Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 2 Sep 2022 16:06:10 -0700 Subject: [PATCH 740/817] [kernel]: Submodule update (#11947) Include following commit: - 443253f [patch]: Add accpt_untracked_na kernel param (#292) Signed-off-by: Lawrence Lee --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index fdd9bac78cfc..443253f637ec 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit fdd9bac78cfc2bbe932833b38c2191b1d382ed07 +Subproject commit 443253f637ec3dccac246199977a6d65346d7878 From 71d63a7be75111539a04b4c54fdb617fbe7e0081 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Fri, 2 Sep 2022 21:52:24 -0700 Subject: [PATCH 741/817] New commits in swss-common: (#11954) * 651f52b (HEAD, origin/master, origin/HEAD, master) Change syslog level of Event Publish (#677) * aca253a Add routing rule table for DASH (#668) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 56b0f1877a02..651f52b8e511 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 56b0f1877a02c43b51595a2d7e6f09e1fabd3d32 +Subproject commit 651f52b8e51107112c8205d12608723357ecbe5e From 6a54bc439a980c7fc10e7a74de6472ee7731f8a5 Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Sat, 3 Sep 2022 07:33:25 -0700 Subject: [PATCH 742/817] Streaming structured events implementation (#11848) With this PR in, you flap BGP and use events_tool to see the published events. With telemetry PR #111 in and corresponding submodule update done in buildimage, one could run gnmi_cli to capture BGP flap events. --- dockers/docker-eventd/Dockerfile.j2 | 36 + dockers/docker-eventd/critical_processes | 1 + dockers/docker-eventd/start.sh | 6 + dockers/docker-eventd/supervisord.conf | 52 + dockers/docker-fpm-frr/Dockerfile.j2 | 6 + dockers/docker-fpm-frr/bgp_regex.json | 8 + dockers/docker-fpm-frr/events_info.json | 10 + files/build_templates/docker_image_ctl.j2 | 1 + files/build_templates/eventd.service.j2 | 17 + files/build_templates/init_cfg.json.j2 | 3 +- files/build_templates/rsyslog_plugin.conf.j2 | 19 + .../build_templates/sonic_debian_extension.j2 | 4 + rules/docker-config-engine-bullseye.mk | 4 +- rules/docker-config-engine-buster.mk | 1 + rules/docker-eventd.dep | 11 + rules/docker-eventd.mk | 47 + rules/eventd.dep | 10 + rules/eventd.mk | 19 + rules/scripts.mk | 4 + rules/telemetry.mk | 5 +- slave.mk | 2 + src/sonic-eventd/Makefile | 84 ++ src/sonic-eventd/debian/changelog | 5 + src/sonic-eventd/debian/compat | 1 + src/sonic-eventd/debian/control | 14 + src/sonic-eventd/debian/rules | 6 + src/sonic-eventd/rsyslog_plugin/main.cpp | 57 ++ .../rsyslog_plugin/rsyslog_plugin.cpp | 135 +++ .../rsyslog_plugin/rsyslog_plugin.h | 40 + src/sonic-eventd/rsyslog_plugin/subdir.mk | 13 + .../rsyslog_plugin/syslog_parser.cpp | 65 ++ .../rsyslog_plugin/syslog_parser.h | 46 + .../rsyslog_plugin/timestamp_formatter.cpp | 74 ++ .../rsyslog_plugin/timestamp_formatter.h | 27 + .../rsyslog_plugin_ut.cpp | 274 ++++++ .../rsyslog_plugin_tests/subdir.mk | 12 + .../rsyslog_plugin_tests/test_regex_1.rc.json | 0 .../rsyslog_plugin_tests/test_regex_2.rc.json | 7 + .../rsyslog_plugin_tests/test_regex_3.rc.json | 6 + .../rsyslog_plugin_tests/test_regex_4.rc.json | 7 + .../rsyslog_plugin_tests/test_regex_5.rc.json | 7 + .../rsyslog_plugin_tests/test_syslogs.txt | 4 + .../rsyslog_plugin_tests/test_syslogs_2.txt | 3 + src/sonic-eventd/src/eventd.cpp | 798 +++++++++++++++ src/sonic-eventd/src/eventd.h | 268 +++++ src/sonic-eventd/src/main.cpp | 18 + src/sonic-eventd/src/subdir.mk | 13 + src/sonic-eventd/tests/eventd_ut.cpp | 915 ++++++++++++++++++ src/sonic-eventd/tests/main.cpp | 97 ++ .../database_config.json | 112 +++ .../database_config0.json | 92 ++ .../database_config1.json | 92 ++ .../database_global.json | 16 + src/sonic-eventd/tests/subdir.mk | 12 + src/sonic-eventd/tools/events_publish_tool.py | 97 ++ src/sonic-eventd/tools/events_tool.cpp | 328 +++++++ src/sonic-eventd/tools/events_volume_test.py | 68 ++ src/sonic-eventd/tools/sample_ip.json | 1 + src/sonic-eventd/tools/subdir.mk | 12 + 59 files changed, 4088 insertions(+), 4 deletions(-) create mode 100644 dockers/docker-eventd/Dockerfile.j2 create mode 100644 dockers/docker-eventd/critical_processes create mode 100755 dockers/docker-eventd/start.sh create mode 100644 dockers/docker-eventd/supervisord.conf create mode 100644 dockers/docker-fpm-frr/bgp_regex.json create mode 100644 dockers/docker-fpm-frr/events_info.json create mode 100644 files/build_templates/eventd.service.j2 create mode 100644 files/build_templates/rsyslog_plugin.conf.j2 create mode 100644 rules/docker-eventd.dep create mode 100644 rules/docker-eventd.mk create mode 100644 rules/eventd.dep create mode 100644 rules/eventd.mk create mode 100644 src/sonic-eventd/Makefile create mode 100644 src/sonic-eventd/debian/changelog create mode 100644 src/sonic-eventd/debian/compat create mode 100644 src/sonic-eventd/debian/control create mode 100755 src/sonic-eventd/debian/rules create mode 100644 src/sonic-eventd/rsyslog_plugin/main.cpp create mode 100644 src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.cpp create mode 100644 src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.h create mode 100644 src/sonic-eventd/rsyslog_plugin/subdir.mk create mode 100644 src/sonic-eventd/rsyslog_plugin/syslog_parser.cpp create mode 100644 src/sonic-eventd/rsyslog_plugin/syslog_parser.h create mode 100644 src/sonic-eventd/rsyslog_plugin/timestamp_formatter.cpp create mode 100644 src/sonic-eventd/rsyslog_plugin/timestamp_formatter.h create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/rsyslog_plugin_ut.cpp create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/subdir.mk create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_regex_1.rc.json create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_regex_2.rc.json create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_regex_3.rc.json create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_regex_4.rc.json create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_regex_5.rc.json create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_syslogs.txt create mode 100644 src/sonic-eventd/rsyslog_plugin_tests/test_syslogs_2.txt create mode 100644 src/sonic-eventd/src/eventd.cpp create mode 100644 src/sonic-eventd/src/eventd.h create mode 100644 src/sonic-eventd/src/main.cpp create mode 100644 src/sonic-eventd/src/subdir.mk create mode 100644 src/sonic-eventd/tests/eventd_ut.cpp create mode 100644 src/sonic-eventd/tests/main.cpp create mode 100644 src/sonic-eventd/tests/redis_multi_db_ut_config/database_config.json create mode 100644 src/sonic-eventd/tests/redis_multi_db_ut_config/database_config0.json create mode 100644 src/sonic-eventd/tests/redis_multi_db_ut_config/database_config1.json create mode 100644 src/sonic-eventd/tests/redis_multi_db_ut_config/database_global.json create mode 100644 src/sonic-eventd/tests/subdir.mk create mode 100644 src/sonic-eventd/tools/events_publish_tool.py create mode 100644 src/sonic-eventd/tools/events_tool.cpp create mode 100644 src/sonic-eventd/tools/events_volume_test.py create mode 100644 src/sonic-eventd/tools/sample_ip.json create mode 100644 src/sonic-eventd/tools/subdir.mk diff --git a/dockers/docker-eventd/Dockerfile.j2 b/dockers/docker-eventd/Dockerfile.j2 new file mode 100644 index 000000000000..8d935dc9f365 --- /dev/null +++ b/dockers/docker-eventd/Dockerfile.j2 @@ -0,0 +1,36 @@ +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +ARG docker_container_name +ARG image_version +RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf + +# Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +# Update apt's cache of available packages +RUN apt-get update + +{% if docker_eventd_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_eventd_debs.split(' '), "/debs/") }} + +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_eventd_debs.split(' ')) }} +{%- endif %} + +# Clean up +RUN apt-get clean -y && \ + apt-get autoclean -y && \ + apt-get autoremove -y && \ + rm -rf /debs + +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] +COPY ["critical_processes", "/etc/supervisor"] + +ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-eventd/critical_processes b/dockers/docker-eventd/critical_processes new file mode 100644 index 000000000000..8ff28edbc148 --- /dev/null +++ b/dockers/docker-eventd/critical_processes @@ -0,0 +1 @@ +program:eventd diff --git a/dockers/docker-eventd/start.sh b/dockers/docker-eventd/start.sh new file mode 100755 index 000000000000..60cd6a00aecb --- /dev/null +++ b/dockers/docker-eventd/start.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +if [ "${RUNTIME_OWNER}" == "" ]; then + RUNTIME_OWNER="kube" +fi + diff --git a/dockers/docker-eventd/supervisord.conf b/dockers/docker-eventd/supervisord.conf new file mode 100644 index 000000000000..5d9a50bca2ae --- /dev/null +++ b/dockers/docker-eventd/supervisord.conf @@ -0,0 +1,52 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[eventlistener:dependent-startup] +command=python3 -m supervisord_dependent_startup +autostart=true +autorestart=unexpected +startretries=0 +exitcodes=0,3 +events=PROCESS_STATE +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-listener] +command=/usr/bin/supervisor-proc-exit-listener --container-name eventd +events=PROCESS_STATE_EXITED,PROCESS_STATE_RUNNING +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +[program:start] +command=/usr/bin/start.sh +priority=2 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + + +[program:eventd] +command=/usr/sbin/eventd +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index ad665e71ceae..fd7ad0f08ed4 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -55,9 +55,15 @@ COPY ["TSC", "/usr/bin/TSC"] COPY ["TS", "/usr/bin/TS"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["zsocket.sh", "/usr/bin/"] +COPY ["*.json", "/etc/rsyslog.d/"] +COPY ["files/rsyslog_plugin.conf.j2", "/etc/rsyslog.d/"] RUN chmod a+x /usr/bin/TSA && \ chmod a+x /usr/bin/TSB && \ chmod a+x /usr/bin/TSC && \ chmod a+x /usr/bin/zsocket.sh +RUN j2 -f json /etc/rsyslog.d/rsyslog_plugin.conf.j2 /etc/rsyslog.d/events_info.json > /etc/rsyslog.d/bgp_events.conf +RUN rm -f /etc/rsyslog.d/rsyslog_plugin.conf.j2* +RUN rm -f /etc/rsyslog.d/events_info.json* + ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-fpm-frr/bgp_regex.json b/dockers/docker-fpm-frr/bgp_regex.json new file mode 100644 index 000000000000..898b5b060ebe --- /dev/null +++ b/dockers/docker-fpm-frr/bgp_regex.json @@ -0,0 +1,8 @@ +[ + { + "tag": "bgp-state", + "regex": "Peer .default\\|([0-9a-f:.]*[0-9a-f]*). admin state is set to .(up|down).", + "params": [ "ip", "status" ] + } +] + diff --git a/dockers/docker-fpm-frr/events_info.json b/dockers/docker-fpm-frr/events_info.json new file mode 100644 index 000000000000..66fa9a727ae2 --- /dev/null +++ b/dockers/docker-fpm-frr/events_info.json @@ -0,0 +1,10 @@ +{ + "yang_module": "sonic-events-bgp", + "proclist": [ + { + "name": "bgp", + "parse_json": "bgp_regex.json" + } + ] +} + diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 99051ee62d8c..a77706cad497 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -515,6 +515,7 @@ start() { {%- endif -%} {%- if docker_container_name == "bgp" %} -v /etc/sonic/frr/$DEV:/etc/frr:rw \ + -v /usr/share/sonic/scripts:/usr/share/sonic/scripts:ro \ {%- endif %} {%- if docker_container_name == "database" %} $DB_OPT \ diff --git a/files/build_templates/eventd.service.j2 b/files/build_templates/eventd.service.j2 new file mode 100644 index 000000000000..0ad7f52ee83d --- /dev/null +++ b/files/build_templates/eventd.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=EVENTD container +Requires=updategraph.service +After=updategraph.service +BindsTo=sonic.target +After=sonic.target +StartLimitIntervalSec=1200 +StartLimitBurst=3 + +[Service] +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh wait +ExecStop=/usr/bin/{{docker_container_name}}.sh stop +RestartSec=30 + +[Install] +WantedBy=sonic.target diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index 7de0ad977807..8e92807f4e2c 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -39,6 +39,7 @@ ("pmon", "enabled", false, "enabled"), ("radv", "enabled", false, "enabled"), ("snmp", "enabled", true, "enabled"), + ("eventd", "enabled", true, "enabled"), ("swss", "enabled", false, "enabled"), ("syncd", "enabled", false, "enabled"), ("teamd", "enabled", false, "enabled")] %} @@ -69,7 +70,7 @@ "check_up_status" : "false", {%- endif %} {%- if include_kubernetes == "y" %} -{%- if feature in ["lldp", "pmon", "radv", "snmp", "telemetry"] %} +{%- if feature in ["lldp", "pmon", "radv", "eventd", "snmp", "telemetry"] %} "set_owner": "kube", {% else %} "set_owner": "local", {% endif %} {% endif %} "high_mem_alert": "disabled" diff --git a/files/build_templates/rsyslog_plugin.conf.j2 b/files/build_templates/rsyslog_plugin.conf.j2 new file mode 100644 index 000000000000..ec19c62a78f6 --- /dev/null +++ b/files/build_templates/rsyslog_plugin.conf.j2 @@ -0,0 +1,19 @@ +## rsyslog-plugin for streaming telemetry via gnmi + + + +template(name="prog_msg" type="list") { + property(name="msg") + constant(value="\n") +} + +$ModLoad omprog + +{% for proc in proclist %} +if re_match($programname, "{{ proc.name }}") then { + action(type="omprog" + binary="/usr/share/sonic/scripts/rsyslog_plugin -r /etc/rsyslog.d/{{ proc.parse_json }} -m {{ yang_module }}" + output="/var/log/rsyslog_plugin.log" + template="prog_msg") +} +{% endfor %} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 4b7a77b3151c..56b8290cc12e 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -799,6 +799,10 @@ sudo bash -c "echo { > $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_name {% endfor %} sudo bash -c "echo } >> $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_names.json" +# copy rsyslog plugin binary for use by all dockers that use plugin to publish events. +sudo mkdir -p ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS} +sudo cp ${files_path}/rsyslog_plugin ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS}/ + {% for script in installer_start_scripts.split(' ') -%} if [ -f $TARGET_MACHINE"_{{script}}" ]; then sudo cp $TARGET_MACHINE"_{{script}}" $FILESYSTEM_ROOT/usr/bin/{{script}} diff --git a/rules/docker-config-engine-bullseye.mk b/rules/docker-config-engine-bullseye.mk index c125aa65b209..ea0ae43b54b9 100644 --- a/rules/docker-config-engine-bullseye.mk +++ b/rules/docker-config-engine-bullseye.mk @@ -8,13 +8,15 @@ $(DOCKER_CONFIG_ENGINE_BULLSEYE)_DEPENDS += $(LIBSWSSCOMMON) \ $(LIBYANG_CPP) \ $(LIBYANG_PY3) \ $(PYTHON3_SWSSCOMMON) \ - $(SONIC_DB_CLI) + $(SONIC_DB_CLI) \ + $(SONIC_EVENTD) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(SONIC_YANG_MGMT_PY3) \ $(SONIC_YANG_MODELS_PY3) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY3) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_LOAD_DOCKERS += $(DOCKER_BASE_BULLSEYE) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $(SWSS_VARS_TEMPLATE) +$(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $(RSYSLOG_PLUGIN_CONF_J2) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_FILES += $($(SONIC_CTRMGRD)_CONTAINER_SCRIPT) $(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS = $($(DOCKER_BASE_BULLSEYE)_DBG_DEPENDS) \ diff --git a/rules/docker-config-engine-buster.mk b/rules/docker-config-engine-buster.mk index ae5589a59595..38a94bae4c1d 100644 --- a/rules/docker-config-engine-buster.mk +++ b/rules/docker-config-engine-buster.mk @@ -15,6 +15,7 @@ $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_PY_COMMON_PY3) \ $(DOCKER_CONFIG_ENGINE_BUSTER)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE_PY3) $(DOCKER_CONFIG_ENGINE_BUSTER)_LOAD_DOCKERS += $(DOCKER_BASE_BUSTER) $(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $(SWSS_VARS_TEMPLATE) +$(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $(RSYSLOG_PLUGIN_CONF_J2) $(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $($(SONIC_CTRMGRD)_CONTAINER_SCRIPT) $(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS = $($(DOCKER_BASE_BUSTER)_DBG_DEPENDS) \ diff --git a/rules/docker-eventd.dep b/rules/docker-eventd.dep new file mode 100644 index 000000000000..382513e5eb82 --- /dev/null +++ b/rules/docker-eventd.dep @@ -0,0 +1,11 @@ + +DPATH := $($(DOCKER_EVENTD)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-eventd.mk rules/docker-eventd.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_EVENTD)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_EVENTD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_EVENTD)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_EVENTD),$(DOCKER_EVENTD_DBG))) diff --git a/rules/docker-eventd.mk b/rules/docker-eventd.mk new file mode 100644 index 000000000000..c69fee09e569 --- /dev/null +++ b/rules/docker-eventd.mk @@ -0,0 +1,47 @@ +# docker image for eventd + +DOCKER_EVENTD_STEM = docker-eventd +DOCKER_EVENTD = $(DOCKER_EVENTD_STEM).gz +DOCKER_EVENTD_DBG = $(DOCKER_EVENTD_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_EVENTD)_DEPENDS += $(SONIC_EVENTD) + +$(DOCKER_EVENTD)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_DEPENDS) +$(DOCKER_EVENTD)_DBG_DEPENDS += $(SONIC_EVENTD_DBG) $(LIBSWSSCOMMON_DBG) + +$(DOCKER_EVENTD)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BULLSEYE)_DBG_IMAGE_PACKAGES) + +$(DOCKER_EVENTD)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE_BULLSEYE) + +$(DOCKER_EVENTD)_PATH = $(DOCKERS_PATH)/$(DOCKER_EVENTD_STEM) + +$(DOCKER_EVENTD)_INSTALL_PYTHON_WHEELS = $(SONIC_UTILITIES_PY3) +$(DOCKER_EVENTD)_INSTALL_DEBS = $(PYTHON3_SWSSCOMMON) + +$(DOCKER_EVENTD)_VERSION = 1.0.0 +$(DOCKER_EVENTD)_PACKAGE_NAME = eventd + +$(DOCKER_DHCP)_SERVICE_REQUIRES = updategraph +$(DOCKER_DHCP)_SERVICE_AFTER = database + +SONIC_DOCKER_IMAGES += $(DOCKER_EVENTD) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_EVENTD) + +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_EVENTD_DBG) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_EVENTD_DBG) + +$(DOCKER_EVENTD)_CONTAINER_NAME = eventd +$(DOCKER_EVENTD)_RUN_OPT += --privileged -t +$(DOCKER_EVENTD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +SONIC_BULLSEYE_DOCKERS += $(DOCKER_EVENTD) +SONIC_BULLSEYE_DBG_DOCKERS += $(DOCKER_EVENTD_DBG) + +$(DOCKER_EVENTD)_FILESPATH = $($(SONIC_EVENTD)_SRC_PATH)/rsyslog_plugin + +$(DOCKER_EVENTD)_PLUGIN = rsyslog_plugin +$($(DOCKER_EVENTD)_PLUGIN)_PATH = $($(DOCKER_EVENTD)_FILESPATH) + +SONIC_COPY_FILES += $($(DOCKER_EVENTD)_PLUGIN) +$(DOCKER_EVENTD)_SHARED_FILES = $($(DOCKER_EVENTD)_PLUGIN) + diff --git a/rules/eventd.dep b/rules/eventd.dep new file mode 100644 index 000000000000..12f32a30f2c7 --- /dev/null +++ b/rules/eventd.dep @@ -0,0 +1,10 @@ + +SPATH := $($(SONIC_EVENTD)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/eventd.mk rules/eventd.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + +$(SONIC_EVENTD)_CACHE_MODE := GIT_CONTENT_SHA +$(SONIC_EVENTD)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(SONIC_EVENTD)_DEP_FILES := $(DEP_FILES) + diff --git a/rules/eventd.mk b/rules/eventd.mk new file mode 100644 index 000000000000..9eea21a4cfb5 --- /dev/null +++ b/rules/eventd.mk @@ -0,0 +1,19 @@ +# eventd package + +SONIC_EVENTD_VERSION = 1.0.0-0 +SONIC_EVENTD_PKG_NAME = eventd + +SONIC_EVENTD = sonic-$(SONIC_EVENTD_PKG_NAME)_$(SONIC_EVENTD_VERSION)_$(CONFIGURED_ARCH).deb +$(SONIC_EVENTD)_SRC_PATH = $(SRC_PATH)/sonic-eventd +$(SONIC_EVENTD)_DEPENDS += $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV) + +SONIC_DPKG_DEBS += $(SONIC_EVENTD) + +SONIC_EVENTD_DBG = sonic-$(SONIC_EVENTD_PKG_NAME)-dbgsym_$(SONIC_EVENTD_VERSION)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(SONIC_EVENTD),$(SONIC_EVENTD_DBG))) + +# The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} +# are archived into debug one image to facilitate debugging. +# +DBG_SRC_ARCHIVE += sonic-eventd + diff --git a/rules/scripts.mk b/rules/scripts.mk index ce6a8eb90025..12919d520b09 100644 --- a/rules/scripts.mk +++ b/rules/scripts.mk @@ -32,6 +32,9 @@ $(SWSS_VARS_TEMPLATE)_PATH = files/build_templates COPP_CONFIG_TEMPLATE = copp_cfg.j2 $(COPP_CONFIG_TEMPLATE)_PATH = files/image_config/copp +RSYSLOG_PLUGIN_CONF_J2 = rsyslog_plugin.conf.j2 +$(RSYSLOG_PLUGIN_CONF_J2)_PATH = files/build_templates + SONIC_COPY_FILES += $(CONFIGDB_LOAD_SCRIPT) \ $(ARP_UPDATE_SCRIPT) \ $(ARP_UPDATE_VARS_TEMPLATE) \ @@ -42,4 +45,5 @@ SONIC_COPY_FILES += $(CONFIGDB_LOAD_SCRIPT) \ $(SYSCTL_NET_CONFIG) \ $(UPDATE_CHASSISDB_CONFIG_SCRIPT) \ $(SWSS_VARS_TEMPLATE) \ + $(RSYSLOG_PLUGIN_CONF_J2) \ $(COPP_CONFIG_TEMPLATE) diff --git a/rules/telemetry.mk b/rules/telemetry.mk index 24fe4ae2fe52..942e9797726a 100644 --- a/rules/telemetry.mk +++ b/rules/telemetry.mk @@ -2,6 +2,7 @@ SONIC_TELEMETRY = sonic-gnmi_0.1_$(CONFIGURED_ARCH).deb $(SONIC_TELEMETRY)_SRC_PATH = $(SRC_PATH)/sonic-gnmi -$(SONIC_TELEMETRY)_DEPENDS = $(SONIC_MGMT_COMMON) $(SONIC_MGMT_COMMON_CODEGEN) -$(SONIC_TELEMETRY)_RDEPENDS = +$(SONIC_TELEMETRY)_DEPENDS = $(SONIC_MGMT_COMMON) $(SONIC_MGMT_COMMON_CODEGEN) \ + $(LIBSWSSCOMMON_DEV) $(LIBSWSSCOMMON) +$(SONIC_TELEMETRY)_RDEPENDS = $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DEV) SONIC_DPKG_DEBS += $(SONIC_TELEMETRY) diff --git a/slave.mk b/slave.mk index 7cdee954ad73..f720061b2e52 100644 --- a/slave.mk +++ b/slave.mk @@ -1292,6 +1292,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(if $($(docker:-dbg.gz=.gz)_MACHINE),\ mv $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).sh $($(docker:-dbg.gz=.gz)_MACHINE)_$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).sh ) + $(foreach file, $($(docker)_SHARED_FILES), \ + { cp $($(file)_PATH)/$(file) $(FILES_PATH)/ $(LOG) || exit 1 ; } ; ) ) # Exported variables are used by sonic_debian_extension.sh diff --git a/src/sonic-eventd/Makefile b/src/sonic-eventd/Makefile new file mode 100644 index 000000000000..00d3199a65bc --- /dev/null +++ b/src/sonic-eventd/Makefile @@ -0,0 +1,84 @@ +RM := rm -rf +EVENTD_TARGET := eventd +EVENTD_TEST := tests/tests +EVENTD_TOOL := tools/events_tool +EVENTD_PUBLISH_TOOL := tools/events_publish_tool.py +RSYSLOG-PLUGIN_TARGET := rsyslog_plugin/rsyslog_plugin +RSYSLOG-PLUGIN_TEST := rsyslog_plugin_tests/tests +CP := cp +MKDIR := mkdir +CC := g++ +LIBS := -levent -lhiredis -lswsscommon -lpthread -lboost_thread -lboost_system -lzmq -lboost_serialization -luuid -llua5.1 +TEST_LIBS := -L/usr/src/gtest -lgtest -lgtest_main -lgmock -lgmock_main + +CFLAGS += -Wall -std=c++17 -fPIE -I$(PWD)/../sonic-swss-common/common +PWD := $(shell pwd) + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) $(OBJS) +endif +endif + +-include src/subdir.mk +-include tests/subdir.mk +-include tools/subdir.mk +-include rsyslog_plugin/subdir.mk +-include rsyslog_plugin_tests/subdir.mk + +all: sonic-eventd eventd-tests eventd-tool rsyslog-plugin rsyslog-plugin-tests + +sonic-eventd: $(OBJS) + @echo 'Building target: $@' + @echo 'Invoking: G++ Linker' + $(CC) $(LDFLAGS) -o $(EVENTD_TARGET) $(OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +eventd-tool: $(TOOL_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: G++ Linker' + $(CC) $(LDFLAGS) -o $(EVENTD_TOOL) $(TOOL_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +rsyslog-plugin: $(RSYSLOG-PLUGIN_OBJS) + @echo 'Buidling Target: $@' + @echo 'Invoking: G++ Linker' + $(CC) $(LDFLAGS) -o $(RSYSLOG-PLUGIN_TARGET) $(RSYSLOG-PLUGIN_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +eventd-tests: $(TEST_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: G++ Linker' + $(CC) $(LDFLAGS) -o $(EVENTD_TEST) $(TEST_OBJS) $(LIBS) $(TEST_LIBS) + @echo 'Finished building target: $@' + $(EVENTD_TEST) + @echo 'Finished running tests' + @echo ' ' + +rsyslog-plugin-tests: $(RSYSLOG-PLUGIN-TEST_OBJS) + @echo 'BUILDING target: $@' + @echo 'Invoking G++ Linker' + $(CC) $(LDFLAGS) -o $(RSYSLOG-PLUGIN_TEST) $(RSYSLOG-PLUGIN-TEST_OBJS) $(LIBS) $(TEST_LIBS) + @echo 'Finished building target: $@' + $(RSYSLOG-PLUGIN_TEST) + @echo 'Finished running tests' + @echo ' ' + +install: + $(MKDIR) -p $(DESTDIR)/usr/sbin + $(CP) $(EVENTD_TARGET) $(DESTDIR)/usr/sbin + $(CP) $(EVENTD_TOOL) $(DESTDIR)/usr/sbin + $(CP) $(EVENTD_PUBLISH_TOOL) $(DESTDIR)/usr/sbin + +deinstall: + $(RM) $(DESTDIR)/usr/sbin/$(EVENTD_TARGET) + $(RM) $(DESTDIR)/usr/sbin/$(RSYSLOG-PLUGIN_TARGET) + $(RM) -rf $(DESTDIR)/usr/sbin + +clean: + -@echo ' ' + +.PHONY: all clean dependents diff --git a/src/sonic-eventd/debian/changelog b/src/sonic-eventd/debian/changelog new file mode 100644 index 000000000000..eba3bf10ea53 --- /dev/null +++ b/src/sonic-eventd/debian/changelog @@ -0,0 +1,5 @@ +sonic-eventd (1.0.0-0) UNRELEASED; urgency=medium + + * Initial release. + +-- Renuka Manavalan diff --git a/src/sonic-eventd/debian/compat b/src/sonic-eventd/debian/compat new file mode 100644 index 000000000000..48082f72f087 --- /dev/null +++ b/src/sonic-eventd/debian/compat @@ -0,0 +1 @@ +12 diff --git a/src/sonic-eventd/debian/control b/src/sonic-eventd/debian/control new file mode 100644 index 000000000000..95ae6fd76452 --- /dev/null +++ b/src/sonic-eventd/debian/control @@ -0,0 +1,14 @@ +Source: sonic-eventd +Section: devel +Priority: optional +Maintainer: Renuka Manavalan +Build-Depends: debhelper (>= 12.0.0), libevent-dev, libboost-thread-dev, libboost-system-dev, libswsscommon-dev +Standards-Version: 3.9.3 +Homepage: https://github.com/Azure/sonic-buildimage +XS-Go-Import-Path: github.com/Azure/sonic-buildimage + +Package: sonic-eventd +Architecture: any +Built-Using: ${misc:Built-Using} +Depends: ${shlibs:Depends} +Description: SONiC event service diff --git a/src/sonic-eventd/debian/rules b/src/sonic-eventd/debian/rules new file mode 100755 index 000000000000..ac2cd63889ef --- /dev/null +++ b/src/sonic-eventd/debian/rules @@ -0,0 +1,6 @@ +#!/usr/bin/make -f + +export DEB_BUILD_MAINT_OPTIONS=hardening=+all + +%: + dh $@ --parallel diff --git a/src/sonic-eventd/rsyslog_plugin/main.cpp b/src/sonic-eventd/rsyslog_plugin/main.cpp new file mode 100644 index 000000000000..53162608c5a9 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/main.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include "rsyslog_plugin.h" + +#define SUCCESS_CODE 0 +#define INVALID_REGEX_ERROR_CODE 1 +#define EVENT_INIT_PUBLISH_ERROR_CODE 2 +#define MISSING_ARGS_ERROR_CODE 3 + +void showUsage() { + cout << "Usage for rsyslog_plugin: \n" << "options\n" + << "\t-r,required,type=string\t\tPath to regex file\n" + << "\t-m,required,type=string\t\tYANG module name of source generating syslog message\n" + << "\t-h \t\tHelp" + << endl; +} + +int main(int argc, char** argv) { + string regexPath; + string moduleName; + int optionVal; + + while((optionVal = getopt(argc, argv, "r:m:h")) != -1) { + switch(optionVal) { + case 'r': + regexPath = optarg; + break; + case 'm': + moduleName = optarg; + break; + case 'h': + case '?': + default: + showUsage(); + return 1; + } + } + + if(regexPath.empty() || moduleName.empty()) { // Missing required rc path + cerr << "Error: Missing regexPath and moduleName." << endl; + return MISSING_ARGS_ERROR_CODE; + } + + unique_ptr plugin(new RsyslogPlugin(moduleName, regexPath)); + int returnCode = plugin->onInit(); + if(returnCode == INVALID_REGEX_ERROR_CODE) { + SWSS_LOG_ERROR("Rsyslog plugin was not able to be initialized due to invalid regex file provided.\n"); + return returnCode; + } else if(returnCode == EVENT_INIT_PUBLISH_ERROR_CODE) { + SWSS_LOG_ERROR("Rsyslog plugin was not able to be initialized due to event_init_publish call failing.\n"); + return returnCode; + } + + plugin->run(); + return SUCCESS_CODE; +} diff --git a/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.cpp b/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.cpp new file mode 100644 index 000000000000..3786c5f0fea9 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.cpp @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#include +#include "rsyslog_plugin.h" +#include "json.hpp" + +using json = nlohmann::json; + +bool RsyslogPlugin::onMessage(string msg, lua_State* luaState) { + string tag; + event_params_t paramDict; + if(!m_parser->parseMessage(msg, tag, paramDict, luaState)) { + SWSS_LOG_DEBUG("%s was not able to be parsed into a structured event\n", msg.c_str()); + return false; + } else { + int returnCode = event_publish(m_eventHandle, tag, ¶mDict); + if(returnCode != 0) { + SWSS_LOG_ERROR("rsyslog_plugin was not able to publish event for %s.\n", tag.c_str()); + return false; + } + return true; + } +} + +void parseParams(vector params, vector& eventParams) { + for(long unsigned int i = 0; i < params.size(); i++) { + if(params[i].empty()) { + SWSS_LOG_ERROR("Empty param provided in regex file\n"); + continue; + } + EventParam ep = EventParam(); + auto delimPos = params[i].find(':'); + if(delimPos == string::npos) { // no lua code + ep.paramName = params[i]; + } else { + ep.paramName = params[i].substr(0, delimPos); + ep.luaCode = params[i].substr(delimPos + 1); + if(ep.luaCode.empty()) { + SWSS_LOG_ERROR("Lua code missing after :\n"); + } + } + eventParams.push_back(ep); + } +} + +bool RsyslogPlugin::createRegexList() { + fstream regexFile; + json jsonList = json::array(); + regexFile.open(m_regexPath, ios::in); + if (!regexFile) { + SWSS_LOG_ERROR("No such path exists: %s for source %s\n", m_regexPath.c_str(), m_moduleName.c_str()); + return false; + } + try { + regexFile >> jsonList; + } catch (invalid_argument& iaException) { + SWSS_LOG_ERROR("Invalid JSON file: %s, throws exception: %s\n", m_regexPath.c_str(), iaException.what()); + return false; + } + + string regexString; + string timestampRegex = "^([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*"; + regex expression; + vector regexList; + + for(long unsigned int i = 0; i < jsonList.size(); i++) { + RegexStruct rs = RegexStruct(); + vector eventParams; + try { + string eventRegex = jsonList[i]["regex"]; + regexString = timestampRegex + eventRegex; + string tag = jsonList[i]["tag"]; + vector params = jsonList[i]["params"]; + vector timestampParams = { "month", "day", "time" }; + params.insert(params.begin(), timestampParams.begin(), timestampParams.end()); + regex expr(regexString); + expression = expr; + parseParams(params, eventParams); + rs.params = eventParams; + rs.tag = tag; + rs.regexExpression = expression; + regexList.push_back(rs); + } catch (domain_error& deException) { + SWSS_LOG_ERROR("Missing required key, throws exception: %s\n", deException.what()); + return false; + } catch (regex_error& reException) { + SWSS_LOG_ERROR("Invalid regex, throws exception: %s\n", reException.what()); + return false; + } + } + + if(regexList.empty()) { + SWSS_LOG_ERROR("Empty list of regex expressions.\n"); + return false; + } + + m_parser->m_regexList = regexList; + + regexFile.close(); + return true; +} + +void RsyslogPlugin::run() { + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + while(true) { + string line; + getline(cin, line); + if(line.empty()) { + continue; + } + onMessage(line, luaState); + } + lua_close(luaState); +} + +int RsyslogPlugin::onInit() { + m_eventHandle = events_init_publisher(m_moduleName); + bool success = createRegexList(); + if(!success) { + return 1; // invalid regex error code + } else if(m_eventHandle == NULL) { + return 2; // event init publish error code + } + return 0; +} + +RsyslogPlugin::RsyslogPlugin(string moduleName, string regexPath) { + m_parser = unique_ptr(new SyslogParser()); + m_moduleName = moduleName; + m_regexPath = regexPath; +} diff --git a/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.h b/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.h new file mode 100644 index 000000000000..0811b5f3032f --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/rsyslog_plugin.h @@ -0,0 +1,40 @@ +#ifndef RSYSLOG_PLUGIN_H +#define RSYSLOG_PLUGIN_H + +extern "C" +{ + #include + #include + #include +} +#include +#include +#include "syslog_parser.h" +#include "events.h" +#include "logger.h" + +using namespace std; +using namespace swss; + +/** + * Rsyslog Plugin will utilize an instance of a syslog parser to read syslog messages from rsyslog.d and will continuously read from stdin + * A plugin instance is created for each container/host. + * + */ + +class RsyslogPlugin { +public: + int onInit(); + bool onMessage(string msg, lua_State* luaState); + void run(); + RsyslogPlugin(string moduleName, string regexPath); +private: + unique_ptr m_parser; + event_handle_t m_eventHandle; + string m_regexPath; + string m_moduleName; + bool createRegexList(); +}; + +#endif + diff --git a/src/sonic-eventd/rsyslog_plugin/subdir.mk b/src/sonic-eventd/rsyslog_plugin/subdir.mk new file mode 100644 index 000000000000..17df55c718a0 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/subdir.mk @@ -0,0 +1,13 @@ +CC := g++ + +RSYSLOG-PLUGIN-TEST_OBJS += ./rsyslog_plugin/rsyslog_plugin.o ./rsyslog_plugin/syslog_parser.o ./rsyslog_plugin/timestamp_formatter.o +RSYSLOG-PLUGIN_OBJS += ./rsyslog_plugin/rsyslog_plugin.o ./rsyslog_plugin/syslog_parser.o ./rsyslog_plugin/timestamp_formatter.o ./rsyslog_plugin/main.o + +C_DEPS += ./rsyslog_plugin/rsyslog_plugin.d ./rsyslog_plugin/syslog_parser.d ./rsyslog_plugin/timestamp_formatter.d ./rsyslog_plugin/main.d + +rsyslog_plugin/%.o: rsyslog_plugin/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + $(CC) -D__FILENAME__="$(subst rsyslog_plugin/,,$<)" $(CFLAGS) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$(@)" "$<" + @echo 'Finished building: $<' + @echo ' ' diff --git a/src/sonic-eventd/rsyslog_plugin/syslog_parser.cpp b/src/sonic-eventd/rsyslog_plugin/syslog_parser.cpp new file mode 100644 index 000000000000..ebf7c598d15a --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/syslog_parser.cpp @@ -0,0 +1,65 @@ +#include +#include +#include "syslog_parser.h" +#include "logger.h" + +/** + * Parses syslog message and returns structured event + * + * @param nessage us syslog message being fed in by rsyslog.d + * @return return structured event json for publishing + * +*/ + +bool SyslogParser::parseMessage(string message, string& eventTag, event_params_t& paramMap, lua_State* luaState) { + for(long unsigned int i = 0; i < m_regexList.size(); i++) { + smatch matchResults; + if(!regex_search(message, matchResults, m_regexList[i].regexExpression) || m_regexList[i].params.size() != matchResults.size() - 1 || matchResults.size() < 4) { + continue; + } + string formattedTimestamp; + if(!matchResults[1].str().empty() && !matchResults[2].str().empty() && !matchResults[3].str().empty()) { // found timestamp components + formattedTimestamp = m_timestampFormatter->changeTimestampFormat({ matchResults[1].str(), matchResults[2].str(), matchResults[3].str() }); + } + if(!formattedTimestamp.empty()) { + paramMap["timestamp"] = formattedTimestamp; + } else { + SWSS_LOG_INFO("Timestamp is invalid and is not able to be formatted"); + } + + // found matching regex + eventTag = m_regexList[i].tag; + // check params for lua code + for(long unsigned int j = 3; j < m_regexList[i].params.size(); j++) { + string resultValue = matchResults[j + 1].str(); + string paramName = m_regexList[i].params[j].paramName; + const char* luaCode = m_regexList[i].params[j].luaCode.c_str(); + + if(luaCode == NULL || *luaCode == 0) { + SWSS_LOG_INFO("Invalid lua code, empty or missing"); + paramMap[paramName] = resultValue; + continue; + } + + // execute lua code + lua_pushstring(luaState, resultValue.c_str()); + lua_setglobal(luaState, "arg"); + if(luaL_dostring(luaState, luaCode) == 0) { + lua_pop(luaState, lua_gettop(luaState)); + } else { // error in lua code + SWSS_LOG_ERROR("Invalid lua code, unable to do operation.\n"); + paramMap[paramName] = resultValue; + continue; + } + lua_getglobal(luaState, "ret"); + paramMap[paramName] = lua_tostring(luaState, -1); + lua_pop(luaState, 1); + } + return true; + } + return false; +} + +SyslogParser::SyslogParser() { + m_timestampFormatter = unique_ptr(new TimestampFormatter()); +} diff --git a/src/sonic-eventd/rsyslog_plugin/syslog_parser.h b/src/sonic-eventd/rsyslog_plugin/syslog_parser.h new file mode 100644 index 000000000000..6293eb3c4a34 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/syslog_parser.h @@ -0,0 +1,46 @@ +#ifndef SYSLOG_PARSER_H +#define SYSLOG_PARSER_H + +extern "C" +{ + #include + #include + #include +} + +#include +#include +#include +#include "json.hpp" +#include "events.h" +#include "timestamp_formatter.h" + +using namespace std; +using json = nlohmann::json; + +struct EventParam { + string paramName; + string luaCode; +}; + +struct RegexStruct { + regex regexExpression; + vector params; + string tag; +}; + +/** + * Syslog Parser is responsible for parsing log messages fed by rsyslog.d and returns + * matched result to rsyslog_plugin to use with events publish API + * + */ + +class SyslogParser { +public: + unique_ptr m_timestampFormatter; + vector m_regexList; + bool parseMessage(string message, string& tag, event_params_t& paramDict, lua_State* luaState); + SyslogParser(); +}; + +#endif diff --git a/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.cpp b/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.cpp new file mode 100644 index 000000000000..cc179adbbc75 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.cpp @@ -0,0 +1,74 @@ +#include +#include "timestamp_formatter.h" +#include "logger.h" +#include "events.h" + +using namespace std; + +/*** + * + * Formats given string into string needed by YANG model + * + * @param timestamp parsed from syslog message + * @return formatted timestamp that conforms to YANG model + * + */ + +static const unordered_map g_monthDict { + { "Jan", "01" }, + { "Feb", "02" }, + { "Mar", "03" }, + { "Apr", "04" }, + { "May", "05" }, + { "Jun", "06" }, + { "Jul", "07" }, + { "Aug", "08" }, + { "Sep", "09" }, + { "Oct", "10" }, + { "Nov", "11" }, + { "Dec", "12" } +}; + +string TimestampFormatter::getYear(string timestamp) { + if(!m_storedTimestamp.empty()) { + if(m_storedTimestamp.compare(timestamp) <= 0) { + m_storedTimestamp = timestamp; + return m_storedYear; + } + } + // no last timestamp or year change + time_t currentTime = time(nullptr); + tm* const localTime = localtime(¤tTime); + stringstream ss; + auto currentYear = 1900 + localTime->tm_year; + ss << currentYear; // get current year + string year = ss.str(); + m_storedTimestamp = timestamp; + m_storedYear = year; + return year; +} + +string TimestampFormatter::changeTimestampFormat(vector dateComponents) { + if(dateComponents.size() < 3) { + SWSS_LOG_ERROR("Timestamp formatter unable to format due to invalid input"); + return ""; + } + string formattedTimestamp; // need to change format of Mmm dd hh:mm:ss.SSSSSS to YYYY-mm-ddThh:mm:ss.SSSSSSZ + string month; + auto it = g_monthDict.find(dateComponents[0]); + if(it != g_monthDict.end()) { + month = it->second; + } else { + SWSS_LOG_ERROR("Timestamp month was given in wrong format.\n"); + return ""; + } + string day = dateComponents[1]; + if(day.size() == 1) { // convert 1 -> 01 + day.insert(day.begin(), '0'); + } + string time = dateComponents[2]; + string currentTimestamp = month + day + time; + string year = getYear(currentTimestamp); + formattedTimestamp = year + "-" + month + "-" + day + "T" + time + "Z"; + return formattedTimestamp; +} diff --git a/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.h b/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.h new file mode 100644 index 000000000000..ea99c4cfcb8c --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin/timestamp_formatter.h @@ -0,0 +1,27 @@ +#ifndef TIMESTAMP_FORMATTER_H +#define TIMESTAMP_FORMATTER_H + +#include +#include +#include +#include +#include + +using namespace std; + +/*** + * + * TimestampFormatter is responsible for formatting the timestamps received in syslog messages and to format them into the type needed by YANG model + * + */ + +class TimestampFormatter { +public: + string changeTimestampFormat(vector dateComponents); + string m_storedTimestamp; + string m_storedYear; +private: + string getYear(string timestamp); +}; + +#endif diff --git a/src/sonic-eventd/rsyslog_plugin_tests/rsyslog_plugin_ut.cpp b/src/sonic-eventd/rsyslog_plugin_tests/rsyslog_plugin_ut.cpp new file mode 100644 index 000000000000..be5a19ad5a5b --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/rsyslog_plugin_ut.cpp @@ -0,0 +1,274 @@ +extern "C" +{ + #include + #include + #include +} +#include +#include +#include +#include +#include "gtest/gtest.h" +#include "json.hpp" +#include "events.h" +#include "../rsyslog_plugin/rsyslog_plugin.h" +#include "../rsyslog_plugin/syslog_parser.h" +#include "../rsyslog_plugin/timestamp_formatter.h" + +using namespace std; +using namespace swss; +using json = nlohmann::json; + +vector createEventParams(vector params, vector luaCodes) { + vector eventParams; + for(long unsigned int i = 0; i < params.size(); i++) { + EventParam ep = EventParam(); + ep.paramName = params[i]; + ep.luaCode = luaCodes[i]; + eventParams.push_back(ep); + } + return eventParams; +} + +TEST(syslog_parser, matching_regex) { + json jList = json::array(); + vector regexList; + string regexString = "^([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*message (.*) other_data (.*) even_more_data (.*)"; + vector params = { "month", "day", "time", "message", "other_data", "even_more_data" }; + vector luaCodes = { "", "", "", "", "", "" }; + regex expression(regexString); + + RegexStruct rs = RegexStruct(); + rs.tag = "test_tag"; + rs.regexExpression = expression; + rs.params = createEventParams(params, luaCodes); + regexList.push_back(rs); + + string tag; + event_params_t paramDict; + + event_params_t expectedDict; + expectedDict["message"] = "test_message"; + expectedDict["other_data"] = "test_data"; + expectedDict["even_more_data"] = "test_data"; + + unique_ptr parser(new SyslogParser()); + parser->m_regexList = regexList; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + + bool success = parser->parseMessage("message test_message other_data test_data even_more_data test_data", tag, paramDict, luaState); + EXPECT_EQ(true, success); + EXPECT_EQ("test_tag", tag); + EXPECT_EQ(expectedDict, paramDict); + + lua_close(luaState); +} + +TEST(syslog_parser, matching_regex_timestamp) { + json jList = json::array(); + vector regexList; + string regexString = "^([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*message (.*) other_data (.*)"; + vector params = { "month", "day", "time", "message", "other_data" }; + vector luaCodes = { "", "", "", "", "" }; + regex expression(regexString); + + RegexStruct rs = RegexStruct(); + rs.tag = "test_tag"; + rs.regexExpression = expression; + rs.params = createEventParams(params, luaCodes); + regexList.push_back(rs); + + string tag; + event_params_t paramDict; + + event_params_t expectedDict; + expectedDict["message"] = "test_message"; + expectedDict["other_data"] = "test_data"; + expectedDict["timestamp"] = "2022-07-21T02:10:00.000000Z"; + + unique_ptr parser(new SyslogParser()); + parser->m_regexList = regexList; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + + bool success = parser->parseMessage("Jul 21 02:10:00.000000 message test_message other_data test_data", tag, paramDict, luaState); + EXPECT_EQ(true, success); + EXPECT_EQ("test_tag", tag); + EXPECT_EQ(expectedDict, paramDict); + + lua_close(luaState); +} + +TEST(syslog_parser, no_matching_regex) { + json jList = json::array(); + vector regexList; + string regexString = "^([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*no match"; + vector params = { "month", "day", "time" }; + vector luaCodes = { "", "", "" }; + regex expression(regexString); + + RegexStruct rs = RegexStruct(); + rs.tag = "test_tag"; + rs.regexExpression = expression; + rs.params = createEventParams(params, luaCodes); + regexList.push_back(rs); + + string tag; + event_params_t paramDict; + + unique_ptr parser(new SyslogParser()); + parser->m_regexList = regexList; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + + bool success = parser->parseMessage("Test Message", tag, paramDict, luaState); + EXPECT_EQ(false, success); + + lua_close(luaState); +} + +TEST(syslog_parser, lua_code_valid_1) { + json jList = json::array(); + vector regexList; + string regexString = "^([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*.* (sent|received) (?:to|from) .* ([0-9]{2,3}.[0-9]{2,3}.[0-9]{2,3}.[0-9]{2,3}) active ([1-9]{1,3})/([1-9]{1,3}) .*"; + vector params = { "month", "day", "time", "is-sent", "ip", "major-code", "minor-code" }; + vector luaCodes = { "", "", "", "ret=tostring(arg==\"sent\")", "", "", "" }; + regex expression(regexString); + + RegexStruct rs = RegexStruct(); + rs.tag = "test_tag"; + rs.regexExpression = expression; + rs.params = createEventParams(params, luaCodes); + regexList.push_back(rs); + + string tag; + event_params_t paramDict; + + event_params_t expectedDict; + expectedDict["is-sent"] = "true"; + expectedDict["ip"] = "100.95.147.229"; + expectedDict["major-code"] = "2"; + expectedDict["minor-code"] = "2"; + + unique_ptr parser(new SyslogParser()); + parser->m_regexList = regexList; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + + bool success = parser->parseMessage("NOTIFICATION: sent to neighbor 100.95.147.229 active 2/2 (peer in wrong AS) 2 bytes", tag, paramDict, luaState); + EXPECT_EQ(true, success); + EXPECT_EQ("test_tag", tag); + EXPECT_EQ(expectedDict, paramDict); + + lua_close(luaState); +} + +TEST(syslog_parser, lua_code_valid_2) { + json jList = json::array(); + vector regexList; + string regexString = "([a-zA-Z]{3})?\\s*([0-9]{1,2})?\\s*([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{0,6})?\\s*.* (sent|received) (?:to|from) .* ([0-9]{2,3}.[0-9]{2,3}.[0-9]{2,3}.[0-9]{2,3}) active ([1-9]{1,3})/([1-9]{1,3}) .*"; + vector params = { "month", "day", "time", "is-sent", "ip", "major-code", "minor-code" }; + vector luaCodes = { "", "", "", "ret=tostring(arg==\"sent\")", "", "", "" }; + regex expression(regexString); + + RegexStruct rs = RegexStruct(); + rs.tag = "test_tag"; + rs.regexExpression = expression; + rs.params = createEventParams(params, luaCodes); + regexList.push_back(rs); + + string tag; + event_params_t paramDict; + + event_params_t expectedDict; + expectedDict["is-sent"] = "false"; + expectedDict["ip"] = "10.10.24.216"; + expectedDict["major-code"] = "6"; + expectedDict["minor-code"] = "2"; + expectedDict["timestamp"] = "2022-12-03T12:36:24.503424Z"; + + unique_ptr parser(new SyslogParser()); + parser->m_regexList = regexList; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + + bool success = parser->parseMessage("Dec 3 12:36:24.503424 NOTIFICATION: received from neighbor 10.10.24.216 active 6/2 (Administrative Shutdown) 0 bytes", tag, paramDict, luaState); + EXPECT_EQ(true, success); + EXPECT_EQ("test_tag", tag); + EXPECT_EQ(expectedDict, paramDict); + + lua_close(luaState); +} + +TEST(rsyslog_plugin, onInit_emptyJSON) { + unique_ptr plugin(new RsyslogPlugin("test_mod_name", "./rsyslog_plugin_tests/test_regex_1.rc.json")); + EXPECT_NE(0, plugin->onInit()); +} + +TEST(rsyslog_plugin, onInit_missingRegex) { + unique_ptr plugin(new RsyslogPlugin("test_mod_name", "./rsyslog_plugin_tests/test_regex_3.rc.json")); + EXPECT_NE(0, plugin->onInit()); +} + +TEST(rsyslog_plugin, onInit_invalidRegex) { + unique_ptr plugin(new RsyslogPlugin("test_mod_name", "./rsyslog_plugin_tests/test_regex_4.rc.json")); + EXPECT_NE(0, plugin->onInit()); +} + +TEST(rsyslog_plugin, onMessage) { + unique_ptr plugin(new RsyslogPlugin("test_mod_name", "./rsyslog_plugin_tests/test_regex_2.rc.json")); + EXPECT_EQ(0, plugin->onInit()); + ifstream infile("./rsyslog_plugin_tests/test_syslogs.txt"); + string logMessage; + bool parseResult; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + while(infile >> logMessage >> parseResult) { + EXPECT_EQ(parseResult, plugin->onMessage(logMessage, luaState)); + } + lua_close(luaState); + infile.close(); +} + +TEST(rsyslog_plugin, onMessage_noParams) { + unique_ptr plugin(new RsyslogPlugin("test_mod_name", "./rsyslog_plugin_tests/test_regex_5.rc.json")); + EXPECT_EQ(0, plugin->onInit()); + ifstream infile("./rsyslog_plugin_tests/test_syslogs_2.txt"); + string logMessage; + bool parseResult; + lua_State* luaState = luaL_newstate(); + luaL_openlibs(luaState); + while(infile >> logMessage >> parseResult) { + EXPECT_EQ(parseResult, plugin->onMessage(logMessage, luaState)); + } + lua_close(luaState); + infile.close(); +} + +TEST(timestampFormatter, changeTimestampFormat) { + unique_ptr formatter(new TimestampFormatter()); + + vector timestampOne = { "Jul", "20", "10:09:40.230874" }; + vector timestampTwo = { "Jan", "1", "00:00:00.000000" }; + vector timestampThree = { "Dec", "31", "23:59:59.000000" }; + + string formattedTimestampOne = formatter->changeTimestampFormat(timestampOne); + EXPECT_EQ("2022-07-20T10:09:40.230874Z", formattedTimestampOne); + + EXPECT_EQ("072010:09:40.230874", formatter->m_storedTimestamp); + + string formattedTimestampTwo = formatter->changeTimestampFormat(timestampTwo); + EXPECT_EQ("2022-01-01T00:00:00.000000Z", formattedTimestampTwo); + + formatter->m_storedTimestamp = "010100:00:00.000000"; + formatter->m_storedYear = "2025"; + + string formattedTimestampThree = formatter->changeTimestampFormat(timestampThree); + EXPECT_EQ("2025-12-31T23:59:59.000000Z", formattedTimestampThree); +} + +int main(int argc, char* argv[]) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/sonic-eventd/rsyslog_plugin_tests/subdir.mk b/src/sonic-eventd/rsyslog_plugin_tests/subdir.mk new file mode 100644 index 000000000000..6be7ef09786a --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/subdir.mk @@ -0,0 +1,12 @@ +CC := g++ + +RSYSLOG-PLUGIN-TEST_OBJS += ./rsyslog_plugin_tests/rsyslog_plugin_ut.o + +C_DEPS += ./rsyslog_plugin_tests/rsyslog_plugin_ut.d + +rsyslog_plugin_tests/%.o: rsyslog_plugin_tests/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + $(CC) -D__FILENAME__="$(subst rsyslog_plugin_tests/,,$<)" $(CFLAGS) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_regex_1.rc.json b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_1.rc.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_regex_2.rc.json b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_2.rc.json new file mode 100644 index 000000000000..66788d326331 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_2.rc.json @@ -0,0 +1,7 @@ +[ + { + "tag": "bgp-state", + "regex": ".* %ADJCHANGE: neighbor (.*) (Up|Down) .*", + "params": ["neighbor_ip", "state" ] + } +] diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_regex_3.rc.json b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_3.rc.json new file mode 100644 index 000000000000..2e67e88f8448 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_3.rc.json @@ -0,0 +1,6 @@ +[ + { + "tag": "TEST-TAG-NO-REGEX", + "param": [] + } +] diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_regex_4.rc.json b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_4.rc.json new file mode 100644 index 000000000000..c3a875aded0f --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_4.rc.json @@ -0,0 +1,7 @@ +[ + { + "tag": "TEST-TAG-INVALID-REGEX", + "regex": "+++ ++++(", + "params": [] + } +] diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_regex_5.rc.json b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_5.rc.json new file mode 100644 index 000000000000..ddaf37c931a8 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_regex_5.rc.json @@ -0,0 +1,7 @@ +[ + { + "tag": "test_tag", + "regex": ".*", + "params": [] + } +] diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs.txt b/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs.txt new file mode 100644 index 000000000000..78f89aec3d28 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs.txt @@ -0,0 +1,4 @@ +"Aug 17 02:39:21.286611 SN6-0101-0114-02T0 INFO bgp#bgpd[62]: %ADJCHANGE: neighbor 100.126.188.90 Down Neighbor deleted" true +"Aug 17 02:46:42.615668 SN6-0101-0114-02T0 INFO bgp#bgpd[62]: %ADJCHANGE: neighbor 100.126.188.90 Up" true +"Aug 17 04:46:51.290979 SN6-0101-0114-02T0 INFO bgp#bgpd[62]: %ADJCHANGE: neighbor 100.126.188.78 Down Neighbor deleted" true +"Aug 17 04:46:51.290979 SN6-0101-0114-02T0 INFO bgp#bgpd[62]: %NOEVENT: no event" false diff --git a/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs_2.txt b/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs_2.txt new file mode 100644 index 000000000000..d56615f61681 --- /dev/null +++ b/src/sonic-eventd/rsyslog_plugin_tests/test_syslogs_2.txt @@ -0,0 +1,3 @@ +testMessage true +another_test_message true + true diff --git a/src/sonic-eventd/src/eventd.cpp b/src/sonic-eventd/src/eventd.cpp new file mode 100644 index 000000000000..1ff9dd8be20b --- /dev/null +++ b/src/sonic-eventd/src/eventd.cpp @@ -0,0 +1,798 @@ +#include +#include "eventd.h" +#include "dbconnector.h" + +/* + * There are 5 threads, including the main + * + * (0) main thread -- Runs eventd service that accepts commands event_req_type_t + * This can be used to control caching events and a no-op echo service. + * + * (1) capture/cache service + * Saves all the events between cache start & stop. + * Update missed cached counter in memory. + * + * (2) Main proxy service that runs XSUB/XPUB ends + * + * (3) Get stats for total published counter in memory. This thread also sends + * heartbeat message. It accomplishes by counting upon receive missed due + * to event receive timeout. + * + * (4) Thread to update counters from memory to redis periodically. + * + */ + +using namespace std; +using namespace swss; + +#define MB(N) ((N) * 1024 * 1024) +#define EVT_SIZE_AVG 150 + +#define MAX_CACHE_SIZE (MB(100) / (EVT_SIZE_AVG)) + +/* Count of elements returned in each read */ +#define READ_SET_SIZE 100 + +#define VEC_SIZE(p) ((int)p.size()) + +/* Sock read timeout in milliseconds, to enable look for control signals */ +#define CAPTURE_SOCK_TIMEOUT 800 + +#define HEARTBEAT_INTERVAL_SECS 2 /* Default: 2 seconds */ + +/* Source & tag for heartbeat events */ +#define EVENTD_PUBLISHER_SOURCE "sonic-events-eventd" +#define EVENTD_HEARTBEAT_TAG "heartbeat" + + +const char *counter_keys[COUNTERS_EVENTS_TOTAL] = { + COUNTERS_EVENTS_PUBLISHED, + COUNTERS_EVENTS_MISSED_CACHE +}; + +static bool s_unit_testing = false; + +int +eventd_proxy::init() +{ + int ret = -1, rc = 0; + SWSS_LOG_INFO("Start xpub/xsub proxy"); + + m_frontend = zmq_socket(m_ctx, ZMQ_XSUB); + RET_ON_ERR(m_frontend != NULL, "failing to get ZMQ_XSUB socket"); + + rc = zmq_bind(m_frontend, get_config(string(XSUB_END_KEY)).c_str()); + RET_ON_ERR(rc == 0, "Failing to bind XSUB to %s", get_config(string(XSUB_END_KEY)).c_str()); + + m_backend = zmq_socket(m_ctx, ZMQ_XPUB); + RET_ON_ERR(m_backend != NULL, "failing to get ZMQ_XPUB socket"); + + rc = zmq_bind(m_backend, get_config(string(XPUB_END_KEY)).c_str()); + RET_ON_ERR(rc == 0, "Failing to bind XPUB to %s", get_config(string(XPUB_END_KEY)).c_str()); + + m_capture = zmq_socket(m_ctx, ZMQ_PUB); + RET_ON_ERR(m_capture != NULL, "failing to get ZMQ_PUB socket for capture"); + + rc = zmq_bind(m_capture, get_config(string(CAPTURE_END_KEY)).c_str()); + RET_ON_ERR(rc == 0, "Failing to bind capture PUB to %s", get_config(string(CAPTURE_END_KEY)).c_str()); + + m_thr = thread(&eventd_proxy::run, this); + ret = 0; +out: + return ret; +} + +void +eventd_proxy::run() +{ + SWSS_LOG_INFO("Running xpub/xsub proxy"); + + /* runs forever until zmq context is terminated */ + zmq_proxy(m_frontend, m_backend, m_capture); + + SWSS_LOG_INFO("Stopped xpub/xsub proxy"); +} + + +stats_collector::stats_collector() : + m_shutdown(false), m_pause_heartbeat(false), m_heartbeats_published(0), + m_heartbeats_interval_cnt(0) +{ + set_heartbeat_interval(HEARTBEAT_INTERVAL_SECS); + for (int i=0; i < COUNTERS_EVENTS_TOTAL; ++i) { + m_lst_counters[i] = 0; + } + m_updated = false; +} + + +void +stats_collector::set_heartbeat_interval(int val) +{ + if (val > 0) { + /* Round to highest possible multiples of MIN */ + m_heartbeats_interval_cnt = + (((val * 1000) + STATS_HEARTBEAT_MIN - 1) / STATS_HEARTBEAT_MIN); + } + else if (val == 0) { + /* Least possible */ + m_heartbeats_interval_cnt = 1; + } + else if (val == -1) { + /* Turn off heartbeat */ + m_heartbeats_interval_cnt = 0; + SWSS_LOG_INFO("Heartbeat turned OFF"); + } + /* Any other value is ignored as invalid */ + + SWSS_LOG_INFO("Set heartbeat: val=%d secs cnt=%d min=%d ms final=%d secs", + val, m_heartbeats_interval_cnt, STATS_HEARTBEAT_MIN, + (m_heartbeats_interval_cnt * STATS_HEARTBEAT_MIN / 1000)); +} + + +int +stats_collector::get_heartbeat_interval() +{ + return m_heartbeats_interval_cnt * STATS_HEARTBEAT_MIN / 1000; +} + +int +stats_collector::start() +{ + int rc = -1; + + if (!s_unit_testing) { + try { + m_counters_db = make_shared("COUNTERS_DB", 0, true); + } + catch (exception &e) + { + SWSS_LOG_ERROR("Unable to get DB Connector, e=(%s)\n", e.what()); + } + RET_ON_ERR(m_counters_db != NULL, "Failed to get COUNTERS_DB"); + + m_stats_table = make_shared( + m_counters_db.get(), COUNTERS_EVENTS_TABLE); + RET_ON_ERR(m_stats_table != NULL, "Failed to get events table"); + + m_thr_writer = thread(&stats_collector::run_writer, this); + } + m_thr_collector = thread(&stats_collector::run_collector, this); + rc = 0; +out: + return rc; +} + +void +stats_collector::run_writer() +{ + while (true) { + if (m_updated.exchange(false)) { + /* Update if there had been any update */ + + for (int i = 0; i < COUNTERS_EVENTS_TOTAL; ++i) { + vector fv; + + fv.emplace_back(EVENTS_STATS_FIELD_NAME, to_string(m_lst_counters[i])); + + m_stats_table->set(counter_keys[i], fv); + } + } + if (m_shutdown) { + break; + } + this_thread::sleep_for(chrono::milliseconds(10)); + /* + * After sleep always do an update if needed before checking + * shutdown flag, as any counters collected during sleep + * needs to be updated. + */ + } + + m_stats_table.reset(); + m_counters_db.reset(); +} + +void +stats_collector::run_collector() +{ + int hb_cntr = 0; + string hb_key = string(EVENTD_PUBLISHER_SOURCE) + ":" + EVENTD_HEARTBEAT_TAG; + event_handle_t pub_handle = NULL; + event_handle_t subs_handle = NULL; + + /* + * A subscriber is required to set a subscription. Else all published + * events will be dropped at the point of publishing itself. + */ + pub_handle = events_init_publisher(EVENTD_PUBLISHER_SOURCE); + RET_ON_ERR(pub_handle != NULL, + "failed to create publisher handle for heartbeats"); + + subs_handle = events_init_subscriber(false, STATS_HEARTBEAT_MIN); + RET_ON_ERR(subs_handle != NULL, "failed to subscribe to all"); + + /* + * Though we can count off of capture socket, then we need to duplicate + * code in event_receive which has the logic to count all missed per + * runtime id. It also has logic to retire closed runtime IDs. + * + * So use regular subscriber API w/o cache but timeout to enable + * exit, upon shutdown. + */ + /* + * The collector service runs until shutdown. + * The only task is to update total_published & total_missed_internal. + * The write of these counters into redis is done by another thread. + */ + + while(!m_shutdown) { + event_receive_op_t op; + int rc = 0; + + try { + rc = event_receive(subs_handle, op); + } + catch (exception& e) + { + rc = -1; + stringstream ss; + ss << e.what(); + SWSS_LOG_ERROR("Receive event failed with %s", ss.str().c_str()); + } + + if ((rc == 0) && (op.key != hb_key)) { + /* TODO: Discount EVENT_STR_CTRL_DEINIT messages too */ + increment_published(1+op.missed_cnt); + + /* reset counter on receive to restart. */ + hb_cntr = 0; + } + else { + if (rc < 0) { + SWSS_LOG_ERROR( + "event_receive failed with rc=%d; stats:published(%lu)", rc, + m_lst_counters[INDEX_COUNTERS_EVENTS_PUBLISHED]); + } + if (!m_pause_heartbeat && (m_heartbeats_interval_cnt > 0) && + ++hb_cntr >= m_heartbeats_interval_cnt) { + rc = event_publish(pub_handle, EVENTD_HEARTBEAT_TAG); + if (rc != 0) { + SWSS_LOG_ERROR("Failed to publish heartbeat rc=%d", rc); + } + hb_cntr = 0; + ++m_heartbeats_published; + } + } + } + +out: + /* + * NOTE: A shutdown could lose messages in cache. + * But consider, that eventd shutdown is a critical shutdown as it would + * bring down all other features. Hence done only at system level shutdown, + * hence losing few messages in flight is acceptable. Any more complex code + * to handle is unwanted. + */ + + events_deinit_subscriber(subs_handle); + events_deinit_publisher(pub_handle); + m_shutdown = true; +} + +capture_service::~capture_service() +{ + stop_capture(); +} + +void +capture_service::stop_capture() +{ + m_ctrl = STOP_CAPTURE; + + if (m_thr.joinable()) { + m_thr.join(); + } +} + +static bool +validate_event(const internal_event_t &event, runtime_id_t &rid, sequence_t &seq) +{ + bool ret = false; + + internal_event_t::const_iterator itc_r, itc_s, itc_e; + itc_r = event.find(EVENT_RUNTIME_ID); + itc_s = event.find(EVENT_SEQUENCE); + itc_e = event.find(EVENT_STR_DATA); + + if ((itc_r != event.end()) && (itc_s != event.end()) && (itc_e != event.end())) { + ret = true; + rid = itc_r->second; + seq = str_to_seq(itc_s->second); + } + else { + SWSS_LOG_ERROR("Invalid evt: %s", map_to_str(event).c_str()); + } + + return ret; +} + + +/* + * Initialize cache with set of events provided. + * Events read by cache service will be appended + */ +void +capture_service::init_capture_cache(const event_serialized_lst_t &lst) +{ + /* Cache given events as initial stock. + * Save runtime ID with last seen seq to avoid duplicates, while reading + * from capture socket. + * No check for max cache size here, as most likely not needed. + */ + for (event_serialized_lst_t::const_iterator itc = lst.begin(); itc != lst.end(); ++itc) { + internal_event_t event; + + if (deserialize(*itc, event) == 0) { + runtime_id_t rid; + sequence_t seq; + + if (validate_event(event, rid, seq)) { + m_pre_exist_id[rid] = seq; + m_events.push_back(*itc); + } + } + } +} + + +void +capture_service::do_capture() +{ + int rc; + int block_ms=CAPTURE_SOCK_TIMEOUT; + int init_cnt; + void *cap_sub_sock = NULL; + counters_t total_overflow = 0; + + typedef enum { + /* + * In this state every event read is compared with init cache given + * Only new events are saved. + */ + CAP_STATE_INIT = 0, + + /* In this state, all events read are cached until max limit */ + CAP_STATE_ACTIVE, + + /* Cache has hit max. Hence only save last event for each runime ID */ + CAP_STATE_LAST + } cap_state_t; + + cap_state_t cap_state = CAP_STATE_INIT; + + /* + * Need subscription for publishers to publish. + * The stats collector service already has active subscriber for all. + */ + + cap_sub_sock = zmq_socket(m_ctx, ZMQ_SUB); + RET_ON_ERR(cap_sub_sock != NULL, "failing to get ZMQ_SUB socket"); + + rc = zmq_connect(cap_sub_sock, get_config(string(CAPTURE_END_KEY)).c_str()); + RET_ON_ERR(rc == 0, "Failing to bind capture SUB to %s", get_config(string(CAPTURE_END_KEY)).c_str()); + + rc = zmq_setsockopt(cap_sub_sock, ZMQ_SUBSCRIBE, "", 0); + RET_ON_ERR(rc == 0, "Failing to ZMQ_SUBSCRIBE"); + + rc = zmq_setsockopt(cap_sub_sock, ZMQ_RCVTIMEO, &block_ms, sizeof (block_ms)); + RET_ON_ERR(rc == 0, "Failed to ZMQ_RCVTIMEO to %d", block_ms); + + m_cap_run = true; + + while (m_ctrl != START_CAPTURE) { + /* Wait for capture start */ + this_thread::sleep_for(chrono::milliseconds(10)); + } + + /* + * The cache service connects but defers any reading until caller provides + * the startup cache. But all events that arrived since connect, though not read + * will be held by ZMQ in its local cache. + * + * When cache service starts reading, check against the initial stock for duplicates. + * m_pre_exist_id caches the last seq number in initial stock for each runtime id. + * So only allow sequence number greater than cached number. + * + * Theoretically all the events provided via initial stock could be duplicates. + * Hence until as many events as in initial stock or until the cached id map + * is empty, do this check. + */ + init_cnt = (int)m_events.size(); + + /* Read until STOP_CAPTURE */ + while(m_ctrl == START_CAPTURE) { + runtime_id_t rid; + sequence_t seq; + internal_event_t event; + string source, evt_str; + + if ((rc = zmq_message_read(cap_sub_sock, 0, source, event)) != 0) { + /* + * The capture socket captures SUBSCRIBE requests too. + * The messge could contain subscribe filter strings and binary code. + * Empty string with binary code will fail to deserialize. + * Else would fail event validation. + */ + RET_ON_ERR((rc == EAGAIN) || (rc == ERR_MESSAGE_INVALID), + "0:Failed to read from capture socket"); + continue; + } + if (!validate_event(event, rid, seq)) { + continue; + } + serialize(event, evt_str); + + switch(cap_state) { + case CAP_STATE_INIT: + /* + * In this state check against cache, if duplicate + * When duplicate or new one seen, remove the entry from pre-exist map + * Stay in this state, until the pre-exist cache is empty or as many + * messages as in cache are seen, as in worst case even if you see + * duplicate of each, it will end with first m_events.size() + */ + { + bool add = true; + init_cnt--; + pre_exist_id_t::iterator it = m_pre_exist_id.find(rid); + + if (it != m_pre_exist_id.end()) { + if (seq <= it->second) { + /* Duplicate; Later/same seq in cache. */ + add = false; + } + if (seq >= it->second) { + /* new one; This runtime ID need not be checked again */ + m_pre_exist_id.erase(it); + } + } + if (add) { + m_events.push_back(evt_str); + } + } + if(m_pre_exist_id.empty() || (init_cnt <= 0)) { + /* Init check is no more needed. */ + pre_exist_id_t().swap(m_pre_exist_id); + cap_state = CAP_STATE_ACTIVE; + } + break; + + case CAP_STATE_ACTIVE: + /* Save until max allowed */ + try + { + m_events.push_back(evt_str); + if (VEC_SIZE(m_events) >= m_cache_max) { + cap_state = CAP_STATE_LAST; + /* Clear the map, created to ensure memory space available */ + m_last_events.clear(); + m_last_events_init = true; + } + break; + } + catch (bad_alloc& e) + { + stringstream ss; + ss << e.what(); + SWSS_LOG_ERROR("Cache save event failed with %s events:size=%d", + ss.str().c_str(), VEC_SIZE(m_events)); + cap_state = CAP_STATE_LAST; + // fall through to save this event in last set. + } + + case CAP_STATE_LAST: + total_overflow++; + m_last_events[rid] = evt_str; + if (total_overflow > m_last_events.size()) { + m_total_missed_cache++; + m_stats_instance->increment_missed_cache(1); + } + break; + } + } + +out: + /* + * Capture stop will close the socket which fail the read + * and hence bail out. + */ + zmq_close(cap_sub_sock); + m_cap_run = false; + return; +} + + +int +capture_service::set_control(capture_control_t ctrl, event_serialized_lst_t *lst) +{ + int ret = -1; + + /* Can go in single step only. */ + RET_ON_ERR((ctrl - m_ctrl) == 1, "m_ctrl(%d)+1 < ctrl(%d)", m_ctrl, ctrl); + + switch(ctrl) { + case INIT_CAPTURE: + m_thr = thread(&capture_service::do_capture, this); + for(int i=0; !m_cap_run && (i < 100); ++i) { + /* Wait max a second for thread to init */ + this_thread::sleep_for(chrono::milliseconds(10)); + } + RET_ON_ERR(m_cap_run, "Failed to init capture"); + m_ctrl = ctrl; + ret = 0; + break; + + case START_CAPTURE: + + /* + * Reserve a MAX_PUBLISHERS_COUNT entries for last events, as we use it only + * upon m_events/vector overflow, which might block adding new entries in map + * if overall mem consumption is too high. Clearing the map just before use + * is likely to help. + */ + for (int i=0; iempty())) { + init_capture_cache(*lst); + } + m_ctrl = ctrl; + ret = 0; + break; + + + case STOP_CAPTURE: + /* + * Caller would have initiated SUBS channel. + * Read for CACHE_DRAIN_IN_MILLISECS to drain off cache + * before stopping. + */ + this_thread::sleep_for(chrono::milliseconds(CACHE_DRAIN_IN_MILLISECS)); + stop_capture(); + ret = 0; + break; + + default: + SWSS_LOG_ERROR("Unexpected code=%d", ctrl); + break; + } +out: + return ret; +} + +int +capture_service::read_cache(event_serialized_lst_t &lst_fifo, + last_events_t &lst_last, counters_t &overflow_cnt) +{ + lst_fifo.swap(m_events); + if (m_last_events_init) { + lst_last.swap(m_last_events); + } else { + last_events_t().swap(lst_last); + } + last_events_t().swap(m_last_events); + event_serialized_lst_t().swap(m_events); + overflow_cnt = m_total_missed_cache; + return 0; +} + +static int +process_options(stats_collector *stats, const event_serialized_lst_t &req_data, + event_serialized_lst_t &resp_data) +{ + int ret = -1; + if (!req_data.empty()) { + RET_ON_ERR(req_data.size() == 1, "Expect only one options string %d", + (int)req_data.size()); + const auto &data = nlohmann::json::parse(*(req_data.begin())); + RET_ON_ERR(data.size() == 1, "Only one supported option. Expect 1. size=%d", + (int)data.size()); + const auto it = data.find(GLOBAL_OPTION_HEARTBEAT); + RET_ON_ERR(it != data.end(), "Expect HEARTBEAT_INTERVAL; got %s", + data.begin().key().c_str()); + stats->set_heartbeat_interval(it.value()); + ret = 0; + } + else { + nlohmann::json msg = nlohmann::json::object(); + msg[GLOBAL_OPTION_HEARTBEAT] = stats->get_heartbeat_interval(); + resp_data.push_back(msg.dump()); + ret = 0; + } +out: + return ret; +} + + +void +run_eventd_service() +{ + int code = 0; + int cache_max; + event_service service; + stats_collector stats_instance; + eventd_proxy *proxy = NULL; + capture_service *capture = NULL; + + event_serialized_lst_t capture_fifo_events; + last_events_t capture_last_events; + + SWSS_LOG_INFO("Eventd service starting\n"); + + void *zctx = zmq_ctx_new(); + RET_ON_ERR(zctx != NULL, "Failed to get zmq ctx"); + + cache_max = get_config_data(string(CACHE_MAX_CNT), (int)MAX_CACHE_SIZE); + RET_ON_ERR(cache_max > 0, "Failed to get CACHE_MAX_CNT"); + + proxy = new eventd_proxy(zctx); + RET_ON_ERR(proxy != NULL, "Failed to create proxy"); + + RET_ON_ERR(proxy->init() == 0, "Failed to init proxy"); + + RET_ON_ERR(service.init_server(zctx) == 0, "Failed to init service"); + + RET_ON_ERR(stats_instance.start() == 0, "Failed to start stats collector"); + + /* Pause heartbeat during caching */ + stats_instance.heartbeat_ctrl(true); + + /* + * Start cache service, right upon eventd starts so as not to lose + * events until telemetry starts. + * Telemetry will send a stop & collect cache upon startup + */ + capture = new capture_service(zctx, cache_max, &stats_instance); + RET_ON_ERR(capture->set_control(INIT_CAPTURE) == 0, "Failed to init capture"); + RET_ON_ERR(capture->set_control(START_CAPTURE) == 0, "Failed to start capture"); + + this_thread::sleep_for(chrono::milliseconds(200)); + RET_ON_ERR(stats_instance.is_running(), "Failed to start stats instance"); + + while(code != EVENT_EXIT) { + int resp = -1; + event_serialized_lst_t req_data, resp_data; + + RET_ON_ERR(service.channel_read(code, req_data) == 0, + "Failed to read request"); + + switch(code) { + case EVENT_CACHE_INIT: + /* connect only*/ + if (capture != NULL) { + delete capture; + } + event_serialized_lst_t().swap(capture_fifo_events); + last_events_t().swap(capture_last_events); + + capture = new capture_service(zctx, cache_max, &stats_instance); + if (capture != NULL) { + resp = capture->set_control(INIT_CAPTURE); + } + break; + + + case EVENT_CACHE_START: + if (capture == NULL) { + SWSS_LOG_ERROR("Cache is not initialized to start"); + resp = -1; + break; + } + /* Pause heartbeat during caching */ + stats_instance.heartbeat_ctrl(true); + + resp = capture->set_control(START_CAPTURE, &req_data); + break; + + + case EVENT_CACHE_STOP: + if (capture == NULL) { + SWSS_LOG_ERROR("Cache is not initialized to stop"); + resp = -1; + break; + } + resp = capture->set_control(STOP_CAPTURE); + if (resp == 0) { + counters_t overflow; + resp = capture->read_cache(capture_fifo_events, capture_last_events, + overflow); + } + delete capture; + capture = NULL; + + /* Unpause heartbeat upon stop caching */ + stats_instance.heartbeat_ctrl(); + break; + + + case EVENT_CACHE_READ: + if (capture != NULL) { + SWSS_LOG_ERROR("Cache is not stopped yet."); + resp = -1; + break; + } + resp = 0; + + if (capture_fifo_events.empty()) { + for (last_events_t::iterator it = capture_last_events.begin(); + it != capture_last_events.end(); ++it) { + capture_fifo_events.push_back(it->second); + } + last_events_t().swap(capture_last_events); + } + + { + int sz = VEC_SIZE(capture_fifo_events) < READ_SET_SIZE ? + VEC_SIZE(capture_fifo_events) : READ_SET_SIZE; + + if (sz != 0) { + auto it = std::next(capture_fifo_events.begin(), sz); + move(capture_fifo_events.begin(), capture_fifo_events.end(), + back_inserter(resp_data)); + + if (sz == VEC_SIZE(capture_fifo_events)) { + event_serialized_lst_t().swap(capture_fifo_events); + } else { + capture_fifo_events.erase(capture_fifo_events.begin(), it); + } + } + } + break; + + + case EVENT_ECHO: + resp = 0; + resp_data.swap(req_data); + break; + + case EVENT_OPTIONS: + resp = process_options(&stats_instance, req_data, resp_data); + break; + + case EVENT_EXIT: + resp = 0; + break; + + default: + SWSS_LOG_ERROR("Unexpected request: %d", code); + assert(false); + break; + } + RET_ON_ERR(service.channel_write(resp, resp_data) == 0, + "Failed to write response back"); + } +out: + service.close_service(); + stats_instance.stop(); + + if (proxy != NULL) { + delete proxy; + } + if (capture != NULL) { + delete capture; + } + if (zctx != NULL) { + zmq_ctx_term(zctx); + } + SWSS_LOG_ERROR("Eventd service exiting\n"); +} + +void set_unit_testing(bool b) +{ + s_unit_testing = b; +} + + diff --git a/src/sonic-eventd/src/eventd.h b/src/sonic-eventd/src/eventd.h new file mode 100644 index 000000000000..8411223b35be --- /dev/null +++ b/src/sonic-eventd/src/eventd.h @@ -0,0 +1,268 @@ +/* + * Header file for eventd daemon + */ +#include "table.h" +#include "events_service.h" +#include "events.h" +#include "events_wrap.h" + +#define ARRAY_SIZE(l) (sizeof(l)/sizeof((l)[0])) + +typedef map last_events_t; + +/* stat counters */ +typedef uint64_t counters_t; + +typedef enum { + INDEX_COUNTERS_EVENTS_PUBLISHED, + INDEX_COUNTERS_EVENTS_MISSED_CACHE, + COUNTERS_EVENTS_TOTAL +} stats_counter_index_t; + +#define EVENTS_STATS_FIELD_NAME "value" +#define STATS_HEARTBEAT_MIN 300 + +/* + * Started by eventd_service. + * Creates XPUB & XSUB end points. + * Bind the same + * Create a PUB socket end point for capture and bind. + * Call run_proxy method with sockets in a dedicated thread. + * Thread runs forever until the zmq context is terminated. + */ +class eventd_proxy +{ + public: + eventd_proxy(void *ctx) : m_ctx(ctx), m_frontend(NULL), m_backend(NULL), + m_capture(NULL) {}; + + ~eventd_proxy() { + zmq_close(m_frontend); + zmq_close(m_backend); + zmq_close(m_capture); + + if (m_thr.joinable()) + m_thr.join(); + } + + int init(); + + private: + void run(); + + void *m_ctx; + void *m_frontend; + void *m_backend; + void *m_capture; + thread m_thr; +}; + + +class stats_collector +{ + public: + stats_collector(); + + ~stats_collector() { stop(); } + + int start(); + + void stop() { + + m_shutdown = true; + + if (m_thr_collector.joinable()) { + m_thr_collector.join(); + } + + if (m_thr_writer.joinable()) { + m_thr_writer.join(); + } + } + + void increment_published(counters_t val) { + _update_stats(INDEX_COUNTERS_EVENTS_PUBLISHED, val); + } + + void increment_missed_cache(counters_t val) { + _update_stats(INDEX_COUNTERS_EVENTS_MISSED_CACHE, val); + } + + counters_t read_counter(stats_counter_index_t index) { + if (index != COUNTERS_EVENTS_TOTAL) { + return m_lst_counters[index]; + } + else { + return 0; + } + } + + /* Sets heartbeat interval in milliseconds */ + void set_heartbeat_interval(int val_in_ms); + + /* + * Get heartbeat interval in milliseconds + * NOTE: Set & get value may not match as the value is rounded + * to a multiple of smallest possible interval. + */ + int get_heartbeat_interval(); + + /* A way to pause heartbeat */ + void heartbeat_ctrl(bool pause = false) { + m_pause_heartbeat = pause; + SWSS_LOG_INFO("Set heartbeat_ctrl pause=%d", pause); + } + + uint64_t heartbeats_published() const { + return m_heartbeats_published; + } + + bool is_running() + { + return !m_shutdown; + } + + private: + void _update_stats(stats_counter_index_t index, counters_t val) { + if (index != COUNTERS_EVENTS_TOTAL) { + m_lst_counters[index] += val; + m_updated = true; + } + else { + SWSS_LOG_ERROR("Internal code error. Invalid index=%d", index); + } + } + + void run_collector(); + + void run_writer(); + + atomic m_updated; + + counters_t m_lst_counters[COUNTERS_EVENTS_TOTAL]; + + bool m_shutdown; + + thread m_thr_collector; + thread m_thr_writer; + + shared_ptr m_counters_db; + shared_ptr m_stats_table; + + bool m_pause_heartbeat; + + uint64_t m_heartbeats_published; + + int m_heartbeats_interval_cnt; +}; + +/* + * Capture/Cache service + * + * The service started in a dedicted thread upon demand. + * It is controlled by the caller. + * On cache init, the thread is created. + * Upon create, it creates a SUB socket to PUB end point of capture. + * PUB end point is maintained by zproxy service. + * + * On Cache start, the thread is signalled to start reading. + * + * On cache stop, it is signalled to stop reading and exit. Caller waits + * for thread to exit, before starting to read cached data, to ensure + * that the data is not handled by two threads concurrently. + * + * This thread maintains its own copy of cache. Reader, does a swap + * after thread exits. + * This thread ensures the cache is empty at the init. + * + * Upon cache start, the thread is blocked in receive call with timeout. + * Only upon receive/timeout, it would notice stop signal. Hence stop + * is not synchronous. The caller may wait for thread to terminate + * via thread.join(). + * + * Each event is 2 parts. It drops the first part, which is + * more for filtering events. It creates string from second part + * and saves it. + * + * The string is the serialized version of internal_event_ref + * + * It keeps two sets of data + * 1) List of all events received in vector in same order as received + * 2) Map of last event from each runtime id upon list overflow max size. + * + * We add to the vector as much as allowed by vector and max limit, + * whichever comes first. + * + * The sequence number in internal event will help assess the missed count + * by the consumer of the cache data. + * + */ +typedef enum { + NEED_INIT = 0, + INIT_CAPTURE, + START_CAPTURE, + STOP_CAPTURE +} capture_control_t; + + +class capture_service +{ + public: + capture_service(void *ctx, int cache_max, stats_collector *stats) : + m_ctx(ctx), m_stats_instance(stats), m_cap_run(false), + m_ctrl(NEED_INIT), m_cache_max(cache_max), + m_last_events_init(false), m_total_missed_cache(0) + {} + + ~capture_service(); + + int set_control(capture_control_t ctrl, event_serialized_lst_t *p=NULL); + + int read_cache(event_serialized_lst_t &lst_fifo, + last_events_t &lst_last, counters_t &overflow_cnt); + + private: + void init_capture_cache(const event_serialized_lst_t &lst); + void do_capture(); + + void stop_capture(); + + void *m_ctx; + stats_collector *m_stats_instance; + + bool m_cap_run; + capture_control_t m_ctrl; + thread m_thr; + + int m_cache_max; + + event_serialized_lst_t m_events; + + last_events_t m_last_events; + bool m_last_events_init; + + typedef map pre_exist_id_t; + pre_exist_id_t m_pre_exist_id; + + counters_t m_total_missed_cache; + +}; + + +/* + * Main server, that starts the zproxy service and honor + * eventd service requests event_req_type_t + * + * For echo, it just echoes + * + * FOr cache start, create the SUB end of capture and kick off + * capture_events thread. Upon cache stop command, close the handle + * which will stop the caching thread with read failure. + * + * for cache read, returns the collected events in chunks. + * + */ +void run_eventd_service(); + +/* To help skip redis access during unit testing */ +void set_unit_testing(bool b); diff --git a/src/sonic-eventd/src/main.cpp b/src/sonic-eventd/src/main.cpp new file mode 100644 index 000000000000..7a20497f0986 --- /dev/null +++ b/src/sonic-eventd/src/main.cpp @@ -0,0 +1,18 @@ +#include "logger.h" +#include "eventd.h" + +void run_eventd_service(); + +int main() +{ + swss::Logger::setMinPrio(swss::Logger::SWSS_DEBUG); + SWSS_LOG_INFO("The eventd service started"); + SWSS_LOG_ERROR("ERR:The eventd service started"); + + run_eventd_service(); + + SWSS_LOG_INFO("The eventd service exited"); + + return 0; +} + diff --git a/src/sonic-eventd/src/subdir.mk b/src/sonic-eventd/src/subdir.mk new file mode 100644 index 000000000000..a1e2b55f8d13 --- /dev/null +++ b/src/sonic-eventd/src/subdir.mk @@ -0,0 +1,13 @@ +CC := g++ + +TEST_OBJS += ./src/eventd.o +OBJS += ./src/eventd.o ./src/main.o + +C_DEPS += ./src/eventd.d ./src/main.d + +src/%.o: src/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + $(CC) -D__FILENAME__="$(subst src/,,$<)" $(CFLAGS) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' diff --git a/src/sonic-eventd/tests/eventd_ut.cpp b/src/sonic-eventd/tests/eventd_ut.cpp new file mode 100644 index 000000000000..399255edb2b8 --- /dev/null +++ b/src/sonic-eventd/tests/eventd_ut.cpp @@ -0,0 +1,915 @@ +#include +#include +#include +#include +#include +#include +#include +#include "gtest/gtest.h" +#include "events_common.h" +#include "events.h" +#include "../src/eventd.h" + +using namespace std; +using namespace swss; + +extern bool g_is_redis_available; +extern const char *counter_keys[]; + +typedef struct { + int id; + string source; + string tag; + string rid; + string seq; + event_params_t params; + int missed_cnt; +} test_data_t; + +internal_event_t create_ev(const test_data_t &data) +{ + internal_event_t event_data; + + event_data[EVENT_STR_DATA] = convert_to_json( + data.source + ":" + data.tag, data.params); + event_data[EVENT_RUNTIME_ID] = data.rid; + event_data[EVENT_SEQUENCE] = data.seq; + + return event_data; +} + +/* Mock test data with event parameters and expected missed count */ +static const test_data_t ldata[] = { + { + 0, + "source0", + "tag0", + "guid-0", + "1", + {{"ip", "10.10.10.10"}, {"state", "up"}}, + 0 + }, + { + 1, + "source0", + "tag1", + "guid-1", + "100", + {{"ip", "10.10.27.10"}, {"state", "down"}}, + 0 + }, + { + 2, + "source1", + "tag2", + "guid-2", + "101", + {{"ip", "10.10.24.10"}, {"state", "down"}}, + 0 + }, + { + 3, + "source0", + "tag3", + "guid-1", + "105", + {{"ip", "10.10.10.10"}, {"state", "up"}}, + 4 + }, + { + 4, + "source0", + "tag4", + "guid-0", + "2", + {{"ip", "10.10.20.10"}, {"state", "down"}}, + 0 + }, + { + 5, + "source1", + "tag5", + "guid-2", + "110", + {{"ip", "10.10.24.10"}, {"state", "down"}}, + 8 + }, + { + 6, + "source0", + "tag0", + "guid-0", + "5", + {{"ip", "10.10.10.10"}, {"state", "up"}}, + 2 + }, + { + 7, + "source0", + "tag1", + "guid-1", + "106", + {{"ip", "10.10.27.10"}, {"state", "down"}}, + 0 + }, + { + 8, + "source1", + "tag2", + "guid-2", + "111", + {{"ip", "10.10.24.10"}, {"state", "down"}}, + 0 + }, + { + 9, + "source0", + "tag3", + "guid-1", + "109", + {{"ip", "10.10.10.10"}, {"state", "up"}}, + 2 + }, + { + 10, + "source0", + "tag4", + "guid-0", + "6", + {{"ip", "10.10.20.10"}, {"state", "down"}}, + 0 + }, + { + 11, + "source1", + "tag5", + "guid-2", + "119", + {{"ip", "10.10.24.10"}, {"state", "down"}}, + 7 + }, +}; + + +void run_cap(void *zctx, bool &term, string &read_source, + int &cnt) +{ + void *mock_cap = zmq_socket (zctx, ZMQ_SUB); + string source; + internal_event_t ev_int; + int block_ms = 200; + int i=0; + + EXPECT_TRUE(NULL != mock_cap); + EXPECT_EQ(0, zmq_connect(mock_cap, get_config(CAPTURE_END_KEY).c_str())); + EXPECT_EQ(0, zmq_setsockopt(mock_cap, ZMQ_SUBSCRIBE, "", 0)); + EXPECT_EQ(0, zmq_setsockopt(mock_cap, ZMQ_RCVTIMEO, &block_ms, sizeof (block_ms))); + + while(!term) { + string source; + internal_event_t ev_int; + + if (0 == zmq_message_read(mock_cap, 0, source, ev_int)) { + cnt = ++i; + } + } + zmq_close(mock_cap); +} + +void run_sub(void *zctx, bool &term, string &read_source, internal_events_lst_t &lst, + int &cnt) +{ + void *mock_sub = zmq_socket (zctx, ZMQ_SUB); + string source; + internal_event_t ev_int; + int block_ms = 200; + + EXPECT_TRUE(NULL != mock_sub); + EXPECT_EQ(0, zmq_connect(mock_sub, get_config(XPUB_END_KEY).c_str())); + EXPECT_EQ(0, zmq_setsockopt(mock_sub, ZMQ_SUBSCRIBE, "", 0)); + EXPECT_EQ(0, zmq_setsockopt(mock_sub, ZMQ_RCVTIMEO, &block_ms, sizeof (block_ms))); + + while(!term) { + if (0 == zmq_message_read(mock_sub, 0, source, ev_int)) { + lst.push_back(ev_int); + read_source.swap(source); + cnt = (int)lst.size(); + } + } + + zmq_close(mock_sub); +} + +void *init_pub(void *zctx) +{ + void *mock_pub = zmq_socket (zctx, ZMQ_PUB); + EXPECT_TRUE(NULL != mock_pub); + EXPECT_EQ(0, zmq_connect(mock_pub, get_config(XSUB_END_KEY).c_str())); + + /* Provide time for async connect to complete */ + this_thread::sleep_for(chrono::milliseconds(200)); + + return mock_pub; +} + +void run_pub(void *mock_pub, const string wr_source, internal_events_lst_t &lst) +{ + for(internal_events_lst_t::const_iterator itc = lst.begin(); itc != lst.end(); ++itc) { + EXPECT_EQ(0, zmq_message_send(mock_pub, wr_source, *itc)); + } +} + + +TEST(eventd, proxy) +{ + printf("Proxy TEST started\n"); + bool term_sub = false; + bool term_cap = false; + string rd_csource, rd_source, wr_source("hello"); + internal_events_lst_t rd_evts, wr_evts; + int rd_evts_sz = 0, rd_cevts_sz = 0; + int wr_sz; + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + eventd_proxy *pxy = new eventd_proxy(zctx); + EXPECT_TRUE(NULL != pxy); + + /* Starting proxy */ + EXPECT_EQ(0, pxy->init()); + + /* subscriber in a thread */ + thread thr(&run_sub, zctx, ref(term_sub), ref(rd_source), ref(rd_evts), ref(rd_evts_sz)); + + /* capture in a thread */ + thread thrc(&run_cap, zctx, ref(term_cap), ref(rd_csource), ref(rd_cevts_sz)); + + /* Init pub connection */ + void *mock_pub = init_pub(zctx); + + EXPECT_TRUE(5 < ARRAY_SIZE(ldata)); + + for(int i=0; i<5; ++i) { + wr_evts.push_back(create_ev(ldata[i])); + } + + EXPECT_TRUE(rd_evts.empty()); + EXPECT_TRUE(rd_source.empty()); + + /* Publish events. */ + run_pub(mock_pub, wr_source, wr_evts); + + wr_sz = (int)wr_evts.size(); + for(int i=0; (wr_sz != rd_evts_sz) && (i < 100); ++i) { + /* Loop & wait for atmost a second */ + this_thread::sleep_for(chrono::milliseconds(10)); + } + this_thread::sleep_for(chrono::milliseconds(1000)); + + delete pxy; + pxy = NULL; + + term_sub = true; + term_cap = true; + + thr.join(); + thrc.join(); + EXPECT_EQ(rd_evts.size(), wr_evts.size()); + EXPECT_EQ(rd_cevts_sz, wr_evts.size()); + + zmq_close(mock_pub); + zmq_ctx_term(zctx); + + /* Provide time for async proxy removal to complete */ + this_thread::sleep_for(chrono::milliseconds(200)); + + printf("eventd_proxy is tested GOOD\n"); +} + + +TEST(eventd, capture) +{ + printf("Capture TEST started\n"); + + bool term_sub = false; + string sub_source; + int sub_evts_sz = 0; + internal_events_lst_t sub_evts; + stats_collector stats_instance; + + /* run_pub details */ + string wr_source("hello"); + internal_events_lst_t wr_evts; + + /* capture related */ + int init_cache = 3; /* provided along with start capture */ + int cache_max = init_cache + 3; /* capture service cache max */ + + /* startup strings; expected list & read list from capture */ + event_serialized_lst_t evts_start, evts_expect, evts_read; + last_events_t last_evts_exp, last_evts_read; + counters_t overflow, overflow_exp = 0; + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + /* Run the proxy; Capture service reads from proxy */ + eventd_proxy *pxy = new eventd_proxy(zctx); + EXPECT_TRUE(NULL != pxy); + + /* Starting proxy */ + EXPECT_EQ(0, pxy->init()); + + /* Run subscriber; Else publisher will drop events on floor, with no subscriber. */ + thread thr_sub(&run_sub, zctx, ref(term_sub), ref(sub_source), ref(sub_evts), ref(sub_evts_sz)); + + /* Create capture service */ + capture_service *pcap = new capture_service(zctx, cache_max, &stats_instance); + + /* Expect START_CAPTURE */ + EXPECT_EQ(-1, pcap->set_control(STOP_CAPTURE)); + + /* Initialize the capture */ + EXPECT_EQ(0, pcap->set_control(INIT_CAPTURE)); + + EXPECT_TRUE(init_cache > 1); + EXPECT_TRUE((cache_max+3) < (int)ARRAY_SIZE(ldata)); + + /* Collect few serailized strings of events for startup cache */ + for(int i=0; i < init_cache; ++i) { + internal_event_t ev(create_ev(ldata[i])); + string evt_str; + serialize(ev, evt_str); + evts_start.push_back(evt_str); + evts_expect.push_back(evt_str); + } + + /* + * Collect events to publish for capture to cache + * re-publishing some events sent in cache. + * Hence i=1, when first init_cache events are already + * in crash. + */ + for(int i=1; i < (int)ARRAY_SIZE(ldata); ++i) { + internal_event_t ev(create_ev(ldata[i])); + string evt_str; + + serialize(ev, evt_str); + + wr_evts.push_back(ev); + + if (i < cache_max) { + if (i >= init_cache) { + /* for i < init_cache, evts_expect is already populated */ + evts_expect.push_back(evt_str); + } + } else { + /* collect last entries for overflow */ + last_evts_exp[ldata[i].rid] = evt_str; + overflow_exp++; + } + } + overflow_exp -= (int)last_evts_exp.size(); + + EXPECT_EQ(0, pcap->set_control(START_CAPTURE, &evts_start)); + + /* Init pub connection */ + void *mock_pub = init_pub(zctx); + + /* Publish events from 1 to all. */ + run_pub(mock_pub, wr_source, wr_evts); + + /* Provide time for async message receive. */ + this_thread::sleep_for(chrono::milliseconds(200)); + + /* Stop capture, closes socket & terminates the thread */ + EXPECT_EQ(0, pcap->set_control(STOP_CAPTURE)); + + /* terminate subs thread */ + term_sub = true; + + /* Read the cache */ + EXPECT_EQ(0, pcap->read_cache(evts_read, last_evts_read, overflow)); + +#ifdef DEBUG_TEST + if ((evts_read.size() != evts_expect.size()) || + (last_evts_read.size() != last_evts_exp.size())) { + printf("size: sub_evts_sz=%d sub_evts=%d\n", sub_evts_sz, (int)sub_evts.size()); + printf("init_cache=%d cache_max=%d\n", init_cache, cache_max); + printf("overflow=%ul overflow_exp=%ul\n", overflow, overflow_exp); + printf("evts_start=%d evts_expect=%d evts_read=%d\n", + (int)evts_start.size(), (int)evts_expect.size(), (int)evts_read.size()); + printf("last_evts_exp=%d last_evts_read=%d\n", (int)last_evts_exp.size(), + (int)last_evts_read.size()); + } +#endif + + EXPECT_EQ(evts_read.size(), evts_expect.size()); + EXPECT_EQ(evts_read, evts_expect); + EXPECT_EQ(last_evts_read.size(), last_evts_exp.size()); + EXPECT_EQ(last_evts_read, last_evts_exp); + EXPECT_EQ(overflow, overflow_exp); + + delete pxy; + pxy = NULL; + + delete pcap; + pcap = NULL; + + thr_sub.join(); + + zmq_close(mock_pub); + zmq_ctx_term(zctx); + + /* Provide time for async proxy removal to complete */ + this_thread::sleep_for(chrono::milliseconds(200)); + + printf("Capture TEST completed\n"); +} + +TEST(eventd, captureCacheMax) +{ + printf("Capture TEST with matchinhg cache-max started\n"); + + /* + * Need to run subscriber; Else publisher would skip publishing + * in the absence of any subscriber. + */ + bool term_sub = false; + string sub_source; + int sub_evts_sz = 0; + internal_events_lst_t sub_evts; + stats_collector stats_instance; + + /* run_pub details */ + string wr_source("hello"); + internal_events_lst_t wr_evts; + + /* capture related */ + int init_cache = 4; /* provided along with start capture */ + int cache_max = ARRAY_SIZE(ldata); /* capture service cache max */ + + /* startup strings; expected list & read list from capture */ + event_serialized_lst_t evts_start, evts_expect, evts_read; + last_events_t last_evts_read; + counters_t overflow; + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + /* Run the proxy; Capture service reads from proxy */ + eventd_proxy *pxy = new eventd_proxy(zctx); + EXPECT_TRUE(NULL != pxy); + + /* Starting proxy */ + EXPECT_EQ(0, pxy->init()); + + /* Run subscriber; Else publisher will drop events on floor, with no subscriber. */ + thread thr_sub(&run_sub, zctx, ref(term_sub), ref(sub_source), ref(sub_evts), ref(sub_evts_sz)); + + /* Create capture service */ + capture_service *pcap = new capture_service(zctx, cache_max, &stats_instance); + + /* Expect START_CAPTURE */ + EXPECT_EQ(-1, pcap->set_control(STOP_CAPTURE)); + + EXPECT_TRUE(init_cache > 1); + + /* Collect few serailized strings of events for startup cache */ + for(int i=0; i < init_cache; ++i) { + internal_event_t ev(create_ev(ldata[i])); + string evt_str; + serialize(ev, evt_str); + evts_start.push_back(evt_str); + evts_expect.push_back(evt_str); + } + + /* + * Collect events to publish for capture to cache + * re-publishing some events sent in cache. + */ + for(int i=1; i < (int)ARRAY_SIZE(ldata); ++i) { + internal_event_t ev(create_ev(ldata[i])); + string evt_str; + + serialize(ev, evt_str); + + wr_evts.push_back(ev); + + if (i >= init_cache) { + /* for i < init_cache, evts_expect is already populated */ + evts_expect.push_back(evt_str); + } + } + + EXPECT_EQ(0, pcap->set_control(INIT_CAPTURE)); + EXPECT_EQ(0, pcap->set_control(START_CAPTURE, &evts_start)); + + /* Init pub connection */ + void *mock_pub = init_pub(zctx); + + /* Publish events from 1 to all. */ + run_pub(mock_pub, wr_source, wr_evts); + + /* Provide time for async message receive. */ + this_thread::sleep_for(chrono::milliseconds(100)); + + /* Stop capture, closes socket & terminates the thread */ + EXPECT_EQ(0, pcap->set_control(STOP_CAPTURE)); + + /* terminate subs thread */ + term_sub = true; + + /* Read the cache */ + EXPECT_EQ(0, pcap->read_cache(evts_read, last_evts_read, overflow)); + +#ifdef DEBUG_TEST + if ((evts_read.size() != evts_expect.size()) || + !last_evts_read.empty()) { + printf("size: sub_evts_sz=%d sub_evts=%d\n", sub_evts_sz, (int)sub_evts.size()); + printf("init_cache=%d cache_max=%d\n", init_cache, cache_max); + printf("evts_start=%d evts_expect=%d evts_read=%d\n", + (int)evts_start.size(), (int)evts_expect.size(), (int)evts_read.size()); + printf("last_evts_read=%d\n", (int)last_evts_read.size()); + printf("overflow=%ul overflow_exp=%ul\n", overflow, overflow_exp); + } +#endif + + EXPECT_EQ(evts_read, evts_expect); + EXPECT_TRUE(last_evts_read.empty()); + EXPECT_EQ(overflow, 0); + + delete pxy; + pxy = NULL; + + delete pcap; + pcap = NULL; + + thr_sub.join(); + + zmq_close(mock_pub); + zmq_ctx_term(zctx); + + /* Provide time for async proxy removal to complete */ + this_thread::sleep_for(chrono::milliseconds(200)); + + printf("Capture TEST with matchinhg cache-max completed\n"); +} + +TEST(eventd, service) +{ + /* + * Don't PUB/SUB events as main run_eventd_service itself + * is using zmq_message_read. Any PUB/SUB will cause + * eventd's do_capture running in another thread to call + * zmq_message_read, which will crash as boost:archive is + * not thread safe. + * TEST(eventd, capture) has already tested caching. + */ + printf("Service TEST started\n"); + + /* startup strings; expected list & read list from capture */ + event_service service; + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + /* + * Start the eventd server side service + * It runs proxy & capture service + * It uses its own zmq context + * It starts to capture too. + */ + + if (!g_is_redis_available) { + set_unit_testing(true); + } + + thread thread_service(&run_eventd_service); + + /* Need client side service to interact with server side */ + EXPECT_EQ(0, service.init_client(zctx)); + + { + /* eventd_service starts cache too; Test this caching */ + /* Init pub connection */ + void *mock_pub = init_pub(zctx); + EXPECT_TRUE(NULL != mock_pub); + + internal_events_lst_t wr_evts; + int wr_sz = 2; + string wr_source("hello"); + + /* Test service startup caching */ + event_serialized_lst_t evts_start, evts_read; + + for(int i=0; i evts_start_int; + + EXPECT_TRUE(init_cache > 1); + + /* Collect few serailized strings of events for startup cache */ + for(int i=0; i < init_cache; ++i) { + internal_event_t ev(create_ev(ldata[i])); + string evt_str; + serialize(ev, evt_str); + evts_start.push_back(evt_str); + evts_start_int.push_back(ev); + } + + + EXPECT_EQ(0, service.cache_init()); + EXPECT_EQ(0, service.cache_start(evts_start)); + + this_thread::sleep_for(chrono::milliseconds(200)); + + /* Stop capture, closes socket & terminates the thread */ + EXPECT_EQ(0, service.cache_stop()); + + /* Read the cache */ + EXPECT_EQ(0, service.cache_read(evts_read)); + + if (evts_read != evts_start) { + vector evts_read_int; + + for (event_serialized_lst_t::const_iterator itc = evts_read.begin(); + itc != evts_read.end(); ++itc) { + internal_event_t event; + + if (deserialize(*itc, event) == 0) { + evts_read_int.push_back(event); + } + } + EXPECT_EQ(evts_read_int, evts_start_int); + } + } + + { + string set_opt_bad("{\"HEARTBEAT_INTERVAL\": 2000, \"OFFLINE_CACHE_SIZE\": 500}"); + string set_opt_good("{\"HEARTBEAT_INTERVAL\":5}"); + char buff[100]; + buff[0] = 0; + + EXPECT_EQ(-1, service.global_options_set(set_opt_bad.c_str())); + EXPECT_EQ(0, service.global_options_set(set_opt_good.c_str())); + EXPECT_LT(0, service.global_options_get(buff, sizeof(buff))); + + EXPECT_EQ(set_opt_good, string(buff)); + } + + EXPECT_EQ(0, service.send_recv(EVENT_EXIT)); + + service.close_service(); + + thread_service.join(); + + zmq_ctx_term(zctx); + printf("Service TEST completed\n"); +} + + +void +wait_for_heartbeat(stats_collector &stats_instance, long unsigned int cnt, + int wait_ms = 3000) +{ + int diff = 0; + + auto st = duration_cast(system_clock::now().time_since_epoch()).count(); + while (stats_instance.heartbeats_published() == cnt) { + auto en = duration_cast(system_clock::now().time_since_epoch()).count(); + diff = en - st; + if (diff > wait_ms) { + EXPECT_LE(diff, wait_ms); + EXPECT_EQ(cnt, stats_instance.heartbeats_published()); + break; + } + else { + stringstream ss; + ss << (en -st); + } + this_thread::sleep_for(chrono::milliseconds(300)); + } +} + +TEST(eventd, heartbeat) +{ + printf("heartbeat TEST started\n"); + + int rc; + long unsigned int cnt; + stats_collector stats_instance; + + if (!g_is_redis_available) { + set_unit_testing(true); + } + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + eventd_proxy *pxy = new eventd_proxy(zctx); + EXPECT_TRUE(NULL != pxy); + + /* Starting proxy */ + EXPECT_EQ(0, pxy->init()); + + rc = stats_instance.start(); + EXPECT_EQ(rc, 0); + + /* Wait for any non-zero heartbeat */ + wait_for_heartbeat(stats_instance, 0); + + /* Pause heartbeat */ + stats_instance.heartbeat_ctrl(true); + + /* Sleep to ensure the other thread noticed the pause request. */ + this_thread::sleep_for(chrono::milliseconds(200)); + + /* Get current count */ + cnt = stats_instance.heartbeats_published(); + + /* Wait for 3 seconds with no new neartbeat */ + this_thread::sleep_for(chrono::seconds(3)); + + EXPECT_EQ(stats_instance.heartbeats_published(), cnt); + + /* Set interval as 1 second */ + stats_instance.set_heartbeat_interval(1); + + /* Turn on heartbeat */ + stats_instance.heartbeat_ctrl(); + + /* Wait for heartbeat count to change from last count */ + wait_for_heartbeat(stats_instance, cnt, 2000); + + stats_instance.stop(); + + delete pxy; + + zmq_ctx_term(zctx); + + printf("heartbeat TEST completed\n"); +} + + +TEST(eventd, testDB) +{ + printf("DB TEST started\n"); + + /* consts used */ + const int pub_count = 7; + const int cache_max = 3; + + stats_collector stats_instance; + event_handle_t pub_handle; + event_serialized_lst_t evts_read; + last_events_t last_evts_read; + counters_t overflow; + string tag; + + if (!g_is_redis_available) { + printf("redis not available; Hence DB TEST skipped\n"); + return; + } + + EXPECT_LT(cache_max, pub_count); + DBConnector db("COUNTERS_DB", 0, true); + + + /* Not testing heartbeat; Hence set high val as 10 seconds */ + stats_instance.set_heartbeat_interval(10000); + + /* Start instance to capture published count & as well writes to DB */ + EXPECT_EQ(0, stats_instance.start()); + + void *zctx = zmq_ctx_new(); + EXPECT_TRUE(NULL != zctx); + + /* Run proxy to enable receive as capture test needs to receive */ + eventd_proxy *pxy = new eventd_proxy(zctx); + EXPECT_TRUE(NULL != pxy); + + /* Starting proxy */ + EXPECT_EQ(0, pxy->init()); + + /* Create capture service */ + capture_service *pcap = new capture_service(zctx, cache_max, &stats_instance); + + /* Initialize the capture */ + EXPECT_EQ(0, pcap->set_control(INIT_CAPTURE)); + + /* Kick off capture */ + EXPECT_EQ(0, pcap->set_control(START_CAPTURE)); + + pub_handle = events_init_publisher("test_db"); + + for(int i=0; i < pub_count; ++i) { + tag = string("test_db_tag_") + to_string(i); + event_publish(pub_handle, tag); + } + + /* Pause to ensure all publisghed events did reach capture service */ + this_thread::sleep_for(chrono::milliseconds(200)); + + EXPECT_EQ(0, pcap->set_control(STOP_CAPTURE)); + + /* Read the cache */ + EXPECT_EQ(0, pcap->read_cache(evts_read, last_evts_read, overflow)); + + /* + * Sent pub_count messages of different tags. + * Upon cache max, only event per sender/runtime-id is saved. Hence + * expected last_evts_read is one. + * expected overflow = pub_count - cache_max - 1 + */ + + EXPECT_EQ(cache_max, (int)evts_read.size()); + EXPECT_EQ(1, (int)last_evts_read.size()); + EXPECT_EQ((pub_count - cache_max - 1), overflow); + + EXPECT_EQ(pub_count, stats_instance.read_counter( + INDEX_COUNTERS_EVENTS_PUBLISHED)); + EXPECT_EQ((pub_count - cache_max - 1), stats_instance.read_counter( + INDEX_COUNTERS_EVENTS_MISSED_CACHE)); + + events_deinit_publisher(pub_handle); + + for (int i=0; i < COUNTERS_EVENTS_TOTAL; ++i) { + string key = string("COUNTERS_EVENTS:") + counter_keys[i]; + unordered_map m; + bool key_found = false, val_found=false, val_match=false; + + if (db.exists(key)) { + try { + m = db.hgetall(key); + unordered_map::const_iterator itc = + m.find(string(EVENTS_STATS_FIELD_NAME)); + if (itc != m.end()) { + int expect = (counter_keys[i] == string(COUNTERS_EVENTS_PUBLISHED) ? + pub_count : (pub_count - cache_max - 1)); + val_match = (expect == stoi(itc->second) ? true : false); + val_found = true; + } + } + catch (exception &e) + { + printf("Failed to get key=(%s) err=(%s)", key.c_str(), e.what()); + EXPECT_TRUE(false); + } + key_found = true; + } + + if (!val_match) { + printf("key=%s key_found=%d val_found=%d fields=%d", + key.c_str(), key_found, val_found, (int)m.size()); + + printf("hgetall BEGIN key=%s", key.c_str()); + for(unordered_map::const_iterator itc = m.begin(); + itc != m.end(); ++itc) { + printf("val[%s] = (%s)", itc->first.c_str(), itc->second.c_str()); + } + printf("hgetall END\n"); + EXPECT_TRUE(false); + } + } + + stats_instance.stop(); + + delete pxy; + delete pcap; + + zmq_ctx_term(zctx); + + printf("DB TEST completed\n"); +} + + +// TODO -- Add unit tests for stats diff --git a/src/sonic-eventd/tests/main.cpp b/src/sonic-eventd/tests/main.cpp new file mode 100644 index 000000000000..4b869e8c3004 --- /dev/null +++ b/src/sonic-eventd/tests/main.cpp @@ -0,0 +1,97 @@ +#include "gtest/gtest.h" +#include "dbconnector.h" +#include + +using namespace std; +using namespace swss; + +string existing_file = "./tests/redis_multi_db_ut_config/database_config.json"; +string nonexisting_file = "./tests/redis_multi_db_ut_config/database_config_nonexisting.json"; +string global_existing_file = "./tests/redis_multi_db_ut_config/database_global.json"; + +#define TEST_DB "APPL_DB" +#define TEST_NAMESPACE "asic0" +#define INVALID_NAMESPACE "invalid" + +bool g_is_redis_available = false; + +class SwsscommonEnvironment : public ::testing::Environment { +public: + // Override this to define how to set up the environment + void SetUp() override { + // by default , init should be false + cout<<"Default : isInit = "<:tag\n") + return sourceTag + +def getFVMFromParams(params): + param_dict = FieldValueMap() + for key, value in params.items(): + key = str(key) + value = str(value) + param_dict[key] = value + return param_dict + +def publishEvents(line, publisher_handle): + try: + json_dict = json.loads(line) + except Exception as ex: + logging.error("JSON string not able to be parsed\n") + return + if not json_dict or len(json_dict) != 1: + logging.error("JSON string not able to be parsed\n") + return + sourceTag = list(json_dict)[0] + params = list(json_dict.values())[0] + tag = getTag(sourceTag) + param_dict = getFVMFromParams(params) + if param_dict: + event_publish(publisher_handle, tag, param_dict) + +def publishEventsFromFile(publisher_handle, infile, count, pause): + try: + with open(infile, 'r') as f: + for line in f.readlines(): + line.rstrip() + publishEvents(line, publisher_handle) + time.sleep(pause) + except Exception as ex: + logging.error("Unable to open file from given path or has incorrect json format, gives exception {}\n".format(ex)) + logging.info("Switching to default bgp state publish events\n") + publishBGPEvents(publisher_handle, count, pause) + +def publishBGPEvents(publisher_handle, count, pause): + ip_addresses = [] + param_dict = FieldValueMap() + + for _ in range(count): + ip = str(ipaddress.IPv4Address(random.randint(0, 2 ** 32))) + ip_addresses.append(ip) + + # publish down events + for ip in ip_addresses: + param_dict["ip"] = ip + param_dict["status"] = "down" + event_publish(publisher_handle, "bgp-state", param_dict) + time.sleep(pause) + + # publish up events + for ip in ip_addresses: + param_dict["ip"] = ip + event_publish(publisher_handle, "bgp-state", param_dict) + time.sleep(pause) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-s", "--source", nargs='?', const='test-event-source', default='test-event-source', help="Source of event, default us test-event-source") + parser.add_argument("-f", "--file", nargs='?', const='', default='', help="File containing json event strings, must be in format \'{\":foo\": {\"aaa\": \"AAA\", \"bbb\": \"BBB\"}}\'") + parser.add_argument("-c", "--count", nargs='?', type=int, const=10, default=10, help="Count of default bgp events to be generated") + parser.add_argument("-p", "--pause", nargs='?', type=float, const=0.0, default=0.0, help="Pause time wanted between each event, default is 0") + args = parser.parse_args() + publisher_handle = events_init_publisher(args.source) + if args.file == '': + publishBGPEvents(publisher_handle, args.count, args.pause) + else: + publishEventsFromFile(publisher_handle, args.file, args.count, args.pause) + +if __name__ == "__main__": + main() diff --git a/src/sonic-eventd/tools/events_tool.cpp b/src/sonic-eventd/tools/events_tool.cpp new file mode 100644 index 000000000000..97b17c1d7566 --- /dev/null +++ b/src/sonic-eventd/tools/events_tool.cpp @@ -0,0 +1,328 @@ +#include +#include +#include "events.h" +#include "events_common.h" + +/* + * Sample i/p file contents for send + * + * {"src_0:key-0": {"foo": "bar", "hello": "world" }} + * {"src_0:key-1": {"foo": "barXX", "hello": "world" }} + * + * Repeat the above line to increase entries. + * Each line is parsed independently, so no "," expected at the end. + */ + +#define ASSERT(res, m, ...) \ + if (!(res)) {\ + int _e = errno; \ + printf("Failed here %s:%d errno:%d zerrno:%d ", __FUNCTION__, __LINE__, _e, zmq_errno()); \ + printf(m, ##__VA_ARGS__); \ + printf("\n"); \ + exit(-1); } + + +typedef enum { + OP_INIT=0, + OP_SEND=1, + OP_RECV=2, + OP_SEND_RECV=3 //SEND|RECV +} op_t; + + +#define PRINT_CHUNK_SZ 2 + +/* + * Usage: + */ + +const char *s_usage = "\ +-s - To Send\n\ +-r - To receive\n\ +Note:\n\ + when both -s & -r are given:\n\ + it uses main thread to publish and fork a dedicated thread to receive.\n\ + The rest of the parameters except -w is used for send\n\ +\n\ +-n - Count of messages to send/receive. When both given, it is used as count to send\n\ + Default: 1 \n\ + A value of 0 implies unlimited\n\ +\n\ +-p - Count of milliseconds to pause between sends or receives. In send-recv mode, it only affects send.\n\ + Default: 0 implying no pause\n\ +\n\ + -i - List of JSON messages to send in a file, with each event/message\n\ + declared in a single line. When n is more than size of list, the list\n\ + is rotated upon completion.\n\ + e.g. '[ \n\ + { \"sonic-bgp:bgp-state\": { \"ip\": \"10.101.01.10\", \"ts\": \"2022-10-11T01:02:30.45567\", \"state\": \"up\" }}\n\ + { \"abc-xxx:yyy-zz\": { \"foo\": \"bar\", \"hello\":\"world\", \"ts\": \"2022-10-11T01:02:30.45567\"}}\n\ + { \"some-mod:some-tag\": {}}\n\ + ]\n\ + Default: \n\ +\n\ +-c - Use offline cache in receive mode\n\ +-o - O/p file to write received events\n\ + Default: STDOUT\n"; + + +bool term_receive = false; + +template +string +t_map_to_str(const Map &m) +{ + stringstream _ss; + string sep; + + _ss << "{"; + for (const auto elem: m) { + _ss << sep << "{" << elem.first << "," << elem.second << "}"; + if (sep.empty()) { + sep = ", "; + } + } + _ss << "}"; + return _ss.str(); +} + +void +do_receive(const event_subscribe_sources_t filter, const string outfile, int cnt, int pause, bool use_cache) +{ + int index=0, total_missed = 0; + ostream* fp = &cout; + ofstream fout; + + if (!outfile.empty()) { + fout.open(outfile); + if (!fout.fail()) { + fp = &fout; + printf("outfile=%s set\n", outfile.c_str()); + } + } + event_handle_t h = events_init_subscriber(use_cache, 2000, filter.empty() ? NULL : &filter); + printf("Subscribed with use_cache=%d timeout=2000 filter %s\n", + use_cache, filter.empty() ? "empty" : "non-empty"); + ASSERT(h != NULL, "Failed to get subscriber handle"); + + while(!term_receive) { + event_receive_op_t evt; + map_str_str_t evtOp; + + int rc = event_receive(h, evt); + if (rc != 0) { + ASSERT(rc == EAGAIN, "Failed to receive rc=%d index=%d\n", + rc, index); + continue; + } + ASSERT(!evt.key.empty(), "received EMPTY key"); + ASSERT(evt.missed_cnt >= 0, "Missed count uninitialized"); + ASSERT(evt.publish_epoch_ms > 0, "publish_epoch_ms uninitialized"); + + total_missed += evt.missed_cnt; + + evtOp[evt.key] = t_map_to_str(evt.params); + (*fp) << t_map_to_str(evtOp) << "\n"; + fp->flush(); + + if ((++index % PRINT_CHUNK_SZ) == 0) { + printf("Received index %d\n", index); + } + + if (cnt > 0) { + if (--cnt <= 0) { + break; + } + } + } + + events_deinit_subscriber(h); + printf("Total received = %d missed = %dfile:%s\n", index, total_missed, + outfile.empty() ? "STDOUT" : outfile.c_str()); +} + + +int +do_send(const string infile, int cnt, int pause) +{ + typedef struct { + string tag; + event_params_t params; + } evt_t; + + typedef vector lst_t; + + lst_t lst; + string source; + event_handle_t h; + int index = 0; + + if (!infile.empty()) { + ifstream input(infile); + + /* Read infile into list of events, that are ready for send */ + for( string line; getline( input, line ); ) + { + evt_t evt; + string str_params; + + const auto &data = nlohmann::json::parse(line); + ASSERT(data.is_object(), "Parsed data is not object"); + ASSERT((int)data.size() == 1, "string parse size = %d", (int)data.size()); + + string key(data.begin().key()); + if (source.empty()) { + source = key.substr(0, key.find(":")); + } else { + ASSERT(source == key.substr(0, key.find(":")), "source:%s read=%s", + source.c_str(), key.substr(0, key.find(":")).c_str()); + } + evt.tag = key.substr(key.find(":")+1); + + const auto &val = data.begin().value(); + ASSERT(val.is_object(), "Parsed params is not object"); + ASSERT((int)val.size() >= 1, "Expect non empty params"); + + for(auto par_it = val.begin(); par_it != val.end(); par_it++) { + evt.params[string(par_it.key())] = string(par_it.value()); + } + lst.push_back(evt); + } + } + + if (lst.empty()) { + evt_t evt = { + "test-tag", + { + { "param1", "foo"}, + {"param2", "bar"} + } + }; + lst.push_back(evt); + } + + h = events_init_publisher(source); + ASSERT(h != NULL, "failed to init publisher"); + + /* cnt = 0 as i/p implies forever */ + + while(cnt >= 0) { + /* Keep resending the list until count is exhausted */ + for(lst_t::const_iterator itc = lst.begin(); (cnt >= 0) && (itc != lst.end()); ++itc) { + const evt_t &evt = *itc; + + if ((++index % PRINT_CHUNK_SZ) == 0) { + printf("Sending index %d\n", index); + } + + int rc = event_publish(h, evt.tag, evt.params.empty() ? NULL : &evt.params); + ASSERT(rc == 0, "Failed to publish index=%d rc=%d", index, rc); + + if ((cnt > 0) && (--cnt == 0)) { + /* set to termninate */ + cnt = -1; + } + else if (pause) { + /* Pause between two sends */ + this_thread::sleep_for(chrono::milliseconds(pause)); + } + } + } + + events_deinit_publisher(h); + printf("Sent %d events\n", index); + return 0; +} + +void usage() +{ + printf("%s", s_usage); + exit(-1); +} + +int main(int argc, char **argv) +{ + bool use_cache = false; + int op = OP_INIT; + int cnt=0, pause=0; + string json_str_msg, outfile("STDOUT"), infile; + event_subscribe_sources_t filter; + + for(;;) + { + switch(getopt(argc, argv, "srn:p:i:o:f:c")) // note the colon (:) to indicate that 'b' has a parameter and is not a switch + { + case 'c': + use_cache = true; + continue; + + case 's': + op |= OP_SEND; + continue; + + case 'r': + op |= OP_RECV; + continue; + + case 'n': + cnt = stoi(optarg); + continue; + + case 'p': + pause = stoi(optarg); + continue; + + case 'i': + infile = optarg; + continue; + + case 'o': + outfile = optarg; + continue; + + case 'f': + { + stringstream ss(optarg); //create string stream from the string + while(ss.good()) { + string substr; + getline(ss, substr, ','); + filter.push_back(substr); + } + } + continue; + + case -1: + break; + + case '?': + case 'h': + default : + usage(); + break; + + } + break; + } + + + printf("op=%d n=%d pause=%d i=%s o=%s\n", + op, cnt, pause, infile.c_str(), outfile.c_str()); + + if (op == OP_SEND_RECV) { + thread thr(&do_receive, filter, outfile, 0, 0, use_cache); + do_send(infile, cnt, pause); + } + else if (op == OP_SEND) { + do_send(infile, cnt, pause); + } + else if (op == OP_RECV) { + do_receive(filter, outfile, cnt, pause, use_cache); + } + else { + ASSERT(false, "Elect -s for send or -r receive or both; Bailing out with no action\n"); + } + + printf("--------- END: Good run -----------------\n"); + return 0; +} + diff --git a/src/sonic-eventd/tools/events_volume_test.py b/src/sonic-eventd/tools/events_volume_test.py new file mode 100644 index 000000000000..73143d483cd8 --- /dev/null +++ b/src/sonic-eventd/tools/events_volume_test.py @@ -0,0 +1,68 @@ +import sys +import subprocess +import time +import logging +import argparse + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(message)s", + handlers = [ + logging.FileHandler("debug.log"), + logging.StreamHandler(sys.stdout) + ] +) + +def read_events_from_file(file, count): + logging.info("Reading from file generated by events_tool") + lines = 0 + with open(file, 'r') as infile: + lines = infile.readlines() + logging.info("Should receive {} events and got {} events\n".format(count, len(lines))) + assert len(lines) == count + +def start_tool(file): + logging.info("Starting events_tool\n") + proc = subprocess.Popen(["./events_tool", "-r", "-o", file]) + return proc + +def run_test(process, file, count, duplicate): + # log messages to see if events have been received + tool_proc = start_tool(file) + + time.sleep(2) # buffer for events_tool to startup + logging.info("Generating logger messages\n") + for i in range(count): + line = "" + state = "up" + if duplicate: + line = "{} test message testmessage state up".format(process) + else: + if i % 2 != 1: + state = "down" + line = "{} test message testmessage{} state {}".format(process, i, state) + command = "logger -p local0.notice -t {}".format(line) + subprocess.run(command, shell=True, stdout=subprocess.PIPE) + + time.sleep(2) # some buffer for all events to be published to file + read_events_from_file(file, count) + tool_proc.terminate() + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-p", "--process", nargs='?', const ='', default='', help="Process that is spitting out log") + parser.add_argument("-f", "--file", nargs='?', const='', default='', help="File used by events_tool to read events from") + parser.add_argument("-c", "--count", type=int, nargs='?', const=1000, default=1000, help="Count of times log message needs to be published down/up, default is 1000") + args = parser.parse_args() + if(args.process == '' or args.file == ''): + logging.error("Invalid process or logfile\n") + return + logging.info("Starting volume test\n") + logging.info("Generating {} unique messages for rsyslog plugin\n".format(args.count)) + run_test(args.process, args.file, args.count, False) + time.sleep(2) + logging.info("Restarting volume test but for duplicate log messages\n") + run_test(args.process, args.file, args.count, True) + +if __name__ == "__main__": + main() diff --git a/src/sonic-eventd/tools/sample_ip.json b/src/sonic-eventd/tools/sample_ip.json new file mode 100644 index 000000000000..acb8726cf253 --- /dev/null +++ b/src/sonic-eventd/tools/sample_ip.json @@ -0,0 +1 @@ +{"src_0:key-0": {"foo": "bar", "hello": "world" }} diff --git a/src/sonic-eventd/tools/subdir.mk b/src/sonic-eventd/tools/subdir.mk new file mode 100644 index 000000000000..5f13043dd612 --- /dev/null +++ b/src/sonic-eventd/tools/subdir.mk @@ -0,0 +1,12 @@ +CC := g++ + +TOOL_OBJS = ./tools/events_tool.o + +C_DEPS += ./tools/events_tool.d + +tools/%.o: tools/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + $(CC) -D__FILENAME__="$(subst tools/,,$<)" $(CFLAGS) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' From 78eeeb76708538b431b1fd4efdd4cc37452bf70c Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Sun, 4 Sep 2022 15:53:07 +0800 Subject: [PATCH 743/817] [SN2201] remove extra empty lines in the pg_profile_lookup.ini (#11923) - Why I did it Remove extra empty lines in the SN2201 pg_profile_lookup.ini to make it aligned with other platforms. This extra empty line could confuse some test cases which need to parse this file. Signed-off-by: Kebo Liu --- .../x86_64-nvidia_sn2201-r0/ACS-SN2201/pg_profile_lookup.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/pg_profile_lookup.ini b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/pg_profile_lookup.ini index 53652080e967..18d2bf5ef8c5 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/ACS-SN2201/pg_profile_lookup.ini @@ -14,7 +14,6 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## - # PG lossless profiles. # speed cable size xon xoff threshold 100 5m 49152 19456 29696 0 From 4e18510fc9f3b485628c8ce4f294fddbd9470689 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Sun, 4 Sep 2022 10:54:16 +0300 Subject: [PATCH 744/817] [submodule]] Advance sonic-utilities pointer (#11897) Update sonic-utilities submodule pointer to include the following: Replace cmp in acl_loader with operator.eq (#2328) Subinterface vrf bind issue fix (#2211) [VRF]Adding CLI checks to ensure Vrf is valid in interface bind and static route commands (#2333) [doc]: Add MACsec CLI doc (#2334) [sonic-package-manager] Drop 'expires_in' (#2002) Handle non-front-panel ports in is_rj45_port (#2327) [service_mgmt]: Fix fetch MULTI_INST_DEPENDENT bug in service_mgmt.sh.j2 (#2319) correct an error by changing "show bgp summary" to "show bfd summary" (#2324) Update VRF unbind command (#2331) Fix issue: port_type is referenced before initialized (#2323) Fix issue: exception in is_rj45_port in multi ASIC env (#2313) Delete .DS_Store (#2244) Fix bug with checking VRF's routes in route_check.py (#2301) [decode-syseeprom] Fix setting use_db based on support_eeprom_db (#2270) Fix vrf UT failed issue (#2309) add lacp_rate to portchannel (#2036) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 28b6ba5fc11f..3af8ba4acc2b 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 28b6ba5fc11f65abaf421c70159a605d233eda41 +Subproject commit 3af8ba4acc2bbc77d17be0d67943703021c7d1e1 From 1b5d07f665e705eb0ec9fd1af70dfa0dd9545b11 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Sun, 4 Sep 2022 11:03:36 +0300 Subject: [PATCH 745/817] [submodule] Advance sonic-platform-daemons pointer (#11882) - Why I did it Update sonic-platform-daemons submodule pointer to include the following: [ycabled] enable telemetry for 'active-active'; fix gRPC portid ordering (#284) [ycabled] remove some spurious logs (#282) Correct the peer forwarding state table (#281) add psu input voltage and current (#276) [ycabled] add capability to enable/disable telemetry (#279) Signed-off-by: dprital --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index cc563670a5e8..7c0a326e1dcd 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit cc563670a5e8a10a51057a4e1455a1e36b386653 +Subproject commit 7c0a326e1dcd2be74a80f6d3a2d7c4af084c2035 From a8b2a538a56d9d0a19ddcccb2cbff7f5915058f7 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Tue, 6 Sep 2022 19:26:54 +0300 Subject: [PATCH 746/817] [docker-wait-any] immediately start to wait (#11595) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It could happen that a container has already crashed but docker-wait-any will wait forever till it starts. It should, however, immediately exit to make the serivce restart. #### Why I did it It is observed in some circumstances that the auto-restart mechanism does not work. Specifically for ```swss.service```, ```orchagent``` had crashed before ```docker-wait-any``` started in ```swss.sh```. This led ```docker-wait-any``` wait forever for ```swss``` to be in ```"Running"``` state and it results in: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1abef1ecebff bcbca2b74df6 "/usr/local/bin/supe…" 22 hours ago Up 22 hours what-just-happened 3c924d405cd5 docker-lldp:latest "/usr/bin/docker-lld…" 22 hours ago Up 22 hours lldp eb2b12a98c13 docker-router-advertiser:latest "/usr/bin/docker-ini…" 22 hours ago Up 22 hours radv d6aac4a46974 docker-sonic-mgmt-framework:latest "/usr/local/bin/supe…" 22 hours ago Up 22 hours mgmt-framework d880fd07aab9 docker-platform-monitor:latest "/usr/bin/docker_ini…" 22 hours ago Up 22 hours pmon 75f9e22d4fdd docker-snmp:latest "/usr/local/bin/supe…" 22 hours ago Up 22 hours snmp 76d570a4bd1c docker-sonic-telemetry:latest "/usr/local/bin/supe…" 22 hours ago Up 22 hours telemetry ee49f50344b3 docker-syncd-mlnx:latest "/usr/local/bin/supe…" 22 hours ago Up 22 hours syncd 1f0b0bab3687 docker-teamd:latest "/usr/local/bin/supe…" 22 hours ago Up 22 hours teamd 917aeeaf9722 docker-orchagent:latest "/usr/bin/docker-ini…" 22 hours ago Exited (0) 22 hours ago swss 81a4d3e820e8 docker-fpm-frr:latest "/usr/bin/docker_ini…" 22 hours ago Up 22 hours bgp f6eee8be282c docker-database:latest "/usr/local/bin/dock…" 22 hours ago Up 22 hours database ``` The check for ```"Running"``` state is not needed because for cold boot case we do ```start_peer_and_dependent_services``` and for warm boot case the loop will retry to wait for container if this container is doing warm boot: https://github.com/stepanblyschak/sonic-buildimage/blob/d01a91a569c9d545b30e8f81994b02d0c2513971/files/image_config/misc/docker-wait-any#L56 #### How I did it Removed the check for ```"Running"```. #### How to verify it Kill swss before ```docker-wait-any``` is reached and verify auto restart will restart swss serivce. --- files/image_config/misc/docker-wait-any | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/files/image_config/misc/docker-wait-any b/files/image_config/misc/docker-wait-any index 4200bb43c87f..3a00a2c610d1 100755 --- a/files/image_config/misc/docker-wait-any +++ b/files/image_config/misc/docker-wait-any @@ -46,10 +46,9 @@ g_dep_services = [] def wait_for_container(docker_client, container_name): - while True: - while docker_client.inspect_container(container_name)['State']['Status'] != "running": - time.sleep(1) + log.log_info("Waiting on container '{}'".format(container_name)) + while True: docker_client.wait(container_name) log.log_info("No longer waiting on container '{}'".format(container_name)) From 31e750ee0b9b67fa49f6f2e73f4c18383ce2558a Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:13:05 -0700 Subject: [PATCH 747/817] Fix PR build failure (#11973) Some PR builds fails to find this file. Remove it temporarily until we root cause it --- dockers/docker-fpm-frr/Dockerfile.j2 | 6 +++--- files/build_templates/sonic_debian_extension.j2 | 4 ++-- rules/docker-eventd.mk | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index fd7ad0f08ed4..25e191bc338f 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -56,14 +56,14 @@ COPY ["TS", "/usr/bin/TS"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["zsocket.sh", "/usr/bin/"] COPY ["*.json", "/etc/rsyslog.d/"] -COPY ["files/rsyslog_plugin.conf.j2", "/etc/rsyslog.d/"] +# COPY ["files/rsyslog_plugin.conf.j2", "/etc/rsyslog.d/"] RUN chmod a+x /usr/bin/TSA && \ chmod a+x /usr/bin/TSB && \ chmod a+x /usr/bin/TSC && \ chmod a+x /usr/bin/zsocket.sh -RUN j2 -f json /etc/rsyslog.d/rsyslog_plugin.conf.j2 /etc/rsyslog.d/events_info.json > /etc/rsyslog.d/bgp_events.conf -RUN rm -f /etc/rsyslog.d/rsyslog_plugin.conf.j2* +# RUN j2 -f json /etc/rsyslog.d/rsyslog_plugin.conf.j2 /etc/rsyslog.d/events_info.json > /etc/rsyslog.d/bgp_events.conf +# RUN rm -f /etc/rsyslog.d/rsyslog_plugin.conf.j2* RUN rm -f /etc/rsyslog.d/events_info.json* ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 56b8290cc12e..43946c10a692 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -800,8 +800,8 @@ sudo bash -c "echo { > $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_name sudo bash -c "echo } >> $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/ctr_image_names.json" # copy rsyslog plugin binary for use by all dockers that use plugin to publish events. -sudo mkdir -p ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS} -sudo cp ${files_path}/rsyslog_plugin ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS}/ +# sudo mkdir -p ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS} +# sudo cp ${files_path}/rsyslog_plugin ${FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS}/ {% for script in installer_start_scripts.split(' ') -%} if [ -f $TARGET_MACHINE"_{{script}}" ]; then diff --git a/rules/docker-eventd.mk b/rules/docker-eventd.mk index c69fee09e569..ec333bf66048 100644 --- a/rules/docker-eventd.mk +++ b/rules/docker-eventd.mk @@ -43,5 +43,6 @@ $(DOCKER_EVENTD)_PLUGIN = rsyslog_plugin $($(DOCKER_EVENTD)_PLUGIN)_PATH = $($(DOCKER_EVENTD)_FILESPATH) SONIC_COPY_FILES += $($(DOCKER_EVENTD)_PLUGIN) -$(DOCKER_EVENTD)_SHARED_FILES = $($(DOCKER_EVENTD)_PLUGIN) +# Some builds fails to find this file. Remove until we root cause it. +# $(DOCKER_EVENTD)_SHARED_FILES = $($(DOCKER_EVENTD)_PLUGIN) From 5efd6f9748d6e87c5a279bb760442cf259eecd97 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 7 Sep 2022 08:16:23 +0800 Subject: [PATCH 748/817] [macsec]: Add MACsec clear CLI support (#11731) Why I did it To support clear MACsec counters by sonic-clear macsec How I did it Add macsec sub-command in sonic-clear to cache the current macsec stats, and in the show macsec command to check the cache and return the diff with cache file. How to verify it admin@vlab-02:~$ show macsec Ethernet0 MACsec port(Ethernet0) --------------------- ----------- cipher_suite GCM-AES-128 enable true enable_encrypt true enable_protect true enable_replay_protect false replay_window 0 send_sci true --------------------- ----------- MACsec Egress SC (52540067daa70001) ----------- - encoding_an 0 ----------- - MACsec Egress SA (0) ------------------------------------- -------------------------------- auth_key 9DDD4C69220A1FA9B6763F229B75CB6F next_pn 1 sak BA86574D054FCF48B9CD7CF54F21304A salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 52 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED 0 ------------------------------------- -------------------------------- MACsec Ingress SC (525400d4fd3f0001) MACsec Ingress SA (0) --------------------------------------- -------------------------------- active true auth_key 9DDD4C69220A1FA9B6763F229B75CB6F lowest_acceptable_pn 1 sak BA86574D054FCF48B9CD7CF54F21304A salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 56 SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED 0 SAI_MACSEC_SA_STAT_IN_PKTS_INVALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_LATE 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_OK 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA 0 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 --------------------------------------- -------------------------------- admin@vlab-02:~$ sonic-clear macsec Clear MACsec counters admin@vlab-02:~$ show macsec Ethernet0 MACsec port(Ethernet0) --------------------- ----------- cipher_suite GCM-AES-128 enable true enable_encrypt true enable_protect true enable_replay_protect false replay_window 0 send_sci true --------------------- ----------- MACsec Egress SC (52540067daa70001) ----------- - encoding_an 0 ----------- - MACsec Egress SA (0) ------------------------------------- -------------------------------- auth_key 9DDD4C69220A1FA9B6763F229B75CB6F next_pn 1 sak BA86574D054FCF48B9CD7CF54F21304A salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 52 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED 0 ------------------------------------- -------------------------------- MACsec Ingress SC (525400d4fd3f0001) MACsec Ingress SA (0) --------------------------------------- -------------------------------- active true auth_key 9DDD4C69220A1FA9B6763F229B75CB6F lowest_acceptable_pn 1 sak BA86574D054FCF48B9CD7CF54F21304A salt 000000000000000000000000 ssci 0 SAI_MACSEC_SA_ATTR_CURRENT_XPN 0 <---this counters was cleared. SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED 0 SAI_MACSEC_SA_STAT_IN_PKTS_INVALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_LATE 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA 0 SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID 0 SAI_MACSEC_SA_STAT_IN_PKTS_OK 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED 0 SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA 0 SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED 0 SAI_MACSEC_SA_STAT_OCTETS_PROTECTED 0 --------------------------------------- -------------------------------- Signed-off-by: Ze Gan Co-authored-by: Judy Joseph --- .../cli/clear/plugins/clear_macsec_counter.py | 36 ++++++++++ .../cli/show/plugins/show_macsec.py | 72 +++++++++++++++---- rules/docker-macsec.mk | 1 + 3 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 dockers/docker-macsec/cli/clear/plugins/clear_macsec_counter.py diff --git a/dockers/docker-macsec/cli/clear/plugins/clear_macsec_counter.py b/dockers/docker-macsec/cli/clear/plugins/clear_macsec_counter.py new file mode 100644 index 000000000000..b47a576f9ed2 --- /dev/null +++ b/dockers/docker-macsec/cli/clear/plugins/clear_macsec_counter.py @@ -0,0 +1,36 @@ +import os +import click + +import show.plugins.macsec as show_macsec +import utilities_common.cli as clicommon +from sonic_py_common import multi_asic + +@click.group(cls=clicommon.AliasedGroup) +def macsec(): + pass + + +@macsec.command('macsec') +@click.option('--clean-cache', type=bool, required=False, default=False, help="If the option of clean cache is true, next show commands will show the raw counters which based on the service booted instead of the last clear command.") +def macsec_clear_counters(clean_cache): + """ + Clear MACsec counts. + This clear command will generated a cache for next show commands which will base on this cache as the zero baseline to show the increment of counters. + """ + + if clean_cache: + for namespace in multi_asic.get_namespace_list(): + if os.path.isfile(show_macsec.CACHE_FILE.format(namespace)): + os.remove(show_macsec.CACHE_FILE.format(namespace)) + print("Cleaned cache") + return + + clicommon.run_command("show macsec --dump-file") + print("Clear MACsec counters") + +def register(cli): + cli.add_command(macsec_clear_counters) + + +if __name__ == '__main__': + macsec_clear_counters(None) diff --git a/dockers/docker-macsec/cli/show/plugins/show_macsec.py b/dockers/docker-macsec/cli/show/plugins/show_macsec.py index 3f1058df3572..9789b32bac6b 100644 --- a/dockers/docker-macsec/cli/show/plugins/show_macsec.py +++ b/dockers/docker-macsec/cli/show/plugins/show_macsec.py @@ -1,12 +1,19 @@ import typing from natsort import natsorted +import datetime +import pickle +import os +import copy import click from tabulate import tabulate import utilities_common.multi_asic as multi_asic_util from swsscommon.swsscommon import CounterTable, MacsecCounter +from utilities_common.cli import UserCache +CACHE_MANAGER = UserCache(app_name="macsec") +CACHE_FILE = os.path.join(CACHE_MANAGER.get_directory(), "macsecstats{}") DB_CONNECTOR = None COUNTER_TABLE = None @@ -15,12 +22,12 @@ class MACsecAppMeta(object): def __init__(self, *args) -> None: SEPARATOR = DB_CONNECTOR.get_db_separator(DB_CONNECTOR.APPL_DB) - key = self.__class__.get_appl_table_name() + SEPARATOR + \ + self.key = self.__class__.get_appl_table_name() + SEPARATOR + \ SEPARATOR.join(args) self.meta = DB_CONNECTOR.get_all( - DB_CONNECTOR.APPL_DB, key) + DB_CONNECTOR.APPL_DB, self.key) if len(self.meta) == 0: - raise ValueError("No such MACsecAppMeta: {}".format(key)) + raise ValueError("No such MACsecAppMeta: {}".format(self.key)) for k, v in self.meta.items(): setattr(self, k, v) @@ -39,10 +46,15 @@ def __init__(self, port_name: str, sci: str, an: str) -> None: MACsecAppMeta.__init__(self, port_name, sci, an) MACsecCounters.__init__(self, port_name, sci, an) - def dump_str(self) -> str: + def dump_str(self, cache = None) -> str: buffer = self.get_header() meta = sorted(self.meta.items(), key=lambda x: x[0]) - counters = sorted(self.counters.items(), key=lambda x: x[0]) + counters = copy.deepcopy(self.counters) + if cache: + for k, v in counters.items(): + if k in cache.counters: + counters[k] = int(counters[k]) - int(cache.counters[k]) + counters = sorted(counters.items(), key=lambda x: x[0]) buffer += tabulate(meta + counters) buffer = "\n".join(["\t\t" + line for line in buffer.splitlines()]) return buffer @@ -87,7 +99,7 @@ def __init__(self, port_name: str, sci: str) -> None: def get_appl_table_name(cls) -> str: return "MACSEC_INGRESS_SC_TABLE" - def dump_str(self) -> str: + def dump_str(self, cache = None) -> str: buffer = self.get_header() buffer = "\n".join(["\t" + line for line in buffer.splitlines()]) return buffer @@ -104,7 +116,7 @@ def __init__(self, port_name: str, sci: str) -> None: def get_appl_table_name(cls) -> str: return "MACSEC_EGRESS_SC_TABLE" - def dump_str(self) -> str: + def dump_str(self, cache = None) -> str: buffer = self.get_header() buffer += tabulate(sorted(self.meta.items(), key=lambda x: x[0])) buffer = "\n".join(["\t" + line for line in buffer.splitlines()]) @@ -123,7 +135,7 @@ def __init__(self, port_name: str) -> None: def get_appl_table_name(cls) -> str: return "MACSEC_PORT_TABLE" - def dump_str(self) -> str: + def dump_str(self, cache = None) -> str: buffer = self.get_header() buffer += tabulate(sorted(self.meta.items(), key=lambda x: x[0])) return buffer @@ -149,6 +161,7 @@ def create_macsec_obj(key: str) -> MACsecAppMeta: except ValueError as e: return None + def create_macsec_objs(interface_name: str) -> typing.List[MACsecAppMeta]: objs = [] objs.append(create_macsec_obj(MACsecPort.get_appl_table_name() + ":" + interface_name)) @@ -179,12 +192,25 @@ def create_macsec_objs(interface_name: str) -> typing.List[MACsecAppMeta]: return objs +def cache_find(cache: dict, target: MACsecAppMeta) -> MACsecAppMeta: + if not cache or not cache["objs"]: + return None + for obj in cache["objs"]: + if type(obj) == type(target) and obj.key == target.key: + # MACsec SA may be refreshed by a cycle that use the same key + # So, use the SA as the identifier + if isinstance(obj, MACsecSA) and obj.sak != target.sak: + continue + return obj + return None + + @click.command() @click.argument('interface_name', required=False) +@click.option('--dump-file', is_flag=True, required=False, default=False) @multi_asic_util.multi_asic_click_options -def macsec(interface_name, namespace, display): - MacsecContext(namespace, display).show(interface_name) - +def macsec(interface_name, dump_file, namespace, display): + MacsecContext(namespace, display).show(interface_name, dump_file) class MacsecContext(object): @@ -194,7 +220,7 @@ def __init__(self, namespace_option, display_option): display_option, namespace_option) @multi_asic_util.run_on_multi_asic - def show(self, interface_name): + def show(self, interface_name, dump_file): global DB_CONNECTOR global COUNTER_TABLE DB_CONNECTOR = self.db @@ -205,13 +231,29 @@ def show(self, interface_name): if interface_name not in interface_names: return interface_names = [interface_name] - objs = [] + for interface_name in natsorted(interface_names): objs += create_macsec_objs(interface_name) - for obj in objs: - print(obj.dump_str()) + cache = {} + if os.path.isfile(CACHE_FILE.format(self.multi_asic.current_namespace)): + cache = pickle.load(open(CACHE_FILE.format(self.multi_asic.current_namespace), "rb")) + + if not dump_file: + if cache and cache["time"] and objs: + print("Last cached time was {}".format(cache["time"])) + for obj in objs: + cache_obj = cache_find(cache, obj) + print(obj.dump_str(cache_obj)) + else: + dump_obj = { + "time": datetime.datetime.now(), + "objs": objs + } + with open(CACHE_FILE.format(self.multi_asic.current_namespace), 'wb') as dump_file: + pickle.dump(dump_obj, dump_file) + dump_file.flush() def register(cli): cli.add_command(macsec) diff --git a/rules/docker-macsec.mk b/rules/docker-macsec.mk index 3a6e9a558577..5db5ea5a41d9 100644 --- a/rules/docker-macsec.mk +++ b/rules/docker-macsec.mk @@ -44,5 +44,6 @@ $(DOCKER_MACSEC)_RUN_OPT += -v /host/warmboot:/var/warmboot $(DOCKER_MACSEC)_CLI_CONFIG_PLUGIN = /cli/config/plugins/macsec.py $(DOCKER_MACSEC)_CLI_SHOW_PLUGIN = /cli/show/plugins/show_macsec.py +$(DOCKER_MACSEC)_CLI_CLEAR_PLUGIN = /cli/clear/plugins/clear_macsec_counter.py $(DOCKER_MACSEC)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) From 3b9bbf7d2827cbb489e20b1af28ab48a75b46572 Mon Sep 17 00:00:00 2001 From: Muhammad Danish <88161975+mdanish-kh@users.noreply.github.com> Date: Wed, 7 Sep 2022 09:25:44 +0500 Subject: [PATCH 749/817] [doc]: Update README.md (#11960) * Remove faulty pipeline URLs * Miscellaneous minor fixes --- README.md | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 92684138845d..1f78c9f56d60 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ [![Mellanox](https://dev.azure.com/mssonic/build/_apis/build/status/mellanox/Azure.sonic-buildimage.official.mellanox?branchName=master&label=Mellanox)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=master) [![Marvell(armhf)](https://dev.azure.com/mssonic/build/_apis/build/status/marvell/Azure.sonic-buildimage.official.marvell-armhf?branchName=master&label=Marvell-armhf)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=master) [![Nephos](https://dev.azure.com/mssonic/build/_apis/build/status/nephos/Azure.sonic-buildimage.official.nephos?branchName=master&label=Nephos)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=149&branchName=master) -[![P4](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon?subject=P4)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all) [![VS](https://dev.azure.com/mssonic/build/_apis/build/status/vs/Azure.sonic-buildimage.official.vs?branchName=master&label=VS)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=master) *202205 builds*: @@ -70,25 +69,13 @@ [![Nephos](https://dev.azure.com/mssonic/build/_apis/build/status/nephos/Azure.sonic-buildimage.official.nephos?branchName=201811&label=Nephos)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=149&branchName=201811) [![VS](https://dev.azure.com/mssonic/build/_apis/build/status/vs/Azure.sonic-buildimage.official.vs?branchName=201811&label=VS)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=201811) -*201807 builds*: - -[![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201807/badge/icon?subject=Broadcom)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201807/) -[![Barefoot](https://sonic-jenkins.westus2.cloudapp.azure.com/job/barefoot/job/buildimage-bf-201807/badge/icon?subject=Barefoot)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/barefoot/job/buildimage-bf-201807/) - -*201803 builds*: - -[![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201803/badge/icon?subject=Broadcom)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201803/) -[![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-201803/badge/icon?subject=Nephos)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-201803/) -[![Marvell](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-201803/badge/icon?subject=Marvell)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-201803/) -[![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201803/badge/icon?subject=Mellanox)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201803/) - # sonic-buildimage ## Build SONiC Switch Images # Description -Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatible network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [list](https://github.com/sonic-net/SONiC/wiki/Supported-Devices-and-Platforms) +Following are the instructions on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatible network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC images are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [list](https://github.com/sonic-net/SONiC/wiki/Supported-Devices-and-Platforms) # Hardware @@ -156,12 +143,14 @@ To build SONiC installer image and docker images, run the following commands: - PLATFORM=vs ## Usage for ARM Architecture -To build Arm32 bit for (ARMHF) platform - ARM build has dependency in docker version 18, - if docker version is 19, downgrade to 18 as below - sudo apt-get install --allow-downgrades -y docker-ce=5:18.09.0~3-0~ubuntu-xenial - sudo apt-get install --allow-downgrades -y docker-ce-cli=5:18.09.0~3-0~ubuntu-xenial +ARM build has dependency in docker version 18. If docker version is 19, downgrade to 18 with: +``` +sudo apt-get install --allow-downgrades -y docker-ce=5:18.09.0~3-0~ubuntu-xenial +sudo apt-get install --allow-downgrades -y docker-ce-cli=5:18.09.0~3-0~ubuntu-xenial +``` +To build Arm32 bit for (ARMHF) platform + # Execute make configure once to configure ASIC and ARCH make configure PLATFORM=[ASIC_VENDOR] PLATFORM_ARCH=armhf @@ -174,7 +163,7 @@ To build Arm32 bit for (ARMHF) platform make target/sonic-marvell-armhf.bin -To build Arm32 bit for (ARMHF) Marvell platform on amd64 host for debian buster using cross-compilation run the following commands: +To build Arm32 bit for (ARMHF) Marvell platform on amd64 host for debian buster using cross-compilation, run the following commands: # Execute make configure once to configure ASIC and ARCH for cross-compilation build @@ -239,7 +228,7 @@ Every target has a clean target, so in order to clean swss, execute: It is recommended to use clean targets to clean all packages that are built together, like dev packages for instance. In order to be more familiar with build process and make some changes to it, it is recommended to read this short [Documentation](README.buildsystem.md). ## Build debug dockers and debug SONiC installer image: -SONiC build system supports building dockers and ONIE-image with debug tools and debug symbols, to help with live & core debugging. For details refer to [(SONiC Buildimage Guide)](https://github.com/sonic-net/sonic-buildimage/blob/master/README.buildsystem.md). +SONiC build system supports building dockers and ONIE-image with debug tools and debug symbols, to help with live & core debugging. For details refer to [SONiC Buildimage Guide](https://github.com/sonic-net/sonic-buildimage/blob/master/README.buildsystem.md). ## SAI Version Please refer to [SONiC roadmap](https://github.com/sonic-net/SONiC/wiki/Sonic-Roadmap-Planning) on the SAI version for each SONiC release. From 38cc35f6da630b068048af02bf141e85d444dee8 Mon Sep 17 00:00:00 2001 From: UmaMaven <106967235+UmaMaven@users.noreply.github.com> Date: Wed, 7 Sep 2022 10:25:59 +0530 Subject: [PATCH 750/817] support for static-route yang model (#11932) *[Yang] support for static-route yang model #11932 --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 9 + .../yang_model_tests/tests/static_route.json | 57 + .../tests_config/static-route.json | 1028 +++++++++++++++++ .../yang-models/sonic-static-route.yang | 124 ++ 5 files changed, 1220 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/static_route.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/static-route.json create mode 100644 src/sonic-yang-models/yang-models/sonic-static-route.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 975b84b68245..961017fc7ca0 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -158,6 +158,7 @@ def run(self): './yang-models/sonic-pfc-priority-queue-map.yang', './yang-models/sonic-pfc-priority-priority-group-map.yang', './yang-models/sonic-port-qos-map.yang', + './yang-models/sonic-static-route.yang', './yang-models/sonic-macsec.yang']), ('cvlyang-models', ['./cvlyang-models/sonic-acl.yang', './cvlyang-models/sonic-bgp-common.yang', @@ -214,6 +215,7 @@ def run(self): './cvlyang-models/sonic-pfc-priority-queue-map.yang', './cvlyang-models/sonic-pfc-priority-priority-group-map.yang', './cvlyang-models/sonic-port-qos-map.yang', + './cvlyang-models/sonic-static-route.yang', './cvlyang-models/sonic-macsec.yang']), ], zip_safe=False, diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index b833fab06ddd..ddf83de7f0a1 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1997,6 +1997,15 @@ "console_mgmt": { "enabled": "yes" } + }, + "STATIC_ROUTE": { + "default|20.20.20.0/24": { + "blackhole": "false", + "distance": "1", + "ifname": "Ethernet14", + "nexthop": "10.184.229.212", + "nexthop-vrf": "default" + } } }, "SAMPLE_CONFIG_DB_UNKNOWN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/static_route.json b/src/sonic-yang-models/tests/yang_model_tests/tests/static_route.json new file mode 100644 index 000000000000..a41a94a7fc9c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/static_route.json @@ -0,0 +1,57 @@ +{ + "STATIC_ROUTE_TEST": { + "desc": "Configure basic static route with default VRFs with PREFIX" + }, + "STATIC_ROUTE_TEST_WITH_INTERFACE": { + "desc": "Configure with nexthop as interface instead of IP address" + }, + "STATIC_ROUTE_TEST_WITH_BLACKHOLE": { + "desc": "Configure with nexthop as blackhole" + }, + "STATIC_ROUTE_TEST_WITH_VRF": { + "desc": "Configure with routes in non default VRF" + }, + "STATIC_ROUTE_TEST_WITH_KEY_VRF_MGMT": { + "desc": "Configure with routes in mgmt VRF as key" + }, + "STATIC_ROUTE_TEST_WITH_VRF_MGMT": { + "desc": "Configure with routes with mgmt VRF as next hop" + }, + "STATIC_ROUTE_TEST_WITH_VRF_LEAK": { + "desc": "Configure with route leak across VRFS" + }, + "STATIC_ROUTE_TEST_ECMP": { + "desc": "Configure comma separated values for ECMP, with nexthop as PREFIX" + }, + "STATIC_ROUTE_TEST_ECMP_WITH_INTERFACE": { + "desc": "Configure comma separated values with nexthop as INTERFACE" + }, + "STATIC_ROUTE_TEST_ECMP_WITH_MGMT": { + "desc": "Configure comma separated values with one nexthop as mgmt" + }, + "STATIC_ROUTE_TEST_DISTANCE_INVALID": { + "desc": "Configure with invalid distance number", + "eStrKey": "Pattern" + }, + "STATIC_ROUTE_TEST_BLACKHOLE_INVALID": { + "desc": "Configure with invalid value for blackhole", + "eStrKey": "Pattern" + }, + "STATIC_ROUTE_TEST_NEXTHOP_VRF_INVALID": { + "desc": "Configure with invalid value for VRF", + "eStrKey": "Pattern" + }, + "STATIC_ROUTE_TEST_ECMP_DISTANCE_INVALID": { + "desc": "Configure with invalid distance for ECMP", + "eStrKey": "Pattern" + }, + "STATIC_ROUTE_TEST_ECMP_BLACKHOLE_INVALID": { + "desc": "Configure with invalid blackhop for ECMP", + "eStrKey": "Pattern" + }, + "STATIC_ROUTE_TEST_ECMP_NEXTHOP_VRF_INVALID": { + "desc": "Configure with invalid vrf for ECMP", + "eStrKey": "Pattern" + } + +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/static-route.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/static-route.json new file mode 100644 index 000000000000..3afdc2e8d25c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/static-route.json @@ -0,0 +1,1028 @@ +{ + "STATIC_ROUTE_TEST": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "10.0.0.1/24", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "vrf_name": "default", + "prefix":"100.100.100.1/24", + "nexthop":"10.10.10.1", + "distance": "1", + "nexthop-vrf":"default", + "blackhole":"false" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_INTERFACE": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "10.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "vrf_name": "default", + "prefix":"100.100.100.1/24", + "nexthop":"0.0.0.0", + "ifname":"Ethernet8", + "distance": "1", + "nexthop-vrf":"default", + "blackhole":"false" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_BLACKHOLE": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "10.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "150.150.150.0/24", + "vrf_name": "default", + "ifname": "Ethernet8", + "distance": "1", + "nexthop-vrf": "default", + "blackhole": "true" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_VRF": { + "sonic-vrf:sonic-vrf": { + "VRF": { + "VRF_LIST": [ + { + "name": "VrfMav", + "fallback": true + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "75.75.75.0/24", + "vrf_name": "VrfMav", + "nexthop": "1.1.1.2", + "ifname": "Ethernet8", + "distance": "1", + "nexthop-vrf": "VrfMav", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_KEY_VRF_MGMT": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "75.75.75.0/24", + "vrf_name": "mgmt", + "nexthop": "1.1.1.2", + "ifname": "Ethernet8", + "distance": "1", + "nexthop-vrf": "mgmt", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_VRF_MGMT": { + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "75.75.75.0/24", + "vrf_name": "VrfMav", + "nexthop": "1.1.1.2", + "ifname": "Ethernet8", + "distance": "1", + "nexthop-vrf": "mgmt", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_WITH_VRF_LEAK": { + "sonic-vrf:sonic-vrf": { + "VRF": { + "VRF_LIST": [ + { + "name": "VrfAbc", + "fallback": true + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "85.85.85.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.2", + "ifname": "Ethernet8", + "distance": "1", + "nexthop-vrf": "VrfAbc", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "15.15.15.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.2,2.0.0.2", + "distance": "1,1", + "nexthop-vrf": "default,default", + "blackhole": "false,false" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP_WITH_MGMT": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "15.15.15.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.2,2.0.0.2", + "distance": "1,1", + "nexthop-vrf": "default,mgmt", + "blackhole": "false,false" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP_WITH_INTERFACE": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "0.0.0.0,0.0.0.0", + "ifname": "Ethernet0,Ethernet8", + "distance": "1,1", + "nexthop-vrf": "default,default", + "blackhole": "false,false" + }] + } + } + }, + "STATIC_ROUTE_TEST_DISTANCE_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.4", + "distance": "300", + "nexthop-vrf": "default", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_BLACKHOLE_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.5", + "distance": "1", + "nexthop-vrf": "default", + "blackhole": "down" + }] + } + } + }, + "STATIC_ROUTE_TEST_NEXTHOP_VRF_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.05", + "distance": "1", + "nexthop-vrf": "vrf123", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_NEXTHOP_VRF_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.05", + "distance": "1", + "nexthop-vrf": "vrf123", + "blackhole": "false" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP_DISTANCE_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.3,2.0.0.8", + "distance": "1000,1", + "nexthop-vrf": "default,default", + "blackhole": "false,false" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP_BLACKHOLE_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.4,2.0.0.3", + "distance": "1,1", + "nexthop-vrf": "default,default", + "blackhole": "no,no" + }] + } + } + }, + "STATIC_ROUTE_TEST_ECMP_NEXTHOP_VRF_INVALID": { + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth0", + "description": "Ethernet0", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet0", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "1.0.0.1/30", + "name": "Ethernet0", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet0" + } + ] + } + }, + "sonic-port:sonic-port": { + "sonic-port:PORT": { + "PORT_LIST": [ + { + "admin_status": "up", + "alias": "eth8", + "description": "Ethernet8", + "fec": "rs", + "lanes": "65", + "mtu": 9000, + "name": "Ethernet8", + "speed": 25000 + } + ] + } + }, + "sonic-interface:sonic-interface": { + "sonic-interface:INTERFACE": { + "INTERFACE_IPPREFIX_LIST": [ + { + "family": "IPv4", + "ip-prefix": "2.0.0.1/30", + "name": "Ethernet8", + "scope": "global" + } + ], + "INTERFACE_LIST": [ + { + "name": "Ethernet8" + } + ] + } + }, + "sonic-static-route:sonic-static-route": { + "sonic-static-route:STATIC_ROUTE": { + "STATIC_ROUTE_LIST": [{ + "prefix": "16.16.16.0/24", + "vrf_name": "default", + "nexthop": "1.0.0.4,2.0.0.3", + "distance": "1,1", + "nexthop-vrf": "vrf123,xyz", + "blackhole": "false,false" + }] + } + } + } + +} + + diff --git a/src/sonic-yang-models/yang-models/sonic-static-route.yang b/src/sonic-yang-models/yang-models/sonic-static-route.yang new file mode 100644 index 000000000000..48a562f242d9 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-static-route.yang @@ -0,0 +1,124 @@ +module sonic-static-route { + yang-version 1.1; + namespace "http://github.com/Azure/sonic-static-route"; + prefix sroute; + + import sonic-vrf { + prefix vrf; + } + import ietf-inet-types { + prefix inet; + } + import sonic-types { + prefix stypes; + } + + organization + "SONiC"; + contact + "SONiC"; + description + "STATIC ROUTE yang Module for SONiC OS"; + + revision 2022-03-17 { + description + "First Revision"; + } + + container sonic-static-route { + container STATIC_ROUTE { + description + "STATIC_ROUTE part of config_db.json"; + list STATIC_ROUTE_TEMPLATE_LIST { + key "prefix"; + leaf prefix { + type inet:ip-prefix; + description + "prefix is the destination IP address, as key"; + } + leaf nexthop { + type string; + description + "The next-hop that is to be used for the + static route as IP address. When interface needs to be + specified, use 0.0.0.0 as leaf value"; + } + leaf ifname { + type string; + description + "When interface is specified, forwarding happens through it"; + } + leaf advertise { + type string { + pattern "((true|false),)*(true|false)"; + } + default "false"; + } + } + list STATIC_ROUTE_LIST { + key "vrf_name prefix"; + leaf vrf_name { + type union { + type string { + pattern 'default'; + } + type string { + pattern 'mgmt'; + } + type string { + pattern "Vrf[a-zA-Z0-9_-]+"; + } + } + description + "Virtual Routing Instance name as key"; + } + leaf prefix { + type inet:ip-prefix; + description + "prefix is the destination IP address, as key"; + } + leaf nexthop { + type string; + description + "The next-hop that is to be used for the + static route as IP address. When interface needs to be + specified, use 0.0.0.0 as leaf value"; + } + leaf ifname { + type string; + description + "When interface is specified, forwarding happens through it"; + } + leaf distance { + type string { + pattern "((25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?),)*(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)"; + } + default "0"; + description + "Administrative Distance (preference) of the entry. The + preference defines the order of selection when multiple + sources (protocols, static, etc.) contribute to the same + prefix entry. The lower the preference, the more preferable the + prefix is. When this value is not specified, the preference is + inherited from the default preference of the implementation for + static routes."; + } + leaf nexthop-vrf { + type string { + pattern "(((Vrf[a-zA-Z0-9_-]+)|(default)|(mgmt)),)*((Vrf[a-zA-Z0-9_-]+)|(default)|(mgmt))"; + } + description + "VRF name of the nexthop. This is for vrf leaking"; + } + leaf blackhole { + type string { + pattern "((true|false),)*(true|false)"; + } + default "false"; + description + "blackhole refers to a route that, if matched, discards the message silently."; + } + } /* end of list STATIC_ROUTE_LIST */ + } /* end of container STATIC_ROUTE */ + } /* end of container sonic-static_route */ +} From 98d6357ae70d903c04e1ef883887a5e15d7be348 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Thu, 8 Sep 2022 17:23:29 +0800 Subject: [PATCH 751/817] [actions] Remove approve step in label action. (#12015) Why I did it Approve step needs special permission settings. We already added permission setting to enable bypass merging PR. So, approve step is not necessary. --- .github/workflows/label.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index ec04157110ae..5f8c0279b7e1 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -22,15 +22,6 @@ jobs: label: runs-on: ubuntu-latest steps: - - name: approve - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: | - set -e - echo ${{ secrets.GITHUB_TOKEN }} | gh auth login --with-token - url=$(echo $GITHUB_CONTEXT | jq -r '.event.pull_request._links.html.href') - echo PR: $url - gh pr review $url --approve - uses: actions/labeler@main with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From 016f6718572542327f941a884a87245ab5d94725 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 8 Sep 2022 23:45:06 +0800 Subject: [PATCH 752/817] [docker-macsec]: Add dependencies of MACsec (#11770) Why I did it If the SWSS services was restarted, the MACsec service should also be restarted. Otherwise the data in wpa_supplicant and orchagent will not be consistent. How I did it Add dependency in docker-macsec.mk. How to verify it Manually check by 'sudo service swss restart'. The MACsec container should be started after swss, the syslog will look like Sep 8 14:36:29.562953 sonic INFO swss.sh[9661]: Starting existing swss container with HWSKU Force10-S6000 Sep 8 14:36:30.024399 sonic DEBUG container: container_start: BEGIN ... Sep 8 14:36:33.391706 sonic INFO systemd[1]: Starting macsec container... Sep 8 14:36:33.392925 sonic INFO systemd[1]: Starting Management Framework container... Signed-off-by: Ze Gan --- files/scripts/swss.sh | 16 +++++++++++++++- rules/docker-macsec.mk | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 3ab4242c902f..3841f77cc30b 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -30,7 +30,7 @@ function read_dependent_services() fi if [[ -f ${ETC_SONIC_PATH}/${SERVICE}_multi_inst_dependent ]]; then - MULTI_INST_DEPENDENT="${MULTI_INST_DEPENDENT} cat ${ETC_SONIC_PATH}/${SERVICE}_multi_inst_dependent" + MULTI_INST_DEPENDENT="${MULTI_INST_DEPENDENT} $(cat ${ETC_SONIC_PATH}/${SERVICE}_multi_inst_dependent)" fi } @@ -308,6 +308,19 @@ function check_peer_gbsyncd() fi } +function check_macsec() +{ + MACSEC_STATE=`show feature status | grep macsec | awk '{print $2}'` + + if [[ ${MACSEC_STATE} == 'enabled' ]]; then + if [ "$DEV" ]; then + DEPENDENT="${DEPENDENT} macsec@${DEV}" + else + DEPENDENT="${DEPENDENT} macsec" + fi + fi +} + if [ "$DEV" ]; then NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace SONIC_DB_CLI="sonic-db-cli -n $NET_NS" @@ -319,6 +332,7 @@ else fi check_peer_gbsyncd +check_macsec read_dependent_services case "$1" in diff --git a/rules/docker-macsec.mk b/rules/docker-macsec.mk index 5db5ea5a41d9..d4cce3ecfcb7 100644 --- a/rules/docker-macsec.mk +++ b/rules/docker-macsec.mk @@ -42,6 +42,9 @@ $(DOCKER_MACSEC)_RUN_OPT += --privileged -t $(DOCKER_MACSEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_MACSEC)_RUN_OPT += -v /host/warmboot:/var/warmboot +$(DOCKER_MACSEC)_SERVICE_REQUIRES = updategraph +$(DOCKER_MACSEC)_SERVICE_AFTER = swss syncd + $(DOCKER_MACSEC)_CLI_CONFIG_PLUGIN = /cli/config/plugins/macsec.py $(DOCKER_MACSEC)_CLI_SHOW_PLUGIN = /cli/show/plugins/show_macsec.py $(DOCKER_MACSEC)_CLI_CLEAR_PLUGIN = /cli/clear/plugins/clear_macsec_counter.py From dc9eaa53fb1e3a10c733c4ad381379f963cd773a Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 9 Sep 2022 00:18:26 +0800 Subject: [PATCH 753/817] Map TC6 to Queue 1 for regular traffic (#11904) Why I did it This PR is to update TC_TO_QUEUE_MAP|AZURE for SKU Arista-7050CX3-32S-D48C8 and Arista-7260CX3 T0. The change is only to align the TC_TO_QUEUE_MAP for regular traffic and bounced traffic. It has no impact on business because we have no traffic being mapped to TC2 or TC6. How I did it Update TC_TO_QUEUE_MAP|AZURE , and test cases as well. How to verify it Verified by running test case test_j2files.py /sonic/src/sonic-config-engine$ python3 setup.py test -s tests/test_j2files.py running test ...... ---------------------------------------------------------------------- Ran 29 tests in 25.390s OK --- .../Arista-7050CX3-32S-D48C8/qos.json.j2 | 2 +- device/common/profiles/th2/7260/BALANCED/qos.json.j2 | 2 +- device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 | 2 +- .../tests/sample_output/py3/qos-arista7050cx3-dualtor.json | 2 +- .../tests/sample_output/py3/qos-arista7260-dualtor.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 index 6719911b29e5..040da33dd79f 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/qos.json.j2 @@ -170,7 +170,7 @@ "3": "3", "4": "4", "5": "5", - "6": "6", + "6": "1", "7": "7", "8": "1" }, diff --git a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 index 68daa8ee92f0..750d0fb0ea77 100644 --- a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 +++ b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 @@ -322,7 +322,7 @@ "3": "3", "4": "4", "5": "5", - "6": "6", + "6": "1", "7": "7", "8": "1" }, diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 index faf682d3c176..771b8305f8f0 100644 --- a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 @@ -321,7 +321,7 @@ "3": "3", "4": "4", "5": "5", - "6": "6", + "6": "1", "7": "7", "8": "1" }, diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json index 8e1d376f19db..00bf9a9a438c 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7050cx3-dualtor.json @@ -19,7 +19,7 @@ "3": "3", "4": "4", "5": "5", - "6": "6", + "6": "1", "7": "7", "8": "1" }, diff --git a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json index cdb6e8fe842e..4d16791f9287 100644 --- a/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json +++ b/src/sonic-config-engine/tests/sample_output/py3/qos-arista7260-dualtor.json @@ -19,7 +19,7 @@ "3": "3", "4": "4", "5": "5", - "6": "6", + "6": "1", "7": "7", "8": "1" }, From 19155df148fbb49eecd2ce4a3b8f022a66beab76 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Fri, 9 Sep 2022 00:33:01 +0800 Subject: [PATCH 754/817] Fix dbus-run-session command not found issue when install dbus-python (#12009) --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 6594630cc20f..7585b7f6f6e3 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -72,7 +72,8 @@ RUN apt-get install -y net-tools \ {%- if ENABLE_ASAN == "y" %} libasan5 \ {%- endif %} - libsystemd0 + libsystemd0 \ + dbus # Install redis-server {% if CONFIGURED_ARCH == "armhf" %} From 549bb3d4833425bcc2e8f0666ec0a13a995d54be Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 9 Sep 2022 00:16:11 +0200 Subject: [PATCH 755/817] [services] Update "WantedBy=" section for tacacs-config.timer. (#11893) The timer execution may fail if triggered during a config reload (when the sonic.target is stopped). This might happen in a rare situation if config reload is executed after reboot in a small time slot (for 0 to 30 seconds) before the tacacs-config timer is triggered. To ensure that timer execution will be resumed after a config reload the WantedBy section of the systemd service is updated to describe relation to sonic.target. Signed-off-by: Oleksandr Ivantsiv Signed-off-by: Oleksandr Ivantsiv --- files/build_templates/tacacs-config.timer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/build_templates/tacacs-config.timer b/files/build_templates/tacacs-config.timer index 28314e06f4cb..f8380cbab12d 100644 --- a/files/build_templates/tacacs-config.timer +++ b/files/build_templates/tacacs-config.timer @@ -9,4 +9,4 @@ OnBootSec=5min 30 sec Unit=tacacs-config.service [Install] -WantedBy=timers.target updategraph.service +WantedBy=timers.target sonic.target sonic-delayed.target From acc17db0c804c899dc7fb1dc4c28f14f81f320c1 Mon Sep 17 00:00:00 2001 From: ShiyanWangMS Date: Fri, 9 Sep 2022 22:18:13 +0800 Subject: [PATCH 756/817] Revert PR#11831 (#12035) "Upgrade docker-sonic-mgmt base image from Ubuntu18.04 to 20.04" --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 1275a21c5af2..42aaa3525a64 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -1,5 +1,5 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} -FROM {{ prefix }}ubuntu:20.04 +FROM {{ prefix }}ubuntu:18.04 ENV DEBIAN_FRONTEND=noninteractive @@ -21,6 +21,8 @@ RUN apt-get update && apt-get install -y build-essential \ psmisc \ python \ python-dev \ + python-scapy \ + python-pip \ python3-pip \ python3-venv \ rsyslog \ @@ -29,16 +31,10 @@ RUN apt-get update && apt-get install -y build-essential \ sudo \ tcpdump \ telnet \ - vim \ - python-is-python2 \ - software-properties-common - -RUN add-apt-repository -y universe -RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py \ - && python2 get-pip.py + vim RUN pip install setuptools==44.1.1 -RUN pip install cffi==1.12.0 \ +RUN pip install cffi==1.10.0 \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ "future>=0.16.0" \ @@ -100,7 +96,7 @@ RUN pip install cffi==1.12.0 \ && rm -f 1.0.0.tar.gz \ && pip install nnpy \ && pip install dpkt \ - && pip install scapy==2.4.5 --upgrade --ignore-installed + && pip install scapy==2.4.5 --upgrade # Install docker-ce-cli RUN apt-get update \ @@ -131,7 +127,7 @@ debs/{{ deb }}{{' '}} {%- endfor -%} debs/ -RUN dpkg --force-all -i \ +RUN dpkg -i \ {% for deb in docker_sonic_mgmt_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} @@ -197,7 +193,8 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 PYTHONIOENCODING=UTF-8 -RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 wheel==0.33.6 +RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 + RUN python3 -m pip install setuptools-rust \ aiohttp \ defusedxml \ @@ -240,6 +237,7 @@ RUN python3 -m pip install setuptools-rust \ tabulate \ textfsm==1.1.2 \ virtualenv \ + wheel==0.33.6 \ pysubnettree \ nnpy \ dpkt \ From a2262394397e37f18d402dd6a45a645b35e70528 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 9 Sep 2022 08:41:41 -0700 Subject: [PATCH 757/817] [zebra] ignore route from default table (#12018) Signed-off-by: Ying Xie Signed-off-by: Ying Xie --- ...0009-ignore-route-from-default-table.patch | 30 +++++++++++++++++++ src/sonic-frr/patch/series | 1 + 2 files changed, 31 insertions(+) create mode 100644 src/sonic-frr/patch/0009-ignore-route-from-default-table.patch diff --git a/src/sonic-frr/patch/0009-ignore-route-from-default-table.patch b/src/sonic-frr/patch/0009-ignore-route-from-default-table.patch new file mode 100644 index 000000000000..ec41da74dad8 --- /dev/null +++ b/src/sonic-frr/patch/0009-ignore-route-from-default-table.patch @@ -0,0 +1,30 @@ +From bb3b003840959adf5b5be52e91bc798007c9857a Mon Sep 17 00:00:00 2001 +From: Ying Xie +Date: Thu, 8 Sep 2022 04:20:36 +0000 +Subject: [PATCH] From 776a29e8ab32c1364ee601a8730aabb773b0c86b Mon Sep 17 + 00:00:00 2001 Subject: [PATCH] ignore route from default table + +Signed-off-by: Ying Xie +--- + zebra/zebra_fpm_netlink.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c +index 34be9fb39..d6c875a7e 100644 +--- a/zebra/zebra_fpm_netlink.c ++++ b/zebra/zebra_fpm_netlink.c +@@ -283,6 +283,11 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd, + rib_table_info(rib_dest_table(dest)); + struct zebra_vrf *zvrf = table_info->zvrf; + ++ if (table_info->table_id == RT_TABLE_DEFAULT) { ++ zfpm_debug("%s: Discard default table route", __func__); ++ return 0; ++ } ++ + memset(ri, 0, sizeof(*ri)); + + ri->prefix = rib_dest_prefix(dest); +-- +2.17.1 + diff --git a/src/sonic-frr/patch/series b/src/sonic-frr/patch/series index 3e8438bf6dd5..a474b918a8cc 100644 --- a/src/sonic-frr/patch/series +++ b/src/sonic-frr/patch/series @@ -8,3 +8,4 @@ 0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch Disable-ipv6-src-address-test-in-pceplib.patch cross-compile-changes.patch +0009-ignore-route-from-default-table.patch From 714b1807b6e528836c4af2e24d389d72518c0d7e Mon Sep 17 00:00:00 2001 From: anamehra <54692434+anamehra@users.noreply.github.com> Date: Fri, 9 Sep 2022 12:54:05 -0700 Subject: [PATCH 758/817] Fix radv.conf traceback when VLAN_INTERFACE is not defined (#12034) *Fix the if block scope to prevent traceback due to undefined vlan_list when VLAN_INTERFACE is not defined. --- dockers/docker-router-advertiser/radvd.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-router-advertiser/radvd.conf.j2 b/dockers/docker-router-advertiser/radvd.conf.j2 index 3880ef960760..ded5c7e59694 100644 --- a/dockers/docker-router-advertiser/radvd.conf.j2 +++ b/dockers/docker-router-advertiser/radvd.conf.j2 @@ -23,7 +23,6 @@ {% set _ = vlan_list.update({name: prefix_list}) %} {% endif %} {% endfor %} -{% endif %} {% for name, prefixes in vlan_list.items() %} interface {{ name }} { @@ -47,3 +46,4 @@ interface {{ name }} }; {% endfor %} +{% endif %} From 966fe0d2108e63e745d35060a50c3b9b6da83bef Mon Sep 17 00:00:00 2001 From: Zain Budhwani <99770260+zbud-msft@users.noreply.github.com> Date: Fri, 9 Sep 2022 14:23:45 -0700 Subject: [PATCH 759/817] Update gnmi submodule (#11988) * Update gnmi submodule * Update gnmi pointer again --- src/sonic-gnmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-gnmi b/src/sonic-gnmi index 92428dac99b2..14f91214fe2b 160000 --- a/src/sonic-gnmi +++ b/src/sonic-gnmi @@ -1 +1 @@ -Subproject commit 92428dac99b2d6d97b4c904cb83933cbc8f7e848 +Subproject commit 14f91214fe2b4ba7575bffff58989dbf7df71c48 From 0a8dd3f4f8357f2d470073917fa70cf491dc914b Mon Sep 17 00:00:00 2001 From: FuzailBrcm <51665572+FuzailBrcm@users.noreply.github.com> Date: Sat, 10 Sep 2022 03:03:12 +0530 Subject: [PATCH 760/817] Adding support for get/set low power mode for QSFPs in PDDF common APIs (#11786) * Adding support for get/set low pwer mode for QSFPs in PDDF common APIs * Adding support for get/set low pwer mode for QSFPs in PDDF common APIs - Review comments --- .../sonic_platform_pddf_base/pddf_sfp.py | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py index 66fe58543f51..be286bd9eaee 100644 --- a/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py +++ b/platform/pddf/platform-api-pddf-base/sonic_platform_pddf_base/pddf_sfp.py @@ -10,6 +10,8 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +QSFP_PWR_CTRL_ADDR = 93 + class PddfSfp(SfpOptoeBase): """ @@ -194,8 +196,18 @@ def get_lpmode(self): else: lpmode = False else: - # Use common SfpOptoeBase implementation for get_lpmode - lpmode = super().get_lpmode() + xcvr_id = self._xcvr_api_factory._get_id() + if xcvr_id is not None: + if xcvr_id == 0x18 or xcvr_id == 0x19 or xcvr_id == 0x1e: + # QSFP-DD or OSFP + # Use common SfpOptoeBase implementation for get_lpmode + lpmode = super().get_lpmode() + elif xcvr_id == 0x11 or xcvr_id == 0x0d or xcvr_id == 0x0c: + # QSFP28, QSFP+, QSFP + power_set = self.get_power_set() + power_override = self.get_power_override() + # By default the lpmode pin is pulled high as mentioned in the sff community + return power_set if power_override else True return lpmode @@ -321,8 +333,18 @@ def set_lpmode(self, lpmode): except IOError as e: status = False else: - # Use common SfpOptoeBase implementation for set_lpmode - status = super().set_lpmode(lpmode) + xcvr_id = self._xcvr_api_factory._get_id() + if xcvr_id is not None: + if xcvr_id == 0x18 or xcvr_id == 0x19 or xcvr_id == 0x1e: + # QSFP-DD or OSFP + # Use common SfpOptoeBase implementation for set_lpmode + status = super().set_lpmode(lpmode) + elif xcvr_id == 0x11 or xcvr_id == 0x0d or xcvr_id == 0x0c: + # QSFP28, QSFP+, QSFP + if lpmode is True: + self.set_power_override(True, True) + else: + self.set_power_override(True, False) return status From c53972b34864865a854e75df4ec6bc78ebb1c6cf Mon Sep 17 00:00:00 2001 From: Hasan Naqvi <56742004+hasan-brcm@users.noreply.github.com> Date: Fri, 9 Sep 2022 17:05:48 -0700 Subject: [PATCH 761/817] Update submodule to FRR 8.2.2 (#11502) *The sonic-frr was upgraded to FRR 8.2.2 as part of PR #10691. However, sonic-frr/frr submodule was still referring to previous 7.5 version. Update the sonic-frr/frr submodule to 8.2.2 commit id. Fixes issue #11484. --- src/sonic-frr/frr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-frr/frr b/src/sonic-frr/frr index c69608a68083..79188bf710e9 160000 --- a/src/sonic-frr/frr +++ b/src/sonic-frr/frr @@ -1 +1 @@ -Subproject commit c69608a68083d1017257977bd0260bebdb12322f +Subproject commit 79188bf710e92acf42fb5b9b0a2e9593a5ee9b05 From a8076e303bebc7907b54f8f0e612424ce67df9dc Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Mon, 12 Sep 2022 20:31:29 +0800 Subject: [PATCH 762/817] Upgrade the sonic-fips packages to 0.3 (#12040) Why I did it Upgrade the sonic-fips packages to release 0.3 Fix the package timestamp not correct issue --- rules/sonic-fips.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/sonic-fips.mk b/rules/sonic-fips.mk index a63e00de3fa5..e5b6e4ad3547 100644 --- a/rules/sonic-fips.mk +++ b/rules/sonic-fips.mk @@ -1,6 +1,6 @@ # fips packages -FIPS_VERSION = 0.2 +FIPS_VERSION = 0.3 FIPS_OPENSSL_VERSION = 1.1.1n-0+deb11u3+fips FIPS_OPENSSH_VERSION = 8.4p1-5+deb11u1+fips FIPS_PYTHON_MAIN_VERSION = 3.9 From b34d94be1f22e94759775d72286769e2feae0f76 Mon Sep 17 00:00:00 2001 From: jcaiMR <111116206+jcaiMR@users.noreply.github.com> Date: Tue, 13 Sep 2022 10:07:17 +0800 Subject: [PATCH 763/817] yang model table DEVICE_NEIGHBOR_METADATA creation (#11894) * yang mode support for neighbor metadata * add description in leaf node * modify description --- src/sonic-config-engine/minigraph.py | 40 +++++-- .../tests/test_minigraph_case.py | 39 +++---- .../tests/test_multinpu_cfggen.py | 12 +- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 20 ++++ .../tests/device_neighbor_metadata.json | 15 +++ .../device_neighbor_metadata.json | 107 ++++++++++++++++++ .../sonic-device_neighbor_metadata.yang | 100 ++++++++++++++++ 8 files changed, 301 insertions(+), 34 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json create mode 100644 src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 9518678bb5b7..85d9a91030ca 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -260,14 +260,24 @@ def parse_png(png, hname, dpg_ecmp_content = None): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, d_subtype) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku} - if cluster: + device_data = {} + if hwsku != None: + device_data['hwsku'] = hwsku + if cluster != None: device_data['cluster'] = cluster - if deployment_id: + if deployment_id != None: device_data['deployment_id'] = deployment_id - if lo_prefix_v6: + if lo_prefix != None: + device_data['lo_addr'] = lo_prefix + if lo_prefix_v6 != None: device_data['lo_addr_v6'] = lo_prefix_v6 - if d_subtype: + if mgmt_prefix != None: + device_data['mgmt_addr'] = mgmt_prefix + if mgmt_prefix_v6 != None: + device_data['mgmt_addr_v6'] = mgmt_prefix_v6 + if d_type != None: + device_data['type'] = d_type + if d_subtype != None: device_data['subtype'] = d_subtype devices[name] = device_data @@ -393,13 +403,23 @@ def parse_asic_png(png, asic_name, hostname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, lo_prefix_v6, mgmt_prefix, mgmt_prefix_v6, name, hwsku, d_type, deployment_id, cluster, _) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } - if cluster: + device_data = {} + if hwsku != None: + device_data['hwsku'] = hwsku + if cluster != None: device_data['cluster'] = cluster - if deployment_id: + if deployment_id != None: device_data['deployment_id'] = deployment_id - if lo_prefix_v6: - device_data['lo_addr_v6']= lo_prefix_v6 + if lo_prefix != None: + device_data['lo_addr'] = lo_prefix + if lo_prefix_v6 != None: + device_data['lo_addr_v6'] = lo_prefix_v6 + if mgmt_prefix != None: + device_data['mgmt_addr'] = mgmt_prefix + if mgmt_prefix_v6 != None: + device_data['mgmt_addr_v6'] = mgmt_prefix_v6 + if d_type != None: + device_data['type'] = d_type devices[name] = device_data return (neighbors, devices, port_speeds) diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 2aa78944163b..9ee8a49db6ae 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -203,39 +203,40 @@ def test_minigraph_neighbor_metadata(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR_METADATA"' expected_table = { - 'switch-01t1': { - 'lo_addr': '10.1.0.186/32', - 'mgmt_addr': '10.7.0.196/26', - 'hwsku': 'Force10-S6000', - 'type': 'LeafRouter', - 'deployment_id': '2' - }, 'switch2-t0': { - 'hwsku': 'Force10-S6000', 'lo_addr': '25.1.1.10/32', 'mgmt_addr': '10.7.0.196/26', + 'hwsku': 'Force10-S6000', 'type': 'ToRRouter' }, - 'server1': { + 'server2': { + 'lo_addr_v6': 'fe80::0002/128', + 'lo_addr': '10.10.10.2/32', + 'mgmt_addr': '10.0.0.2/32', 'hwsku': 'server-sku', - 'lo_addr': '10.10.10.1/32', - 'lo_addr_v6': 'fe80::0001/80', - 'mgmt_addr': '10.0.0.1/32', 'type': 'Server' }, - 'server2': { + 'server1': { + 'lo_addr_v6': 'fe80::0001/80', + 'lo_addr': '10.10.10.1/32', + 'mgmt_addr': '10.0.0.1/32', 'hwsku': 'server-sku', - 'lo_addr': '10.10.10.2/32', - 'lo_addr_v6': 'fe80::0002/128', - 'mgmt_addr': '10.0.0.2/32', 'type': 'Server' }, + 'switch-01t1': { + 'lo_addr': '10.1.0.186/32', + 'deployment_id': '2', + 'hwsku': 'Force10-S6000', + 'type': 'LeafRouter', + 'mgmt_addr': '10.7.0.196/26' + }, 'server1-SC': { - 'hwsku': 'smartcable-sku', - 'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', - 'type': 'SmartCable' + 'hwsku': 'smartcable-sku', + 'lo_addr': '0.0.0.0/0', + 'type': 'SmartCable', + 'mgmt_addr_v6': '::/0', } } output = self.run_script(argument) diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index a34b0b6cfd78..2bfb879a1ad2 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -250,10 +250,11 @@ def test_frontend_asic_device_neigh(self): def test_frontend_asic_device_neigh_metadata(self): argument = "-m {} -p {} -n asic0 --var-json \"DEVICE_NEIGHBOR_METADATA\"".format(self.sample_graph, self.port_config[0]) output = json.loads(self.run_script(argument)) + print(output) self.assertDictEqual(output, \ - {'01T2': {'lo_addr': None, 'mgmt_addr': '89.139.132.40', 'hwsku': 'VM', 'type': 'SpineRouter'}, - 'ASIC3': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}, - 'ASIC2': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}}) + {'01T2': {'mgmt_addr': '89.139.132.40', 'hwsku': 'VM', 'type': 'SpineRouter'}, + 'ASIC3': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}, + 'ASIC2': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}}) def test_backend_asic_device_neigh(self): argument = "-m {} -p {} -n asic3 --var-json \"DEVICE_NEIGHBOR\"".format(self.sample_graph, self.port_config[3]) @@ -267,9 +268,10 @@ def test_backend_asic_device_neigh(self): def test_backend_device_neigh_metadata(self): argument = "-m {} -p {} -n asic3 --var-json \"DEVICE_NEIGHBOR_METADATA\"".format(self.sample_graph, self.port_config[3]) output = json.loads(self.run_script(argument)) + print(output) self.assertDictEqual(output, \ - {'ASIC1': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}, - 'ASIC0': {'lo_addr': '0.0.0.0/0', 'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'type': 'Asic'}}) + {'ASIC1': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}, + 'ASIC0': {'lo_addr_v6': '::/0', 'mgmt_addr': '0.0.0.0/0', 'hwsku': 'multi-npu-asic', 'lo_addr': '0.0.0.0/0', 'type': 'Asic', 'mgmt_addr_v6': '::/0'}}) def test_frontend_bgp_neighbor(self): argument = "-m {} -p {} -n asic0 --var-json \"BGP_NEIGHBOR\"".format(self.sample_graph, self.port_config[0]) diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 961017fc7ca0..aee9d4650c7a 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -103,6 +103,7 @@ def run(self): './yang-models/sonic-default-lossless-buffer-parameter.yang', './yang-models/sonic-device_metadata.yang', './yang-models/sonic-device_neighbor.yang', + './yang-models/sonic-device_neighbor_metadata.yang', './yang-models/sonic-dhcpv6-relay.yang', './yang-models/sonic-extension.yang', './yang-models/sonic-flex_counter.yang', @@ -173,6 +174,7 @@ def run(self): './cvlyang-models/sonic-crm.yang', './cvlyang-models/sonic-device_metadata.yang', './cvlyang-models/sonic-device_neighbor.yang', + './cvlyang-models/sonic-device_neighbor_metadata.yang', './cvlyang-models/sonic-extension.yang', './cvlyang-models/sonic-flex_counter.yang', './cvlyang-models/sonic-feature.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index ddf83de7f0a1..6c1f47d80f51 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -391,6 +391,26 @@ "port": "Eth18" } }, + "DEVICE_NEIGHBOR_METADATA": { + "dccsw01.nw": { + "lo_addr": "0.0.0.0/0", + "mgmt_addr": "10.184.228.211/32", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + "dccsw02.nw": { + "mgmt_addr_v6": "2a04:5555:40:a709::2/128", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + "dccsw03.nw": { + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + } + }, "MGMT_PORT": { "eth0": { "alias": "eth0", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json new file mode 100644 index 000000000000..2943a53d1b91 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/device_neighbor_metadata.json @@ -0,0 +1,15 @@ +{ + "DEVICE_NEIGHBOR_METADATA_TABLE": { + "desc": "DEVICE_NEIGHBOR_METADATA_TABLE config pattern." + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN pattern failure.", + "eStrKey" : "Pattern" + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_CORRECT_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA correct value for Type field" + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { + "desc": "DEVICE_NEIGHBOR_METADATA value as not-provisioned for Type field" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json new file mode 100644 index 000000000000..ecc0c35d2208 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/device_neighbor_metadata.json @@ -0,0 +1,107 @@ +{ + "DEVICE_NEIGHBOR_METADATA_TYPE_INCORRECT_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "ToRrouter" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_CORRECT_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "BackEndToRRouter" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TYPE_NOT_PROVISIONED_PATTERN": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "name": "Ethernet116", + "hwsku": "Arista", + "type": "not-provisioned" + } + ] + } + } + }, + "DEVICE_NEIGHBOR_METADATA_TABLE": { + "sonic-device_neighbor_metadata:sonic-device_neighbor_metadata": { + "sonic-device_neighbor_metadata:DEVICE_NEIGHBOR_METADATA": { + "DEVICE_NEIGHBOR_METADATA_LIST": [ + { + "lo_addr": "25.77.193.11/32", + "mgmt_addr": "0.0.0.0/0", + "name": "dccsw01.nw", + "hwsku": "Arista", + "type": "ToRRouter", + "deployment_id": "1" + }, + { + "lo_addr": "0.0.0.0/0", + "mgmt_addr": "10.11.150.46/26", + "name": "dccsw02.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr_v6": "2a04:5555:40:a709::2/126", + "mgmt_addr": "10.11.150.47/26", + "name": "dccsw03.nw", + "hwsku": "Arista", + "type": "SpineRouter", + "deployment_id": "1" + }, + { + "name": "dccsw04.nw", + "mgmt_addr_v6": "2a04:5555:40:a708::2/126", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "name": "dccsw05.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr_v6": "2a04:5555:40:a710::2/126", + "name": "dccsw06.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "lo_addr": "25.77.193.11/32", + "name": "dccsw07.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + }, + { + "mgmt_addr": "10.11.150.48/26", + "name": "dccsw08.nw", + "hwsku": "Arista", + "type": "LeafRouter", + "deployment_id": "1" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang new file mode 100644 index 000000000000..76526f801c92 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-device_neighbor_metadata.yang @@ -0,0 +1,100 @@ +module sonic-device_neighbor_metadata { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-device_neighbor_metadata"; + prefix device_neighbor_metadata; + + import ietf-yang-types { + prefix yang; + } + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + } + + description "DEVICE_NEIGHBOR_METADATA YANG Module for SONiC OS"; + + revision 2022-08-25 { + description "First Revision"; + } + + container sonic-device_neighbor_metadata { + + container DEVICE_NEIGHBOR_METADATA { + + description "DEVICE_NEIGHBOR_METADATA part of config_db.json"; + + list DEVICE_NEIGHBOR_METADATA_LIST { + + key "name"; + + leaf name { + description "Host name string, max length 255"; + type string { + length 1..255; + } + } + + leaf hwsku { + type stypes:hwsku; + } + + leaf lo_addr { + description "Device loopback ipv4 address, type of ietf-inet + ipv4-prefix or ipv4-address"; + type union { + type inet:ipv4-prefix; + type inet:ipv4-address; + } + } + + leaf lo_addr_v6 { + description "Device loopback ipv6 address, type of ietf-inet + ipv6-prefix or ipv6-address"; + type union { + type inet:ipv6-prefix; + type inet:ipv6-address; + } + } + + leaf mgmt_addr { + description "Device management ipv4 address, type of ietf-inet + ipv4-prefix or ipv4-address"; + type union { + type inet:ipv4-prefix; + type inet:ipv4-address; + } + } + + leaf mgmt_addr_v6 { + description "Device management ipv6 address, type of ietf-inet + ipv6-prefix or ipv6-address"; + type union { + type inet:ipv6-prefix; + type inet:ipv6-address; + } + } + + leaf type { + description "Network element type"; + type string { + pattern "ToRRouter|LeafRouter|SpineChassisFrontendRouter|ChassisBackendRouter|ASIC|Asic|Supervior|MgmtToRRouter|SpineRouter|BackEndToRRouter|BackEndLeafRouter|EPMS|MgmtTsToR|BmcMgmtToRRouter|Server|MiniPower|SmartCable|Ixia|not-provisioned"; + } + } + + leaf deployment_id { + type uint32; + } + } + /* end of list DEVICE_NEIGHBOR_METADATA_LIST */ + } + /* end of container DEVICE_NEIGHBOR_METADATA */ + } + /* end of container sonic-device_neighbor_metadata */ +} +/* end of module sonic-device_neighbor_metadata */ From 7d1b99a8868ed97971377cf6d30adfcf2d0252d6 Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Tue, 13 Sep 2022 06:52:17 -0700 Subject: [PATCH 764/817] Replace unsafe functions in iccpd (#11694) Why I did it Replace unsafe functions in iccpd How I did it Replace memset() by zero initialization Replace strtok() by strtok_r() Signed-off-by: maipbui --- src/iccpd/src/cmd_option.c | 8 ++++---- src/iccpd/src/iccp_ifm.c | 12 ++++-------- src/iccpd/src/iccp_main.c | 3 +-- src/iccpd/src/iccp_netlink.c | 24 +++++++++--------------- src/iccpd/src/mclagdctl/mclagdctl.c | 3 +-- 5 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/iccpd/src/cmd_option.c b/src/iccpd/src/cmd_option.c index 596dafb73711..d6e7b14ef7ab 100644 --- a/src/iccpd/src/cmd_option.c +++ b/src/iccpd/src/cmd_option.c @@ -80,26 +80,26 @@ struct CmdOption* cmd_option_add(struct CmdOptionParser* parser, char* opt_name) static void cmd_option_register(struct CmdOptionParser* parser, char* syntax, char* desc) { - char buf[OPTION_MAX_LEN]; + char buf[OPTION_MAX_LEN] = {0}; struct CmdOption* opt = NULL; char* opt_name = NULL; char* param = NULL; char* desc_copy = NULL; char* token = NULL; + char* saveptr; if (parser == NULL) return; if (syntax == NULL) return; - memset(buf, 0, OPTION_MAX_LEN); snprintf(buf, OPTION_MAX_LEN - 1, "%s", syntax); - if ((token = strtok(buf, " ")) == NULL) + if ((token = strtok_r(buf, " ", &saveptr)) == NULL) return; opt_name = strdup(token); - if ((token = strtok(NULL, " ")) != NULL) + if ((token = strtok_r(NULL, " ", &saveptr)) != NULL) param = strdup(token); desc_copy = strdup(desc); if ((opt = cmd_option_find(parser, opt_name)) != NULL) diff --git a/src/iccpd/src/iccp_ifm.c b/src/iccpd/src/iccp_ifm.c index 4349599f5308..5d6d0540e32b 100644 --- a/src/iccpd/src/iccp_ifm.c +++ b/src/iccpd/src/iccp_ifm.c @@ -128,7 +128,7 @@ static void do_arp_learn_from_kernel(struct ndmsg *ndm, struct rtattr *tb[], int uint16_t vlan_id = 0; struct VLAN_ID vlan_key = { 0 }; - char buf[MAX_BUFSIZE]; + char buf[MAX_BUFSIZE] = { 0 }; size_t msg_len = 0; struct LocalInterface *lif_po = NULL, *arp_lif = NULL; @@ -144,7 +144,6 @@ static void do_arp_learn_from_kernel(struct ndmsg *ndm, struct rtattr *tb[], int return; /* create ARP msg*/ - memset(buf, 0, MAX_BUFSIZE); msg_len = sizeof(struct ARPMsg); arp_msg = (struct ARPMsg *)&buf; arp_msg->op_type = NEIGH_SYNC_LIF; @@ -388,7 +387,7 @@ static void do_ndisc_learn_from_kernel(struct ndmsg *ndm, struct rtattr *tb[], i uint16_t vlan_id = 0; struct VLAN_ID vlan_key = { 0 }; - char buf[MAX_BUFSIZE]; + char buf[MAX_BUFSIZE] = { 0 }; size_t msg_len = 0; char addr_null[16] = { 0 }; @@ -406,7 +405,6 @@ static void do_ndisc_learn_from_kernel(struct ndmsg *ndm, struct rtattr *tb[], i return; /* create NDISC msg */ - memset(buf, 0, MAX_BUFSIZE); msg_len = sizeof(struct NDISCMsg); ndisc_msg = (struct NDISCMsg *)&buf; ndisc_msg->op_type = NEIGH_SYNC_LIF; @@ -815,7 +813,7 @@ void do_arp_update_from_reply_packet(unsigned int ifindex, unsigned int addr, ui uint16_t vlan_id = 0; struct VLAN_ID vlan_key = { 0 }; - char buf[MAX_BUFSIZE]; + char buf[MAX_BUFSIZE] = { 0 }; size_t msg_len = 0; struct LocalInterface *lif_po = NULL, *arp_lif = NULL; @@ -830,7 +828,6 @@ void do_arp_update_from_reply_packet(unsigned int ifindex, unsigned int addr, ui return; /* create ARP msg*/ - memset(buf, 0, MAX_BUFSIZE); msg_len = sizeof(struct ARPMsg); arp_msg = (struct ARPMsg*)&buf; arp_msg->op_type = NEIGH_SYNC_LIF; @@ -1033,7 +1030,7 @@ void do_ndisc_update_from_reply_packet(unsigned int ifindex, char *ipv6_addr, ui struct LocalInterface *peer_link_if = NULL; int is_link_local = 0; - char buf[MAX_BUFSIZE]; + char buf[MAX_BUFSIZE] = { 0 }; size_t msg_len = 0; char addr_null[16] = { 0 }; uint16_t vlan_id = 0; @@ -1053,7 +1050,6 @@ void do_ndisc_update_from_reply_packet(unsigned int ifindex, char *ipv6_addr, ui sprintf(mac_str, "%02x:%02x:%02x:%02x:%02x:%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); /* create Ndisc msg */ - memset(buf, 0, MAX_BUFSIZE); msg_len = sizeof(struct NDISCMsg); ndisc_msg = (struct NDISCMsg *)&buf; ndisc_msg->op_type = NEIGH_SYNC_LIF; diff --git a/src/iccpd/src/iccp_main.c b/src/iccpd/src/iccp_main.c index fe3594583a51..5c852bade142 100644 --- a/src/iccpd/src/iccp_main.c +++ b/src/iccpd/src/iccp_main.c @@ -143,7 +143,7 @@ static int iccpd_signal_init(struct System* sys) int fds[2]; int err; sigset_t ss; - struct sigaction sa; + struct sigaction sa = { 0 }; struct epoll_event event; err = pipe(fds); @@ -171,7 +171,6 @@ static int iccpd_signal_init(struct System* sys) goto close_pipe; } - memset(&sa, 0, sizeof(sa)); sa.sa_handler = iccpd_signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; diff --git a/src/iccpd/src/iccp_netlink.c b/src/iccpd/src/iccp_netlink.c index 1143f370ffc5..6464a209896a 100644 --- a/src/iccpd/src/iccp_netlink.c +++ b/src/iccpd/src/iccp_netlink.c @@ -461,7 +461,7 @@ void iccp_set_interface_ipadd_mac(struct LocalInterface *lif, char * mac_addr ) { struct IccpSyncdHDr * msg_hdr; mclag_sub_option_hdr_t * sub_msg; - char msg_buf[4096]; + char msg_buf[4096] = { 0 }; struct System *sys; int src_len = 0, dst_len = 0; @@ -470,8 +470,6 @@ void iccp_set_interface_ipadd_mac(struct LocalInterface *lif, char * mac_addr ) if (sys == NULL) return; - memset(msg_buf, 0, 4095); - msg_hdr = (struct IccpSyncdHDr *)msg_buf; msg_hdr->ver = 1; msg_hdr->type = MCLAG_MSG_TYPE_SET_MAC; @@ -572,9 +570,10 @@ static int iccp_netlink_set_portchannel_iff_flag( { int rv, ret_rv = 0; char* token; + char* saveptr; struct LocalInterface* member_if; char *tmp_member_buf = NULL; - + if (!lif_po) return MCLAG_ERROR; @@ -592,7 +591,7 @@ static int iccp_netlink_set_portchannel_iff_flag( lif_po->portchannel_member_buf); } /* Port-channel members are stored as comma separated strings */ - token = strtok(tmp_member_buf, ","); + token = strtok_r(tmp_member_buf, ",", &saveptr); while (token != NULL) { member_if = local_if_find_by_name(token); @@ -616,7 +615,7 @@ static int iccp_netlink_set_portchannel_iff_flag( "Can't find member %s:%s, if_up(%d), location %d", lif_po->name, token, is_iff_up, location); } - token = strtok(NULL, ","); + token = strtok_r(NULL, ",", &saveptr); } if (tmp_member_buf) free(tmp_member_buf); @@ -1942,14 +1941,12 @@ int iccp_receive_ndisc_packet_handler(struct System *sys) struct nd_msg *ndmsg = NULL; struct nd_opt_hdr *nd_opt = NULL; struct in6_addr target; - uint8_t mac_addr[ETHER_ADDR_LEN]; + uint8_t mac_addr[ETHER_ADDR_LEN] = { 0 }; int8_t *opt = NULL; int opt_len = 0, l = 0; int len; struct CSM* csm = NULL; - memset(mac_addr, 0, ETHER_ADDR_LEN); - /* Fill in message and iovec. */ msg.msg_name = (void *)(&from); msg.msg_namelen = sizeof(struct sockaddr_in6); @@ -2375,9 +2372,9 @@ void recover_vlan_if_mac_on_standby(struct LocalInterface* lif_vlan, int dir, ui struct CSM *csm = NULL; struct System* sys = NULL; uint8_t null_mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - char macaddr[64]; - char remote_macaddr[64]; - uint8_t system_mac[ETHER_ADDR_LEN]; + char macaddr[64] = { 0 }; + char remote_macaddr[64] = { 0 }; + uint8_t system_mac[ETHER_ADDR_LEN] = { 0 }; int ret = 0; int vid = 0; @@ -2404,9 +2401,6 @@ void recover_vlan_if_mac_on_standby(struct LocalInterface* lif_vlan, int dir, ui sscanf (lif_vlan->name, "Vlan%d", &vid); - memset(macaddr, 0, 64); - memset(remote_macaddr, 0, 64); - memset(system_mac, 0, ETHER_ADDR_LEN); ICCPD_LOG_DEBUG(__FUNCTION__, " ifname %s, l3_proto %d, dir %d\n", lif_vlan->name, lif_vlan->is_l3_proto_enabled, dir); if (lif_vlan->is_l3_proto_enabled == true) diff --git a/src/iccpd/src/mclagdctl/mclagdctl.c b/src/iccpd/src/mclagdctl/mclagdctl.c index 2eccd944636a..eb6c8878df08 100644 --- a/src/iccpd/src/mclagdctl/mclagdctl.c +++ b/src/iccpd/src/mclagdctl/mclagdctl.c @@ -164,7 +164,7 @@ static struct command_type command_types[] = int mclagdctl_sock_connect() { - struct sockaddr_un addr; + struct sockaddr_un addr = { 0 }; int addrlen = 0; int ret = 0; @@ -181,7 +181,6 @@ int mclagdctl_sock_connect() return MCLAG_ERROR; } - memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s", mclagdctl_sock_path); addrlen = sizeof(addr.sun_family) + strlen(mclagdctl_sock_path); From 055fbf5aaaf4b8269cd598931f2c3fc3a41987cd Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 14 Sep 2022 04:39:49 +0200 Subject: [PATCH 765/817] [Arista] Update platform submodules (#12020) --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index b65a69a9e1c2..e12a04b24c5f 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit b65a69a9e1c2c876ba5210ce8b2a1cc9b5c8b18f +Subproject commit e12a04b24c5f752a9ca789d62bb7b94c563e1c4b diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index b65a69a9e1c2..e12a04b24c5f 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit b65a69a9e1c2c876ba5210ce8b2a1cc9b5c8b18f +Subproject commit e12a04b24c5f752a9ca789d62bb7b94c563e1c4b From c674b3c63486082a0d426ae64e58f70480205ddc Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 14 Sep 2022 10:19:05 +0530 Subject: [PATCH 766/817] [doc]: Updated PR Template for a comment to add label/tag for the feature raised. (#12058) Signed-off-by: kannankvs --- .github/pull_request_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1ff6883573d2..d553f7a4d0c4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -39,6 +39,8 @@ Write a short (one line) summary that describes the changes in this pull request for inclusion in the changelog: --> +#### Ensure to add label/tag for the feature raised. example - [PR#2174](https://github.com/sonic-net/sonic-utilities/pull/2174) where, Generic Config and Update feature has been labelled as GCU. + #### Link to config_db schema for YANG module changes - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Improve SSHD config to use more secure settings #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- build_debian.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 8dcd8596f684..01a10d78d678 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -467,10 +467,16 @@ rm /files/etc/ssh/sshd_config/ClientAliveInterval rm /files/etc/ssh/sshd_config/ClientAliveCountMax touch /files/etc/ssh/sshd_config/EmptyLineHack rename /files/etc/ssh/sshd_config/EmptyLineHack "" -set /files/etc/ssh/sshd_config/ClientAliveInterval 900 +set /files/etc/ssh/sshd_config/ClientAliveInterval 300 set /files/etc/ssh/sshd_config/ClientAliveCountMax 1 ins #comment before /files/etc/ssh/sshd_config/ClientAliveInterval -set /files/etc/ssh/sshd_config/#comment[following-sibling::*[1][self::ClientAliveInterval]] "Close inactive client sessions after 15 minutes" +set /files/etc/ssh/sshd_config/#comment[following-sibling::*[1][self::ClientAliveInterval]] "Close inactive client sessions after 5 minutes" +rm /files/etc/ssh/sshd_config/MaxAuthTries +set /files/etc/ssh/sshd_config/MaxAuthTries 3 +rm /files/etc/ssh/sshd_config/LogLevel +set /files/etc/ssh/sshd_config/LogLevel VERBOSE +rm /files/etc/ssh/sshd_config/Banner +set /files/etc/ssh/sshd_config/Banner /etc/issue save quit EOF From 8af369a7c94d461338ee0aa63202b11252742e2c Mon Sep 17 00:00:00 2001 From: Xichen96 Date: Thu, 22 Sep 2022 13:57:52 +0800 Subject: [PATCH 784/817] Enable swap for haliburton device. (#11746) Signed-off-by: Xichen Lin Signed-off-by: Xichen Lin --- .../debian/platform-modules-haliburton.init | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init index 07a6542109b5..3f6358bf4ab4 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init @@ -11,6 +11,26 @@ # Short-Description: Setup Haliburton board. ### END INIT INFO +setup_swap () { + SWAPFILE=/host/myswapfile + + if [ ! -f $SWAPFILE ]; then + availspace=`df -h --output=avail /host | sed '1d;s/\s//g;s/[^0-9].*//g'` + diff=$(( availspace - 2*$1 )) + if [ $diff -gt 0 ]; then + fallocate -l ${1}G $SWAPFILE + chmod 600 $SWAPFILE + echo "swap file created successfully" + else + echo "not enough disk space to turn on swap." + return + fi + fi + mkswap $SWAPFILE + swapon $SWAPFILE + echo "swap on successfully" +} + case "$1" in start) echo -n "Setting up board... " @@ -74,6 +94,8 @@ start) /bin/sh /usr/local/bin/platform_api_mgnt.sh init + setup_swap 2 + echo "done." ;; From 283efeeaccd386f99e3f9242f54d76bfd2901f44 Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Thu, 22 Sep 2022 06:40:42 -0700 Subject: [PATCH 785/817] [sonic-py-common] Add getstatusoutput_noshell() functions to general module (#12065) Signed-off-by: maipbui #### Why I did it `getstatusoutput()` function from `subprocess` module has shell injection issue because it includes `shell=True` in the implementation Eliminate duplicate code #### How I did it Reimplement `getstatusoutput_noshell()` and `getstatusoutput_noshell_pipe()` functions with `shell=False` Add `check_output_pipe()` function #### How to verify it Pass UT --- .../sonic_py_common/general.py | 68 +++++++++++++++++++ src/sonic-py-common/tests/test_general.py | 31 +++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/sonic-py-common/tests/test_general.py diff --git a/src/sonic-py-common/sonic_py_common/general.py b/src/sonic-py-common/sonic_py_common/general.py index 9e04f3e214ee..4fea165de9fb 100644 --- a/src/sonic-py-common/sonic_py_common/general.py +++ b/src/sonic-py-common/sonic_py_common/general.py @@ -1,4 +1,5 @@ import sys +from subprocess import Popen, STDOUT, PIPE, CalledProcessError, check_output def load_module_from_source(module_name, file_path): @@ -23,3 +24,70 @@ def load_module_from_source(module_name, file_path): sys.modules[module_name] = module return module + + +def getstatusoutput_noshell(cmd): + """ + This function implements getstatusoutput API from subprocess module + but using shell=False to prevent shell injection. + Ref: https://github.com/python/cpython/blob/3.10/Lib/subprocess.py#L602 + """ + try: + output = check_output(cmd, universal_newlines=True, stderr=STDOUT) + exitcode = 0 + except CalledProcessError as ex: + output = ex.output + exitcode = ex.returncode + if output[-1:] == '\n': + output = output[:-1] + return exitcode, output + + +def getstatusoutput_noshell_pipe(cmd0, *args): + """ + This function implements getstatusoutput API from subprocess module + but using shell=False to prevent shell injection. Input command + includes two or more commands connected by shell pipe(s). + """ + popens = [Popen(cmd0, stdout=PIPE, universal_newlines=True)] + i = 0 + while i < len(args): + popens.append(Popen(args[i], stdin=popens[i].stdout, stdout=PIPE, universal_newlines=True)) + popens[i].stdout.close() + i += 1 + output = popens[-1].communicate()[0] + if output[-1:] == '\n': + output = output[:-1] + + exitcodes = [0] * len(popens) + while popens: + last = popens.pop(-1) + exitcodes[len(popens)] = last.wait() + + return (exitcodes, output) + + +def check_output_pipe(cmd0, *args): + """ + This function implements check_output API from subprocess module. + Input command includes two or more commands connected by shell pipe(s) + """ + popens = [Popen(cmd0, stdout=PIPE, universal_newlines=True)] + i = 0 + while i < len(args): + popens.append(Popen(args[i], stdin=popens[i].stdout, stdout=PIPE, universal_newlines=True)) + popens[i].stdout.close() + i += 1 + output = popens[-1].communicate()[0] + + i = 0 + args_list = [cmd0] + list(args) + while popens: + current = popens.pop(0) + exitcode = current.wait() + if exitcode != 0: + raise CalledProcessError(returncode=exitcode, cmd=args_list[i], output=current.stdout) + i += 1 + + return output + diff --git a/src/sonic-py-common/tests/test_general.py b/src/sonic-py-common/tests/test_general.py new file mode 100644 index 000000000000..a395cf9aeb6b --- /dev/null +++ b/src/sonic-py-common/tests/test_general.py @@ -0,0 +1,31 @@ +import sys +import pytest +import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe, check_output_pipe + + +def test_getstatusoutput_noshell(tmp_path): + exitcode, output = getstatusoutput_noshell(['echo', 'sonic']) + assert (exitcode, output) == (0, 'sonic') + + exitcode, output = getstatusoutput_noshell([sys.executable, "-c", "import sys; sys.exit(6)"]) + assert exitcode != 0 + +def test_getstatusoutput_noshell_pipe(): + exitcode, output = getstatusoutput_noshell_pipe(['echo', 'sonic'], ['awk', '{print $1}']) + assert (exitcode, output) == ([0, 0], 'sonic') + + exitcode, output = getstatusoutput_noshell_pipe([sys.executable, "-c", "import sys; sys.exit(6)"], [sys.executable, "-c", "import sys; sys.exit(8)"]) + assert exitcode == [6, 8] + +def test_check_output_pipe(): + output = check_output_pipe(['echo', 'sonic'], ['awk', '{print $1}']) + assert output == 'sonic\n' + + with pytest.raises(subprocess.CalledProcessError) as e: + check_output_pipe([sys.executable, "-c", "import sys; sys.exit(6)"], [sys.executable, "-c", "import sys; sys.exit(0)"]) + assert e.returncode == [6, 0] + + with pytest.raises(subprocess.CalledProcessError) as e: + check_output_pipe([sys.executable, "-c", "import sys; sys.exit(0)"], [sys.executable, "-c", "import sys; sys.exit(6)"]) + assert e.returncode == [0, 6] From 57ff7a230827102f2d04cfdae8c3fcf242b09b50 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Thu, 22 Sep 2022 19:39:31 -0400 Subject: [PATCH 786/817] [chassis][supervisor] show system-health summary fails on the supervisor card (#10631) Fix the command "sudo show system-health summary" shows the following error on the supervisor card. Fixes #10630 --- src/system-health/health_checker/service_checker.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/system-health/health_checker/service_checker.py b/src/system-health/health_checker/service_checker.py index 33eeb4dfb707..674ad9944280 100644 --- a/src/system-health/health_checker/service_checker.py +++ b/src/system-health/health_checker/service_checker.py @@ -127,11 +127,11 @@ def get_critical_process_list_from_file(self, container, critical_processes_file self.bad_containers.add(container) logger.log_error('Invalid syntax in critical_processes file of {}'.format(container)) continue - - identifier_key = match.group(2).strip() - identifier_value = match.group(3).strip() - if identifier_key == "program" and identifier_value: - critical_process_list.append(identifier_value) + if match.group(1) is not None: + identifier_key = match.group(2).strip() + identifier_value = match.group(3).strip() + if identifier_key == "program" and identifier_value: + critical_process_list.append(identifier_value) return critical_process_list From 27032bfb84de0db2733dd024e54f0f0f83a0c769 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 23 Sep 2022 02:52:40 +0200 Subject: [PATCH 787/817] Add BUILD_DATE to SWI (#11915) Add the BUILD_DATE to the SWI version info, as this is a requirement of Secure Boot. --- build_image.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build_image.sh b/build_image.sh index ddf134e845ce..9c70713866a4 100755 --- a/build_image.sh +++ b/build_image.sh @@ -191,6 +191,7 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then zip -g $ABOOT_BOOT_IMAGE .imagehash rm .imagehash echo "SWI_VERSION=42.0.0" > version + echo "BUILD_DATE=$(date -d "${build_date}" -u +%Y%m%dT%H%M%SZ)" >> version echo "SWI_MAX_HWEPOCH=2" >> version echo "SWI_VARIANT=US" >> version zip -g $OUTPUT_ABOOT_IMAGE version From c968114a36dacd46b3dfea0e61b52a72daac4737 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Fri, 23 Sep 2022 12:54:57 +0800 Subject: [PATCH 788/817] [ci] Use absolute template file path in docker-sonic-slave pipeline. (#12153) --- .azure-pipelines/docker-sonic-slave-template.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.azure-pipelines/docker-sonic-slave-template.yml b/.azure-pipelines/docker-sonic-slave-template.yml index 1a7b983b5c1f..142ff5fa3f6f 100644 --- a/.azure-pipelines/docker-sonic-slave-template.yml +++ b/.azure-pipelines/docker-sonic-slave-template.yml @@ -38,12 +38,12 @@ jobs: - job: Build_${{ parameters.dist }}_${{ parameters.march }}${{ parameters.arch }} timeoutInMinutes: 360 variables: - - template: .azure-pipelines/template-variables.yml@buildimage - - template: .azure-pipelines/azure-pipelines-repd-build-variables.yml@buildimage + - template: /.azure-pipelines/template-variables.yml@buildimage + - template: /.azure-pipelines/azure-pipelines-repd-build-variables.yml@buildimage pool: ${{ parameters.pool }} steps: - template: cleanup.yml - - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage + - template: /.azure-pipelines/template-clean-sonic-slave.yml@buildimage - checkout: self clean: true submodules: recursive @@ -62,7 +62,7 @@ jobs: exit 0 fi - DOCKER_DATA_ROOT_FOR_MULTIARCH=/data/march/docker make configure PLATFORM=generic PLATFORM_ARCH=${{ parameters.arch }} $args || docker image ls $image_tag + DOCKER_DATA_ROOT_FOR_MULTIARCH=/data/march/docker BLDENV=${{ parameters.dist }} make -f Makefile.work configure PLATFORM=generic PLATFORM_ARCH=${{ parameters.arch }} $args || docker image ls $image_tag if [[ "$(Build.Reason)" == "PullRequest" ]];then exit 0 fi From cc0781b40b7e442677eb4ad21d72a29f16a666b3 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Sun, 25 Sep 2022 03:37:35 +0800 Subject: [PATCH 789/817] Build swss-common with libyang (#12087) Build swss-common with libyang #### Why I did it sonic-swss-common lib add dependency to libyang recently, so need update make file before update sonic-swss-common submodule. #### How I did it Add dependency to libyang in rules/swss-common.mk #### How to verify it Pass all E2E test case. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Add new Redis database PROFILE_DB #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- rules/swss-common.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/swss-common.mk b/rules/swss-common.mk index 9ab49b672b6c..d2c4390ef4ff 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -9,9 +9,9 @@ $(LIBSWSSCOMMON)_VERSION = $(LIBSWSSCOMMON_VERSION) $(LIBSWSSCOMMON)_NAME = $(LIBSWSSCOMMON_NAME) $(LIBSWSSCOMMON)_DEPENDS += $(LIBHIREDIS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) \ $(LIBNL_ROUTE3_DEV) $(LIBNL_NF3_DEV) \ - $(LIBNL_CLI_DEV) + $(LIBNL_CLI_DEV) $(LIBYANG_DEV) $(LIBYANG) $(LIBSWSSCOMMON)_RDEPENDS += $(LIBHIREDIS) $(LIBNL3) $(LIBNL_GENL3) \ - $(LIBNL_ROUTE3) $(LIBNL_NF3) $(LIBNL_CLI) + $(LIBNL_ROUTE3) $(LIBNL_NF3) $(LIBNL_CLI) $(LIBYANG) SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) LIBSWSSCOMMON_DEV = $(LIBSWSSCOMMON_NAME)-dev_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb From f50dc28789cd2fdec99131284cc4ccc5192b3806 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Mon, 26 Sep 2022 10:48:02 +0800 Subject: [PATCH 790/817] [docker-sonic-mgmt] Deprecate azure-kusto-data & azure-kusto-ingest for py2 (#12143) Why I did it The python packages azure-kusto-data and azure-kusto-ingest packages for python2 are too old and not really used. The python3 environment has newer version of these packages installed. This change is to deprecate these two packages for python2 in docker-sonic-mgmt image. How I did it Removed the lines for installing old version of packages azure-kusto-data and azure-kusto-ingest in python2 in the Dockerfile template. Signed-off-by: Xin Wang --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 42aaa3525a64..fec662dff0ed 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -114,10 +114,6 @@ RUN apt-get update \ # Install Azure CLI RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash -# Install Microsoft Azure Kusto Library for Python -RUN pip install azure-kusto-data==0.0.13 \ - azure-kusto-ingest==0.0.13 - RUN pip install wheel==0.33.6 ## Copy and install sonic-mgmt docker dependencies From 2c10ebb4fe978bded6499365d3471e8343573d8c Mon Sep 17 00:00:00 2001 From: Aryeh Feigin <101218333+arfeigin@users.noreply.github.com> Date: Mon, 26 Sep 2022 19:01:49 +0300 Subject: [PATCH 791/817] Use warm-boot infrastructure for fast-boot (#11594) This PR should be merged together with the sonic-utilities PR (sonic-net/sonic-utilities#2286) and sonic-sairedis PR (sonic-net/sonic-sairedis#1100). Use redis contents from dump file in fast-reboot. Improve fast-reboot flow by utilizing the warm-reboot infrastructure. This followes https://github.com/sonic-net/SONiC/blob/master/doc/fast-reboot/Fast-reboot_Flow_Improvements_HLD.md --- files/build_templates/docker_image_ctl.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index b4ff4a4379c9..ace39df4e546 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -87,7 +87,7 @@ function preStartAction() {%- if docker_container_name == "database" %} WARM_DIR=/host/warmboot if [ "$DATABASE_TYPE" != "chassisdb" ]; then - if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then + if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast" || "$BOOT_TYPE" == "fast") && -f $WARM_DIR/dump.rdb ]]; then # Load redis content from /host/warmboot/dump.rdb docker cp $WARM_DIR/dump.rdb database$DEV:/var/lib/redis/dump.rdb else @@ -218,7 +218,7 @@ function postStartAction() ($(docker exec -i database$DEV sonic-db-cli PING | grep -c PONG) -gt 0) ]]; do sleep 1; done - if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then + if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast" || "$BOOT_TYPE" == "fast") && -f $WARM_DIR/dump.rdb ]]; then # retain the dump file from last boot for debugging purposes mv $WARM_DIR/dump.rdb $WARM_DIR/dump.rdb.old else From 1b50a2b72111593af51906f9bcaea89f1f763126 Mon Sep 17 00:00:00 2001 From: Tal Berlowitz <100570204+talber-nvidia@users.noreply.github.com> Date: Mon, 26 Sep 2022 19:30:38 +0300 Subject: [PATCH 792/817] Patch ifupdown2 (#9630) (#11548) --- ...alue-of-utils._execute_subprocess-me.patch | 21 +++++++++++++++++++ src/ifupdown2/patch/series | 1 + 2 files changed, 22 insertions(+) create mode 100644 src/ifupdown2/patch/0003-Fix-the-return-value-of-utils._execute_subprocess-me.patch diff --git a/src/ifupdown2/patch/0003-Fix-the-return-value-of-utils._execute_subprocess-me.patch b/src/ifupdown2/patch/0003-Fix-the-return-value-of-utils._execute_subprocess-me.patch new file mode 100644 index 000000000000..39cd481099ca --- /dev/null +++ b/src/ifupdown2/patch/0003-Fix-the-return-value-of-utils._execute_subprocess-me.patch @@ -0,0 +1,21 @@ +Fix the return value of utils._execute_subprocess method for empty strings +--- + ifupdown2/ifupdown/utils.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ifupdown2/ifupdown/utils.py b/ifupdown2/ifupdown/utils.py +index d638fe9..0c5d8ce 100644 +--- a/ifupdown2/ifupdown/utils.py ++++ b/ifupdown2/ifupdown/utils.py +@@ -380,7 +380,7 @@ class utils(): + finally: + utils.disable_subprocess_signal_forwarding(signal.SIGINT) + +- cmd_output_string = cmd_output.decode() if cmd_output else cmd_output ++ cmd_output_string = cmd_output.decode() if cmd_output is not None else cmd_output + + if cmd_returncode != 0: + raise Exception(cls._format_error(cmd, +-- +2.14.1 + diff --git a/src/ifupdown2/patch/series b/src/ifupdown2/patch/series index c4e412bbe83f..7d0fa15ded61 100644 --- a/src/ifupdown2/patch/series +++ b/src/ifupdown2/patch/series @@ -1,2 +1,3 @@ 0001-fix-broadcast-addr-encoding.patch 0002-disable-checks-when-using-no-wait.patch +0003-Fix-the-return-value-of-utils._execute_subprocess-me.patch From 60c80ad26d17312b868a66ea32ccce3a1de2c8dc Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 27 Sep 2022 06:55:19 +0800 Subject: [PATCH 793/817] [Build] Fix the build unstalbe issue caused by the kvm not ready (#12180) Why I did it Fix the build unstable issue caused by the kvm 9000 port is not ready to use in 2 seconds. 2022-09-02T10:57:30.8122304Z + /usr/bin/kvm -m 8192 -name onie -boot order=cd,once=d -cdrom target/files/bullseye/onie-recovery-x86_64-kvm_x86_64_4_asic-r0.iso -device e1000,netdev=onienet -netdev user,id=onienet,hostfwd=:0.0.0.0:3041-:22 -vnc 0.0.0.0:0 -vga std -drive file=target/sonic-6asic-vs.img,media=disk,if=virtio,index=0 -drive file=./sonic-installer.img,if=virtio,index=1 -serial telnet:127.0.0.1:9000,server 2022-09-02T10:57:30.8123378Z + sleep 2.0 2022-09-02T10:57:30.8123889Z + '[' -d /proc/284923 ']' 2022-09-02T10:57:30.8124528Z + echo 'to kill kvm: sudo kill 284923' 2022-09-02T10:57:30.8124994Z to kill kvm: sudo kill 284923 2022-09-02T10:57:30.8125362Z + ./install_sonic.py 2022-09-02T10:57:30.8125720Z Trying 127.0.0.1... 2022-09-02T10:57:30.8126041Z telnet: Unable to connect to remote host: Connection refused How I did it Waiting more time until the tcp port 9000 is ready, waiting for 60 seconds in maximum. --- scripts/build_kvm_image.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/scripts/build_kvm_image.sh b/scripts/build_kvm_image.sh index 44009ed013f4..f3936a548299 100755 --- a/scripts/build_kvm_image.sh +++ b/scripts/build_kvm_image.sh @@ -49,6 +49,19 @@ prepare_installer_disk() umount $tmpdir } +wait_kvm_ready() +{ + local count=30 + local waiting_in_seconds=2.0 + for ((i=1; i<=$count; i++)); do + sleep $waiting_in_seconds + echo "$(date) [$i/$count] waiting for the port $KVM_PORT ready" + if netstat -l | grep -q ":$KVM_PORT"; then + break + fi + done +} + apt-get install -y net-tools create_disk prepare_installer_disk @@ -86,7 +99,7 @@ echo "Installing SONiC" kvm_pid=$! -sleep 2.0 +wait_kvm_ready [ -d "/proc/$kvm_pid" ] || { echo "ERROR: kvm died." @@ -114,7 +127,7 @@ echo "Booting up SONiC" kvm_pid=$! -sleep 2.0 +wait_kvm_ready [ -d "/proc/$kvm_pid" ] || { echo "ERROR: kvm died." From 1995540758cccbf4f3ff4c081a745db835993222 Mon Sep 17 00:00:00 2001 From: ShiyanWangMS Date: Tue, 27 Sep 2022 09:15:48 +0800 Subject: [PATCH 794/817] Upgrade docker-sonic-mgmt base image from Ubuntu18.04 to 20.04 (#12056) Upgrade docker-sonic-mgmt base image from Ubuntu18.04 to 20.04 --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 27 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index fec662dff0ed..e803508e855f 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -1,5 +1,5 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} -FROM {{ prefix }}ubuntu:18.04 +FROM {{ prefix }}ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive @@ -21,8 +21,6 @@ RUN apt-get update && apt-get install -y build-essential \ psmisc \ python \ python-dev \ - python-scapy \ - python-pip \ python3-pip \ python3-venv \ rsyslog \ @@ -31,10 +29,20 @@ RUN apt-get update && apt-get install -y build-essential \ sudo \ tcpdump \ telnet \ - vim + vim \ + python-is-python2 \ + software-properties-common + +RUN add-apt-repository -y universe +RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py \ + && python2 get-pip.py + +RUN curl -L http://archive.ubuntu.com/ubuntu/pool/universe/s/scapy/python-scapy_2.3.3-3_all.deb \ + --output python-scapy_2.3.3-3_all.deb \ + && dpkg -i python-scapy_2.3.3-3_all.deb RUN pip install setuptools==44.1.1 -RUN pip install cffi==1.10.0 \ +RUN pip install cffi==1.12.0 \ contextlib2==0.6.0.post1 \ cryptography==3.3.2 \ "future>=0.16.0" \ @@ -96,7 +104,7 @@ RUN pip install cffi==1.10.0 \ && rm -f 1.0.0.tar.gz \ && pip install nnpy \ && pip install dpkt \ - && pip install scapy==2.4.5 --upgrade + && pip install scapy==2.4.5 --upgrade --ignore-installed # Install docker-ce-cli RUN apt-get update \ @@ -189,8 +197,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 PYTHONIOENCODING=UTF-8 -RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 - +RUN python3 -m pip install --upgrade --ignore-installed pip setuptools==58.4.0 wheel==0.33.6 RUN python3 -m pip install setuptools-rust \ aiohttp \ defusedxml \ @@ -206,6 +213,7 @@ RUN python3 -m pip install setuptools-rust \ ixnetwork-restpy==1.0.64 \ ixnetwork-open-traffic-generator==0.0.79 \ snappi[ixnetwork,convergence]==0.7.44 \ + markupsafe==2.0.1 \ jinja2==2.7.2 \ jsonpatch \ lxml \ @@ -233,7 +241,6 @@ RUN python3 -m pip install setuptools-rust \ tabulate \ textfsm==1.1.2 \ virtualenv \ - wheel==0.33.6 \ pysubnettree \ nnpy \ dpkt \ @@ -248,5 +255,5 @@ RUN python3 -m pip install setuptools-rust \ celery[redis]==4.4.7 \ msrest==0.6.21 -# Deactivating a virtualenv. +# Deactivating a virtualenv ENV PATH="$BACKUP_OF_PATH" From 9c602320c3df3c8e84d5819c207b939b7ea84ff3 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Wed, 28 Sep 2022 11:38:41 +0800 Subject: [PATCH 795/817] install missed package python-dateutil (#12197) Why I did it Fix issue of can't import dateutil.parser in show_techsupport/test_auto_techsupport.py How I did it install python-dateutil --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index e803508e855f..7676341cbaed 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -86,6 +86,7 @@ RUN pip install cffi==1.12.0 \ allure-pytest==2.8.22 \ celery[redis]==4.4.7 \ msrest==0.6.21 \ + python-dateutil \ && git clone https://github.com/p4lang/scapy-vxlan.git \ && cd scapy-vxlan \ && python setup.py install \ @@ -253,7 +254,8 @@ RUN python3 -m pip install setuptools-rust \ ptf \ scapy==2.4.5 \ celery[redis]==4.4.7 \ - msrest==0.6.21 + msrest==0.6.21 \ + python-dateutil \ # Deactivating a virtualenv ENV PATH="$BACKUP_OF_PATH" From 7666af94030f44e48da1b4e8a8f265c32d0f2220 Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Wed, 28 Sep 2022 14:39:33 +0800 Subject: [PATCH 796/817] Fix pip install error (#12198) Fix the error of pip install introduced in PR #12197 --- dockers/docker-sonic-mgmt/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-sonic-mgmt/Dockerfile.j2 b/dockers/docker-sonic-mgmt/Dockerfile.j2 index 7676341cbaed..c6b4d1600a8e 100755 --- a/dockers/docker-sonic-mgmt/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -255,7 +255,7 @@ RUN python3 -m pip install setuptools-rust \ scapy==2.4.5 \ celery[redis]==4.4.7 \ msrest==0.6.21 \ - python-dateutil \ + python-dateutil # Deactivating a virtualenv ENV PATH="$BACKUP_OF_PATH" From f890606d8252c0e181bf16ea0c83846d9a37bbbf Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:15:26 +0800 Subject: [PATCH 797/817] Revert "[Mellanox] Redirect ethtool stderr to subprocess for better error log (#12038)" (#12183) This reverts commit 9750cb4. There is a PR to handle 202205 branch revert: #12184 - Why I did it The PR to be reverted introduced many notice logs every 1 minute if SFP is not plugged: Cannot get module EEPROM information: Input/output error Before the "bad" PR, the message format is like this: INFO pmon#supervisord: xcvrd Cannot get module EEPROM information: Input/output error It was truncated by rsyslog because every message is the same. However, the "bad" PR introduces SFP index to the message: NOTICE pmon#xcvrd: Failed to get EEPROM data for sfp 39: Cannot get module EEPROM information: Input/output error Rsyslog no longer truncate such log and many such messages are flooded to syslog. - How I did it Revert the PR - How to verify it Manual test --- platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index d373b6a8f705..617b4f33d636 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -359,8 +359,7 @@ def _read_eeprom_specific_bytes(self, offset, num_bytes): try: output = subprocess.check_output(ethtool_cmd, shell=True, - universal_newlines=True, - stderr=subprocess.PIPE) + universal_newlines=True) output_lines = output.splitlines() first_line_raw = output_lines[0] if "Offset" in first_line_raw: @@ -368,7 +367,6 @@ def _read_eeprom_specific_bytes(self, offset, num_bytes): line_split = line.split() eeprom_raw = eeprom_raw + line_split[1:] except subprocess.CalledProcessError as e: - logger.log_notice("Failed to get EEPROM data for sfp {}: {}".format(self.index, e.stderr)) return None eeprom_raw = list(map(lambda h: int(h, base=16), eeprom_raw)) From 4d317aff9491a56c094f96966bb0e3ff9d009611 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Wed, 28 Sep 2022 16:09:18 +0800 Subject: [PATCH 798/817] [Mellanox] Fix typo in platform API (#12136) - Why I did it Fix a typo in chassis platform API which causes the following error >>> import sonic_platform as P >>> c = P.platform.Platform().get_chassis() >>> sl = c.get_all_sfps() >>> sl[0].get_lpmode() Sep 28 07:48:33 INFO LOG: Initializing SX log with STDOUT as output file. False >>> del c Exception ignored in: Traceback (most recent call last): File "/usr/local/lib/python3.9/dist-packages/sonic_platform/chassis.py", line 126, in __del__ self.sfp_module.deinitialize_sdk_handle(sfp_module.SFP.shared_sdk_handle) NameError: name 'sfp_module' is not defined - How I did it Use self while using the SDK handle - How to verify it Manual test Signed-off-by: Stephen Sun --- platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index b9fa2593174c..96a7b9e2315a 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -123,7 +123,7 @@ def __del__(self): if self._sfp_list: if self.sfp_module.SFP.shared_sdk_handle: - self.sfp_module.deinitialize_sdk_handle(sfp_module.SFP.shared_sdk_handle) + self.sfp_module.deinitialize_sdk_handle(self.sfp_module.SFP.shared_sdk_handle) @property def RJ45_port_list(self): From 8c7e0f8e02233dc4236f8f7f048b4281ab9d31b8 Mon Sep 17 00:00:00 2001 From: vijayvyasm <112528485+vijayvyasm@users.noreply.github.com> Date: Wed, 28 Sep 2022 18:37:33 -0700 Subject: [PATCH 799/817] Support for serdes platform library debian installation for Innovium SONiC image (#11920) Signed-off-by: vijayvyasm vijayvyasm@marvell.com Signed-off-by: vijayvyasm vijayvyasm@marvell.com --- platform/innovium/invm-sai.mk | 4 +++- platform/innovium/one-image.mk | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/innovium/invm-sai.mk b/platform/innovium/invm-sai.mk index 25e490e44f83..734184e35b0c 100755 --- a/platform/innovium/invm-sai.mk +++ b/platform/innovium/invm-sai.mk @@ -5,11 +5,13 @@ INVM_SAI_ONLINE = https://github.com/Innovium/SONiC/raw/master/debian/master INVM_LIBSAI = isai.deb INVM_HSAI = saihdr.deb INVM_DRV = ipd.deb +INVM_SERDES_PLATFORM_LIBRARY = ivm_serdes_pltfm.deb $(INVM_LIBSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_LIBSAI) $(INVM_HSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_HSAI) $(INVM_DRV)_URL = $(INVM_SAI_ONLINE)/$(INVM_DRV) +$(INVM_SERDES_PLATFORM_LIBRARY)_URL = $(INVM_SAI_ONLINE)/$(INVM_SERDES_PLATFORM_LIBRARY) $(eval $(call add_conflict_package,$(INVM_HSAI),$(LIBSAIVS_DEV))) -SONIC_ONLINE_DEBS += $(INVM_LIBSAI) $(INVM_HSAI) $(INVM_DRV) +SONIC_ONLINE_DEBS += $(INVM_LIBSAI) $(INVM_HSAI) $(INVM_DRV) $(INVM_SERDES_PLATFORM_LIBRARY) diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index 2cae779d71ac..39e2e9fc8246 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -8,6 +8,6 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_715_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WISTRON_PLATFORM_MODULE) -$(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) +$(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(INVM_SERDES_PLATFORM_LIBRARY) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) From 1f9c89a8d34ab94cd871d0dd798d991d5e4cf00e Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Thu, 29 Sep 2022 10:27:57 +0800 Subject: [PATCH 800/817] [sonic-py-common] porting sonic_db_dump_load.py from sonic-py-swsssdk to sonic-py-common (#12185) Porting sonic_db_dump_load.py from sonic-py-swsssdk to sonic-py-common. #### Why I did it sonic-py-swsssdk will be deprecate, so porting sonic_db_dump_load.py to sonic-py-common. #### How I did it Copy sonic_db_dump_load.py to sonic-py-common, and fix minor API different. #### How to verify it Pass all E2E test. The platform_tests/test_advanced_reboot.py::test_warm_reboot will cover this script. #### Which release branch to backport (provide reason below if selected) - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Porting sonic_db_dump_load.py from sonic-py-swsssdk to sonic-py-common. #### Ensure to add label/tag for the feature raised. example - [PR#2174](https://github.com/sonic-net/sonic-utilities/pull/2174) where, Generic Config and Update feature has been labelled as GCU. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) --- src/sonic-py-common/setup.py | 6 + .../sonic_py_common/sonic_db_dump_load.py | 139 ++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100755 src/sonic-py-common/sonic_py_common/sonic_db_dump_load.py diff --git a/src/sonic-py-common/setup.py b/src/sonic-py-common/setup.py index f12c0d83cb77..144cf61f52c4 100644 --- a/src/sonic-py-common/setup.py +++ b/src/sonic-py-common/setup.py @@ -27,6 +27,12 @@ 'pytest', 'mock==3.0.5' # For python 2. Version >=4.0.0 drops support for py2 ], + entry_points={ + 'console_scripts': [ + 'sonic-db-load = sonic_py_common.sonic_db_dump_load:sonic_db_dump_load', + 'sonic-db-dump = sonic_py_common.sonic_db_dump_load:sonic_db_dump_load', + ], + }, classifiers=[ 'Intended Audience :: Developers', 'Operating System :: Linux', diff --git a/src/sonic-py-common/sonic_py_common/sonic_db_dump_load.py b/src/sonic-py-common/sonic_py_common/sonic_db_dump_load.py new file mode 100755 index 000000000000..126dd2bc112e --- /dev/null +++ b/src/sonic-py-common/sonic_py_common/sonic_db_dump_load.py @@ -0,0 +1,139 @@ +## ref: https://github.com/p/redis-dump-load/blob/7bbdb1eaea0a51ed4758d3ce6ca01d497a4e7429/redisdl.py + +def sonic_db_dump_load(): + import optparse + import os.path + import re + import sys + from redisdl import dump, load + from swsscommon.swsscommon import SonicDBConfig + + DUMP = 1 + LOAD = 2 + + def options_to_kwargs(options): + args = {} + if options.password: + args['password'] = options.password + if options.encoding: + args['encoding'] = options.encoding + # dump only + if hasattr(options, 'pretty') and options.pretty: + args['pretty'] = True + if hasattr(options, 'keys') and options.keys: + args['keys'] = options.keys + # load only + if hasattr(options, 'use_expireat') and options.use_expireat: + args['use_expireat'] = True + if hasattr(options, 'empty') and options.empty: + args['empty'] = True + if hasattr(options, 'backend') and options.backend: + args['streaming_backend'] = options.backend + if hasattr(options, 'dbname') and options.dbname: + if options.conntype == 'tcp': + args['host'] = SonicDBConfig.getDbHostname(options.dbname) + args['port'] = SonicDBConfig.getDbPort(options.dbname) + args['db'] = SonicDBConfig.getDbId(options.dbname) + args['unix_socket_path'] = None + elif options.conntype == "unix_socket": + args['host'] = None + args['port'] = None + args['db'] = SonicDBConfig.getDbId(options.dbname) + args['unix_socket_path'] = SonicDBConfig.getDbSock(options.dbname) + else: + raise TypeError('redis connection type is tcp or unix_socket') + + return args + + def do_dump(options): + if options.output: + output = open(options.output, 'w') + else: + output = sys.stdout + + kwargs = options_to_kwargs(options) + dump(output, **kwargs) + + if options.output: + output.close() + + def do_load(options, args): + if len(args) > 0: + input = open(args[0], 'rb') + else: + input = sys.stdin + + kwargs = options_to_kwargs(options) + load(input, **kwargs) + + if len(args) > 0: + input.close() + + script_name = os.path.basename(sys.argv[0]) + if re.search(r'load(?:$|\.)', script_name): + action = help = LOAD + elif re.search(r'dump(?:$|\.)', script_name): + action = help = DUMP + else: + # default is dump, however if dump is specifically requested + # we don't show help text for toggling between dumping and loading + action = DUMP + help = None + + if help == LOAD: + usage = "Usage: %prog [options] [FILE]" + usage += "\n\nLoad data from FILE (which must be a JSON dump previously created" + usage += "\nby redisdl) into specified or default redis." + usage += "\n\nIf FILE is omitted standard input is read." + elif help == DUMP: + usage = "Usage: %prog [options]" + usage += "\n\nDump data from specified or default redis." + usage += "\n\nIf no output file is specified, dump to standard output." + else: + usage = "Usage: %prog [options]" + usage += "\n %prog -l [options] [FILE]" + usage += "\n\nDump data from redis or load data into redis." + usage += "\n\nIf input or output file is specified, dump to standard output and load" + usage += "\nfrom standard input." + parser = optparse.OptionParser(usage=usage) + parser.add_option('-w', '--password', help='connect with PASSWORD') + if help == DUMP: + parser.add_option('-n', '--dbname', help='dump DATABASE (APPL_DB/ASIC_DB...)') + parser.add_option('-t', '--conntype', help='indicate redis connection type (tcp[default] or unix_socket)', default='tcp') + parser.add_option('-k', '--keys', help='dump only keys matching specified glob-style pattern') + parser.add_option('-o', '--output', help='write to OUTPUT instead of stdout') + parser.add_option('-y', '--pretty', help='split output on multiple lines and indent it', action='store_true') + parser.add_option('-E', '--encoding', help='set encoding to use while decoding data from redis', default='utf-8') + elif help == LOAD: + parser.add_option('-n', '--dbname', help='dump DATABASE (APPL_DB/ASIC_DB...)') + parser.add_option('-t', '--conntype', help='indicate redis connection type (tcp[default] or unix_socket)', default='tcp') + parser.add_option('-e', '--empty', help='delete all keys in destination db prior to loading', action='store_true') + parser.add_option('-E', '--encoding', help='set encoding to use while encoding data to redis', default='utf-8') + parser.add_option('-B', '--backend', help='use specified streaming backend') + parser.add_option('-A', '--use-expireat', help='use EXPIREAT rather than TTL/EXPIRE', action='store_true') + else: + parser.add_option('-l', '--load', help='load data into redis (default is to dump data from redis)', action='store_true') + parser.add_option('-n', '--dbname', help='dump DATABASE (APPL_DB/ASIC_DB/COUNTERS_DB/LOGLEVEL_DB/CONFIG_DB...)') + parser.add_option('-t', '--conntype', help='indicate redis connection type (tcp[default] or unix_socket)', default='tcp') + parser.add_option('-k', '--keys', help='dump only keys matching specified glob-style pattern') + parser.add_option('-o', '--output', help='write to OUTPUT instead of stdout (dump mode only)') + parser.add_option('-y', '--pretty', help='split output on multiple lines and indent it (dump mode only)', action='store_true') + parser.add_option('-e', '--empty', help='delete all keys in destination db prior to loading (load mode only)', action='store_true') + parser.add_option('-E', '--encoding', help='set encoding to use while decoding data from redis', default='utf-8') + parser.add_option('-A', '--use-expireat', help='use EXPIREAT rather than TTL/EXPIRE', action='store_true') + parser.add_option('-B', '--backend', help='use specified streaming backend (load mode only)') + options, args = parser.parse_args() + + if hasattr(options, 'load') and options.load: + action = LOAD + + if action == DUMP: + if len(args) > 0: + parser.print_help() + exit(4) + do_dump(options) + else: + if len(args) > 1: + parser.print_help() + exit(4) + do_load(options, args) From d9c9c70fb543ed4e6c8bfff24e17e65613409e72 Mon Sep 17 00:00:00 2001 From: Dmytro Lytvynenko Date: Fri, 30 Sep 2022 01:12:01 +0300 Subject: [PATCH 801/817] [BFN] Move qsfp eeprom reading to new cached api (#9909) * Move qsfp eeprom reading to new cached api * provide reading multiple pages in recursive manner * workaround with flat memory on cmis * remove workaround with memory model * Remove unused imports --- .../sonic_platform/platform_thrift_client.py | 11 ++-- .../sonic_platform/pltfm_mgr_rpc/ttypes.py | 18 ------ .../sonic_platform/sfp.py | 62 +++++++++++++------ 3 files changed, 48 insertions(+), 43 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_thrift_client.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_thrift_client.py index dff16577de74..8490d132a2df 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_thrift_client.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_thrift_client.py @@ -1,12 +1,10 @@ #!/usr/bin/env python try: - import os - import sys import time - import importlib - sys.path.append(os.path.dirname(__file__)) + from sonic_platform.pltfm_mgr_rpc.pltfm_mgr_rpc import Client + from sonic_platform.pltfm_mgr_rpc.pltfm_mgr_rpc import InvalidPltfmMgrOperation from thrift.transport import TSocket from thrift.transport import TTransport @@ -25,9 +23,8 @@ def open(self): self.transport = TTransport.TBufferedTransport(self.transport) bprotocol = TBinaryProtocol.TBinaryProtocol(self.transport) - self.pltfm_mgr_module = importlib.import_module(".".join(["pltfm_mgr_rpc", "pltfm_mgr_rpc"])) pltfm_mgr_protocol = TMultiplexedProtocol.TMultiplexedProtocol(bprotocol, "pltfm_mgr_rpc") - self.pltfm_mgr = self.pltfm_mgr_module.Client(pltfm_mgr_protocol) + self.pltfm_mgr = Client(pltfm_mgr_protocol) self.transport.open() return self @@ -59,7 +56,7 @@ def pltfm_mgr_try(func, default=None, thrift_attempts=35): def pm_cb_run(client): try: return (None, func(client.pltfm_mgr)) - except client.pltfm_mgr_module.InvalidPltfmMgrOperation as ouch: + except InvalidPltfmMgrOperation as ouch: return (ouch.code, default) return thrift_try(pm_cb_run) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py index 501596941664..391d4bd5377b 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py @@ -16,24 +16,6 @@ all_structs = [] -class qsfp_eeprom_page_t(object): - PAGE0_LOWER = 0 - PAGE0_UPPER = 1 - PAGE3 = 2 - - _VALUES_TO_NAMES = { - 0: "PAGE0_LOWER", - 1: "PAGE0_UPPER", - 2: "PAGE3", - } - - _NAMES_TO_VALUES = { - "PAGE0_LOWER": 0, - "PAGE0_UPPER": 1, - "PAGE3": 2, - } - - class pltfm_mgr_sys_tmp_t(object): """ Attributes: diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/sfp.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/sfp.py index f5d800b749c9..6a5534d8ba6b 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/sfp.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/sfp.py @@ -11,29 +11,38 @@ SFP_TYPE = "SFP" QSFP_TYPE = "QSFP" QSFP_DD_TYPE = "QSFP_DD" +EEPROM_PAGE_SIZE = 128 +try: + from thrift.Thrift import TApplicationException + + def cached_num_bytes_get(client): + return client.pltfm_mgr.pltfm_mgr_qsfp_cached_num_bytes_get(1, 0, 0, 0) + thrift_try(cached_num_bytes_get, 1) + EEPROM_CACHED_API_SUPPORT = True +except TApplicationException as e: + EEPROM_CACHED_API_SUPPORT = False class Sfp(SfpOptoeBase): """ BFN Platform-specific SFP class """ - SFP_EEPROM_PATH = "/var/run/platform/sfp/" - def __init__(self, port_num): SfpOptoeBase.__init__(self) self.index = port_num self.port_num = port_num self.sfp_type = QSFP_TYPE + self.SFP_EEPROM_PATH = "/var/run/platform/sfp/" - if not os.path.exists(self.SFP_EEPROM_PATH): - try: - os.makedirs(self.SFP_EEPROM_PATH) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - self.eeprom_path = self.SFP_EEPROM_PATH + "sfp{}-eeprom-cache".format(self.index) + if not EEPROM_CACHED_API_SUPPORT: + if not os.path.exists(self.SFP_EEPROM_PATH): + try: + os.makedirs(self.SFP_EEPROM_PATH) + except OSError as e: + if e.errno != errno.EEXIST: + raise + self.eeprom_path = self.SFP_EEPROM_PATH + "sfp{}-eeprom-cache".format(self.index) def get_presence(self): """ @@ -47,7 +56,7 @@ def qsfp_presence_get(client): try: presence = thrift_try(qsfp_presence_get) except Exception as e: - print( e.__doc__) + print(e.__doc__) print(e.message) return presence @@ -75,14 +84,31 @@ def get_eeprom_path(self): def qsfp_info_get(client): return client.pltfm_mgr.pltfm_mgr_qsfp_info_get(self.index) - if self.get_presence(): - eeprom_hex = thrift_try(qsfp_info_get) - eeprom_raw = bytearray.fromhex(eeprom_hex) - with open(self.eeprom_path, 'wb') as fp: - fp.write(eeprom_raw) - return self.eeprom_path + eeprom_hex = thrift_try(qsfp_info_get) + eeprom_raw = bytearray.fromhex(eeprom_hex) + with open(self.eeprom_path, 'wb') as fp: + fp.write(eeprom_raw) + return self.eeprom_path + + def read_eeprom(self, offset, num_bytes): + if not self.get_presence(): + return None + + if not EEPROM_CACHED_API_SUPPORT: + return super().read_eeprom(offset, num_bytes) + + def cached_num_bytes_get(page, offset, num_bytes): + def qsfp_cached_num_bytes_get(client): + return client.pltfm_mgr.pltfm_mgr_qsfp_cached_num_bytes_get(self.index, page, offset, num_bytes) + return bytearray.fromhex(thrift_try(qsfp_cached_num_bytes_get)) + + page_offset = offset % EEPROM_PAGE_SIZE + if page_offset + num_bytes > EEPROM_PAGE_SIZE: + curr_page_num_bytes_left = EEPROM_PAGE_SIZE - page_offset + curr_page_bytes = cached_num_bytes_get(offset // EEPROM_PAGE_SIZE, page_offset, curr_page_num_bytes_left) + return curr_page_bytes + self.read_eeprom(offset + curr_page_num_bytes_left, num_bytes - curr_page_num_bytes_left) - return None + return cached_num_bytes_get(offset // EEPROM_PAGE_SIZE, page_offset, num_bytes) def write_eeprom(self, offset, num_bytes, write_buffer): # Not supported at the moment From d08fcc971cbd7b27c7140eaa7b1baaad433ddba8 Mon Sep 17 00:00:00 2001 From: Dmytro Lytvynenko Date: Fri, 30 Sep 2022 01:13:46 +0300 Subject: [PATCH 802/817] [BFN] Updated syseeprom platform plugin to use onie-eeprom (#10556) * Align system eeprom info with ONIE * revert linked sonic_platform implementation * refactor into one class * refactor after review --- .../sonic_platform/chassis.py | 32 ++-- .../sonic_platform/eeprom.py | 155 +++++++++------- .../pltfm_mgr_rpc/pltfm_mgr_rpc.py | 175 ++++++++++++++++++ .../sonic_platform/pltfm_mgr_rpc/ttypes.py | 62 +++++++ 4 files changed, 336 insertions(+), 88 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py index 6d0e8b8c120c..1041561db423 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/chassis.py @@ -13,8 +13,8 @@ from sonic_platform.psu import psu_list_get from sonic_platform.fan_drawer import fan_drawer_list_get from sonic_platform.thermal import thermal_list_get - from eeprom import Eeprom - from platform_utils import file_create + from sonic_platform.platform_utils import file_create + from sonic_platform.eeprom import Eeprom from sonic_platform.platform_thrift_client import pltfm_mgr_ready from sonic_platform.platform_thrift_client import thrift_try @@ -40,7 +40,10 @@ class Chassis(ChassisBase): def __init__(self): ChassisBase.__init__(self) - self.__eeprom = None + self._eeprom = Eeprom() + self.__tlv_bin_eeprom = self._eeprom.get_raw_data() + self.__tlv_dict_eeprom = self._eeprom.get_data() + self.__fan_drawers = None self.__fan_list = None self.__thermals = None @@ -57,16 +60,6 @@ def __init__(self): file_create(config_dict['handlers']['file']['filename'], '646') logging.config.dictConfig(config_dict) - @property - def _eeprom(self): - if self.__eeprom is None: - self.__eeprom = Eeprom() - return self.__eeprom - - @_eeprom.setter - def _eeprom(self, value): - pass - @property def _fan_drawer_list(self): if self.__fan_drawers is None: @@ -152,7 +145,7 @@ def get_name(self): Returns: string: The name of the chassis """ - return self._eeprom.modelstr() + return self._eeprom.modelstr(self.__tlv_bin_eeprom) def get_presence(self): """ @@ -168,7 +161,7 @@ def get_model(self): Returns: string: Model/part number of chassis """ - return self._eeprom.part_number_str() + return self._eeprom.part_number_str(self.__tlv_bin_eeprom) def get_serial(self): """ @@ -176,7 +169,7 @@ def get_serial(self): Returns: string: Serial number of chassis """ - return self._eeprom.serial_number_str() + return self._eeprom.serial_number_str(self.__tlv_bin_eeprom) def get_revision(self): """ @@ -184,7 +177,8 @@ def get_revision(self): Returns: string: Revision number of chassis """ - return self._eeprom.revision_str() + return self.__tlv_dict_eeprom.get( + "0x{:X}".format(Eeprom._TLV_CODE_LABEL_REVISION), 'N/A') def get_sfp(self, index): """ @@ -225,7 +219,7 @@ def get_base_mac(self): A string containing the MAC address in the format 'XX:XX:XX:XX:XX:XX' """ - return self._eeprom.base_mac_addr() + return self._eeprom.base_mac_addr(self.__tlv_bin_eeprom) def get_system_eeprom_info(self): """ @@ -236,7 +230,7 @@ def get_system_eeprom_info(self): OCP ONIE TlvInfo EEPROM format and values are their corresponding values. """ - return self._eeprom.system_eeprom_info() + return self.__tlv_dict_eeprom def __get_transceiver_change_event(self, timeout=0): forever = False diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py index 2335c02863d9..4b5c1e3051fb 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/eeprom.py @@ -2,7 +2,8 @@ import os import sys import datetime - import re + import logging + import logging.config sys.path.append(os.path.dirname(__file__)) @@ -13,13 +14,15 @@ from sonic_platform_base.sonic_eeprom import eeprom_base from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo - from platform_utils import file_create - from platform_thrift_client import thrift_try + from sonic_py_common import device_info + + from sonic_platform.platform_thrift_client import thrift_try + from sonic_platform.platform_utils import file_create + except ImportError as e: raise ImportError (str(e) + "- required module not found") - _platform_eeprom_map = { "prod_name" : ("Product Name", "0x21", 12), "odm_pcba_part_num" : ("Part Number", "0x22", 13), @@ -44,25 +47,55 @@ class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self): file_create(_EEPROM_SYMLINK, '646') file_create(_EEPROM_STATUS, '646') - with open(_EEPROM_STATUS, 'w') as f: - f.write("initializing..") + super(Eeprom, self).__init__(_EEPROM_SYMLINK, 0, _EEPROM_STATUS, True) - self.eeprom_path = _EEPROM_SYMLINK - super(Eeprom, self).__init__(self.eeprom_path, 0, _EEPROM_STATUS, True) - - def sys_eeprom_get(client): - return client.pltfm_mgr.pltfm_mgr_sys_eeprom_get() + self._eeprom_bin = bytearray() + self.report_status("initializing..") try: - platform_eeprom = thrift_try(sys_eeprom_get) - except Exception: - raise RuntimeError("eeprom.py: Initialization failed") + try: + if device_info.get_platform() in ["x86_64-accton_as9516_32d-r0", + "x86_64-accton_as9516bf_32d-r0"]: + def tlv_eeprom_get(client): + return client.pltfm_mgr.pltfm_mgr_tlv_eeprom_get() + try: + self._eeprom_bin = bytearray.fromhex( + thrift_try(tlv_eeprom_get, 1).raw_content_hex) + except TApplicationException as e: + raise RuntimeError("api is not supported") + except Exception as e: + self._eeprom_bin = bytearray.fromhex( + thrift_try(tlv_eeprom_get).raw_content_hex) + else: + raise RuntimeError("platform is not supported") + + except RuntimeError as e: + logging.warning("Tlv eeprom fetching failed: %s, using OpenBMC" % (str(e))) + + def sys_eeprom_get(client): + return client.pltfm_mgr.pltfm_mgr_sys_eeprom_get() + + eeprom_params = self.platfrom_eeprom_to_params(thrift_try(sys_eeprom_get)) + stdout_stream = sys.stdout + sys.stdout = open(os.devnull, 'w') + self._eeprom_bin = self.set_eeprom(self._eeprom_bin, [eeprom_params]) + sys.stdout.close() + sys.stdout = stdout_stream + try: + self.write_eeprom(self._eeprom_bin) + self.report_status("ok") + except IOError as e: + logging.error("Failed to write eeprom: %s" % (str(e))) - self.__eeprom_init(platform_eeprom) + except Exception as e: + logging.error("eeprom.py: Initialization failed: %s" % (str(e))) + raise RuntimeError("eeprom.py: Initialization failed: %s" % (str(e))) - def __eeprom_init(self, platform_eeprom): - with open(_EEPROM_STATUS, 'w') as f: - f.write("ok") + self._system_eeprom_info = dict() + visitor = EepromContentVisitor(self._system_eeprom_info) + self.visit_eeprom(self._eeprom_bin, visitor) + @staticmethod + def platfrom_eeprom_to_params(platform_eeprom): eeprom_params = "" for attr, val in platform_eeprom.__dict__.items(): if val is None: @@ -86,57 +119,41 @@ def __eeprom_init(self, platform_eeprom): if len(eeprom_params) > 0: eeprom_params += "," eeprom_params += "{0:s}={1:s}".format(elem[1], value) + return eeprom_params - orig_stdout = sys.stdout - sys.stdout = StringIO() - try: - eeprom_data = eeprom_tlvinfo.TlvInfoDecoder.set_eeprom(self, "", [eeprom_params]) - finally: - decode_output = sys.stdout.getvalue() - sys.stdout = orig_stdout - - eeprom_base.EepromDecoder.write_eeprom(self, eeprom_data) - self.__eeprom_tlv_dict = self.__parse_output(decode_output) + def get_data(self): + return self._system_eeprom_info - def __parse_output(self, decode_output): - EEPROM_DECODE_HEADLINES = 6 - lines = decode_output.replace('\0', '').split('\n') - lines = lines[EEPROM_DECODE_HEADLINES:] - res = dict() - - for line in lines: - try: - # match whitespace-separated tag hex, length and value (value is mathced with its whitespaces) - match = re.search('(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+[\s]*[\S]*)', line) - if match is not None: - code = match.group(1) - value = match.group(3).rstrip('\0') - res[code] = value - except Exception: - pass - return res - - def __tlv_get(self, code): - return self.__eeprom_tlv_dict.get("0x{:X}".format(code), 'N/A') - - def system_eeprom_info(self): - return self.__eeprom_tlv_dict - - def serial_number_str(self): - return self.__tlv_get(self._TLV_CODE_SERIAL_NUMBER) - - def serial_str(self): - return self.serial_number_str() - - def base_mac_addr(self): - return self.__tlv_get(self._TLV_CODE_MAC_BASE) - - def part_number_str(self): - return self.__tlv_get(self._TLV_CODE_PART_NUMBER) - - def modelstr(self): - return self.__tlv_get(self._TLV_CODE_PRODUCT_NAME) - - def revision_str(self): - return self.__tlv_get(self._TLV_CODE_LABEL_REVISION) + def get_raw_data(self): + return self._eeprom_bin + def report_status(self, status): + status_file = None + try: + status_file = open(_EEPROM_STATUS, "w") + status_file.write(status) + except IOError as e: + logging.error("Failed to report state: %s" % (str(e))) + finally: + if status_file is not None: + status_file.close() + +class EepromContentVisitor(eeprom_tlvinfo.EepromDefaultVisitor): + def __init__(self, content_dict): + self.content_dict = content_dict + + def visit_tlv(self, name, code, length, value): + if code != Eeprom._TLV_CODE_VENDOR_EXT: + self.content_dict["0x{:X}".format(code)] = value.rstrip('\0') + else: + if value: + value = value.rstrip('\0') + if value: + code = "0x{:X}".format(code) + if code not in self.content_dict: + self.content_dict[code] = [value] + else: + self.content_dict[code].append(value) + + def set_error(self, error): + logging.error("EepromContentVisitor error: %s" % (str(error))) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py index 0fa03d58b31a..b671be1be313 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/pltfm_mgr_rpc.py @@ -33,6 +33,9 @@ def pltfm_mgr_sys_tmp_get(self): def pltfm_mgr_sys_eeprom_get(self): pass + def pltfm_mgr_tlv_eeprom_get(self): + pass + def pltfm_mgr_pwr_supply_present_get(self, ps_num): """ Parameters: @@ -403,6 +406,34 @@ def recv_pltfm_mgr_sys_eeprom_get(self): raise result.ouch raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_sys_eeprom_get failed: unknown result") + def pltfm_mgr_tlv_eeprom_get(self): + self.send_pltfm_mgr_tlv_eeprom_get() + return self.recv_pltfm_mgr_tlv_eeprom_get() + + def send_pltfm_mgr_tlv_eeprom_get(self): + self._oprot.writeMessageBegin('pltfm_mgr_tlv_eeprom_get', TMessageType.CALL, self._seqid) + args = pltfm_mgr_tlv_eeprom_get_args() + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_pltfm_mgr_tlv_eeprom_get(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = pltfm_mgr_tlv_eeprom_get_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + if result.ouch is not None: + raise result.ouch + raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_mgr_tlv_eeprom_get failed: unknown result") + def pltfm_mgr_pwr_supply_present_get(self, ps_num): """ Parameters: @@ -1579,6 +1610,7 @@ def __init__(self, handler): self._processMap["pltfm_mgr_dummy"] = Processor.process_pltfm_mgr_dummy self._processMap["pltfm_mgr_sys_tmp_get"] = Processor.process_pltfm_mgr_sys_tmp_get self._processMap["pltfm_mgr_sys_eeprom_get"] = Processor.process_pltfm_mgr_sys_eeprom_get + self._processMap["pltfm_mgr_tlv_eeprom_get"] = Processor.process_pltfm_mgr_tlv_eeprom_get self._processMap["pltfm_mgr_pwr_supply_present_get"] = Processor.process_pltfm_mgr_pwr_supply_present_get self._processMap["pltfm_mgr_pwr_supply_info_get"] = Processor.process_pltfm_mgr_pwr_supply_info_get self._processMap["pltfm_mgr_pwr_rail_info_get"] = Processor.process_pltfm_mgr_pwr_rail_info_get @@ -1710,6 +1742,32 @@ def process_pltfm_mgr_sys_eeprom_get(self, seqid, iprot, oprot): oprot.writeMessageEnd() oprot.trans.flush() + def process_pltfm_mgr_tlv_eeprom_get(self, seqid, iprot, oprot): + args = pltfm_mgr_tlv_eeprom_get_args() + args.read(iprot) + iprot.readMessageEnd() + result = pltfm_mgr_tlv_eeprom_get_result() + try: + result.success = self._handler.pltfm_mgr_tlv_eeprom_get() + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except InvalidPltfmMgrOperation as ouch: + msg_type = TMessageType.REPLY + result.ouch = ouch + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("pltfm_mgr_tlv_eeprom_get", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + def process_pltfm_mgr_pwr_supply_present_get(self, seqid, iprot, oprot): args = pltfm_mgr_pwr_supply_present_get_args() args.read(iprot) @@ -2954,6 +3012,123 @@ def __ne__(self, other): ) +class pltfm_mgr_tlv_eeprom_get_args(object): + + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_tlv_eeprom_get_args') + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_tlv_eeprom_get_args) +pltfm_mgr_tlv_eeprom_get_args.thrift_spec = ( +) + + +class pltfm_mgr_tlv_eeprom_get_result(object): + """ + Attributes: + - success + - ouch + + """ + + + def __init__(self, success=None, ouch=None,): + self.success = success + self.ouch = ouch + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRUCT: + self.success = pltfm_mgr_tlv_sys_eeprom_t() + self.success.read(iprot) + else: + iprot.skip(ftype) + elif fid == 1: + if ftype == TType.STRUCT: + self.ouch = InvalidPltfmMgrOperation.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_tlv_eeprom_get_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRUCT, 0) + self.success.write(oprot) + oprot.writeFieldEnd() + if self.ouch is not None: + oprot.writeFieldBegin('ouch', TType.STRUCT, 1) + self.ouch.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(pltfm_mgr_tlv_eeprom_get_result) +pltfm_mgr_tlv_eeprom_get_result.thrift_spec = ( + (0, TType.STRUCT, 'success', [pltfm_mgr_tlv_sys_eeprom_t, None], None, ), # 0 + (1, TType.STRUCT, 'ouch', [InvalidPltfmMgrOperation, None], None, ), # 1 +) + + class pltfm_mgr_pwr_supply_present_get_args(object): """ Attributes: diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py index 391d4bd5377b..ad686b888029 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/pltfm_mgr_rpc/ttypes.py @@ -460,6 +460,63 @@ def __ne__(self, other): return not (self == other) +class pltfm_mgr_tlv_sys_eeprom_t(object): + """ + Attributes: + - raw_content_hex + + """ + + + def __init__(self, raw_content_hex=None,): + self.raw_content_hex = raw_content_hex + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.STRING: + self.raw_content_hex = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('pltfm_mgr_tlv_sys_eeprom_t') + if self.raw_content_hex is not None: + oprot.writeFieldBegin('raw_content_hex', TType.STRING, 1) + oprot.writeString(self.raw_content_hex.encode('utf-8') if sys.version_info[0] == 2 else self.raw_content_hex) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + + class pltfm_mgr_pwr_supply_info_t(object): """ Attributes: @@ -1380,6 +1437,11 @@ def __ne__(self, other): (21, TType.STRING, 'location', 'UTF8', None, ), # 21 (22, TType.I16, 'crc8', None, None, ), # 22 ) +all_structs.append(pltfm_mgr_tlv_sys_eeprom_t) +pltfm_mgr_tlv_sys_eeprom_t.thrift_spec = ( + None, # 0 + (1, TType.STRING, 'raw_content_hex', 'UTF8', None, ), # 1 +) all_structs.append(pltfm_mgr_pwr_supply_info_t) pltfm_mgr_pwr_supply_info_t.thrift_spec = ( None, # 0 From 9bb0a7f33cd99f769063dd4bb798f0b59985e619 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Fri, 30 Sep 2022 01:18:43 +0300 Subject: [PATCH 803/817] [BFN] Canceling PSU platform API calls on SIGTERM (#10720) * [BFN] Canceling PSU platform API calls on SIGTERM Signed-off-by: Andriy Kokhan * [BFN] Fixed SONiC fwutil exec time (#31) Signed-off-by: Taras Keryk Signed-off-by: Andriy Kokhan Signed-off-by: Taras Keryk Co-authored-by: Taras Keryk --- .../sonic_platform/component.py | 2 + .../sonic_platform/platform_utils.py | 60 ++++++++++++++++++- .../sonic_platform/psu.py | 30 +++++++++- 3 files changed, 89 insertions(+), 3 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py index 47a0993bf3e5..a7f236cb42a4 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/component.py @@ -6,6 +6,7 @@ import json from collections import OrderedDict from sonic_py_common import device_info + from platform_utils import limit_execution_time except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -24,6 +25,7 @@ def get_bios_version(): except subprocess.CalledProcessError as e: raise RuntimeError("Failed to get BIOS version") +@limit_execution_time(1) def get_bmc_version(): """ Retrieves the firmware version of the BMC diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py index 81e78ee01041..2f7b5aecb6d0 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/platform_utils.py @@ -3,11 +3,19 @@ try: import os import subprocess + import signal + from functools import wraps except ImportError as e: raise ImportError(str(e) + "- required module not found") def file_create(path, mode=None): + """ + Ensure that file is created with the appropriate permissions + Args: + path: full path of a file + mode: file permission in octal representation + """ def run_cmd(cmd): if os.geteuid() != 0: cmd.insert(0, 'sudo') @@ -18,5 +26,55 @@ def run_cmd(cmd): run_cmd(['mkdir', '-p', file_path]) if not os.path.isfile(path): run_cmd(['touch', path]) - if (mode is not None): + if (mode is not None): run_cmd(['chmod', mode, path]) + +def cancel_on_sigterm(func): + """ + Wrapper for a function which has to be cancel on SIGTERM + """ + @wraps(func) + def wrapper(*args, **kwargs): + def handler(sig, frame): + if sigterm_handler: + sigterm_handler(sig, frame) + raise Exception("Canceling {}() execution...".format(func.__name__)) + + sigterm_handler = signal.getsignal(signal.SIGTERM) + signal.signal(signal.SIGTERM, handler) + result = None + try: + result = func(*args, **kwargs) + finally: + signal.signal(signal.SIGTERM, sigterm_handler) + return result + return wrapper + +def limit_execution_time(execution_time_secs: int): + """ + Wrapper for a function whose execution time must be limited + Args: + execution_time_secs: maximum execution time in seconds, + after which the function execution will be stopped + """ + def wrapper(func): + @wraps(func) + def execution_func(*args, **kwargs): + def handler(sig, frame): + if sigalrm_handler: + sigalrm_handler(sig, frame) + raise Exception("Canceling {}() execution...".format(func.__name__)) + + sigalrm_handler = signal.getsignal(signal.SIGALRM) + signal.signal(signal.SIGALRM, handler) + signal.alarm(execution_time_secs) + result = None + try: + result = func(*args, **kwargs) + finally: + signal.alarm(0) + + return result + return execution_func + return wrapper + diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/psu.py b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/psu.py index fb9bce50e071..fbd83d6496ae 100644 --- a/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/psu.py +++ b/platform/barefoot/sonic-platform-modules-bfn-montara/sonic_platform/psu.py @@ -4,18 +4,26 @@ import os import sys import time + import signal + import syslog sys.path.append(os.path.dirname(__file__)) from .platform_thrift_client import thrift_try from sonic_platform_base.psu_base import PsuBase + from platform_utils import cancel_on_sigterm + except ImportError as e: raise ImportError (str(e) + "- required module not found") class Psu(PsuBase): """Platform-specific PSU class""" + sigterm = False + sigterm_default_handler = None + cls_inited = False + def __init__(self, index): PsuBase.__init__(self) self.__index = index @@ -24,6 +32,21 @@ def __init__(self, index): # STUB IMPLEMENTATION self.color = "" + syslog.syslog(syslog.LOG_INFO, "Created PSU #{} instance".format(self.__index)) + if not Psu.cls_inited: + Psu.sigterm_default_handler = signal.getsignal(signal.SIGTERM) + signal.signal(signal.SIGTERM, Psu.signal_handler) + if Psu.sigterm_default_handler: + syslog.syslog(syslog.LOG_INFO, "Default SIGTERM handler overridden!!") + Psu.cls_inited = True + + @classmethod + def signal_handler(cls, sig, frame): + if cls.sigterm_default_handler: + cls.sigterm_default_handler(sig, frame) + syslog.syslog(syslog.LOG_INFO, "Canceling PSU platform API calls...") + cls.sigterm = True + ''' Units of returned info object values: vin - V @@ -33,20 +56,23 @@ def __init__(self, index): fspeed - RPM ''' def __info_get(self): + @cancel_on_sigterm def psu_info_get(client): return client.pltfm_mgr.pltfm_mgr_pwr_supply_info_get(self.__index) # Update cache once per 2 seconds - if self.__ts + 2 < time.time(): + if self.__ts + 2 < time.time() and not Psu.sigterm: self.__info = None try: self.__info = thrift_try(psu_info_get, attempts=1) + except Exception as e: + if "Canceling" in str(e): + syslog.syslog(syslog.LOG_INFO, "{}".format(e)) finally: self.__ts = time.time() return self.__info return self.__info - @staticmethod def get_num_psus(): """ From 179882398c0c035f3bf2a522c07ad5c958453d80 Mon Sep 17 00:00:00 2001 From: Prince George <45705344+prgeor@users.noreply.github.com> Date: Thu, 29 Sep 2022 17:12:20 -0700 Subject: [PATCH 804/817] Revert "Support for serdes platform library debian installation for Innovium SONiC image (#11920)" (#12227) This reverts commit 8c7e0f8e02233dc4236f8f7f048b4281ab9d31b8. --- platform/innovium/invm-sai.mk | 4 +--- platform/innovium/one-image.mk | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/platform/innovium/invm-sai.mk b/platform/innovium/invm-sai.mk index 734184e35b0c..25e490e44f83 100755 --- a/platform/innovium/invm-sai.mk +++ b/platform/innovium/invm-sai.mk @@ -5,13 +5,11 @@ INVM_SAI_ONLINE = https://github.com/Innovium/SONiC/raw/master/debian/master INVM_LIBSAI = isai.deb INVM_HSAI = saihdr.deb INVM_DRV = ipd.deb -INVM_SERDES_PLATFORM_LIBRARY = ivm_serdes_pltfm.deb $(INVM_LIBSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_LIBSAI) $(INVM_HSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_HSAI) $(INVM_DRV)_URL = $(INVM_SAI_ONLINE)/$(INVM_DRV) -$(INVM_SERDES_PLATFORM_LIBRARY)_URL = $(INVM_SAI_ONLINE)/$(INVM_SERDES_PLATFORM_LIBRARY) $(eval $(call add_conflict_package,$(INVM_HSAI),$(LIBSAIVS_DEV))) -SONIC_ONLINE_DEBS += $(INVM_LIBSAI) $(INVM_HSAI) $(INVM_DRV) $(INVM_SERDES_PLATFORM_LIBRARY) +SONIC_ONLINE_DEBS += $(INVM_LIBSAI) $(INVM_HSAI) $(INVM_DRV) diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index 39e2e9fc8246..2cae779d71ac 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -8,6 +8,6 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_715_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WISTRON_PLATFORM_MODULE) -$(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(INVM_SERDES_PLATFORM_LIBRARY) +$(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) From 5510d9c03b6f2b1b07198f3c421ab4ce7bf5a0ef Mon Sep 17 00:00:00 2001 From: Ye Jianquan Date: Fri, 30 Sep 2022 08:17:01 +0800 Subject: [PATCH 805/817] Make t0 part1 and part2 be able to be rerun if failed (#12221) Why I did it With continueOnError: true, a failed job returns the result: partiallySuccess, which cause it can't be rerun, since AZP consider it as passed. Then we can't only rerun t0 jobs when it fails. How I did it Mark t0 part1 and part2 as continueOnError: false. How to verify it The pipeline will verify it. --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7856915f9b60..26a86dffa01e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -137,7 +137,7 @@ stages: pool: sonictest displayName: "kvmtest-t0-part1" timeoutInMinutes: 360 - continueOnError: true + continueOnError: false steps: - template: .azure-pipelines/run-test-template.yml parameters: @@ -151,7 +151,7 @@ stages: pool: sonictest displayName: "kvmtest-t0-part2" timeoutInMinutes: 360 - continueOnError: true + continueOnError: false steps: - template: .azure-pipelines/run-test-template.yml parameters: From 1d69f0916eccc3961cdaa2c680141f57207396a1 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 30 Sep 2022 14:38:05 +0800 Subject: [PATCH 806/817] [Mellanox] Provide dummy implementation for get_rx_los and get_tx_fault (#12231) - Why I did it get_rx_los and get_tx_fault is not supported via the exisitng interface used, need provide dummy implementation for them. NOTE: in later releases we will get them back via different interface. - How I did it Return False * lane_num for get_rx_los and get_tx_fault - How to verify it Added unit test --- .../mlnx-platform-api/sonic_platform/sfp.py | 32 +++++++++++++++++++ .../mlnx-platform-api/tests/test_sfp.py | 14 ++++++++ 2 files changed, 46 insertions(+) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 617b4f33d636..d35b869e9a29 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -755,6 +755,38 @@ def get_error_description(self): error_description = "Unknow SFP module status ({})".format(oper_status) return error_description + def get_rx_los(self): + """Accessing rx los is not supproted, return all False + + Returns: + list: [False] * channels + """ + api = self.get_xcvr_api() + return [False] * api.NUM_CHANNELS if api else None + + def get_tx_fault(self): + """Accessing tx fault is not supproted, return all False + + Returns: + list: [False] * channels + """ + api = self.get_xcvr_api() + return [False] * api.NUM_CHANNELS if api else None + + def get_xcvr_api(self): + """ + Retrieves the XcvrApi associated with this SFP + + Returns: + An object derived from XcvrApi that corresponds to the SFP + """ + if self._xcvr_api is None: + self.refresh_xcvr_api() + if self._xcvr_api is not None: + self._xcvr_api.get_rx_los = self.get_rx_los + self._xcvr_api.get_tx_fault = self.get_tx_fault + return self._xcvr_api + class RJ45Port(NvidiaSFPCommon): """class derived from SFP, representing RJ45 ports""" diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index f599e0241d25..b72a5f3ed4aa 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -119,3 +119,17 @@ def test_is_port_admin_status_up(self, mock_port_status): mock_port_status.return_value = (0, False) assert not SFP.is_port_admin_status_up(None, None) + + @mock.patch('sonic_platform.sfp.SFP.get_xcvr_api') + def test_dummy_apis(self, mock_get_xcvr_api): + mock_api = mock.MagicMock() + mock_api.NUM_CHANNELS = 4 + mock_get_xcvr_api.return_value = mock_api + + sfp = SFP(0) + assert sfp.get_rx_los() == [False] * 4 + assert sfp.get_tx_fault() == [False] * 4 + + mock_get_xcvr_api.return_value = None + assert sfp.get_rx_los() is None + assert sfp.get_tx_fault() is None From 92bd6dae281977c93bbf39e4456a62857a485dfb Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Fri, 30 Sep 2022 09:40:12 +0300 Subject: [PATCH 807/817] [Mellanox] Update SAI to v2205.22.1.19 and SDK/FW to v4.5.3168/v2010.3170 (#12205) - Why I did it To include latest fixes and new functionality SAI fixes and new features fix #3205239, incorrect object type returned for SG child list Fix VRF-VNI map entries remove issue ECC health event and logging [Port Buffers] restore default queue and pg configuration when all user pools are deleted Fix EVPN type3 error on removal of uc/bc flood group Fix EVPN type2 MAC move from local to remote results in SAI failure Fix Disable learning on VXLAN tunnel Fix error on VXLAN v6 tunnel removal Fix port cannot apply schedule group when it is a lag member Fix BFD add more detailed message on BFD packet not related to any existing session gcc10 compilation fixes Disable learning on VXLAN tunnel Support BFD remote-disc exchange in negotiation stage Tunnel Loopback packet action attribute implementation (for Dual TOR) Add KVD resources MIN/MAX functionality (pending CRM issue with MIN only) Support for CRC2 hash algorithm Bulk counter support for PGs, queues Support mirror sample rate attribute (SPC2+) [Functional] [QoS] | Unable to remove SCHEDULE profile table even if there is no object referencing it Next hop group optimized bulk API Reduce verbosity of shared database already exists print Span mirror policer (SPC2+), optimize pipeline for acl mirror action with policer on SPC2+ use same size descriptor pool for rx/tx fix bfd - notify Sonic for admin-down event 2201 - empty list for supported fec for RJ45 ports Fix don't disable used tunnel underlay interfaces SDK fixes 100GbE FCI DAC (10137628-4050LF/HPE PN: 845408-B21) was recognized by mistake as supporting "cable burning' which caused the switch firmware to read page 0x9f (which unsupported in the cable) and to report this cable as having "bad eeprom". Added remote peer UDP port information in BFD packet event. After editing an ECMP, the resilient ECMP next-hop counter may not count correctly. Fixed potential memory leaks in some APIs related to LPM If TTL_CMD_COPY is used in Encap direction for a packet with no TTL, then the value passed in the ttl data structure will be used if non-zero (default 255 if zero). In SN2201: When configuring Force mode, user should configure Speed and FEC on both sides In Flex Tunnel encapsulation flow, if the encapsulation is with an IPv6 header, the flow label field may not be updated as expected. In some cases, when changing speed to 400GbE over 8 lanes, the first few packets would be dropped. In some traffic patterns involving small packets, the PortRcvErrors counter may mistakenly count events of local physical errors due to an internal flow in the hardware that involves link packets. On Spectrum systems, sometimes during link failure, not all previous firmware indications cleared properly, potentially affecting the next link up attempt. On the NVIDIA Spectrum-2 switch, when receiving a packet with Symbol Errors on ports that are configured to cut-thought mode, a pipeline might get stuck. PCI calibration changes from a static to a dynamic mechanism. SDK debug dump shows "Unknown" Counter in RFC3635 Counter Group. SDK debug dump shows "Unknown" Counter in the PPCNT Traffic Class Counter Group. SDK Dump missing column headers in some GC tables may result in difficulty understanding the dump. SLL configuration is missing in SDK dump. Spectrum-2 systems, do no support 1GbE on supported 40GbE modules. When binding a UDP port which is already in use for BFD TX session, the error message appears incorrectly. When Flex Tunnel was used, Flex Modifier sometimes experienced a brief mis-configuration during ISSU. When many ports are active (e.g. 70 ports up), and the configuration of shared buffer is applied on the fly, occasionally, the firmware might get stuck. When running 1GbE speeds on SN4600 system, the port remained active while peer side was closed. When toggling many ports of the Spectrum devices while raising 10GbE link up and link maintenance is enabled, the switch may get stuck and may need to be rebooted. When trying to reconfigure the Flex Parser header and Flex transition parameters after ISSU, the switch will returned an error even if the configuration was identical to that done before performing the ISSU. While toggling the cable, and the low power mode is set to ON, an unexpected PMPE event error is received. - How I did it Updated SDK/SAI submodule and relevant makefiles with the required versions. - How to verify it Build an image and run tests from "sonic-mgmt". Signed-off-by: Volodymyr Samotiy --- platform/mellanox/fw.mk | 6 +++--- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/mlnx-sai/SAI-Implementation | 2 +- platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers | 2 +- platform/mellanox/sdk.mk | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 962ea0ae31e1..92aed0663311 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -27,17 +27,17 @@ else FW_FROM_URL = n endif -MLNX_SPC_FW_VERSION = 13.2010.2320 +MLNX_SPC_FW_VERSION = 13.2010.3170 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2010.2320 +MLNX_SPC2_FW_VERSION = 29.2010.3170 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) -MLNX_SPC3_FW_VERSION = 30.2010.2320 +MLNX_SPC3_FW_VERSION = 30.2010.3170 MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 6eaa1dcf80b4..90ca7430b0ad 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,6 +1,6 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIRel1.21.2.0 +MLNX_SAI_VERSION = SAIBuild2205.22.1.19 export MLNX_SAI_VERSION diff --git a/platform/mellanox/mlnx-sai/SAI-Implementation b/platform/mellanox/mlnx-sai/SAI-Implementation index f9a21df71363..82274ffaef77 160000 --- a/platform/mellanox/mlnx-sai/SAI-Implementation +++ b/platform/mellanox/mlnx-sai/SAI-Implementation @@ -1 +1 @@ -Subproject commit f9a21df713636fe648b8bb190698e4494a0f5239 +Subproject commit 82274ffaef7748120b7657362f7875fb7d6e6f5f diff --git a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers index 5650c3519b55..8b1f1c0f1164 160000 --- a/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers +++ b/platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers @@ -1 +1 @@ -Subproject commit 5650c3519b55051124810a4625f8269694b1e592 +Subproject commit 8b1f1c0f11647749f79ebc4e823c157513067412 diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index b620b07ee2f8..5a6864bc1e4a 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -16,7 +16,7 @@ # MLNX_SDK_BASE_PATH = $(PLATFORM_PATH)/sdk-src/sx-kernel/Switch-SDK-drivers/bin/ MLNX_SDK_PKG_BASE_PATH = $(MLNX_SDK_BASE_PATH)/$(BLDENV)/$(CONFIGURED_ARCH)/ -MLNX_SDK_VERSION = 4.5.2320 +MLNX_SDK_VERSION = 4.5.3168 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DEB_VERSION = $(subst -,.,$(subst _,.,$(MLNX_SDK_VERSION))) From eea8ebd0a9ee977765097666d1d89961a466d891 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Fri, 30 Sep 2022 09:48:40 +0300 Subject: [PATCH 808/817] [Mellanox] Update MFT to v4.21.0-100 (#11758) - Why I did it To update MFT package to the latest version. - How I did it Updated MFT_VERSION & MFT_REVISION in platform/mellanox/mft.mk. - How to verify it Build an image and deploy to the switch Check MFT version by dpkg -l | grep mft Verify that all the SONiC services up and running Run regression testing using tests from sonic-mgmt Signed-off-by: Volodymyr Samotiy --- platform/mellanox/mft.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index eb702a85a1d1..047e87b09086 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -16,8 +16,8 @@ # # Mellanox SAI -MFT_VERSION = 4.20.0 -MFT_REVISION = 34 +MFT_VERSION = 4.21.0 +MFT_REVISION = 100 export MFT_VERSION MFT_REVISION From 004a8b6eae203cb1496beb8b192b087cc2a32a66 Mon Sep 17 00:00:00 2001 From: Hua Liu <58683130+liuh-80@users.noreply.github.com> Date: Fri, 30 Sep 2022 15:56:46 +0800 Subject: [PATCH 809/817] [AzurePipeline] Fix vstest step failed by libyang missing. (#12240) Why I did it Fix PR merge failed because 'vstest' step does not install libyang. How I did it Install libyang in azure pipeline. How to verify it Pass vstest step. --- azure-pipelines.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 26a86dffa01e..a9004af559ef 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -113,6 +113,8 @@ stages: - script: | set -x + sudo apt-get update + sudo apt-get install libyang0.16 -y sudo dpkg -i --force-confask,confnew ../libswsscommon_1.0.0_amd64.deb sudo dpkg -i ../python3-swsscommon_1.0.0_amd64.deb sudo docker load -i ../target/docker-sonic-vs.gz From 18850e4e28bb5d536abc9c455138c57aad69811d Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 30 Sep 2022 10:03:40 +0200 Subject: [PATCH 810/817] [Arista] Update platform submodules (#12225) Implement input power psu API Report DC power output via API Add bootloader Component in API Fix issue where naming was not unique for Component --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index e12a04b24c5f..11180c37fa17 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit e12a04b24c5f752a9ca789d62bb7b94c563e1c4b +Subproject commit 11180c37fa17421afdeef346b3896552872a2721 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index e12a04b24c5f..11180c37fa17 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit e12a04b24c5f752a9ca789d62bb7b94c563e1c4b +Subproject commit 11180c37fa17421afdeef346b3896552872a2721 From 0a2743d5e472d25209a846e49f032998ee093261 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Sat, 1 Oct 2022 11:36:55 -0700 Subject: [PATCH 811/817] [submodule] update sonic-utilities (#12138) 0a7557bd9 [minigraph] add option to specify golden path in load_minigraph (#2350) 322aefc37 [GCU]Remove GCU unique lane check for duplicate lanes platforms (#2343) 7099fffa7 [fastboot] fastboot enhancement: Use warm-boot infrastructure for fast-boot (#2286) 09026edbb [warm-reboot] fix warm-reboot when /tmp/cache is missing (#2367) a3c404c74 Fix typo in platform_sfputil_helper.is_rj45_port (#2374) 637d834ce Vnet_route_check Vxlan tunnel route update. (#2281) 29a3e5180 Added support for tunnel route status in show vnet routes all. (#2341) 1ac584bb3 Use 'default' VRF when VRF name is not provided (#2368) 4d377a620 [subinterface]Added additional checks in portchannel and subinterface commands (#2345) bbcdf2ed7 disk_check: Publish event for RO state (#2320) 3fd537b0a Support the bandit check by GitHub Action (#2358) 491d3d380 [generate dump]Added error message when saisdkdump fails (#2356) 6830e01ec [counterpoll]Fixing counterpoll show for tunnel and acl stats (#2355) 3be2ad7de [fast-reboot]Avoid stopping masked services during fast-reboot (#2335) 0e1b0cf20 [GCU] Fix missing backend in dry run (#2347) 676c31bd0 Add verification for override (#2305) 48997c266 Add Password Hardening CLI support (#2338) 414e239ea update unit tests for swap allocator a91a4922f consider swap checking memory in installer f0ce58635 [route_check]: Ignore standalone tunnel routes (#2325) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 3af8ba4acc2b..0a7557bd9162 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 3af8ba4acc2bbc77d17be0d67943703021c7d1e1 +Subproject commit 0a7557bd9162eae40f5d4c4f6fbab92dbad7204b From 8c10851c2aebb44099611248f91da350b16df1dc Mon Sep 17 00:00:00 2001 From: Muhammad Danish <88161975+mdanish-kh@users.noreply.github.com> Date: Sun, 2 Oct 2022 11:02:10 +0500 Subject: [PATCH 812/817] Update azure.github.io links to sonic-net.github.io (#12209) Why I did it azure.github.io/SONiC/ no longer works and returns 404 Not Found. Updated it to the correct sonic-net.github.io/SONiC/ --- files/image_config/environment/motd | 2 +- platform/vs/sonic-gns3a.sh | 4 ++-- src/sonic-device-data/README.md | 2 +- src/sonic-host-services-data/README.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/files/image_config/environment/motd b/files/image_config/environment/motd index 8562e330fe2c..0d857e5c5f94 100644 --- a/files/image_config/environment/motd +++ b/files/image_config/environment/motd @@ -10,5 +10,5 @@ You are on Unauthorized access and/or use are prohibited. All access and/or use are subject to monitoring. -Help: http://azure.github.io/SONiC/ +Help: https://sonic-net.github.io/SONiC/ diff --git a/platform/vs/sonic-gns3a.sh b/platform/vs/sonic-gns3a.sh index 41e39cd8686a..2a772ce5a332 100644 --- a/platform/vs/sonic-gns3a.sh +++ b/platform/vs/sonic-gns3a.sh @@ -41,9 +41,9 @@ echo " \"category\": \"router\", \"description\": \"SONiC Virtual Switch/Router\", \"vendor_name\": \"SONiC\", - \"vendor_url\": \"https://azure.github.io/SONiC/\", + \"vendor_url\": \"https://sonic-net.github.io/SONiC/\", \"product_name\": \"SONiC\", - \"product_url\": \"https://azure.github.io/SONiC/\", + \"product_url\": \"https://sonic-net.github.io/SONiC/\", \"registry_version\": 3, \"status\": \"experimental\", \"maintainer\": \"SONiC\", diff --git a/src/sonic-device-data/README.md b/src/sonic-device-data/README.md index e8ccad58b819..d9d403758a86 100644 --- a/src/sonic-device-data/README.md +++ b/src/sonic-device-data/README.md @@ -1,4 +1,4 @@ # sonic-device-data Device-specific data for the SONiC project -See the [SONiC Website](http://azure.github.io/SONiC/) for more information about the SONiC project. +See the [SONiC Website](https://sonic-net.github.io/SONiC/) for more information about the SONiC project. diff --git a/src/sonic-host-services-data/README.md b/src/sonic-host-services-data/README.md index 93af66a83d6b..0b9e714932d2 100644 --- a/src/sonic-host-services-data/README.md +++ b/src/sonic-host-services-data/README.md @@ -16,4 +16,4 @@ dpkg-buildpackage -rfakeroot -Tclean --- -See the [SONiC Website](http://azure.github.io/SONiC/) for more information about the SONiC project. +See the [SONiC Website](https://sonic-net.github.io/SONiC/) for more information about the SONiC project. From 44356fa8d758fffd6e023ebfb7e1c8646a81ede1 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Sun, 2 Oct 2022 11:34:24 +0300 Subject: [PATCH 813/817] [Mellanox] Add NVIDIA copyright header for NVIDIA added files (#12130) - Why I did it Add NVIDIA Copyright header for new "NVIDIA" files - How I did it Add the copyright header as remark at the head of the file --- .../ACS-MSN2700/buffers_defaults_objects.j2 | 17 +++++++++++++++++ .../buffers_defaults_objects.j2 | 17 +++++++++++++++++ .../Mellanox-SN4700-C128/port_config.ini | 17 +++++++++++++++++ .../Mellanox-SN4700-C128/sai_4700_128x100g.xml | 17 +++++++++++++++++ .../tests/input_platform/__init__.py | 16 ++++++++++++++++ .../tests/input_platform/output_sfp.py | 17 +++++++++++++++++ platform/mellanox/zero_profiles.j2 | 17 +++++++++++++++++ 7 files changed, 118 insertions(+) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_objects.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_objects.j2 index 29a3c74e5233..e8edeca556d1 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_objects.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_objects.j2 @@ -1,3 +1,20 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} + {%- macro generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) %} "BUFFER_POOL": { {% if dynamic_mode is not defined and port_names_inactive|length > 0 -%} diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 index f0b0e3993bd4..6bf657d1fb7b 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_objects.j2 @@ -1,3 +1,20 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} + {%- macro generate_buffer_pool_and_profiles_with_inactive_ports(port_names_inactive) %} "BUFFER_POOL": { {% if dynamic_mode is not defined and port_names_inactive|length > 0 -%} diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini index d64b66b0b691..0d67f9b366fc 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/port_config.ini @@ -1,3 +1,20 @@ +## +## Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +## Apache-2.0 +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + # name lanes alias index speed Ethernet0 0,1 etp1a 1 100000 Ethernet2 2,3 etp1b 1 100000 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml index f5d49f8b86ab..2575b49f3fa0 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/Mellanox-SN4700-C128/sai_4700_128x100g.xml @@ -1,3 +1,20 @@ + + diff --git a/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py b/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py index e69de29bb2d1..07ebf17a113e 100644 --- a/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py +++ b/platform/mellanox/mlnx-platform-api/tests/input_platform/__init__.py @@ -0,0 +1,16 @@ +# +# Copyright (c) 2017-2022 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py b/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py index 20a09d1b54f6..170b0246430f 100644 --- a/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/input_platform/output_sfp.py @@ -1,3 +1,20 @@ +# +# Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + """ module holding the correct values for the sfp_test.py """ diff --git a/platform/mellanox/zero_profiles.j2 b/platform/mellanox/zero_profiles.j2 index a953c18409b2..007f19c83a0a 100644 --- a/platform/mellanox/zero_profiles.j2 +++ b/platform/mellanox/zero_profiles.j2 @@ -1,3 +1,20 @@ +{# + Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} + [ { "BUFFER_POOL_TABLE:ingress_zero_pool": { From 2f46689a059d3d7146b8ab27a0293e4b42383ec7 Mon Sep 17 00:00:00 2001 From: andywongarista <78833093+andywongarista@users.noreply.github.com> Date: Sun, 2 Oct 2022 22:53:34 -0700 Subject: [PATCH 814/817] [Arista] Add components for 720DT-48S (#12217) Why I did it Add components data for sonic-mgmt testing How I did it Update platform.json and add platform_components.json How to verify it Ran sonic-mgmt tests (test_chassis and test_component) --- device/arista/x86_64-arista_720dt_48s/platform.json | 9 ++++++++- .../x86_64-arista_720dt_48s/platform_components.json | 10 ++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 device/arista/x86_64-arista_720dt_48s/platform_components.json diff --git a/device/arista/x86_64-arista_720dt_48s/platform.json b/device/arista/x86_64-arista_720dt_48s/platform.json index ce405b82f955..c560f8d739f1 100644 --- a/device/arista/x86_64-arista_720dt_48s/platform.json +++ b/device/arista/x86_64-arista_720dt_48s/platform.json @@ -1,7 +1,14 @@ { "chassis": { "name": "CCS-720DT-48S", - "components": [], + "components": [ + { + "name": "Aboot()" + }, + { + "name": "Scd(addr=0000:00:18.7)" + } + ], "fan_drawers": [ { "name": "fixed1", diff --git a/device/arista/x86_64-arista_720dt_48s/platform_components.json b/device/arista/x86_64-arista_720dt_48s/platform_components.json new file mode 100644 index 000000000000..ea8bbb5e3346 --- /dev/null +++ b/device/arista/x86_64-arista_720dt_48s/platform_components.json @@ -0,0 +1,10 @@ +{ + "chassis": { + "CCS-720DT-48S": { + "component": { + "Aboot()": {}, + "Scd(addr=0000:00:18.7)": {} + } + } + } +} From 95f4af3407d32cdec98a3d0d487ab0997ef5ff3c Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Mon, 3 Oct 2022 11:38:55 -0700 Subject: [PATCH 815/817] [actions] Support Semgrep by Github Actions (#12249) Signed-off-by: maipbui #### Why I did it [Semgrep](https://github.com/returntocorp/semgrep) is a static analysis tool to find security vulnerabilities. When opening a PR or commtting to PR, Semgrep performs a diff-aware scanning, which scans changed files in PRs. When merging PR, Semgrep performs a full scan on master branch and report all findings. Ref: - [Supported Language](https://semgrep.dev/docs/supported-languages/#language-maturity) - [Semgrep Rules](https://registry.semgrep.dev/rule) #### How I did it Integrate Semgrep into this repository by committing a job configuration file #### How to verify it PR: https://github.com/maipbui/sonic-buildimage/pull/2 Master branch full scan findings: [Master branch findings results](https://github.com/maipbui/sonic-buildimage/actions/runs/3160181876/jobs/5144332404) PR https://github.com/maipbui/sonic-buildimage/pull/2 scan findings: [Pull request findings results](https://github.com/maipbui/sonic-buildimage/actions/runs/3160193505/jobs/5144357859) --- .github/workflows/semgrep.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/semgrep.yml diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml new file mode 100644 index 000000000000..8ebe082f50a4 --- /dev/null +++ b/.github/workflows/semgrep.yml @@ -0,0 +1,21 @@ +name: Semgrep + +on: + pull_request: {} + push: + branches: + - master + - '201[7-9][0-1][0-9]' + - '202[0-9][0-1][0-9]' + +jobs: + semgrep: + name: Semgrep + runs-on: ubuntu-latest + container: + image: returntocorp/semgrep + steps: + - uses: actions/checkout@v3 + - run: semgrep ci + env: + SEMGREP_RULES: p/default From c691b739591b9b5bcd0c1ba338d04aa64aa60549 Mon Sep 17 00:00:00 2001 From: Kalimuthu-Velappan <53821802+Kalimuthu-Velappan@users.noreply.github.com> Date: Wed, 5 Oct 2022 02:43:40 +0530 Subject: [PATCH 816/817] 01.Version-cache - restructuring of Makefile.work (#12000) - The Makefile.work becomes complex and it is very difficult to manage the changes across branches. - Restructured the Makefile.work and it becomes more readable. - Added $(QUIET) option to turn on command echo mode through command line option. - Exported the SONIC_BUILD_VARS variable, through which make options can be set dynamically. Eg: make SONIC_BUILD_VARS='INCLUDE_NAT=y' --- Makefile | 34 +++++--- Makefile.work | 213 +++++++++++++++++++++++++++++++++----------------- slave.mk | 66 ++++++++-------- 3 files changed, 196 insertions(+), 117 deletions(-) diff --git a/Makefile b/Makefile index af3d7086ec8e..ccfefc6c183c 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,14 @@ NOSTRETCH ?= 0 NOBUSTER ?= 0 NOBULLSEYE ?= 0 +override Q := @ +ifeq ($(QUIET),n) + override Q := +endif +override SONIC_OVERRIDE_BUILD_VARS += $(SONIC_BUILD_VARS) +override SONIC_OVERRIDE_BUILD_VARS += Q=$(Q) +export Q SONIC_OVERRIDE_BUILD_VARS + ifeq ($(NOJESSIE),0) BUILD_JESSIE=1 endif @@ -29,50 +37,50 @@ PLATFORM_CHECKOUT_CMD := $(shell if [ -f $(PLATFORM_CHECKOUT_FILE) ]; then PLATF %:: @echo "+++ --- Making $@ --- +++" ifeq ($(NOJESSIE), 0) - EXTRA_DOCKER_TARGETS=$(notdir $@) make -f Makefile.work jessie + EXTRA_DOCKER_TARGETS=$(notdir $@) $(MAKE) -f Makefile.work jessie endif ifeq ($(NOSTRETCH), 0) - EXTRA_DOCKER_TARGETS=$(notdir $@) BLDENV=stretch make -f Makefile.work stretch + EXTRA_DOCKER_TARGETS=$(notdir $@) BLDENV=stretch $(MAKE) -f Makefile.work stretch endif ifeq ($(NOBUSTER), 0) - EXTRA_DOCKER_TARGETS=$(notdir $@) BLDENV=buster make -f Makefile.work buster + EXTRA_DOCKER_TARGETS=$(notdir $@) BLDENV=buster $(MAKE) -f Makefile.work buster endif ifeq ($(NOBULLSEYE), 0) - BLDENV=bullseye make -f Makefile.work $@ + BLDENV=bullseye $(MAKE) -f Makefile.work $@ endif - BLDENV=bullseye make -f Makefile.work docker-cleanup + BLDENV=bullseye $(MAKE) -f Makefile.work docker-cleanup jessie: @echo "+++ Making $@ +++" ifeq ($(NOJESSIE), 0) - make -f Makefile.work jessie + $(MAKE) -f Makefile.work jessie endif stretch: @echo "+++ Making $@ +++" ifeq ($(NOSTRETCH), 0) - make -f Makefile.work stretch + $(MAKE) -f Makefile.work stretch endif buster: @echo "+++ Making $@ +++" ifeq ($(NOBUSTER), 0) - make -f Makefile.work buster + $(MAKE) -f Makefile.work buster endif init: @echo "+++ Making $@ +++" - make -f Makefile.work $@ + $(MAKE) -f Makefile.work $@ # # Function to invoke target $@ in Makefile.work with proper BLDENV # define make_work @echo "+++ Making $@ +++" - $(if $(BUILD_JESSIE),make -f Makefile.work $@,) - $(if $(BUILD_STRETCH),BLDENV=stretch make -f Makefile.work $@,) - $(if $(BUILD_BUSTER),BLDENV=buster make -f Makefile.work $@,) - $(if $(BUILD_BULLSEYE),BLDENV=bullseye make -f Makefile.work $@,) + $(if $(BUILD_JESSIE),$(MAKE) -f Makefile.work $@,) + $(if $(BUILD_STRETCH),BLDENV=stretch $(MAKE) -f Makefile.work $@,) + $(if $(BUILD_BUSTER),BLDENV=buster $(MAKE) -f Makefile.work $@,) + $(if $(BUILD_BULLSEYE),BLDENV=bullseye $(MAKE) -f Makefile.work $@,) endef .PHONY: $(PLATFORM_PATH) diff --git a/Makefile.work b/Makefile.work index 6171a05c5192..a6cacafce834 100644 --- a/Makefile.work +++ b/Makefile.work @@ -124,7 +124,7 @@ endif # Define a do-nothing target for rules/config.user so that when # the file is missing, make won't try to rebuld everything. rules/config.user: - @echo -n "" + $(Q)echo -n "" include rules/config -include rules/config.user @@ -173,21 +173,59 @@ endif endif # Generate the version control build info -$(shell SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \ - TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ - scripts/generate_buildinfo_config.sh) +$(shell \ + SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \ + TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) \ + PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \ + scripts/generate_buildinfo_config.sh) # Generate the slave Dockerfile, and prepare build info for it -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) -$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) -$(shell BUILD_SLAVE=y DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV)) +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) \ + MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ + CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ + ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) \ + DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) \ + DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ + j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile) + +$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) \ + MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \ + CROSS_BUILD_ENVIRON=$(CROSS_BUILD_ENVIRON) \ + j2 $(SLAVE_DIR)/Dockerfile.user.j2 > $(SLAVE_DIR)/Dockerfile.user) + +PREPARE_DOCKER=BUILD_SLAVE=y \ + DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ + scripts/prepare_docker_buildinfo.sh \ + $(SLAVE_BASE_IMAGE) \ + $(SLAVE_DIR)/Dockerfile \ + $(CONFIGURED_ARCH) \ + "" \ + $(BLDENV) + +$(shell $(PREPARE_DOCKER) ) # Add the versions in the tag, if the version change, need to rebuild the slave -SLAVE_BASE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* src/sonic-build-hooks/hooks/* | sha1sum | awk '{print substr($$1,0,11);}') -# Calculate the slave TAG based on $(USER)/$(PWD)/$(CONFIGURED_PLATFORM) to get unique SHA ID -SLAVE_TAG = $(shell (cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* .git/HEAD && echo $(USER)/$(PWD)/$(CONFIGURED_PLATFORM)) \ - | sha1sum | awk '{print substr($$1,0,11);}') +SLAVE_BASE_TAG = $(shell \ + cat $(SLAVE_DIR)/Dockerfile \ + $(SLAVE_DIR)/buildinfo/versions/versions-* \ + src/sonic-build-hooks/hooks/* 2>/dev/null \ + | sha1sum \ + | awk '{print substr($$1,0,11);}') +# Calculate the slave TAG based on $(USER)/$(PWD)/$(CONFIGURED_PLATFORM) to get unique SHA ID +SLAVE_TAG = $(shell \ + (cat $(SLAVE_DIR)/Dockerfile.user \ + $(SLAVE_DIR)/Dockerfile \ + $(SLAVE_DIR)/buildinfo/versions/versions-* \ + .git/HEAD \ + && echo $(USER)/$(PWD)/$(CONFIGURED_PLATFORM)) \ + | sha1sum \ + | awk '{print substr($$1,0,11);}') + +COLLECT_DOCKER=DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ + scripts/collect_docker_version_files.sh \ + $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) \ + target OVERLAY_MODULE_CHECK := \ lsmod | grep -q "^overlay " &>/dev/null || \ zgrep -q 'CONFIG_OVERLAY_FS=y' /proc/config.gz &>/dev/null || \ @@ -329,7 +367,7 @@ DOCKER_BASE_LOG = $(SLAVE_DIR)/$(SLAVE_BASE_IMAGE)_$(SLAVE_BASE_TAG).log DOCKER_LOG = $(SLAVE_DIR)/$(SLAVE_IMAGE)_$(SLAVE_TAG).log -DOCKER_BASE_BUILD = docker build --no-cache \ +DOCKER_SLAVE_BASE_BUILD = docker build --no-cache \ -t $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) \ --build-arg http_proxy=$(http_proxy) \ --build-arg https_proxy=$(https_proxy) \ @@ -339,7 +377,7 @@ DOCKER_BASE_BUILD = docker build --no-cache \ DOCKER_BASE_PULL = docker pull \ $(REGISTRY_SERVER):$(REGISTRY_PORT)/$(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) -DOCKER_BUILD = docker build --no-cache \ +DOCKER_USER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ --build-arg uid=$(shell id -u) \ --build-arg guid=$(shell id -g) \ @@ -349,7 +387,52 @@ DOCKER_BUILD = docker build --no-cache \ -f $(SLAVE_DIR)/Dockerfile.user \ $(SLAVE_DIR) $(SPLIT_LOG) $(DOCKER_LOG) -SONIC_BUILD_INSTRUCTION := make \ + +DOCKER_SLAVE_BASE_INSPECT = \ + { \ + echo Checking sonic-slave-base image: $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG); \ + docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null; \ + } + +DOCKER_SLAVE_BASE_PULL_REGISTRY = \ + [ $(ENABLE_DOCKER_BASE_PULL) == y ] && \ + { \ + echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Pulling...; \ + $(DOCKER_BASE_PULL); \ + } && \ + { \ + docker tag $(REGISTRY_SERVER):$(REGISTRY_PORT)/$(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) && \ + $(COLLECT_DOCKER); \ + }\ + +SONIC_SLAVE_BASE_BUILD = \ + { \ + $(DOCKER_SLAVE_BASE_INSPECT); \ + } || \ + { \ + $(DOCKER_SLAVE_BASE_PULL_REGISTRY); \ + } || \ + { \ + echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ + $(PREPARE_DOCKER) ; \ + $(DOCKER_SLAVE_BASE_BUILD) ; \ + $(COLLECT_DOCKER) ; \ + } + +DOCKER_SLAVE_USER_INSPECT = \ + { \ + echo Checking sonic-slave-user image: $(SLAVE_IMAGE):$(SLAVE_TAG); \ + docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null; \ + } + +SONIC_SLAVE_USER_BUILD = \ + { $(DOCKER_SLAVE_USER_INSPECT) } || \ + { \ + echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ + $(DOCKER_USER_BUILD) ; \ + } + +SONIC_BUILD_INSTRUCTION := $(MAKE) \ -f slave.mk \ PLATFORM=$(PLATFORM) \ PLATFORM_ARCH=$(PLATFORM_ARCH) \ @@ -415,87 +498,75 @@ SONIC_BUILD_INSTRUCTION := make \ .PHONY: sonic-slave-build sonic-slave-bash init reset + +ifeq ($(filter clean,$(MAKECMDGOALS)),) +COLLECT_BUILD_VERSION = { DBGOPT='$(DBGOPT)' scripts/collect_build_version_files.sh $$?; } +endif + +ifdef SOURCE_FOLDER + DOCKER_RUN += -v $(SOURCE_FOLDER):/var/$(USER)/src +endif + +ifeq "$(KEEP_SLAVE_ON)" "yes" +SLAVE_SHELL={ /bin/bash; } +endif + .DEFAULT_GOAL := all -%:: +%:: | sonic-build-hooks ifneq ($(filter y, $(MULTIARCH_QEMU_ENVIRON) $(CROSS_BUILD_ENVIRON)),) - @$(DOCKER_MULTIARCH_CHECK) + $(Q)$(DOCKER_MULTIARCH_CHECK) ifneq ($(BLDENV), ) - @$(DOCKER_SERVICE_MULTIARCH_CHECK) - @$(DOCKER_SERVICE_DOCKERFS_CHECK) -endif -endif - @$(OVERLAY_MODULE_CHECK) - - @pushd src/sonic-build-hooks; TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) make all; popd - @cp src/sonic-build-hooks/buildinfo/sonic-build-hooks* $(SLAVE_DIR)/buildinfo - @docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null || \ - { [ $(ENABLE_DOCKER_BASE_PULL) == y ] && { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Pulling...; } && \ - $(DOCKER_BASE_PULL) && \ - { docker tag $(REGISTRY_SERVER):$(REGISTRY_PORT)/$(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) && \ - scripts/collect_docker_version_files.sh $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) target ; } } || \ - { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ - $(DOCKER_BASE_BUILD) ; \ - scripts/collect_docker_version_files.sh $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) target ; } - @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ - { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ - $(DOCKER_BUILD) ; } -ifeq "$(KEEP_SLAVE_ON)" "yes" - ifdef SOURCE_FOLDER - @$(DOCKER_RUN) -v $(SOURCE_FOLDER):/var/$(USER)/src $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh \$$?; /bin/bash" - else - @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh \$$?; /bin/bash" - endif -else - @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh \$$?" + $(Q)$(DOCKER_SERVICE_MULTIARCH_CHECK) + $(Q)$(DOCKER_SERVICE_DOCKERFS_CHECK) +endif endif + $(Q)$(OVERLAY_MODULE_CHECK) + $(Q)$(SONIC_SLAVE_BASE_BUILD) + $(Q)$(SONIC_SLAVE_USER_BUILD) + + $(Q)$(DOCKER_RUN) \ + $(SLAVE_IMAGE):$(SLAVE_TAG) \ + bash -c "$(SONIC_BUILD_INSTRUCTION) $@;$(COLLECT_BUILD_VERSION); $(SLAVE_SHELL)" + $(Q)$(docker-image-cleanup) docker-cleanup: - $(docker-image-cleanup) + $(Q)$(docker-image-cleanup) +.PHONY: sonic-build-hooks sonic-build-hooks: - @pushd src/sonic-build-hooks; TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) make all; popd - @cp src/sonic-build-hooks/buildinfo/sonic-build-hooks* $(SLAVE_DIR)/buildinfo + $(Q)pushd src/sonic-build-hooks; TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) $(MAKE) all; popd + $(Q)mkdir -p $(SLAVE_DIR)/buildinfo + $(Q)cp src/sonic-build-hooks/buildinfo/sonic-build-hooks* $(SLAVE_DIR)/buildinfo -sonic-slave-base-build : sonic-build-hooks +sonic-slave-base-build : | sonic-build-hooks ifeq ($(MULTIARCH_QEMU_ENVIRON), y) - @$(DOCKER_MULTIARCH_CHECK) -endif - @$(OVERLAY_MODULE_CHECK) - @echo Checking sonic-slave-base image: $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) - @docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null || \ - { [ $(ENABLE_DOCKER_BASE_PULL) == y ] && { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Pulling...; } && \ - $(DOCKER_BASE_PULL) && \ - { docker tag $(REGISTRY_SERVER):$(REGISTRY_PORT)/$(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) && \ - scripts/collect_docker_version_files.sh $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) target ; } } || \ - { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ - $(DOCKER_BASE_BUILD) ; \ - scripts/collect_docker_version_files.sh $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) target ; } + $(Q)$(DOCKER_MULTIARCH_CHECK) +endif + $(Q)$(OVERLAY_MODULE_CHECK) + $(Q)$(SONIC_SLAVE_BASE_BUILD) sonic-slave-build : sonic-slave-base-build - @echo Checking sonic-slave image: $(SLAVE_IMAGE):$(SLAVE_TAG) - @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ - { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ - $(DOCKER_BUILD) ; } + $(Q)$(SONIC_SLAVE_USER_BUILD) sonic-slave-bash : sonic-slave-build - @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash + $(Q)$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash sonic-slave-run : sonic-slave-build - @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_RUN_CMDS)" + $(Q)$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_RUN_CMDS)" showtag: - @echo $(SLAVE_IMAGE):$(SLAVE_TAG) - @echo $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) + $(Q)echo $(SLAVE_IMAGE):$(SLAVE_TAG) + $(Q)echo $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) init : - @git submodule update --init --recursive - @git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' + $(Q)git submodule update --init --recursive + $(Q)git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' .ONESHELL : reset reset : - @echo && echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " - @read ans && ( + $(Q)echo && echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " + $(Q)read ans && ( if [ $$ans == y ]; then echo "Resetting local repository. Please wait..."; sudo rm -rf fsroot*; diff --git a/slave.mk b/slave.mk index c521b3807356..28efed3dfc11 100644 --- a/slave.mk +++ b/slave.mk @@ -92,32 +92,32 @@ export BLDENV .platform : ifneq ($(CONFIGURED_PLATFORM),generic) - @echo Build system is not configured, please run make configure - @exit 1 + $(Q)echo Build system is not configured, please run make configure + $(Q)exit 1 endif configure : - @mkdir -p $(JESSIE_DEBS_PATH) - @mkdir -p $(STRETCH_DEBS_PATH) - @mkdir -p $(BUSTER_DEBS_PATH) - @mkdir -p $(BULLSEYE_DEBS_PATH) - @mkdir -p $(FILES_PATH) - @mkdir -p $(JESSIE_FILES_PATH) - @mkdir -p $(STRETCH_FILES_PATH) - @mkdir -p $(BUSTER_FILES_PATH) - @mkdir -p $(BULLSEYE_FILES_PATH) - @mkdir -p $(PYTHON_DEBS_PATH) - @mkdir -p $(PYTHON_WHEELS_PATH) - @mkdir -p $(DPKG_ADMINDIR_PATH) - @echo $(PLATFORM) > .platform - @echo $(PLATFORM_ARCH) > .arch + $(Q)mkdir -p $(JESSIE_DEBS_PATH) + $(Q)mkdir -p $(STRETCH_DEBS_PATH) + $(Q)mkdir -p $(BUSTER_DEBS_PATH) + $(Q)mkdir -p $(BULLSEYE_DEBS_PATH) + $(Q)mkdir -p $(FILES_PATH) + $(Q)mkdir -p $(JESSIE_FILES_PATH) + $(Q)mkdir -p $(STRETCH_FILES_PATH) + $(Q)mkdir -p $(BUSTER_FILES_PATH) + $(Q)mkdir -p $(BULLSEYE_FILES_PATH) + $(Q)mkdir -p $(PYTHON_DEBS_PATH) + $(Q)mkdir -p $(PYTHON_WHEELS_PATH) + $(Q)mkdir -p $(DPKG_ADMINDIR_PATH) + $(Q)echo $(PLATFORM) > .platform + $(Q)echo $(PLATFORM_ARCH) > .arch distclean : .platform clean - @rm -f .platform - @rm -f .arch + $(Q)rm -f .platform + $(Q)rm -f .arch list : - @$(foreach target,$(SONIC_TARGET_LIST),echo $(target);) + $(Q)$(foreach target,$(SONIC_TARGET_LIST),echo $(target);) ############################################################################### ## Include other rules @@ -177,7 +177,7 @@ endif # TODO(PINS): Remove when Bazel binaries are available for armhf ifeq ($(CONFIGURED_ARCH),armhf) ifeq ($(INCLUDE_P4RT),y) - @echo "Disabling P4RT due to incompatible CPU architecture: $(CONFIGURED_ARCH)" + $(Q)echo "Disabling P4RT due to incompatible CPU architecture: $(CONFIGURED_ARCH)" endif override INCLUDE_P4RT = n endif @@ -205,7 +205,7 @@ endif ifeq ($(ENABLE_ASAN),y) ifneq ($(CONFIGURED_ARCH),amd64) - @echo "Disabling SWSS address sanitizer due to incompatible CPU architecture: $(CONFIGURED_ARCH)" + $(Q)echo "Disabling SWSS address sanitizer due to incompatible CPU architecture: $(CONFIGURED_ARCH)" override ENABLE_ASAN = n endif endif @@ -870,12 +870,12 @@ endif # start docker daemon docker-start : - @sudo sed -i 's/--storage-driver=vfs/--storage-driver=$(SONIC_SLAVE_DOCKER_DRIVER)/' /etc/default/docker - @sudo sed -i -e '/http_proxy/d' -e '/https_proxy/d' /etc/default/docker - @sudo bash -c "{ echo \"export http_proxy=$$http_proxy\"; \ + $(Q)sudo sed -i 's/--storage-driver=vfs/--storage-driver=$(SONIC_SLAVE_DOCKER_DRIVER)/' /etc/default/docker + $(Q)sudo sed -i -e '/http_proxy/d' -e '/https_proxy/d' /etc/default/docker + $(Q)sudo bash -c "{ echo \"export http_proxy=$$http_proxy\"; \ echo \"export https_proxy=$$https_proxy\"; \ echo \"export no_proxy=$$no_proxy\"; } >> /etc/default/docker" - @test x$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) != x"y" && sudo service docker status &> /dev/null || ( sudo service docker start &> /dev/null && ./scripts/wait_for_docker.sh 60 ) + $(Q)test x$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) != x"y" && sudo service docker status &> /dev/null || ( sudo service docker start &> /dev/null && ./scripts/wait_for_docker.sh 60 ) # targets for building simple docker images that do not depend on any debian packages $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) @@ -1414,12 +1414,12 @@ SONIC_CLEAN_FILES = $(addsuffix -clean,$(addprefix $(FILES_PATH)/, \ $(SONIC_MAKE_FILES))) $(SONIC_CLEAN_DEBS) :: $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(addprefix $(DEBS_PATH)/,$$($$*_MAIN_DEB))) - @# remove derived or extra targets if main one is removed, because we treat them - @# as part of one package - @rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) + $(Q)# remove derived or extra targets if main one is removed, because we treat them + $(Q)# as part of one package + $(Q)rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(SONIC_CLEAN_FILES) :: $(FILES_PATH)/%-clean : .platform - @rm -f $(FILES_PATH)/$* + $(Q)rm -f $(FILES_PATH)/$* SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_DOCKER_IMAGES) \ @@ -1427,20 +1427,20 @@ SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_SIMPLE_DOCKER_IMAGES) \ $(SONIC_INSTALLERS))) $(SONIC_CLEAN_TARGETS) :: $(TARGET_PATH)/%-clean : .platform - @rm -f $(TARGET_PATH)/$* + $(Q)rm -f $(TARGET_PATH)/$* SONIC_CLEAN_STDEB_DEBS = $(addsuffix -clean,$(addprefix $(PYTHON_DEBS_PATH)/, \ $(SONIC_PYTHON_STDEB_DEBS))) $(SONIC_CLEAN_STDEB_DEBS) :: $(PYTHON_DEBS_PATH)/%-clean : .platform - @rm -f $(PYTHON_DEBS_PATH)/$* + $(Q)rm -f $(PYTHON_DEBS_PATH)/$* SONIC_CLEAN_WHEELS = $(addsuffix -clean,$(addprefix $(PYTHON_WHEELS_PATH)/, \ $(SONIC_PYTHON_WHEELS))) $(SONIC_CLEAN_WHEELS) :: $(PYTHON_WHEELS_PATH)/%-clean : .platform - @rm -f $(PYTHON_WHEELS_PATH)/$* + $(Q)rm -f $(PYTHON_WHEELS_PATH)/$* clean-logs :: .platform - @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log $(FILES_PATH)/*.log $(PYTHON_DEBS_PATH)/*.log $(PYTHON_WHEELS_PATH)/*.log + $(Q)rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log $(FILES_PATH)/*.log $(PYTHON_DEBS_PATH)/*.log $(PYTHON_WHEELS_PATH)/*.log clean :: .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_FILES) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_STDEB_DEBS) $$(SONIC_CLEAN_WHEELS) From 1f0699f51e51cf9ca6e36d85bc632ee0e31792e4 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 5 Oct 2022 08:10:54 +0800 Subject: [PATCH 817/817] Fix sonic-config low dpkg hit rate issue (#12244) Why I did it When sending a PR only CI change, as expected, the target target/python-wheels/buster/sonic_config_engine-1.0-py2-none-any.whl should be from the cache, because the depended files were not changed, but it rebuilt. How I did it Sort the files by name. --- rules/sonic-config.dep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/sonic-config.dep b/rules/sonic-config.dep index 65aabe74d76f..2b8b98fcd42b 100644 --- a/rules/sonic-config.dep +++ b/rules/sonic-config.dep @@ -4,7 +4,7 @@ SPATH := $($(SONIC_CONFIG_ENGINE_PY3)_SRC_PATH) DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-config.mk rules/sonic-config.dep DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) DEP_FILES += $(shell git ls-files $(SPATH)) -DEP_FILES += files/image_config/interfaces/interfaces.j2 dockers/docker-orchagent/ports.json.j2 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 dockers/docker-lldp/lldpd.conf.j2 dockers/docker-orchagent/ipinip.json.j2 $(shell find device -type f) files/build_templates/qos_config.j2 dockers/docker-orchagent/switch.json.j2 dockers/docker-orchagent/vxlan.json.j2 files/image_config/constants/constants.yml +DEP_FILES += files/image_config/interfaces/interfaces.j2 dockers/docker-orchagent/ports.json.j2 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 dockers/docker-lldp/lldpd.conf.j2 dockers/docker-orchagent/ipinip.json.j2 $(shell find device -type f | sort) files/build_templates/qos_config.j2 dockers/docker-orchagent/switch.json.j2 dockers/docker-orchagent/vxlan.json.j2 files/image_config/constants/constants.yml ifeq ($(ENABLE_PY2_MODULES), y) $(SONIC_CONFIG_ENGINE_PY2)_CACHE_MODE := GIT_CONTENT_SHA

abxfAqKSN_G1RzGuFDuSI-+`>w!R z1pa(|Ecn+WzQ27{zG?h#Kzu(w%hmXZ{I8hD=Yxpvmv5Z!$H$icA;kCN??TW6KJ+mQ z|CGBZ%+szjS=K zxFhYq=MeiZAbt>kSc<4WSC8+e+xJ$)58_Y8KZy82{K@zqL;N8AWc*Jfz90V;$bbL% zd-}bwD9=3qe^1Y^`iJGe>Gu7smcK0Xq5LuBe-82e{GsFjKH~fNL&v`Z@%{Xvi8=Y z#@84A81aLLr(h|*zgV0*Wz7FF;`bB#e+BW2h%W{U=GVXOM*J2XpKUU}{^+m~*ad3$ zho7nPX?ik*D>rCkHd&EZ~fX$|78NAzk2`w^69^`BlEelZ2n8^hUO_= zF7xt-mqVpm?yS7TNAM259Is^9)6lz|yI+io^QWNj?|?^EGR&#K+}@s*mnPx&@c3gw zH|4LNye#wb)84s>_(g?(JMf(vzZ>yau1&-*Dg1{?{hJg%)Tjvkn-xAhyvct+=m6vp zkN-Cz_D~1yx%~R;$1htNeELAL__yfzhoNxe$;9~&1pG?K&nAk0tHS>__`}7V(Em~7 z|I=jKw@t^NkNDq<{C}Fvza8!&jx%}25W?mtzJkNsE7{5LCnfB#batMN~kpVRgD*xxYz+f;so_$Tw9 zsmI6uhVef~;a9}|Rp#ZVzyC6a=Re=S?%$hu|DCPJ=l)Utsu};>I(&i0{QHvo@2tm1 z@yYS{81OGr_$<$$$SGG~4ZM3q{anQVcHmzQ{wvAK&)s$Sa8#H0t(<>Za{eBLe-iQ^ zZg3BezaN9;@cg-u^P&Eku>Mog@ec9=`%y9lw$+{__go zgZd#Ua&whmu^;=&5=UrI;=i9ep z7XQoY@hf%s3FCi-!iV}TumAIo`}6vL%^&KY$>MXR!Y^kTPtOYHpXZ-n^Yh=I=K1mc z!KYWwO|*UAkNB`5p?vnlBA8bMeyPHEx5n56=l_`d^OLf8-Boq?B0@gj6C^|a2kP(z z)90_)@DCta2*;?Lugfq20ZZomG3h|jB!=90wc>Uw-GE&K!if*Johgm&5axTd{F^bKpSZxz1*I}{7c&Tl|BiqIjLl!h z*wbFJ^5-K8-y`MUqVSh9wU_h=f3YUKyc7PFWd0vj_)!0W_`neo^8X$lA3s(LoL_v1r{SNvNc{$C)Ae;)f2$G=d=pDO+Z>`xs3qT-;IE>|av+dH#Gp-2bfoODX#|A^$9K`O}2`A^#)Qt1wQ+pUrjrsq()W`$PUy`nM?l zwB=6=_9u>iYaM^8__tzz;`p~I{V3? z;b8L5UhF?zYd%R%Q|IWw{$2t6_tz%m{gPeSRpB*{=3EIzt^53ft)>bQS-w5_UpEm#DY+^~*epvPM^QStP zyeGF5Z9hCbz}PeUl2hu<0T&Zwf8zExxS2xo|L-HLK`{%#r?GJ6p{|m(a?a2Qyv41=AzZzZuK^gxJ;Rp{@aiIOR|5fZToFM^8X^SKb($A=Z`3V zto;X&|Hp~<-$CS$+Rv^12a!K@`7?z4v&7dQhmij`G{t*_?Qg@_pSb;h82O(EFOYp^ zAKe{@&>SG;KVu!xep|i6!asg(Ft4qTAb$vdt2bxP!*h-z|D5dqvZ()C_>Zdo?Ueo- zkbg<`f7RB1L(2Y)&C2;BUw`+n|K5VPT9V-zsr|DJX7%WP9+^2>|LXO3-~ZVpzVfsV zOV>Yx{P&6Wb8!iVi&Vt*qtmielA#Rp7w=CC@5xUBsxxg4`Dcm!a~gk-(7%NIUy{pz zKYuK)|CTiVjL^Rc`J?OC*8WWzf6Dm7i&~`e2SVe*Khdqi!G^8A<}5@8{oW*huawH4 z?ZBk;cT|6d-cWUS5?eg2!({(CV*iZBAKk8D<)1bZK4G*}%Uucs+x|7O)6#KQ0gj%YBRxj$8N%KigvReHW}A7$gbSOuB?5C68< zbXAf7G?>;w{{QfA7QxmmE0Z!mtMF;#lT-M#@yRQETK|H=r}ZzU%rB+PZ&LWQ@o!f6 zwDE6I__Y453ZK@$EoFXt%KQ$*FMrizg`o1RDGn2lDyPivMf^>>Xt(bm;{U_H&6Va8 zN1^@i3S2;xr+ERyEW0Q==4yS#adKTgA2_4q3*>POS$8L{m49Ze?%F2*qMS0nSHn+kS$~dB#1E(BNqXi?M>uHw*_ATCJ7s=P z%KSmZ_v21iMHy20#@kXi<8aFS5zOy6({bhuWgYjl)PA*T*J6v+<#rS#hhe_ce9iJw z@5yEV0dF*U;=!ECPs~_vhJ4EWg32e2PcdbF2JxxeKeH+GhY-KgL3r{Gi8YM)=l{=? z`!3Jie^t)!cp180PAB=!slyM-Y3t?WH2frfji$|~%r9v8VQeV2LosE3M#FCu(k#xNJX%?AN6&Wqy0g{En3Q<&^oIDf7Eh=69#e?@5{8n=-#I zWqyCk{DGADgDLZ&yp-;*JNqu$`W4V5{_L^E)=yLp4gF#j-K7>5+zCJ7T|5$>+8@rc zQsqMwBtCU~;P-x0<-?N-5}!K$O)2x?ml7p^>iD;$%!jir$)7s@a6gp9r;ZOiPAu_v z{v~bs!`M5@`CY;yX5Go*=2V4GdH#~q@YfYe_+>t2enG>hj88FTeo4bm7~*v&Z%Ucp ztl?9}za?dUM#En>pb5XsYWS4#8CLlA=cLh9Y(@O=JAWPQm(`XszddDs2jWM!E$8T`BXsQ|9-i%ip?LeCqt^PnkcEGJh~-K4Sw?{j>bla0}3U zIw|urh=1uU&3SdW_SuyAxs>_&l=+2}`Nfp^rIh(iDf8i7$xHbDO#50-nEm`onsoUY zm0w#pK_C3QAdU|KwT8&0%+IIHFQm*brpzy;%x_AW4^P@j$KP6J(eycpe~JcMrDPDl z`UO!>7V!sO^$Op+^S^I7VE#y}WR^qx=gPnN*2Q zzl8V|yKpOWHz7WC{F_te!;f>Lacgp;pl=;0W^ZQcf z_ovKv*u{`Wr~`EQk0v z(c(ORE zzy6}-SE!bg(es&0w18|KJ{&knx^f+Ug@n%7J&0dxRmu^q!IS&heDf40qnxBr0b9P{N+f5{u%6F0=`EVpB&~hcy~Ube;)G-drA2Pg}+3~FDm>D zT(Y8ze@W%TB`Z396Xx^$S)t=Q?B}18_OA+2u~SpL3F`kl!;{AFv-Y)RpTi_RZR;d2 z-`p>;OPZ(nNLhxl`UcttIZe*y6e9_(MReX0BzyI4AYRe(&{If(C3!hw}ReAppK zyDZ{+#QYrQ^UX`xt)&8{1!_fvfQaY-lBiWeXi;&EG{f&|OJBA8?>W!=A zW>&`fBjC3=z zK08xCXvzHEmA%VTdRE4{erGxT!WU4LIF`0schFC-+%};7sN3&$`xes|;HMpazWy@) z0Zu<%fj@cu2RVI{f5bFulWNISSii;j@!ojWw*RcnUuAa(wy%TB`Z^kKt%d!-eBajv z>Frm+_H{^E-|OZwCAxnE9{js{l~=#Mr}nepA3BL2FX;umhsoztI)93Mddm7bpHjy@ zfWz1Qk5|7tpTo-fIv?8_O9L{#UM+$7ljn1U(>IE%{h0Z-|14=g=}Ftqk!5{X`^o!( z_T&5Re2yyXyV{TOZL=-buhNsYpJONS!|liDI-k<@9#2o2PhVNz)qWhl@_lzc3(NYh z_G5f(Ka=OP*yYDFT8V5h-^G?LZKMe^-}}_X!u(_2- zucWc(ef^rq;(YKG_$Pp`7t{e{^hG2W9EYgfM7^00;}g%1$TkpD;gcTd`M4{F3=oY+uVD%lGu=rWZa)*>pO`Q`-1OSdDyOd(SH?F} z+Ft65eEt*P56qvU{k+xXM>Co;ep>&;_G9Wlyf}Y~?RT})*NYeG&zKu#g8DOd=2Y$H z;;^r~eY0$2G~x;R(q#Rr7mISWpE3RWjI;f$3;X%;)k6IV!Fm~gJ=*&9P5TWNXBFp9 z(LY=Uz7bSzxxR?>n(?PnS$kznpLc<8mm2fd@0t2WaQ&LUOTQw!biU1hux$NTf$!Dt ztzXZ#kLX?G>-YTpe9vE@%G7_g(>KdTRM;QV^ZokGee`7gj2=I@*Y7nhKV$3ft+PPB zpEuWk*`6_eymY?JU!7{(fj<9(+wahnzQw$YGJfxc>XdT+M({0^-+ph`H~Li8v(4q} zFX@XGwMkzV=6l;$+4Xyy%g?u;I^99*vpZVLPx=1Myu!FJe~R{VJNTvjgIB+g>!11l z!K*(%->biD|FGHVn`I+v`hNNT;e#$e>a~9_pM0I>N51`g`Q+z&`IK${!%p8U8&P53 zYyV-teEYv6`U_Of`JwG<$@}n7DXCzxDpIk5>uwW|xq)<4^4W|6wv;FO{~oxhU~V=No^Z zynoMRercV?*S&uE`ZLb)&%KlRrFEA2rSl8*yZw(jeUpdIztkz4k9mHod_G$%@%?;C zA2;s%?)pFO^wSm8-?Os!0`vT1*4chOQHk%Y-}l}1f70daYE1uDXSaj2xuGZ1zvcAL zmht-1`S$p9pm2T|`~Oe5{HXDaZ^l*`b3;$1e#w0650*Xu^N%jSP`@X8m!-aaJa4w` z|3~%tz2g2$f97go`n1b0)L*!pzA~A=y{!Kkm+$q@I-iVo{qd*q&EuK;OXkD=3(pUa zy8NhF-sGRwKXoTzC*x=IHRGrC&-{Gr7yD=Q@2|+$Y=!=3U49`S3FpUJ;u^6D?UeQle>kLY%qwUk+xrvEpS_6zg7 z_3cwuW>@P&`e@Gd|6d)*1kb;Haaz7{UB1$fm|OPlQpwdI3Ildz?Y}x8_VT~^FjYB)ANJ*=ts+%ht$1}&OeY3`d@YVakHr2 z|CaXi#r`c9?EmfgpR(=qYc5|`<@qK3e84Z6?;RhN?f* z{Q8KS@#kpS{`u=Jzfix0@)wi&<@<++UB1`9>HIU=4)y=K{*w8&{^Icq_Rs(1@}p*X zvwqY1XTG1e`J4GBpOX33FW>(^QjxFu3jJ@m{6ap)^QS`poL|5B`BSXlZ@T#Rf3MDm=RX$m%_rCK{9WMd0Q7n+`brJ!S!Ocpx0p|HzRky+ zA9m)m8~m7Eho!#1|1#TBsqfF9Jpach@jbzJioW;qH-CQ6$Npgt_`1kKKAteFXPK#( zkLUaIgZZHUL-1p&x1@chbvsOXygk3_=W}>*zHOg<=J_3G{yz%&drI18?f#ELet${( ztlj@N@RiCI@>g~oGUDe`(moH@^ZfZH|Gu*Ab1(QY+aC<*wk6%KUn{`mi_0K z&7+$sSU>tdbNVTrLnM>dOHWQBM>jo(k6DdU97yT$iI+e6 ze+FMKp!-SRH$O-9KQk5gUuOF)&Ob@}_VpXi?e`V%z5b!pPa9lM#qHPg({`>>)-SYw ztpBeeKWUcJ`!JJ_xvqcM$@ts#e3MU$-tIEqY`gtt%=7!s`V$d+|5u5xw*q^s;E!8B z@cgN6Ker9+9VplS>!?0skHqZTe5yl`|s1wkM}#*ZwvU|{?YeMIyr;uskHr@_LH-7z4mEe z-{SOB;CthTQa_V-O6xCepQil}n&E=ub;{2>t-_h$MSv$_@()K_2;Zon!i`SKi}*hi}_>yo#2<|KfQdcU&tT* zt||Pf^D+D1;`&8@UdT85UfX_bF6qJ+e4~Eay)R?(kL%wQ=bPt$Q~LEq`d5zq@1axr z_F?ozdB696^zeQ%U{cPgei@$$aaYKEg~TzP;_w z57wW8?d$L8F*QrsYpw|A|iDtluRn^a)i7Q~yLP zFyFqu#k8NStsh_Ck}2!!_ivhxtaP%zZl9&|wePjhtkYlO^bP9yX>-+|O8m4xPrrU+ zGJmPlH%m{~&*xtzpVOVb$zMlWnuDpgq<(YLoBVuqLAw7Rg8t_Wr*D?@{IrL7mnD92 zzMqfVKhx=(rKjur`MCXMPQOh1wA)v?_L*_Me(Bt@zN3A5ub(N?KHdI#PT$1sXg?*s zNzhJ(_UZP|clv3)=yZKQf4Bb@r(dRhmelVRZ!Z1znRT|$0jF=4bF`llKW*+}C%=8V z{pC(St(Tmx@8{$8FL3&r&qOoDV;6nfpY*Fs&1RkUZ`<*6T7Uk7`}pO;Dg2_72OYjX zKUUUX4ZipJgnIqP^f0t!DvTfWv30Op@?U?LvHkN1^gnCBkExsv-n1WYDq3TDXwhe9 znt6r!Sv$VcH#649@z2{renvYy|I(0eN-X;3mN%K>uRfL2mxbExFKqi?SFZlcrtKT7 zn2)84zRon`%x8nsFD@Ot=JL}k?f9gO|8A$B4zh(?F5ln2GS2$1bNU91X7mM2#>e)l zKY@0@+%4nu8`L-Fs)5EHGn!ACyX7bUTVR4ePxF60?VpX{uUxruh5olvsoSP)Om@c^ z;K!F6-T0iT34BlI`7^^lHJ|3NPtE5D@cq<-?Z&@VdHXpMd|f;>pQFHMx1XcIXV-r$ z_&R^Hej|S36BGYiygG4+zj~(q^X#y1mn}g{u2#N&&jFvE&w0ZBJHhvZEeWOMYUTM{ z2|hcYcY)7t|L+E$UH={6v-7_be0KdG7WTggK0BW;fzNI~4}s6l|0}}&6X3J+e-eCl zK0gxnBWhjX`*&J`FDmups`{t?{`9j-KmYmJ %%htS`j9`N<^boy9?H|g(B5BQnS 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 aWq&?^`sfzq%OSpcbR6>a)JM1c?EeAn=@01u literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cmh.pkg b/dockers/docker-pde/cancun_files/cancun_4.8.0/bcm56770_a0_cmh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..b037e12f3cbaca679956ef4ef855e55a66b6652e GIT binary patch literal 4324 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 X`e3Qeo!pVyOzd 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 KJ0IJ=-~R`4Oy|k~ literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_ceh.pkg b/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_ceh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..0f10291d3890b43e596da32cc5d1f8c64ce6d0a4 GIT binary patch literal 18020 zcmbuF3y@@0dB^V(MIP&d@)QJCz<{gZ%^Rw1dFkVF(qkTPtLSS280glH74rNEM4LRJzjNfh$`ok#cAXL@#) z;#8gK`@iS)o$q|lb7!v7tjxT#k}b=&+?5@$|FVz0CeyRZQLo&epJfl-bI%UFd+XPB z|Bb`^QQ59~y6XQPkY$@s$g*y&UDnrhJC(BC>h#L0gVk=&!(JzEcI$bsD7($Pm(`~7 zvfXJ-3Ko@Cvs$+EZntdY-Px?su6N5dWj&uP>g9%7Z>Fql$ZG9Ir5w!RIxZlm0XN0dYjsXSOIChmZt1gX2kZ@suQZ?s$<#o zWLvzi`oWH4wO-aKsjdS$IyEjDW3`zCts5Zu9(lXDWcf?4A^&sC>NiDECWHH%I+bKKRL8c`i) zRd-QVA;DR#DH5Ccq$qaFb~`gtkF46Qw99UP<|r`amIo4Ssx)14ySQ(yM| z!Jd)ohdAA>HK*ZEt14EBxQrc5l$Dve=4`ok2%R~E)(oLDhS0IU1cE3Ve2B!)ZqP z7R(1-Sv&8DrgFTTsuvr}nfXHeFJw(RMR%^=3%itPv^%xYVo+$jswFOEp+(O(I*T4QzefEf9Fn5GUORR~&oS&= zvgtxbq*f_66kRWP(sVhyVGH8qY_zpS<|X3m=Za1)b#@lH+G({hc(sc2Wtnw$u7le( zJgeg^oE^Ya8;?Sdy|~Pgh93qvnRf~?;SJ9|E$(y_?RVDP@kIKd`7#;UcHUfFqMT*1 zQNmpD?wJ5U^k#Xr>N-YmoDDO?okF84lOtg*i}jd^P9bi|wY8;cMMn$Onw6IP^0Zqe z5X^BIxeDjmo9i_5PHV0yw^?h%!^@m1HuHwgFt2DnVg|Wf1qtvm+5tI@(RRuouVaE^ z-P*vqPTr9y6XhtdSu9NQi>I3HhY@SEy-eV5eWb)mYre@TQ6~|V0qG)>o;R&#k;x{O zGm@Z+_9@r2zC5?+w6b%@{ig7Aob-@9a~f>b?$F6dl%Xs{1$~~o1NF99<31NkCy;id>v)>OF-DHXx(Yz7nVnM()h_;;Zl|%2e>g9N5(L~nUkT=?8%l+-i*>f5p zzVnO~E2kw|u*8|6`f51gxB(OEwT29rXRhNTJnt0k`lhVgnrw)ViU9V;xxV;hwQ2dL z)|?pcoPsoBI!KsdpOGb|H7x^gxPTQ^#RNY5To{+arp$#?kQ2ckIZbk>>N^b_QhmZ{i=tp-fzUD>-M$#dY;vyQyt`8!MM=X8k2*_tWRcEX zk-rnPdP`BU3+i2>B{wyXuadV;1jUQcNE7eG-&hrGB-ko+K%(sxBqU{-vKu!dF{aT; zqf5nnTee5Zfl?@S%erk@&xzILS&nV)sN59eVI58BrNV`3f%s_r%kJEyi%R0=5dfZL z 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 UN{N`*k!Sdn`kvL>FFxo00r?_QD*ylh literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cfh.pkg b/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cfh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..7f8ac294e5b7d334be4a3b32efb1afb09323dec5 GIT binary patch literal 76828 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 L{H5D&e*FIdb5J3W literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cih.pkg b/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cih.pkg new file mode 100644 index 0000000000000000000000000000000000000000..3361d235bb0539d0fc945f9ab14305f52aa09d5c GIT binary patch literal 983556 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 I{pRogKd!dgj{pDw literal 0 HcmV?d00001 diff --git a/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cmh.pkg b/dockers/docker-pde/cancun_files/cancun_6.8.0/bcm56870_a0_cmh.pkg new file mode 100644 index 0000000000000000000000000000000000000000..91f36a3972241f199d0effb46bbc8056a4f7a057 GIT binary patch literal 4324 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